point.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. <template>
  2. <div class="devicemenu">
  3. <el-space wrap :size="10">
  4. <el-button
  5. type="primary"
  6. @click="handleEdit(state.addFormData)"
  7. :disabled="desc.code == ''"
  8. >新增</el-button
  9. >
  10. <el-input
  11. v-model="state.SearchVal"
  12. placeholder="筛选"
  13. style="width: 180px"
  14. size="small"
  15. />
  16. <el-select
  17. v-model="state.selectModel"
  18. class="mr10"
  19. style="width: 180px"
  20. placeholder="全部"
  21. >
  22. <el-option
  23. v-for="item in state.modelList"
  24. :key="item"
  25. :value="item"
  26. :label="item"
  27. ></el-option>
  28. </el-select>
  29. <el-select
  30. v-model="state.selectPoint"
  31. class="mr10"
  32. style="width: 100px"
  33. placeholder="全部"
  34. >
  35. <el-option key="1" label="全部" value=""></el-option>
  36. <el-option key="2" label="遥测" value="AI"></el-option>
  37. <el-option key="3" label="遥调" value="MI"></el-option>
  38. <el-option key="4" label="计算" value="CI"></el-option>
  39. </el-select>
  40. <el-button type="primary" @click="search">查询</el-button>
  41. <el-upload
  42. class="upload-demo"
  43. :disabled="desc.code == ''"
  44. action="/sharding/device/input"
  45. :show-file-list="false"
  46. :on-success="handleSuccess"
  47. :on-progress="handleProgress"
  48. :on-error="handleError"
  49. >
  50. <el-button :disabled="desc.code == ''" type="primary">导入</el-button>
  51. </el-upload>
  52. <el-button
  53. type="primary"
  54. @click="export2Excel"
  55. :disabled="desc.code == ''"
  56. >导出</el-button
  57. >
  58. </el-space>
  59. </div>
  60. <el-table
  61. :data="state.pointTableData"
  62. stripe
  63. style="width: 100%"
  64. height="65vh"
  65. >
  66. <el-table-column type="index" width="50" />
  67. <el-table-column prop="metriccode" label="测点编码"></el-table-column>
  68. <el-table-column label="名称">
  69. <template #default="scope">
  70. <el-popover placement="right" :width="260" trigger="click">
  71. <template #reference>
  72. <el-button type="text" size="small">{{ scope.row.name }}</el-button>
  73. </template>
  74. <el-table :data="scope.row.deviceModelMetrics" max-height="400px">
  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. icon="el-icon-edit"
  104. @click="handleEdit(scope.row)"
  105. >编辑</el-button
  106. >
  107. <el-button
  108. type="text"
  109. icon="el-icon-delete"
  110. style="color: red"
  111. @click="handleDelete(scope.row)"
  112. >删除</el-button
  113. >
  114. </template>
  115. </el-table-column>
  116. </el-table>
  117. <div class="pagination">
  118. <el-pagination
  119. background
  120. layout="total, prev, pager, next"
  121. hide-on-single-page
  122. :current-page="query.page"
  123. :page-size="query.limit"
  124. :total="pageTotal"
  125. @current-change="handlePageChange"
  126. ></el-pagination>
  127. </div>
  128. <!-- 传感点编辑弹出框 -->
  129. <el-dialog v-model="editVisible" width="40%">
  130. <el-form :model="editFormData" label-width="80px">
  131. <el-form-item label="编码">
  132. <el-input v-model="editFormData.metriccode"></el-input>
  133. </el-form-item>
  134. <el-row :gutter="24">
  135. <el-col :span="12">
  136. <el-form-item label="名称">
  137. <el-input v-model="editFormData.name"></el-input>
  138. </el-form-item>
  139. </el-col>
  140. <el-col :span="12">
  141. <el-form-item label="英文名称">
  142. <el-input v-model="editFormData.enname"></el-input>
  143. </el-form-item>
  144. </el-col>
  145. </el-row>
  146. <el-row :gutter="24">
  147. <el-col :span="12">
  148. <el-form-item label="标准单位">
  149. <el-input v-model="editFormData.unitname"></el-input>
  150. </el-form-item>
  151. </el-col>
  152. <el-col :span="12">
  153. <el-form-item label="单位名称">
  154. <el-input v-model="editFormData.unitnamecn"></el-input>
  155. </el-form-item>
  156. </el-col>
  157. </el-row>
  158. <el-form-item label="描述">
  159. <el-input
  160. v-model="editFormData.description"
  161. :rows="3"
  162. type="textarea"
  163. clearable
  164. ></el-input>
  165. </el-form-item>
  166. <el-row :gutter="24">
  167. <el-col :span="12">
  168. <el-form-item label="数据类型">
  169. <el-select v-model="editFormData.categorydata" placeholder="Select">
  170. <el-option
  171. v-for="item in state.categorydataoptions"
  172. :key="item"
  173. :label="item"
  174. :value="item"
  175. >
  176. </el-option>
  177. </el-select>
  178. </el-form-item>
  179. </el-col>
  180. <el-col :span="12">
  181. <el-form-item label="结构">
  182. <el-cascader
  183. v-model="editFormData.structurecode"
  184. :options="cascaderdata"
  185. :props="{ checkStrictly: true, emitPath: false }"
  186. clearable
  187. />
  188. </el-form-item>
  189. </el-col>
  190. </el-row>
  191. <el-row :gutter="24">
  192. <el-col :span="12">
  193. <el-form-item label="物理类型">
  194. <el-input v-model="editFormData.categorysci"></el-input>
  195. </el-form-item>
  196. </el-col>
  197. <el-col :span="12">
  198. <el-form-item label="系统分类">
  199. <el-input v-model="editFormData.categorysys"></el-input>
  200. </el-form-item>
  201. </el-col>
  202. </el-row>
  203. <el-form-item label="适配机型" class="deviceModelClass">
  204. <el-select
  205. v-model="state.deviceModelSel"
  206. style="margin-right: 20px"
  207. placeholder="新增机型"
  208. size="mini"
  209. >
  210. <el-option
  211. v-for="item in state.deviceModel"
  212. :key="item.code"
  213. :label="item.code"
  214. :value="item.code"
  215. >
  216. </el-option>
  217. </el-select>
  218. <el-button
  219. v-show="state.deviceModelSel != ''"
  220. size="mini"
  221. type="primary"
  222. @click="deviceModelAdd()"
  223. >新增机型
  224. </el-button>
  225. <el-table
  226. :data="editFormData.deviceModelMetrics"
  227. style="width: 100%; margin-top: 10px"
  228. max-height="200px"
  229. >
  230. <el-table-column prop="devicemodel" label="机型" />
  231. <el-table-column label="倍率">
  232. <template #default="scope">
  233. <el-input v-model="scope.row.multiplier" size="mini" />
  234. </template>
  235. </el-table-column>
  236. <el-table-column label="统一编码">
  237. <template #default="scope">
  238. <el-input v-model="scope.row.uniformcode" size="mini" />
  239. </template>
  240. </el-table-column>
  241. </el-table>
  242. </el-form-item>
  243. </el-form>
  244. <template #footer>
  245. <span class="dialog-footer">
  246. <el-button @click="editVisible = false">取 消</el-button>
  247. <el-button type="primary" @click="saveEdit">确 定</el-button>
  248. </span>
  249. </template>
  250. </el-dialog>
  251. </template>
  252. <script setup>
  253. import { ref, onMounted, inject, reactive, watch } from "vue";
  254. import { ElMessageBox, ElMessage } from "element-plus";
  255. import {
  256. point,
  257. metrics,
  258. delmetrics,
  259. device_list,
  260. getStationinfo,
  261. } from "@/api/zhbj/index.js";
  262. import { outExportExcel } from "@/tools/excel/exportExcel.js"; //引入文件
  263. onMounted(() => {
  264. getPoint(desc.value);
  265. getDeviceModel();
  266. getequipmentmodel_list();
  267. });
  268. let editFormData = ref({});
  269. let editVisible = ref(false); //传感点
  270. let desc = inject("desc");
  271. let treeId = inject("treeId");
  272. let cascaderdata = inject("cascaderdata");
  273. watch(
  274. () => treeId,
  275. (newV, old) => {
  276. state.addFormData.structurecode = desc.value.code;
  277. getPoint(desc.value);
  278. },
  279. {
  280. deep: true,
  281. }
  282. );
  283. let state = reactive({
  284. pointTableData: "",
  285. SearchVal: "",
  286. selectPoint: "",
  287. selectModel: "",
  288. modelList: [],
  289. categorydataoptions: ["AI", "DI", "CI"],
  290. addFormData: {
  291. categorydata: "AI",
  292. categoryres1: null,
  293. categoryres2: null,
  294. categoryres3: null,
  295. categoryres4: null,
  296. categoryres5: null,
  297. categorysci: null,
  298. categorysys: null,
  299. description: null,
  300. deviceid: "windturbine",
  301. enname: null,
  302. id: null,
  303. metriccode: "",
  304. name: "",
  305. structurecode: "101010205",
  306. unitname: null,
  307. unitnamecn: null,
  308. deviceModelMetrics: [],
  309. },
  310. });
  311. const query = reactive({
  312. page: 1,
  313. limit: 10,
  314. });
  315. let pageTotal = ref(0);
  316. const search = async () => {
  317. getPoint(desc.value);
  318. };
  319. // getPoint
  320. const getPoint = async (node) => {
  321. const res = await point(
  322. node.code,
  323. query.page,
  324. query.limit,
  325. state.selectPoint,
  326. state.SearchVal,
  327. "windturbine",
  328. state.selectModel
  329. );
  330. console.warn(res);
  331. pageTotal.value = res.total;
  332. state.pointTableData = res.records?.sort((a, b) => {
  333. return a.id - b.id;
  334. });
  335. };
  336. // 机型
  337. const getequipmentmodel_list = async () => {
  338. const { data } = await getStationinfo("");
  339. let arr = [];
  340. data.forEach((e) => {
  341. arr.push(...e.modelList);
  342. });
  343. state.modelList = [...new Set(arr)];
  344. };
  345. // 测点 编辑
  346. const handleEdit = (row) => {
  347. console.warn(row);
  348. if (!row.deviceModelMetrics) {
  349. row.deviceModelMetrics = [];
  350. }
  351. editFormData.value = row;
  352. editVisible.value = true;
  353. };
  354. //测点 add
  355. const postmetrics = async () => {
  356. console.warn(editFormData.value);
  357. const res = await metrics(editFormData.value);
  358. console.warn(res);
  359. if (res.status == 20000) {
  360. ElMessage.success(`操作成功!`);
  361. editVisible.value = false;
  362. } else {
  363. ElMessage.success(res.msg);
  364. }
  365. getPoint(desc.value);
  366. };
  367. // 保存编辑
  368. const saveEdit = async () => {
  369. postmetrics();
  370. };
  371. // 测点 删除
  372. const handleDelete = (row) => {
  373. // 二次确认删除
  374. ElMessageBox.confirm("确定要删除吗?", "提示", {
  375. type: "warning",
  376. })
  377. .then(async () => {
  378. console.warn(row);
  379. const res = await delmetrics(row.id);
  380. console.warn(res);
  381. if (res == 1) {
  382. ElMessage.success(`删除成功!`);
  383. } else {
  384. ElMessage.success("删除失败");
  385. }
  386. getPoint(desc.value);
  387. })
  388. .catch(() => {});
  389. };
  390. //deviceModelAdd 新增机型
  391. const deviceModelAdd = async () => {
  392. if (state.deviceModelSel == "") return;
  393. console.warn();
  394. let obj = {
  395. deviceid: editFormData.value.deviceid,
  396. devicemodel: state.deviceModelSel,
  397. id: null,
  398. metriccode: editFormData.value.metriccode,
  399. multiplier: 0,
  400. uniformcode: "",
  401. };
  402. editFormData.value.deviceModelMetrics.push(obj);
  403. };
  404. //getDeviceModel
  405. const getDeviceModel = async () => {
  406. const res = await device_list();
  407. state.deviceModel = res;
  408. console.warn(res);
  409. };
  410. // 分页导航
  411. const handlePageChange = (val) => {
  412. query.page = val;
  413. getPoint(desc.value);
  414. };
  415. // 批量导入
  416. const handleSuccess = (response, file, fileList) => {
  417. console.warn(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. </script>
  460. <style lang="scss" scoped>
  461. .devicemenu {
  462. margin-bottom: 10px;
  463. }
  464. </style>