You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

892 lines
27 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. <template>
  2. <section class="page-container padding">
  3. <el-row class="page-main " :style="{overflowX: 'hidden',height:maxTableHeight+'px'}" ref="table">
  4. <el-row :gutter="10" style="margin-bottom:10px">
  5. <el-col :span="12" >
  6. <el-card class="box-card" style="padding:0px ;height:425px">
  7. <div slot="header" class="clearfix">
  8. <span>数据汇总</span>
  9. </div>
  10. <el-row style="margin-bottom:18px">
  11. <el-col :span="8">
  12. <div class="item">
  13. <div class="icon" style="background-color: rgb(79, 140, 255);">
  14. <i class="el-icon-alarm-clock"></i>
  15. </div>
  16. <div class="info">
  17. <div v-text="xmBranchState.totalPlanWorkload"></div>
  18. <div class="title">项目总工时</div>
  19. </div>
  20. </div>
  21. </el-col>
  22. <el-col :span="8">
  23. <div class="item">
  24. <div class="icon" style="background-color: rgb(255, 153, 51);">
  25. <i class="el-icon-alarm-clock"></i>
  26. </div>
  27. <div class="info">
  28. <div v-text="xmBranchState.productBudgetWorkload">
  29. </div>
  30. <div class="title">产品总工时</div>
  31. </div>
  32. </div>
  33. </el-col>
  34. <el-col :span="8">
  35. <div class="item">
  36. <div class="icon" style="background-color: rgb(0, 153, 51);">
  37. <i class="el-icon-s-custom"></i>
  38. </div>
  39. <div class="info">
  40. <div v-text="xmBranchState.totalStaffCnt" >
  41. </div>
  42. <div class="title">总人数</div>
  43. </div>
  44. </div>
  45. </el-col>
  46. </el-row>
  47. <el-row style="margin-bottom:18px">
  48. <el-col :span="8">
  49. <div class="item">
  50. <div class="icon" style="background-color: rgb(79, 140, 255);">
  51. <i class="el-icon-s-unfold"></i>
  52. </div>
  53. <div class="info">
  54. <div v-text="xmBranchState.projectCnt"></div>
  55. <div class="title">项目数</div>
  56. </div>
  57. </div>
  58. </el-col>
  59. <el-col :span="8">
  60. <div class="item">
  61. <div class="icon" style="background-color: rgb(255, 153, 51);">
  62. <i class="el-icon-date"></i>
  63. </div>
  64. <div class="info">
  65. <div v-text="xmBranchState.totalPhaseCnt">
  66. </div>
  67. <div class="title">计划数</div>
  68. </div>
  69. </div>
  70. </el-col>
  71. <el-col :span="8">
  72. <div class="item">
  73. <div class="icon" style="background-color: rgb(0, 153, 51);">
  74. <i class="el-icon-s-operation"></i>
  75. </div>
  76. <div class="info">
  77. <div v-text="xmBranchState.totalTaskCnt" >
  78. </div>
  79. <div class="title">任务数</div>
  80. </div>
  81. </div>
  82. </el-col>
  83. </el-row>
  84. <el-row style="margin-bottom:18px">
  85. <el-col :span="8">
  86. <div class="item">
  87. <div class="icon" style="background-color: rgb(79, 140, 255);">
  88. <i class="el-icon-star-off"></i>
  89. </div>
  90. <div class="info">
  91. <div v-text="xmBranchState.productCnt" >
  92. </div>
  93. <div class="title">产品数</div>
  94. </div>
  95. </div>
  96. </el-col>
  97. <el-col :span="8">
  98. <div class="item">
  99. <div class="icon" style="background-color: rgb(255, 153, 51);">
  100. <i class="el-icon-refresh"></i>
  101. </div>
  102. <div class="info">
  103. <div v-text="xmBranchState.iterationCnt" >
  104. </div>
  105. <div class="title">迭代数</div>
  106. </div>
  107. </div>
  108. </el-col>
  109. <el-col :span="8">
  110. <div class="item">
  111. <div class="icon" style="background-color: rgb(0, 153, 51);">
  112. <i class="el-icon-loading"></i>
  113. </div>
  114. <div class="info">
  115. <div v-text="xmBranchState.menuCnt" >
  116. </div>
  117. <div class="title">需求数</div>
  118. </div>
  119. </div>
  120. </el-col>
  121. </el-row>
  122. </el-card>
  123. </el-col>
  124. <el-col :span="12" >
  125. <el-card class="box-card" style="padding:0px ;height:425px">
  126. <div slot="header" class="clearfix">
  127. <span>项目进度</span>
  128. </div>
  129. <div>
  130. <el-row style="padding-top:15px;padding-left:25px;">
  131. <div class="item">
  132. <el-col :span="8">
  133. <div>
  134. <div style="text-align:center;">
  135. <span style="font-size:24px;" v-text="this.xmBranchState.estimateWorkload"></span>
  136. <span style="font-size:5px;">h</span>
  137. </div>
  138. <div style="text-align:center;font-size:5px;">预估工时</div>
  139. </div>
  140. </el-col>
  141. <el-col :span="8">
  142. <div>
  143. <div style="text-align:center;">
  144. <span style="font-size:24px;" v-text="this.xmBranchState.totalActWorkload"></span>
  145. <span style="font-size:5px;">h</span>
  146. </div>
  147. <div style="text-align:center;font-size:5px;">登记工时</div>
  148. </div>
  149. </el-col>
  150. <el-col :span="8">
  151. <div>
  152. <div style="text-align:center;">
  153. <span style="font-size:24px;" v-text="workloadProgress"></span>
  154. <span style="font-size:5px;">%</span>
  155. </div>
  156. <div style="text-align:center;font-size:5px;">工时进度</div>
  157. </div>
  158. </el-col>
  159. </div>
  160. </el-row>
  161. <el-row style="padding-top:15px;padding-left:25px;">
  162. <div class="item">
  163. <el-col :span="8">
  164. <div>
  165. <div style="text-align:center;">
  166. <span style="font-size:24px;" v-text="remainWorkload"></span>
  167. <span style="font-size:5px;">h</span>
  168. </div>
  169. <div style="text-align:center;font-size:5px;">剩余工时</div>
  170. </div>
  171. </el-col>
  172. <el-col :span="8">
  173. <div>
  174. <div style="text-align:center;">
  175. <span style="font-size:24px;" v-text="deviation"></span>
  176. <span style="font-size:5px;">h</span>
  177. </div>
  178. <div style="text-align:center;font-size:5px;">预估偏差</div>
  179. </div>
  180. </el-col>
  181. <el-col :span="8">
  182. <div>
  183. <div style="text-align:center;">
  184. <span style="font-size:24px;" v-text="deviationRate"></span>
  185. <span style="font-size:5px;">%</span>
  186. </div>
  187. <div style="text-align:center;font-size:5px;">预估偏差率</div>
  188. </div>
  189. </el-col>
  190. </div>
  191. </el-row>
  192. <el-row>
  193. <span style="margin-left:20px;">项目预计进度</span>
  194. <el-progress style="width: 90%;margin-left:20px;margin-top: 10px;margin-bottom: 20px;" :text-inside="true" :stroke-width="24" :percentage="planProgress"></el-progress>
  195. </el-row>
  196. <el-row>
  197. <span style="margin-left:20px;">项目实际进度</span>
  198. <el-progress style="width: 90%;margin-left:20px;margin-top: 10px;" :text-inside="true" :stroke-width="24" :percentage="realProgress"></el-progress>
  199. </el-row>
  200. </div>
  201. </el-card>
  202. </el-col>
  203. </el-row>
  204. <el-row :gutter="10" style="margin-bottom:10px">
  205. <el-col :span="8" >
  206. <el-card class="box-card" style="height:425px">
  207. <div slot="header" class="clearfix">
  208. <span>工作量分布</span>
  209. </div>
  210. <div>
  211. <div id="workloadDistribution" :style="{width: '100%', height: '410px'}"></div>
  212. </div>
  213. </el-card>
  214. </el-col>
  215. <el-col :span="8" >
  216. <el-card class="box-card" style="height:425px">
  217. <div slot="header" class="clearfix">
  218. <span>工作项数量分布</span>
  219. </div>
  220. <div>
  221. <div id="allChart" :style="{width: '100%', height: '350px'}"></div>
  222. </div>
  223. </el-card>
  224. </el-col>
  225. <el-col :span="8" >
  226. <el-card class="box-card" style="height:425px">
  227. <div slot="header" class="clearfix">
  228. <span>缺陷情况</span>
  229. </div>
  230. <div>
  231. <div id="bugPieChart" :style="{width: '100%', height: '410px'}"></div>
  232. </div>
  233. </el-card>
  234. </el-col>
  235. </el-row>
  236. <el-row :gutter="10" style="margin-bottom:10px">
  237. <el-col :span="8" >
  238. <el-card class="box-card" style="padding:0px ;height:425px">
  239. <div slot="header" class="clearfix">
  240. <span>任务每日状态趋势</span>
  241. </div>
  242. <div>
  243. <div id="taskChart" :style="{width: '100%', height: '320px'}"></div>
  244. </div>
  245. </el-card>
  246. </el-col>
  247. <el-col :span="8" >
  248. <el-card class="box-card" style="height:425px">
  249. <div slot="header" class="clearfix">
  250. <span>总预算情况</span>
  251. </div>
  252. <div>
  253. <div id="planTotalCostPie" :style="{width: '100%', height: '410px'}"></div>
  254. </div>
  255. </el-card>
  256. </el-col>
  257. <el-col :span="8" >
  258. <el-card class="box-card" style="height:425px">
  259. <div slot="header" class="clearfix">
  260. <span>所含产品和迭代情况</span>
  261. </div>
  262. <div>
  263. <div id="iterationAndProduct" :style="{width: '100%', height: '350px'}"></div>
  264. </div>
  265. </el-card>
  266. </el-col>
  267. </el-row>
  268. </el-row>
  269. </section>
  270. </template>
  271. <script>
  272. import util from "@/common/js/util"; // 全局公共库
  273. import { mapGetters } from "vuex";
  274. import { listOption } from '@/api/mdp/meta/itemOption';//下拉框数据查询
  275. import { listXmBranchState,loadProjectStateToXmBranchState } from '@/api/xm/core/xmBranchState';
  276. export default {
  277. computed: {
  278. ...mapGetters(["userInfo"]),
  279. finish: function (){
  280. return this.xmBranchState.totalCompleteTaskCnt;
  281. },
  282. notStart: function() {
  283. return this.xmBranchState.totalTaskCnt-this.xmBranchState.totalCompleteTaskCnt;
  284. },
  285. totalTask: function() {
  286. return this.xmBranchState.totalTaskCnt;
  287. },
  288. taskProgress: function (){
  289. return this.xmBranchState.totalProgress;
  290. },
  291. taskStartTime: function (){
  292. return this.xmBranchState.startTime.substring(0,10);
  293. },
  294. taskEndTime: function (){
  295. return this.xmBranchState.endTime.substring(0,10);
  296. },
  297. taskMng: function (){
  298. return this.xmBranchState.createUsername;
  299. },
  300. workloadProgress:function (){
  301. return Math.round(this.xmBranchState.totalActWorkload/this.xmBranchState.estimateWorkload*100);
  302. },
  303. deviation:function (){
  304. return Math.round(this.xmBranchState.totalActWorkload-this.xmBranchState.estimateWorkload);
  305. },
  306. deviationRate:function (){
  307. return Math.round((this.xmBranchState.totalActWorkload-this.xmBranchState.estimateWorkload)/this.xmBranchState.estimateWorkload*100);
  308. },
  309. remainWorkload:function (){
  310. return this.xmBranchState.totalPlanWorkload - this.xmBranchState.totalActWorkload;
  311. },
  312. planProgress:function (){
  313. if(!this.xmBranchState.totalPlanWorkload){
  314. return 0;
  315. }
  316. return parseInt( this.xmBranchState.estimateWorkload/this.xmBranchState.totalPlanWorkload*100)
  317. },
  318. realProgress:function (){
  319. if(!this.xmBranchState.totalPlanWorkload){
  320. return 0;
  321. }
  322. if(this.xmBranchState.totalActWorkload < this.xmBranchState.totalPlanWorkload){
  323. return Math.round(this.xmBranchState.totalActWorkload/this.xmBranchState.totalPlanWorkload*100)
  324. }else{
  325. return 100;
  326. }
  327. },
  328. xmBranchStateCpd(){
  329. return this.xmBranchState
  330. },
  331. calcProjectStatusStep(){
  332. if(this.options['projectStatus'] && this.xmBranchState){
  333. var index=this.options['projectStatus'].findIndex(i=>{
  334. if(i.optionValue==this.xmBranchState.status){
  335. return true;
  336. }else{
  337. return false;
  338. }
  339. })
  340. return index+1;
  341. }else{
  342. return 0;
  343. }
  344. }
  345. },
  346. watch:{
  347. xmBranchStateCpd:function(){
  348. this.drawAllBar();
  349. this.drawTaskByDate();
  350. this.drawPieBug();
  351. this.drawCostPie();
  352. this.drawWorkload();
  353. this.drawIterationProduct();
  354. }
  355. },
  356. data() {
  357. return {
  358. isActive: true,
  359. xmBranchState:{},
  360. maxTableHeight:300,
  361. // options: getDefOptions(),//下拉选择框的所有静态数据 params=[{categoryId:'0001',itemCode:'sex'}] 返回结果 {'sex':[{optionValue:'1',optionName:'男',seqOrder:'1',fp:'',isDefault:'0'},{optionValue:'2',optionName:'女',seqOrder:'2',fp:'',isDefault:'0'}]}
  362. };
  363. },
  364. methods:{
  365. drawAllBar() {
  366. // 基于准备好的dom,初始化echarts实例
  367. let allChart = this.$echarts.init(document.getElementById("allChart"));
  368. let option = {
  369. tooltip: {
  370. trigger: 'axis',
  371. axisPointer: {
  372. type: 'shadow'
  373. }
  374. },
  375. grid: {
  376. left: '3%',
  377. right: '4%',
  378. bottom: '10%',
  379. containLabel: true
  380. },
  381. yAxis: {
  382. type: 'value'
  383. },
  384. xAxis: {
  385. type: 'category',
  386. data: ['需求', '任务', '缺陷']
  387. },
  388. series: [
  389. {
  390. label: {
  391. normal:{
  392. show: true,
  393. position: 'top',
  394. color:'#000000',
  395. }
  396. },
  397. data: [
  398. {
  399. value: this.xmBranchState.menuCnt,
  400. itemStyle: {
  401. normal:{
  402. color: '#99CCFF'
  403. }
  404. }
  405. },
  406. {
  407. value: this.xmBranchState.totalTaskCnt,
  408. itemStyle: {
  409. normal:{
  410. color: '#99CCFF'
  411. }
  412. }
  413. },
  414. {
  415. value: this.xmBranchState.totalBugCnt,
  416. itemStyle: {
  417. normal:{
  418. color: '#99CCFF'
  419. }
  420. }
  421. },
  422. ],
  423. type: 'bar'
  424. }
  425. ]
  426. };
  427. // 绘制图表
  428. allChart.setOption(option);
  429. },
  430. drawTaskByDate() {
  431. let taskChart = this.$echarts.init(document.getElementById("taskChart"));
  432. let option = {
  433. tooltip: {
  434. trigger: 'axis'
  435. },
  436. color:['rgb(0, 153, 255)','#6699CC'],
  437. legend: {
  438. data: ['未开始', '进行中']
  439. },
  440. grid: {
  441. left: '1%',
  442. right: '3%',
  443. bottom: '5%',
  444. containLabel: true
  445. },
  446. toolbox: {
  447. feature: {
  448. saveAsImage: {}
  449. }
  450. },
  451. xAxis: {
  452. type: 'category',
  453. boundaryGap: false,
  454. data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
  455. },
  456. yAxis: {
  457. type: 'value'
  458. },
  459. series: [
  460. {
  461. name: '未开始',
  462. type: 'line',
  463. //stack: '总量',
  464. data: [120, 132, 101, 134, 90, 230, 210],
  465. areaStyle: {
  466. normal:{
  467. color:"rgb(153, 204, 255)" , //设置折线图颜色
  468. }
  469. },
  470. lineStyle:{
  471. normal:{
  472. color:'rgb(0, 153, 255)'
  473. }
  474. },
  475. },
  476. {
  477. name: '进行中',
  478. type: 'line',
  479. //stack: '总量',
  480. data: [220, 182, 191, 234, 290, 330, 310],
  481. areaStyle: {
  482. normal:{
  483. color:"rgb(153, 204, 255)", //设置折线图颜色
  484. }
  485. },
  486. lineStyle:{
  487. normal:{
  488. color:'#6699CC'
  489. }
  490. },
  491. },
  492. ],
  493. };
  494. // 绘制图表
  495. taskChart.setOption(option);
  496. },
  497. drawPieBug() {
  498. let bugPieChart = this.$echarts.init(document.getElementById("bugPieChart"));
  499. let option = {
  500. tooltip: {
  501. trigger: 'item',
  502. formatter: '{b} : {c} ({d}%)'
  503. },
  504. legend: {
  505. orient: 'vertical',
  506. left: 'left',
  507. },
  508. series: [
  509. {
  510. center:['55%','40%'],//饼图位置
  511. type: 'pie',
  512. radius: '50%',//饼图半径大小
  513. label:{ //饼图图形上的文本标签
  514. normal:{
  515. show:true,
  516. position:'outer', //标签的位置:内部
  517. textStyle : {
  518. fontWeight : 100 ,
  519. fontSize: document.body.clientWidth / 120, //标签字体大小
  520. color: "#000000"
  521. },
  522. formatter:'{b}\n{c}({d}%)',//b:name,c:value,d:占比
  523. alignTo:'edge',
  524. margin:10
  525. }
  526. },
  527. data: [
  528. {value: this.xmBranchState.totalClosedBugCnt,
  529. itemStyle: {
  530. normal:{
  531. color: '#5470C6'
  532. }
  533. },
  534. name: '已关闭'},
  535. {value: this.xmBranchState.totalResolvedBugCnt,
  536. itemStyle: {
  537. normal:{
  538. color: '#91CC75'
  539. }
  540. },
  541. name: '已解决'},
  542. {value: this.xmBranchState.totalActiveBugCnt,
  543. itemStyle: {
  544. normal:{
  545. color: '#FAC858'
  546. }
  547. },
  548. name: '已激活'},
  549. {value: this.xmBranchState.totalConfirmedBugCnt,
  550. itemStyle: {
  551. normal:{
  552. color: '#EE6666'
  553. }
  554. },
  555. name: '已确认'},
  556. ],
  557. emphasis: {
  558. itemStyle: {
  559. shadowBlur: 10,
  560. shadowOffsetX: 0,
  561. shadowColor: 'rgba(0, 0, 0, 0.5)'
  562. }
  563. }
  564. }
  565. ]
  566. };
  567. // 绘制图表
  568. bugPieChart.setOption(option);
  569. },
  570. drawCostPie() {
  571. let planTotalCostPie = this.$echarts.init(document.getElementById("planTotalCostPie"));
  572. let option = {
  573. tooltip: {
  574. trigger: 'item',
  575. formatter: '{b} : {c} ({d}%)'
  576. },
  577. legend: {
  578. bottom: 10,
  579. left: 'center',
  580. },
  581. series: [
  582. {
  583. center:['55%','40%'],//饼图位置
  584. type: 'pie',
  585. radius: '50%',//饼图半径大小
  586. label:{ //饼图图形上的文本标签
  587. normal:{
  588. show:true,
  589. position:'outer', //标签的位置:外部
  590. textStyle : {
  591. fontWeight : 100 ,
  592. fontSize: document.body.clientWidth / 120, //标签字体大小
  593. color: "#000000"
  594. },
  595. formatter:'{b}\n{c}({d}%)',//b:name,c:value,d:占比
  596. alignTo:'edge',
  597. margin:10
  598. }
  599. },
  600. data: [
  601. {value: this.xmBranchState.totalBudgetNouserAmount,
  602. itemStyle: {
  603. normal:{
  604. color: '#FAC858'
  605. }
  606. },
  607. name: '非人力'},
  608. {value: this.xmBranchState.totalBudgetInnerUserAmount,
  609. itemStyle: {
  610. normal:{
  611. color: '#73C0DE'
  612. }
  613. },
  614. name: '内部人力'},
  615. {value: this.xmBranchState.totalBudgetOutUserAmount,
  616. itemStyle: {
  617. normal:{
  618. color: '#5470C6'
  619. }
  620. },
  621. name: '外购人力'},
  622. ],
  623. emphasis: {
  624. itemStyle: {
  625. shadowBlur: 10,
  626. shadowOffsetX: 0,
  627. shadowColor: 'rgba(0, 0, 0, 0.5)'
  628. }
  629. }
  630. }
  631. ]
  632. };
  633. // 绘制图表
  634. planTotalCostPie.setOption(option);
  635. },
  636. drawWorkload() {
  637. let workloadDistribution = this.$echarts.init(document.getElementById("workloadDistribution"));
  638. let option = {
  639. tooltip: {
  640. trigger: 'item',
  641. formatter: '{b} :<br/> {c} ({d}%)'
  642. },
  643. legend: {
  644. bottom: 10,
  645. left: 'center',
  646. },
  647. series: [
  648. {
  649. center:['55%','40%'],//饼图位置
  650. type: 'pie',
  651. radius: '50%',//饼图半径大小
  652. label:{ //饼图图形上的文本标签
  653. normal:{
  654. show:true,
  655. position:'outer', //标签的位置:外部
  656. textStyle : {
  657. fontWeight : 100 ,
  658. fontSize: document.body.clientWidth / 120, //标签字体大小
  659. color: "#000000"
  660. },
  661. formatter:'{b}\n{c}({d}%)',//b:name,c:value,d:占比
  662. alignTo:'edge',
  663. margin:10
  664. }
  665. },
  666. data: [
  667. {value: this.xmBranchState.totalPlanInnerUserWorkload,
  668. itemStyle: {
  669. normal:{
  670. color: '#91CC75'
  671. }
  672. },
  673. name: '内部人力'},
  674. {value: this.xmBranchState.totalPlanOutUserWorkload,
  675. itemStyle: {
  676. normal:{
  677. color: '#3BA272'
  678. }
  679. },
  680. name: '外购人力'},
  681. ],
  682. emphasis: {
  683. itemStyle: {
  684. shadowBlur: 10,
  685. shadowOffsetX: 0,
  686. shadowColor: 'rgba(0, 0, 0, 0.5)'
  687. }
  688. }
  689. }
  690. ]
  691. };
  692. // 绘制图表
  693. workloadDistribution.setOption(option);
  694. },
  695. drawIterationProduct() {
  696. let iterationAndProduct = this.$echarts.init(document.getElementById("iterationAndProduct"));
  697. let option = {
  698. tooltip: {
  699. trigger: 'axis',
  700. formatter: '{b} : {c}',
  701. axisPointer: { // 坐标轴指示器,坐标轴触发有效
  702. type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
  703. },
  704. },
  705. xAxis: {
  706. type: 'category',
  707. data: ['产品数', '迭代数']
  708. },
  709. yAxis: {
  710. type: 'value'
  711. },
  712. series: [{
  713. label: {
  714. normal:{
  715. show: true,
  716. position: 'top',
  717. color:'#000000',
  718. }
  719. },
  720. data: [this.xmBranchState.productCnt, this.xmBranchState.iterationCnt],
  721. type: 'bar',
  722. showBackground: true,
  723. itemStyle: {
  724. normal:{
  725. color: '#87CEFA'
  726. }
  727. },
  728. backgroundStyle: {
  729. color: '#FFFFFF'
  730. }
  731. }]
  732. };
  733. // 绘制图表
  734. iterationAndProduct.setOption(option);
  735. },
  736. searchXmBranchState(){
  737. listXmBranchState({branchId:this.userInfo.branchId}).then(res=>{
  738. var tips=res.data.tips;
  739. if(tips.isOk){
  740. this.xmBranchState=res.data.data[0]
  741. }
  742. });
  743. }
  744. },
  745. mounted() {
  746. this.$nextTick(() => {
  747. this.maxTableHeight=util.calcTableMaxHeight(this.$refs.table.$el)
  748. });
  749. this.drawAllBar();
  750. this.drawTaskByDate();
  751. this.drawPieBug();
  752. this.drawCostPie();
  753. this.drawWorkload();
  754. this.drawIterationProduct();
  755. this.searchXmBranchState();
  756. },
  757. };
  758. </script>
  759. <style scoped lang="scss">
  760. .container {
  761. margin: 10px;
  762. }
  763. .header {
  764. display: flex;
  765. justify-content: flex-start;
  766. padding: 10px;
  767. span {
  768. padding-right: 15px;
  769. }
  770. }
  771. .col {
  772. margin-bottom: 20px;
  773. }
  774. .icon {
  775. color: #fff;
  776. height: 30px;
  777. width: 30px;
  778. border-radius: 15px;
  779. text-align: center;
  780. line-height: 30px;
  781. font-size: 20px;
  782. display: inline-block;
  783. margin-right: 5px;
  784. }
  785. .icon2 {
  786. color: #000000;
  787. height: 30px;
  788. width: 30px;
  789. border-radius: 15px;
  790. text-align: center;
  791. line-height: 30px;
  792. font-size: 20px;
  793. display: inline-block;
  794. margin-right: 5px;
  795. margin-left: 5px;
  796. }
  797. .item {
  798. display: flex;
  799. justify-content: flex-start;
  800. position: relative;
  801. .progress-item{
  802. position:absolute; width:80%;
  803. }
  804. }
  805. .card-font {
  806. color: #000000;
  807. font-size: 12px;
  808. .el-col {
  809. margin-bottom: 20px;
  810. }
  811. }
  812. .calendar-header {
  813. display: flex;
  814. justify-content: space-between;
  815. .cal-header-boxs {
  816. flex: 1;
  817. display: flex;
  818. justify-content: flex-end;
  819. .cal-header-box {
  820. padding: 5px;
  821. height: 45px;
  822. margin-left: 10px;
  823. }
  824. .box-icon {
  825. text-align: center;
  826. }
  827. .box-info {
  828. text-align: center;
  829. font-size: 12px;
  830. color: #000000;
  831. }
  832. }
  833. }
  834. .el-tag:hover {
  835. cursor: pointer;
  836. }
  837. .value {
  838. cursor: pointer;
  839. }
  840. .reference {
  841. margin-top: 10px;
  842. font-size: 12px;
  843. }
  844. .click {
  845. background: #e9f7ff;
  846. }
  847. .calendar-box {
  848. display: flex;
  849. justify-content: flex-start;
  850. }
  851. </style>
  852. <style>
  853. .app-container{
  854. padding: 20px;
  855. padding-bottom: 0;
  856. }
  857. </style>