dataMeterNew.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624
  1. import {
  2. getProject,
  3. getFaultAnalysis,
  4. getIssueList,
  5. getProjectActive,
  6. getNotificationList,
  7. getMediaList,
  8. getMonitorList,
  9. getUserGuide,
  10. getDailyList,
  11. getProjectProgress,
  12. deleteFile,
  13. getProjectTotalProgress,
  14. getLayoutOptions,
  15. saveLayoutOptions,
  16. getProjectAlarm,
  17. getBreakdownRecord,
  18. getProjectList,
  19. getAutoPatrol,
  20. getBreakdownList,
  21. getPatrolRecord,
  22. } from '@/services/DataMeter';
  23. import { queryProjectFileList } from '@/services/FileAdmin';
  24. import { getprojectPlanProgress, getProjectRealProgress } from '@/services/projectPlanProgress';
  25. import { getRepairRecord } from '@/services/EquipmentMaintenance';
  26. import { queryConfigList, queryTemplateList } from '@/services/CharUtils';
  27. import { queryPatrolRecord } from '@/services/patrol';
  28. import { message } from 'antd';
  29. import { DEFAULT_LAYOUT, DEFAULT_MAP_LAYOUT } from '@/components/DataMeter/config';
  30. import { getDefaultConfList } from '@/services/ProjectAdmin';
  31. const PLAN_TYPE = {
  32. 15: 1,
  33. 3: 3,
  34. 12: 4,
  35. };
  36. export default {
  37. namespace: 'dataMeterNew',
  38. state: {
  39. projectDetail: {},
  40. faultAnalysis: [],
  41. issueList: [],
  42. projectActive: [],
  43. news: [],
  44. memorabilia: [],
  45. awards: [],
  46. notificationList: [],
  47. projectAlarmList: [],
  48. repairList: [],
  49. breakdownList: [],
  50. mediaImgList: [],
  51. mediaVideo: null,
  52. monitorList: [],
  53. userGuideList: [],
  54. dailyList: [],
  55. projectProgress: null,
  56. projectTotalProgress: {
  57. AllProgress: 0,
  58. },
  59. layout: {
  60. 0: {
  61. config_json: [],
  62. },
  63. 1: {
  64. config_json: [],
  65. },
  66. 2: {
  67. config_json: [],
  68. },
  69. },
  70. chartConfigList: [],
  71. realProgress: {},
  72. progress: {},
  73. // currentChart: {}
  74. projectList: [],
  75. autoReport: {},
  76. patrolRecordDetail: {},
  77. patrolList: [],
  78. fileList: [],
  79. defaultConf: {},
  80. layoutAdmin: {
  81. 0: {
  82. config_json: [],
  83. },
  84. 1: {
  85. config_json: [],
  86. },
  87. 2: {
  88. config_json: [],
  89. },
  90. },
  91. },
  92. effects: {
  93. *getAutoPatrol({ payload, callback }, { call, put }) {
  94. const response = yield call(getAutoPatrol, payload);
  95. if (response) {
  96. // 查询数据报表详情
  97. const { data } = yield call(queryPatrolRecord, { recordId: response.data[0].Id });
  98. if (data) {
  99. const creatorName = data.CreatorUser && data.CreatorUser.CName;
  100. var status = {};
  101. let Items = [];
  102. const getItems = (item, patrolType) => {
  103. let key;
  104. if (patrolType == 1) {
  105. key = item.PatrolName;
  106. } else {
  107. key = item.DeviceCode + '-' + item.DeviceName;
  108. }
  109. item.patrolType = patrolType;
  110. item.ThresholdEnum = item.TemplateItem.ThresholdEnum;
  111. item.Type = item.TemplateItem.Type;
  112. if (!status[key]) status[key] = { normal: 0, error: 0 };
  113. if (item.Status == 1) {
  114. status[key].error++;
  115. } else {
  116. status[key].normal++;
  117. }
  118. return item;
  119. };
  120. data.ItemsExtend.forEach(item => {
  121. console.log(Items);
  122. if (item.PatrolCardRecordItemAssocThreshold) {
  123. var arr = item.PatrolCardRecordItemAssocThreshold.map(i => getItems(i, 1));
  124. Items = Items.concat(arr);
  125. } else {
  126. Items.push(getItems(item, 0));
  127. }
  128. });
  129. data.Items = Items;
  130. data.Points.forEach(item => {
  131. let key;
  132. if (item.PatrolType == 1) {
  133. key = item.DeviceName;
  134. } else {
  135. key = item.DeviceCode + '-' + item.DeviceName;
  136. }
  137. item.creatorName = creatorName;
  138. item.level = `${item.ExceptionLevel || '-'}/${item.DeviceLevel || '-'}`;
  139. item.status = status[key] || { normal: 0, error: 0 };
  140. });
  141. console.log(data);
  142. callback && callback(data);
  143. yield put({
  144. type: 'save',
  145. payload: { autoReport: data },
  146. });
  147. }
  148. }
  149. },
  150. *getProject({ payload }, { call, put }) {
  151. const response = yield call(getProject, payload);
  152. if (response) {
  153. yield put({
  154. type: 'save',
  155. payload: { projectDetail: response.data },
  156. });
  157. }
  158. },
  159. *getFaultAnalysis({ payload }, { call, put }) {
  160. const response = yield call(getFaultAnalysis, payload);
  161. if (response) {
  162. var list = [];
  163. response.data.forEach(item => {
  164. item.Details.forEach(err => {
  165. list.push({
  166. ...item,
  167. ...err,
  168. });
  169. });
  170. });
  171. yield put({
  172. type: 'save',
  173. payload: { faultAnalysis: list },
  174. });
  175. }
  176. },
  177. *getIssueList({ payload }, { call, put }) {
  178. const response = yield call(getIssueList, payload);
  179. if (response) {
  180. yield put({
  181. type: 'save',
  182. payload: { issueList: response.data.list },
  183. });
  184. }
  185. },
  186. *getRepairRecord({ payload }, { call, put }) {
  187. const response = yield call(getRepairRecord, payload);
  188. if (response) {
  189. yield put({
  190. type: 'save',
  191. payload: { repairList: response.data.list },
  192. });
  193. }
  194. },
  195. *getBreakdownRecord({ payload }, { call, put }) {
  196. const response = yield call(getBreakdownList, payload);
  197. if (response) {
  198. yield put({
  199. type: 'save',
  200. payload: { breakdownList: response.data.list },
  201. });
  202. }
  203. },
  204. *getPatrolRecord({ payload }, { call, put }) {
  205. const response = yield call(getPatrolRecord, payload);
  206. if (response) {
  207. yield put({
  208. type: 'save',
  209. payload: { patrolList: response.data.list },
  210. });
  211. }
  212. },
  213. *getProjectAlarm({ payload }, { call, put }) {
  214. const response = yield call(getProjectAlarm, payload);
  215. if (response) {
  216. yield put({
  217. type: 'save',
  218. payload: { projectAlarmList: response.data.list },
  219. });
  220. }
  221. },
  222. *getProjectActive({ payload }, { call, put }) {
  223. const response = yield call(getProjectActive, payload);
  224. if (response) {
  225. let stateName;
  226. // 0-项目动态 1-新闻动态 2-大事记 3-所获奖项
  227. switch (payload.type) {
  228. case 0:
  229. stateName = 'projectActive';
  230. break;
  231. case 1:
  232. stateName = 'news';
  233. break;
  234. case 2:
  235. stateName = 'memorabilia';
  236. break;
  237. case 3:
  238. stateName = 'awards';
  239. break;
  240. }
  241. if (!stateName) return;
  242. yield put({
  243. type: 'save',
  244. payload: { [stateName]: response.data.list },
  245. });
  246. }
  247. },
  248. *getNotificationList({ payload }, { call, put }) {
  249. const response = yield call(getNotificationList, payload);
  250. if (response) {
  251. yield put({
  252. type: 'save',
  253. payload: { notificationList: response.data.list },
  254. });
  255. }
  256. },
  257. *getMediaList({ payload }, { call, put }) {
  258. const response = yield call(getMediaList, payload);
  259. if (response) {
  260. var mediaVideo = null,
  261. mediaImgList = [];
  262. response.data.forEach(item => {
  263. if (/\.mp4$/.test(item.Name)) {
  264. if (!mediaVideo) {
  265. mediaVideo = item;
  266. }
  267. } else {
  268. mediaImgList.push(item);
  269. }
  270. });
  271. yield put({
  272. type: 'save',
  273. payload: {
  274. mediaVideo,
  275. mediaImgList,
  276. },
  277. });
  278. }
  279. },
  280. *getMonitorList({ payload }, { call, put }) {
  281. const response = yield call(getMonitorList, payload);
  282. if (response) {
  283. var obj = JSON.parse(response.data.config_json) || {};
  284. yield put({
  285. type: 'save',
  286. // payload: { monitorList: response.data.list },
  287. payload: { monitorList: Object.keys(obj).map(key => obj[key]) || [] },
  288. });
  289. }
  290. },
  291. *getUserGuide({ payload }, { call, put }) {
  292. const response = yield call(getUserGuide, payload);
  293. if (response) {
  294. var list = [];
  295. response.data.list.forEach(item => {
  296. item.UserGuideFiles.forEach(file => {
  297. list.push({
  298. ...item,
  299. ...file,
  300. });
  301. });
  302. });
  303. yield put({
  304. type: 'save',
  305. payload: { userGuideList: list },
  306. });
  307. }
  308. },
  309. *getDailyList({ payload }, { call, put }) {
  310. const response = yield call(getDailyList, payload);
  311. if (response) {
  312. yield put({
  313. type: 'save',
  314. payload: { dailyList: response.data.list },
  315. });
  316. }
  317. },
  318. *getProjectPlanProgress({ payload, callback }, { call, put }) {
  319. const response = yield call(getprojectPlanProgress, payload);
  320. if (response) {
  321. var progress = response.data;
  322. Object.keys(progress).forEach(k => {
  323. if (
  324. progress[k] == '0001-01-01T00:00:00Z' ||
  325. progress[k] == '0001-01-01 00:00:00' ||
  326. progress[k] == '0001-01-01 00:00:00 +0000 UTC'
  327. ) {
  328. progress[k] = '';
  329. }
  330. });
  331. yield put({
  332. type: 'save',
  333. payload: { progress },
  334. });
  335. }
  336. },
  337. *getProjectRealProgress({ payload }, { call, put, select }) {
  338. const calcProgress = data => {
  339. let count = 0,
  340. total = 0;
  341. data.forEach(item => {
  342. total += item.TotalCount;
  343. count += item.RealCount;
  344. });
  345. return ((count / total) * 100).toFixed(2);
  346. };
  347. let { realProgress } = yield select(s => s.dataMeterNew);
  348. console.log(realProgress);
  349. var keys = Object.keys(PLAN_TYPE);
  350. for (let i = 0; i < keys.length; i++) {
  351. let k = keys[i];
  352. var response = yield call(getProjectRealProgress, {
  353. ...payload,
  354. type: PLAN_TYPE[k],
  355. });
  356. if (response) {
  357. let tempRealProgress = response.data.Task.map(item => ({
  358. ...item,
  359. RealCount: item.FinishList.length || 0,
  360. TotalCount: item.DeviceCodes ? item.DeviceCodes.length : 0,
  361. children: null,
  362. }));
  363. console.log(tempRealProgress);
  364. realProgress[k] = calcProgress(tempRealProgress);
  365. }
  366. }
  367. yield put({
  368. type: 'save',
  369. payload: { realProgress: { ...realProgress } },
  370. });
  371. },
  372. *getProjectProgress({ payload }, { call, put }) {
  373. const response = yield call(getProjectProgress, payload);
  374. if (response) {
  375. yield put({
  376. type: 'save',
  377. payload: { projectProgress: response.data },
  378. });
  379. }
  380. },
  381. *deleteFile({ payload }, { call, put }) {
  382. const response = yield call(deleteFile, payload);
  383. if (response) {
  384. yield put({
  385. type: 'getMediaList',
  386. payload: payload,
  387. });
  388. }
  389. },
  390. *getProjectTotalProgress({ payload }, { call, put }) {
  391. const response = yield call(getProjectTotalProgress, payload);
  392. if (response) {
  393. yield put({
  394. type: 'save',
  395. payload: { projectTotalProgress: response.data },
  396. });
  397. }
  398. },
  399. *getLayoutOptions({ payload }, { call, put, select }) {
  400. // if (payload.is_default == 1) {
  401. // // 默认配置的projectId为0
  402. // payload.projectId = 0;
  403. // }
  404. const response = yield call(getLayoutOptions, payload);
  405. if (response) {
  406. var layout = yield select(state => state.dataMeterNew.layout);
  407. if (payload.is_default == 1) {
  408. layout = yield select(state => state.dataMeterNew.layoutAdmin);
  409. }
  410. var defaultLayout = payload.sub_module === 0 ? DEFAULT_MAP_LAYOUT : DEFAULT_LAYOUT;
  411. var data = response.data;
  412. try {
  413. data.config_json = JSON.parse(data.config_json);
  414. // response.data.config_json = defaultLayout;
  415. } catch (error) {
  416. // 解析失败则使用默认布局
  417. data.config_json = defaultLayout;
  418. console.log(error);
  419. }
  420. layout[payload.sub_module] = data;
  421. if (payload.is_default == 0)
  422. yield put({
  423. type: 'save',
  424. payload: { layout: { ...layout } },
  425. });
  426. else
  427. yield put({
  428. type: 'save',
  429. payload: { layoutAdmin: { ...layout } },
  430. });
  431. }
  432. },
  433. *saveLayoutOptions({ payload }, { call, put, select }) {
  434. // if (payload.is_default == 1) {
  435. // // 默认配置的projectId为0
  436. // payload.projectId = 0;
  437. // }
  438. if (payload.config_json == '[]') {
  439. message.error('保存的配置不能为空');
  440. return;
  441. }
  442. var response = yield call(saveLayoutOptions, payload);
  443. if (response) {
  444. var layout = yield select(state => state.dataMeterNew.layout);
  445. if (payload.is_default == 1) {
  446. layout = yield select(state => state.dataMeterNew.layoutAdmin);
  447. }
  448. console.log(payload.config_json);
  449. layout[payload.sub_module].config_json = JSON.parse(payload.config_json);
  450. if (payload.is_default == 0)
  451. yield put({
  452. type: 'save',
  453. payload: { layout: { ...layout } },
  454. });
  455. else
  456. yield put({
  457. type: 'save',
  458. payload: { layoutAdmin: { ...layout } },
  459. });
  460. }
  461. },
  462. *resizeLayout({ payload }, { call, select, put }) {
  463. // 默认配置的projectId为0
  464. const response = yield call(getLayoutOptions, {
  465. ...payload,
  466. // projectId: 0,
  467. });
  468. if (response) {
  469. var layout = yield select(state => state.dataMeterNew.layout);
  470. var defaultLayout = payload.sub_module === 0 ? DEFAULT_MAP_LAYOUT : DEFAULT_LAYOUT;
  471. var config_json = response.data.config_json
  472. ? JSON.parse(response.data.config_json)
  473. : defaultLayout;
  474. // response.data.config_json = defaultLayout;
  475. // 将默认配置保存到本地
  476. layout[payload.sub_module].config_json = config_json;
  477. yield put({
  478. type: 'save',
  479. payload: { layout: { ...layout } },
  480. });
  481. yield call(saveLayoutOptions, {
  482. ...payload,
  483. config_json: JSON.stringify(config_json),
  484. is_default: 0,
  485. });
  486. }
  487. },
  488. *resizeDefaultLayout({ payload }, { call, select, put }) {
  489. var layout = yield select(state => state.dataMeterNew.layout);
  490. var config_json = payload.sub_module === 0 ? DEFAULT_MAP_LAYOUT : DEFAULT_LAYOUT;
  491. // 将默认配置保存到本地
  492. layout[payload.sub_module].config_json = config_json;
  493. yield put({
  494. type: 'save',
  495. payload: { layout: { ...layout } },
  496. });
  497. yield call(saveLayoutOptions, {
  498. ...payload,
  499. config_json: JSON.stringify(config_json),
  500. is_default: 0,
  501. });
  502. },
  503. *queryConfigList({ payload, callback }, { call, put }) {
  504. const {
  505. data: { list: tplList },
  506. } = yield call(queryTemplateList, { pageSize: 999 });
  507. const {
  508. data: { list: configList },
  509. } = yield call(queryConfigList, {
  510. ...payload,
  511. isNew: 1,
  512. pageSize: 9999,
  513. });
  514. let list = [];
  515. configList.map(item => {
  516. let template = tplList.find(tpl => tpl.ID == item.type);
  517. item.options = JSON.parse(item.options);
  518. item.template = template;
  519. list.push(item);
  520. });
  521. callback && callback(list);
  522. yield put({
  523. type: 'save',
  524. payload: {
  525. chartConfigList: list,
  526. },
  527. });
  528. },
  529. *queryConfig({ payload, callback }, { call, put }) {
  530. const response = yield call(queryConfigList, payload);
  531. if (response) {
  532. var currentChart = response.data.list[0];
  533. currentChart.options = JSON.parse(currentChart.options);
  534. let { options, configs, type } = currentChart;
  535. // 将接口返回的实时数据更新到图表中
  536. if (type != 'pfd') {
  537. if (!options.series) {
  538. callback && callback(currentChart);
  539. }
  540. let series = options.series[0];
  541. if (type == 'pie') {
  542. configs.forEach((item, index) => {
  543. series.data[index].value = item.value;
  544. });
  545. } else if (series.type == 'bar') {
  546. configs.forEach((item, index) => {
  547. series.data[index] = item.value;
  548. });
  549. }
  550. }
  551. callback && callback(currentChart);
  552. // yield put({
  553. // type: 'save',
  554. // payload: {
  555. // currentChart,
  556. // },
  557. // });
  558. }
  559. },
  560. *getProjectList({ payload, callback }, { call, put }) {
  561. const response = yield call(getProjectList, payload);
  562. if (response) {
  563. let nowDate = new Date();
  564. (response.data.list || []).map(item => {
  565. let type;
  566. if (!item.EndDate) {
  567. type = 2;
  568. } else {
  569. type = nowDate >= new Date(item.EndDate) ? 2 : 1;
  570. }
  571. item.type = type;
  572. });
  573. yield put({
  574. type: 'save',
  575. payload: { projectList: response.data.list },
  576. });
  577. console.log(response.data.list);
  578. callback && callback(response.data.list);
  579. }
  580. },
  581. *queryProjectFileList({ payload }, { call, put, select }) {
  582. try {
  583. const response = yield call(queryProjectFileList, {
  584. ...payload,
  585. deviceCode: -1,
  586. });
  587. if (response) {
  588. yield put({
  589. type: 'save',
  590. payload: { fileList: response.data },
  591. });
  592. }
  593. } catch (e) {
  594. console.error(e);
  595. }
  596. },
  597. *getDefaultConfList({ payload }, { call, put }) {
  598. const response = yield call(getDefaultConfList, payload);
  599. if (response) {
  600. yield put({
  601. type: 'save',
  602. payload: { defaultConf: response.data },
  603. });
  604. }
  605. },
  606. },
  607. reducers: {
  608. save(state, action) {
  609. return {
  610. ...state,
  611. ...action.payload,
  612. };
  613. },
  614. },
  615. };