index.html 26 KB

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