Browse Source

项目,需求删除排期弹框

wangziqian 5 years ago
parent
commit
3b60c5285c

+ 7 - 1
src/components/dialog/normalDialog.vue

@@ -11,8 +11,9 @@
     >
       <slot />
       <span v-show="showFooter" slot="footer" class="dialog-footer">
+        <el-button v-show="buttomType ==='danger'" :type="buttomType" size="mini" @click="confirm()">{{ submitButton }}</el-button>
         <el-button size="mini" @click="cancel()">取 消</el-button>
-        <el-button type="primary" size="mini" @click="confirm()">{{ submitButton }}</el-button>
+        <el-button v-show="buttomType !=='danger'" :type="buttomType" size="mini" @click="confirm()">{{ submitButton }}</el-button>
       </span>
     </el-dialog>
   </div>
@@ -50,6 +51,11 @@ export default {
       default: '确 定',
       required: false
     },
+    buttomType: {// 提交按钮类型
+      type: String,
+      default: 'primary',
+      required: false
+    },
     isDefaultClose: { // 是否确定后关闭弹框
       type: Boolean,
       default: true,

+ 103 - 7
src/views/projectManage/projectList/components/modifySchedule.vue

@@ -1,6 +1,15 @@
 <template>
-  <normal-dialog :show-dialog.sync="show" :title="title" :is-default-close="false" @confirm="confirmForm()" @cancel="cancel()">
-    <article>
+  <normal-dialog
+    :show-dialog.sync="show"
+    :title="title"
+    :is-default-close="false"
+    :submit-button="isDeleteStatus?'我知道了,删除':'确定'"
+    :buttom-type="isDeleteStatus?'danger':'primary'"
+    width="55%"
+    @confirm="confirmForm()"
+    @cancel="cancel()"
+  >
+    <article v-if="!isDeleteStatus">
       <el-form ref="form" :model="form" :rules="form_rules" label-width="100px" :label-position="'left'">
         <el-form-item label="排期类型" prop="type">
           <el-select v-model="form.type" clearable placeholder="请选择" style="width: 100%" :disabled="disabled">
@@ -46,13 +55,35 @@
         <div v-for="item in tasksDetailList" :key="'task'+item.id" class="task-list-item">
           <div v-if="item.taskIdSting" class="item-id">{{ item.taskIdSting }}</div>
           <div v-if="item.taskId" class="item-id">{{ item.taskId }}</div>
-          <div class="item-name">{{ item.name }}</div>
-          <div class="item-qa">测试负责人:{{ item.qaObject !== null?item.qaObject.name: '' }}</div>
-          <div class="item-rd">开发负责人:{{ item.rdObject !== null?item.rdObject.name: '' }}</div>
+          <div class="item-name"><span>{{ item.name }}</span></div>
+          <div class="item-qa">测试负责人:<span>{{ item.qaObject !== null?item.qaObject.name: '' }}</span></div>
+          <div class="item-rd">开发负责人:<span>{{ item.rdObject !== null?item.rdObject.name: '' }}</span></div>
           <i class="el-icon-circle-close item-cancel" @click="cancelTask(item.id)" />
         </div>
       </div>
     </article>
+    <article v-if="isDeleteStatus">
+      <div class="danger-img">
+        <img :src="dangerImg">
+      </div>
+      <div class="delete-title">
+        执行删除后,所有关联任务下的此排期均会被删除,并无法恢复,请谨慎操作!
+      </div>
+      <div class="people-list-show">
+        <p>参与人:</p>
+        <span>{{ peopleObjectList.join(',') }}</span>
+      </div>
+      <div class="task-list-show">
+        <p>关联任务:</p>
+        <div v-for="item in tasksDetailList" :key="'task'+item.id" class="task-list-item">
+          <div v-if="item.taskIdSting" class="item-id">{{ item.taskIdSting }}</div>
+          <div v-if="item.taskId" class="item-id">{{ item.taskId }}</div>
+          <div class="item-name"><span>{{ item.name }}</span></div>
+          <div class="item-qa">测试负责人:<span>{{ item.qaObject !== null?item.qaObject.name: '' }}</span></div>
+          <div class="item-rd">开发负责人:<span>{{ item.rdObject !== null?item.rdObject.name: '' }}</span></div>
+        </div>
+      </div>
+    </article>
   </normal-dialog>
 </template>
 <script>
@@ -62,7 +93,8 @@ import normalDialog from '@/components/dialog/normalDialog'
 import selDatePicker from '@/components/picker/SelDatePicker'
 import { taskList } from '@/api/projectIndex'
 import { taskList as allTaskList, configShowTaskEnum } from '@/api/taskIndex'
-import { getSeprateDayInfo, scheduleCreate, scheduleGet, scheduleUpdate } from '@/api/projectViewDetails'
+import { getSeprateDayInfo, scheduleCreate, scheduleGet, scheduleUpdate, scheduleDelete } from '@/api/projectViewDetails'
+import danger from '@/assets/感叹@2x.png'
 export default {
   components: {
     searchPeople,
@@ -94,10 +126,16 @@ export default {
       type: Boolean,
       default: false,
       required: false
+    },
+    isDelete: {// 是否删除状态
+      type: Boolean,
+      default: false,
+      required: false
     }
   },
   data() {
     return {
+      dangerImg: danger,
       form_rules: {
         type: [{ required: true, message: '事件类型不能为空', trigger: 'blur' }],
         peopleList: [{ required: true, message: '参与人员不能为空', trigger: 'blur' }],
@@ -105,6 +143,7 @@ export default {
         taskList: [{ required: true, message: '关联任务不能为空', trigger: 'blur' }]
       },
       show: this.visible,
+      isDeleteStatus: this.isDelete,
       taskScheduleEvent: [],
       form: {
         bizId: localStorage.getItem('bizId'),
@@ -119,7 +158,8 @@ export default {
       selectTask: null, // 选择的任务id
       tasksOptions: [], // 任务下拉选项
       tasksDetailList: [], // 已有任务项目
-      loading: false
+      loading: false,
+      peopleObjectList: [] // 参与人
     }
   },
   watch: {
@@ -150,6 +190,14 @@ export default {
     },
     title(newV, oldV) {
       this.title = newV
+    },
+    isDelete: {
+      handler(newV, old) {
+        this.isDeleteStatus = newV
+        console.log(this.isDeleteStatus)
+      },
+      immediate: true,
+      deep: true
     }
   },
   created() {
@@ -178,6 +226,7 @@ export default {
       this.detailDayList = obj.dayList || []
       this.schedule = obj.seperateDaysNoHoliday
       this.tasksDetailList = obj.taskObjectList || []
+      this.peopleObjectList = obj.peopleObjectList.map(item => item.name) || []
     },
     async getType() {
       const resEnum = await configShowTaskEnum()
@@ -210,6 +259,7 @@ export default {
       const isEx = this.tasksDetailList.find(item => item.id === id)
       if (isEx) {
         this.$message({ message: '任务已存在', type: 'warning', duration: 1000, offset: 150 })
+        this.selectTask = null
         return false
       }
       const res = this.tasksOptions.find(item => {
@@ -252,7 +302,19 @@ export default {
       this.$emit('update')
       this.cancel()
     },
+    async scheduleDelete() { // 删除排期
+      const res = await scheduleDelete(this.form.id)
+      if (res.code === 200) {
+        this.$message({ message: '删除成功', type: 'success', duration: 1000, offset: 150 })
+      }
+      this.$emit('update')
+      this.cancel()
+    },
     confirmForm() { // 确认提交表单
+      if (this.isDeleteStatus) {
+        this.scheduleDelete()
+        return
+      }
       this.$refs['form'].validate((valid) => {
         if (valid) {
           const params = _.cloneDeep(this.form)
@@ -263,7 +325,9 @@ export default {
     },
     cancel() { // 关闭弹框
       this.show = false
+      this.isDeleteStatus = false
       this.$emit('update:visible', this.show)
+      this.$emit('update:isDelete', this.isDeleteStatus)
     }
   }
 }
@@ -316,4 +380,36 @@ article {
     }
   }
 }
+.danger-img {
+  width: 100%;
+  padding: 0 60px 50px 60px;
+  margin-bottom: 50px;
+  position: relative;
+  img {
+    height: 50px;
+    width: 50px;
+    position: absolute;
+    left: 50%;
+    transform: translate(-50%,0);
+  }
+}
+.delete-title {
+  width: 100%;
+  padding: 0 60px 100px 60px;
+  color: #333B4A;
+  font-size: 18px;
+  text-align: center;
+}
+.people-list-show {
+  width: 100%;
+  padding: 0 60px 50px 60px;
+  p {
+    color: #666666;
+    font-size: 14px;
+    margin-bottom: 20px;
+  }
+  span {
+    color: #333333;
+  }
+}
 </style>

+ 10 - 23
src/views/projectManage/projectList/components/scheduleList.vue

@@ -66,7 +66,7 @@
       >
         <template slot-scope="scope">
           <el-button type="text" size="small" @click="editSchedule(scope.row)">编辑</el-button>
-          <el-button type="text" size="small" @click="confirmDel(scope.row)">删除</el-button>
+          <el-button type="text" size="small" @click="deleteSchedule(scope.row)">删除</el-button>
         </template>
       </el-table-column>
 
@@ -82,6 +82,7 @@
     <modify-schedule
       v-if="visibleSchedule"
       :visible.sync="visibleSchedule"
+      :is-delete.sync="isDelete"
       :detail-data="detailData"
       :title="DialogTitle"
       @update="listByTask(id)"
@@ -92,7 +93,7 @@
 import Sortable from 'sortablejs'
 import moment from 'moment'
 import 'moment/locale/zh-cn'
-import { listByTask, scheduleDelete, sortForTask } from '@/api/projectViewDetails'
+import { listByTask, sortForTask } from '@/api/projectViewDetails'
 import modifySchedule from './modifySchedule'
 import move from '@/assets/麻将@2x.png'
 export default {
@@ -124,7 +125,8 @@ export default {
       visibleSchedule: false,
       detailData: null,
       taskScheduleEvent: [], // 排期类型
-      DialogTitle: '新建排期'
+      DialogTitle: '新建排期',
+      isDelete: false // 删除排期操作
     }
   },
   watch: {
@@ -182,26 +184,11 @@ export default {
       this.DialogTitle = '新建排期'
       this.visibleSchedule = true
     },
-    confirmDel(row) {
-      this.$confirm('是否删除排期?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }).then(() => {
-        this.deleteSchedule(row)
-      }).catch(() => {
-        this.$message({
-          type: 'info',
-          message: '已取消删除'
-        })
-      })
-    },
-    async deleteSchedule(row) { // 删除排期
-      const res = await scheduleDelete(row.id)
-      if (res.code === 200) {
-        this.listByTask(this.id)
-        this.$message({ message: '删除成功', type: 'success', duration: 1000, offset: 150 })
-      }
+    deleteSchedule(row) { // 删除排期
+      this.DialogTitle = '删除排期'
+      this.isDelete = true
+      this.visibleSchedule = true
+      this.detailData = row
     },
     editSchedule(row) { // 编辑排期
       this.DialogTitle = '编辑排期'

+ 4 - 4
src/views/projectManage/projectList/projectViewDetails.vue

@@ -51,7 +51,7 @@
         </div>
       </el-header>
       <!-- 概览 -->
-      <el-container v-show="activeName === '1'" class="is-vertical">
+      <el-container v-if="activeName === '1'" class="is-vertical">
         <section class="main-section">
           <div class="el-main-title">
             <div class="title-left-icon" />
@@ -119,21 +119,21 @@
       </el-container>
       <!-- 概览 -->
       <!-- 需求 -->
-      <el-container v-show="activeName === '2'">
+      <el-container v-if="activeName === '2'">
         <section class="main-section contain">
           <needs-list />
         </section>
       </el-container>
       <!-- 需求 -->
       <!-- 任务 -->
-      <el-container v-show="activeName === '3'" class="is-vertical">
+      <el-container v-if="activeName === '3'" class="is-vertical">
         <section class="main-section contain">
           <tasks-list />
         </section>
       </el-container>
       <!-- 任务 -->
       <!-- 缺陷 -->
-      <el-container v-show="activeName === '4'" class="is-vertical">
+      <el-container v-if="activeName === '4'" class="is-vertical">
         <section class="main-section contain">
           <bugTableDialog ref="bugTableDialog" :obj-id="{ projectId: Number(this.$route.query.id) }" />
         </section>

+ 112 - 9
src/views/projectManage/requirement/components/modifySchedule.vue

@@ -1,6 +1,15 @@
 <template>
-  <normal-dialog :show-dialog.sync="show" :title="title" :is-default-close="false" @confirm="confirmForm()" @cancel="cancel()">
-    <article>
+  <normal-dialog
+    :show-dialog.sync="show"
+    :title="title"
+    :is-default-close="false"
+    :submit-button="isDeleteStatus?'我知道了,删除':'确定'"
+    :buttom-type="isDeleteStatus?'danger':'primary'"
+    width="55%"
+    @confirm="confirmForm()"
+    @cancel="cancel()"
+  >
+    <article v-if="!isDeleteStatus">
       <el-form ref="form" :model="form" :rules="form_rules" label-width="100px" :label-position="'left'">
         <el-form-item label="排期类型" prop="type">
           <el-select v-model="form.type" clearable placeholder="请选择" style="width: 100%" :disabled="disabled">
@@ -46,13 +55,35 @@
         <div v-for="item in tasksDetailList" :key="'task'+item.id" class="task-list-item">
           <div v-if="item.taskIdSting" class="item-id">{{ item.taskIdSting }}</div>
           <div v-if="item.taskId" class="item-id">{{ item.taskId }}</div>
-          <div class="item-name">{{ item.name }}</div>
-          <div class="item-qa">测试负责人:{{ item.qaObject !== null?item.qaObject.name: '' }}</div>
-          <div class="item-rd">开发负责人:{{ item.rdObject !== null?item.rdObject.name: '' }}</div>
+          <div class="item-name"><span>{{ item.name }}</span></div>
+          <div class="item-qa">测试负责人:<span>{{ item.qaObject !== null?item.qaObject.name: '' }}</span></div>
+          <div class="item-rd">开发负责人:<span>{{ item.rdObject !== null?item.rdObject.name: '' }}</span></div>
           <i class="el-icon-circle-close item-cancel" @click="cancelTask(item.id)" />
         </div>
       </div>
     </article>
+    <article v-if="isDeleteStatus">
+      <div class="danger-img">
+        <img :src="dangerImg">
+      </div>
+      <div class="delete-title">
+        执行删除后,所有关联任务下的此排期均会被删除,并无法恢复,请谨慎操作!
+      </div>
+      <div class="people-list-show">
+        <p>参与人:</p>
+        <span>{{ peopleObjectList.join(',') }}</span>
+      </div>
+      <div class="task-list-show">
+        <p>关联任务:</p>
+        <div v-for="item in tasksDetailList" :key="'task'+item.id" class="task-list-item">
+          <div v-if="item.taskIdSting" class="item-id">{{ item.taskIdSting }}</div>
+          <div v-if="item.taskId" class="item-id">{{ item.taskId }}</div>
+          <div class="item-name"><span>{{ item.name }}</span></div>
+          <div class="item-qa">测试负责人:<span>{{ item.qaObject !== null?item.qaObject.name: '' }}</span></div>
+          <div class="item-rd">开发负责人:<span>{{ item.rdObject !== null?item.rdObject.name: '' }}</span></div>
+        </div>
+      </div>
+    </article>
   </normal-dialog>
 </template>
 <script>
@@ -62,7 +93,8 @@ import normalDialog from '@/components/dialog/normalDialog'
 import selDatePicker from '@/components/picker/SelDatePicker'
 import { getTaskByRequireId } from '@/api/requirement'
 import { taskList as allTaskList, configShowTaskEnum } from '@/api/taskIndex'
-import { getSeprateDayInfo, scheduleCreate, scheduleGet, scheduleUpdate } from '@/api/projectViewDetails'
+import { getSeprateDayInfo, scheduleCreate, scheduleGet, scheduleUpdate, scheduleDelete } from '@/api/projectViewDetails'
+import danger from '@/assets/感叹@2x.png'
 export default {
   components: {
     searchPeople,
@@ -90,7 +122,12 @@ export default {
       default: () => [],
       required: false
     },
-    disabled: {
+    disabled: {// 是否查看状态,不能被编辑
+      type: Boolean,
+      default: false,
+      required: false
+    },
+    isDelete: {// 是否删除状态
       type: Boolean,
       default: false,
       required: false
@@ -98,6 +135,7 @@ export default {
   },
   data() {
     return {
+      dangerImg: danger,
       form_rules: {
         type: [{ required: true, message: '事件类型不能为空', trigger: 'blur' }],
         peopleList: [{ required: true, message: '参与人员不能为空', trigger: 'blur' }],
@@ -105,6 +143,7 @@ export default {
         taskList: [{ required: true, message: '关联任务不能为空', trigger: 'blur' }]
       },
       show: this.visible,
+      isDeleteStatus: this.isDelete,
       taskScheduleEvent: [],
       form: {
         bizId: localStorage.getItem('bizId'),
@@ -119,7 +158,8 @@ export default {
       selectTask: null, // 选择的任务id
       tasksOptions: [], // 任务下拉选项
       tasksDetailList: [], // 已有任务项目
-      loading: false
+      loading: false,
+      peopleObjectList: [] // 参与人
     }
   },
   watch: {
@@ -149,6 +189,14 @@ export default {
     },
     title(newV, oldV) {
       this.title = newV
+    },
+    isDelete: {
+      handler(newV, old) {
+        this.isDeleteStatus = newV
+        console.log(this.isDeleteStatus)
+      },
+      immediate: true,
+      deep: true
     }
   },
   created() {
@@ -173,10 +221,10 @@ export default {
         desc: obj.desc,
         dayList: [obj.dayList[0], obj.dayList[obj.dayList.length - 1]] // 日期列表
       }
-      console.log(this.form)
       this.detailDayList = obj.dayList || []
       this.schedule = obj.seperateDaysNoHoliday
       this.tasksDetailList = obj.taskObjectList || []
+      this.peopleObjectList = obj.peopleObjectList.map(item => item.name) || []
     },
     async getType() {
       const resEnum = await configShowTaskEnum()
@@ -209,6 +257,7 @@ export default {
       const isEx = this.tasksDetailList.find(item => item.id === id)
       if (isEx) {
         this.$message({ message: '任务已存在', type: 'warning', duration: 1000, offset: 150 })
+        this.selectTask = null
         return false
       }
       const res = this.tasksOptions.find(item => {
@@ -251,7 +300,19 @@ export default {
       this.$emit('update')
       this.cancel()
     },
+    async scheduleDelete() { // 删除排期
+      const res = await scheduleDelete(this.form.id)
+      if (res.code === 200) {
+        this.$message({ message: '删除成功', type: 'success', duration: 1000, offset: 150 })
+      }
+      this.$emit('update')
+      this.cancel()
+    },
     confirmForm() { // 确认提交表单
+      if (this.isDeleteStatus) {
+        this.scheduleDelete()
+        return
+      }
       this.$refs['form'].validate((valid) => {
         if (valid) {
           const params = _.cloneDeep(this.form)
@@ -262,7 +323,9 @@ export default {
     },
     cancel() { // 关闭弹框
       this.show = false
+      this.isDeleteStatus = false
       this.$emit('update:visible', this.show)
+      this.$emit('update:isDelete', this.isDeleteStatus)
     }
   }
 }
@@ -289,6 +352,14 @@ article {
 .task-list-show {
   width: 100%;
   padding: 0 60px;
+  p {
+    color: #666666;
+    font-size: 14px;
+    margin-bottom: 20px;
+  }
+  span {
+    color: #333333;
+  }
   .task-list-item {
     width: 100%;
     display: flex;
@@ -315,4 +386,36 @@ article {
     }
   }
 }
+.danger-img {
+  width: 100%;
+  padding: 0 60px 50px 60px;
+  margin-bottom: 50px;
+  position: relative;
+  img {
+    height: 50px;
+    width: 50px;
+    position: absolute;
+    left: 50%;
+    transform: translate(-50%,0);
+  }
+}
+.delete-title {
+  width: 100%;
+  padding: 0 60px 100px 60px;
+  color: #333B4A;
+  font-size: 18px;
+  text-align: center;
+}
+.people-list-show {
+  width: 100%;
+  padding: 0 60px 50px 60px;
+  p {
+    color: #666666;
+    font-size: 14px;
+    margin-bottom: 20px;
+  }
+  span {
+    color: #333333;
+  }
+}
 </style>

+ 11 - 27
src/views/projectManage/requirement/components/scheduleList.vue

@@ -67,7 +67,7 @@
       >
         <template slot-scope="scope">
           <el-button type="text" size="small" @click="editSchedule(scope.row)">编辑</el-button>
-          <el-button type="text" size="small" @click="confirmDel(scope.row)">删除</el-button>
+          <el-button type="text" size="small" @click="deleteSchedule(scope.row)">删除</el-button>
         </template>
       </el-table-column>
 
@@ -83,6 +83,7 @@
     <modify-schedule
       v-if="visibleSchedule"
       :visible.sync="visibleSchedule"
+      :is-delete.sync="isDelete"
       :detail-data="detailData"
       :title="DialogTitle"
       @update="listByTask(id)"
@@ -94,7 +95,7 @@ import Sortable from 'sortablejs'
 import moment from 'moment'
 import 'moment/locale/zh-cn'
 import { listByRequire } from '@/api/requirement.js'
-import { listByTask, scheduleDelete, sortForTask } from '@/api/projectViewDetails'
+import { listByTask, sortForTask } from '@/api/projectViewDetails'
 import modifySchedule from './modifySchedule'
 import move from '@/assets/麻将@2x.png'
 export default {
@@ -141,7 +142,8 @@ export default {
       visibleSchedule: false,
       detailData: null,
       taskScheduleEvent: [], // 排期类型
-      DialogTitle: '新建排期'
+      DialogTitle: '新建排期',
+      isDelete: false // 删除排期操作
     }
   },
   watch: {
@@ -158,9 +160,7 @@ export default {
       immediate: true
     }
   },
-  created() {
-    console.log(this.noMove)
-  },
+
   mounted() {
     this.rowDrop()
   },
@@ -187,7 +187,6 @@ export default {
       return res.msg
     },
     async listByTask(id) { // 获取排期列表
-      console.log(this.all)
       const res = this.all ? await listByRequire(id) : await listByTask(id)
       if (res.code === 200) {
         this.scheduleList = res.data.schedulDetailResponses
@@ -203,26 +202,11 @@ export default {
       this.DialogTitle = '新建排期'
       this.visibleSchedule = true
     },
-    confirmDel(row) {
-      this.$confirm('是否删除排期?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }).then(() => {
-        this.deleteSchedule(row)
-      }).catch(() => {
-        this.$message({
-          type: 'info',
-          message: '已取消删除'
-        })
-      })
-    },
-    async deleteSchedule(row) { // 删除排期
-      const res = await scheduleDelete(row.id)
-      if (res.code === 200) {
-        this.listByTask(this.id)
-        this.$message({ message: '删除成功', type: 'success', duration: 1000, offset: 150 })
-      }
+    deleteSchedule(row) { // 删除排期
+      this.DialogTitle = '删除排期'
+      this.isDelete = true
+      this.visibleSchedule = true
+      this.detailData = row
     },
     editSchedule(row) { // 编辑排期
       this.DialogTitle = '编辑排期'