punchLocation-list.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  1. <template>
  2. <div>
  3. <el-breadcrumb separator=">">
  4. <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
  5. <el-breadcrumb-item>
  6. <a href="#">系统管理</a>
  7. </el-breadcrumb-item>
  8. <el-breadcrumb-item>
  9. <a href="/punchLocation">打卡点管理</a>
  10. </el-breadcrumb-item>
  11. </el-breadcrumb>
  12. <el-divider></el-divider>
  13. <!--
  14. 要resetFields起作用,必须配置:model和prop
  15. -->
  16. <el-form ref="queryForm" :model="queryModel" inline class="demo-form-inline">
  17. <el-form-item label="学校" prop="companyId">
  18. <el-select-tree
  19. size="mini"
  20. :props="props"
  21. :options="companyResult"
  22. :value="queryModel.companyId"
  23. @getValue="getSelectedValue($event)"
  24. height="200"
  25. ></el-select-tree>&nbsp;
  26. <el-checkbox v-model="queryModel.subordinate">是否包含下级单位</el-checkbox>
  27. </el-form-item>
  28. <el-form-item label="打卡点名称" prop="name">
  29. <el-input type="text" size="mini" v-model="queryModel.name"></el-input>
  30. </el-form-item>
  31. <el-form-item label="是否启用" prop="isEnable">
  32. <el-select
  33. v-model="queryModel.isEnable"
  34. size="mini"
  35. filterable
  36. placeholder="请选择"
  37. style="width:120px"
  38. >
  39. <el-option value label="全部"></el-option>
  40. <el-option value="1" label="启用"></el-option>
  41. <el-option value="0" label="停用"></el-option>
  42. </el-select>
  43. </el-form-item>
  44. <el-form-item>
  45. <el-button
  46. type="primary"
  47. size="mini"
  48. icon="ios-search"
  49. @click="changePage(1)"
  50. :loading="loading"
  51. >查询</el-button>&nbsp;
  52. <el-button
  53. type="info"
  54. size="mini"
  55. style="margin-left: 8px"
  56. @click="handleReset('queryForm')"
  57. >重置</el-button>&nbsp;
  58. </el-form-item>
  59. </el-form>
  60. <el-divider></el-divider>
  61. <el-row class="button-group">
  62. <el-button type="primary" size="small" plain icon="el-icon-circle-plus" @click="handleAdd">新增</el-button>
  63. <el-button
  64. type="primary"
  65. size="small"
  66. plain
  67. icon="el-icon-circle-plus"
  68. :disabled="multipleSelection.length==0"
  69. @click="handleBatchDelete"
  70. >删除选中项</el-button>
  71. </el-row>
  72. <el-table
  73. :data="tableData"
  74. style="min-height:400px;"
  75. v-loading="loading"
  76. stripe
  77. @sort-change="sortChange"
  78. @selection-change="handleSelectionChange"
  79. >
  80. <el-table-column type="selection" width="55"></el-table-column>
  81. <el-table-column type="index" label="序号" :index="indexMethod" width="50"></el-table-column>
  82. <el-table-column prop="isEnable" label="启用状态" width="100">
  83. <template slot-scope="{row}">
  84. <el-switch
  85. v-model="row.isEnable"
  86. @change="enabledTo(row,row.isEnable)"
  87. active-color="#13ce66"
  88. inactive-color="#ff4949"
  89. ></el-switch>
  90. </template>
  91. </el-table-column>
  92. <el-table-column prop="companyName" label="学校" width="180"></el-table-column>
  93. <el-table-column prop="name" sort-by="name_" label="打卡点名称" width="180"></el-table-column>
  94. <el-table-column prop="longtitude" label="打卡点经度" width="100"></el-table-column>
  95. <el-table-column prop="latitude" label="打卡点维度" width="100"></el-table-column>
  96. <el-table-column prop="remark" sort-by="remark_" label="备注" width="180"></el-table-column>
  97. <el-table-column label="操作" width="300px">
  98. <template slot-scope="{row}">
  99. <el-row>
  100. <el-col :span="4">
  101. <el-link type="primary" :underline="false" @click="handleEdit(row)">编辑</el-link>
  102. </el-col>
  103. <el-col :span="4">
  104. <el-link type="danger" :underline="false" @click="handleDelete(row)">删除</el-link>
  105. </el-col>
  106. <el-col :span="4">
  107. <el-link type="primary" :underline="false" @click="handlePoint(row)">定位</el-link>
  108. </el-col>
  109. <el-col :span="6">
  110. <el-popover
  111. placement="left"
  112. width="300"
  113. trigger="click"
  114. @show="openQRCode(row)"
  115. @hide="closeQRCode(row)"
  116. >
  117. <div :ref="'qrcode_' + row.id" style="width:300px;height:300px;"></div>
  118. <el-link type="primary" :underline="false" slot="reference">二维码展示</el-link>
  119. </el-popover>
  120. </el-col>
  121. </el-row>
  122. </template>
  123. </el-table-column>
  124. </el-table>
  125. <el-pagination
  126. :current-page.sync="pageIndex"
  127. :total="totalElements"
  128. :page-sizes="pageSizeList"
  129. @current-change="changePage"
  130. @size-change="pageSizeChange"
  131. layout="total, sizes, prev, pager, next, jumper"
  132. ></el-pagination>
  133. <punchLocation-detail
  134. v-if="showModal"
  135. :businessKey="businessKey"
  136. :title="modalTitle"
  137. :companyResult="companyResult"
  138. @close="onDetailModalClose"
  139. ></punchLocation-detail>
  140. <punchLocation-map
  141. v-if="showMapModal"
  142. :businessKey="businessKey"
  143. :title="modalTitle"
  144. @close="onDetailModalClose"
  145. ></punchLocation-map>
  146. </div>
  147. </template>
  148. <script>
  149. import Constant from "@/constant";
  150. import PunchLocationDetail from "./punchLocation-detail";
  151. import PunchLocationMap from "./punchLocation-amap";
  152. import companyInfoApi from "@/api/base/companyInfo";
  153. import punchLocationApi from "@/api/base/punchLocation";
  154. import QRCode from "qrcodejs2";
  155. import SelectTree from "@/components/SelectTree";
  156. import NProgress from "nprogress"; // progress bar
  157. import "nprogress/nprogress.css"; // progress bar style
  158. export default {
  159. name: "BasePunchLocationList",
  160. components: {
  161. "punchLocation-detail": PunchLocationDetail,
  162. "el-select-tree": SelectTree,
  163. "punchLocation-map": PunchLocationMap
  164. },
  165. data() {
  166. var self = this;
  167. return {
  168. queryModel: {
  169. companyId: "",
  170. name: "",
  171. longtitude: "",
  172. latitude: "",
  173. remark: "",
  174. isEnable: ""
  175. },
  176. loading: false,
  177. tableData: [],
  178. pageIndex: 1,
  179. pageSize: 10,
  180. totalPages: 0,
  181. totalElements: 0,
  182. field: "",
  183. direction: "",
  184. pageSizeList: [10, 20, 30],
  185. multipleSelection: [],
  186. showModal: false,
  187. modalTitle: "",
  188. businessKey: "",
  189. companyResult: [],
  190. treeData: [],
  191. props: {
  192. // 配置项(必选)
  193. value: "id",
  194. label: "name",
  195. children: "children"
  196. },
  197. showMapModal: false
  198. };
  199. },
  200. created() {
  201. var self = this;
  202. companyInfoApi.list().then(function(response) {
  203. var jsonData = response.data;
  204. if (jsonData.result) {
  205. if (jsonData.data != null && jsonData.data != "") {
  206. self.companyResult = jsonData.data;
  207. }
  208. }
  209. });
  210. },
  211. methods: {
  212. getSelectedValue(value) {
  213. this.queryModel.companyId = value;
  214. },
  215. loadTree() {
  216. var formData = new FormData();
  217. companyInfoApi.loadChildren(formData).then(resp => {
  218. var jsonData = resp.data;
  219. if (jsonData.result) {
  220. this.treeData = jsonData.data;
  221. } else {
  222. this.$message.error(jsonData.message + "");
  223. }
  224. });
  225. },
  226. loadChildren(tree, treeNode, resolve) {
  227. var formData = new FormData();
  228. formData.append("parentId", tree.id);
  229. companyInfoApi.loadChildren(formData).then(resp => {
  230. var jsonData = resp.data;
  231. if (jsonData.result) {
  232. resolve(jsonData.data);
  233. } else {
  234. this.$message.error(jsonData.message + "");
  235. }
  236. });
  237. },
  238. indexMethod(index) {
  239. return (this.pageIndex - 1) * this.pageSize + (index + 1);
  240. },
  241. changePage(pageIndex) {
  242. var self = this;
  243. self.loading = true;
  244. self.pageIndex = pageIndex;
  245. var formData = new FormData();
  246. formData.append("pageIndex", self.pageIndex);
  247. formData.append("pageSize", self.pageSize);
  248. formData.append("companyId", self.queryModel.companyId);
  249. formData.append("name", self.queryModel.name);
  250. formData.append("longtitude", self.queryModel.longtitude);
  251. formData.append("latitude", self.queryModel.latitude);
  252. formData.append("remark", self.queryModel.remark);
  253. formData.append("isEnable", self.queryModel.isEnable);
  254. if (this.field != null) {
  255. formData.append("field", this.field);
  256. }
  257. if (this.direction != null) {
  258. formData.append("direction", this.direction);
  259. }
  260. punchLocationApi
  261. .pageList(formData)
  262. .then(function(response) {
  263. self.loading = false;
  264. var jsonData = response.data.data;
  265. self.tableData = jsonData.data;
  266. self.totalPages = jsonData.totalPages;
  267. self.totalElements = jsonData.recordsTotal;
  268. })
  269. .catch(error => {
  270. self.loading = false;
  271. // self.$message.error(error + "");
  272. });
  273. },
  274. pageSizeChange(pageSize) {
  275. this.pageSize = pageSize;
  276. this.$nextTick(() => {
  277. this.changePage(this.pageIndex);
  278. });
  279. },
  280. sortChange(data) {
  281. this.field = data.column.field;
  282. this.direction = data.order;
  283. this.changePage(this.pageIndex);
  284. },
  285. handleSelectionChange(val) {
  286. this.multipleSelection = val;
  287. },
  288. handleReset(name) {
  289. this.$refs[name].resetFields();
  290. },
  291. handleAdd() {
  292. this.modalTitle = "新增";
  293. this.businessKey = "";
  294. this.showModal = true;
  295. },
  296. handleEdit(record) {
  297. this.modalTitle = "编辑";
  298. this.businessKey = record.id;
  299. this.showModal = true;
  300. },
  301. handleDelete(record) {
  302. var self = this;
  303. self
  304. .$confirm("是否确认删除?", "提示", {
  305. confirmButtonText: "确定",
  306. cancelButtonText: "取消",
  307. type: "warning"
  308. })
  309. .then(() => {
  310. punchLocationApi.remove(record.id).then(function(response) {
  311. var jsonData = response.data;
  312. if (jsonData.result) {
  313. // var index = self.tableData.indexOf(record);
  314. // self.tableData.splice(index, 1);
  315. self.changePage(self.pageIndex);
  316. self.$message({
  317. type: "success",
  318. message: "删除成功!"
  319. });
  320. }
  321. });
  322. });
  323. },
  324. handleBatchDelete() {
  325. var self = this;
  326. var idList = this.multipleSelection.map(record => {
  327. return record.id;
  328. });
  329. this.$confirm("是否确认删除选中项?", "提示", {
  330. confirmButtonText: "确定",
  331. cancelButtonText: "取消",
  332. type: "warning"
  333. }).then(() => {
  334. punchLocationApi.batchRemove(idList).then(function(response) {
  335. var jsonData = response.data;
  336. if (jsonData.result) {
  337. self.changePage(self.pageIndex);
  338. self.$message({
  339. type: "success",
  340. message: "删除成功!"
  341. });
  342. }
  343. });
  344. });
  345. },
  346. onDetailModalClose(refreshed) {
  347. //保存成功后回调
  348. this.showModal = false;
  349. this.showMapModal = false;
  350. if (refreshed) {
  351. this.changePage(this.pageIndex);
  352. }
  353. },
  354. openQRCode(record) {
  355. //el.innerHTML = "";
  356. var self = this;
  357. self.$refs["qrcode_" + record.id].innerHTML = "";
  358. var qrtext = process.env.VUE_APP_PUNCHLOCATION_URL + "?id=" + record.id;
  359. var el = self.$refs["qrcode_" + record.id];
  360. var qr = new QRCode(el, {
  361. text: qrtext,
  362. width: 300,
  363. height: 300,
  364. colorDark: "#333333", //二维码颜色
  365. colorLight: "#ffffff", //二维码背景色
  366. correctLevel: QRCode.CorrectLevel.L //容错率,L/M/H
  367. });
  368. },
  369. closeQRCode(record) {
  370. self.$refs["qrcode_" + record.id].innerHTML = "";
  371. },
  372. handlePoint(record) {
  373. this.modalTitle = "定位";
  374. this.businessKey = record.id;
  375. this.showMapModal = true;
  376. },
  377. enabledTo(row, type, value) {
  378. var self = this;
  379. this.$confirm("是否执行操作?", "提示", {
  380. confirmButtonText: "确定",
  381. cancelButtonText: "取消",
  382. type: "warning"
  383. })
  384. .then(() => {
  385. //self.loading = true;
  386. if (!self.disabled) {
  387. var formData = new FormData();
  388. formData.append("id", row.id);
  389. punchLocationApi.changeEnable(formData).then(function(response) {
  390. var jsonData = response.data;
  391. if (jsonData.result) {
  392. console.log(jsonData.result);
  393. } else {
  394. self.changePage(self.pageIndex);
  395. self.$message({
  396. type: "error",
  397. message: jsonData.message
  398. });
  399. }
  400. });
  401. self.disabled = true;
  402. setTimeout(function() {
  403. self.disabled = false;
  404. //self.loading = false;
  405. }, 1000); //一秒内不能重复点击
  406. } else {
  407. self.$message({
  408. type: "success",
  409. message: "操作过快!"
  410. });
  411. }
  412. })
  413. .catch(() => {
  414. // self.loading = false;
  415. if (row.faceEnabled) {
  416. row.faceEnabled = false;
  417. } else {
  418. row.faceEnabled = true;
  419. }
  420. });
  421. }
  422. },
  423. mounted: function() {
  424. this.changePage(1);
  425. }
  426. };
  427. </script>
  428. <style lang="scss" scoped>
  429. .el-breadcrumb {
  430. margin: 10px;
  431. line-height: 20px;
  432. }
  433. .el-divider {
  434. margin: 5px 0;
  435. }
  436. .demo-form-inline {
  437. margin-left: 10px;
  438. text-align: left;
  439. }
  440. .button-group {
  441. margin-left: 10px;
  442. text-align: left;
  443. }
  444. </style>