index.vue 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312
  1. <template>
  2. <el-drawer
  3. class="content-wrapper"
  4. :modal="false"
  5. size="100%"
  6. :class="drawerBox"
  7. destroy-on-close
  8. :visible.sync="drawer"
  9. :before-close="handleClose"
  10. @click.stop
  11. @open="setBoxShadow('')"
  12. @opened="setBoxShadow"
  13. @close="setBoxShadow('')"
  14. >
  15. <template slot="title">
  16. <div v-if="title" @click.stop>{{ title }}<span class="sub-title">{{ subTitle }}</span></div>
  17. </template>
  18. <!-- 时间线 -->
  19. <div
  20. v-if="openDrawer && isTimeLine(1)"
  21. class="drawer-padding drawer-header"
  22. :style="{paddingTop: !isTimeLine(2) ? '30px':'10px'}"
  23. @click.stop
  24. >
  25. <div id="index" ref="timeline1" class="drawer-scll">
  26. <timeline
  27. :num="timelineData.firstActive"
  28. bg-margin
  29. :data="timelineData.first"
  30. @update="(params) => timeLineClick(params, 1)"
  31. />
  32. </div>
  33. <div v-if="isTimeLine(2)" ref="timeline2" class="drawer-scll">
  34. <timeline
  35. :num="timelineData.secondActive"
  36. :data="timelineData.second"
  37. bg-margin
  38. @update="(params)=>timeLineClick(params, 2)"
  39. />
  40. </div>
  41. </div>
  42. <!-- 表格 -->
  43. <dmTable
  44. v-if="openDrawer"
  45. v-loading="loading"
  46. :table-list="tableList"
  47. :total="tableList"
  48. :column="column"
  49. :table-height="tableHeight"
  50. @click.stop
  51. @change="dmTableChange"
  52. >
  53. <template #bugStatusNameSlot="{scope}">
  54. <div @click.stop="print(scope)">自定义</div>
  55. </template>
  56. <!-- 改进项:级别 -->
  57. <template #improvementsOverRateColumnsPrioritySlot="{scope}">
  58. <div v-if="scope.row.caseName" @click.stop>
  59. <a target="_blank" :href="scope.row.url">{{ scope.row.caseName }}</a>
  60. </div>
  61. </template>
  62. <!-- 改进项:状态 -->
  63. <template #improvementsOverRateColumnsStatusSlot="{scope}">
  64. <div v-if="scope.row.status" @click.stop>
  65. {{ scope.row.status }} <el-tag v-if="scope.row.tag" size="mini" type="danger" effect="dark">{{ scope.row.tag }}</el-tag>
  66. </div>
  67. </template>
  68. <!-- 报告名称 -->
  69. <template #returnReasonSlot="{scope}">
  70. <div v-if="scope.row.reportName" @click.stop>
  71. <div class="drawer-name" @click.stop="jumper(scope.row,'提测')">{{ scope.row.reportName }}</div>
  72. <div v-if="scope.row.returnReason" style="color: red">打开报告:{{ scope.row.returnReason }}</div>
  73. </div>
  74. </template>
  75. <!-- 报告人 -->
  76. <template #creatorObjectSlot="{scope}">
  77. <div v-if="scope && scope.row && scope.row.creatorObject" @click.stop>{{ scope.row.creatorObject.name }}</div>
  78. </template>
  79. <!-- 质量:线上问题_改进方案 -->
  80. <template #starFlowerDoneSlot="{scope}">
  81. <div @click.stop>
  82. <div>{{ scope.row.done + scope.row.undone }}项任务</div>
  83. <div
  84. v-if="scope.row.done === scope.row.done + scope.row.undone"
  85. class="antdv3-tag antdv3-tag-green"
  86. >
  87. 已完成:{{ scope.row.done }}项
  88. </div>
  89. <div v-else class="antdv3-tag antdv3-tag-orange">已完成:{{ scope.row.done }}项</div>
  90. </div>
  91. </template>
  92. <!-- 质量:线上问题_改进方案 -->
  93. <template #gmtCreateSlot="{scope}">
  94. <div @click.stop>
  95. <div>{{ rTime(scope.row.startTime) }}</div>
  96. </div>
  97. </template>
  98. <!-- 质量:上线次数 -->
  99. <template #deployStartTsSlot="{scope}">
  100. <div @click.stop>
  101. <div>{{ moment(scope.row.deployStartTs * 1000).format("YYYY-MM-DD HH:mm:ss") }}</div>
  102. </div>
  103. </template>
  104. </dmTable>
  105. <!-- 下拉 -->
  106. <div class="footer-laout" @click.stop>
  107. <div v-if="exportTableList.isShow.indexOf(drawerData.label) > -1" style="margin-top: 10px;">
  108. <el-button type="primary" size="mini" @click="exportTable">导出</el-button>
  109. </div>
  110. <el-pagination
  111. style="line-height: 60px;"
  112. :current-page.sync="paging.curIndex"
  113. :page-size="paging.pageSize"
  114. :pager-count="5"
  115. layout="total, sizes, prev, pager, next, jumper"
  116. :page-sizes="[10, 15, 20, 30]"
  117. :total="paging.pageTotal"
  118. @size-change="handleSizeChange"
  119. @current-change="handleCurrentChange"
  120. />
  121. </div>
  122. </el-drawer>
  123. </template>
  124. <script>
  125. // import { mapGetters } from 'vuex'
  126. import { bugList } from '@/api/defectManage'
  127. import _ from 'lodash'
  128. import moment from 'moment'
  129. import { getReportList } from '@/api/reportTemplate'
  130. import dmTable from '@/components/baseTable/table'
  131. // import timeline from '@/components/timeline/index'
  132. import timeline from './components/timeline'
  133. import { columns, timelineList, exportTableList } from './drawerModalData'
  134. import { EncryptId } from '@/utils/crypto-js'
  135. import Clickoutside from 'element-ui/src/utils/clickoutside'
  136. import { requirementQueryRequirementInfoList, taskList } from '@/api/projectIndex'
  137. Object.freeze(exportTableList)
  138. import {
  139. // 质量
  140. getRequireAvgData, // 需求平均交付周期
  141. getTaskData, // 任务平均交付周期
  142. getRequirePeopleData, // 平均需求使用人力
  143. getTaskPeopleData, // 平均任务使用人力
  144. getDelayLaunchData, // 延期提测率
  145. getDelayReleaseData, // 延期准出率
  146. bugRepairData, // 缺陷24小时修复率
  147. bugRepair2Data, // 缺陷平均修复时长
  148. getStarFlowerList, // 线上问题:半浮层 列表
  149. getProjectList, // 需求任务项目列表: 半浮层
  150. getOdinJobList, // 获取上线过程列表
  151. dataMarketQualityGetImproveList, // 线上问题-改进项半浮层
  152. dataMarketDownload // 导出
  153. } from '@/api/dataMarket'
  154. export default {
  155. name: 'DrawerModal',
  156. components: {
  157. dmTable, timeline
  158. },
  159. directives: { Clickoutside },
  160. props: {
  161. // title: {
  162. // type: String,
  163. // required: false,
  164. // default: ''
  165. // },
  166. // subTitle: {
  167. // type: String,
  168. // required: false,
  169. // default: ''
  170. // },
  171. openDrawer: {
  172. type: Boolean,
  173. required: false,
  174. default: false
  175. },
  176. drawerData: {
  177. type: Object,
  178. required: false,
  179. default: () => {}
  180. }
  181. },
  182. data() {
  183. return {
  184. drawer: false,
  185. loading: false,
  186. title: '',
  187. headerTitle: '',
  188. // timelineData,
  189. tableList: [],
  190. tableListOld: [],
  191. tableHeight: 'auto',
  192. column: [],
  193. ids: [],
  194. label: '',
  195. exportTableList,
  196. activeLabel: '',
  197. drawerBox: '',
  198. subTitle: '',
  199. sourceData: null,
  200. /* S 新增缺陷*/
  201. priorityList: [],
  202. /* E 新增缺陷*/
  203. timelineData: {
  204. first: [],
  205. firstActive: 0,
  206. second: [],
  207. secondActive: 0
  208. },
  209. paging: {
  210. curIndex: 1,
  211. pageTotal: 0,
  212. pageSize: 10
  213. }
  214. }
  215. },
  216. watch: {
  217. drawerData(v, o) {
  218. // if (JSON.stringify(v) !== JSON.stringify(o)) {
  219. // this.init()
  220. // }
  221. this.init()
  222. },
  223. openDrawer(value) {
  224. this.drawer = value
  225. }
  226. },
  227. mounted() {
  228. this.drawer = false
  229. },
  230. methods: {
  231. moment,
  232. print(slotProp) {
  233. console.log(slotProp)
  234. },
  235. init() {
  236. // console.log(this.drawerData, 210)
  237. this.headerTitle = this.drawerData.headerTitle
  238. this.title = this.headerTitle.search(/质量|效率/) > -1 ? this.drawerData.label || '' : this.drawerData.activeLabel
  239. console.log(this.drawerData.label)
  240. if (this.headerTitle && this.title) {
  241. // console.log(this.drawerData)
  242. this.pagingInit()
  243. this.setPageSize()
  244. this.column = []
  245. this.tableList = []
  246. this.drawer = this.openDrawer
  247. this.setTitle()
  248. this.setIds() // 设置ids
  249. this.setTimeLineData()
  250. this.setTitleHeight()
  251. this.setTimeLine()
  252. this.setColumn()
  253. this.setTableList()
  254. } else {
  255. this.handleClose()
  256. }
  257. },
  258. // 设置页数
  259. setPageSize() {
  260. const pageSize = window.localStorage.getItem('pageSize') || 10
  261. // this.paging.pageSize = pageSize
  262. const paging = _.cloneDeep(this.paging)
  263. paging.pageSize = Number.parseInt(pageSize)
  264. this.paging = _.cloneDeep(paging)
  265. // console.log(this.paging, 250)
  266. },
  267. // 设置标题
  268. setTitle() {
  269. // this.title = this.headerTitle.search(/质量|效率/) > -1 ? this.drawerData.label : this.drawerData.activeLabel
  270. if (this.headerTitle === '质量') {
  271. if (this.drawerData.label === '提测打回率') {
  272. this.title = '提测报告'
  273. }
  274. if (this.drawerData.label === '准出不通过率') {
  275. this.title = '准出记录'
  276. }
  277. if (this.drawerData.label === '改进项完成率') {
  278. this.title = '改进项'
  279. }
  280. if (this.drawerData.moduleName && this.drawerData.moduleName === '回滚次数') {
  281. this.title = !this.drawerData.index ? '回滚次数' : this.drawerData[this.drawerData.itemKey].label
  282. }
  283. }
  284. if (this.headerTitle === '效率') {
  285. this.activeLabel = this.drawerData.activeLabel
  286. if (this.drawerData.label === '需求平均交付周期') {
  287. this.title = '需求周期'
  288. }
  289. if (this.drawerData.label === '任务平均交付周期') {
  290. this.title = '任务周期'
  291. }
  292. if (this.drawerData.label === '平均需求使用人力') {
  293. this.title = '需求人力'
  294. }
  295. if (this.drawerData.label === '平均任务使用人力') {
  296. this.title = '任务人力'
  297. }
  298. if (this.drawerData.label === '缺陷平均修复时长') {
  299. this.title = '缺陷修复时长'
  300. }
  301. }
  302. this.sourceData = this.drawerData.list
  303. if (this.headerTitle === '效率' && this.title && this.title.search(/延期准出率|延期提测率/) < 0) {
  304. this.sourceData = [
  305. {
  306. label: this.drawerData.label === '缺陷24小时修复率' ? '全部' : this.drawerData.label,
  307. IdList: this.drawerData.idList
  308. },
  309. ...this.drawerData.subCountList
  310. ]
  311. }
  312. },
  313. // 处理日期格式:JS - 2020-01-01T00:00:00.000000Z 日期格式转换
  314. rTime(date) {
  315. if (!date) return ''
  316. var json_date = new Date(date).toJSON()
  317. return new Date(new Date(json_date) + 8 * 3600 * 1000).toISOString().replace(/T/g, ' ').replace(/\.[\d]{3}Z/, '')
  318. },
  319. // 设置ids
  320. setIds() {
  321. if (this.headerTitle === '质量' && !this.drawerData.moduleName) {
  322. if (this.drawerData.label === '改进项完成率') {
  323. // if (this.drawerData.hasOwnProperty('subCountItem')) {
  324. // const { subItemList, subIndex } = this.drawerData.subCountItem
  325. // this.ids = subItemList[subIndex].idList.map(e => e)
  326. // } else {
  327. // this.ids = this.drawerData.idList.map(e => e)
  328. // }
  329. this.ids = this.drawerData.IdList.map(e => e)
  330. } else {
  331. this.ids = this.drawerData.IdList.map(e => e)
  332. }
  333. }
  334. if (this.drawerData.moduleName && this.drawerData.moduleName === '上线过程') {
  335. this.ids = this.drawerData.IdList.map(e => e)
  336. }
  337. if (this.drawerData.moduleName && this.drawerData.moduleName === '回滚次数') {
  338. this.ids = this.drawerData[this.drawerData.itemKey].idList.map(e => e)
  339. }
  340. if (this.headerTitle === '吞吐量') {
  341. this.drawerData.list.forEach(elm => {
  342. if (elm.label === this.drawerData.activeLabel && elm.idList) {
  343. this.ids = elm.idList.map(e => e)
  344. }
  345. })
  346. }
  347. if (this.headerTitle === '效率') {
  348. this.ids = this.drawerData.idList.map(e => e) // 提测报告
  349. }
  350. },
  351. // 设置时间轴
  352. setTimeLineData() {
  353. let { firstActive, first, secondActive, second } = this.timelineData
  354. if (this.title.search(/新增问题|提测报告|准出记录/) < 0) {
  355. if (this.headerTitle === '质量') {
  356. if (this.title.search(/新增缺陷|reopen/) > -1) {
  357. first = [...timelineList.newDefect]
  358. firstActive = 0
  359. }
  360. if (this.drawerData.moduleName && this.drawerData.moduleName === '上线过程') {
  361. first = [...timelineList.lineRate]
  362. // 免测上线率是1
  363. this.drawerData.index === 2 ? firstActive = 1 : firstActive = 0
  364. // console.log(first, firstActive)
  365. }
  366. if (this.drawerData.moduleName && this.drawerData.moduleName === '回滚次数') {
  367. first = [...timelineList.returnCase]
  368. firstActive = this.drawerData.index
  369. }
  370. if (this.title === '改进项') {
  371. secondActive = 0
  372. firstActive = 0
  373. first = [...timelineList.ImprovementsOverRate]
  374. second = [...timelineList.ImprovementsOverRateTwo]
  375. firstActive = this.drawerData.index
  376. if (this.drawerData.hasOwnProperty('subCountItem')) {
  377. if (this.drawerData.subCountItem.index === 3) {
  378. firstActive = 0
  379. secondActive = this.drawerData.subCountItem.subIndex + 1
  380. } else {
  381. firstActive = this.drawerData.subCountItem.index
  382. secondActive = this.drawerData.subCountItem.subIndex
  383. }
  384. }
  385. }
  386. }
  387. if (this.headerTitle === '吞吐量') {
  388. secondActive = 0
  389. firstActive = 0
  390. first = []
  391. this.sourceData.forEach((elm, index) => {
  392. if (this.title.indexOf(elm.label) > -1) {
  393. firstActive = index
  394. }
  395. first.push(elm.label)
  396. })
  397. if (this.title.search(/需求/) > -1) {
  398. first = [...timelineList.requirementData]
  399. }
  400. }
  401. if (this.headerTitle === '效率') {
  402. secondActive = 0
  403. firstActive = 0
  404. first = []
  405. second = []
  406. if (this.title === '缺陷24小时修复率') {
  407. first = [...timelineList.time]
  408. }
  409. if (this.title === '延期提测率') {
  410. first = [...timelineList.delayLaunchData]
  411. }
  412. if (this.title === '延期准出率') {
  413. first = [...timelineList.delayLaunchData2]
  414. }
  415. if (this.title.search(/延期提测率|延期准出率/) < 0) {
  416. this.sourceData.forEach((elm, index) => {
  417. let label = `${elm.label}`
  418. if (this.activeLabel === label) {
  419. if (this.title === '缺陷24小时修复率') {
  420. secondActive = index
  421. } else {
  422. firstActive = index
  423. }
  424. }
  425. if (this.title === '缺陷24小时修复率') {
  426. second.push(label)
  427. } else {
  428. if (index === 0) {
  429. if (label === '需求平均交付周期') {
  430. label = '需求交付周期'
  431. }
  432. if (label === '任务平均交付周期') {
  433. label = '任务交付周期'
  434. }
  435. if (label === '平均需求使用人力') {
  436. label = '需求使用人力'
  437. }
  438. if (label === '平均任务使用人力') {
  439. label = '任务使用人力'
  440. }
  441. if (this.drawerData.label === '缺陷平均修复时长') {
  442. label = '全部'
  443. }
  444. }
  445. first.push(label)
  446. }
  447. })
  448. }
  449. }
  450. this.timelineData = { firstActive, first, secondActive, second }
  451. }
  452. },
  453. handleClose() {
  454. this.drawer = false
  455. this.$emit('update:openDrawer', this.drawer)
  456. },
  457. handleSizeChange(value) {
  458. this.paging.pageSize = value
  459. const paging = _.cloneDeep(this.paging)
  460. paging.pageSize = value
  461. this.paging = _.cloneDeep(paging)
  462. window.localStorage.setItem('pageSize', value)
  463. if (this.headerTitle === '效率') {
  464. this.tableListPagination()
  465. } else {
  466. this.setTableList()
  467. }
  468. },
  469. handleCurrentChange(value) {
  470. // this.paging.curIndex = value
  471. const paging = _.cloneDeep(this.paging)
  472. paging.curIndex = value
  473. this.paging = _.cloneDeep(paging)
  474. // console.log(this.title)
  475. if (this.headerTitle === '效率') {
  476. this.tableListPagination()
  477. } else {
  478. this.setTableList()
  479. }
  480. },
  481. // 导出
  482. exportTable() {
  483. dataMarketDownload({
  484. ids: this.ids,
  485. title: this.drawerData.label
  486. }).then(res => {
  487. const aLink = document.createElement('a')
  488. const blob = new Blob([res], { type: 'application/vnd.ms-excel' })
  489. aLink.href = URL.createObjectURL(blob)
  490. aLink.download = this.drawerData.label + '.xlsx'
  491. aLink.style.display = 'none'
  492. aLink.click()
  493. })
  494. },
  495. // 格式化时间
  496. dateFomatter(date) {
  497. return date.substring(0, 10) + ' ' + date.substring(11, 19)
  498. },
  499. // 设置表格头
  500. setColumn() {
  501. if (this.title.search(/新增缺陷|reopen|缺陷24小时修复率/) > -1) {
  502. this.column = [...columns.bugColumn]
  503. }
  504. if (this.drawerData.moduleName && this.drawerData.moduleName === '上线过程') {
  505. this.column = [...columns.test_freeOn_lineRateIdListColumns]
  506. }
  507. if (this.drawerData.moduleName && this.drawerData.moduleName === '回滚次数') {
  508. // this.ids = this.drawerData[this.drawerData.itemKey].idList.map(e => e)
  509. this.column = [...columns.test_freeOn_lineRateIdListColumns]
  510. }
  511. if (this.title === '改进项') {
  512. this.column = [...columns.improvementsOverRateColumns]
  513. }
  514. if (this.title.search(/新增问题/) > -1) {
  515. this.column = [...columns.newQuestionColumns]
  516. }
  517. if (this.title.search(/提测报告|准出记录/) > -1) {
  518. this.column = [...columns.deliverTestReportIdListColumns]
  519. }
  520. if (this.headerTitle === '吞吐量') {
  521. if (this.title.search(/需求/) > -1) {
  522. this.column = [...columns.requirementListColumns]
  523. }
  524. if (this.title.search(/任务/) > -1) {
  525. this.column = [...columns.taskListColumns]
  526. }
  527. if (this.title.search(/项目/) > -1) {
  528. this.column = [...columns.projectListColumns]
  529. }
  530. }
  531. if (this.headerTitle === '效率') {
  532. let columnsKey = 'requirementColumns'
  533. if (this.title === '任务周期') {
  534. columnsKey = 'taskColumns'
  535. }
  536. if (this.title === '需求人力') {
  537. columnsKey = 'requirementPeopleColumns'
  538. }
  539. if (this.title === '任务人力') {
  540. columnsKey = 'taskPeopleColumns'
  541. }
  542. if (this.title === '延期提测率') {
  543. columnsKey = 'delayLaunchDataColumns'
  544. }
  545. if (this.title === '延期准出率') {
  546. columnsKey = 'delayReleaseData2Columns'
  547. }
  548. if (this.title.search(/缺陷修复时长|缺陷24小时修复率/) > -1) {
  549. columnsKey = 'bugRepairDataColumns'
  550. }
  551. // const columnsTipsKey = `${columnsKey}Tips`
  552. this.column = columns.efficiency[columnsKey].map((elm, index) => {
  553. // if (index === 2 && this.title.search(/任务周期|需求人力|任务人力|需求周期/) > -1) {
  554. // return columns.efficiency[columnsTipsKey][this.timelineData.firstActive || 0]
  555. // }
  556. return elm
  557. })
  558. }
  559. },
  560. // 时间轴点击事件
  561. timeLineClick({ value, name }, index) {
  562. this.pagingInit()
  563. this.ids = []
  564. if (index === 1) {
  565. if (this.headerTitle === '质量') {
  566. this.timelineData.firstActive = value || 0
  567. if (this.title.search(/新增缺陷|reopen/) > -1) {
  568. this.ids = this.drawerData.IdList.map(e => e)
  569. this.priorityList = value ? [value - 1] : []
  570. }
  571. if (this.drawerData.moduleName && this.drawerData.moduleName === '上线过程') {
  572. // console.log(this.drawerData.parent.list[value])
  573. // 免测上线是1 0是上线次数 2是裸奔上线
  574. this.ids = [...this.drawerData.parent.list[value === 1 ? 2 : 0].IdList]
  575. }
  576. if (this.drawerData.moduleName && this.drawerData.moduleName === '回滚次数') {
  577. const items = ['countStr', 'preCountStr', 'fullCountStr', 'lowCountStr']
  578. this.ids = [...this.drawerData[items[value]].idList]
  579. }
  580. if (this.title === '改进项') {
  581. this.ids = this.drawerData.IdList.map(e => e)
  582. this.priorityList = value ? [value - 1] : []
  583. }
  584. }
  585. if (this.headerTitle === '吞吐量') {
  586. this.timelineData.firstActive = value || 0
  587. if (this.sourceData[value || 0] && this.sourceData[value || 0].idList) {
  588. this.ids = this.sourceData[value || 0].idList
  589. this.title = name
  590. }
  591. }
  592. if (this.headerTitle === '效率') {
  593. this.timelineData.firstActive = value || 0
  594. if (this.title.search(/延期准出率|延期提测率/) > -1) {
  595. // this.ids = this.sourceData[value].IdList
  596. } else {
  597. this.timelineData.firstActive = value || 0
  598. this.ids = this.sourceData[value || 0].IdList
  599. }
  600. this.setColumn()
  601. }
  602. this.setTableList()
  603. }
  604. if (index === 2) {
  605. if (this.title === '改进项') {
  606. // console.log(593, value)
  607. this.timelineData.secondActive = value
  608. } else {
  609. this.timelineData.secondActive = value || 0
  610. this.ids = this.sourceData[value || 0].IdList
  611. // this.setTableList()
  612. }
  613. this.setTableList()
  614. }
  615. },
  616. // 设置列表数据
  617. setTableList() {
  618. this.tableList = []
  619. if (this.headerTitle === '质量') {
  620. if (this.title.search(/新增缺陷|reopen/) > -1) {
  621. // console.log(this.ids, 502)
  622. if (this.ids.length) {
  623. // console.log(504)
  624. this.loading = true
  625. this.getBugStatisticData()
  626. }
  627. }
  628. if (this.title.search(/新增问题/) > -1) {
  629. if (this.ids.length) {
  630. this.loading = true
  631. this.setStarFlowerList()
  632. }
  633. }
  634. if (this.title.search(/改进项/) > -1) {
  635. this.loading = true
  636. // console.log(624)
  637. this.dataMarketQualityGetImproveListFn()
  638. }
  639. if (this.title.search(/提测报告|准出记录/) > -1) {
  640. if (this.ids.length) {
  641. this.loading = true
  642. this.setReportList()
  643. }
  644. }
  645. if (this.drawerData.moduleName && (this.drawerData.moduleName === '上线过程' || this.drawerData.moduleName === '回滚次数')) {
  646. if (this.ids.length) {
  647. this.loading = true
  648. this.getOdinJobListFn()
  649. }
  650. }
  651. }
  652. if (this.headerTitle === '吞吐量') {
  653. if (this.title.search(/需求/) > -1) {
  654. if (this.ids.length) {
  655. this.loading = true
  656. this.getRequirementList()
  657. }
  658. }
  659. if (this.title.search(/任务/) > -1) {
  660. if (this.ids.length) {
  661. this.loading = true
  662. this.getTaskList()
  663. }
  664. }
  665. if (this.title.search(/项目/) > -1 && this.ids.length) {
  666. if (this.ids.length) {
  667. this.loading = true
  668. this.setProjectList()
  669. }
  670. }
  671. }
  672. if (this.headerTitle === '效率') {
  673. if (this.title === '需求周期') {
  674. if (this.sourceData[0].IdList.length) {
  675. this.loading = true
  676. this.setRequireAvgData()
  677. }
  678. }
  679. if (this.title === '任务周期') {
  680. this.loading = true
  681. if (this.sourceData[0].IdList.length) {
  682. this.loading = true
  683. this.setTaskData()
  684. }
  685. }
  686. if (this.title === '需求人力') {
  687. if (this.sourceData[0].IdList.length) {
  688. this.loading = true
  689. this.setRequirePeopleData()
  690. }
  691. }
  692. if (this.title === '任务人力') {
  693. if (this.sourceData[0].IdList.length) {
  694. this.loading = true
  695. this.setTaskPeopleData()
  696. }
  697. }
  698. if (this.title === '缺陷修复时长') {
  699. if (this.sourceData[0].IdList.length) {
  700. this.loading = true
  701. this.setBugRepair2Data()
  702. }
  703. }
  704. if (this.title === '缺陷24小时修复率') {
  705. if (this.sourceData[0].IdList.length) {
  706. this.loading = true
  707. this.setBugRepairData()
  708. }
  709. }
  710. if (this.title === '延期提测率') {
  711. if (this.drawerData.idList.length) {
  712. this.loading = true
  713. this.setDelayLaunchData()
  714. }
  715. }
  716. if (this.title === '延期准出率') {
  717. if (this.drawerData.idList.length) {
  718. this.loading = true
  719. this.setDelayReleaseData()
  720. }
  721. }
  722. }
  723. },
  724. // 线上问题-改进项半浮层
  725. async dataMarketQualityGetImproveListFn() {
  726. const paging = { ...this.paging }
  727. // const { index, subIndex } = this.drawerData.subCountItem
  728. const { firstActive,
  729. // first,
  730. secondActive
  731. // second
  732. } = this.timelineData
  733. const params = {
  734. ...paging,
  735. isOverDue: 1,
  736. ids: this.drawerData.IdList
  737. }
  738. if (firstActive) {
  739. params.status = timelineList.ImprovementsOverRate[firstActive]
  740. }
  741. // console.log(722, secondActive)
  742. if (secondActive === 2) {
  743. params.priority = '高优'
  744. }
  745. if (!firstActive) {
  746. delete params.status
  747. } else {
  748. delete params.isOverDue
  749. }
  750. if (!secondActive) {
  751. delete params.isOverDue
  752. } else {
  753. params.isOverDue = 1
  754. }
  755. // if (index < 2 && subIndex < 1) {
  756. // delete params.isOverDue
  757. // }
  758. delete params.pageTotal
  759. const res = await dataMarketQualityGetImproveList(params)
  760. if (res.code === 200) {
  761. this.tableList = res.data.result
  762. paging.pageTotal = res.data.total
  763. this.paging = { ...paging }
  764. this.loading = false
  765. }
  766. },
  767. // 获取需求
  768. async getRequirementList() {
  769. const paging = this.paging
  770. // {"ids":[14952,15453,15988,16182,17445,17447,17735,18062,18064,18067,18134,18137,18138,18140],"curIndex":2,"pageSize":10}
  771. const res = await requirementQueryRequirementInfoList({
  772. ids: this.ids,
  773. curIndex: this.paging.curIndex,
  774. pageSize: this.paging.pageSize
  775. })
  776. if (res.code === 200) {
  777. this.tableList = res.data.list
  778. this.paging.pageTotal = res.data.total
  779. this.paging = { ...paging }
  780. this.loading = false
  781. }
  782. },
  783. // 获取任务
  784. async getTaskList() {
  785. const paging = this.paging
  786. // {"ids":[14952,15453,15988,16182,17445,17447,17735,18062,18064,18067,18134,18137,18138,18140],"curIndex":2,"pageSize":10}
  787. const res = await taskList({
  788. ids: this.ids,
  789. curIndex: this.paging.curIndex,
  790. pageSize: this.paging.pageSize
  791. })
  792. if (res.code === 200) {
  793. this.tableList = res.data
  794. this.paging.pageTotal = res.total
  795. this.paging = { ...paging }
  796. this.loading = false
  797. }
  798. },
  799. // getStarFlowerList, // 线上问题:半浮层 列表
  800. async setStarFlowerList() {
  801. if (!this.ids.length) {
  802. this.loading = false
  803. return
  804. }
  805. const paging = this.paging
  806. // {"ids":[14952,15453,15988,16182,17445,17447,17735,18062,18064,18067,18134,18137,18138,18140],"curIndex":2,"pageSize":10}
  807. const res = await getStarFlowerList({
  808. idList: this.ids,
  809. curIndex: this.paging.curIndex,
  810. pageSize: this.paging.pageSize
  811. })
  812. if (res.code === 200) {
  813. this.tableList = res.data.result
  814. this.paging.pageTotal = res.data.total
  815. this.paging = { ...paging }
  816. this.loading = false
  817. }
  818. },
  819. // getProjectList // 需求任务项目列表: 半浮层
  820. async setProjectList() {
  821. const paging = this.paging
  822. // {"ids":[14952,15453,15988,16182,17445,17447,17735,18062,18064,18067,18134,18137,18138,18140],"curIndex":2,"pageSize":10}
  823. const res = await getProjectList({
  824. idList: this.ids.length ? this.ids : [],
  825. curIndex: this.paging.curIndex,
  826. pageSize: this.paging.pageSize
  827. })
  828. if (res.code === 200) {
  829. // console.log(res)
  830. this.tableList = res.data.result
  831. paging.pageTotal = res.data.total
  832. this.paging = { ...paging }
  833. this.loading = false
  834. }
  835. },
  836. // 累计新增缺陷
  837. async getBugStatisticData() {
  838. const paging = this.paging
  839. // {"ids":[14952,15453,15988,16182,17445,17447,17735,18062,18064,18067,18134,18137,18138,18140],"curIndex":2,"pageSize":10}
  840. const res = await bugList({
  841. ids: this.ids,
  842. curIndex: this.paging.curIndex,
  843. priorityList: this.priorityList[0] === 2 ? [2, 3, 4, 5] : this.priorityList,
  844. pageSize: this.paging.pageSize
  845. })
  846. if (res.code === 200) {
  847. this.tableList = res.data
  848. this.paging.pageTotal = res.total
  849. this.paging = { ...paging }
  850. this.loading = false
  851. }
  852. },
  853. // 提测报告 deliverTestReportIdList 准出记录 releaseReportIdList
  854. async setReportList() {
  855. const key = this.title === '提测报告' ? 'deliverTestReportIdList' : 'releaseReportIdList'
  856. const paging = this.paging
  857. const params = {
  858. ...paging,
  859. [key]: this.ids
  860. }
  861. delete params.pageTotal
  862. const res = await getReportList(params)
  863. if (res.code === 200) {
  864. this.tableList = res.data
  865. paging.pageTotal = res.total
  866. this.paging = { ...paging }
  867. this.loading = false
  868. }
  869. },
  870. // 上线过程
  871. async getOdinJobListFn() {
  872. const paging = this.paging
  873. const res = await getOdinJobList({
  874. idList: this.ids,
  875. curIndex: this.paging.curIndex,
  876. pageSize: this.paging.pageSize
  877. })
  878. if (res.code === 200) {
  879. this.tableList = res.data.result
  880. this.paging.pageTotal = res.data.total
  881. this.paging = { ...paging }
  882. this.loading = false
  883. }
  884. },
  885. /* S 效率:半浮层数据接口 */
  886. // 需求平均交付周期
  887. async setRequireAvgData() {
  888. const paging = this.paging
  889. const params = {
  890. ...paging,
  891. title: this.timelineData.first[this.timelineData.firstActive],
  892. ids: this.sourceData[0].IdList
  893. }
  894. delete params.pageTotal
  895. const res = await getRequireAvgData(params)
  896. if (res.code === 200) {
  897. // this.tableList = res.data
  898. this.tableListOld = res.data.length && res.data.map(e => e)
  899. this.tableListPagination()
  900. paging.pageTotal = this.tableListOld.length
  901. this.paging = { ...paging }
  902. this.loading = false
  903. }
  904. },
  905. // 任务平均交付周期
  906. async setTaskData() {
  907. const paging = this.paging
  908. const params = {
  909. ...paging,
  910. title: this.timelineData.first[this.timelineData.firstActive],
  911. ids: this.sourceData[0].IdList
  912. }
  913. delete params.pageTotal
  914. const res = await getTaskData(params)
  915. if (res.code === 200) {
  916. // this.tableList = res.data
  917. this.tableListOld = res.data.length && res.data.map(e => e)
  918. this.tableListPagination()
  919. paging.pageTotal = this.tableListOld.length
  920. this.paging = { ...paging }
  921. this.loading = false
  922. }
  923. },
  924. // 平均需求使用人力
  925. async setRequirePeopleData() {
  926. const paging = this.paging
  927. const params = {
  928. ...paging,
  929. title: this.timelineData.first[this.timelineData.firstActive],
  930. ids: this.sourceData[0].IdList
  931. }
  932. delete params.pageTotal
  933. const res = await getRequirePeopleData(params)
  934. if (res.code === 200) {
  935. this.tableListOld = res.data.length && res.data.map(e => e)
  936. this.tableListPagination()
  937. paging.pageTotal = this.tableListOld.length
  938. this.paging = { ...paging }
  939. this.loading = false
  940. }
  941. },
  942. // 平均任务使用人力
  943. async setTaskPeopleData() {
  944. const paging = this.paging
  945. const params = {
  946. ...paging,
  947. title: this.timelineData.first[this.timelineData.firstActive],
  948. ids: this.sourceData[0].IdList
  949. }
  950. delete params.pageTotal
  951. const res = await getTaskPeopleData(params)
  952. if (res.code === 200) {
  953. // this.tableList = res.data
  954. this.tableListOld = res.data.length && res.data.map(e => e)
  955. this.tableListPagination()
  956. paging.pageTotal = this.tableListOld.length
  957. paging.pageTotal = this.sourceData[0].IdList.length
  958. this.paging = { ...paging }
  959. // console.log(847, this.paging)
  960. this.loading = false
  961. }
  962. },
  963. // 缺陷平均修复时长
  964. async setBugRepair2Data() {
  965. const paging = this.paging
  966. const params = {
  967. ...paging,
  968. title: this.timelineData.first[this.timelineData.firstActive],
  969. ids: this.sourceData[0].IdList
  970. }
  971. delete params.pageTotal
  972. const res = await bugRepair2Data(params)
  973. if (res.code === 200) {
  974. // this.tableList = res.data
  975. this.tableListOld = res.data.length && res.data.map(e => e)
  976. this.tableListPagination()
  977. paging.pageTotal = this.tableListOld.length
  978. this.paging = { ...paging }
  979. this.loading = false
  980. }
  981. },
  982. // 缺陷24小时修复率
  983. async setBugRepairData() {
  984. const priorityList = [[0, 1, 2, 3], [0, 1], [2, 3]]
  985. const paging = this.paging
  986. const params = {
  987. // ...paging,
  988. title: this.timelineData.first[this.timelineData.firstActive],
  989. priorityList: priorityList[this.timelineData.secondActive],
  990. ids: this.sourceData[0].IdList
  991. }
  992. delete params.pageTotal
  993. const res = await bugRepairData(params)
  994. if (res.code === 200) {
  995. this.tableList = res.data
  996. this.tableListOld = res.data.length && this.tableList.map(e => e)
  997. paging.pageTotal = this.tableListOld.length
  998. this.paging = { ...paging }
  999. this.loading = false
  1000. }
  1001. },
  1002. // getDelayLaunchData, // 延期提测率
  1003. async setDelayLaunchData() {
  1004. const paging = this.paging
  1005. const params = {
  1006. ...paging,
  1007. title: this.timelineData.first[this.timelineData.firstActive],
  1008. ids: this.drawerData.idList
  1009. }
  1010. delete params.pageTotal
  1011. const res = await getDelayLaunchData(params)
  1012. if (res.code === 200) {
  1013. this.tableList = res.data
  1014. this.tableListOld = res.data.length && res.data.map(e => e)
  1015. this.tableListPagination()
  1016. paging.pageTotal = this.tableListOld.length
  1017. this.paging = { ...paging }
  1018. this.loading = false
  1019. }
  1020. },
  1021. // getDelayReleaseData, // 延期准出率
  1022. async setDelayReleaseData() {
  1023. const paging = this.paging
  1024. const params = {
  1025. ...paging,
  1026. title: this.timelineData.first[this.timelineData.firstActive],
  1027. ids: this.drawerData.idList
  1028. }
  1029. delete params.pageTotal
  1030. const res = await getDelayReleaseData(params)
  1031. if (res.code === 200) {
  1032. // this.tableList = res.data
  1033. this.tableListOld = res.data.length && res.data.map(e => e)
  1034. this.tableListPagination()
  1035. paging.pageTotal = this.tableListOld.length
  1036. this.paging = { ...paging }
  1037. this.loading = false
  1038. }
  1039. },
  1040. // 分页
  1041. tableListPagination() {
  1042. if (this.tableListOld.length) {
  1043. this.tableList = this.tableListOld.map(e => e).splice((this.paging.curIndex - 1 || 0) * this.paging.pageSize, this.paging.pageSize)
  1044. // if (this.paging.curIndex - 1 || this.tableListOld.length > this.paging.pageSize.length) {
  1045. // this.tableList = this.tableListOld.map(e => e).splice((this.paging.curIndex - 1 || 0) * this.paging.pageSize, this.paging.pageSize)
  1046. // } else {
  1047. // this.tableList = this.tableListOld.map(e => e) || []
  1048. // }
  1049. }
  1050. },
  1051. /* E 效率:半浮层数据接口 */
  1052. // 分页数据初始化
  1053. pagingInit() {
  1054. const pageSize = window.localStorage.getItem('pageSize') || 10
  1055. this.paging = {
  1056. curIndex: 1,
  1057. pageTotal: 0,
  1058. pageSize: Number.parseInt(pageSize)
  1059. }
  1060. this.priorityList = []
  1061. },
  1062. // 设置表格高度
  1063. setTitleHeight() {
  1064. if (this.drawerData.moduleName && this.drawerData.moduleName.search(/上线过程|回滚次数/) > -1) {
  1065. this.tableHeight = 'calc(100vh - 290px)'
  1066. } else if (this.title.search(/状态停留分布图数据|状态累积流量图数据/) > -1) {
  1067. this.tableHeight = 'calc(100vh - 363px)'
  1068. } else if (this.title.search(/需求周期|需求人力|任务人力|任务周期/) > -1) {
  1069. this.tableHeight = 'calc(100vh - 136px)'
  1070. } else if (this.title.search(/新增项目|新增任务|reopen|新增缺陷|缺陷修复时长|延期准出率|延期提测率/) > -1) {
  1071. this.tableHeight = 'calc(100vh - 288px)'
  1072. } else if (this.title.search(/需求|任务|项目/) > -1) {
  1073. // 吞吐量: 需求
  1074. this.tableHeight = 'calc(100vh - 188px)'
  1075. } else if (this.title === '缺陷24小时修复率') {
  1076. this.tableHeight = 'calc(100vh - 328px)'
  1077. } else {
  1078. this.tableHeight = 'calc(100vh - 136px)'
  1079. }
  1080. if (this.headerTitle === '质量' && this.title.search(/新增缺陷|reopen/) < 0 && !this.drawerData.moduleName) {
  1081. this.tableHeight = this.title === '改进项' ? 'calc(100vh - 300px)' : 'calc(100vh - 136px)'
  1082. }
  1083. if (this.headerTitle === '吞吐量') {
  1084. this.tableHeight = 'calc(100vh - 288px)'
  1085. }
  1086. },
  1087. // 设置表头
  1088. // 表格跳转
  1089. dmTableChange({ column, row }) {
  1090. if (this.headerTitle === '质量' && this.drawerData.label === '新增问题') {
  1091. const url = `https://odin.xiaojukeji.com/#/risk/starflower/casedetail?id=${row.id}&name=${row.title}`
  1092. window.open(url, '_blank')
  1093. } else if (this.drawerData.moduleName && this.drawerData.moduleName.search(/上线过程|回滚次数/) > -1) {
  1094. const url = `https://odin.v5.intra.xiaojukeji.com/#/deploy/job/status/?jobId=${row.id}`
  1095. window.open(url, '_blank')
  1096. } else if (this.headerTitle === '质量' && this.drawerData.label.search(/^(提测报告|准出记录)/) > -1) {
  1097. this.jumper(row, '报告')
  1098. } else if (this.headerTitle === '吞吐量') {
  1099. if (this.title.search(/需求/) > -1) {
  1100. this.jumper(row, '需求')
  1101. }
  1102. if (this.title.search(/任务/) > -1) {
  1103. this.jumper(row, '任务')
  1104. }
  1105. if (this.title.search(/项目/) > -1) {
  1106. this.jumper(row, '项目')
  1107. }
  1108. } else if (this.headerTitle === '效率') {
  1109. if (column.label.search(/需求/) > -1) {
  1110. this.jumper(row, '需求')
  1111. }
  1112. if (column.label.search(/任务/) > -1) {
  1113. this.jumper(row, '任务')
  1114. }
  1115. if (column.label.search(/缺陷/) > -1) {
  1116. this.jumper(row, '缺陷')
  1117. }
  1118. } else {
  1119. this.jumper(row, '缺陷')
  1120. }
  1121. },
  1122. // 设置表格样式
  1123. setBoxShadow(key = 'drawer-box') {
  1124. if (key) {
  1125. setTimeout(() => {
  1126. this.drawerBox = key
  1127. }, 300)
  1128. } else {
  1129. this.drawerBox = key
  1130. }
  1131. },
  1132. // 设置时间轴自动滚动
  1133. setTimeLine() {
  1134. this.$nextTick(() => {
  1135. if (this.isTimeLine(1)) {
  1136. // Number(this.defaultKey) * 109 - 60
  1137. // this.$refs.timeline1.scrollLeft = 100
  1138. }
  1139. if (this.isTimeLine(2)) {
  1140. // Number(this.defaultKey2) * 100 - 60
  1141. // this.$refs.timeline2.scrollLeft = 256
  1142. }
  1143. })
  1144. },
  1145. jumper(val, name) { // 需求、任务、缺陷跳转
  1146. // const { bizId = null } = this.$store.state.global || {}
  1147. const { bizId, id } = val
  1148. const bizId_id = EncryptId(`${bizId}_${id}`)
  1149. const newTab = this.$router.resolve({ name: name + '详情', query: { bizId_id: bizId_id }})
  1150. window.open(newTab.href, '_blank')
  1151. },
  1152. // 设置时间轴自动滚动
  1153. isTimeLine(index = 1) {
  1154. // 是第一条
  1155. if (index === 1) {
  1156. if (this.headerTitle.search(/质量/) > -1 && this.title.search(/新增缺陷|reopen|改进项/) > -1) {
  1157. return true
  1158. }
  1159. if (this.drawerData.moduleName && this.drawerData.moduleName === '上线过程') {
  1160. return true
  1161. }
  1162. if (this.drawerData.moduleName && this.drawerData.moduleName === '回滚次数') {
  1163. return true
  1164. }
  1165. // console.log(1049, this.title, this.headerTitle)
  1166. if (this.headerTitle.search(/效率/) > -1 && this.title.search(/需求周期|任务周期|需求人力|任务人力/) > -1) {
  1167. return false
  1168. }
  1169. return this.headerTitle.search(/吞吐量|效率/) > -1
  1170. }
  1171. // 是第二条
  1172. if (index === 2) {
  1173. return this.title.search(/缺陷24小时修复率|改进项/) > -1
  1174. }
  1175. }
  1176. }
  1177. }
  1178. </script>
  1179. <style scoped lang='less'>
  1180. .content-wrapper{
  1181. /deep/.el-drawer__body{
  1182. overflow: hidden;
  1183. }
  1184. }
  1185. /deep/ .el-drawer__header {
  1186. color: #444;
  1187. font-size: 20px;
  1188. font-weight: 500;
  1189. margin-bottom: 0;
  1190. padding: 20px 30px;
  1191. border-bottom: 1px solid #E2E2E2;
  1192. .sub-title {
  1193. color: #444;
  1194. font-size: 14px;
  1195. margin-left: 20px;
  1196. font-weight: 400;
  1197. }
  1198. }
  1199. .drawer-box {
  1200. box-shadow: 0 8px 10px -5px rgba(0, 0, 0, .2), 0 16px 24px 2px rgba(0, 0, 0, .14), 0 6px 30px 5px rgba(0, 0, 0, .12);
  1201. }
  1202. .el-drawer-fade-enter-active {
  1203. animation: el-drawer-fade-in 10ms;
  1204. }
  1205. .el-drawer-fade-leave-active {
  1206. animation: el-drawer-fade-in 10ms reverse;
  1207. }
  1208. .el-drawer__wrapper {
  1209. width: 100%;
  1210. position: fixed;
  1211. top: 0;
  1212. right: 0;
  1213. bottom: 0;
  1214. left: 50%;
  1215. overflow: hidden;
  1216. margin: 0;
  1217. }
  1218. /deep/.el-drawer__container {
  1219. left: 0;
  1220. right: 0;
  1221. width: 50%;
  1222. }
  1223. /* S 时间轴 */
  1224. .drawer-header {
  1225. text-align: center;
  1226. background: #F7F7F7;
  1227. border-radius: 4px;
  1228. min-height: 120px;
  1229. margin: 20px 30px 10px;
  1230. overflow: hidden;
  1231. }
  1232. .drawer-padding {
  1233. padding: 20px 0;
  1234. }
  1235. .drawer-padding-s {
  1236. padding: 1px 0;
  1237. }
  1238. .drawer-scll {
  1239. overflow-x: scroll;
  1240. }
  1241. .drawer-scll::-webkit-scrollbar { width: 0 !important; height: 0 !important }
  1242. .drawer-H {
  1243. font-size: 16px;
  1244. margin: 0 30px;
  1245. color: #444444;
  1246. }
  1247. .drawer-scll {
  1248. overflow-x: scroll;
  1249. }
  1250. .drawer-scll::-webkit-scrollbar { width: 0 !important; height: 0 !important }
  1251. .drawer-H {
  1252. font-size: 16px;
  1253. margin: 0 30px;
  1254. color: #444444;
  1255. }
  1256. /* E 时间轴 */
  1257. /* S 质量:线上问题_改进方案 */
  1258. .antdv3-tag{
  1259. box-sizing: border-box;
  1260. color: rgba(0,0,0,.65);
  1261. font-variant: tabular-nums;
  1262. list-style: none;
  1263. font-feature-settings: "tnum";
  1264. display: inline-block;
  1265. height: auto;
  1266. margin: 0 8px 0 0;
  1267. padding: 0 7px;
  1268. font-size: 12px;
  1269. line-height: 20px;
  1270. white-space: nowrap;
  1271. background: #fafafa;
  1272. border: 1px solid #d9d9d9;
  1273. border-radius: 2px;
  1274. cursor: default;
  1275. opacity: 1;
  1276. transition: all .3s cubic-bezier(.78,.14,.15,.86);
  1277. }
  1278. .antdv3-tag-orange {
  1279. color: #fa8c16;
  1280. background: #fff7e6;
  1281. border-color: #ffd591;
  1282. }
  1283. .antdv3-tag-green {
  1284. color: #52c41a;
  1285. background: #f6ffed;
  1286. border-color: #b7eb8f;
  1287. }
  1288. /* E 质量:线上问题_改进方案 */
  1289. .footer-laout {
  1290. display: flex;
  1291. justify-content: space-between;
  1292. margin: 0 30px;
  1293. //width: 100%;
  1294. //padding: 0 30px;
  1295. //.el-pagination{
  1296. // width: 100%;
  1297. //}
  1298. }
  1299. .drawer-name:hover {
  1300. color: #409eff;
  1301. cursor: pointer;
  1302. }
  1303. </style>