index.html 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8"/>
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  6. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  7. <title>组织地图管理</title>
  8. <link rel="stylesheet" href="../../../assets/libs/layui/css/layui.css"/>
  9. <link rel="stylesheet" href="../../../assets/module/admin.css?v=312"/>
  10. <link rel="stylesheet" href="../../../assets/module/zTree/css/metroStyle/metroStyle.css"/>
  11. <link rel="stylesheet" href="../../../assets/css/editormap.css?v=312"/>
  12. <link rel="stylesheet" type="text/css" href="../../../assets/libs/leaflet/leaflet-draw/leaflet.draw-src.css">
  13. <link rel="stylesheet" type="text/css" href="../../../assets/libs/leaflet/leaflet.css">
  14. <link rel="stylesheet" href="../../../assets/module/formSelects/formSelects-v4.css"/>
  15. </head>
  16. <style>
  17. .layui-table-cell {
  18. height: 52px;
  19. line-height: 52px;
  20. }
  21. </style>
  22. <body>
  23. <!-- 页面加载loading -->
  24. <div class="page-loading">
  25. <div class="ball-loader">
  26. <span></span><span></span><span></span><span></span>
  27. </div>
  28. </div>
  29. <!-- 正文开始 -->
  30. <div class="layui-fluid">
  31. <div class="layui-card">
  32. <div class="layui-card-body">
  33. <div class="layui-row">
  34. <!-- 左栏 -->
  35. <div class="layui-col-sm12 layui-col-md1 layui-col-lg2">
  36. <div class="layui-card">
  37. <div class="layui-card-body mini-bar zTree" id="treeTbTree" style="min-height:612px;">
  38. <ul id="groupTree" class="ztree"></ul>
  39. </div>
  40. </div>
  41. </div>
  42. <!-- 右栏 -->
  43. <div class="layui-col-sm12 layui-col-md1 layui-col-lg10">
  44. <div class="layui-tab layui-tab-brief" lay-filter="mapTab">
  45. <ul class="layui-tab-title">
  46. <li class="layui-this">地图设定</li>
  47. <li>部门图片</li>
  48. </ul>
  49. <div class="layui-tab-content">
  50. <div class="layui-tab-item layui-show">
  51. <!-- 地图设定 -->
  52. <div class="layui-card">
  53. <div class="layui-card-body">
  54. <form id="modelRoleForm" lay-filter="modelRoleForm" class="layui-form">
  55. <input type="hidden" name="entMapId" id="entMapId">
  56. <input type="hidden" name="groupId" id="groupId">
  57. <div class="layui-form-item">
  58. <div class="layui-inline">
  59. <label class="layui-form-label w-auto w-padding">选择背景图:</label>
  60. <div class="layui-input-inline mr0">
  61. <select id="entMapList" name="entMapList"
  62. lay-filter="entMapList" lay-verType="tips"
  63. class="layui-input-block">
  64. <option value="">选择背景图</option>
  65. </select>
  66. </div>
  67. </div>
  68. </div>
  69. <div class="map-container" id="map" style="height: 500px"></div>
  70. <div class="layui-form-item text-right">
  71. <button class="layui-btn" lay-filter="modelSubmitRole" lay-submit>保存
  72. </button>
  73. </div>
  74. </form>
  75. </div>
  76. </div>
  77. </div>
  78. <div class="layui-tab-item">
  79. <!-- 部门图片 -->
  80. <div class="layui-card">
  81. <div class="layui-card-body">
  82. <div class="layui-form toolbar">
  83. <div class="layui-form-item">
  84. <div class="layui-inline pull-right">
  85. <button id="addImgBtn" class="layui-btn icon-btn">
  86. <i class="layui-icon">&#xe654;</i>添加地图背景
  87. </button>
  88. </div>
  89. </div>
  90. </div>
  91. <table class="layui-table" id="datatable" lay-filter="datatable"></table>
  92. </div>
  93. </div>
  94. </div>
  95. </div>
  96. </div>
  97. </div>
  98. </div>
  99. </div>
  100. </div>
  101. </div>
  102. <!-- 上传地图表单弹窗 -->
  103. <script type="text/html" id="addImgWin">
  104. <form id="modelForm" lay-filter="modelForm" class="layui-form model-form">
  105. <input type="hidden" id="gId" name="gId"/>
  106. <input type="hidden" id="imgPath" name="imgPath"/>
  107. <div class="layui-form-item">
  108. <label class="layui-form-label">地图名称</label>
  109. <div class="layui-input-block">
  110. <input name="imgName" placeholder="地图名称" type="text" class="layui-input" maxlength="20"
  111. lay-verType="tips" lay-verify="required" required/>
  112. </div>
  113. </div>
  114. <div class="layui-form-item">
  115. <label class="layui-form-label">选择地图</label>
  116. <div class="layui-input-block text-left">
  117. <button type="button" class="layui-btn" id="fileUploader">
  118. <i class="layui-icon">&#xe67c;</i>上传附件
  119. </button>
  120. <div id="mapShow" style="background-color: lightgray;margin-top: 10px;height: 24px;display: none;">
  121. <img src="" style="width: 20px;height: 20px;margin-top: 3px;margin-left: 10px;"/>
  122. <a style="margin-top: 3px;margin-right: 10px;float: right;cursor: pointer;">删除</a>
  123. </div>
  124. </div>
  125. </div>
  126. <div class="layui-form-item text-right">
  127. <button class="layui-btn layui-btn-primary" type="button" ew-event="closePageDialog">取消</button>
  128. <button class="layui-btn" lay-filter="saveImgBtn" lay-submit id="saveImsgBtn" disabled>保存</button>
  129. </div>
  130. </form>
  131. </script>
  132. <!-- js部分 -->
  133. <script type="text/javascript" src="../../../assets/libs/layui/layui.js"></script>
  134. <script type="text/javascript" src="../../../assets/js/common.js?v=312"></script>
  135. <script type="text/javascript" src="../../../assets/libs/jquery/jquery-3.2.1.min.js"></script>
  136. <script src="../../../assets/libs/leaflet/leaflet.js"></script>
  137. <script src="../../../assets/libs/leaflet/leaflet-draw/leaflet.draw-src.js"></script>
  138. <script src="../../../assets/libs/leaflet/leaflet-draw/local.js"></script>
  139. <script src="../../../assets/libs/leaflet/proj4-compressed.js"></script>
  140. <script src="../../../assets/libs/leaflet/proj4leaflet.js"></script>
  141. <script>
  142. var imgPath;
  143. var map;
  144. var entMapList;
  145. var loadFlag = true;
  146. var defGroupId = '';
  147. var entMapId = '';
  148. var map_type = '';
  149. var tabIndex = 0; // 选中tab的索引
  150. var gid; // 当前选择的部门id
  151. layui.use(['layer', 'form', 'uParas', 'admin', 'zTree', 'element', 'table', 'upload'], function () {
  152. var $ = layui.jquery;
  153. var layer = layui.layer;
  154. var form = layui.form;
  155. var admin = layui.admin;
  156. var uParas = layui.uParas;
  157. var element = layui.element;
  158. defGroupId = uParas.getUrlParam("groupId");
  159. var table = layui.table;
  160. var upload = layui.upload;
  161. // //debugger
  162. $("#groupId").val(defGroupId);
  163. /********************************************************部门图片start******************************************/
  164. // 右侧tab
  165. // 监听tab切换
  166. element.on('tab(mapTab)', function (data) {
  167. tabIndex = data.index;
  168. if (tabIndex == 1) {
  169. reloadTable(gid);
  170. }
  171. });
  172. // 初始化上传组件
  173. function initUploader() {
  174. upload.render({
  175. elem: '#fileUploader',
  176. url: uParas.baseUrl + '/admin/uploadFile',
  177. accept: 'images',
  178. done: function (resp) {
  179. // console.info(resp.data.path);
  180. if (resp.data.path) {
  181. layer.msg('上传成功!');
  182. $('#imgPath').val(resp.data.path);
  183. $('#saveImsgBtn').prop('disabled', false);
  184. var mapShow = $('#mapShow');
  185. mapShow.css('display', '');
  186. mapShow.find('img').prop('src', uParas.baseUrl + resp.data.path);
  187. mapShow.find('a').on('click', function () {
  188. delImg(resp.data.path);
  189. });
  190. }
  191. },
  192. error: function () {
  193. }
  194. });
  195. }
  196. // 删除图片
  197. function delImg(imgPath) {
  198. layer.load();
  199. admin.req(uParas.baseUrl + '/ent/entMapImage/deleteImg?imgPath=' + imgPath,
  200. {},
  201. function (res) {
  202. layer.closeAll("loading");
  203. if (res.code == 1) {
  204. layer.msg(res.msg);
  205. $('#mapShow').css('display', 'none');
  206. } else {
  207. layer.msg(res.msg);
  208. }
  209. $('#saveImsgBtn').prop('disabled', true);
  210. },
  211. 'post');
  212. }
  213. // 渲染部门图片表格
  214. var insTb = table.render({
  215. elem: '#datatable',
  216. url: uParas.baseUrl + '/ent/entMapImage/getByGid',
  217. page: true,
  218. cellMinWidth: 50,
  219. cols: [[
  220. {type: 'numbers', title: '序号'},
  221. {field: 'imgName', sort: false, title: '名称'},
  222. {
  223. field: 'imgPath', sort: false, title: '图片',
  224. templet: function (d) {
  225. var src = uParas.baseUrl + d.imgPath;
  226. var img = '<img style="width: 50px;height: 50px;" src="' + src + '">';
  227. return img;
  228. }
  229. },
  230. // {field: 'createdTime', sort: false, title: '添加时间', templet: '<div>{{ layui.util.toDateString(d.createdTime, "yyyy-MM-dd HH:mm:ss") }}</div>'},
  231. {
  232. align: 'LEFT', title: '操作', width: 200,
  233. templet: function () {
  234. return setOperation();
  235. }
  236. }
  237. ]]
  238. });
  239. // 设置"操作"列
  240. function setOperation() {
  241. var html = '';
  242. html += '<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del" style="background-color: indianred;">删除</a>';
  243. return html;
  244. }
  245. // 工具条点击事件
  246. table.on('tool(datatable)', function (obj) {
  247. // var data = obj.data;
  248. var layEvent = obj.event;
  249. if (layEvent == 'edit') { // 修改
  250. // window.location.href = "./edit.html?deviceId=" + data.deviceId;
  251. } else if (layEvent == 'del') { // 删除
  252. doDel(obj);
  253. }
  254. });
  255. // 删除
  256. function doDel(obj) {
  257. layer.confirm(
  258. '确定要删除吗?',
  259. {
  260. skin: 'layui-layer-admin',
  261. shade: .1
  262. },
  263. function (i) {
  264. layer.close(i);
  265. layer.load();
  266. admin.req(uParas.baseUrl + '/ent/entMapImage/delete?imgId=' + obj.data.imgId, {}, function (res) {
  267. layer.closeAll();
  268. if (res.code == 1) {
  269. layer.msg(res.msg);
  270. obj.del();
  271. } else {
  272. layer.msg(res.msg);
  273. }
  274. }, 'post');
  275. }
  276. );
  277. }
  278. // 打开添加图片窗口
  279. $('#addImgBtn').on('click', function () {
  280. if (gid == undefined) {
  281. layer.msg('请先选择一个部门!');
  282. return;
  283. }
  284. admin.open({
  285. title: '上传图片',
  286. type: 1,
  287. area: '500px', // ['500px', '220px'],
  288. content: $('#addImgWin').html(),
  289. success: function (layerObj, index) {
  290. initUploader();
  291. $('#modelForm #gId').val(gid);
  292. var url = uParas.baseUrl + '/ent/entMapImage/add';
  293. form.on('submit(saveImgBtn)', function (data) {
  294. admin.req(url, data.field, function (response) {
  295. layer.load();
  296. if (response.code == 1) {
  297. // layer.close();
  298. layer.closeAll();
  299. layer.msg(response.msg);
  300. reloadTable(gid);
  301. } else {
  302. layer.msg(response.msg);
  303. }
  304. }, 'post');
  305. return false;
  306. });
  307. }
  308. });
  309. });
  310. // 刷新表格数据
  311. function reloadTable(gid) {
  312. insTb.reload({
  313. where: {
  314. gid: gid
  315. }
  316. });
  317. }
  318. /********************************************************部门图片end********************************************/
  319. //左树设置
  320. var leftgroupTreeSetting = {
  321. data: {
  322. simpleData: {
  323. enable: true,
  324. idKey: "gId",
  325. pIdKey: "groupParent",
  326. rootPId: 0,
  327. },
  328. key: {
  329. name: "groupName",
  330. title: "groupName"
  331. }
  332. },
  333. callback: {
  334. onClick: leftNodeClick
  335. }
  336. };
  337. //树结点click
  338. function leftNodeClick(e, treeId, treeNode) {
  339. gid = treeNode.gId;
  340. if (tabIndex == 0) {
  341. initDispInfo(treeNode);
  342. } else {
  343. reloadTable(gid);
  344. }
  345. }
  346. //选择节点
  347. function selectNode() {
  348. var treeObj = $.fn.zTree.getZTreeObj("groupTree");
  349. var nodes = treeObj.getNodes();
  350. var defNode = null;
  351. if (defGroupId != null && defGroupId >= 0) {
  352. defNode = treeObj.getNodeByParam("gId", defGroupId);
  353. } else {
  354. if (nodes.length > 0) {
  355. defNode = nodes[0];
  356. }
  357. }
  358. if (defNode != null) {
  359. treeObj.selectNode(defNode);
  360. treeObj.expandNode(defNode, true, false, false);
  361. initDispInfo(defNode);
  362. }
  363. }
  364. //初始化显示信息
  365. function initDispInfo(treeNode) {
  366. defGroupId = treeNode.gId;
  367. $("#groupId").val(defGroupId);
  368. if (entMapId != null && entMapId != '') {
  369. myBmap.init();
  370. gid = defGroupId;
  371. }
  372. }
  373. admin.req(uParas.baseUrl + '/ent/groupAccount/getGroupTreeList', {}, function (resp) {
  374. if (resp.code == 1) {
  375. var zNodes = resp.data;
  376. $.fn.zTree.init($('#groupTree'), leftgroupTreeSetting, zNodes);
  377. selectNode();
  378. layer.closeAll('loading');
  379. } else {
  380. layer.msg(resp.msg);
  381. }
  382. }, 'GET');
  383. $.ajaxSetup({async: false});
  384. $.getJSON(uParas.baseUrl + "/ent/map/getList", {mapType: 2}, function (result) {
  385. if (result.data != null) {
  386. entMapList = result.data;
  387. var entMap = result.data[0];
  388. imgPath = entMap.mapRasterLayer;
  389. uParas.initSimpleSelectX("entMapList", "modelRoleForm", result, "mapName", "mapId", entMap.mapId);
  390. $("#entMapId").val(entMap.mapId);
  391. entMapId = entMap.mapId;
  392. map_type = entMap.mapType;
  393. }
  394. });
  395. //监听下拉选择
  396. form.on('select(entMapList)', function (data) {
  397. //debugger
  398. $.each(entMapList, function (i, field) {
  399. if (field.mapId.toString() === data.value) {
  400. imgPath = field.mapRasterLayer;
  401. return;
  402. }
  403. });
  404. entMapId = data.value;
  405. $("#entMapId").val(data.value);
  406. myBmap.init();
  407. });
  408. form.on('submit(modelSubmitRole)', function (data) {
  409. //debugger
  410. //console.log(data.field);
  411. var layers = plotLayer.getLayers();
  412. var drawIds = '';
  413. if (layers.length <= 0) {
  414. layer.msg("请在图中完成标记");
  415. return;
  416. }
  417. layers.forEach(function (v) {
  418. v = v.toGeoJSON();
  419. //console.log(v);
  420. if (v.geometry.type == "Point") {
  421. var data = new Array();
  422. data[0] = v.geometry.coordinates[1];
  423. data[1] = v.geometry.coordinates[0];
  424. //drawIds = drawIds += JSON.stringify(data) + ";" + v.geometry.type + "#";
  425. drawIds += JSON.stringify(data) + ";" + v.geometry.type + "#";
  426. } else {
  427. //drawIds = drawIds += JSON.stringify(v.geometry.coordinates) + ";" + v.geometry.type + "#";
  428. drawIds += JSON.stringify(v.geometry.coordinates) + ";" + v.geometry.type + "#";
  429. }
  430. });
  431. // data.field.riskPointId = riskPointId;
  432. data.field.drawIds = drawIds;
  433. data.field.entMapId = $("#entMapId").val();
  434. $.ajax({
  435. type: "post",
  436. url: "/ent/mapMarker/saveMapData",
  437. data: data.field,
  438. dataType: "json",
  439. success: function (result) {
  440. if (result.code === 1) {
  441. //parent.layer.closeAll();
  442. layer.msg(result.msg);
  443. //parent.closeReload();
  444. } else {
  445. layer.msg(result.msg);
  446. }
  447. }
  448. });
  449. return false;
  450. });
  451. //myBmap.init();
  452. });
  453. var myBmap = {
  454. mapContainer: "map", //地图容器
  455. mapTile: "http://online{s}.map.bdimg.com/tile/?qt=vtile&x={x}&y={y}&z={z}&styles=pl&scaler=2&udt=20181205", //切片图层
  456. myIcon: null, //保存创建的icon
  457. myMarker: null, //保存自己创建marker
  458. myMarkerType: 0, //marker类型
  459. myMarkerId: null, //markerId
  460. isSave: true, //是否保存标记
  461. checkedIcon: null, //保存选中的icon
  462. deleteMarkerId: null, //保存删除得markerId
  463. data: {},
  464. init: function () {
  465. var _this = this;
  466. //初始化地图
  467. if (map_type == 4) {
  468. baidu_map();
  469. } else {
  470. image_map();
  471. }
  472. // 增加区域绘制工具栏
  473. plotLayer = new L.FeatureGroup;
  474. map.addLayer(plotLayer);
  475. var e = {
  476. position: "topright",
  477. draw: {
  478. polyline: {shapeOptions: {color: "#0000ff", weight: 3}},
  479. polygon: {allowIntersection: !0, showArea: !0, shapeOptions: {color: "#0000ff", weight: 2}},
  480. rectangle: {shapeOptions: {color: "#0000ff", weight: 2}},
  481. circle: false,
  482. circlemarker: false,
  483. marker: true,
  484. Point: false
  485. },
  486. edit: {
  487. featureGroup: plotLayer,
  488. remove: !0,
  489. edit: true
  490. }
  491. };
  492. var n = new L.Control.Draw(e);
  493. if (loadFlag) {
  494. map.addControl(n);
  495. map.on(L.Draw.Event.CREATED, draw_createdHandler);
  496. }
  497. function draw_createdHandler(t) {
  498. //debugger
  499. t.layerType;
  500. var o = t.layer;
  501. // 逻辑判断
  502. var layers = plotLayer.getLayers();
  503. var types = "";
  504. if (layers.length > 0) {
  505. layers.forEach(function (v) {
  506. types += v.toGeoJSON().geometry.type;
  507. });
  508. if (types.indexOf("Point") != -1) {
  509. Point = 1
  510. }
  511. }
  512. if (o.toGeoJSON().geometry.type == "Point" && Point == 0) {
  513. plotLayer.addLayer(o);
  514. } else if (o.toGeoJSON().geometry.type != "Point") {
  515. plotLayer.addLayer(o);
  516. }
  517. }
  518. //获取数据
  519. $.getJSON("/ent/mapMarker/getGroupMap/" + defGroupId + "/" + entMapId, null, function (result) {
  520. console.log("---------------");
  521. console.log(result.data);
  522. $.each(result.data, function (index, item) {
  523. //console.log(item);
  524. var markerData = item.mapMarkerData;
  525. if (markerData != null) {
  526. var optionsData = {
  527. // riskPointId: item.riskPointId,
  528. title: item.markerTitle
  529. };
  530. var layers;
  531. if (item.mapMarkerType == 3) {
  532. var data = new Array();
  533. $.each($.parseJSON(markerData), function (index, item) {
  534. data[index] = new Array(item[1], item[0]);
  535. });
  536. layers = L.polygon(data, optionsData);
  537. } else if (item.mapMarkerType == 1) {
  538. layers = L.marker($.parseJSON(markerData));
  539. } else if (item.mapMarkerType == 2) {
  540. var data = new Array();
  541. $.each($.parseJSON(markerData), function (index, item) {
  542. data[index] = new Array(item[1], item[0]);
  543. });
  544. layers = L.polyline(data, optionsData);
  545. }
  546. plotLayer.addLayer(layers);
  547. }
  548. });
  549. });
  550. //底图为图片
  551. function image_map() {
  552. if (map != undefined && map != null) {
  553. map.remove();
  554. }
  555. // if (map == undefined || map._loaded == undefined) {
  556. map = L.map(_this.mapContainer, {
  557. crs: L.CRS.Simple,
  558. center: L.latLng(50.5, 30.5),
  559. minZoom: 0,
  560. zoom: 4,
  561. attributionControl: false
  562. });
  563. // } else {
  564. // loadFlag = false;
  565. // }
  566. var yx = L.latLng;
  567. var xy = function xy(x, y) {
  568. if (L.Util.isArray(x)) {
  569. return yx(x[1], x[0]);
  570. }
  571. return yx(y, x);
  572. };
  573. map.eachLayer(function (layer) {
  574. map.removeLayer(layer);
  575. });
  576. var bounds = [xy(-600, -600), xy(300, 300)];
  577. L.imageOverlay(imgPath, bounds).addTo(map);
  578. map.fitBounds(bounds);
  579. }
  580. //底图为百度地图
  581. function baidu_map() {
  582. var maxZoom = 26;
  583. var crs = new L.Proj.CRS('EPSG:3395',
  584. '+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs', {
  585. resolutions: function () {
  586. level = 19;
  587. var res = [];
  588. res[0] = Math.pow(2, 18);
  589. for (var i = 1; i < level; i++) {
  590. res[i] = Math.pow(2, (18 - i))
  591. }
  592. return res;
  593. }(),
  594. origin: [0, 0],
  595. bounds: L.bounds([20037508.342789244, 0], [0, 20037508.342789244])
  596. });
  597. var image = new L.TileLayer(_this.mapTile, {
  598. maxZoom: maxZoom,
  599. minZoom: 10,
  600. subdomains: [0, 1, 2],
  601. tms: true
  602. });
  603. map = L.map(_this.mapContainer, {
  604. crs: crs,
  605. layers: [image]
  606. });
  607. map.setView([34.474387, 109.490437], 14);
  608. }
  609. }
  610. }
  611. function iconClick(e) {
  612. $(e).toggleClass('icon-active')
  613. }
  614. </script>
  615. </body>
  616. </html>