bugTableDialog.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  1. <template>
  2. <div ref="bugBg">
  3. <div v-if="showQuery" class="Layout_space_between">
  4. <div class="bug-Status">快速筛选:
  5. <span v-for="item in statusList" :key="item.value">
  6. <span class="bug-statusList" :class="[statusNum === item.value ? 'bug-color' : 'bug-bgColor']" @click="bugGetQueryList(item)">{{ item.name }}</span>
  7. </span>
  8. </div>
  9. <el-popover placement="bottom-end" width="400" trigger="click" :visible-arrow="false">
  10. <div class="bug-query">
  11. <div class="bug-queryTitle"> 筛选项 </div>
  12. <span class="el-icon-close bug-statusList" @click="clone" />
  13. </div>
  14. <el-form label-position="left" :model="bugFormQuery" label-width="100px" style="max-height: 450px;overflow-y: auto;">
  15. <el-form-item label="优先级">
  16. <el-select v-model="bugFormQuery.priorityLevels" multiple filterable clearable placeholder="请选择" size="medium" style="width:100%;">
  17. <el-option v-for="item in priorityLevelEnumList" :key="item.code" :label="item.name" :value="item.name" />
  18. </el-select>
  19. </el-form-item>
  20. <el-form-item label="缺陷状态">
  21. <el-select v-model="bugFormQuery.statusList" filterable multiple clearable placeholder="请选择" size="medium" style="width:100%;">
  22. <el-option v-for="item in bugEnumList" :key="item.code" :label="item.name" :value="item.code" />
  23. </el-select>
  24. </el-form-item>
  25. <el-form-item label="缺陷等级">
  26. <el-select v-model="bugFormQuery.priorityList" filterable multiple clearable placeholder="请选择" size="medium" style="width:100%;">
  27. <el-option v-for="item in priorityEnumList" :key="item.code" :label="item.name" :value="item.code" />
  28. </el-select>
  29. </el-form-item>
  30. <el-form-item label="缺陷类型">
  31. <el-cascader v-model="bugFormQuery.theBugTypes" :options="theBugTypeEnumList" :props="{ value:'code', label:'name', children: 'childrenEnums', multiple: true, emitPath: false}" clearable placeholder="请选择" size="medium" style="width:100%;" />
  32. </el-form-item>
  33. <el-form-item label="提报人">
  34. <searchPeople :value.sync="bugFormQuery.creators" :multiple="true" :size="'medium'" style="width: 100%;" />
  35. </el-form-item>
  36. <el-form-item label="责任人">
  37. <search-people :value.sync="bugFormQuery.assigners" :multiple="true" :size="'medium'" style="width: 100%;" />
  38. </el-form-item>
  39. <el-form-item label="修复人">
  40. <searchPeople :value.sync="bugFormQuery.currentHandlers" :multiple="true" :size="'medium'" style="width: 100%;" />
  41. </el-form-item>
  42. <div class="Reopen">
  43. <div style="width: 77px; padding-right: 12px; margin-right: 23px;">是否发生Reopen</div>
  44. <el-select v-model="bugFormQuery.reopenTimes" filterable placeholder="请选择" size="medium" style="width:73%;">
  45. <el-option v-for="item in reopens" :key="item.code" :label="item.name" :value="item.code" />
  46. </el-select>
  47. </div>
  48. <el-form-item v-if="dataShow !== 'taskName'" label="所属任务">
  49. <el-select v-model="bugFormQuery.taskIds" filterable multiple clearable placeholder="请选择" size="medium" style="width:100%;">
  50. <el-option v-for="item in taskEnumList" :key="item.id" :label="item.name" :value="item.id">
  51. <div class="belong-task">
  52. <div class="task-id">{{ item.id }}</div>
  53. <div class="modules-name">
  54. <span class="name">{{ item.name }}</span>
  55. <span v-if="item.bizIdString" class="modules">{{ item.bizIdString }}</span>
  56. </div>
  57. </div>
  58. </el-option>
  59. </el-select>
  60. </el-form-item>
  61. </el-form>
  62. <div class="bug-footer">
  63. <el-button class="bug-botton" @click="bugFormQuery = {}">重置</el-button>
  64. <el-button class="bug-botton" style="margin-left: 20px;" type="primary" @click="bugGetTableList(bugFormQuery, false, 2)">筛选</el-button>
  65. </div>
  66. <div slot="reference" class="bug-Status" style="cursor: pointer;" @click="bugClickIcon"><svg-icon v-if="bugIcon" icon-class="筛选" /><svg-icon v-if="!bugIcon" icon-class="筛选1" /></div>
  67. </el-popover>
  68. </div>
  69. <el-table
  70. size="small"
  71. :data="tableData"
  72. class="bug_tableHeader"
  73. show-overflow-tooltip="true"
  74. :header-cell-style="{ color: '#4A4A4A', fontSize: '14px', fontWeight: '500' }"
  75. row-key="id"
  76. >
  77. <el-table-column label="优先级" prop="priorityCode" min-width="100" sortable align="center">
  78. <template slot-scope="scope" style="text-align: center;">
  79. <span class="div_priority" :class="[{'priority_color': scope.row.priorityLevel === 'High'},{'priority_color1': scope.row.priorityLevel === 'Medium'},{'priority_color3': scope.row.priorityLevel === 'Low'}]">
  80. {{ scope.row.priorityLevel.substring(0, 1) }}
  81. </span>
  82. </template>
  83. </el-table-column>
  84. <el-table-column prop="bugName" label="缺陷标题" min-width="360" align="left" show-overflow-tooltip>
  85. <template slot-scope="scope">
  86. <span style=" color: #A7AEBC; font-size: 10px;">{{ 'BUG-' + scope.row.id }}</span>
  87. <br>
  88. <span class="bugNameSty" @click.stop="click_bugName(scope.row.id)">{{ scope.row.bugName }}</span>
  89. </template>
  90. </el-table-column>
  91. <el-table-column prop="priorityName" label="缺陷等级" align="center" />
  92. <el-table-column prop="bugStatusName" label="状态" min-width="110" align="center">
  93. <template slot-scope="scope">
  94. <statusChange :status-code="Number(scope.row.status)" :bug-data="scope.row" :status-obj="statusObj" />
  95. </template>
  96. </el-table-column>
  97. <el-table-column v-if="dataShow !== 'taskName'" prop="taskName" label="所属任务" align="center" min-width="250" show-overflow-tooltip />
  98. <el-table-column prop="creatorList" label="提报人" align="center" />
  99. <el-table-column prop="assignerList" label="责任人" min-width="150" align="center" show-overflow-tooltip />
  100. <el-table-column prop="currentHandlerList" label="修复人" min-width="150" align="center" show-overflow-tooltip />
  101. <el-table-column prop="gmtCreate" label="创建日期" min-width="120" align="center">
  102. <template slot-scope="scope">{{ scope.row.gmtCreate | naspOut }}</template>
  103. </el-table-column>
  104. </el-table>
  105. <div align="right">
  106. <el-pagination
  107. :current-page.sync="currentPage"
  108. :page-sizes="[15, 20, 30]"
  109. :page-size="pageSize"
  110. background
  111. layout="total, sizes, prev, pager, next, jumper"
  112. :total="total"
  113. @current-change="handleCurrentChange"
  114. @size-change="handleSizeChange"
  115. />
  116. </div>
  117. <el-drawer v-if="drawerShow" :visible.sync="drawerShow" :modal="false" :with-header="false" size="50%" class="bug_manage_drawer" @click.stop>
  118. <div @click.stop>
  119. <bug-details
  120. :id="bugQuery.id"
  121. ref="bugDetails"
  122. :type="'drawer'"
  123. :drawer-show="drawerShow"
  124. @close="drawerShow = false"
  125. @delete="getBugSelfList"
  126. @update="getBugList"
  127. />
  128. </div>
  129. </el-drawer>
  130. </div>
  131. </template>
  132. <script>
  133. const _ = require('lodash')
  134. import { mapGetters } from 'vuex'
  135. import statusChange from '@/views/projectManage/bugList/details/statusChange'
  136. import { bugList, bugGetEnum, taskListGet } from '@/api/defectManage'
  137. import BugDetails from './index'
  138. import '@/styles/PublicStyle/index.scss'
  139. import searchPeople from '@/components/select/searchPeople' // 人员select
  140. export default {
  141. components: {
  142. statusChange,
  143. BugDetails,
  144. searchPeople
  145. },
  146. filters: {
  147. naspOut(value) {
  148. if (!value) return ''
  149. var da = value.split(/\s+/)
  150. return da[0]
  151. }
  152. },
  153. props: {
  154. noShow: {
  155. type: String,
  156. default: '',
  157. required: false
  158. },
  159. objId: {
  160. type: Object,
  161. default: null
  162. },
  163. showHide: {
  164. type: Boolean,
  165. default: false
  166. }
  167. },
  168. data() {
  169. return {
  170. bugIcon: true,
  171. statusNum: null,
  172. showQuery: false,
  173. theBugTypeEnumList: [],
  174. dataShow: '',
  175. priorityLevelEnumList: [], // 优先级
  176. bugEnumList: [], // 缺陷类型
  177. priorityEnumList: [], // 缺陷等级
  178. bugFormQuery: {
  179. theBugTypes: []
  180. },
  181. reopens: [{ code: 1, name: '是' }, { code: 0, name: '否' }],
  182. statusList: [{ value: null, name: '全部' }, { value: -1, name: '未完成' }, { value: 0, name: '待修复' }, { value: 2, name: '待测试' }, { value: 3, name: '已完成' }],
  183. tableData: [], // tableData
  184. taskEnumList: [], // 所属任务
  185. pageSize: 15, // 分页
  186. curIndex: 1, // 分页
  187. currentPage: 1,
  188. total: 0, // 总数
  189. bugQuery: '', // bug详情
  190. drawerShow: false, // drawer展示
  191. queryData: {}, // 查询条件
  192. data: {}, // 查询条件
  193. eleId: {},
  194. statusObj: null // 状态对象
  195. }
  196. },
  197. computed: {
  198. ...mapGetters(['bizId']),
  199. clickCount() {
  200. return this.$store.state.app.clickCount
  201. }
  202. },
  203. watch: {
  204. clickCount(newVal, oldVal) {
  205. this.drawerShow = false
  206. },
  207. noShow: {
  208. handler(newV, oldV) {
  209. this.dataShow = newV
  210. },
  211. deep: true,
  212. immediate: true
  213. },
  214. objId: {
  215. handler(newV, oldV) {
  216. if (newV !== null) {
  217. this.eleId = newV
  218. }
  219. },
  220. deep: true,
  221. immediate: true
  222. },
  223. bizId: {
  224. handler(newV) {
  225. if (newV === -1) return
  226. this.getBugSelect()
  227. this.bugGetTableList(this.queryData, false)
  228. },
  229. immediate: true
  230. },
  231. showHide: {
  232. handler(newV) {
  233. this.showQuery = newV
  234. },
  235. immediate: true
  236. }
  237. },
  238. mounted() {
  239. this.$nextTick(() => {
  240. this.bugGetTableList(this.eleId, false)
  241. })
  242. },
  243. methods: {
  244. async getBugSelect() { // 获取下拉菜单option
  245. const res = await bugGetEnum()
  246. if (res.code === 200) {
  247. this.priorityLevelEnumList = res.data.priorityLevelEnumList // 优先级
  248. this.bugEnumList = res.data.bugEnumList // status
  249. this.priorityEnumList = res.data.priorityEnumList // 缺陷等级
  250. this.theBugTypeEnumList = this.deleteChild(res.data.theBugTypeEnumList) // 缺陷类型
  251. this.theBugTypeEnumList[0].code = '0'
  252. this.statusObj = {
  253. bugEnumList: res.data.bugEnumList, // status
  254. repairResultEnumList: res.data.repairResultEnumList, // 修复结果
  255. bugReasonEnumList: res.data.bugReasonEnumList, // 缺陷原因
  256. theBugTypeEnumList: this.theBugTypeEnumList, // 缺陷类型
  257. priorityEnumList: res.data.priorityEnumList // 缺陷等级
  258. }
  259. }
  260. if (this.dataShow !== 'taskName') {
  261. const res = await taskListGet(this.eleId)
  262. if (res.code === 200) {
  263. this.taskEnumList = res.data || []
  264. }
  265. }
  266. },
  267. deleteChild(arr) { // 删除无用子属性
  268. const bfs = arr => {
  269. arr.forEach(item => {
  270. if (!item.childrenEnums || item.childrenEnums.length === 0) {
  271. delete item.childrenEnums
  272. } else {
  273. this.deleteChild(item.childrenEnums)
  274. }
  275. })
  276. }
  277. bfs(arr)
  278. return arr
  279. },
  280. bugGetQueryList(e) {
  281. this.bugIcon = true
  282. this.statusNum = e.value
  283. this.$set(this.bugFormQuery, 'theBugTypes', '')
  284. this.bugFormQuery = {}
  285. this.bugGetTableList(this.bugFormQuery, false, 1)
  286. },
  287. bugGetTableList(e, index, vel) {
  288. this.queryData = e
  289. this.data = {}
  290. if (index) {
  291. this.currentPage = 1
  292. this.curIndex = 1
  293. }
  294. if (vel === 1) {
  295. this.data.status = this.statusNum
  296. } else if (vel === 2) {
  297. this.data = _.cloneDeep(this.queryData)
  298. this.statusNum = ''
  299. } else {
  300. this.data = _.cloneDeep(this.queryData)
  301. this.statusNum = null
  302. }
  303. this.data.bizId = this.bizId
  304. this.data.pageSize = this.pageSize
  305. this.data.curIndex = this.curIndex
  306. const query = Object.assign(this.data, this.eleId)
  307. bugList(query).then(res => {
  308. if (res.code === 200) {
  309. this.tableData = res.data.map(item => { return { ...item, isSelected: false } })
  310. this.total = res.total
  311. this.$emit('curIndexs', this.data)
  312. this.$refs.bugBg.click()
  313. }
  314. })
  315. },
  316. bugClickIcon() {
  317. this.bugIcon = false
  318. this.statusNum = 44
  319. },
  320. getBugList() {
  321. this.bugGetTableList(this.queryData, false)
  322. },
  323. getBugSelfList() {
  324. this.bugGetTableList(this.queryData, false)
  325. this.$nextTick(() => {
  326. this.drawerShow = false
  327. })
  328. },
  329. handleSizeChange(val) {
  330. this.pageSize = val
  331. this.bugGetTableList(this.queryData, false)
  332. },
  333. clone() {
  334. this.bugIcon = false
  335. this.$refs.bugBg.click()
  336. },
  337. handleCurrentChange(val) { // 分页
  338. this.curIndex = val
  339. this.bugGetTableList(this.queryData, false)
  340. },
  341. click_bugName(e) {
  342. this.bugQuery = JSON.parse(
  343. JSON.stringify(this.tableData.filter(value => value.id === e)[0])
  344. )
  345. this.drawerShow = true
  346. }
  347. }
  348. }
  349. </script>
  350. <style scoped lang="scss">
  351. .Reopen {
  352. display: flex;
  353. margin-bottom: 22px;
  354. font-size: 14px;
  355. color: #606266;
  356. font-weight: 700;
  357. }
  358. .bug_tableHeader {
  359. width: 100%;
  360. font-size: 14px;
  361. color:rgba(102,102,102,1);
  362. }
  363. .div_priority {
  364. text-align: center;
  365. color: #ffffff;
  366. padding: inherit;
  367. border-radius: 4px;
  368. margin-right: 14%;
  369. width: 35px;
  370. display: inline-block;
  371. }
  372. .bugNameSty:hover {
  373. cursor: pointer;
  374. color: #409EFF !important;
  375. }
  376. .bug_manage_drawer .el-drawer__header{
  377. margin-bottom: 15px;
  378. }
  379. .no-sidebar .bug_manage_drawer {
  380. pointer-events: none;
  381. margin-top: 10px;
  382. }
  383. .open-sidebar .bug_manage_drawer {
  384. pointer-events: none;
  385. }
  386. .top-sidebar .bug_manage_drawer {
  387. pointer-events: none;
  388. margin-top: 70px;
  389. }
  390. .bug_manage_drawer .el-drawer{
  391. pointer-events: auto;
  392. }
  393. </style>
  394. <style lang="scss" scoped>
  395. .bug-Status {
  396. line-height: 60px;
  397. padding: 0 30px;
  398. }
  399. .bug-bgColor {
  400. color: #606266;
  401. }
  402. .bug-color {
  403. color: #409eff;
  404. }
  405. .bug-statusList:hover {
  406. color: #409eff;
  407. cursor: pointer;
  408. }
  409. .bug-statusList {
  410. margin: 0 10px;
  411. }
  412. .bug-query {
  413. text-align: center;
  414. display: flex;
  415. line-height: 40px;
  416. margin-bottom: 20px;
  417. border-bottom: 1px solid #eeeeee;
  418. }
  419. .bug-queryTitle {
  420. flex: 1;
  421. }
  422. .bug-footer {
  423. text-align: right;
  424. border-top: 1px solid #eeeeee;
  425. }
  426. .bug-botton {
  427. margin:10px 0 0;
  428. }
  429. .belong-task {
  430. max-width: 500px;
  431. display: flex;
  432. .modules-name {
  433. width: calc(100% - 100px);
  434. overflow: hidden;
  435. text-overflow: ellipsis;
  436. white-space: nowrap;
  437. }
  438. .modules {
  439. color: #999999;
  440. }
  441. .task-id {
  442. color: #999999;
  443. width: 80px;
  444. margin-right: 20px;
  445. }
  446. .name {
  447. color: #333333;
  448. margin-right: 20px;
  449. }
  450. }
  451. </style>