alarm-center-1.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. <template>
  2. <div class="alarm-center-1">
  3. <div class="action-bar">
  4. <div class="query mg-b-16">
  5. <div class="query-items">
  6. <div class="query-item">
  7. <div class="lable">风场:</div>
  8. <div class="search-input">
  9. <el-select v-model="wpvalue" clearable placeholder="请选择" popper-class="select">
  10. <el-option v-for="item in wpoptions" :key="item.id" :label="item.name" :value="item.id">
  11. </el-option>
  12. </el-select>
  13. </div>
  14. </div>
  15. <div class="query-item">
  16. <div class="lable">开始日期:</div>
  17. <div class="search-input">
  18. <el-date-picker v-model="startdate" type="date" placeholder="选择日期" popper-class="date-select">
  19. </el-date-picker>
  20. </div>
  21. </div>
  22. <div class="query-item">
  23. <div class="lable">结束日期:</div>
  24. <div class="search-input">
  25. <el-date-picker v-model="enddate" type="date" placeholder="选择日期" popper-class="date-select">
  26. </el-date-picker>
  27. </div>
  28. </div>
  29. <div class="query-item">
  30. <div class="lable">规则:</div>
  31. <el-cascader style="width: 240px" size="mini" popper-class="search-select" :options="cascaderOptions"
  32. :props="cascaderProps" v-model="cascaderSel" collapse-tags :clearable='true'></el-cascader>
  33. </div>
  34. </div>
  35. <div class="query-actions">
  36. <button class="btn green" @click="searchData">搜索</button>
  37. <button class="btn green" @click="searchTree">筛选</button>
  38. <button class="btn green">导出</button>
  39. </div>
  40. </div>
  41. </div>
  42. <panel-3 class="table-panel">
  43. <table-2 :data="tableData" :height="'88vh'">
  44. <template v-for="(item, i) in column" :key="i" #[item]="scope">
  45. <div class="bar">
  46. <div class="bar-percent" :style="{
  47. width:
  48. (scope.data.count &&
  49. scope.data.count / (scope.data.count + scope.data.time)) *
  50. 100 +
  51. 'px',
  52. }"></div>
  53. <span class="value">{{
  54. scope.data.count && scope.data.count
  55. }}</span>
  56. </div>
  57. <div class="bar">
  58. <div class="bar-percent" :style="{
  59. width:
  60. (scope.data.count &&
  61. scope.data.time / (scope.data.count + scope.data.time)) *
  62. 100 +
  63. 'px',
  64. }"></div>
  65. <span class="value">{{ scope.data.count && scope.data.time }}</span>
  66. </div>
  67. </template>
  68. </table-2>
  69. </panel-3>
  70. </div>
  71. </template>
  72. <script>
  73. import Panel3 from "../../components/coms/panel/panel3.vue";
  74. import Table2 from "../../components/coms/table/table2.vue";
  75. export default {
  76. components: { Panel3, Table2 },
  77. data () {
  78. return {
  79. wpvalue: "",
  80. wpoptions: "",
  81. options: [],
  82. cascaderOptions: [],
  83. cascaderSel: [],
  84. cascaderProps: { multiple: true },
  85. column: [
  86. "风机偏航过程震动",
  87. "齿轮箱轴承温升超过40度",
  88. "三相电流不平衡",
  89. "断轴或联轴器打滑",
  90. "风速突变",
  91. ],
  92. columnObj: [
  93. {
  94. name: "风机编号",
  95. field: "name",
  96. },
  97. {
  98. name: "风机偏航过程震动",
  99. field: "风机偏航过程震动",
  100. align: "left",
  101. slot: true,
  102. },
  103. {
  104. name: "齿轮箱轴承温升超过40度",
  105. field: "齿轮箱轴承温升超过40度",
  106. align: "left",
  107. slot: true,
  108. },
  109. {
  110. name: "三相电流不平衡",
  111. field: "三相电流不平衡",
  112. align: "left",
  113. slot: true,
  114. },
  115. {
  116. name: "断轴或联轴器打滑",
  117. field: "断轴或联轴器打滑",
  118. align: "left",
  119. slot: true,
  120. },
  121. {
  122. name: "风速突变",
  123. align: "left",
  124. field: "风速突变",
  125. slot: true,
  126. },
  127. ],
  128. startdate: new Date(
  129. new Date(new Date().setDate(new Date().getDate() - 1))
  130. ).formatDate("yyyy-MM-dd"),
  131. enddate: new Date(new Date()).formatDate("yyyy-MM-dd"),
  132. tableData: {
  133. column: [
  134. {
  135. name: "风机编号",
  136. field: "name",
  137. },
  138. {
  139. name: "主轴温度温差大于8度",
  140. field: "v1",
  141. align: "left",
  142. slot: true,
  143. },
  144. {
  145. name: "浆叶角过小",
  146. field: "v2",
  147. align: "left",
  148. slot: true,
  149. },
  150. ],
  151. data: [
  152. {
  153. name: "MG01_01",
  154. v1: {
  155. count: 12,
  156. time: 0,
  157. },
  158. },
  159. ],
  160. },
  161. };
  162. },
  163. created () {
  164. this.search();
  165. },
  166. methods: {
  167. tabSelect (tab) { },
  168. async search () {
  169. const { data } = await this.API.requestData({
  170. subUrl: "powercompare/windfarmAjax",
  171. });
  172. console.warn(data);
  173. this.wpoptions = data.data;
  174. this.wpvalue = data.data[0].id;
  175. this.searchData();
  176. },
  177. async searchTree () {
  178. console.warn(this.cascaderSel);
  179. let arr = [];
  180. let columnObj = [
  181. {
  182. name: "风机编号",
  183. field: "name",
  184. },
  185. ];
  186. this.cascaderSel.forEach((e) => {
  187. let obj = {
  188. name: e[1],
  189. field: e[1],
  190. align: "left",
  191. slot: true,
  192. };
  193. columnObj.push(obj);
  194. arr.push(e[1]);
  195. });
  196. this.columnObj = columnObj;
  197. this.column = arr;
  198. this.searchData()
  199. console.warn(arr);
  200. },
  201. async searchData () {
  202. const { data } = await this.API.requestData({
  203. baseURL: "http://192.168.1.18:8075/",
  204. subUrl: "alarm/count/query/new",
  205. data: {
  206. stationid: this.wpvalue,
  207. startdate: new Date(this.startdate).formatDate("yyyy-MM-dd"),
  208. enddate: new Date(this.enddate).formatDate("yyyy-MM-dd"),
  209. },
  210. });
  211. console.warn(data);
  212. ////////
  213. const resData = data.data;
  214. // const resData =this.resdata;
  215. const column = this.columnObj;
  216. let dataAll = []; // 总数据集合
  217. resData.forEach((e) => {
  218. let obj = {
  219. name: Object.keys(e)[0],
  220. };
  221. let wpid = Object.keys(e)[0];
  222. e[wpid].forEach((k) => {
  223. column.forEach((c) => {
  224. if (k.alertText == c.name) {
  225. let obj1 = {
  226. count: k.count,
  227. time: k.time,
  228. };
  229. obj[k.alertText] = obj1;
  230. }
  231. });
  232. });
  233. dataAll.push(obj);
  234. });
  235. console.info(dataAll);
  236. this.tableData.column = column;
  237. this.tableData.data = dataAll;
  238. ///////////////////// 获取规则list
  239. const map = {};
  240. var windNum = [];
  241. for (let i in resData) {
  242. for (let k in resData[i]) {
  243. map[k] = resData[i][k];
  244. }
  245. }
  246. // nmap为新的map 整理数据结构
  247. const nmap = {};
  248. for (let kv in map) {
  249. var nchildMap = {};
  250. var childrenMap = map[kv];
  251. for (var ckv in childrenMap) {
  252. var cckey = childrenMap[ckv].alertText;
  253. var ccvalue = childrenMap[ckv];
  254. nchildMap[cckey] = ccvalue;
  255. }
  256. nmap[kv] = nchildMap;
  257. }
  258. windNum = Object.keys(nmap);
  259. var cascaderOptions = [];
  260. var root = {}; // 原始根节点
  261. var clumnsOnes = nmap[windNum[0]];
  262. console.warn(clumnsOnes);
  263. for (let k in clumnsOnes) {
  264. let f = clumnsOnes[k].relatePartsText
  265. ? clumnsOnes[k].relatePartsText
  266. : "其他";
  267. let fvalue = clumnsOnes[k].relateParts ? clumnsOnes[k].relateParts : "";
  268. if (root[f]) {
  269. // 已经存在此子节点
  270. if (!root[f].children[k]) {
  271. // 不存在子节点
  272. root[f].children[k] = {};
  273. root[f].children[k].value = root[f].children[k].label = k;
  274. root[f].fobj.children.push(root[f].children[k]);
  275. }
  276. } // 不存在子节点
  277. else {
  278. root[f] = {};
  279. // root[f].value = fvalue;
  280. // root[f].label = f;
  281. root[f].children = {};
  282. root[f].children[k] = {};
  283. root[f].children[k].value = root[f].children[k].label = k;
  284. // 将对象放入 cascaderOptions
  285. let childrenArray = [];
  286. childrenArray.push(root[f].children[k]);
  287. let fobj = {};
  288. fobj.value = fvalue;
  289. fobj.label = f;
  290. fobj.children = childrenArray;
  291. cascaderOptions.push(fobj);
  292. root[f].fobj = fobj;
  293. }
  294. }
  295. this.cascaderOptions = cascaderOptions;
  296. console.warn(cascaderOptions);
  297. },
  298. },
  299. };
  300. </script>
  301. <style lang="less">
  302. .alarm-center-1 {
  303. .action-bar {
  304. display: flex;
  305. .query {
  306. justify-content: flex-start;
  307. }
  308. }
  309. .table-panel {
  310. width: 100%;
  311. background: transparent;
  312. padding: 0;
  313. .bar {
  314. display: flex;
  315. align-items: center;
  316. height: 16px;
  317. margin: 8px 0;
  318. .bar-percent {
  319. height: 100%;
  320. background: @green;
  321. margin-right: 8px;
  322. }
  323. }
  324. }
  325. }
  326. </style>