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.

478 lines
14 KiB

5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
  1. <template>
  2. <div id="data-view">
  3. <dv-full-screen-container>
  4. <top-header :title="'唛盟项目管理综合数据监控'"/>
  5. <div class="main-content">
  6. <digital-flop :data="digitalFlopData" :title="'汇总数据'" />
  7. <div class="block-left-right-content">
  8. <ranking-board :data="rankingBoardData" :title="'项目进度'" />
  9. <div class="block-top-bottom-content">
  10. <div class="block-top-content">
  11. <rose-chart :data="roseChartData" :title="'资金分布'"/>
  12. <water-level-chart :data="waterLevelChartData" :title="'计划资金累计完成情况'"/>
  13. <scroll-board :data="scrollBoardData" :title="'动态'" :header="['时间','操作人','动作','备注']"/>
  14. </div>
  15. <cards :data="cardsData" :title="'产品'" />
  16. </div>
  17. </div>
  18. </div>
  19. </dv-full-screen-container>
  20. </div>
  21. </template>
  22. <script>
  23. import Vue from 'vue'
  24. import topHeader from './topHeader'
  25. import digitalFlop from './digitalFlop'
  26. import rankingBoard from './rankingBoard'
  27. import roseChart from './roseChart'
  28. import waterLevelChart from './waterLevelChart'
  29. import scrollBoard from './scrollBoard'
  30. import cards from './cards'
  31. import dataV from '@jiaminghi/data-view'
  32. Vue.use(dataV)
  33. import util from '@/common/js/util';//全局公共库
  34. import config from '@/common/config';//全局公共库
  35. import { listOption } from '@/api/mdp/meta/itemOption';//下拉框数据查询
  36. import { listXmBranchState } from '@/api/xm/core/xmBranchState';
  37. import { listXmProjectState} from '@/api/xm/core/xmProjectState';
  38. import { listXmBranchTaskTypeState } from '@/api/xm/core/xmBranchTaskTypeState';
  39. import { listXmRecord } from '@/api/xm/core/xmRecord';
  40. import { listXmProductState } from '@/api/xm/core/xmProductState';
  41. import { mapGetters } from 'vuex'
  42. export default {
  43. name: 'BranchDataView',
  44. components: {
  45. topHeader,
  46. digitalFlop,
  47. rankingBoard,
  48. roseChart,
  49. waterLevelChart,
  50. scrollBoard,
  51. cards
  52. },
  53. computed: {
  54. ...mapGetters([
  55. 'userInfo'
  56. ]),
  57. digitalFlopData(){
  58. if(!this.xmBranchState){
  59. return null;
  60. }
  61. var digitalFlopData = [
  62. {
  63. title: '累计金额',
  64. number: {
  65. number: [(this.floatValue(this.xmBranchState.totalBudgetNouserAmount) + this.floatValue(this.xmBranchState.totalBudgetIuserAmount) + this.floatValue(this.xmBranchState.totalBudgetOuserAmount))/10000],
  66. content: '{nt}',
  67. textAlign: 'right',
  68. style: {
  69. fill: '#40faee',
  70. fontWeight: 'bold'
  71. }
  72. },
  73. unit: '万元'
  74. },
  75. {
  76. title: '发布总任务数',
  77. number: {
  78. number: [this.xmBranchState.totalTaskCnt ],
  79. content: '{nt}',
  80. textAlign: 'right',
  81. style: {
  82. fill: '#4d99fc',
  83. fontWeight: 'bold'
  84. }
  85. },
  86. unit: '个'
  87. },
  88. {
  89. title: '项目',
  90. number: {
  91. number: [this.xmBranchState.projectCnt ],
  92. content: '{nt}',
  93. textAlign: 'right',
  94. style: {
  95. fill: '#f46827',
  96. fontWeight: 'bold'
  97. }
  98. },
  99. unit: '个'
  100. },
  101. {
  102. title: '参与人数',
  103. number: {
  104. number: [this.xmBranchState.totalStaffCnt],
  105. content: '{nt}',
  106. textAlign: 'right',
  107. style: {
  108. fill: '#40faee',
  109. fontWeight: 'bold'
  110. }
  111. },
  112. unit: '人'
  113. },
  114. {
  115. title: '客户',
  116. number: {
  117. number: [this.xmBranchState.productCnt],
  118. content: '{nt}',
  119. textAlign: 'right',
  120. style: {
  121. fill: '#4d99fc',
  122. fontWeight: 'bold'
  123. }
  124. },
  125. unit: '个'
  126. },
  127. {
  128. title: '需求',
  129. number: {
  130. number: [this.xmBranchState.menuCnt],
  131. content: '{nt}',
  132. textAlign: 'right',
  133. style: {
  134. fill: '#f46827',
  135. fontWeight: 'bold'
  136. }
  137. },
  138. unit: '个'
  139. },
  140. {
  141. title: '产品',
  142. number: {
  143. number: [this.xmBranchState.productCnt],
  144. content: '{nt}',
  145. textAlign: 'right',
  146. style: {
  147. fill: '#40faee',
  148. fontWeight: 'bold'
  149. }
  150. },
  151. unit: '个'
  152. },
  153. {
  154. title: '测试用例',
  155. number: {
  156. number: [this.xmBranchState.testCases],
  157. content: '{nt}',
  158. textAlign: 'right',
  159. style: {
  160. fill: '#4d99fc',
  161. fontWeight: 'bold'
  162. }
  163. },
  164. unit: '个'
  165. },
  166. {
  167. title: '迭代',
  168. number: {
  169. number: [this.xmBranchState.iterationCnt],
  170. content: '{nt}',
  171. textAlign: 'right',
  172. style: {
  173. fill: '#f46827',
  174. fontWeight: 'bold'
  175. }
  176. },
  177. unit: '个'
  178. }
  179. ]
  180. return digitalFlopData;
  181. },
  182. rankingBoardData(){
  183. if( !this.xmProjectStates || this.xmProjectStates.length==0 ){
  184. return [];
  185. }
  186. var rankingBoardData=this.xmProjectStates.map(i=>{
  187. return {name:i.projectName,value:i.totalProgress+'%'}
  188. })
  189. return rankingBoardData
  190. },
  191. roseChartData(){
  192. var taskTypeList=this.options.taskType
  193. if(this.xmBranchTaskTypeStates && this.xmBranchTaskTypeStates.length>0){
  194. var xmBranchTaskTypeStates=this.xmBranchTaskTypeStates.filter(i=>i.planAmount>0);
  195. var roseChartData=xmBranchTaskTypeStates.map(i=>{
  196. if(!taskTypeList || taskTypeList.length==0){
  197. return {
  198. name:i.taskType?i.taskType:'其它',
  199. value:i.planAmount?i.planAmount:0
  200. }
  201. }else{
  202. var taskTypes=taskTypeList.filter(k=>k.optionValue==i.taskType)
  203. if(taskTypes && taskTypes.length>0){
  204. var taskType=taskTypes[0]
  205. return {
  206. name:taskType.optionName,
  207. value:i.planAmount?i.planAmount:0
  208. }
  209. }else{
  210. return {
  211. name:i.taskType?i.taskType:'其它',
  212. value:i.planAmount?i.planAmount:0
  213. }
  214. }
  215. }
  216. })
  217. return roseChartData
  218. }else{
  219. return null;
  220. }
  221. },
  222. waterLevelChartData(){
  223. if(this.xmBranchState){
  224. var data={}
  225. var allAmount=this.floatValue(this.xmBranchState.totalBudgetNouserAmount) + this.floatValue(this.xmBranchState.totalBudgetIuserAmount) + this.floatValue(this.xmBranchState.totalBudgetOuserAmount);
  226. data.finishNum= this.floatValue(this.xmBranchState.totalCostNouserAmount) + this.floatValue(this.xmBranchState.totalCostIuserAmount) +this.floatValue(this.xmBranchState.totalCostOuserAmount)
  227. data.finishPercent= parseFloat(data.finishNum/allAmount * 100).toFixed(0)
  228. return data;
  229. }else{
  230. return null;
  231. }
  232. },
  233. scrollBoardData(){
  234. if(this.xmRecords && this.xmRecords.length>0){
  235. var data = this.xmRecords.map(i=>{
  236. return [i.operTime,i.operUsername,i.action,i.remarks]
  237. })
  238. return data;
  239. }else{
  240. return null;
  241. }
  242. },
  243. cardsData(){
  244. if(this.xmProductStates && this.xmProductStates.length>0){
  245. var totalPlanWorkload=this.floatValue(this.xmBranchState.totalPlanWorkload)
  246. return this.xmProductStates.map(i=>{
  247. i.totalPlanWorkload=totalPlanWorkload
  248. return i;
  249. })
  250. }else{
  251. return null;
  252. }
  253. }
  254. },
  255. data () {
  256. return {
  257. xmBranchState:null,
  258. xmProjectStates:[],
  259. xmBranchTaskTypeStates:[],
  260. xmRecords:[],
  261. xmProductStates:[],
  262. options:{
  263. taskType:[],
  264. },
  265. xmRecordPageInfo:{//分页数据
  266. total:0,//服务器端收到0时,会自动计算总记录数,如果上传>0的不自动计算。
  267. pageSize:20,//每页数据
  268. count:false,//是否需要重新计算总记录数
  269. pageNum:1,//当前页码、从1开始计算
  270. orderFields:["oper_time"],//排序列 如 ['sex','student_id'],必须为数据库字段
  271. orderDirs:["desc"]//升序 asc,降序desc 如 性别 升序、学生编号降序 ['asc','desc']
  272. },
  273. xmProjectStatePageInfo:{//分页数据
  274. total:0,//服务器端收到0时,会自动计算总记录数,如果上传>0的不自动计算。
  275. pageSize:20,//每页数据
  276. count:false,//是否需要重新计算总记录数
  277. pageNum:1,//当前页码、从1开始计算
  278. orderFields:["calc_time"],//排序列 如 ['sex','student_id'],必须为数据库字段
  279. orderDirs:["desc"]//升序 asc,降序desc 如 性别 升序、学生编号降序 ['asc','desc']
  280. },
  281. xmProductStatePageInfo:{//分页数据
  282. total:0,//服务器端收到0时,会自动计算总记录数,如果上传>0的不自动计算。
  283. pageSize:20,//每页数据
  284. count:false,//是否需要重新计算总记录数
  285. pageNum:1,//当前页码、从1开始计算
  286. orderFields:["calc_time"],//排序列 如 ['sex','student_id'],必须为数据库字段
  287. orderDirs:["desc"]//升序 asc,降序desc 如 性别 升序、学生编号降序 ['asc','desc']
  288. },
  289. }
  290. },
  291. methods: {
  292. getXmBranchState(){
  293. var params = {
  294. branchId:this.userInfo.branchId
  295. }
  296. listXmBranchState(params).then(res=>{
  297. var tips = res.data.tips;
  298. if(tips.isOk){
  299. if(res.data.data.length>0){
  300. this.xmBranchState=res.data.data[0]
  301. }
  302. }
  303. });
  304. },
  305. getXmProjectStates(){
  306. let params = {
  307. pageSize: this.xmProjectStatePageInfo.pageSize,
  308. pageNum: this.xmProjectStatePageInfo.pageNum,
  309. total: this.xmProjectStatePageInfo.total,
  310. count:this.xmProjectStatePageInfo.count
  311. };
  312. if(this.xmProjectStatePageInfo.orderFields!=null && this.xmProjectStatePageInfo.orderFields.length>0){
  313. let orderBys=[];
  314. for(var i=0;i<this.xmProjectStatePageInfo.orderFields.length;i++){
  315. orderBys.push(this.xmProjectStatePageInfo.orderFields[i]+" "+this.xmProjectStatePageInfo.orderDirs[i])
  316. }
  317. params.orderBy= orderBys.join(",")
  318. }
  319. params.branchId=this.userInfo.branchId
  320. listXmProjectState(params).then(res=>{
  321. var tips = res.data.tips;
  322. if(tips.isOk){
  323. if(res.data.data.length>0){
  324. this.xmProjectStates=res.data.data
  325. }
  326. }
  327. });
  328. },
  329. getXmBranchTaskTypeStates(){
  330. var params = {
  331. branchId:this.userInfo.branchId
  332. }
  333. listXmBranchTaskTypeState(params).then(res=>{
  334. var tips = res.data.tips;
  335. if(tips.isOk){
  336. if(res.data.data.length>0){
  337. this.xmBranchTaskTypeStates=res.data.data
  338. }
  339. }
  340. });
  341. },//获取列表 XmRecord xm_record
  342. getXmRecords() {
  343. let params = {
  344. pageSize: this.xmRecordPageInfo.pageSize,
  345. pageNum: this.xmRecordPageInfo.pageNum,
  346. total: this.xmRecordPageInfo.total,
  347. count:this.xmRecordPageInfo.count
  348. };
  349. if(this.xmRecordPageInfo.orderFields!=null && this.xmRecordPageInfo.orderFields.length>0){
  350. let orderBys=[];
  351. for(var i=0;i<this.xmRecordPageInfo.orderFields.length;i++){
  352. orderBys.push(this.xmRecordPageInfo.orderFields[i]+" "+this.xmRecordPageInfo.orderDirs[i])
  353. }
  354. params.orderBy= orderBys.join(",")
  355. }
  356. listXmRecord(params).then((res) => {
  357. var tips=res.data.tips;
  358. if(tips.isOk){
  359. this.xmRecordPageInfo.total = res.data.total;
  360. this.xmRecordPageInfo.count=false;
  361. this.xmRecords = res.data.data;
  362. }else{
  363. }
  364. }) ;
  365. },
  366. //获取列表 XmProductState 功能状态表,无需前端维护,所有数据由汇总统计得出
  367. getXmProductStates() {
  368. let params = {
  369. pageSize: this.xmProductStatePageInfo.pageSize,
  370. pageNum: this.xmProductStatePageInfo.pageNum,
  371. total: this.xmProductStatePageInfo.total,
  372. count:this.xmProductStatePageInfo.count
  373. };
  374. if(this.xmProductStatePageInfo.orderFields!=null && this.xmProductStatePageInfo.orderFields.length>0){
  375. let orderBys=[];
  376. for(var i=0;i<this.xmProductStatePageInfo.orderFields.length;i++){
  377. orderBys.push(this.xmProductStatePageInfo.orderFields[i]+" "+this.xmProductStatePageInfo.orderDirs[i])
  378. }
  379. params.orderBy= orderBys.join(",")
  380. }
  381. params.branchId=this.userInfo.branchId
  382. listXmProductState(params).then((res) => {
  383. var tips=res.data.tips;
  384. if(tips.isOk){
  385. this.xmProductStatePageInfo.total = res.data.total;
  386. this.xmProductStatePageInfo.count=false;
  387. this.xmProductStates = res.data.data;
  388. }else{
  389. }
  390. }) ;
  391. },
  392. floatValue(value){
  393. if(!value){
  394. return 0.0;
  395. }else{
  396. return value
  397. }
  398. }
  399. },
  400. mounted(){
  401. this.getXmBranchState();
  402. this.getXmProjectStates();
  403. this.getXmBranchTaskTypeStates();
  404. this.getXmRecords();
  405. this.getXmProductStates();
  406. listOption([{categoryId:'all',itemCode:'taskType'}] ).then(res=>{
  407. if(res.data.tips.isOk){
  408. this.options=res.data.data
  409. }
  410. });
  411. }
  412. }
  413. </script>
  414. <style lang="less">
  415. #data-view {
  416. width: 100%;
  417. height: 100%;
  418. background-color: #030409;
  419. color: #fff;
  420. #dv-full-screen-container {
  421. background-image: url('../../../../assets/image/datav_bg.png');
  422. background-size: 100% 100%;
  423. box-shadow: 0 0 3px blue;
  424. display: flex;
  425. flex-direction: column;
  426. }
  427. .main-content {
  428. flex: 1;
  429. display: flex;
  430. flex-direction: column;
  431. }
  432. .block-left-right-content {
  433. flex: 1;
  434. display: flex;
  435. margin-top: 20px;
  436. }
  437. .block-top-bottom-content {
  438. flex: 1;
  439. display: flex;
  440. flex-direction: column;
  441. box-sizing: border-box;
  442. padding-left: 20px;
  443. }
  444. .block-top-content {
  445. height: 55%;
  446. display: flex;
  447. flex-grow: 0;
  448. box-sizing: border-box;
  449. padding-bottom: 20px;
  450. }
  451. }
  452. </style>