index.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  1. <template>
  2. <div class="app-container">
  3. <div class="filter-container">
  4. <div class="filter-left" :model="query">
  5. <div class="filter-item">
  6. 线路名称:
  7. <el-input
  8. v-model.trim="query.routeName"
  9. placeholder=""
  10. style="width: 150px"
  11. ></el-input>
  12. </div>
  13. <el-button
  14. type="primary"
  15. icon="el-icon-search"
  16. class="search-button"
  17. @click="queryData"
  18. >搜索</el-button
  19. >
  20. </div>
  21. <div class="handle-button-right">
  22. <el-button icon="el-icon-plus" type="success" @click="openAdd"
  23. >新增</el-button
  24. >
  25. <el-button icon="el-icon-delete" type="danger" @click="batchDelete"
  26. >删除</el-button
  27. >
  28. <el-button type="warning" @click="handleDownload">
  29. <svg-icon icon-class="export" />
  30. 导出
  31. </el-button>
  32. </div>
  33. </div>
  34. <el-divider></el-divider>
  35. <el-table
  36. :data="list"
  37. stripe
  38. border
  39. :header-cell-style="{ background: '#EBF1FF', color: '#606266' }"
  40. style="width: 100%"
  41. id="out-table"
  42. @selection-change="handleSelectionChange"
  43. @sort-change="changeSort"
  44. >
  45. <el-table-column type="selection" width="40"> </el-table-column>
  46. <el-table-column prop="routeName" label="线路名称"> </el-table-column>
  47. <el-table-column label="路线详情">
  48. <template slot-scope="{ row }">
  49. <div class="check" @click="dialogRouteDetailVisible = true">
  50. {{ row.routeUrl }}
  51. </div>
  52. </template>
  53. </el-table-column>
  54. <el-table-column prop="remarks" label="备注"> </el-table-column>
  55. <el-table-column label="状态">
  56. <template slot-scope="scope">
  57. {{ scope.row.state == 1 ? "显示" : "不显示" }}
  58. </template>
  59. </el-table-column>
  60. <el-table-column prop="user" label="添加人"> </el-table-column>
  61. <el-table-column label="添加时间" width="200" sortable="custom">
  62. <template slot-scope="{ row }">
  63. <span>{{ renderTime(row.creationTime) }}</span>
  64. </template>
  65. </el-table-column>
  66. <el-table-column label="对应点位">
  67. <template>
  68. <div class="check" @click="dialogPointVisible = true">查看</div>
  69. </template>
  70. </el-table-column>
  71. <!-- <el-table-column label="标签" width="120">
  72. <template slot-scope="scope">
  73. {{ scope.row.label == 1 ? "团队责任人" : "团队普通成员" }}
  74. </template>
  75. </el-table-column> -->
  76. <el-table-column label="操作" width="150" fixed="right">
  77. <template slot-scope="scope">
  78. <el-button
  79. icon="el-icon-edit"
  80. style="color: #406ce5"
  81. @click="handleEdit(scope.$index, scope.row)"
  82. >修改</el-button
  83. >
  84. <el-button
  85. icon="el-icon-delete"
  86. style="color: #f27979"
  87. @click="handleDelete(scope.row.id)"
  88. >删除</el-button
  89. >
  90. </template>
  91. </el-table-column>
  92. </el-table>
  93. <el-pagination
  94. background
  95. @current-change="handleCurrentChange"
  96. :current-page="page.pageNo"
  97. :page-size="1"
  98. layout="prev, pager, next"
  99. :total="page.total"
  100. >
  101. </el-pagination>
  102. <!-- 路线详情弹框 start -->
  103. <el-dialog
  104. title="路线详情"
  105. :visible.sync="dialogRouteDetailVisible"
  106. class="routeDialog"
  107. >
  108. <div style="text-align: center">
  109. <img src="@/assets/route.png" alt="" width="100%" />
  110. <p style="margin: 20px auto">虹泾总部园巡检路线1</p>
  111. </div>
  112. </el-dialog>
  113. <!-- 路线详情弹框 end -->
  114. <!-- 点位弹框 start -->
  115. <el-dialog title="对应点位" :visible.sync="dialogPointVisible">
  116. <el-form :model="form">
  117. <el-table
  118. :data="tableDataPoint"
  119. stripe
  120. border
  121. :header-cell-style="{ background: '#EBF1FF', color: '#606266' }"
  122. style="width: 100%"
  123. id="out-table"
  124. @selection-change="handleSelectionChange"
  125. >
  126. <el-table-column prop="order" label="序号" width="50">
  127. </el-table-column>
  128. <el-table-column prop="pointName" label="点位名称"> </el-table-column>
  129. <el-table-column prop="pointAddress" label="点位地址">
  130. </el-table-column>
  131. </el-table>
  132. </el-form>
  133. <div slot="footer" class="dialog-footer">
  134. <el-button
  135. @click="dialogPointVisible = false"
  136. style="background: #f6f6f6"
  137. >关 闭</el-button
  138. >
  139. <el-button type="primary" @click="dialogPointVisible = false"
  140. >保 存</el-button
  141. >
  142. </div>
  143. </el-dialog>
  144. <!-- 点位弹框 end -->
  145. <edit
  146. :title="edit.title"
  147. :visible="edit.visible"
  148. :formData="edit.formData"
  149. :remoteClose="remoteClose"
  150. />
  151. </div>
  152. </template>
  153. <script>
  154. //引入api文件
  155. import api from "@/api/patrolRoute";
  156. //引入局部组件
  157. import edit from "./edit";
  158. // import deviceList from "./deviceList";
  159. export default {
  160. //组件注册
  161. components: {
  162. edit,
  163. // deviceList,
  164. },
  165. name: "elect-partol",
  166. data() {
  167. return {
  168. page: {
  169. //分页对象
  170. pageNo: 1,
  171. pageSize: 2,
  172. total: 0,
  173. },
  174. query: {}, //查询条件
  175. list: [], //列表数据
  176. // deviceList: [], //设备列表
  177. edit: {
  178. title: "",
  179. visible: false,
  180. formData: {
  181. // patrolPlanCycle: [],
  182. },
  183. },
  184. //对应点位弹框
  185. dialogPointVisible: false,
  186. form: {
  187. name: "",
  188. region: "",
  189. region2: "",
  190. date1: "",
  191. date2: "",
  192. delivery: false,
  193. type: [],
  194. resource: "",
  195. desc: "",
  196. },
  197. tableDataPoint: [
  198. {
  199. order: "1",
  200. pointName: "867725032779518",
  201. pointAddress: "青浦区徐泾镇徐乐路208号虹泾1楼",
  202. },
  203. {
  204. order: "2",
  205. pointName: "867725032779518",
  206. pointAddress: "青浦区徐泾镇徐乐路208号虹泾2楼",
  207. },
  208. {
  209. order: "3",
  210. pointName: "867725032779518",
  211. pointAddress: "青浦区徐泾镇徐乐路208号虹泾3楼",
  212. },
  213. ],
  214. //路线详情弹框
  215. dialogRouteDetailVisible: false,
  216. multipleSelection: [],
  217. };
  218. },
  219. created() {
  220. //aa 钩子里调用查询组件
  221. this.fetchData();
  222. this.fetchPersonData();
  223. },
  224. methods: {
  225. // // 从后台获取数据,重新排序
  226. // changeSort(val) {
  227. // // this.fetchData()
  228. // console.log(val); // column: {…} order: "ascending" prop: "date"
  229. // // 根据当前排序重新获取后台数据,一般后台会需要一个排序的参数
  230. // },
  231. changeSort(val) {
  232. const { prop, order } = val
  233. if (order === 'ascending') {
  234. this.query.sort = 'ASC'
  235. } else {
  236. this.query.sort = 'DESC'
  237. }
  238. this.fetchData()
  239. },
  240. //列表查询
  241. fetchData() {
  242. api
  243. .getList(this.query, this.page.pageNo, this.page.pageSize)
  244. .then((response) => {
  245. console.log("response", response);
  246. // 列表数据
  247. this.list = response.pageList;
  248. this.page.total = response.totalPages;
  249. // this.sort=response.sort
  250. });
  251. },
  252. //设备下拉列表查询
  253. fetchPersonData() {
  254. api.getPersonList().then((response) => {
  255. console.log("response2");
  256. console.log(response);
  257. this.deviceList = response.pageList;
  258. // this.page.total = response.totalPages;
  259. });
  260. },
  261. //分页 (当页码改变后触发到此方法 val是当前点击到的那个页码)
  262. handleCurrentChange(val) {
  263. this.page.pageNo = val;
  264. this.fetchData();
  265. },
  266. //条件查询
  267. queryData() {
  268. this.page.pageNo = 1; //将页码 变为1,第一页
  269. this.fetchData();
  270. },
  271. //打开新增窗口
  272. openAdd() {
  273. this.edit.visible = true;
  274. this.edit.title = "新增";
  275. },
  276. //关闭窗口 (子组件会触发此事件方法来关闭窗口)
  277. remoteClose() {
  278. console.log("============");
  279. console.log(this.edit.formData);
  280. this.edit.formData = {};
  281. this.edit.visible = false;
  282. this.fetchData();
  283. },
  284. //修改
  285. handleEdit(index, row) {
  286. this.edit.visible = true;
  287. this.edit.title = "修改";
  288. // row.patrolPlanCycle = row.patrolPlanCycle
  289. // ? row.patrolPlanCycle.split(",")
  290. // : [];
  291. this.edit.formData = row;
  292. },
  293. //删除
  294. handleDelete(id) {
  295. this.$confirm("确定删除该数据吗?", "删除", {
  296. confirmButtonText: "确定",
  297. cancelButtonText: "取消",
  298. type: "warning",
  299. })
  300. .then(() => {
  301. // 发送删除请求
  302. api.deleteById({ queryJson: id }).then((response) => {
  303. // 处理响应结果提示
  304. this.$message({
  305. type: response.success ? "success" : "error",
  306. message: response.Msg,
  307. });
  308. });
  309. // 刷新列表数据
  310. this.fetchData();
  311. })
  312. .catch(() => {
  313. // 不用理会
  314. });
  315. },
  316. //全部删除
  317. batchDelete() {
  318. let multData = this.multipleSelection;
  319. let tableData = this.list;
  320. let multDataLen = multData.length;
  321. let tableDataLen = tableData.length;
  322. for (let i = 0; i < multDataLen; i++) {
  323. for (let y = 0; y < tableDataLen; y++) {
  324. if (JSON.stringify(tableData[y]) == JSON.stringify(multData[i])) {
  325. //判断是否相等,相等就删除
  326. this.list.splice(y, 1);
  327. console.log("aa");
  328. }
  329. }
  330. }
  331. },
  332. handleSelectionChange(val) {
  333. this.multipleSelection = val;
  334. },
  335. //导出功能
  336. handleDownload() {
  337. this.downloadLoading = true;
  338. import("@/vendor/Export2Excel").then((excel) => {
  339. const tHeader = [
  340. "巡更计划名称",
  341. "设备名称",
  342. "执行开始日期",
  343. "执行结束日期",
  344. "巡更开始时间",
  345. "巡更结束时间",
  346. "巡更周期",
  347. "添加时间",
  348. ];
  349. const filterVal = [
  350. "deviceName",
  351. "patrolPlanName",
  352. "startDate",
  353. "endDate",
  354. "startTime",
  355. "endTime",
  356. "patrolPlanCycle",
  357. "creationTime",
  358. ];
  359. const data = this.formatJson(filterVal);
  360. excel.export_json_to_excel({
  361. header: tHeader,
  362. data,
  363. filename: "table-list",
  364. });
  365. this.downloadLoading = false;
  366. });
  367. },
  368. formatJson(filterVal) {
  369. return this.list.map((v) =>
  370. filterVal.map((j) => {
  371. if (j === "timestamp") {
  372. return parseTime(v[j]);
  373. } else {
  374. return v[j];
  375. }
  376. })
  377. );
  378. },
  379. //时间格式化2021-01-21T05:53:00.000+0000
  380. renderTime(date) {
  381. var dateee = new Date(date).toJSON();
  382. return new Date(+new Date(dateee) + 8 * 3600 * 1000)
  383. .toISOString()
  384. .replace(/T/g, " ")
  385. .replace(/\.[\d]{3}Z/, "");
  386. },
  387. },
  388. };
  389. </script>
  390. <style scoped>
  391. .table-tit {
  392. background: rgb(235, 241, 255);
  393. border: 1px solid #d9d9d9;
  394. border-bottom: 0;
  395. font-weight: bold;
  396. padding: 8px 10px;
  397. }
  398. .el-checkbox {
  399. margin-right: 15px;
  400. line-height: 0;
  401. }
  402. .el-dialog {
  403. min-width: 736px !important;
  404. }
  405. </style>
  406. <style >
  407. </style>