yusheng 1 год назад
Родитель
Сommit
c058738413

+ 14 - 0
src/api/custom/index.js

@@ -18,3 +18,17 @@ export async function getTreeByPid (parentId) {
   }
   return Promise.reject(new Error(res.data.message));
 }
+/**
+ * 产品分类指定code查询
+ */
+
+export async function getProduceTreeByCode(code) {
+  const res = await request.get(
+    `/main/categoryLevel/getProduceTreeByPid?code=${code}`,
+    {}
+  );
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}

+ 0 - 159
src/components/AssetTree/group.vue

@@ -1,159 +0,0 @@
-<template>
-  <div class="tree-wrapper">
-    <el-tree
-      :data="treeList"
-      :props="defaultProps"
-      v-loading="treeLoading"
-      :node-key="nodeKey"
-      ref="tree"
-      :highlight-current="true"
-      :expand-on-click-node="false"
-      @node-click="handleNodeClick"
-      v-bind="$attrs"
-      :default-expand-all="defaultExpandAll"
-    >
-    </el-tree>
-  </div>
-</template>
-
-<script>
-  import { getTreeByGroup } from '@/api/classifyManage';
-  // let originId = '';
-  // let originType = '';
-  export default {
-    props: {
-      // treeList私有化处理
-      treeFormate: {
-        type: Function,
-        default: null
-      },
-      defaultProps: {
-        type: Object,
-        default: function () {
-          return {
-            children: 'children',
-            value: 'id',
-            label: 'name'
-          };
-        }
-      },
-      defaultExpandAll: {
-        type: Boolean,
-        default: function () {
-          return true;
-        }
-      },
-      // 初始请求treeList
-      init: {
-        type: Boolean,
-        default: true
-      },
-      type: {
-        type: String,
-        default: true
-      },
-      nodeKey: {
-        type: String,
-        default: 'id'
-      }
-      // appendRoot: {
-      //   type: Boolean,
-      //   default: false
-      // },
-    },
-    data() {
-      return {
-        treeList: [],
-        treeLoading: false,
-        parentName: '',
-        parentId: '',
-        currentKey: ''
-      };
-    },
-    mounted() {
-      if (this.init) {
-        this.getTreeData();
-      }
-    },
-    methods: {
-      getInstance() {
-        return this.$refs.tree;
-      },
-      // 获取树结构数据
-      async getTreeData() {
-        try {
-          this.treeLoading = true;
-
-          const res = await getTreeByGroup({ type: this.type });
-          this.treeLoading = false;
-          if (res?.code === '0') {
-            this.treeList = res.data;
-            this.$emit('setRootId', res.data[0].id);
-            if (this.treeFormate) {
-              this.treeList = this.treeFormate(this.treeList);
-            }
-            this.$nextTick(() => {
-              // 默认高亮第一级树节点
-              if (this.treeList[0]) {
-                this.setCurrentKey(this.treeList[0].id);
-                this.handleNodeClick(
-                  this.treeList[0],
-                  this.$refs.tree.getCurrentNode()
-                );
-              }
-            });
-            return this.treeList;
-          }
-        } catch (error) {}
-        this.treeLoading = false;
-      },
-      // 递归 - 往树children里面添加parentName
-      // _setParentName (tree) {
-      //   let data = tree;
-      //   for (let i = 0; i < data.length; i++) {
-      //     if (data[i].parentId === '0') {
-      //       this.parentName = data[i].name;
-      //       originId = data[i].id;
-      //       originType = data[i].type;
-      //     }
-
-      //     data[i]['originId'] = originId;
-      //     data[i]['originType'] = originType;
-      //     data[i]['parentId'] = data[i]['parentId'];
-      //     if (data[i].children && data[i].children.length > 0) {
-      //       this._setParentName(data[i].children);
-      //     }
-      //   }
-      //   return data;
-      // },
-
-      handleNodeClick(data, node) {
-        this.$emit('handleNodeClick', data, node);
-      },
-      // 设置默认高亮行
-      setCurrentKey(id) {
-        this.currentKey = id;
-        this.$refs.tree.setCurrentKey(this.currentKey);
-      },
-
-      // 获取树的选中状态
-      getSelectList() {
-        const selectList = this.$refs.tree.getCurrentNode();
-        return selectList;
-      }
-    }
-  };
-</script>
-
-<style lang="scss" scoped>
-  .tree-wrapper {
-    width: 100%;
-    height: 100%;
-    overflow: auto;
-
-    :deep(.el-tree) {
-      display: inline-block;
-      min-width: 100%;
-    }
-  }
-</style>

+ 0 - 182
src/components/AssetTree/wms.vue

@@ -1,182 +0,0 @@
-<template>
-  <div class="tree-wrapper">
-    <el-tree
-      :data="treeList"
-      :props="defaultProps"
-      v-loading="treeLoading"
-      :node-key="nodeKey"
-      ref="tree"
-      :highlight-current="true"
-      :expand-on-click-node="false"
-      @node-click="handleNodeClick"
-      v-bind="$attrs"
-      :default-expand-all="defaultExpandAll"
-    >
-    </el-tree>
-  </div>
-</template>
-
-<script>
-  import { getTreeByPid, getTreeByType } from '@/api/classifyManage';
-
-  export default {
-    props: {
-      // treeList私有化处理
-      treeFormate: {
-        type: Function,
-        default: null
-      },
-      defaultProps: {
-        type: Object,
-        default: function () {
-          return {
-            children: 'children',
-            value: 'id',
-            label: 'name'
-          };
-        }
-      },
-      defaultExpandAll: {
-        type: Boolean,
-        default: function () {
-          return false;
-        }
-      },
-      // 初始请求treeList
-      init: {
-        type: Boolean,
-        default: true
-      },
-      // 接口分父级id 和 类型筛选
-      paramsType: {
-        type: String,
-        default: 'id'
-      },
-      type: {
-        type: String,
-        default: ''
-      },
-      id: {
-        type: String,
-        default: '0'
-      },
-      nodeKey: {
-        type: String,
-        default: 'id'
-      }
-      // appendRoot: {
-      //   type: Boolean,
-      //   default: false
-      // },
-    },
-    data() {
-      return {
-        treeList: [],
-        treeLoading: false,
-        parentName: '',
-        parentId: '',
-        currentKey: ''
-      };
-    },
-    mounted() {
-      if (this.init) {
-        this.getTreeData();
-      }
-    },
-    methods: {
-      getInstance() {
-        return this.$refs.tree;
-      },
-      // 获取树结构数据
-      async getTreeData() {
-        try {
-          this.treeLoading = true;
-          const requestApi =
-            this.paramsType === 'type'
-              ? getTreeByPid.bind(null, this.type)
-              : getTreeByPid.bind(null, this.id);
-
-          const res = await requestApi();
-          this.treeLoading = false;
-          if (res?.code === '0') {
-            this.treeList = res.data;
-            this.$emit('setRootId', res.data[0].id);
-            if (this.treeFormate) {
-              this.treeList = this.treeFormate(this.treeList);
-            }
-            this.$nextTick(() => {
-              // 默认高亮第一级树节点
-              //defaultExpandAll父组件传过来为false 不展开所有树,就默认展开根节点的子节点
-              if (!this.defaultExpandAll) {
-                // 手动展开第一级树节点的子节点
-                const rootNode = this.$refs.tree.getNode(this.treeList[0]);
-                if (rootNode) {
-                  rootNode.expanded = true;
-                }
-              }
-
-              if (this.treeList[0]) {
-                this.setCurrentKey(this.treeList[0].id);
-                this.handleNodeClick(
-                  this.treeList[0],
-                  this.$refs.tree.getCurrentNode()
-                );
-              }
-            });
-            return this.treeList;
-          }
-        } catch (error) {
-          console.log(error);
-        }
-        this.treeLoading = false;
-      },
-      // 递归 - 往树children里面添加parentName
-      // _setParentName (tree) {
-      //   let data = tree;
-      //   for (let i = 0; i < data.length; i++) {
-      //     if (data[i].parentId === '0') {
-      //       this.parentName = data[i].name;
-      //       originId = data[i].id;
-      //       originType = data[i].type;
-      //     }
-
-      //     data[i]['originId'] = originId;
-      //     data[i]['originType'] = originType;
-      //     data[i]['parentId'] = data[i]['parentId'];
-      //     if (data[i].children && data[i].children.length > 0) {
-      //       this._setParentName(data[i].children);
-      //     }
-      //   }
-      //   return data;
-      // },
-
-      handleNodeClick(data, node) {
-        this.$emit('handleNodeClick', data, node);
-      },
-      // 设置默认高亮行
-      setCurrentKey(id) {
-        this.currentKey = id;
-        this.$refs.tree.setCurrentKey(this.currentKey);
-      },
-
-      // 获取树的选中状态
-      getSelectList() {
-        const selectList = this.$refs.tree.getCurrentNode();
-        return selectList;
-      }
-    }
-  };
-</script>
-
-<style lang="scss" scoped>
-  .tree-wrapper {
-    width: 100%;
-    height: 100%;
-    overflow: auto;
-
-    :deep(.el-tree) {
-      display: inline-block;
-      min-width: 100%;
-    }
-  }
-</style>

+ 81 - 22
src/views/BOMmanage/details.vue

@@ -1,7 +1,19 @@
 <template>
   <div class="ele-body el-form-box">
-    <el-card class="card_2_box">
 
+    <el-card class="card_2_box">
+      <div
+        style="margin-bottom: 10px;display: flex;flex-direction: row;justify-content: space-between;align-items: center;">
+        <div style="font-size: 15px;font-weight: bold">
+          <span style="margin-right: 30px;color: #55a3ff">项目名称:{{ dialogForm.name }}</span>
+          <span style="margin-right: 30px">项目编码:{{ dialogForm.code }}</span>
+          <span>项目经理:{{ dialogForm.responsibleUserName }}</span>
+        </div>
+        <div style="font-size: 15px;">
+          <i class="el-icon-_screen-full" title="全屏" v-if="!isFullscreen" style="cursor: pointer"  @click="toggleFullscreen(isFullscreen)"></i>
+          <i class="el-icon-_screen-restore" title="取消全屏" v-else style="cursor: pointer"  @click="toggleFullscreen(isFullscreen)"></i>
+        </div>
+      </div>
       <div class="card_2_box_content">
         <ele-split-layout
           :left-style="{
@@ -74,6 +86,8 @@
                                   @removeBom="()=> bomRemove(node,data)"
                                   @stageRemove="()=> stageRemove(node,data)"
                                   @addBOM="()=> addOrEditBOM('add',node,data)"
+                                  @addChildProject="()=> handleUpdateProject(node,data,'add')"
+                                  @addStage="()=> handleAddStage(node,data,'add')"
                                   @editBOM="()=> addOrEditBOM('edit',node,data)"
                                   @addPlan="()=> handleAddPlan('add',node,data)"
                                   @addTask="()=> handleAddTask('add',node,data)"
@@ -147,6 +161,10 @@
                                   :deptTreeList="deptTreeList" :dialogForm="dialogForm"
                                   :teamList="teamList" dialog-type="view"></project-form>
                   </el-tab-pane>
+                  <el-tab-pane v-if="[0,2].includes(currentNodeData.type)" label="项目阶段" name="项目阶段" class="el-tab-pane-tree">
+                    <project-info-table ref="projectInfoTable" :dialog-type="dialogType" :dialogForm="dialogForm" :deptList="deptList"
+                                        :deptTreeList="deptTreeList" ></project-info-table>
+                  </el-tab-pane>
                   <el-tab-pane label="计划" name="计划" class="el-tab-pane-tree">
                     <ele-pro-table
                       class="el-table"
@@ -274,12 +292,16 @@
 
 
                   </el-tab-pane>
-                  <el-tab-pane label="项目审核流程" name="项目审核流程" class="el-tab-pane-tree" style="overflow: scroll;padding-bottom: 30px">
+                  <el-tab-pane label="项目审核流程" name="项目审核流程" class="el-tab-pane-tree"
+                               style="overflow: scroll;padding-bottom: 30px">
                     <bpmDetail v-if="dialogForm.processInstanceId&&bpmDetailFlag"
                                :id="dialogForm.processInstanceId"></bpmDetail>
 
                   </el-tab-pane>
+                  <el-tab-pane label="项目行事历" name="项目行事历" class="el-tab-pane-tree">
 
+
+                  </el-tab-pane>
                 </el-tabs>
 
               </div>
@@ -344,6 +366,10 @@
     <addOrEditProjectDialog v-if="addOrEditProjectDialogFlag" @reload="reload"
                             :addOrEditDialogFlag.sync="addOrEditProjectDialogFlag"
                             ref="addOrEditProjectDialogRef"></addOrEditProjectDialog>
+    <!--阶段弹窗 -->
+    <addOrEditStageDialog v-if="addOrEditDialogStageFlag" @reload="reload"
+                            :addOrEditDialogStageFlag.sync="addOrEditDialogStageFlag"
+                            ref="addOrEditStageDialogRef"></addOrEditStageDialog>
   </div>
 </template>
 
@@ -375,6 +401,7 @@ import {
   projectsTerminationAPI
 } from "@/api/project-manage";
 import projectForm from "@/views/project-manage/project-initiation/components/project-form.vue";
+import addOrEditStageDialog from "@/views/project-manage/project-initiation/components/addOrEditStageDialog.vue";
 import {listOrganizations} from "@/api/system/organization";
 import {projectsTeamGetByIdAPI, projectsTeamPageAPI} from "@/api/project-manage/team";
 import PlanCard from "@/views/BOMmanage/components/planCard.vue";
@@ -407,10 +434,12 @@ import transferDialog from "@/views/project-manage/task-manage/components/transf
 import submitDeliverablesDialog from "@/views/project-manage/task-manage/components/submitDeliverablesDialog.vue";
 import addOrEditProjectDialog from "@/views/project-manage/project-initiation/components/addOrEditDialog.vue";
 import bpmDetail from "@/views/bpm/processInstance/detail.vue";
+import projectInfoTable from "@/views/project-manage/project-initiation/components/projectInfoTable.vue";
 
 export default {
   name: 'BOMDetails',
   components: {
+    projectInfoTable,
     bpmDetail,
     addOrEditProjectDialog,
     submitDeliverablesDialog,
@@ -429,6 +458,7 @@ export default {
     BOMBaseForm,
     Attribute,
     addBOMDialog,
+    addOrEditStageDialog
   },
   data() {
     return {
@@ -456,6 +486,7 @@ export default {
       attrActiveName: '属性',
       leftTreeActiveName: 'BOM维度',
       active: 0,
+      isFullscreen: false,
       contextMenuData: {
         menuName: '',
         axis: {
@@ -486,6 +517,7 @@ export default {
       dictList: {},
       currentTableNodeData: {},
       treeList: [],
+      addOrEditDialogStageFlag: false,
       bpmDetailFlag: false,
       isShow: false,
       treeLoading: false,
@@ -770,13 +802,21 @@ export default {
         return Promise.reject(false);
       });
     },
+    addChildProject(){
 
+    },
     addOrEditBOM(type, node, data) {
       this.addBOMDialogFlag = true;
       this.$nextTick(() => {
         this.$refs.addBOMDialogRef.init(data, type);
       })
     },
+    handleAddStage(node,data,type){
+      this.addOrEditDialogStageFlag = true
+      this.$nextTick(() => {
+        this.$refs.addOrEditStageDialogRef.init(data, type);
+      })
+    },
     handleAddPlan(type, node, data, sourceName = 'project') {
       this.addPlanDialogFLag = true;
       let params = {}
@@ -972,8 +1012,8 @@ export default {
       }
     },
     showRightMenu(event, node, data) {
-      if(this.dialogType =='view') return
-      this.contextMenuData.menuName = data.id+'_'+data.name+'_rightMenu'
+      if (this.dialogType == 'view') return
+      this.contextMenuData.menuName = data.id + '_' + data.name + '_rightMenu'
       this.$nextTick(() => {
         let menuList = [...document.querySelectorAll('.vue-contextmenu-listWrapper')]
         menuList.forEach(item => {
@@ -988,11 +1028,23 @@ export default {
         switch (data.type) {
           case 0:
             this.contextMenuData.menulists = [
+              {
+                fnHandler: 'addChildProject',
+                icoName: 'fa el-icon-plus',
+                btnName: '新建子项目',
+                disabled: this.disableToAddBOM(data)&&this.$hasPermission('pro:projects:save')
+              },
+              {
+                fnHandler: 'addStage',
+                icoName: 'fa el-icon-plus',
+                btnName: '新建阶段',
+                disabled: this.disableToAddBOM(data)&&this.$hasPermission('pro:projects:save')
+              },
               {
                 fnHandler: 'addBOM',
                 icoName: 'fa el-icon-plus',
                 btnName: '新建BOM',
-                disabled: this.disableToAddBOM(data)
+                disabled: this.disableToAddBOM(data)&&this.$hasPermission('pro:projects:save')
               },
               {
                 fnHandler: 'addPlan',
@@ -1010,37 +1062,37 @@ export default {
                 fnHandler: 'updateProject',
                 icoName: 'fa el-icon-edit',
                 btnName: '修改',
-                disabled: [1, 2].includes(data.processStatus)
+                disabled: [1, 2].includes(data.processStatus)&&this.$hasPermission('pro:projects:update')
               },
               {
                 fnHandler: 'onRemove',
                 icoName: 'fa el-icon-delete',
                 btnName: '删除',
-                disabled: [1, 2].includes(data.processStatus)
+                disabled: [1, 2].includes(data.processStatus)&&this.$hasPermission('pro:projects:delete')
               },
               {
                 fnHandler: 'handleFinish',
                 icoName: 'fa el-icon-success',
                 btnName: '完成',
-                disabled: this.disableToFinish(data)
+                disabled: this.disableToFinish(data)&&this.$hasPermission('pro:projects:update')
               },
               {
                 fnHandler: 'handlePause',
                 icoName: 'fa el-icon-video-pause',
                 btnName: '暂停',
-                disabled: this.disableToPause(data)
+                disabled: this.disableToPause(data)&&this.$hasPermission('pro:projects:update')
               },
               {
                 fnHandler: 'handleStartup',
                 icoName: 'fa el-icon-video-play',
                 btnName: '启动',
-                disabled: this.disableToStartup(data)
+                disabled: this.disableToStartup(data)&&this.$hasPermission('pro:projects:update')
               },
               {
                 fnHandler: 'handleTermination',
                 icoName: 'fa el-icon-error',
                 btnName: '终止',
-                disabled: this.disableToTermination(data)
+                disabled: this.disableToTermination(data)&&this.$hasPermission('pro:projects:update')
               },
             ]
             break;
@@ -1050,7 +1102,7 @@ export default {
                 fnHandler: 'addBOM',
                 icoName: 'fa el-icon-plus',
                 btnName: '新建BOM',
-                disabled: this.disableToAddBOM(data)
+                disabled: this.disableToAddBOM(data)&&this.$hasPermission('pro:projects:save')
               },
               {
                 fnHandler: 'addPlan',
@@ -1068,37 +1120,37 @@ export default {
                 fnHandler: 'editBOM',
                 icoName: 'fa el-icon-edit',
                 btnName: '修改',
-                disabled: ![0].includes(data.status)
+                disabled: ![0].includes(data.status)&&this.$hasPermission('pro:projects:update')
               },
               {
                 fnHandler: 'removeBom',
                 icoName: 'fa el-icon-delete',
                 btnName: '删除',
-                disabled: ![0].includes(data.status)
+                disabled: ![0].includes(data.status)&&this.$hasPermission('pro:projects:delete')
               },
               {
                 fnHandler: 'handleBomFinish',
                 icoName: 'fa el-icon-success',
                 btnName: '完成',
-                disabled: this.disableToFinish(data)
+                disabled: this.disableToFinish(data)&&this.$hasPermission('pro:projects:update')
               },
               {
                 fnHandler: 'handleBomPause',
                 icoName: 'fa el-icon-video-pause',
                 btnName: '暂停',
-                disabled: this.disableToPause(data)
+                disabled: this.disableToPause(data)&&this.$hasPermission('pro:projects:update')
               },
               {
                 fnHandler: 'handleBomStartup',
                 icoName: 'fa el-icon-video-play',
                 btnName: '启动',
-                disabled: this.disableToStartup(data)
+                disabled: this.disableToStartup(data)&&this.$hasPermission('pro:projects:update')
               },
               {
                 fnHandler: 'handleBomTermination',
                 icoName: 'fa el-icon-error',
                 btnName: '终止',
-                disabled: this.disableToTermination(data)
+                disabled: this.disableToTermination(data)&&this.$hasPermission('pro:projects:update')
               },
             ]
             break
@@ -1288,7 +1340,7 @@ export default {
       }
     },
     showTableRightMenu(row, column, event) {
-      if(this.dialogType =='view') return
+      if (this.dialogType == 'view') return
       this.contextTableMenuData.menuName = row.name
       this.$nextTick(() => {
         let menuList = [...document.querySelectorAll('.vue-contextmenu-listWrapper')]
@@ -1319,14 +1371,14 @@ export default {
                 fnHandler: 'editPlan',
                 icoName: 'fa el-icon-edit',
                 btnName: '修改',
-                disabled:[1, 2].includes(row.processStatus) || ![0].includes(row.status)
+                disabled: [1, 2].includes(row.processStatus) || ![0].includes(row.status)
 
               },
               {
                 fnHandler: 'removePlan',
                 icoName: 'fa el-icon-delete',
                 btnName: '删除',
-                disabled:[1, 2].includes(row.processStatus) || ![0].includes(row.status)
+                disabled: [1, 2].includes(row.processStatus) || ![0].includes(row.status)
               },
               {
                 fnHandler: 'finishPlan',
@@ -1461,7 +1513,10 @@ export default {
       // await this.changeProject(this.dialogForm.projectId)
     },
     async getTeamInfo(teamId) {
-      this.teamForm = await projectsTeamGetByIdAPI(teamId)
+      if(teamId){
+        this.teamForm = await projectsTeamGetByIdAPI(teamId)
+      }
+
     },
 
     // 每一级字体变小
@@ -1486,6 +1541,10 @@ export default {
         return '#67c23a';
       }
     },
+    toggleFullscreen() {
+      this.isFullscreen=!this.isFullscreen
+      this.$store.dispatch('theme/setBodyFullscreen', this.isFullscreen);
+    },
   }
 };
 </script>

+ 1 - 1
src/views/project-manage/components/contractListDialog.vue

@@ -243,7 +243,7 @@ export default {
         status: 2,
         ...where
       }
-      if(this.hasGeneratedOrder!=3) params.hasGeneratedOrder = this.hasGeneratedOrder
+     // if(this.hasGeneratedOrder!=3) params.hasGeneratedOrder = this.hasGeneratedOrder
       return getTableList(params);
     },
 

+ 4 - 2
src/views/project-manage/planManage/components/details.vue

@@ -1256,8 +1256,10 @@ export default {
       })
       // await this.changeProject(this.dialogForm.projectId)
     },
-    async getTeamInfo(teamId) {
-      this.teamForm = await projectsTeamGetByIdAPI(teamId)
+    async getTeamInfo(teamId='') {
+      if(teamId){
+        this.teamForm = await projectsTeamGetByIdAPI(teamId)
+      }
     },
 
     // 每一级字体变小

+ 5 - 5
src/views/project-manage/planManage/components/index-search.vue

@@ -28,11 +28,11 @@
           />
         </el-form-item>
       </el-col>
-      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">
-        <el-form-item label="组织机构:">
-          <auth-selection data-type="Array" v-model="where.deptIds" style="width: 100%"></auth-selection>
-        </el-form-item>
-      </el-col>
+<!--      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">-->
+<!--        <el-form-item label="组织机构:">-->
+<!--          <auth-selection data-type="Array" v-model="where.deptIds" style="width: 100%"></auth-selection>-->
+<!--        </el-form-item>-->
+<!--      </el-col>-->
       <el-col v-bind="styleResponsive ? { md: 6 } : { span: 4 }">
         <el-form-item>
           <el-button

+ 9 - 8
src/views/project-manage/planManage/index.vue

@@ -18,14 +18,14 @@
       >
         <!-- 表头工具栏 -->
         <template v-slot:toolbar>
-<!--          <el-button-->
-<!--            size="small"-->
-<!--            type="primary"-->
-<!--            icon="el-icon-plus"-->
-<!--            class="ele-btn-icon"-->
-<!--            @click="openEdit2('','add')">-->
-<!--            新建2-->
-<!--          </el-button>-->
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-plus"
+            class="ele-btn-icon"
+            @click="openEdit2('','add')">
+            新建2
+          </el-button>
           <el-button
             size="small"
             type="primary"
@@ -478,6 +478,7 @@ export default {
           pcView : '/bpm/handleTask/components/project-manage/plan-manage/detailDialog.vue',
           miniHandle : '',
           miniView : '',
+          formCreateUserId: row.createUserId,
         }
 
 

+ 50 - 16
src/views/project-manage/project-initiation/components/addOrEditDialog.vue

@@ -10,9 +10,9 @@
     <headerTitle title="基础信息"></headerTitle>
     <project-form ref="projectForm" :dialog-type="dialogType" :dialogForm="dialogForm" :deptList="deptList"
                   :deptTreeList="deptTreeList" :teamList="teamList" @teamChange='getUserList'></project-form>
-    <headerTitle title="项目阶段"></headerTitle>
-    <project-info-table ref="projectInfoTable" :dialog-type="dialogType" :dialogForm="dialogForm" :deptList="deptList"
-                        :deptTreeList="deptTreeList" :userList="userList"></project-info-table>
+<!--    <headerTitle title="项目阶段"></headerTitle>-->
+<!--    <project-info-table ref="projectInfoTable" :dialog-type="dialogType" :dialogForm="dialogForm" :deptList="deptList"-->
+<!--                        :deptTreeList="deptTreeList" :userList="userList"></project-info-table>-->
     <div slot="footer">
       <el-button type="primary" size="small" @click="submit">保 存</el-button>
 <!--      <el-button type="primary" size="small" @click="submit('sub')">提 交</el-button>-->
@@ -48,7 +48,40 @@ export default {
     return {
       title: '',
       dialogType: '',
-      dialogForm: {},
+      dialogForm: {
+        budget: '',
+        unit: '1',
+        code: "",
+        contactId: '',
+        contactName: "",
+        contactRelationPhone: "",
+        contactRelationUserId: '',
+        contactRelationUserName: "",
+        content: "",
+        cycle: "",
+        deptUserId: '',
+        deptUserName: "",
+        level: "",
+        monitorUserId: '',
+        monitorUserName: "",
+        planStartDate: "",
+        planEndDate: "",
+        proportion: undefined,
+        name: "",
+        parentId: '',
+        remark: "",
+        responsibleUserId: '',
+        responsibleUserName: "",
+        responsibleDeptId: "",
+        responsibleDeptName: "",
+        stage: "",
+        teamId: "",
+        teamName: "",
+        type: '',
+        contractId: '',
+        contractName: '',
+        files: [],
+      },
       teamList: [],
       userList: [],
       deptList: [],
@@ -64,7 +97,8 @@ export default {
       this.title = type === 'add' ? '新增' : '编辑';
       this.dialogType = type;
       if (type === 'add') {
-
+        console.log(row);
+        this.$set(this.dialogForm,'parentId',row.id)
       } else {
         this.getInfo(row.id);
       }
@@ -118,19 +152,19 @@ export default {
 
     async submit(type = '') {
       let form = await this.$refs.projectForm.validForm();
-      form.stageList = await this.$refs.projectInfoTable.getTableValidate();
+      // form.stageList = await this.$refs.projectInfoTable.getTableValidate();
       form.realStartDate = null
       form.realEndDate = null
-      form.stageList.forEach((item) => {
-        item.responsibleUserList = item.responsibleUserIds.map(
-          i => {
-            return {
-              userId: i,
-              userName: this.userList.find(u => u.id === i).name
-            }
-          }
-        ) || []
-      })
+      // form.stageList.forEach((item) => {
+      //   item.responsibleUserList = item.responsibleUserIds.map(
+      //     i => {
+      //       return {
+      //         userId: i,
+      //         userName: this.userList.find(u => u.id === i).name
+      //       }
+      //     }
+      //   ) || []
+      // })
 
       const API = this.dialogType === 'add' ? projectsSaveAPI : projectsUpdateAPI;
       const id = await API(form)

+ 199 - 0
src/views/project-manage/project-initiation/components/addOrEditStageDialog.vue

@@ -0,0 +1,199 @@
+<template>
+  <ele-modal
+    custom-class="ele-dialog-form long-dialog-form"
+    :centered="true"
+    :visible.sync="addOrEditDialogStageFlag"
+    :title="title"
+    :close-on-click-modal="false"
+    width="70%"
+    :before-close="cancel">
+<!--    <headerTitle title="基础信息"></headerTitle>-->
+<!--    <project-form ref="projectForm" :dialog-type="dialogType" :dialogForm="dialogForm" :deptList="deptList"-->
+<!--                  :deptTreeList="deptTreeList" :teamList="teamList" @teamChange='getUserList'></project-form>-->
+<!--    <headerTitle title="项目阶段"></headerTitle>-->
+    <project-info-table ref="projectInfoTable" :dialog-type.sync="dialogType" :dialogForm="dialogForm" :deptList="deptList"
+                        :deptTreeList="deptTreeList" :userList="userList"></project-info-table>
+    <div slot="footer">
+      <el-button type="primary" size="small" @click="submit">保 存</el-button>
+<!--      <el-button type="primary" size="small" @click="submit('sub')">提 交</el-button>-->
+      <el-button size="small" @click="cancel">关 闭</el-button>
+    </div>
+
+
+  </ele-modal>
+</template>
+
+
+<script>
+import projectForm from "./project-form.vue";
+import projectInfoTable from "./projectInfoTable.vue";
+import {projectsGetByIdAPI, projectsSaveAPI, projectsUpdateAPI, submit} from "@/api/project-manage";
+import {listOrganizations} from "@/api/system/organization";
+import {projectsTeamGetByIdAPI, projectsTeamPageAPI} from "@/api/project-manage/team";
+import {deepClone} from "@/utils";
+
+export default {
+  name: "addOrEditDialog",
+  components: {
+    projectForm,
+    projectInfoTable
+  },
+  props: {
+    addOrEditDialogStageFlag: {
+      type: Boolean,
+      default: false,
+    }
+  },
+  data() {
+    return {
+      title: '',
+      dialogType: '',
+      dialogForm: {
+        budget: '',
+        unit: '1',
+        code: "",
+        contactId: '',
+        contactName: "",
+        contactRelationPhone: "",
+        contactRelationUserId: '',
+        contactRelationUserName: "",
+        content: "",
+        cycle: "",
+        deptUserId: '',
+        deptUserName: "",
+        level: "",
+        monitorUserId: '',
+        monitorUserName: "",
+        planStartDate: "",
+        planEndDate: "",
+        proportion: undefined,
+        name: "",
+        parentId: '',
+        remark: "",
+        responsibleUserId: '',
+        responsibleUserName: "",
+        responsibleDeptId: "",
+        responsibleDeptName: "",
+        stage: "",
+        teamId: "",
+        teamName: "",
+        type: '',
+        contractId: '',
+        contractName: '',
+        files: [],
+      },
+      teamList: [],
+      userList: [],
+      deptList: [],
+      deptTreeList: [],
+    }
+  },
+  created() {
+    this.getDeptList();
+    this.getTeamList();
+  },
+  methods: {
+    init(row = {}, type) {
+      this.title = type === 'add' ? '新增' : '编辑';
+      this.dialogType = type;
+      if (type === 'add') {
+        console.log(row);
+        this.$set(this.dialogForm,'parentId',row.id)
+      } else {
+        this.getInfo(row.id);
+      }
+    },
+    async getInfo(id) {
+      this.dialogForm = await projectsGetByIdAPI(id)
+      this.dialogForm.type = this.dialogForm.type + ''
+      this.dialogForm.level = this.dialogForm.level + ''
+      this.dialogForm.parentId = this.dialogForm.parentId == 0 ? '' : this.dialogForm.parentId
+      this.dialogForm.stageList.forEach((item, index) => {
+        let userIds = item.responsibleUserList.map(i => i.userId) || []
+        this.$set(item, 'responsibleUserIds', userIds)
+      })
+      if (this.dialogForm.teamId) this.getUserList(this.dialogForm.teamId)
+    },
+    // 获取部门数据
+    getDeptList() {
+      listOrganizations().then((list) => {
+        this.deptList = list;
+        this.deptTreeList = this.$util.toTreeData({
+          data: list,
+          idField: 'id',
+          parentIdField: 'parentId'
+        });
+      });
+    },
+    // 获取项目团队集合
+    getTeamList() {
+      projectsTeamPageAPI(
+        {
+          pageNum: 1,
+          size: 999,
+          processStatus:2
+        }
+      ).then((list) => {
+        this.teamList = list;
+      });
+    },
+    // 获取项目团队下团队人员集合
+    getUserList(val) {
+      if (!val) {
+        this.userList = []
+        return
+      }
+      projectsTeamGetByIdAPI(
+        val
+      ).then((list) => {
+        this.userList = list.teamUserList;
+      });
+    },
+
+    async submit(type = '') {
+      let form = await this.$refs.projectForm.validForm();
+      // form.stageList = await this.$refs.projectInfoTable.getTableValidate();
+      form.realStartDate = null
+      form.realEndDate = null
+      // form.stageList.forEach((item) => {
+      //   item.responsibleUserList = item.responsibleUserIds.map(
+      //     i => {
+      //       return {
+      //         userId: i,
+      //         userName: this.userList.find(u => u.id === i).name
+      //       }
+      //     }
+      //   ) || []
+      // })
+
+      const API = this.dialogType === 'add' ? projectsSaveAPI : projectsUpdateAPI;
+      const id = await API(form)
+      if (type === 'sub') {
+        this.processSubmit(id);
+        return
+      }
+      this.$message.success('操作成功');
+      this.cancel()
+      this.$emit('reload');
+    },
+    //流程提交
+    processSubmit(id = '') {
+      submit({
+        projectId:this.dialogType === 'add' ? id : this.dialogForm.id
+      }).then((res) => {
+        this.$message.success('提交成功');
+        this.cancel();
+        this.$emit('reload');
+      });
+    },
+    cancel() {
+      this.$emit('update:addOrEditDialogStageFlag', false);
+    },
+  }
+}
+</script>
+
+
+<style scoped lang="scss">
+
+</style>

+ 8 - 14
src/views/project-manage/project-initiation/components/index-search.vue

@@ -8,11 +8,6 @@
     @submit.native.prevent
   >
     <el-row :gutter="10">
-      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">
-        <el-form-item label="项目类型">
-          <dict-selection dict-name="项目类型" v-model="where.type"></dict-selection>
-        </el-form-item>
-      </el-col>
       <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">
         <el-form-item label="项目编码">
           <el-input
@@ -33,15 +28,7 @@
           />
         </el-form-item>
       </el-col>
-      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">
-        <el-form-item label="组织机构:">
-          <auth-selection data-type="Array" v-model="where.deptIds" style="width: 100%"></auth-selection>
-        </el-form-item>
-      </el-col>
-
-    </el-row>
-    <el-row :gutter="10">
-      <el-col style="display: flex;justify-content: flex-end" v-bind="styleResponsive ? { md: 24 } : { span: 24 }">
+      <el-col style="display: flex;justify-content: flex-end" v-bind="styleResponsive ? { md: 12 } : { span: 12 }">
         <el-form-item>
           <el-button
             size="small"
@@ -64,7 +51,14 @@
           <slot></slot>
         </el-form-item>
       </el-col>
+<!--      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">-->
+<!--        <el-form-item label="组织机构:">-->
+<!--          <auth-selection data-type="Array" v-model="where.deptIds" style="width: 100%"></auth-selection>-->
+<!--        </el-form-item>-->
+<!--      </el-col>-->
+
     </el-row>
+
   </el-form>
 </template>
 

+ 37 - 18
src/views/project-manage/project-initiation/components/project-form.vue

@@ -33,8 +33,20 @@
           <el-form-item
             prop="type"
             label="项目类型">
-            <dict-selection dict-name="项目类型" v-model="form.type" :disabled="dialogType=='view'"
-                            @change="changeType"></dict-selection>
+<!--            <dict-selection dict-name="项目类型" v-model="form.type" :disabled="dialogType=='view'"-->
+<!--                            @change="changeType"></dict-selection>-->
+            <ele-tree-select
+              filterable
+              :disabled="dialogType=='view'"
+              clearable
+              :data="typeTreeList"
+              v-model="form.type"
+              valueKey="id"
+              labelKey="name"
+              placeholder="请选择"
+              @change="changeType"
+              default-expand-all
+            />
           </el-form-item>
         </el-col>
         <el-col :span="8">
@@ -73,7 +85,7 @@
         <el-col :span="8">
           <el-form-item
             label="负责部门"
-            prop="applyDeptId">
+            prop="responsibleDeptId">
             <ele-tree-select
               filterable
               :disabled="dialogType=='view'"
@@ -142,19 +154,13 @@
         </el-col>
       </el-row>
       <el-row>
-        <el-col :span="8">
-          <el-form-item
-            prop="cycle"
-            label="项目周期">
-            <el-input v-model="form.cycle" :disabled="dialogType=='view'"></el-input>
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
 
+        <el-col :span="8">
           <el-form-item
             prop="planStartDate"
             label="计划开始日期">
             <el-date-picker
+              @change="(val)=>setCycleValue(val,'planEndDate')"
               style="width: 100%"
               :disabled="dialogType=='view'"
               v-model="form.planStartDate"
@@ -169,6 +175,7 @@
             prop="planEndDate"
             label="计划完成日期">
             <el-date-picker
+              @change="(val)=>setCycleValue(val,'planStartDate')"
               style="width: 100%"
               :disabled="dialogType=='view'"
               :picker-options="{disabledDate:(time)=>{return form.planStartDate&&time.getTime()<new Date(form.planStartDate)}}"
@@ -178,7 +185,13 @@
             </el-date-picker>
           </el-form-item>
         </el-col>
-
+        <el-col :span="8">
+          <el-form-item
+            prop="cycle"
+            label="项目周期">
+            <el-input v-model="form.cycle" :disabled="dialogType=='view'"></el-input>
+          </el-form-item>
+        </el-col>
 
         <!--        <el-col :span="8">-->
         <!--          <el-form-item label="权重占比">-->
@@ -280,6 +293,8 @@ import customDialog from "../../components/custom-dialog.vue";
 import fileUpload from "@/BIZComponents/addDoc/index.vue";
 import {getFile} from "@/api/system/file";
 import contractListDialog from "@/views/project-manage/components/contractListDialog.vue";
+import {getProduceTreeByCode} from "@/api/custom";
+import moment from "moment";
 
 export default {
   name: "project-form",
@@ -363,6 +378,7 @@ export default {
         contractName: '',
         files: [],
       },
+      typeTreeList: [],
       projectList: [],
       customDialogFlag: false,
       contractDialogFlag: false,
@@ -371,6 +387,7 @@ export default {
         name: {required: true, message: '请输入项目名称', trigger: 'blur'},
         budget: {required: true, message: '请输入项目预算', trigger: 'blur'},
         teamId: {required: true, message: '请选择项目团队', trigger: 'change'},
+        responsibleDeptId: {required: true, message: '请选择负责部门', trigger: 'change'},
         responsibleUserId: {required: true, message: '请选择项目经理', trigger: 'change'},
         planStartDate: {required: true, message: '请选择计划开始日期', trigger: 'change'},
         planEndDate: {required: true, message: '请选择计划完成日期', trigger: 'change'},
@@ -380,13 +397,18 @@ export default {
   },
   async created() {
     this.projectList = await projectsToTreeAPI({processStatus: '2', treeType: '0'})
-
+    this.typeTreeList = await getProduceTreeByCode('XM1');
   },
 
   methods: {
-
+    setCycleValue(val,prop){
+      if(!this.form[prop] || !val)  return this.form.cycle = ''
+      const a = moment(this.form.planEndDate);
+      const b = moment(this.form.planStartDate);
+      this.form.cycle =  a.diff(b, 'days') + 1 + ' 天' // 1
+    },
     async changeType(val) {
-      this.form.code = await getProjectCode(val)
+     // this.form.code = await getProjectCode(val)
     },
     async teamChange(val) {
       let find = this.teamList.find(e => e.id == val) || {}
@@ -422,7 +444,6 @@ export default {
     },
     //选择合同信息回调
     getContractInfo(obj) {
-
       this.form.contractId = obj.id
       this.form.contractName = obj.contractName
       if (obj.type == 1) {
@@ -434,7 +455,6 @@ export default {
         this.form.contactName = obj.partbName
         this.form.contactRelationPhone = obj.partbTel
       }
-
     },
     //获取客户信息
     handleGetCus() {
@@ -443,7 +463,6 @@ export default {
       this.$nextTick(() => {
         this.$refs.customRef.open(item);
       })
-
     },
     //选择客户信息回调
     getCusInfo(obj) {

+ 22 - 14
src/views/project-manage/project-initiation/components/projectInfoTable.vue

@@ -1,7 +1,15 @@
 <template>
   <div>
     <el-form ref="form" :model="form">
-
+      <el-button
+        v-if="dialogType!=='view'"
+        type="primary"
+        icon="el-icon-plus"
+        class="ele-btn-icon"
+        style="margin-bottom: 5px"
+        @click="handleAddInfo">
+        新增项目阶段
+      </el-button>
       <!-- 数据表格 -->
       <ele-pro-table
         ref="table"
@@ -14,18 +22,18 @@
         tool-class="ele-toolbar-form"
         cache-key="eomContactPageTable"
       >
-        <!-- 表头工具栏 -->
-        <template v-slot:toolbar>
-          <el-button
-            v-if="dialogType!=='view'"
-            size="small"
-            type="primary"
-            icon="el-icon-plus"
-            class="ele-btn-icon"
-            @click="handleAddInfo">
-            新增项目阶段
-          </el-button>
-        </template>
+<!--        &lt;!&ndash; 表头工具栏 &ndash;&gt;-->
+<!--        <template v-slot:toolbar>-->
+<!--          <el-button-->
+<!--            v-if="dialogType!=='view'"-->
+<!--            size="small"-->
+<!--            type="primary"-->
+<!--            icon="el-icon-plus"-->
+<!--            class="ele-btn-icon"-->
+<!--            @click="handleAddInfo">-->
+<!--            新增项目阶段-->
+<!--          </el-button>-->
+<!--        </template>-->
 
         <template v-slot:action="{row,$index}">
           <el-popconfirm
@@ -173,7 +181,7 @@ import {listOrganizations} from "@/api/system/organization";
 import {deepClone} from "@/utils";
 
 export default {
-  name: "relatedInfoTable",
+  name: "stageInfoTable",
   components: {
     PersonSelect,
     fileUpload,

+ 222 - 177
src/views/project-manage/project-initiation/index.vue

@@ -1,189 +1,213 @@
 <template>
-  <div class="ele-body">
-    <el-card shadow="never">
-      <index-search @search="reload"/>
-      <!-- 数据表格 -->
-      <ele-pro-table
-        ref="table"
-        row-key="id"
-        :columns="columns"
-        :datasource="datasource"
-        height="calc(100vh - 400px)"
-        full-height="calc(100vh - 116px)"
-        :default-expand-all="true"
-        cache-key="project-initiationTable"
-        :selection.sync="selection"
-        :tree-props="{children: 'projectList'}"
-        @done="onDone"
-        :indent="15"
-      >
-        <!--        :lazy="true"-->
-        <!-- 表头工具栏 -->
-        <template v-slot:toolbar>
-          <el-button
-            size="small"
-            type="primary"
-            icon="el-icon-plus"
-            class="ele-btn-icon"
-            @click="openEdit('','add')">
-            新建
-          </el-button>
-          <el-button
-            size="small"
-            type="danger"
-            icon="el-icon-delete"
-            class="ele-btn-icon"
-            @click="allDelBtn"
+  <el-card shadow="never">
+    <ele-split-layout
+      width="180px"
+      allow-collapse
+      :right-style="{ overflow: 'hidden' }"
+    >
+      <div>
+        <div class="ele-border-lighter sys-organization-list" style="margin-left: 10px">
+          <AssetTree
+            @handleNodeClick="handleNodeClick"
+            :defaultExpandAll=true
+            code="XM1"
+            :isFirstRefreshTable="false"
+            ref="treeList"
+          />
+        </div>
+      </div>
+      <template v-slot:content>
+        <el-card shadow="never">
+          <index-search @search="reload"/>
+          <!-- 数据表格 -->
+          <ele-pro-table
+            ref="table"
+            row-key="id"
+            :columns="columns"
+            :datasource="datasource"
+            height="calc(100vh - 400px)"
+            full-height="calc(100vh - 116px)"
+            :default-expand-all="true"
+            cache-key="project-initiationTable"
+            :selection.sync="selection"
+            :tree-props="{children: 'projectList'}"
+            @done="onDone"
+            :indent="15"
           >
-            删除
-          </el-button>
-          <!--          <el-button-->
-          <!--            size="small"-->
-          <!--            type="danger"-->
-          <!--            icon="el-icon-remove-outline"-->
-          <!--            class="ele-btn-icon"-->
-          <!--            @click="handleStatus('4')"-->
-          <!--          >-->
-          <!--            终止-->
-          <!--          </el-button>-->
-          <!--          <el-button-->
-          <!--            size="small"-->
-          <!--            type="warning"-->
-          <!--            icon="el-icon-video-play"-->
-          <!--            class="ele-btn-icon"-->
-          <!--            @click="handleStatus('2')"-->
-          <!--          >-->
-          <!--            暂停-->
-          <!--          </el-button>-->
-          <!--          <el-button-->
-          <!--            size="small"-->
-          <!--            type="primary"-->
-          <!--            icon="el-icon-video-pause"-->
-          <!--            class="ele-btn-icon"-->
-          <!--            @click="handleStatus('1')"-->
-          <!--          >-->
-          <!--            启动-->
-          <!--          </el-button>-->
-          <!--          <el-button class="el-icon-sort" size="small" @click="expandAll">-->
-          <!--            展开/折叠-->
-          <!--          </el-button>-->
-          <!-- <div class="el-button--primary">122222</div> -->
-        </template>
-        <template v-slot:code="{ row }">
-          <el-button type="text" @click="handelBOMConstructDetail(row,'view')">{{ row.code }}</el-button>
-        </template>
-        <template v-slot:status="{ row }">
-          {{ getDictV('pro_projects_status', row.status) }}
-        </template>
-        <template v-slot:type="{ row }">
-          {{ getDictV('pro_projects_type', row.type) }}
-        </template>
-        <template v-slot:isOverTime="{ row }">
-          <el-tag v-if="row.isOverTime==0" type="success">正常</el-tag>
-          <el-tag v-else type="danger">超时</el-tag>
-        </template>
-        <template v-slot:isOverbudget="{ row }">
-          <el-tag v-if="row.isOverbudget==0" type="success">否</el-tag>
-          <el-tag v-else type="danger">是</el-tag>
-        </template>
-        <template v-slot:speedPercent="{ row }">
-          <el-progress :stroke-width="20" text-color="#606266" :text-inside="true" :percentage="row.speedPercent||0"
-                       :color="customColorMethod"></el-progress>
-        </template>
-
-        <!-- 操作列 -->
-        <template v-slot:action="{ row }">
+            <!--        :lazy="true"-->
+            <!-- 表头工具栏 -->
+            <template v-slot:toolbar>
+              <el-button
+                size="small"
+                type="primary"
+                icon="el-icon-plus"
+                class="ele-btn-icon"
+                v-if="$hasPermission('pro:projects:save')"
+                @click="openEdit('','add')">
+                新建
+              </el-button>
+              <el-button
+                size="small"
+                type="danger"
+                icon="el-icon-delete"
+                class="ele-btn-icon"
+                v-if="$hasPermission('pro:projects:delete')"
+                @click="allDelBtn"
+              >
+                删除
+              </el-button>
+              <!--          <el-button-->
+              <!--            size="small"-->
+              <!--            type="danger"-->
+              <!--            icon="el-icon-remove-outline"-->
+              <!--            class="ele-btn-icon"-->
+              <!--            @click="handleStatus('4')"-->
+              <!--          >-->
+              <!--            终止-->
+              <!--          </el-button>-->
+              <!--          <el-button-->
+              <!--            size="small"-->
+              <!--            type="warning"-->
+              <!--            icon="el-icon-video-play"-->
+              <!--            class="ele-btn-icon"-->
+              <!--            @click="handleStatus('2')"-->
+              <!--          >-->
+              <!--            暂停-->
+              <!--          </el-button>-->
+              <!--          <el-button-->
+              <!--            size="small"-->
+              <!--            type="primary"-->
+              <!--            icon="el-icon-video-pause"-->
+              <!--            class="ele-btn-icon"-->
+              <!--            @click="handleStatus('1')"-->
+              <!--          >-->
+              <!--            启动-->
+              <!--          </el-button>-->
+              <!--          <el-button class="el-icon-sort" size="small" @click="expandAll">-->
+              <!--            展开/折叠-->
+              <!--          </el-button>-->
+              <!-- <div class="el-button--primary">122222</div> -->
+            </template>
+            <template v-slot:code="{ row }">
+              <el-button type="text" @click="handelBOMConstructDetail(row,'view')">{{ row.code }}</el-button>
+            </template>
+            <template v-slot:status="{ row }">
+              {{ getDictV('pro_projects_status', row.status) }}
+            </template>
+            <template v-slot:type="{ row }">
+              {{ getDictV('pro_projects_type', row.type) }}
+            </template>
+            <template v-slot:isOverTime="{ row }">
+              <el-tag v-if="row.isOverTime==0" type="success">正常</el-tag>
+              <el-tag v-else type="danger">超时</el-tag>
+            </template>
+            <template v-slot:isOverbudget="{ row }">
+              <el-tag v-if="row.isOverbudget==0" type="success">否</el-tag>
+              <el-tag v-else type="danger">是</el-tag>
+            </template>
+            <template v-slot:speedPercent="{ row }">
+              <el-progress :stroke-width="20" text-color="#606266" :text-inside="true" :percentage="row.speedPercent||0"
+                           :color="customColorMethod"></el-progress>
+            </template>
 
-          <el-link
-            type="primary"
-            :underline="false"
-            icon="el-icon-plus"
-            @click="processSubmit(row)"
-            v-if="[0, 3].includes(row.processStatus)"
-          >
-            提交
-          </el-link>
-          <el-link
-            type="primary"
-            :underline="false"
-            icon="el-icon-edit"
-            v-if="[0, 3].includes(row.processStatus)"
-            @click="openEdit(row,'edit')"
-          >
-            修改
-          </el-link>
+            <!-- 操作列 -->
+            <template v-slot:action="{ row }">
 
-          <el-popconfirm
-            class="ele-action"
-            title="确定要删除吗?"
-            v-if="[0, 3].includes(row.processStatus)"
-            @confirm="remove([row.id])">
-            <template v-slot:reference>
-              <el-link type="danger" :underline="false" icon="el-icon-delete">
-                删除
+              <el-link
+                type="primary"
+                :underline="false"
+                icon="el-icon-plus"
+                @click="processSubmit(row)"
+                v-if="[0, 3].includes(row.processStatus)"
+              >
+                提交
+              </el-link>
+              <el-link
+                type="primary"
+                :underline="false"
+                icon="el-icon-edit"
+                v-if="[0, 3].includes(row.processStatus)&&$hasPermission('pro:projects:update')"
+                @click="openEdit(row,'edit')"
+              >
+                修改
               </el-link>
-            </template>
-          </el-popconfirm>
 
-          <el-dropdown trigger="click" >
+              <el-popconfirm
+                class="ele-action"
+                title="确定要删除吗?"
+                v-if="[0, 3].includes(row.processStatus)&&$hasPermission('pro:projects:delete')"
+                @confirm="remove([row.id])">
+                <template v-slot:reference>
+                  <el-link type="danger" :underline="false" icon="el-icon-delete">
+                    删除
+                  </el-link>
+                </template>
+              </el-popconfirm>
+
+              <el-dropdown trigger="click" >
             <span class="el-dropdown-link">
               操作菜单<i class="el-icon-arrow-down el-icon--right"></i>
             </span>
-            <el-dropdown-menu slot="dropdown">
-              <el-dropdown-item v-if="![0,1, 3].includes(row.processStatus)&&![4,2,3].includes(row.status)">
-                <el-link icon="el-icon-success" type="success" :underline="false" @click="handleStatus(projectsFinishAPI,'完成',row)">完成
-                </el-link>
-              </el-dropdown-item>
-              <el-dropdown-item v-if="![0,1, 3].includes(row.processStatus)&&![4,2,3].includes(row.status)">
-                <el-link icon="el-icon-video-pause" type="warning" :underline="false" @click="handleStatus(projectsPauseAPI,'暂停',row)">暂停
-                </el-link>
-              </el-dropdown-item>
-              <el-dropdown-item v-if="![0,1, 3].includes(row.processStatus)&&![4,1,0,3].includes(row.status)">
-                <el-link icon="el-icon-video-play" type="success" :underline="false" @click="handleStatus(projectsStartupAPI,'启动',row)">启动
-                </el-link>
-              </el-dropdown-item>
-              <el-dropdown-item v-if="![0,1, 3].includes(row.processStatus)&&![4,3].includes(row.status)">
-                <el-link icon="el-icon-error" type="danger" :underline="false" @click="handleStatus(projectsTerminationAPI,'终止',row)">终止</el-link>
-              </el-dropdown-item>
-              <el-dropdown-item>
-                <el-link icon="el-icon-info" type="primary" :underline="false" @click="handelBOMConstructDetail(row)">
-                  项目信息
-                </el-link>
-              </el-dropdown-item>
-              <el-dropdown-item divided v-if="[0,1,2,3].includes(row.processStatus)&&[0,1].includes(row.status)">
-                <el-link
-                  icon="el-icon-circle-plus"
-                  type="primary"
-                  :underline="false"
-                  @click="handleAddPlan(row)">
-                  新增计划
-                </el-link>
-              </el-dropdown-item>
-            </el-dropdown-menu>
-          </el-dropdown>
+                <el-dropdown-menu slot="dropdown">
+                  <el-dropdown-item v-if="![0,1, 3].includes(row.processStatus)&&![4,2,3].includes(row.status)&&$hasPermission('pro:projects:update')">
+                    <el-link icon="el-icon-success" type="success" :underline="false" @click="handleStatus(projectsFinishAPI,'完成',row)">完成
+                    </el-link>
+                  </el-dropdown-item>
+                  <el-dropdown-item v-if="![0,1, 3].includes(row.processStatus)&&![4,2,3].includes(row.status)&&$hasPermission('pro:projects:update')">
+                    <el-link icon="el-icon-video-pause" type="warning" :underline="false" @click="handleStatus(projectsPauseAPI,'暂停',row)">暂停
+                    </el-link>
+                  </el-dropdown-item>
+                  <el-dropdown-item v-if="![0,1, 3].includes(row.processStatus)&&![4,1,0,3].includes(row.status)&&$hasPermission('pro:projects:update')">
+                    <el-link icon="el-icon-video-play" type="success" :underline="false" @click="handleStatus(projectsStartupAPI,'启动',row)">启动
+                    </el-link>
+                  </el-dropdown-item>
+                  <el-dropdown-item v-if="![0,1, 3].includes(row.processStatus)&&![4,3].includes(row.status)&&$hasPermission('pro:projects:update')">
+                    <el-link icon="el-icon-error" type="danger" :underline="false" @click="handleStatus(projectsTerminationAPI,'终止',row)">终止</el-link>
+                  </el-dropdown-item>
+                  <el-dropdown-item>
+                    <el-link icon="el-icon-info" type="primary" :underline="false" @click="handelBOMConstructDetail(row)">
+                      项目信息
+                    </el-link>
+                  </el-dropdown-item>
+                  <el-dropdown-item divided v-if="[0,1,2,3].includes(row.processStatus)&&[0,1].includes(row.status)">
+                    <el-link
+                      icon="el-icon-circle-plus"
+                      type="primary"
+                      :underline="false"
+                      @click="handleAddPlan(row)">
+                      新增计划
+                    </el-link>
+                  </el-dropdown-item>
+                </el-dropdown-menu>
+              </el-dropdown>
+
+
+            </template>
 
 
-        </template>
+          </ele-pro-table>
+        </el-card>
+      </template>
+      <!-- 编辑弹窗 -->
+      <add-or-edit-dialog v-if="addOrEditDialogFlag" @reload="reload" :addOrEditDialogFlag.sync="addOrEditDialogFlag"
+                          ref="addOrEditDialogRef"></add-or-edit-dialog>
+      <detail-dialog v-if="detailDialogFlag" :detailDialogFlag.sync="detailDialogFlag"
+                     ref="detailDialogRef"></detail-dialog>
+      <!-- 新增计划 -->
+      <add-plan-dialog v-if="addPlanDialogFLag" @reload="reload" :addOrEditDialogFlag.sync="addPlanDialogFLag"
+                       ref="addPlanDialogRef"></add-plan-dialog>
+      <!-- 多选删除弹窗 -->
+      <pop-modal
+        :visible.sync="delVisible"
+        content="是否确定删除?"
+        @done="commitBtn"
+      />
+      <process-submit-dialog :processSubmitDialogFlag.sync="processSubmitDialogFlag" v-if="processSubmitDialogFlag" ref="processSubmitDialogRef" @reload="reload"></process-submit-dialog>
+
+    </ele-split-layout>
+  </el-card>
 
 
-      </ele-pro-table>
-    </el-card>
-    <!-- 编辑弹窗 -->
-    <add-or-edit-dialog v-if="addOrEditDialogFlag" @reload="reload" :addOrEditDialogFlag.sync="addOrEditDialogFlag"
-                        ref="addOrEditDialogRef"></add-or-edit-dialog>
-    <detail-dialog v-if="detailDialogFlag" :detailDialogFlag.sync="detailDialogFlag"
-                   ref="detailDialogRef"></detail-dialog>
-    <!-- 新增计划 -->
-    <add-plan-dialog v-if="addPlanDialogFLag" @reload="reload" :addOrEditDialogFlag.sync="addPlanDialogFLag"
-                     ref="addPlanDialogRef"></add-plan-dialog>
-    <!-- 多选删除弹窗 -->
-    <pop-modal
-      :visible.sync="delVisible"
-      content="是否确定删除?"
-      @done="commitBtn"
-    />
-    <process-submit-dialog :processSubmitDialogFlag.sync="processSubmitDialogFlag" v-if="processSubmitDialogFlag" ref="processSubmitDialogRef" @reload="reload"></process-submit-dialog>
-  </div>
 </template>
 
 <script>
@@ -197,7 +221,7 @@ import {reviewStatusEnum} from '@/enum/dict';
 import {mapGetters} from "vuex";
 import {getByCode} from "@/api/system/dictionary-data";
 import popModal from "@/components/pop-modal/index.vue";
-
+import AssetTree from '@/components/AssetTree';
 export default {
   name: 'index',
   components: {
@@ -206,7 +230,8 @@ export default {
     detailDialog,
     indexSearch,
     processSubmitDialog,
-    addPlanDialog
+    addPlanDialog,
+    AssetTree
   },
   computed: {
     ...mapGetters(['getDictValue']),
@@ -369,11 +394,10 @@ export default {
         {
           columnKey: 'action',
           label: '操作',
-          width: 200,
+          width: 280,
           align: 'center',
           resizable: false,
           slot: 'action',
-          showOverflowTooltip: true,
           fixed: 'right'
         }
       ]
@@ -456,6 +480,9 @@ export default {
       this.$refs.table.reload({where, size: 1, pageNum: 10, parentId: '0'});
       this.$refs.table.reRenderTable()
     },
+    handleNodeClick(data, node) {
+      this.reload({type: data.id});
+    },
     /* 显示编辑 */
     openEdit(row = {}, type) {
       this.addOrEditDialogFlag = true;
@@ -494,6 +521,7 @@ export default {
         let params = {
           businessId:row.id,
           businessKey : 'pro_project_approve',
+          formCreateUserId: row.createUserId,
         }
         this.$refs.processSubmitDialogRef.init(params)
       })
@@ -539,6 +567,9 @@ export default {
 };
 </script>
 <style lang="scss" scoped>
+:deep(.el-link--inner) {
+  margin-left: 0px !important;
+}
 ::v-deep .el-dropdown-link {
   cursor: pointer;
   color: #188ffd;
@@ -552,5 +583,19 @@ export default {
     justify-content: flex-start;
   }
 }
+.sys-organization-list {
+  height: calc(100vh - 230px);
+  box-sizing: border-box;
+  border-width: 1px;
+  border-style: solid;
+  overflow: auto;
+}
 
+.sys-organization-list :deep(.el-tree-node__content) {
+  height: 40px;
+
+  & > .el-tree-node__expand-icon {
+    margin-left: 10px;
+  }
+}
 </style>

+ 5 - 5
src/views/project-manage/task-manage/components/index-search.vue

@@ -33,11 +33,11 @@
           />
         </el-form-item>
       </el-col>
-      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">
-        <el-form-item label="组织机构:">
-          <auth-selection data-type="Array" v-model="where.deptIds" style="width: 100%"></auth-selection>
-        </el-form-item>
-      </el-col>
+<!--      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">-->
+<!--        <el-form-item label="组织机构:">-->
+<!--          <auth-selection data-type="Array" v-model="where.deptIds" style="width: 100%"></auth-selection>-->
+<!--        </el-form-item>-->
+<!--      </el-col>-->
     </el-row>
     <el-row :gutter="10">
       <el-col style="display: flex;justify-content: flex-end" v-bind="styleResponsive ? { md: 24 } : { span: 24 }">

+ 5 - 5
src/views/project-manage/team-manage/components/index-search.vue

@@ -28,11 +28,11 @@
           />
         </el-form-item>
       </el-col>
-      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">
-        <el-form-item label="组织机构:">
-          <auth-selection data-type="Array" v-model="where.deptIds" style="width: 100%"></auth-selection>
-        </el-form-item>
-      </el-col>
+<!--      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">-->
+<!--        <el-form-item label="组织机构:">-->
+<!--          <auth-selection data-type="Array" v-model="where.deptIds" style="width: 100%"></auth-selection>-->
+<!--        </el-form-item>-->
+<!--      </el-col>-->
       <el-col style="display: flex;justify-content: end" v-bind="styleResponsive ? { md: 6 } : { span: 4 }">
         <el-form-item>
           <el-button