yxpoint.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  1. <template>
  2. <div class="devicemenu">
  3. <el-space wrap :size="10">
  4. <el-input
  5. v-model="state.SearchVal"
  6. placeholder="筛选"
  7. style="width: 180px"
  8. size="mini"
  9. />
  10. <el-button class="buttons" size="mini" round @click="search"
  11. >查询</el-button
  12. >
  13. <el-button
  14. class="buttons"
  15. size="mini"
  16. round
  17. @click="handleEdit(state.addFormData)"
  18. :disabled="desc.code == ''"
  19. >新增</el-button
  20. >
  21. <el-upload
  22. class="upload-demo"
  23. :disabled="desc.code == ''"
  24. action="/sharding/device/input"
  25. :show-file-list="false"
  26. :on-success="handleSuccess"
  27. :on-progress="handleProgress"
  28. :on-error="handleError"
  29. >
  30. <el-button :disabled="desc.code == ''" class="buttons" size="mini" round
  31. >导入</el-button
  32. >
  33. </el-upload>
  34. <el-button
  35. class="buttons"
  36. size="mini"
  37. round
  38. @click="export2Excel"
  39. :disabled="desc.code == ''"
  40. >导出</el-button
  41. >
  42. </el-space>
  43. </div>
  44. <div class="yxpoint-table">
  45. <el-table
  46. :data="state.pointTableData"
  47. stripe
  48. style="width: 100%"
  49. height="calc(100% - 45px)"
  50. >
  51. <el-table-column type="index" width="50" />
  52. <el-table-column prop="metricCode" label="测点编码"></el-table-column>
  53. <el-table-column label="名称">
  54. <template #default="scope">
  55. <el-popover
  56. placement="right"
  57. popper-class="point-popover"
  58. :width="260"
  59. trigger="click"
  60. >
  61. <template #reference>
  62. <el-button
  63. type="text"
  64. style="color: #05bb4c"
  65. size="small"
  66. @click="handleClick(scope)"
  67. >{{ scope.row.name }}</el-button
  68. >
  69. </template>
  70. <el-table
  71. size="mini"
  72. :data="scope.row.deviceModelMetrics"
  73. max-height="400px"
  74. >
  75. <el-table-column
  76. property="devicemodel"
  77. label="机型"
  78. align="center"
  79. ></el-table-column>
  80. <el-table-column
  81. property="uniformcode"
  82. label="统一编码"
  83. align="center"
  84. ></el-table-column>
  85. <el-table-column
  86. property="multiplier"
  87. label="倍率"
  88. align="center"
  89. ></el-table-column>
  90. </el-table>
  91. </el-popover>
  92. </template>
  93. </el-table-column>
  94. <el-table-column prop="unitName" label="单位"></el-table-column>
  95. <el-table-column prop="categoryData" label="测点类型"></el-table-column>
  96. <el-table-column prop="categorysci" label="物理类型"></el-table-column>
  97. <el-table-column prop="categorysci" label="数据类型"></el-table-column>
  98. <el-table-column prop="description" label="描述"></el-table-column>
  99. <el-table-column label="操作" width="180" align="center">
  100. <template #default="scope">
  101. <el-button
  102. type="text"
  103. style="color: #05bb4c"
  104. @click="handleEdit(scope.row)"
  105. >编辑</el-button
  106. >
  107. <el-button
  108. type="text"
  109. style="color: red"
  110. @click="handleDelete(scope.row)"
  111. >删除</el-button
  112. >
  113. </template>
  114. </el-table-column>
  115. </el-table>
  116. <div class="pagination">
  117. <el-pagination
  118. layout="total, sizes, prev, pager, next"
  119. :page-sizes="[19, 50, 100, 200, 500]"
  120. @size-change="
  121. (value) => {
  122. query.limit = value;
  123. query.page = 1;
  124. getPoint(desc);
  125. }
  126. "
  127. :current-page="query.page"
  128. :page-size="query.limit"
  129. :total="pageTotal"
  130. @current-change="handlePageChange"
  131. ></el-pagination>
  132. </div>
  133. </div>
  134. <!-- 传感点编辑弹出框 -->
  135. <el-dialog v-model="editVisible" width="40%">
  136. <el-form :model="editFormData" label-width="80px">
  137. <el-form-item label="编码">
  138. <el-input v-model="editFormData.metriccode"></el-input>
  139. </el-form-item>
  140. <el-row :gutter="24">
  141. <el-col :span="12">
  142. <el-form-item label="名称">
  143. <el-input v-model="editFormData.name"></el-input>
  144. </el-form-item>
  145. </el-col>
  146. <el-col :span="12">
  147. <el-form-item label="英文名称">
  148. <el-input v-model="editFormData.enname"></el-input>
  149. </el-form-item>
  150. </el-col>
  151. </el-row>
  152. <el-row :gutter="24">
  153. <el-col :span="12">
  154. <el-form-item label="标准单位">
  155. <el-input v-model="editFormData.unitname"></el-input>
  156. </el-form-item>
  157. </el-col>
  158. <el-col :span="12">
  159. <el-form-item label="单位名称">
  160. <el-input v-model="editFormData.unitnamecn"></el-input>
  161. </el-form-item>
  162. </el-col>
  163. </el-row>
  164. <el-form-item label="描述">
  165. <el-input
  166. v-model="editFormData.description"
  167. :rows="3"
  168. type="textarea"
  169. clearable
  170. ></el-input>
  171. </el-form-item>
  172. <el-row :gutter="24">
  173. <el-col :span="12">
  174. <el-form-item label="数据类型">
  175. <el-select v-model="editFormData.categorydata" placeholder="Select">
  176. <el-option
  177. v-for="item in state.categorydataoptions"
  178. :key="item"
  179. :label="item"
  180. :value="item"
  181. >
  182. </el-option>
  183. </el-select>
  184. </el-form-item>
  185. </el-col>
  186. <el-col :span="12">
  187. <el-form-item label="结构">
  188. <el-cascader
  189. v-model="editFormData.structurecode"
  190. :options="cascaderdata"
  191. :props="{ checkStrictly: true, emitPath: false }"
  192. clearable
  193. />
  194. </el-form-item>
  195. </el-col>
  196. </el-row>
  197. <el-row :gutter="24">
  198. <el-col :span="12">
  199. <el-form-item label="物理类型">
  200. <el-input v-model="editFormData.categorysci"></el-input>
  201. </el-form-item>
  202. </el-col>
  203. <el-col :span="12">
  204. <el-form-item label="系统分类">
  205. <el-input v-model="editFormData.categorysys"></el-input>
  206. </el-form-item>
  207. </el-col>
  208. </el-row>
  209. <el-form-item label="适配机型" class="deviceModelClass">
  210. <el-select
  211. v-model="state.deviceModelSel"
  212. style="margin-right: 20px"
  213. placeholder="新增机型"
  214. size="mini"
  215. >
  216. <el-option
  217. v-for="item in state.deviceModel"
  218. :key="item.code"
  219. :label="item.code"
  220. :value="item.code"
  221. >
  222. </el-option>
  223. </el-select>
  224. <el-button
  225. v-show="state.deviceModelSel != ''"
  226. size="mini"
  227. class="buttons"
  228. round
  229. @click="deviceModelAdd()"
  230. >新增机型
  231. </el-button>
  232. <el-table
  233. :data="editFormData.deviceModelMetrics"
  234. style="width: 100%; margin-top: 10px"
  235. max-height="200px"
  236. >
  237. <el-table-column prop="devicemodel" label="机型" />
  238. <el-table-column label="倍率">
  239. <template #default="scope">
  240. <el-input v-model="scope.row.multiplier" size="mini" />
  241. </template>
  242. </el-table-column>
  243. <el-table-column label="统一编码">
  244. <template #default="scope">
  245. <el-input v-model="scope.row.uniformcode" size="mini" />
  246. </template>
  247. </el-table-column>
  248. </el-table>
  249. </el-form-item>
  250. </el-form>
  251. <template #footer>
  252. <span class="footerButton">
  253. <el-button size="mini" round @click="editVisible = false"
  254. >取 消</el-button
  255. >
  256. <el-button size="mini" round @click="saveEdit">确 定</el-button>
  257. </span>
  258. </template>
  259. </el-dialog>
  260. </template>
  261. <script setup>
  262. import { ref, onMounted, inject, reactive, watch } from "vue";
  263. import { ElMessageBox, ElMessage } from "element-plus";
  264. import {
  265. point,
  266. metrics,
  267. delmetrics,
  268. device_list,
  269. getWtModel,
  270. } from "@/api/zhbj/index.js";
  271. import { outExportExcel } from "@/tools/excel/exportExcel.js"; //引入文件
  272. onMounted(() => {
  273. getPoint(desc.value);
  274. getDeviceModel();
  275. getequipmentmodel_list();
  276. });
  277. let editFormData = ref({});
  278. let editVisible = ref(false); //传感点
  279. let desc = inject("desc");
  280. let treeId = inject("treeId");
  281. let cascaderdata = inject("cascaderdata");
  282. watch(
  283. () => treeId,
  284. (newV, old) => {
  285. state.addFormData.structurecode = desc.value.code;
  286. getPoint(desc.value);
  287. },
  288. {
  289. deep: true,
  290. }
  291. );
  292. let state = reactive({
  293. pointTableData: "",
  294. SearchVal: "",
  295. selectPoint: "",
  296. selectModel: "",
  297. modelList: [],
  298. categorydataoptions: ["AI", "DI", "CI"],
  299. addFormData: {
  300. categorydata: "AI",
  301. categoryres1: null,
  302. categoryres2: null,
  303. categoryres3: null,
  304. categoryres4: null,
  305. categoryres5: null,
  306. categorysci: null,
  307. categorysys: null,
  308. description: null,
  309. deviceid: "windturbine",
  310. enname: null,
  311. id: null,
  312. metriccode: "",
  313. name: "",
  314. structurecode: "",
  315. unitname: null,
  316. unitnamecn: null,
  317. deviceModelMetrics: [],
  318. },
  319. });
  320. const query = reactive({
  321. page: 1,
  322. limit: 19,
  323. });
  324. let pageTotal = ref(0);
  325. const search = async () => {
  326. getPoint(desc.value);
  327. };
  328. // getPoint
  329. const getPoint = async (node) => {
  330. const res = await point(
  331. node.code,
  332. query.page,
  333. query.limit,
  334. state.selectPoint,
  335. state.SearchVal,
  336. "windturbine",
  337. state.selectModel
  338. );
  339. pageTotal.value = res.total;
  340. state.pointTableData = res.records
  341. ?.sort((a, b) => {
  342. return a.id - b.id;
  343. })
  344. .map((item, index) => {
  345. return { ...item, index: index + 1 };
  346. });
  347. };
  348. // 机型
  349. const getequipmentmodel_list = async () => {
  350. const { data } = await getWtModel();
  351. state.modelList = data;
  352. };
  353. // 测点 编辑
  354. const handleEdit = (row) => {
  355. if (!row.deviceModelMetrics) {
  356. row.deviceModelMetrics = [];
  357. }
  358. editFormData.value = row;
  359. editVisible.value = true;
  360. };
  361. //测点 add
  362. const postmetrics = async () => {
  363. const res = await metrics(editFormData.value);
  364. if (res.code == 200) {
  365. ElMessage.success(`操作成功!`);
  366. editVisible.value = false;
  367. } else {
  368. ElMessage.success(res.msg);
  369. }
  370. getPoint(desc.value);
  371. };
  372. // 保存编辑
  373. const saveEdit = async () => {
  374. postmetrics();
  375. };
  376. // 测点 删除
  377. const handleDelete = (row) => {
  378. // 二次确认删除
  379. ElMessageBox.confirm("确定要删除吗?", "提示", {
  380. type: "warning",
  381. })
  382. .then(async () => {
  383. const res = await delmetrics(row.id);
  384. if (res == 1) {
  385. ElMessage.success(`删除成功!`);
  386. } else {
  387. ElMessage.success("删除失败");
  388. }
  389. getPoint(desc.value);
  390. })
  391. .catch(() => {});
  392. };
  393. //deviceModelAdd 新增机型
  394. const deviceModelAdd = async () => {
  395. if (state.deviceModelSel == "") return;
  396. let obj = {
  397. deviceid: editFormData.value.deviceid,
  398. devicemodel: state.deviceModelSel,
  399. id: null,
  400. metriccode: editFormData.value.metriccode,
  401. multiplier: 0,
  402. uniformcode: "",
  403. };
  404. editFormData.value.deviceModelMetrics.push(obj);
  405. };
  406. //getDeviceModel
  407. const getDeviceModel = async () => {
  408. const res = await device_list();
  409. state.deviceModel = res;
  410. };
  411. // 分页导航
  412. const handlePageChange = (val) => {
  413. query.page = val;
  414. getPoint(desc.value);
  415. };
  416. // 批量导入
  417. const handleSuccess = (response, file, fileList) => {
  418. ElMessage.success("导入成功!");
  419. getPoint(desc.value);
  420. };
  421. const handleProgress = (response, file, fileList) => {};
  422. const handleError = (response, file, fileList) => {
  423. ElMessage.success("导入失败!");
  424. };
  425. // 批量导出
  426. const export2Excel = async () => {
  427. const tableData = await point(
  428. desc.value.code,
  429. 1,
  430. 99999999,
  431. state.selectPoint,
  432. state.SearchVal,
  433. "windturbine",
  434. state.selectModel
  435. );
  436. ElMessage.success(`导出成功!`);
  437. const tableHeader = [
  438. "上级结构编码",
  439. "测点编码",
  440. "名称",
  441. "英文名称",
  442. "单位",
  443. "测点类型",
  444. "物理类型",
  445. "描述",
  446. ];
  447. const tableKey = [
  448. "structurecode",
  449. "metriccode",
  450. "name",
  451. "enname",
  452. "unitname",
  453. "categorydata",
  454. "categorysci",
  455. "description",
  456. ];
  457. outExportExcel(tableHeader, tableKey, tableData.records, "测点导出excel");
  458. };
  459. const handleClick = ({ row }) => {
  460. console.log(row.index);
  461. };
  462. </script>
  463. <style lang="less" scoped>
  464. .buttons {
  465. background-color: rgba(5, 187, 76, 0.2);
  466. border: 1px solid #3b6c53;
  467. color: #b3b3b3;
  468. font-size: 14px;
  469. &:hover {
  470. background-color: rgba(5, 187, 76, 0.5);
  471. color: #ffffff;
  472. }
  473. }
  474. .devicemenu {
  475. margin-bottom: 10px;
  476. }
  477. .yxpoint-table {
  478. height: calc(100% - 39px);
  479. }
  480. .devicemenu {
  481. margin-bottom: 10px;
  482. }
  483. </style>
  484. <style lang="less">
  485. .point-popover {
  486. &.is-light {
  487. background: #081410;
  488. }
  489. .el-table {
  490. background: transparent;
  491. & th.el-table__cell {
  492. background: transparent;
  493. }
  494. & tr {
  495. background-color: transparent;
  496. }
  497. &::before {
  498. background-color: transparent;
  499. }
  500. }
  501. .el-popper__arrow::before {
  502. background: #081410 !important;
  503. border: 1px solid #081410 !important;
  504. }
  505. }
  506. </style>