wsx 1 год назад
Родитель
Сommit
89b5dc9cbd

+ 25 - 25
src/App.vue

@@ -5,32 +5,32 @@
 </template>
 
 <script>
-  import { updateDocumentTitle } from '@/utils/document-title-util';
+import { updateDocumentTitle } from '@/utils/document-title-util';
 
-  export default {
-    name: 'App',
-    created() {
-      console.log('我是');
-      // 恢复主题
-      this.$store.dispatch('theme/recoverTheme');
-    },
-    methods: {
-      /* 路由切换更新浏览器标题 */
-      setDocumentTitle() {
-        updateDocumentTitle(
-          this.$route,
-          (key) => this.$t(key),
-          this.$store.state.theme.tabs
-        );
-      }
+export default {
+  name: 'App',
+  created() {
+    console.log('我是');
+    // 恢复主题
+    this.$store.dispatch('theme/recoverTheme');
+  },
+  methods: {
+    /* 路由切换更新浏览器标题 */
+    setDocumentTitle() {
+      updateDocumentTitle(
+        this.$route,
+        (key) => this.$t(key),
+        this.$store.state.theme.tabs
+      );
+    }
+  },
+  watch: {
+    '$i18n.locale'() {
+      this.setDocumentTitle();
     },
-    watch: {
-      '$i18n.locale'() {
-        this.setDocumentTitle();
-      },
-      $route() {
-        this.setDocumentTitle();
-      }
+    $route() {
+      this.setDocumentTitle();
     }
-  };
+  }
+};
 </script>

+ 2 - 2
src/components/linkParentDialog/index.vue

@@ -380,8 +380,8 @@
       // this.getTreeList();
       this.getDictList();
       console.log(this.parentId);
-
-      // this.datasource();
+      // this.radio=this.parentId
+      // 这里以后可能要带出选择的项,应该是后端返回的数据列表的数据中带一个page的字段,每个子项目在哪个页
     },
 
     mounted() {}

+ 1 - 1
src/styles/transition/common.scss

@@ -174,7 +174,7 @@
 
 
 .el-dialog {
-  margin-top: 5vh !important;
+  margin-top: 0;
 }
 
 .el-table--medium .el-table__cell {

Разница между файлами не показана из-за своего большого размера
+ 599 - 562
src/views/BOMmanage/ProjectDetailDialog.vue


+ 84 - 70
src/views/project-manage/project-initiation/components/addOrEditDialog.vue

@@ -7,34 +7,48 @@
     :close-on-click-modal="false"
     :append-to-body="true"
     width="70%"
-    :before-close="cancel">
+    :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="dialogType" :dialogForm="dialogForm" :deptList="deptList"-->
-<!--                        :deptTreeList="deptTreeList" :userList="userList"></project-info-table>-->
+    <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>-->
     <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 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";
+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",
+  name: 'addOrEditDialog',
   components: {
     projectForm,
     projectInfoTable
@@ -42,7 +56,7 @@ export default {
   props: {
     addOrEditDialogFlag: {
       type: Boolean,
-      default: false,
+      default: false
     }
   },
   data() {
@@ -52,42 +66,42 @@ export default {
       dialogForm: {
         budget: '',
         unit: '1',
-        code: "",
+        code: '',
         contactId: '',
-        contactName: "",
-        contactRelationPhone: "",
+        contactName: '',
+        contactRelationPhone: '',
         contactRelationUserId: '',
-        contactRelationUserName: "",
-        content: "",
-        cycle: "",
+        contactRelationUserName: '',
+        content: '',
+        cycle: '',
         deptUserId: '',
-        deptUserName: "",
-        level: "",
+        deptUserName: '',
+        level: '',
         monitorUserId: '',
-        monitorUserName: "",
-        planStartDate: "",
-        planEndDate: "",
+        monitorUserName: '',
+        planStartDate: '',
+        planEndDate: '',
         proportion: undefined,
-        name: "",
+        name: '',
         parentId: '',
-        remark: "",
+        remark: '',
         responsibleUserId: '',
-        responsibleUserName: "",
-        responsibleDeptId: "",
-        responsibleDeptName: "",
-        stage: "",
-        teamId: "",
-        teamName: "",
+        responsibleUserName: '',
+        responsibleDeptId: '',
+        responsibleDeptName: '',
+        stage: '',
+        teamId: '',
+        teamName: '',
         type: '',
         contractId: '',
         contractName: '',
-        files: [],
+        files: []
       },
       teamList: [],
       userList: [],
       deptList: [],
-      deptTreeList: [],
-    }
+      deptTreeList: []
+    };
   },
   created() {
     this.getDeptList();
@@ -99,21 +113,22 @@ export default {
       this.dialogType = type;
       if (type === 'add') {
         console.log(row);
-        this.$set(this.dialogForm,'parentId',row.id)
+        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 = 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)
+        let userIds = item.responsibleUserList.map((i) => i.userId) || [];
+        this.$set(item, 'responsibleUserIds', userIds);
+      });
+      if (this.dialogForm.teamId) this.getUserList(this.dialogForm.teamId);
     },
     // 获取部门数据
     getDeptList() {
@@ -128,25 +143,21 @@ export default {
     },
     // 获取项目团队集合
     getTeamList() {
-      projectsTeamPageAPI(
-        {
-          pageNum: 1,
-          size: 999,
-          processStatus:2
-        }
-      ).then((list) => {
+      projectsTeamPageAPI({
+        pageNum: 1,
+        size: 999,
+        processStatus: 2
+      }).then((list) => {
         this.teamList = list;
       });
     },
     // 获取项目团队下团队人员集合
     getUserList(val) {
       if (!val) {
-        this.userList = []
-        return
+        this.userList = [];
+        return;
       }
-      projectsTeamGetByIdAPI(
-        val
-      ).then((list) => {
+      projectsTeamGetByIdAPI(val).then((list) => {
         this.userList = list.teamUserList;
       });
     },
@@ -154,8 +165,8 @@ export default {
     async submit(type = '') {
       let form = await this.$refs.projectForm.validForm();
       // form.stageList = await this.$refs.projectInfoTable.getTableValidate();
-      form.realStartDate = null
-      form.realEndDate = null
+      form.realStartDate = null;
+      form.realEndDate = null;
       // form.stageList.forEach((item) => {
       //   item.responsibleUserList = item.responsibleUserIds.map(
       //     i => {
@@ -167,20 +178,21 @@ export default {
       //   ) || []
       // })
 
-      const API = this.dialogType === 'add' ? projectsSaveAPI : projectsUpdateAPI;
-      const id = await API(form)
+      const API =
+        this.dialogType === 'add' ? projectsSaveAPI : projectsUpdateAPI;
+      const id = await API(form);
       if (type === 'sub') {
         this.processSubmit(id);
-        return
+        return;
       }
       this.$message.success('操作成功');
-      this.cancel()
+      this.cancel();
       this.$emit('reload');
     },
     //流程提交
     processSubmit(id = '') {
       submit({
-        projectId:this.dialogType === 'add' ? id : this.dialogForm.id
+        projectId: this.dialogType === 'add' ? id : this.dialogForm.id
       }).then((res) => {
         this.$message.success('提交成功');
         this.cancel();
@@ -189,12 +201,14 @@ export default {
     },
     cancel() {
       this.$emit('update:addOrEditDialogFlag', false);
-    },
+    }
   }
-}
+};
 </script>
 
 
 <style scoped lang="scss">
-
+:deep(.el-dialog) {
+  margin-top: 0 !important;
+}
 </style>

+ 82 - 72
src/views/project-manage/project-initiation/components/addOrEditStageDialog.vue

@@ -1,3 +1,4 @@
+<!--项目管理--项目信息--项目阶段 新建阶段的表格 -->
 <template>
   <ele-modal
     custom-class="ele-dialog-form long-dialog-form"
@@ -7,35 +8,47 @@
     :close-on-click-modal="false"
     width="70%"
     :append-to-body="true"
-
-    :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>
+    :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 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";
+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",
+  name: 'addOrEditDialog',
   components: {
     projectForm,
     projectInfoTable
@@ -43,7 +56,7 @@ export default {
   props: {
     addOrEditDialogStageFlag: {
       type: Boolean,
-      default: false,
+      default: false
     }
   },
   data() {
@@ -53,42 +66,42 @@ export default {
       dialogForm: {
         budget: '',
         unit: '1',
-        code: "",
+        code: '',
         contactId: '',
-        contactName: "",
-        contactRelationPhone: "",
+        contactName: '',
+        contactRelationPhone: '',
         contactRelationUserId: '',
-        contactRelationUserName: "",
-        content: "",
-        cycle: "",
+        contactRelationUserName: '',
+        content: '',
+        cycle: '',
         deptUserId: '',
-        deptUserName: "",
-        level: "",
+        deptUserName: '',
+        level: '',
         monitorUserId: '',
-        monitorUserName: "",
-        planStartDate: "",
-        planEndDate: "",
+        monitorUserName: '',
+        planStartDate: '',
+        planEndDate: '',
         proportion: undefined,
-        name: "",
+        name: '',
         parentId: '',
-        remark: "",
+        remark: '',
         responsibleUserId: '',
-        responsibleUserName: "",
-        responsibleDeptId: "",
-        responsibleDeptName: "",
-        stage: "",
-        teamId: "",
-        teamName: "",
+        responsibleUserName: '',
+        responsibleDeptId: '',
+        responsibleDeptName: '',
+        stage: '',
+        teamId: '',
+        teamName: '',
         type: '',
         contractId: '',
         contractName: '',
-        files: [],
+        files: []
       },
       teamList: [],
       userList: [],
       deptList: [],
-      deptTreeList: [],
-    }
+      deptTreeList: []
+    };
   },
   created() {
     this.getDeptList();
@@ -100,21 +113,22 @@ export default {
       this.dialogType = type;
       if (type === 'add') {
         console.log(row);
-        this.$set(this.dialogForm,'parentId',row.id)
+        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 = 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)
+        let userIds = item.responsibleUserList.map((i) => i.userId) || [];
+        this.$set(item, 'responsibleUserIds', userIds);
+      });
+      if (this.dialogForm.teamId) this.getUserList(this.dialogForm.teamId);
     },
     // 获取部门数据
     getDeptList() {
@@ -129,25 +143,21 @@ export default {
     },
     // 获取项目团队集合
     getTeamList() {
-      projectsTeamPageAPI(
-        {
-          pageNum: 1,
-          size: 999,
-          processStatus:2
-        }
-      ).then((list) => {
+      projectsTeamPageAPI({
+        pageNum: 1,
+        size: 999,
+        processStatus: 2
+      }).then((list) => {
         this.teamList = list;
       });
     },
     // 获取项目团队下团队人员集合
     getUserList(val) {
       if (!val) {
-        this.userList = []
-        return
+        this.userList = [];
+        return;
       }
-      projectsTeamGetByIdAPI(
-        val
-      ).then((list) => {
+      projectsTeamGetByIdAPI(val).then((list) => {
         this.userList = list.teamUserList;
       });
     },
@@ -155,8 +165,8 @@ export default {
     async submit(type = '') {
       let form = await this.$refs.projectForm.validForm();
       // form.stageList = await this.$refs.projectInfoTable.getTableValidate();
-      form.realStartDate = null
-      form.realEndDate = null
+      form.realStartDate = null;
+      form.realEndDate = null;
       // form.stageList.forEach((item) => {
       //   item.responsibleUserList = item.responsibleUserIds.map(
       //     i => {
@@ -168,20 +178,21 @@ export default {
       //   ) || []
       // })
 
-      const API = this.dialogType === 'add' ? projectsSaveAPI : projectsUpdateAPI;
-      const id = await API(form)
+      const API =
+        this.dialogType === 'add' ? projectsSaveAPI : projectsUpdateAPI;
+      const id = await API(form);
       if (type === 'sub') {
         this.processSubmit(id);
-        return
+        return;
       }
       this.$message.success('操作成功');
-      this.cancel()
+      this.cancel();
       this.$emit('reload');
     },
     //流程提交
     processSubmit(id = '') {
       submit({
-        projectId:this.dialogType === 'add' ? id : this.dialogForm.id
+        projectId: this.dialogType === 'add' ? id : this.dialogForm.id
       }).then((res) => {
         this.$message.success('提交成功');
         this.cancel();
@@ -190,12 +201,11 @@ export default {
     },
     cancel() {
       this.$emit('update:addOrEditDialogStageFlag', false);
-    },
+    }
   }
-}
+};
 </script>
 
 
 <style scoped lang="scss">
-
 </style>

+ 531 - 553
src/views/project-manage/project-initiation/components/project-form.vue

@@ -33,7 +33,6 @@
             ></el-input>
           </el-form-item>
         </el-col>
-
         <el-col :span="8">
           <el-form-item prop="name" label="项目名称">
             <el-input
@@ -42,27 +41,10 @@
             ></el-input>
           </el-form-item>
         </el-col>
-
-        <!-- <el-col :span="8">
-          <el-form-item label="从属项目">
-            <ele-tree-select
-              :disabled="dialogType == 'view'"
-              clearable
-              filterable
-              :data="projectList"
-              v-model="form.parentId"
-              childrenKey="projectList"
-              valueKey="id"
-              labelKey="name"
-              placeholder="请选择"
-              default-expand-all
-            />
-          </el-form-item>
-        </el-col> -->
-
         <el-col :span="8">
           <el-form-item label="从属项目">
             <el-select
+              style="width: 100%"
               :disabled="dialogType == 'view'"
               ref="selectRef"
               v-model="form.parentId"
@@ -80,7 +62,6 @@
             </el-select>
           </el-form-item>
         </el-col>
-
         <el-col :span="8">
           <el-form-item label="负责部门" prop="responsibleDeptId">
             <ele-tree-select
@@ -108,7 +89,6 @@
             />
           </el-form-item>
         </el-col>
-
         <el-col :span="8">
           <el-form-item prop="teamId" label="项目团队">
             <el-select
@@ -160,7 +140,6 @@
             ></dict-selection>
           </el-form-item>
         </el-col>
-
         <el-col :span="8">
           <el-form-item prop="planStartDate" label="计划开始日期">
             <el-date-picker
@@ -353,565 +332,564 @@
 </template>
 
 <script>
-  import {
-    getProjectCode,
-    projectsToTreeAPI,
-    getProjectCodeG,
-    projectsPageAPI
-  } from '@/api/project-manage';
-  import { projectsTeamPageAPI } from '@/api/project-manage/team';
+import {
+  getProjectCode,
+  projectsToTreeAPI,
+  getProjectCodeG,
+  projectsPageAPI
+} from '@/api/project-manage';
+import { projectsTeamPageAPI } from '@/api/project-manage/team';
 
-  import linkParentDialog from '@/components/linkParentDialog';
+import linkParentDialog from '@/components/linkParentDialog';
 
-  import PersonSelect from '@/components/CommomSelect/person-select.vue';
-  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 orderListDialog from '@/BIZComponents/orderListDialog/orderListDialog.vue';
-  import { getProduceTreeByCode } from '@/api/custom';
-  import moment from 'moment';
-  import { cityData } from 'ele-admin/packages/utils/regions';
+import PersonSelect from '@/components/CommomSelect/person-select.vue';
+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 orderListDialog from '@/BIZComponents/orderListDialog/orderListDialog.vue';
+import { getProduceTreeByCode } from '@/api/custom';
+import moment from 'moment';
+import { cityData } from 'ele-admin/packages/utils/regions';
 
-  import { contactDetail } from '@/api/eos';
+import { contactDetail } from '@/api/eos';
 
-  import { reviewStatusEnum } from '@/enum/dict';
-  export default {
-    name: 'project-form',
-    components: {
-      fileUpload,
-      PersonSelect,
-      customDialog,
-      contractListDialog,
-      orderListDialog,
-      linkParentDialog
+import { reviewStatusEnum } from '@/enum/dict';
+export default {
+  name: 'project-form',
+  components: {
+    fileUpload,
+    PersonSelect,
+    customDialog,
+    contractListDialog,
+    orderListDialog,
+    linkParentDialog
+  },
+  props: {
+    code: {
+      type: String,
+      default: ''
     },
-    props: {
-      code: {
-        type: String,
-        default: ''
-      },
-      dialogType: {
-        type: String,
-        default: ''
-      },
-      dialogForm: {
-        type: Object,
-        default: () => {
-          return {
-            ...this.form
-          };
-        }
-      },
-      teamList: {
-        type: Array,
-        default: () => {
-          return [];
-        }
-      },
-      deptList: {
-        type: Array,
-        default: () => {
-          return [];
-        }
-      },
-
-      deptTreeList: {
-        type: Array,
-        default: () => {
-          return [];
-        }
+    dialogType: {
+      type: String,
+      default: ''
+    },
+    dialogForm: {
+      type: Object,
+      default: () => {
+        return {
+          ...this.form
+        };
       }
     },
-    watch: {
-      dialogForm: {
-        handler(val) {
-          this.form = { ...this.dialogForm };
-          // 回显地址选择器
-          if (
-            this.form.contactAddressId &&
-            this.form.contactAddressId.length > 0
-          ) {
-            this.form.contactAddressId = this.form.contactAddressId.split(',');
-          }
-          this.$nextTick(async () => {
-            await this.getUserList(this.dialogForm.responsibleDeptId);
-          });
-        },
-        deep: true
+    teamList: {
+      type: Array,
+      default: () => {
+        return [];
+      }
+    },
+    deptList: {
+      type: Array,
+      default: () => {
+        return [];
       }
     },
-    data() {
-      return {
-        tableDataParams: {
-          code: '',
-          name: ''
-        },
-        tableColumns: [
-          {
-            width: 45,
-            type: 'selection',
-            columnKey: 'selection',
-            align: 'center'
-          },
-          {
-            columnKey: 'index',
-            label: '序号',
-            type: 'index',
-            width: 55,
-            align: 'center',
-            showOverflowTooltip: true
-          },
-          {
-            prop: 'typeName',
-            label: '项目类型',
-            showOverflowTooltip: true,
-            minWidth: 150,
-            align: 'center'
-            // slot: 'type',
-          },
-          {
-            prop: 'code',
-            label: '项目编码',
-            showOverflowTooltip: true,
-            minWidth: 160,
-            slot: 'code',
-            align: 'center'
-          },
-          {
-            prop: 'name',
-            label: '项目名称',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 140
-          },
 
-          {
-            prop: 'responsibleDeptName',
-            label: '负责部门',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 100
-          },
-          {
-            prop: 'responsibleUserName',
-            label: '项目经理',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 100
-          },
-          {
-            prop: 'teamName',
-            label: '项目团队',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 100
-          },
-          {
-            prop: 'cycle',
-            label: '项目周期',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 100
-          },
-          {
-            prop: 'budget',
-            label: '项目预算',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 110,
-            formatter: (_row, _column, cellValue) => {
-              return cellValue
-                ? cellValue +
-                    this.getDictV('pro_projects_budget_unit', _row.unit)
-                : '';
-            }
-          },
-          {
-            prop: 'planStartDate',
-            label: '计划开始日期',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 120
-          },
-          {
-            prop: 'planEndDate',
-            label: '计划完成日期',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 120
-          },
-          {
-            prop: 'realStartTime',
-            label: '实际开始日期',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 120
-          },
-          {
-            prop: 'realEndTime',
-            label: '实际完成日期',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 120
-          },
-          {
-            prop: 'cost',
-            label: '费用(元)',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 140
-          },
-          {
-            prop: 'status',
-            label: '项目状态',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 100,
-            slot: 'status'
-          },
-          {
-            prop: 'processStatus',
-            label: '审核状态',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 100,
-            formatter: (_row, _column, cellValue) => {
-              return reviewStatusEnum[_row.processStatus].label;
-            }
-          },
-          {
-            prop: 'isOverTime',
-            label: '是否超时',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 100,
-            slot: 'isOverTime'
-          },
-          {
-            prop: 'isOverbudget',
-            label: '是否超预算',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 100,
-            slot: 'isOverbudget'
-          },
-          {
-            prop: 'speedPercent',
-            label: '项目进度',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 150,
-            slot: 'speedPercent'
-          },
-          {
-            columnKey: 'action',
-            label: '操作',
-            width: 280,
-            align: 'center',
-            resizable: false,
-            slot: 'action',
-            fixed: 'right'
-          }
-        ],
+    deptTreeList: {
+      type: Array,
+      default: () => {
+        return [];
+      }
+    }
+  },
+  watch: {
+    dialogForm: {
+      handler(val) {
+        this.form = { ...this.dialogForm };
+        // 回显地址选择器
+        if (
+          this.form.contactAddressId &&
+          this.form.contactAddressId.length > 0
+        ) {
+          this.form.contactAddressId = this.form.contactAddressId.split(',');
+        }
+        this.$nextTick(async () => {
+          await this.getUserList(this.dialogForm.responsibleDeptId);
+        });
+      },
+      deep: true
+    }
+  },
+  data() {
+    return {
+      tableDataParams: {
+        code: '',
+        name: ''
+      },
+      tableColumns: [
+        {
+          width: 45,
+          type: 'selection',
+          columnKey: 'selection',
+          align: 'center'
+        },
+        {
+          columnKey: 'index',
+          label: '序号',
+          type: 'index',
+          width: 55,
+          align: 'center',
+          showOverflowTooltip: true
+        },
+        {
+          prop: 'typeName',
+          label: '项目类型',
+          showOverflowTooltip: true,
+          minWidth: 150,
+          align: 'center'
+          // slot: 'type',
+        },
+        {
+          prop: 'code',
+          label: '项目编码',
+          showOverflowTooltip: true,
+          minWidth: 160,
+          slot: 'code',
+          align: 'center'
+        },
+        {
+          prop: 'name',
+          label: '项目名称',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 140
+        },
 
-        getProduceTreeByCode: '',
-        linkParentDialogFlag: false,
-        rootId: [],
-        // 编码规则要传的参数
-        ruleCode: '',
-        cityData,
-        typeOptions: [
-          {
-            value: 1,
-            label: '订单'
-          },
-          {
-            value: 2,
-            label: '客户'
-          },
-          {
-            value: 3,
-            label: '合同'
+        {
+          prop: 'responsibleDeptName',
+          label: '负责部门',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 100
+        },
+        {
+          prop: 'responsibleUserName',
+          label: '项目经理',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 100
+        },
+        {
+          prop: 'teamName',
+          label: '项目团队',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 100
+        },
+        {
+          prop: 'cycle',
+          label: '项目周期',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 100
+        },
+        {
+          prop: 'budget',
+          label: '项目预算',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 110,
+          formatter: (_row, _column, cellValue) => {
+            return cellValue
+              ? cellValue + this.getDictV('pro_projects_budget_unit', _row.unit)
+              : '';
           }
-        ],
-        form: {
-          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: [],
-          relationType: 1
         },
-        typeTreeList: [],
-        projectList: [],
-        grouplist: [],
-        customDialogFlag: false,
-        contractDialogFlag: false,
-        rules: {
-          type: {
-            required: true,
-            message: '请选择项目类型',
-            trigger: 'change'
-          },
-          name: { required: true, message: '请输入项目名称', trigger: 'blur' },
-          budget: {
-            required: true,
-            message: '请输入项目预算',
-            trigger: 'blur'
-          },
-          // contactId: {
-          //   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'
-          },
-          code: {
-            required: true,
-            message: '请输入项目编码',
-            trigger: ['blur', 'change']
+        {
+          prop: 'planStartDate',
+          label: '计划开始日期',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 120
+        },
+        {
+          prop: 'planEndDate',
+          label: '计划完成日期',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 120
+        },
+        {
+          prop: 'realStartTime',
+          label: '实际开始日期',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 120
+        },
+        {
+          prop: 'realEndTime',
+          label: '实际完成日期',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 120
+        },
+        {
+          prop: 'cost',
+          label: '费用(元)',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 140
+        },
+        {
+          prop: 'status',
+          label: '项目状态',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 100,
+          slot: 'status'
+        },
+        {
+          prop: 'processStatus',
+          label: '审核状态',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 100,
+          formatter: (_row, _column, cellValue) => {
+            return reviewStatusEnum[_row.processStatus].label;
           }
+        },
+        {
+          prop: 'isOverTime',
+          label: '是否超时',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 100,
+          slot: 'isOverTime'
+        },
+        {
+          prop: 'isOverbudget',
+          label: '是否超预算',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 100,
+          slot: 'isOverbudget'
+        },
+        {
+          prop: 'speedPercent',
+          label: '项目进度',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 150,
+          slot: 'speedPercent'
+        },
+        {
+          columnKey: 'action',
+          label: '操作',
+          width: 280,
+          align: 'center',
+          resizable: false,
+          slot: 'action',
+          fixed: 'right'
         }
-      };
-    },
-    async created() {
-      //  this.projectsPageAPI = projectsPageAPI;
-      this.projectList = await projectsToTreeAPI({
-        processStatus: '2',
-        treeType: '0'
-      });
-      console.log(this.projectList);
-      this.getProduceTreeByCode = getProduceTreeByCode;
-      const res1 = await getProduceTreeByCode('XM1');
-      this.typeTreeList = res1;
-      // 根id为了tree不能选择树节点
-      this.rootId = res1.map((item) => item.id);
-      let res2 = await projectsTeamPageAPI({ pageNum: 1, size: 10 });
-      this.grouplist = res2;
-      this.ruleCode = this.typeTreeList[0].ruleCode;
-    },
+      ],
 
-    methods: {
-      clearParentId() {
-        this.form.parentId = null;
-        this.form.parentName = null;
-        console.log('qing');
-      },
-      projectsPageAPI,
-      close() {
-        this.linkParentDialogFlag = false;
-      },
-      openLinkParent(...arg) {
-        console.log(arg);
-        let _this = this;
-        _this.$refs.selectRef.blur();
-        this.linkParentDialogFlag = true;
-      },
-      linkParentFn(obj) {
-        console.log(obj);
-
-        this.form.parentId = obj.id;
-        this.form.parentName = obj.name;
-      },
-      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(e) {
-        if (this.rootId.includes(e)) {
-          console.log('不饿能');
-          return;
-        }
-        this.form.code = await getProjectCodeG(this.ruleCode);
-      },
-      async teamChange(val) {
-        let find = this.teamList.find((e) => e.id == val) || {};
-        this.form.teamName = find.name;
-        this.$emit('teamChange', val);
-      },
-      // 选择负责人部门
-      changeDeptInfo(id) {
-        const info = this.deptList.find((e) => e.id == id) || {};
-        this.form.responsibleDeptName = info.name;
-        this.form.responsibleUserId = '';
-        this.form.responsibleUserName = '';
-        this.getUserList(id);
-      },
-      // 获取人员数据
-      getUserList(groupId) {
-        if (groupId) {
-          this.$refs.directorRef && this.$refs.directorRef.getList({ groupId });
+      getProduceTreeByCode: '',
+      linkParentDialogFlag: false,
+      rootId: [],
+      // 编码规则要传的参数
+      ruleCode: '',
+      cityData,
+      typeOptions: [
+        {
+          value: 1,
+          label: '订单'
+        },
+        {
+          value: 2,
+          label: '客户'
+        },
+        {
+          value: 3,
+          label: '合同'
         }
+      ],
+      form: {
+        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: [],
+        relationType: 1
       },
-      handleContractBtn(e) {
-        if (e.target.nodeName == 'I') {
-          this.clearInfo();
-          return;
+      typeTreeList: [],
+      projectList: [],
+      grouplist: [],
+      customDialogFlag: false,
+      contractDialogFlag: false,
+      rules: {
+        type: {
+          required: true,
+          message: '请选择项目类型',
+          trigger: 'change'
+        },
+        name: { required: true, message: '请输入项目名称', trigger: 'blur' },
+        budget: {
+          required: true,
+          message: '请输入项目预算',
+          trigger: 'blur'
+        },
+        // contactId: {
+        //   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'
+        },
+        code: {
+          required: true,
+          message: '请输入项目编码',
+          trigger: ['blur', 'change']
         }
-        this.contractDialogFlag = true;
-      },
-      handleOrder() {
-        this.$refs.orderListRef.open();
-      },
+      }
+    };
+  },
+  async created() {
+    //  this.projectsPageAPI = projectsPageAPI;
+    this.projectList = await projectsToTreeAPI({
+      processStatus: '2',
+      treeType: '0'
+    });
+    console.log(this.projectList);
+    this.getProduceTreeByCode = getProduceTreeByCode;
+    const res1 = await getProduceTreeByCode('XM1');
+    this.typeTreeList = res1;
+    // 根id为了tree不能选择树节点
+    this.rootId = res1.map((item) => item.id);
+    let res2 = await projectsTeamPageAPI({ pageNum: 1, size: 10 });
+    this.grouplist = res2;
+    this.ruleCode = this.typeTreeList[0].ruleCode;
+  },
 
-      clearInfo() {
-        this.form = Object.assign({}, this.form, {
-          contractName: '',
-          contractId: '',
-          contactId: '',
-          contactName: '',
-          contactRelationPhone: '',
-          contactRelationUserName: '',
-          contactAddressId: '',
-          contactAddress: '',
-          relationId: '',
-          relationId: '',
-          relationName: '',
-          relationCode: ''
-        });
-      },
-      typeChange() {
+  methods: {
+    clearParentId() {
+      this.form.parentId = null;
+      this.form.parentName = null;
+      console.log('qing');
+    },
+    projectsPageAPI,
+    close() {
+      this.linkParentDialogFlag = false;
+    },
+    openLinkParent(...arg) {
+      console.log(arg);
+      let _this = this;
+      _this.$refs.selectRef.blur();
+      this.linkParentDialogFlag = true;
+    },
+    linkParentFn(obj) {
+      console.log(obj);
+
+      this.form.parentId = obj.id;
+      this.form.parentName = obj.name;
+    },
+    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(e) {
+      if (this.rootId.includes(e)) {
+        console.log('不饿能');
+        return;
+      }
+      this.form.code = await getProjectCodeG(this.ruleCode);
+    },
+    async teamChange(val) {
+      let find = this.teamList.find((e) => e.id == val) || {};
+      this.form.teamName = find.name;
+      this.$emit('teamChange', val);
+    },
+    // 选择负责人部门,带出来这个部门的人
+    changeDeptInfo(id) {
+      const info = this.deptList.find((e) => e.id == id) || {};
+      this.form.responsibleDeptName = info.name;
+      this.form.responsibleUserId = '';
+      this.form.responsibleUserName = '';
+      this.getUserList(id);
+    },
+    // 获取人员数据
+    getUserList(groupId) {
+      if (groupId) {
+        this.$refs.directorRef && this.$refs.directorRef.getList({ groupId });
+      }
+    },
+    handleContractBtn(e) {
+      if (e.target.nodeName == 'I') {
         this.clearInfo();
-      },
+        return;
+      }
+      this.contractDialogFlag = true;
+    },
+    handleOrder() {
+      this.$refs.orderListRef.open();
+    },
 
-      //选择合同信息回调
-      getContractInfo(obj) {
-        this.form.contractId = obj.id;
-        this.form.contractName = obj.contractName;
-        this.form.relationId = obj.id;
-        this.form.relationName = obj.contractName;
-        this.form.relationCode = obj.contractNo;
+    clearInfo() {
+      this.form = Object.assign({}, this.form, {
+        contractName: '',
+        contractId: '',
+        contactId: '',
+        contactName: '',
+        contactRelationPhone: '',
+        contactRelationUserName: '',
+        contactAddressId: '',
+        contactAddress: '',
+        relationId: '',
+        relationId: '',
+        relationName: '',
+        relationCode: ''
+      });
+    },
+    typeChange() {
+      this.clearInfo();
+    },
 
-        if (obj.type == 1) {
-          this.form.contactId = obj.partaId;
-          this.form.contactName = obj.partaName;
-          this.getCusInfo({ id: obj.partaId });
-        } else {
-          this.form.contactId = obj.partbId;
-          this.form.contactName = obj.partbName;
-          this.getCusInfo({ id: obj.partbId });
-        }
-      },
-      //选择订单信息回调
-      getOrderDialog(obj) {
-        this.form.relationId = obj.id;
-        this.form.relationCode = obj.orderNo;
+    //选择合同信息回调
+    getContractInfo(obj) {
+      this.form.contractId = obj.id;
+      this.form.contractName = obj.contractName;
+      this.form.relationId = obj.id;
+      this.form.relationName = obj.contractName;
+      this.form.relationCode = obj.contractNo;
+
+      if (obj.type == 1) {
+        this.form.contactId = obj.partaId;
+        this.form.contactName = obj.partaName;
         this.getCusInfo({ id: obj.partaId });
-      },
-      //获取客户信息
-      handleGetCus() {
-        this.customDialogFlag = true;
-        let item = { id: this.form.contactId };
-        this.$nextTick(() => {
-          this.$refs.customRef.open(item);
-        });
-      },
-      //选择客户信息回调
-      async getCusInfo(obj) {
-        const { base, other } = await contactDetail(obj.id);
-        this.form = Object.assign({}, this.form, {
-          contactId: base.id,
-          contactName: base.name,
-          contactRelationPhone: obj.linkPhone || obj.phone,
-          contactRelationUserName: obj.linkName
-        });
-        if (other.addressId) {
-          this.form.contactAddressId =
-            other.addressId && other.addressId.split(',');
-          this.form.contactAddressName = other.addressName;
-          this.form.contactAddress = other.address;
-        } else if (base.addressId) {
-          this.form.contactAddressId =
-            base.addressId && base.addressId.split(',');
-          this.form.contactAddressName = base.addressName;
-          this.form.contactAddress = base.address;
-        }
-      },
-      downloadFile(file) {
-        getFile({ objectName: file.storePath }, file.type);
-      },
-      personChange(val, info) {
-        this.form.responsibleUserName = info.name;
-      },
-      validForm() {
-        return new Promise((resolve, reject) => {
-          this.$refs.form.validate((valid) => {
-            if (!valid) {
-              this.$message.warning('有必填项未填,请检查');
-              reject('有必填项未填,请检查');
-            } else {
-              // 基本信息处理
-              if (this.$refs.sendAddress.getCheckedNodes()) {
-                let node = this.$refs.sendAddress.getCheckedNodes()[0];
-                if (node) {
-                  this.form.contactAddressId = node.path.join();
-                  this.form.contactAddressName = node.pathLabels.join();
-                } else {
-                  this.form.contactAddressId = '';
-                  this.form.contactAddressName = '';
-                }
+      } else {
+        this.form.contactId = obj.partbId;
+        this.form.contactName = obj.partbName;
+        this.getCusInfo({ id: obj.partbId });
+      }
+    },
+    //选择订单信息回调
+    getOrderDialog(obj) {
+      this.form.relationId = obj.id;
+      this.form.relationCode = obj.orderNo;
+      this.getCusInfo({ id: obj.partaId });
+    },
+    //获取客户信息
+    handleGetCus() {
+      this.customDialogFlag = true;
+      let item = { id: this.form.contactId };
+      this.$nextTick(() => {
+        this.$refs.customRef.open(item);
+      });
+    },
+    //选择客户信息回调
+    async getCusInfo(obj) {
+      const { base, other } = await contactDetail(obj.id);
+      this.form = Object.assign({}, this.form, {
+        contactId: base.id,
+        contactName: base.name,
+        contactRelationPhone: obj.linkPhone || obj.phone,
+        contactRelationUserName: obj.linkName
+      });
+      if (other.addressId) {
+        this.form.contactAddressId =
+          other.addressId && other.addressId.split(',');
+        this.form.contactAddressName = other.addressName;
+        this.form.contactAddress = other.address;
+      } else if (base.addressId) {
+        this.form.contactAddressId =
+          base.addressId && base.addressId.split(',');
+        this.form.contactAddressName = base.addressName;
+        this.form.contactAddress = base.address;
+      }
+    },
+    downloadFile(file) {
+      getFile({ objectName: file.storePath }, file.type);
+    },
+    personChange(val, info) {
+      this.form.responsibleUserName = info.name;
+    },
+    validForm() {
+      return new Promise((resolve, reject) => {
+        this.$refs.form.validate((valid) => {
+          if (!valid) {
+            this.$message.warning('有必填项未填,请检查');
+            reject('有必填项未填,请检查');
+          } else {
+            // 基本信息处理
+            if (this.$refs.sendAddress.getCheckedNodes()) {
+              let node = this.$refs.sendAddress.getCheckedNodes()[0];
+              if (node) {
+                this.form.contactAddressId = node.path.join();
+                this.form.contactAddressName = node.pathLabels.join();
+              } else {
+                this.form.contactAddressId = '';
+                this.form.contactAddressName = '';
               }
-              resolve(this.form);
             }
-          });
+            resolve(this.form);
+          }
         });
-      }
+      });
     }
-  };
+  }
+};
 </script>
 
 <style scoped lang="scss"></style>

+ 229 - 144
src/views/project-manage/project-initiation/components/projectInfoTable.vue

@@ -2,14 +2,24 @@
   <div>
     <el-form ref="form" :model="form">
       <el-button
-        v-if="dialogType!=='view'"
+        v-if="dialogType !== 'view'"
         type="primary"
         icon="el-icon-plus"
         class="ele-btn-icon"
         style="margin-bottom: 5px"
-        @click="handleAddInfo">
+        @click="handleAddInfo"
+      >
         新增项目阶段
       </el-button>
+      <!-- <el-button
+        v-if="dialogType !== 'view'"
+        type="primary"
+        class="ele-btn-icon"
+        style="margin-bottom: 5px"
+        @click="save"
+      >
+        保存
+      </el-button> -->
       <!-- 数据表格 -->
       <ele-pro-table
         ref="table"
@@ -22,152 +32,214 @@
         tool-class="ele-toolbar-form"
         cache-key="eomContactPageTable"
       >
-        <template v-slot:action="{row,$index}">
+        <template v-slot:action="{ row, $index }">
           <el-popconfirm
             class="ele-action"
             title="确定要删除此信息吗?"
             @confirm="handleDelInfo($index)"
           >
             <template v-slot:reference>
-              <el-link
-                type="danger"
-                :underline="false"
-                icon="el-icon-delete"
-              >
+              <el-link type="danger" :underline="false" icon="el-icon-delete">
                 删除
               </el-link>
             </template>
           </el-popconfirm>
         </template>
-        <template v-slot:name="{row,$index}" v-if="dialogType!=='view'">
-          <el-form-item :prop="'datasource.'+$index+'.name'"
-                        :rules="{required:true,message:'请选择',trigger:['blur','change']}">
+        <template v-slot:name="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item
+            :prop="'datasource.' + $index + '.name'"
+            :rules="{
+              required: true,
+              message: '请选择',
+              trigger: ['blur', 'change']
+            }"
+          >
             <el-input v-model="row.name" clearable></el-input>
           </el-form-item>
         </template>
-        <template v-slot:content="{row,$index}" v-if="dialogType!=='view'">
-          <el-form-item :prop="'datasource.'+$index+'.content'">
+        <template v-slot:content="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'datasource.' + $index + '.content'">
             <el-input v-model="row.content" clearable></el-input>
           </el-form-item>
         </template>
-        <template v-slot:planStartDate="{row,$index}" v-if="dialogType!=='view'">
-          <el-form-item :prop="'datasource.'+$index+'.planStartDate'"
-                        :rules="{required:true,message:'请选择',trigger:['blur','change']}">
+        <template
+          v-slot:planStartDate="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item
+            :prop="'datasource.' + $index + '.planStartDate'"
+            :rules="{
+              required: true,
+              message: '请选择',
+              trigger: ['blur', 'change']
+            }"
+          >
             <el-date-picker
               style="width: 100%"
-              :disabled="dialogType=='view'"
+              :disabled="dialogType == 'view'"
               v-model="row.planStartDate"
-              :picker-options="{disabledDate:(time)=>{return row.planEndDate&&time.getTime()>new Date(row.planEndDate)}}"
+              :picker-options="{
+                disabledDate: (time) => {
+                  return (
+                    row.planEndDate &&
+                    time.getTime() > new Date(row.planEndDate)
+                  );
+                }
+              }"
               type="date"
-              placeholder="选择日期">
+              placeholder="选择日期"
+            >
             </el-date-picker>
           </el-form-item>
         </template>
-        <template v-slot:planEndDate="{row,$index}" v-if="dialogType!=='view'">
-          <el-form-item :prop="'datasource.'+$index+'.planEndDate'"
-                        :rules="{required:true,message:'请选择',trigger:['blur','change']}">
+        <template
+          v-slot:planEndDate="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item
+            :prop="'datasource.' + $index + '.planEndDate'"
+            :rules="{
+              required: true,
+              message: '请选择',
+              trigger: ['blur', 'change']
+            }"
+          >
             <el-date-picker
               style="width: 100%"
-              :disabled="dialogType=='view'"
-              :picker-options="{disabledDate:(time)=>{return row.planStartDate&&time.getTime()<new Date(row.planStartDate)}}"
+              :disabled="dialogType == 'view'"
+              :picker-options="{
+                disabledDate: (time) => {
+                  return (
+                    row.planStartDate &&
+                    time.getTime() < new Date(row.planStartDate)
+                  );
+                }
+              }"
               v-model="row.planEndDate"
               type="date"
-              placeholder="选择日期">
+              placeholder="选择日期"
+            >
             </el-date-picker>
           </el-form-item>
         </template>
-        <template v-slot:responsibleUserIds="{row,$index}" v-if="dialogType!=='view'">
-          <el-form-item :prop="'datasource.'+$index+'.responsibleUserIds'">
-            <el-select v-model="row.responsibleUserIds" multiple collapse-tags
-                       filterable placeholder="请选择" style="width: 100%;"
-                       clearable
-                       size="medium"
-                       :disabled="dialogType=='view'" @change="(val)=>personChange(val,$index)">
+        <template
+          v-slot:responsibleUserIds="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item :prop="'datasource.' + $index + '.responsibleUserIds'">
+            <el-select
+              v-model="row.responsibleUserIds"
+              multiple
+              collapse-tags
+              filterable
+              placeholder="请选择"
+              style="width: 100%"
+              clearable
+              size="medium"
+              :disabled="dialogType == 'view'"
+              @change="(val) => personChange(val, $index)"
+            >
               <el-option
                 v-for="item in userList"
                 :key="item.id"
                 :label="item.name"
-                :value="item.id">
+                :value="item.id"
+              >
               </el-option>
             </el-select>
-        
           </el-form-item>
         </template>
-        <template v-slot:responsibleDeptId="{row,$index}" v-if="dialogType!=='view'">
-          <el-form-item :prop="'datasource.'+$index+'.responsibleDeptId'">
+        <template
+          v-slot:responsibleDeptId="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item :prop="'datasource.' + $index + '.responsibleDeptId'">
             <ele-tree-select
-              :disabled="dialogType=='view'"
+              :disabled="dialogType == 'view'"
               clearable
               :data="deptTreeList"
-              :ref="'deptTreeRef'+$index"
+              :ref="'deptTreeRef' + $index"
               v-model="row.responsibleDeptId"
               valueKey="id"
               labelKey="name"
               placeholder="请选择"
-              @change="(id)=>changeDeptInfo(id,$index)"
+              @change="(id) => changeDeptInfo(id, $index)"
               default-expand-all
             />
           </el-form-item>
         </template>
-        <template v-slot:isMilepost="{row,$index}" v-if="dialogType!=='view'">
+        <template
+          v-slot:isMilepost="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
           <el-form-item>
             <el-select v-model="row.isMilepost">
-              <el-option label="否" :value="0"/>
-              <el-option label="是" :value="1"/>
+              <el-option label="否" :value="0" />
+              <el-option label="是" :value="1" />
             </el-select>
           </el-form-item>
         </template>
-        <template v-slot:milepost="{row,$index}" v-if="dialogType!=='view'">
+        <template
+          v-slot:milepost="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
           <el-form-item>
             <el-input v-model="row.milepost" clearable></el-input>
           </el-form-item>
         </template>
         <template v-slot:isOverTime="{ row }">
-          <el-tag v-if="row.isOverTime==0" type="success">正常</el-tag>
+          <el-tag v-if="row.isOverTime == 0" type="success">正常</el-tag>
           <el-tag v-else type="danger">超时</el-tag>
         </template>
         <template v-slot:proportion="{ row }">
-          <el-input type="number" :min="0" :max="100" v-model="row.proportion" :disabled="dialogType=='view'">
+          <el-input
+            type="number"
+            :min="0"
+            :max="100"
+            v-model="row.proportion"
+            :disabled="dialogType == 'view'"
+          >
           </el-input>
         </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>
+          <el-progress
+            :stroke-width="20"
+            text-color="#606266"
+            :text-inside="true"
+            :percentage="row.speedPercent || 0"
+            :color="customColorMethod"
+          ></el-progress>
         </template>
-        <template v-slot:remark="{row,$index}" v-if="dialogType!=='view'">
+        <template v-slot:remark="{ row, $index }" v-if="dialogType !== 'view'">
           <el-form-item>
             <el-input type="textarea" v-model="row.remark" clearable></el-input>
           </el-form-item>
         </template>
-        <template v-slot:headerRequired="{column}">
+        <template v-slot:headerRequired="{ column }">
           <span class="is-required">{{ column.label }}</span>
         </template>
       </ele-pro-table>
     </el-form>
-
-
   </div>
 </template>
 
 
 <script>
-
-
-import {mapGetters} from 'vuex'
-import {getByCode} from "@/api/system/dictionary-data";
-import fileUpload from "@/components/upload/fileUpload.vue";
-import {getFile} from "@/api/system/file";
-import PersonSelect from "@/components/CommomSelect/person-select.vue";
-import {proStatusEnum} from "@/enum/dict";
-import {listOrganizations} from "@/api/system/organization";
-import {deepClone} from "@/utils";
+import { mapGetters } from 'vuex';
+import { getByCode } from '@/api/system/dictionary-data';
+import fileUpload from '@/components/upload/fileUpload.vue';
+import { getFile } from '@/api/system/file';
+import PersonSelect from '@/components/CommomSelect/person-select.vue';
+import { proStatusEnum } from '@/enum/dict';
+import { listOrganizations } from '@/api/system/organization';
+import { deepClone } from '@/utils';
+import { projectsstage } from '@/api/project-manage';
 
 export default {
-  name: "stageInfoTable",
+  name: 'stageInfoTable',
   components: {
     PersonSelect,
-    fileUpload,
-
+    fileUpload
   },
   props: {
     dialogForm: {
@@ -175,7 +247,7 @@ export default {
       default: () => {
         return {
           ...this.form
-        }
+        };
       }
     },
     dialogType: {
@@ -185,45 +257,52 @@ export default {
     deptList: {
       type: Array,
       default: () => {
-        return []
+        return [];
       }
     },
     userList: {
       type: Array,
       default: () => {
-        return []
+        return [];
       }
     },
     deptTreeList: {
       type: Array,
       default: () => {
-        return []
+        return [];
       }
-    },
+    }
   },
   watch: {
     dialogForm: {
       handler(val) {
         this.form.datasource = this.dialogForm.stageList || [];
         this.$nextTick(async () => {
-          if (this.dialogType === 'view') return
+          if (this.dialogType === 'view') return;
           this.form.datasource.forEach((item, index) => {
-
             // this.getUserList(item.responsibleDeptId, index);
-          })
-        })
+          });
+        });
       },
-      deep: true,
+      deep: true
     },
+    deptList: {
+      handler(newValue, oldValue) {
+        console.log('bianhua');
+
+        console.log(newValue, oldValue);
+      },
+      deep: true
+    }
   },
   data() {
     return {
-      editIndex: undefined,//当前修改数据的下标
+      editIndex: undefined, //当前修改数据的下标
       form: {
         datasource: []
       },
-
-    }
+      responceUserList: []
+    };
   },
   computed: {
     columns() {
@@ -244,7 +323,7 @@ export default {
           showOverflowTooltip: true,
           minWidth: 120,
           slot: 'name',
-          headerSlot: 'headerRequired',
+          headerSlot: 'headerRequired'
         },
         // {
         //   prop: 'responsibleDeptName',
@@ -262,7 +341,7 @@ export default {
           showOverflowTooltip: true,
           minWidth: 200,
           slot: 'responsibleUserIds',
-          headerSlot: 'headerRequired',
+          headerSlot: 'headerRequired'
         },
         {
           prop: 'planStartDate',
@@ -271,7 +350,7 @@ export default {
           showOverflowTooltip: true,
           minWidth: 170,
           slot: 'planStartDate',
-          headerSlot: 'headerRequired',
+          headerSlot: 'headerRequired'
         },
         {
           prop: 'planEndDate',
@@ -280,21 +359,21 @@ export default {
           showOverflowTooltip: true,
           minWidth: 170,
           slot: 'planEndDate',
-          headerSlot: 'headerRequired',
+          headerSlot: 'headerRequired'
         },
         {
           prop: 'realStartTime',
           label: '实际开始时间',
           align: 'center',
           showOverflowTooltip: true,
-          minWidth: 170,
+          minWidth: 170
         },
         {
           prop: 'realEndTime',
           label: '实际结束时间',
           align: 'center',
           showOverflowTooltip: true,
-          minWidth: 170,
+          minWidth: 170
         },
         {
           prop: 'remark',
@@ -302,7 +381,7 @@ export default {
           align: 'center',
           showOverflowTooltip: true,
           minWidth: 160,
-          slot: 'remark',
+          slot: 'remark'
         },
         {
           prop: 'isOverTime',
@@ -335,31 +414,34 @@ export default {
           showOverflowTooltip: true,
           minWidth: 130,
           formatter: (_row, _column, cellValue) => {
-            return proStatusEnum[_row.status].label;
+            return proStatusEnum[cellValue].label;
           }
-        },
-
-      ]
-      let action = [{
-        columnKey: 'action',
-        slot: 'action',
-        label: '操作',
-        resizable: false,
-        width: 80,
-        align: 'center',
-        showOverflowTooltip: true,
-        fixed: 'right'
-      },]
-      this.dialogType === 'view' ? list = [...list] : list = [...list, ...action]
-      return list
-    },
+        }
+      ];
+      let action = [
+        {
+          columnKey: 'action',
+          slot: 'action',
+          label: '操作',
+          resizable: false,
+          width: 80,
+          align: 'center',
+          showOverflowTooltip: true,
+          fixed: 'right'
+        }
+      ];
+      this.dialogType === 'view'
+        ? (list = [...list])
+        : (list = [...list, ...action]);
+      return list;
+    }
   },
   methods: {
-
     // 选择负责人部门
     changeDeptInfo(id, index) {
-      const info = this.deptList.find((e) => e.id == id) || {};
+      console.log(id, index);
 
+      const info = this.deptList.find((e) => e.id == id) || {};
       this.$set(this.form.datasource[index], 'responsibleDeptName', info.name);
       this.$set(this.form.datasource[index], 'responsibleUserIds', []);
       this.$set(this.form.datasource[index], 'responsibleUserName', '');
@@ -379,50 +461,48 @@ export default {
       // this.$set(this.form.datasource[index], 'responsibleUserName', info.name);
     },
     downloadFile(file) {
-      getFile({objectName: file.storePath}, file.name);
+      getFile({ objectName: file.storePath }, file.name);
     },
     //新增计划数据
     handleAddInfo() {
-      this.form.datasource.push(
-        {
-          milepost: '',
-          isMilepost: 0,
-          responsibleUserList: [],
-          responsibleUserIds: [],
-          responsibleDeptId: '',
-          responsibleDeptName: '',
-          planStartDate: '',
-          planEndDate: '',
-          name: '',
-          content: '',
-          status: 0,
-          isOverTime: 0,
-          speedPercent: 0,
-          remark: '',
-        }
-      )
+      this.form.datasource.push({
+        milepost: '',
+        isMilepost: 0,
+        responsibleUserList: [],
+        responsibleUserIds: [],
+        responsibleDeptId: '',
+        responsibleDeptName: '',
+        planStartDate: '',
+        planEndDate: '',
+        name: '',
+        content: '',
+        status: 0,
+        isOverTime: 0,
+        speedPercent: 0,
+        remark: ''
+      });
     },
     //
     clearData() {
       this.form.datasource.forEach((item, index) => {
-        this.$set(this.form.datasource[index], 'milepost', '')
-        this.$set(this.form.datasource[index], 'isMilepost', 0)
-        this.$set(this.form.datasource[index], 'isOverTime', 0)
-        this.$set(this.form.datasource[index], 'speedPercent', 0)
-        this.$set(this.form.datasource[index], 'responsibleUserIds', '')
-        this.$set(this.form.datasource[index], 'responsibleUserName', '')
-        this.$set(this.form.datasource[index], 'responsibleDeptId', '')
-        this.$set(this.form.datasource[index], 'responsibleDeptName', '')
-        this.$set(this.form.datasource[index], 'planStartDate', '')
-        this.$set(this.form.datasource[index], 'planEndDate', '')
-        this.$set(this.form.datasource[index], 'name', '')
-        this.$set(this.form.datasource[index], 'content', '')
-      })
+        this.$set(this.form.datasource[index], 'milepost', '');
+        this.$set(this.form.datasource[index], 'isMilepost', 0);
+        this.$set(this.form.datasource[index], 'isOverTime', 0);
+        this.$set(this.form.datasource[index], 'speedPercent', 0);
+        this.$set(this.form.datasource[index], 'responsibleUserIds', '');
+        this.$set(this.form.datasource[index], 'responsibleUserName', '');
+        this.$set(this.form.datasource[index], 'responsibleDeptId', '');
+        this.$set(this.form.datasource[index], 'responsibleDeptName', '');
+        this.$set(this.form.datasource[index], 'planStartDate', '');
+        this.$set(this.form.datasource[index], 'planEndDate', '');
+        this.$set(this.form.datasource[index], 'name', '');
+        this.$set(this.form.datasource[index], 'content', '');
+      });
     },
 
     //删除关联信息数据
     handleDelInfo(index) {
-      this.form.datasource.splice(index, 1)
+      this.form.datasource.splice(index, 1);
     },
     customColorMethod(percentage) {
       if (percentage < 30) {
@@ -433,21 +513,26 @@ export default {
         return '#67c23a';
       }
     },
+    async save() {
+      console.log(this.form.datasource);
+
+      // const res = await projectsstage(this.form.datasource);
+    },
     getTableValidate() {
       return new Promise((resolve, reject) => {
-       // if (this.form.datasource.length == 0) return this.$message.warning('')
+        // if (this.form.datasource.length == 0) return this.$message.warning('')
         this.$refs.form.validate((valid) => {
           if (!valid) {
-            this.$message.warning('有必填项未填,请检查')
-            reject('有必填项未填,请检查')
+            this.$message.warning('有必填项未填,请检查');
+            reject('有必填项未填,请检查');
           } else {
-            resolve(this.form.datasource)
+            resolve(this.form.datasource);
           }
-        })
-      })
-    },
+        });
+      });
+    }
   }
-}
+};
 </script>
 
 

+ 83 - 62
src/views/project-manage/task-manage/components/addOrEditDialog.vue

@@ -7,46 +7,62 @@
     append-to-body
     :close-on-click-modal="false"
     width="70%"
-    :before-close="cancel">
+    :before-close="cancel"
+  >
     <headerTitle title="关联信息"></headerTitle>
-    <task-form ref="taskForm" :dialog-type.sync="dialogType" :dialogForm="dialogForm" :deptList="deptList"
-               :deptTreeList="deptTreeList" :userList="userList" @changeProject="changeProject"></task-form>
+    <task-form
+      ref="taskForm"
+      :dialog-type.sync="dialogType"
+      :dialogForm="dialogForm"
+      :deptList="deptList"
+      :deptTreeList="deptTreeList"
+      :userList="userList"
+      @changeProject="changeProject"
+    ></task-form>
     <headerTitle title="任务信息"></headerTitle>
-    <base-form ref="baseForm" :dialog-type.sync="dialogType" :dialogForm="dialogForm" :deptList="deptList"
-               :deptTreeList="deptTreeList" :userList="userList" @changeProject="changeProject"></base-form>
+    <base-form
+      ref="baseForm"
+      :dialog-type.sync="dialogType"
+      :dialogForm="dialogForm"
+      :deptList="deptList"
+      :deptTreeList="deptTreeList"
+      :userList="userList"
+      @changeProject="changeProject"
+    ></base-form>
     <headerTitle title="交付物信息"></headerTitle>
-    <deliverables-info-table ref="deliverablesInfoTable" :dialog-type.sync="dialogType"
-                             :dialogForm="dialogForm"></deliverables-info-table>
+    <deliverables-info-table
+      ref="deliverablesInfoTable"
+      :dialog-type.sync="dialogType"
+      :dialogForm="dialogForm"
+    ></deliverables-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 taskForm from "./task-form.vue";
+import taskForm from './task-form.vue';
 import {
   getTaskCodeAPI,
   projectsTaskGetByIdAPI,
   projectsTaskSaveAPI,
   projectsTaskUpdateAPI,
   submit
-} from "@/api/project-manage/task";
-import deliverablesInfoTable from "./deliverablesInfoTable.vue";
-import {getUserPage, listOrganizations} from "@/api/system/organization";
-import planForm from "@/views/project-manage/planManage/components/plan-form.vue";
-import {projectsGetByIdAPI} from "@/api/project-manage";
-import {projectsTeamGetByIdAPI} from "@/api/project-manage/team";
-import {deepClone} from "@/utils";
-import BaseForm from "@/views/project-manage/task-manage/components/base-form.vue";
+} from '@/api/project-manage/task';
+import deliverablesInfoTable from './deliverablesInfoTable.vue';
+import { getUserPage, listOrganizations } from '@/api/system/organization';
+import planForm from '@/views/project-manage/planManage/components/plan-form.vue';
+import { projectsGetByIdAPI } from '@/api/project-manage';
+import { projectsTeamGetByIdAPI } from '@/api/project-manage/team';
+import { deepClone } from '@/utils';
+import BaseForm from '@/views/project-manage/task-manage/components/base-form.vue';
 
 export default {
-  name: "addOrEditDialog",
+  name: 'addOrEditDialog',
   components: {
     BaseForm,
     planForm,
@@ -56,7 +72,7 @@ export default {
   props: {
     addOrEditDialogFlag: {
       type: Boolean,
-      default: false,
+      default: false
     }
   },
   data() {
@@ -67,19 +83,23 @@ export default {
       userList: [],
       deptList: [],
       deptTreeList: [],
-      allUserList: [],
-    }
+      allUserList: []
+    };
   },
- async created() {
+  async created() {
     this.getDeptList();
-    let {list} = await getUserPage({ pageNum: 1, size: -1 });
-    this.allUserList =  list
+    let { list } = await getUserPage({ pageNum: 1, size: -1 });
+    this.allUserList = list;
   },
   methods: {
     async init(row = {}, type) {
       this.title = type === 'add' ? '新增' : '编辑';
       this.dialogType = type;
       console.log(this.dialogType);
+      console.log(this.$router.history, this.$router.history.previous);
+
+      if(this.$router.history.current.path==='/planManage'){}
+
       if (type === 'add') {
         //从其他地方跳转新增任务
         this.dialogForm = {
@@ -90,33 +110,34 @@ export default {
           planStageId: row.planStageId,
           taskId: row.taskId,
           code: await getTaskCodeAPI()
-        }
+        };
         if (this.dialogForm.planStageId) {
-          this.setTaskInfo(3, this.dialogForm.planStageId, '计划节点')
+          this.setTaskInfo(3, this.dialogForm.planStageId, '计划节点');
         } else if (this.dialogForm.targetPlanId) {
-          this.setTaskInfo(2, this.dialogForm.targetPlanId, '计划')
+          this.setTaskInfo(2, this.dialogForm.targetPlanId, '计划');
         } else if (this.dialogForm.projectStageId) {
-          this.setTaskInfo(1, this.dialogForm.projectStageId, '项目阶段')
-        }else if (this.dialogForm.projectBomId) {
-          this.setTaskInfo(5, this.dialogForm.projectBomId, '项目Bom')
+          this.setTaskInfo(1, this.dialogForm.projectStageId, '项目阶段');
+        } else if (this.dialogForm.projectBomId) {
+          this.setTaskInfo(5, this.dialogForm.projectBomId, '项目Bom');
         } else if (this.dialogForm.projectId) {
-          this.setTaskInfo(0, this.dialogForm.projectId, '项目')
+          this.setTaskInfo(0, this.dialogForm.projectId, '项目');
         }
       } else {
-        this.dialogForm = await projectsTaskGetByIdAPI(row.id)
-        this.dialogForm.type = this.dialogForm.type + ''
-        this.dialogForm.responsibleUserIds = this.dialogForm.responsibleUserList.map(i => i.userId) || []
+        this.dialogForm = await projectsTaskGetByIdAPI(row.id);
+        this.dialogForm.type = this.dialogForm.type + '';
+        this.dialogForm.responsibleUserIds =
+          this.dialogForm.responsibleUserList.map((i) => i.userId) || [];
       }
       //从计划直接新增任务,则获取项目团队
       if (row.projectId) await this.changeProject(row.projectId);
     },
     async changeProject(id) {
       if (!id) {
-        this.userList = []
-        return
+        this.userList = [];
+        return;
       }
-      let projectInfo = await projectsGetByIdAPI(id)
-      this.getUserList(projectInfo.teamId)
+      let projectInfo = await projectsGetByIdAPI(id);
+      this.getUserList(projectInfo.teamId);
     },
     //设置任务类型
     setTaskInfo(type, id, name) {
@@ -128,13 +149,11 @@ export default {
     // 获取项目团队下团队人员集合
     getUserList(val) {
       if (!val) {
-        this.userList = []
-        return
+        this.userList = [];
+        return;
       }
-      projectsTeamGetByIdAPI(
-        val
-      ).then((list) => {
-        this.userList = deepClone(list.teamUserList)
+      projectsTeamGetByIdAPI(val).then((list) => {
+        this.userList = deepClone(list.teamUserList);
       });
     },
     // 获取部门数据
@@ -151,27 +170,30 @@ export default {
     async submit(type = '') {
       let taskForm = await this.$refs.taskForm.validForm();
       let baseForm = await this.$refs.baseForm.validForm();
-      let form = { ...this.dialogForm, ...baseForm,...taskForm,}
-      form.taskFilesList = await this.$refs.deliverablesInfoTable.getTableValidate();
-      form.responsibleUserList = this.getResponsibleUserList(form.responsibleUserIds)
-      const API = this.dialogType === 'add' ? projectsTaskSaveAPI : projectsTaskUpdateAPI;
-      const id = await API(form)
+      let form = { ...this.dialogForm, ...baseForm, ...taskForm };
+      form.taskFilesList =
+        await this.$refs.deliverablesInfoTable.getTableValidate();
+      form.responsibleUserList = this.getResponsibleUserList(
+        form.responsibleUserIds
+      );
+      const API =
+        this.dialogType === 'add' ? projectsTaskSaveAPI : projectsTaskUpdateAPI;
+      const id = await API(form);
       this.$message.success('操作成功');
       if (type === 'sub') {
         this.processSubmit(id);
-        return
+        return;
       }
-      this.cancel()
+      this.cancel();
       this.$emit('reload');
     },
     getResponsibleUserList(list = []) {
-      return list.map(
-        i => {
-          return {
-            userId: i,
-            userName: this.allUserList.find(u => u.id === i).name
-          }
-        });
+      return list.map((i) => {
+        return {
+          userId: i,
+          userName: this.allUserList.find((u) => u.id === i).name
+        };
+      });
     },
     //流程提交
     processSubmit(id = '') {
@@ -185,12 +207,11 @@ export default {
     },
     cancel() {
       this.$emit('update:addOrEditDialogFlag', false);
-    },
+    }
   }
-}
+};
 </script>
 
 
 <style scoped lang="scss">
-
 </style>

+ 173 - 93
src/views/project-manage/task-manage/components/base-form.vue

@@ -1,63 +1,86 @@
 <template>
   <div>
-    <el-form ref="form" :model="form" :rules="rules" class="el-form-box" label-width="120px">
+    <el-form
+      ref="form"
+      :model="form"
+      :rules="rules"
+      class="el-form-box"
+      label-width="120px"
+    >
       <el-row>
         <el-col :span="8">
-          <el-form-item
-            prop="type"
-            label="任务类型">
-            <dict-selection dict-name="项目任务类型" v-model="form.type"
-                            :disabled="dialogType=='view'"></dict-selection>
+          <el-form-item prop="type" label="任务类型">
+            <dict-selection
+              dict-name="项目任务类型"
+              v-model="form.type"
+              :disabled="dialogType == 'view'"
+            ></dict-selection>
           </el-form-item>
-
         </el-col>
         <el-col :span="8">
-          <el-form-item
-            prop="code"
-            label="任务编码">
-            <el-input disabled v-model="form.code" :disabled="dialogType=='view'"></el-input>
+          <el-form-item prop="code" label="任务编码">
+            <el-input
+              v-model="form.code"
+              :disabled="dialogType == 'view'"
+            ></el-input>
           </el-form-item>
         </el-col>
         <el-col :span="8">
-          <el-form-item
-            prop="name"
-            label="任务名称">
-            <el-input v-model="form.name" :disabled="dialogType=='view'"></el-input>
+          <el-form-item prop="name" label="任务名称">
+            <el-input
+              v-model="form.name"
+              :disabled="dialogType == 'view'"
+            ></el-input>
           </el-form-item>
         </el-col>
       </el-row>
       <el-row>
         <el-col :span="8">
-          <el-form-item label="任务周期">
-            <el-input v-model="form.budget" :disabled="dialogType=='view'">
+          <!-- 目前没有字段,所以v--model用的计算 -->
+          <el-form-item label="任务周期" prop="budget">
+            <el-input v-model="getCrcle" :disabled="dialogType == 'view'">
             </el-input>
           </el-form-item>
         </el-col>
         <el-col :span="8">
-          <el-form-item
-            prop="planStartDate"
-            label="开始日期">
+          <el-form-item prop="planStartDate" label="开始日期">
             <el-date-picker
+              @change="(val) => setCycleValue(val, 'planEndDate')"
               style="width: 100%"
-              :disabled="dialogType=='view'"
+              :disabled="dialogType == 'view'"
               v-model="form.planStartDate"
-              :picker-options="{disabledDate:(time)=>{return form.planEndDate&&time.getTime()>new Date(form.planEndDate)}}"
+              :picker-options="{
+                disabledDate: (time) => {
+                  return (
+                    form.planEndDate &&
+                    time.getTime() > new Date(form.planEndDate)
+                  );
+                }
+              }"
               type="date"
-              placeholder="选择日期">
+              placeholder="选择日期"
+            >
             </el-date-picker>
           </el-form-item>
         </el-col>
         <el-col :span="8">
-          <el-form-item
-            prop="planEndDate"
-            label="完成日期">
+          <el-form-item 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)}}"
+              :disabled="dialogType == 'view'"
+              :picker-options="{
+                disabledDate: (time) => {
+                  return (
+                    form.planStartDate &&
+                    time.getTime() < new Date(form.planStartDate)
+                  );
+                }
+              }"
               v-model="form.planEndDate"
               type="date"
-              placeholder="选择日期">
+              placeholder="选择日期"
+            >
             </el-date-picker>
           </el-form-item>
         </el-col>
@@ -79,28 +102,32 @@
         <!--          </el-form-item>-->
         <!--        </el-col>-->
         <el-col :span="8">
-          <el-form-item
-            prop="responsibleUserIds"
-            label="执行人">
-            <el-select v-if="userList.length" v-model="form.responsibleUserIds" multiple
-                       :collapse-tags="dialogType!='view'"
-                       filterable
-                       placeholder="请选择" style="width: 100%;"
-                       clearable
-                       size="medium"
-                       :disabled="dialogType=='view'">
+          <el-form-item prop="responsibleUserIds" label="执行人">
+            <el-select
+              v-if="userList.length"
+              v-model="form.responsibleUserIds"
+              multiple
+              :collapse-tags="dialogType != 'view'"
+              filterable
+              placeholder="请选择"
+              style="width: 100%"
+              clearable
+              size="medium"
+              :disabled="dialogType == 'view'"
+            >
               <el-option
                 v-for="item in userList"
                 :key="item.id"
                 :label="item.name"
-                :value="item.id">
+                :value="item.id"
+              >
               </el-option>
             </el-select>
             <personSelect
               v-else
               multiple
-              :collapse-tags="dialogType!='view'"
-              :disabled="dialogType=='view'"
+              :collapse-tags="dialogType != 'view'"
+              :disabled="dialogType == 'view'"
               ref="directorRef"
               v-model="form.responsibleUserIds"
             />
@@ -108,42 +135,52 @@
         </el-col>
         <el-col :span="8">
           <el-form-item label="权重占比" prop="proportion">
-            <el-input type="number" :min="0" :max="100" v-model="form.proportion" :disabled="dialogType=='view'">
-              <template slot="append">
-                %
-              </template>
+            <el-input
+              type="number"
+              :min="0"
+              :max="100"
+              v-model="form.proportion"
+              :disabled="dialogType == 'view'"
+            >
+              <template slot="append"> % </template>
             </el-input>
           </el-form-item>
         </el-col>
         <el-col :span="8">
           <el-form-item label="费用" prop="cost">
-            <el-input type="number" :min="0" v-model="form.cost" :disabled="dialogType=='view'">
-              <template slot="append">
-                元
-              </template>
+            <el-input
+              type="number"
+              :min="0"
+              v-model="form.cost"
+              :disabled="dialogType == 'view'"
+            >
+              <template slot="append"> 元 </template>
             </el-input>
           </el-form-item>
         </el-col>
-
       </el-row>
       <el-row>
-
         <el-col :span="8">
-          <el-form-item
-            prop="cycle"
-            label="里程碑">
-            <el-radio-group v-model="form.milepost" :disabled="dialogType=='view'">
+          <el-form-item prop="milepost" label="里程碑">
+            <el-radio-group
+              v-model="form.milepost"
+              :disabled="dialogType == 'view'"
+            >
               <el-radio label="1">是</el-radio>
               <el-radio label="0">否</el-radio>
             </el-radio-group>
           </el-form-item>
         </el-col>
-
       </el-row>
       <el-row>
         <el-col :span="24">
           <el-form-item label="备注">
-            <el-input type="textarea" :rows="2" v-model="form.remark" :disabled="dialogType=='view'"></el-input>
+            <el-input
+              type="textarea"
+              :rows="2"
+              v-model="form.remark"
+              :disabled="dialogType == 'view'"
+            ></el-input>
           </el-form-item>
         </el-col>
       </el-row>
@@ -152,59 +189,72 @@
 </template>
 
 <script>
-import PersonSelect from "@/components/CommomSelect/person-select.vue";
+import PersonSelect from '@/components/CommomSelect/person-select.vue';
+import moment from 'moment';
 
 export default {
-  name: "base-form",
-  components: {PersonSelect},
+  name: 'base-form',
+  components: { PersonSelect },
   props: {
     dialogType: {
       type: String,
-      default: '',
+      default: ''
     },
     dialogForm: {
       type: Object,
       default: () => {
-        return {}
+        return {};
       }
     },
     deptList: {
       type: Array,
       default() {
-        return []
+        return [];
       }
     },
     userList: {
       type: Array,
       default() {
-        return []
+        return [];
       }
     },
     deptTreeList: {
       type: Array,
       default() {
-        return []
+        return [];
       }
-    },
+    }
   },
   watch: {
     dialogForm: {
       handler(val) {
         for (const key in this.form) {
-          if(key=='relationType'){
-            this.form[key] = this.dialogForm[key]
-          }else {
-            this.form[key] = this.dialogForm[key] || this.form[key]
+          if (key == 'relationType') {
+            this.form[key] = this.dialogForm[key];
+          } else {
+            this.form[key] = this.dialogForm[key] || this.form[key];
           }
-
         }
       },
       deep: true
     },
-    userList:{
+    userList: {
       handler(val) {
-        this.form.responsibleUserIds = []
+        this.form.responsibleUserIds = [];
+      }
+    }
+  },
+  computed: {
+    getCrcle() {
+      let result = '';
+      if (this.form['planEndDate'] && this.form['planStartDate']) {
+        const a = moment(this.form.planEndDate);
+        const b = moment(this.form.planStartDate);
+        result = a.diff(b, 'days') + 1 + ' 天'; // 1
+        this.form.budget = result;
+        return result;
       }
+      return result;
     }
   },
   data() {
@@ -212,6 +262,7 @@ export default {
       form: {
         beforeTaskId: '',
         code: '',
+        budget: '',
         responsibleUserIds: [],
         remark: '',
         milepost: '0',
@@ -222,38 +273,67 @@ export default {
         type: '',
         name: '',
         responsibleDeptId: '',
-        taskFilesList: [],
+        taskFilesList: []
       },
       rules: {
-        type: {required: true, message: '请选择任务类型', trigger: 'change'},
-        name: {required: true, message: '请输入任务名称', trigger: 'blur'},
-        code: {required: true, message: '请输入任务编码', trigger: 'blur'},
-        planStartDate: {required: true, message: '请选择计划开始日期', trigger: 'change'},
-        planEndDate: {required: true, message: '请选择计划完成日期', trigger: 'change'},
-        responsibleUserIds: {required: true, message: '请选择执行人', trigger: 'change'},
-        responsibleDeptId: {required: true, message: '请选择负责部门', trigger: 'change'},
-        proportion: {required: true, message: '请输入权重占比', trigger: ['change', 'blur']},
-        cost: {required: true, message: '请输入费用', trigger: ['change', 'blur']},
+        type: { required: true, message: '请选择任务类型', trigger: 'change' },
+        name: { required: true, message: '请输入任务名称', trigger: 'blur' },
+        code: { required: true, message: '请输入任务编码', trigger: 'blur' },
+        planStartDate: {
+          required: true,
+          message: '请选择计划开始日期',
+          trigger: 'change'
+        },
+        planEndDate: {
+          required: true,
+          message: '请选择计划完成日期',
+          trigger: 'change'
+        },
+        responsibleUserIds: {
+          required: true,
+          message: '请选择执行人',
+          trigger: 'change'
+        },
+        responsibleDeptId: {
+          required: true,
+          message: '请选择负责部门',
+          trigger: 'change'
+        },
+        proportion: {
+          required: true,
+          message: '请输入权重占比',
+          trigger: ['change', 'blur']
+        },
+        cost: {
+          required: true,
+          message: '请输入费用',
+          trigger: ['change', 'blur']
+        }
       }
-    }
+    };
   },
   methods: {
+    setCycleValue(val, prop) {
+      if (!this.form[prop] || !val) return (this.form.budget = '');
+      const a = moment(this.form.planEndDate);
+      const b = moment(this.form.planStartDate);
+      this.form.budget = a.diff(b, 'days') + 1 + ' 天'; // 1
+    },
     validForm() {
       return new Promise((resolve, reject) => {
-        this.$refs.form.validate(valid => {
+        this.$refs.form.validate((valid) => {
           if (!valid) {
-            this.$message.warning('有必填项未填,请检查')
-            reject('有必填项未填,请检查')
+            this.$message.warning('有必填项未填,请检查');
+            reject('有必填项未填,请检查');
           } else {
-            resolve(this.form)
+            resolve(this.form);
           }
-        })
-      })
+        });
+      });
     }
   }
-}
+};
 </script>
 
 <style scoped lang="scss">
-
 </style>

Разница между файлами не показана из-за своего большого размера
+ 430 - 276
src/views/project-manage/task-manage/components/details.vue


+ 288 - 195
src/views/project-manage/task-manage/components/task-form.vue

@@ -1,13 +1,18 @@
 <template>
   <div>
-    <el-form ref="form" :model="form" :rules="rules" class="el-form-box" label-width="120px">
-
+    <el-form
+      ref="form"
+      :model="form"
+      :rules="rules"
+      class="el-form-box"
+      label-width="120px"
+    >
       <el-row>
         <el-col :span="8">
-<!-- prop="projectId"         -->
-          <el-form-item label="关联项目" >
+          <!-- prop="projectId"         -->
+          <el-form-item label="关联项目">
             <ele-tree-select
-              :disabled="dialogType=='view'"
+              :disabled="dialogType == 'view'"
               ref="projectTreeSelect"
               clearable
               filterable
@@ -25,19 +30,26 @@
         </el-col>
         <el-col :span="8">
           <el-form-item label="关联项目阶段" prop="projectStageId">
-            <el-select v-model="form.projectStageId" :disabled="dialogType=='view'" style="width: 100%"
-                       @change="changeProjectStage" clearable>
-              <el-option v-for="item in projectStageList" :label="item.name" :value="item.id"
-                         :key="item.id"></el-option>
+            <el-select
+              v-model="form.projectStageId"
+              :disabled="dialogType == 'view'"
+              style="width: 100%"
+              @change="changeProjectStage"
+              clearable
+            >
+              <el-option
+                v-for="item in projectStageList"
+                :label="item.name"
+                :value="item.id"
+                :key="item.id"
+              ></el-option>
             </el-select>
           </el-form-item>
         </el-col>
         <el-col :span="8">
-          <el-form-item
-            label="关联项目BOM"
-            prop="projectBomId">
+          <el-form-item label="关联项目BOM" prop="projectBomId">
             <ele-tree-select
-              :disabled="dialogType=='view'"
+              :disabled="dialogType == 'view'"
               clearable
               ref="projectRef"
               filterable
@@ -60,12 +72,11 @@
           <!--                         :key="item.id"></el-option>-->
           <!--            </el-select>-->
           <!--          </el-form-item>-->
-          <el-form-item
-            label="关联计划">
+          <el-form-item label="关联计划">
             <el-row>
               <el-col :span="24">
                 <ele-tree-select
-                  :disabled="dialogType=='view'"
+                  :disabled="dialogType == 'view'"
                   clearable
                   ref="planTreeRef"
                   filterable
@@ -96,22 +107,30 @@
 
               <!--              </el-col>-->
             </el-row>
-
           </el-form-item>
         </el-col>
         <el-col :span="8">
           <el-form-item label="关联计划节点" prop="planStageId">
-            <el-select v-model="form.planStageId" :disabled="dialogType=='view'" style="width: 100%"
-                       @change="changePlanStage" clearable>
-              <el-option v-for="item in planStageList" :label="item.name" :value="item.id"
-                         :key="item.id"></el-option>
+            <el-select
+              v-model="form.planStageId"
+              :disabled="dialogType == 'view'"
+              style="width: 100%"
+              @change="changePlanStage"
+              clearable
+            >
+              <el-option
+                v-for="item in planStageList"
+                :label="item.name"
+                :value="item.id"
+                :key="item.id"
+              ></el-option>
             </el-select>
           </el-form-item>
         </el-col>
         <el-col :span="8">
           <el-form-item label="关联任务" prop="taskId">
             <ele-tree-select
-              :disabled="dialogType=='view'"
+              :disabled="dialogType == 'view'"
               ref="taskTreeSelect"
               clearable
               filterable
@@ -129,83 +148,97 @@
         </el-col>
         <el-col :span="8">
           <el-form-item label="前置任务">
-            <el-select v-model="form.beforeTaskId" :disabled="dialogType=='view'" style="width: 100%" clearable>
-              <el-option v-for="item in beforeTaskList" :label="item.name" :value="item.id"
-                         :key="item.id"></el-option>
+            <el-select
+              v-model="form.beforeTaskId"
+              :disabled="dialogType == 'view'"
+              style="width: 100%"
+              clearable
+            >
+              <el-option
+                v-for="item in beforeTaskList"
+                :label="item.name"
+                :value="item.id"
+                :key="item.id"
+              ></el-option>
             </el-select>
           </el-form-item>
         </el-col>
       </el-row>
-
-
     </el-form>
   </div>
 </template>
 
 <script>
-import {projectsBomGetTreeDataAPI, projectsSelectTreeDataAPI} from "@/api/project-manage";
-import PersonSelect from "@/components/CommomSelect/person-select.vue";
-import {getBeforeTaskListAPI} from "@/api/project-manage/task";
-import {getTargetPlanTreeAPI} from "@/api/project-manage/plan";
+import {
+  projectsBomGetTreeDataAPI,
+  projectsSelectTreeDataAPI
+} from '@/api/project-manage';
+import PersonSelect from '@/components/CommomSelect/person-select.vue';
+import { getBeforeTaskListAPI } from '@/api/project-manage/task';
+import { getTargetPlanTreeAPI } from '@/api/project-manage/plan';
 
 export default {
-  name: "task-form",
-  components: {PersonSelect},
+  name: 'task-form',
+  components: { PersonSelect },
   props: {
     dialogType: {
       type: String,
-      default: '',
+      default: ''
     },
     dialogForm: {
       type: Object,
       default: () => {
-        return {}
+        return {};
       }
     },
     deptList: {
       type: Array,
       default() {
-        return []
+        return [];
       }
     },
     userList: {
       type: Array,
       default() {
-        return []
+        return [];
       }
     },
     deptTreeList: {
       type: Array,
       default() {
-        return []
+        return [];
       }
-    },
+    }
   },
   watch: {
     dialogForm: {
       handler(val) {
         for (const key in this.form) {
-          if(key=='relationType'){
-            this.form[key] = this.dialogForm[key]
-          }else {
-            this.form[key] = this.dialogForm[key] || this.form[key]
+          if (key == 'relationType') {
+            this.form[key] = this.dialogForm[key];
+          } else {
+            this.form[key] = this.dialogForm[key] || this.form[key];
           }
-
         }
         this.$nextTick(async () => {
           await this.getUserList(this.dialogForm.responsibleDeptId);
           //通过项目去查
           if (this.dialogForm.projectId) {
-            await this.getBeforeTaskList(this.dialogForm.projectId)
+            await this.getBeforeTaskList(this.dialogForm.projectId);
             //查项目阶段
-            await this.getProjectsSelectTreeData({
-              treeType: 0,
-              id: this.dialogForm.projectId,
-              isTask: 0,
-              isPlan: 0
-            }, 'projectStageList')
+            await this.getProjectsSelectTreeData(
+              {
+                treeType: 0,
+                id: this.dialogForm.projectId,
+                isTask: 0,
+                isPlan: 0
+              },
+              'projectStageList'
+            );
             //查项目BOM
-            this.projectBOMList = await projectsBomGetTreeDataAPI(this.dialogForm.projectId)
+            this.projectBOMList = await projectsBomGetTreeDataAPI(
+              this.dialogForm.projectId
+            );
             //查项目阶段关联的计划
             let params = {
               projectId: this.form.projectId,
@@ -213,8 +246,8 @@ export default {
               projectStageId: this.form.projectStageId,
               processStatus: [2],
               status: [0, 1]
-            }
-            this.targetPlanList = await this.getTargetPlanTree(params)
+            };
+            this.targetPlanList = await this.getTargetPlanTree(params);
             if (!this.dialogForm.projectStageId) {
               //查项目关联的计划
               // await this.getProjectsSelectTreeData({
@@ -224,12 +257,15 @@ export default {
               //   isPlan: 1
               // }, 'targetPlanList')
               //查项目关联的任务
-              await this.getProjectsSelectTreeData({
-                treeType: 0,
-                id: this.dialogForm.projectId,
-                isTask: 1,
-                isPlan: 0
-              }, 'taskList')
+              await this.getProjectsSelectTreeData(
+                {
+                  treeType: 0,
+                  id: this.dialogForm.projectId,
+                  isTask: 1,
+                  isPlan: 0
+                },
+                'taskList'
+              );
             }
           }
           //通过项目阶段去查
@@ -242,48 +278,59 @@ export default {
             // }, 'targetPlanList')
             if (!this.dialogForm.targetPlanId) {
               //查项目阶段关联的任务
-              await this.getProjectsSelectTreeData({
-                treeType: 1,
-                id: this.dialogForm.projectStageId,
-                isTask: 1,
-                isPlan: 0
-              }, 'taskList')
+              await this.getProjectsSelectTreeData(
+                {
+                  treeType: 1,
+                  id: this.dialogForm.projectStageId,
+                  isTask: 1,
+                  isPlan: 0
+                },
+                'taskList'
+              );
             }
-
           }
           //通过计划去查
           if (this.dialogForm.targetPlanId) {
             //查计划关联下的节点
-            await this.getProjectsSelectTreeData({
-              treeType: 2,
-              id: this.dialogForm.targetPlanId,
-              isTask: 0,
-              isPlan: 0
-            }, 'planStageList')
-            if (!this.dialogForm.planStageId) {
-              //查计划关联下的任务
-              await this.getProjectsSelectTreeData({
+            await this.getProjectsSelectTreeData(
+              {
                 treeType: 2,
                 id: this.dialogForm.targetPlanId,
-                isTask: 1,
+                isTask: 0,
                 isPlan: 0
-              }, 'taskList')
+              },
+              'planStageList'
+            );
+            if (!this.dialogForm.planStageId) {
+              //查计划关联下的任务
+              await this.getProjectsSelectTreeData(
+                {
+                  treeType: 2,
+                  id: this.dialogForm.targetPlanId,
+                  isTask: 1,
+                  isPlan: 0
+                },
+                'taskList'
+              );
             }
           }
           //通过计划节点去查
           if (this.dialogForm.planStageId) {
             //查计划关联下的任务
-            await this.getProjectsSelectTreeData({
-              treeType: 3,
-              id: this.dialogForm.planStageId,
-              isTask: 1,
-              isPlan: 0
-            }, 'taskList')
+            await this.getProjectsSelectTreeData(
+              {
+                treeType: 3,
+                id: this.dialogForm.planStageId,
+                isTask: 1,
+                isPlan: 0
+              },
+              'taskList'
+            );
           }
-        })
+        });
       },
       deep: true
-    },
+    }
   },
   data() {
     return {
@@ -297,7 +344,7 @@ export default {
         taskId: '',
         relationType: '',
         relationId: '',
-        relationName: '',
+        relationName: ''
       },
       projectList: [],
       projectStageList: [],
@@ -307,45 +354,67 @@ export default {
       taskList: [],
       beforeTaskList: [],
       rules: {
-        type: {required: true, message: '请选择任务类型', trigger: 'change'},
-        name: {required: true, message: '请输入任务名称', trigger: 'blur'},
-        planStartDate: {required: true, message: '请选择计划开始日期', trigger: 'change'},
-        projectId: {required: true, message: '请选择关联项目', trigger: ['change', 'blur']},
-        responsibleDeptId: {required: true, message: '请选择负责部门', trigger: 'change'},
-        cost: {required: true, message: '请输入费用', trigger: ['change', 'blur']},
+        type: { required: true, message: '请选择任务类型', trigger: 'change' },
+        name: { required: true, message: '请输入任务名称', trigger: 'blur' },
+        planStartDate: {
+          required: true,
+          message: '请选择计划开始日期',
+          trigger: 'change'
+        },
+        projectId: {
+          required: true,
+          message: '请选择关联项目',
+          trigger: ['change', 'blur']
+        },
+        responsibleDeptId: {
+          required: true,
+          message: '请选择负责部门',
+          trigger: 'change'
+        },
+        cost: {
+          required: true,
+          message: '请输入费用',
+          trigger: ['change', 'blur']
+        }
       }
-    }
+    };
   },
   async created() {
-    this.targetPlanList = await this.getTargetPlanTree({projectId: '', processStatus: [2], status: [0, 1]})
+    this.targetPlanList = await this.getTargetPlanTree({
+      projectId: '',
+      processStatus: [2],
+      status: [0, 1]
+    });
     //查项目
-    await this.getProjectsSelectTreeData({treeType: 0, isTask: 0, isPlan: 0}, 'projectList')
-
+    await this.getProjectsSelectTreeData(
+      { treeType: 0, isTask: 0, isPlan: 0 },
+      'projectList'
+    );
   },
 
   methods: {
     //关联项目改变
     async changeProject(val) {
       //项目阶段
-      this.projectStageList = []
+      this.projectStageList = [];
       //项目BOM
-      this.projectBOMList = []
+      this.projectBOMList = [];
       //项目关联计划
-      this.targetPlanList = []
+      this.targetPlanList = [];
       //项目关联计划下的节点
-      this.planStageList = []
+      this.planStageList = [];
       //项目关联的任务
-      this.taskList = []
+      this.taskList = [];
       //前置任务
-      this.beforeTaskList = []
+      this.beforeTaskList = [];
 
-      this.form.projectStageId = null
-      this.form.targetPlanId = null
-      this.form.planStageId = null
-      this.form.taskId = null
-      this.form.beforeTaskId = null
-      this.form.projectBomId = null
-      this.$emit('changeProject', val)
+      this.form.projectStageId = null;
+      this.form.targetPlanId = null;
+      this.form.planStageId = null;
+      this.form.taskId = null;
+      this.form.beforeTaskId = null;
+      this.form.projectBomId = null;
+      this.$emit('changeProject', val);
       //查计划
       let params = {
         projectId: val,
@@ -353,164 +422,189 @@ export default {
         projectStageId: this.form.projectStageId,
         processStatus: [2],
         status: [0, 1]
-      }
-      this.targetPlanList = await this.getTargetPlanTree(params)
-      if (!val) return
+      };
+      this.targetPlanList = await this.getTargetPlanTree(params);
+      if (!val) return;
       //查前置任务
-      await this.getBeforeTaskList(val)
+      await this.getBeforeTaskList(val);
 
       // let node = this.$refs.projectTreeSelect?.$refs?.tree?.getCurrentNode() || {};
-      this.setTaskInfo(0, val, '项目')
+      this.setTaskInfo(0, val, '项目');
       //查项目阶段
-      await this.getProjectsSelectTreeData({treeType: 0, id: val, isTask: 0, isPlan: 0}, 'projectStageList')
+      await this.getProjectsSelectTreeData(
+        { treeType: 0, id: val, isTask: 0, isPlan: 0 },
+        'projectStageList'
+      );
       //查项目关联的计划
       // await this.getProjectsSelectTreeData({treeType: 0, id: val, isTask: 0, isPlan: 1}, 'targetPlanList')
       //查项目关联的任务
-      await this.getProjectsSelectTreeData({treeType: 0, id: val, isTask: 1, isPlan: 0}, 'taskList')
+      await this.getProjectsSelectTreeData(
+        { treeType: 0, id: val, isTask: 1, isPlan: 0 },
+        'taskList'
+      );
       //查项目关联的BOM
-      this.projectBOMList = await projectsBomGetTreeDataAPI(val)
+      this.projectBOMList = await projectsBomGetTreeDataAPI(val);
       if (val) {
-        this.$refs.form.clearValidate('projectId')
+        this.$refs.form.clearValidate('projectId');
       } else {
-        this.$refs.form.validateField('projectId')
+        this.$refs.form.validateField('projectId');
       }
     },
     //关联项目阶段改变
     async changeProjectStage(val) {
       //项目关联计划
-      this.targetPlanList = []
+      this.targetPlanList = [];
       //项目关联计划下的节点
-      this.planStageList = []
+      this.planStageList = [];
       //项目关联的任务
-      this.taskList = []
+      this.taskList = [];
 
-      this.form.targetPlanId = null
-      this.form.planStageId = null
-      this.form.taskId = null
+      this.form.targetPlanId = null;
+      this.form.planStageId = null;
+      this.form.taskId = null;
       let params = {
         projectId: this.form.projectId,
         projectBomId: this.form.projectBomId,
         projectStageId: val,
         processStatus: [2],
         status: [0, 1]
-      }
-      this.targetPlanList = await this.getTargetPlanTree(params)
+      };
+      this.targetPlanList = await this.getTargetPlanTree(params);
       if (!val) {
         if (this.form.projectId) {
-          await this.changeProject(this.form.projectId)
+          await this.changeProject(this.form.projectId);
         }
-        return
+        return;
       }
-      this.setTaskInfo(1, val, '项目阶段')
+      this.setTaskInfo(1, val, '项目阶段');
       //查项目阶段关联的计划
       // await this.getProjectsSelectTreeData({treeType: 1, id: val, isTask: 0, isPlan: 1}, 'targetPlanList')
       //查项目阶段关联的任务
-      await this.getProjectsSelectTreeData({treeType: 1, id: val, isTask: 1, isPlan: 0}, 'taskList')
+      await this.getProjectsSelectTreeData(
+        { treeType: 1, id: val, isTask: 1, isPlan: 0 },
+        'taskList'
+      );
     },
     //关联项目BOM改变
     async changeProjectBom(val) {
       //项目关联计划
-      this.targetPlanList = []
+      this.targetPlanList = [];
       //项目关联计划下的节点
-      this.planStageList = []
+      this.planStageList = [];
       //项目关联的任务
-      this.taskList = []
+      this.taskList = [];
 
-      this.form.targetPlanId = null
-      this.form.planStageId = null
-      this.form.taskId = null
+      this.form.targetPlanId = null;
+      this.form.planStageId = null;
+      this.form.taskId = null;
       let params = {
         projectId: this.form.projectId,
         projectBomId: val,
         projectStageId: this.form.projectStageId,
         processStatus: [2],
         status: [0, 1]
-      }
-      this.targetPlanList = await this.getTargetPlanTree(params)
+      };
+      this.targetPlanList = await this.getTargetPlanTree(params);
       if (!val) {
         if (this.form.projectId) {
-          await this.changeProject(this.form.projectId)
+          await this.changeProject(this.form.projectId);
         }
-        return
+        return;
       }
-      this.setTaskInfo(5, val, '项目BOM')
+      this.setTaskInfo(5, val, '项目BOM');
       //查项目BOM关联的计划
       // await this.getProjectsSelectTreeData({treeType: 1, id: val, isTask: 0, isPlan: 1}, 'targetPlanList')
       //查项目BOM关联的任务
-      await this.getProjectsSelectTreeData({treeType: 1, id: val, isTask: 1, isPlan: 0}, 'taskList')
+      await this.getProjectsSelectTreeData(
+        { treeType: 1, id: val, isTask: 1, isPlan: 0 },
+        'taskList'
+      );
     },
     //关联计划改变
     async changeTargetPlan(val) {
       //项目关联计划下的节点
-      this.planStageList = []
+      this.planStageList = [];
       //项目关联的任务
-      this.taskList = []
+      this.taskList = [];
 
-      this.form.planStageId = null
-      this.form.taskId = null
+      this.form.planStageId = null;
+      this.form.taskId = null;
       if (!val) {
         if (this.form.projectStageId) {
-          await this.changeProjectStage(this.form.projectStageId)
+          await this.changeProjectStage(this.form.projectStageId);
         } else if (this.form.projectId) {
-          await this.changeProject(this.form.projectId)
+          await this.changeProject(this.form.projectId);
         }
-        return
+        return;
       }
 
-      let nodeData = this.$refs?.planTreeRef?.$refs?.tree?.getCurrentNode() || {}
-      await this.getProjectsSelectTreeData({
-        treeType: 0,
-        id: nodeData.projectId,
-        isTask: 0,
-        isPlan: 0
-      }, 'projectStageList')
-      this.projectBOMList = await projectsBomGetTreeDataAPI(nodeData.projectId)
-      this.form.projectId = nodeData.projectId
-      this.form.projectBomId = nodeData.projectBomId
-      this.form.projectStageId = nodeData.projectStageId
-      this.setTaskInfo(2, val, '计划')
-      this.$emit('changeProject', this.form.projectId)
+      let nodeData =
+        this.$refs?.planTreeRef?.$refs?.tree?.getCurrentNode() || {};
+      await this.getProjectsSelectTreeData(
+        {
+          treeType: 0,
+          id: nodeData.projectId,
+          isTask: 0,
+          isPlan: 0
+        },
+        'projectStageList'
+      );
+      this.projectBOMList = await projectsBomGetTreeDataAPI(nodeData.projectId);
+      this.form.projectId = nodeData.projectId;
+      this.form.projectBomId = nodeData.projectBomId;
+      this.form.projectStageId = nodeData.projectStageId;
+      this.setTaskInfo(2, val, '计划');
+      this.$emit('changeProject', this.form.projectId);
       //查项目关联的计划下的节点
-      await this.getProjectsSelectTreeData({treeType: 2, id: val, isTask: 0, isPlan: 0}, 'planStageList')
+      await this.getProjectsSelectTreeData(
+        { treeType: 2, id: val, isTask: 0, isPlan: 0 },
+        'planStageList'
+      );
       //查项目关联的计划的任务
-      await this.getProjectsSelectTreeData({treeType: 2, id: val, isTask: 1, isPlan: 0}, 'taskList')
+      await this.getProjectsSelectTreeData(
+        { treeType: 2, id: val, isTask: 1, isPlan: 0 },
+        'taskList'
+      );
     },
     //关联计划节点改变
     async changePlanStage(val) {
       //项目关联的任务
-      this.taskList = []
-      this.form.taskId = null
+      this.taskList = [];
+      this.form.taskId = null;
       if (!val) {
         if (this.form.targetPlanId) {
-          await this.changeTargetPlan(this.form.targetPlanId)
+          await this.changeTargetPlan(this.form.targetPlanId);
         } else if (this.form.projectStageId) {
-          await this.changeProjectStage(this.form.projectStageId)
+          await this.changeProjectStage(this.form.projectStageId);
         } else if (this.form.projectId) {
-          await this.changeProject(this.form.projectId)
+          await this.changeProject(this.form.projectId);
         }
-        return
+        return;
       }
-      this.setTaskInfo(3, val, '计划节点')
+      this.setTaskInfo(3, val, '计划节点');
       //查项目关联的任务
-      await this.getProjectsSelectTreeData({treeType: 3, id: val, isTask: 1, isPlan: 0}, 'taskList')
+      await this.getProjectsSelectTreeData(
+        { treeType: 3, id: val, isTask: 1, isPlan: 0 },
+        'taskList'
+      );
     },
     //关联任务改变
     async changeTask(val) {
       if (!val) {
         if (this.form.planStageId) {
-          this.setTaskInfo(3, this.form.planStageId, '计划节点')
+          this.setTaskInfo(3, this.form.planStageId, '计划节点');
         } else if (this.form.targetPlanId) {
-          this.setTaskInfo(2, this.form.targetPlanId, '计划')
+          this.setTaskInfo(2, this.form.targetPlanId, '计划');
         } else if (this.form.projectStageId) {
-          this.setTaskInfo(1, this.form.projectStageId, '项目阶段')
-        }else if (this.form.projectBomId) {
-          this.setTaskInfo(5, this.form.projectBomId, '项目Bom')
+          this.setTaskInfo(1, this.form.projectStageId, '项目阶段');
+        } else if (this.form.projectBomId) {
+          this.setTaskInfo(5, this.form.projectBomId, '项目Bom');
         } else if (this.form.projectId) {
-          this.setTaskInfo(0, this.form.projectId, '项目')
+          this.setTaskInfo(0, this.form.projectId, '项目');
         }
-        return
+        return;
       }
-      this.setTaskInfo(4, val, '任务')
+      this.setTaskInfo(4, val, '任务');
     },
     //设置任务类型
     setTaskInfo(type, id, name) {
@@ -520,41 +614,40 @@ export default {
     },
     //查项目关联信息集合
     async getProjectsSelectTreeData(params, listName) {
-      params.ifFilter = this.dialogType == 'view' ? '0' : '1'
-      this[listName] = await projectsSelectTreeDataAPI(params)
+      params.ifFilter = this.dialogType == 'view' ? '0' : '1';
+      this[listName] = await projectsSelectTreeDataAPI(params);
     },
     async getBeforeTaskList(val) {
-      this.beforeTaskList = await getBeforeTaskListAPI(val)
+      this.beforeTaskList = await getBeforeTaskListAPI(val);
     },
     // 获取人员数据
     getUserList(groupId) {
       if (groupId) {
-        this.$refs.directorRef.getList({groupId});
+        this.$refs.directorRef.getList({ groupId });
       }
     },
     personChange(val, info) {
       this.form.responsibleUserName = info.name;
     },
     async getTargetPlanTree(data = {}) {
-      return await getTargetPlanTreeAPI(data)
+      return await getTargetPlanTreeAPI(data);
     },
     validForm() {
       return new Promise((resolve, reject) => {
-        this.$refs.form.validate(valid => {
+        this.$refs.form.validate((valid) => {
           if (!valid) {
-            this.$message.warning('有必填项未填,请检查')
-            reject('有必填项未填,请检查')
+            this.$message.warning('有必填项未填,请检查');
+            reject('有必填项未填,请检查');
           } else {
-            resolve(this.form)
+            resolve(this.form);
           }
-        })
-      })
+        });
+      });
     }
   }
-}
+};
 </script>
 
 
 <style scoped lang="scss">
-
 </style>

+ 62 - 51
src/views/project-manage/task-manage/components/transferDialog.vue

@@ -6,22 +6,33 @@
     title="转派"
     :close-on-click-modal="false"
     width="20%"
-    :before-close="cancel">
-    <el-form ref="form" :model="dialogForm" :rules="rules" class="el-form-box" label-width="70px">
-      <el-form-item
-        prop="responsibleUserIds"
-        label="转派人">
-        <el-select v-model="dialogForm.responsibleUserIds" multiple collapse-tags
-                   filterable
-                   placeholder="请选择" style="width: 100%;"
-                   clearable
-                   size="medium"
-                   :disabled="dialogType=='view'">
+    :before-close="cancel"
+  >
+    <el-form
+      ref="form"
+      :model="dialogForm"
+      :rules="rules"
+      class="el-form-box"
+      label-width="70px"
+    >
+      <el-form-item prop="responsibleUserIds" label="转派人">
+        <el-select
+          v-model="dialogForm.responsibleUserIds"
+          multiple
+          collapse-tags
+          filterable
+          placeholder="请选择"
+          style="width: 100%"
+          clearable
+          size="medium"
+          :disabled="dialogType == 'view'"
+        >
           <el-option
             v-for="item in userList"
             :key="item.id"
             :label="item.name"
-            :value="item.id">
+            :value="item.id"
+          >
           </el-option>
         </el-select>
         <!--            <personSelect-->
@@ -37,97 +48,97 @@
       <!--      <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 {
-  updateTaskResponsibleUserAPI,
-} from "@/api/project-manage/task";
-import {projectsTeamGetByIdAPI} from "@/api/project-manage/team";
-import {projectsGetByIdAPI} from "@/api/project-manage";
-import {deepClone} from "@/utils";
-
+import { updateTaskResponsibleUserAPI } from '@/api/project-manage/task';
+import { projectsTeamGetByIdAPI } from '@/api/project-manage/team';
+import { projectsGetByIdAPI } from '@/api/project-manage';
+import { deepClone } from '@/utils';
 
 export default {
-  name: "transferDialog",
+  name: 'transferDialog',
 
   props: {
     transferDialogFlag: {
       type: Boolean,
-      default: false,
+      default: false
+    },
+    dialogType: {
+      type: String,
+      default: ''
     }
   },
   data() {
     return {
       dialogForm: {
-        responsibleUserIds:[],
+        responsibleUserIds: [],
         id: ''
       },
       userList: [],
       rules: {
-        responsibleUserIds: {required: true, message: '请选择转派人', trigger: 'change'},
+        responsibleUserIds: {
+          required: true,
+          message: '请选择转派人',
+          trigger: 'change'
+        }
       }
-    }
-  },
-  created() {
-
+    };
   },
+  created() {},
   methods: {
     async init(row = {}) {
       this.dialogForm = {
         id: row.id,
         responsibleUserIds: []
-      }
+      };
       if (row.projectId) await this.changeProject(row.projectId);
     },
     async changeProject(id) {
       if (!id) {
-        this.userList = []
-        return
+        this.userList = [];
+        return;
       }
-      let projectInfo = await projectsGetByIdAPI(id)
-      this.getUserList(projectInfo.teamId)
+      let projectInfo = await projectsGetByIdAPI(id);
+      this.getUserList(projectInfo.teamId);
     },
     // 获取项目团队下团队人员集合
     getUserList(val) {
       if (!val) {
-        this.userList = []
-        return
+        this.userList = [];
+        return;
       }
       projectsTeamGetByIdAPI(val).then((list) => {
-        this.userList = deepClone(list.teamUserList)
+        this.userList = deepClone(list.teamUserList);
       });
     },
 
     async submit(type = '') {
-      this.dialogForm.responsibleUserList = this.getResponsibleUserList( this.dialogForm.responsibleUserIds)
-      await updateTaskResponsibleUserAPI(this.dialogForm)
+      this.dialogForm.responsibleUserList = this.getResponsibleUserList(
+        this.dialogForm.responsibleUserIds
+      );
+      await updateTaskResponsibleUserAPI(this.dialogForm);
       this.$message.success('操作成功');
-      this.cancel()
+      this.cancel();
       this.$emit('reload');
     },
     getResponsibleUserList(list = []) {
-      return list.map(
-        i => {
-          return {
-            userId: i,
-            userName: this.userList.find(u => u.id === i).name
-          }
-        });
+      return list.map((i) => {
+        return {
+          userId: i,
+          userName: this.userList.find((u) => u.id === i).name
+        };
+      });
     },
     cancel() {
       this.$emit('update:transferDialogFlag', false);
-    },
+    }
   }
-}
+};
 </script>
 
 
 <style scoped lang="scss">
-
 </style>

+ 0 - 98
vue.config.js

@@ -1,98 +0,0 @@
-const CompressionWebpackPlugin = require('compression-webpack-plugin');
-const { transformElementScss } = require('ele-admin/lib/utils/dynamic-theme');
-const path = require('path');
-const { name } = require('./package.json');
-
-function resolve(dir) {
-  return path.join(__dirname, dir);
-}
-
-module.exports = {
-  publicPath: '/pro',
-  lintOnSave: false,
-  productionSourceMap: false,
-  configureWebpack: {
-    // devtool: 'source-map',
-    performance: {
-      maxAssetSize: 2000000,
-      maxEntrypointSize: 2000000
-    },
-    output: {
-      // 把子应用打包成 umd 库格式
-      library: {
-        type: 'umd',
-        name: `${name}`
-      },
-
-      chunkLoadingGlobal: `webpackJsonp_${name}`
-    }
-  },
-  devServer: {
-    // 代理跨域的配置
-    proxy: {
-      // 当我们的本地的请求 有/api的时候,就会代理我们的请求地址向另外一个服务器发出请求
-      '/api': {
-        target: 'http://192.168.1.125:18086',
-        // target: 'http://192.168.1.251:18086',
-        // target: 'http://192.168.1.176:18086',
-        // target: 'http://192.168.1.158:18086',
-
-        changeOrigin: true, // 只有这个值为true的情况下 才表示开启跨域
-        pathRewrite: {
-          '^/api': ''
-        }
-      }
-    },
-    headers: {
-      'Access-Control-Allow-Origin': '*'
-    }
-  },
-  chainWebpack(config) {
-    config.plugins.delete('prefetch');
-    // set svg-sprite-loader
-    // config.module.rule('svg').exclude.add(resolve('./src/icons')).end();
-    // config.module
-    //   .rule('icons')
-    //   .test(/\.svg$/)
-    //   .include.add(resolve('./src/icons'))
-    //   .end()
-    //   .use('svg-sprite-loader')
-    //   .loader('svg-sprite-loader')
-    //   .options({
-    //     symbolId: 'icon-[name]'
-    //   })
-    //   .end();
-    config.module.rule('svg').exclude.add(resolve('src/icons')).end();
-    config.module
-      .rule('icons')
-      .test(/\.svg$/)
-      .include.add(resolve('src/icons'))
-      .end()
-      .use('svg-sprite-loader')
-      .loader('svg-sprite-loader')
-      .options({
-        symbolId: 'icon-[name]'
-      })
-      .end();
-
-    if (process.env.NODE_ENV !== 'development') {
-      // gzip 压缩
-      config.plugin('compressionPlugin').use(
-        new CompressionWebpackPlugin({
-          test: /\.(js|css|html)$/,
-          threshold: 10240
-        })
-      );
-    }
-  },
-  css: {
-    loaderOptions: {
-      sass: {
-        sassOptions: {
-          outputStyle: 'expanded',
-          importer: transformElementScss()
-        }
-      }
-    }
-  }
-};

Некоторые файлы не были показаны из-за большого количества измененных файлов