customerPositionBmap.vue 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. <template>
  2. <div>
  3. <div class="app-container" style="padding-left: 20px;width: 100%;height: 60px;">
  4. <el-form :model="queryParams" ref="queryForm" size="small" :inline="true">
  5. <el-form-item label="地址:" prop="address">
  6. <el-autocomplete
  7. class="inline-input"
  8. v-model="address"
  9. :fetch-suggestions="querySearch"
  10. placeholder="请输入内容"
  11. :trigger-on-focus="false"
  12. @select="handleSelect"
  13. ></el-autocomplete>
  14. </el-form-item>
  15. <el-form-item label="距离:" prop="distance">
  16. <el-select v-model="queryParams.distance" @change="handleSelect">
  17. <el-option
  18. v-for="item in distanceOptions"
  19. :key="item.value"
  20. :label="item.label"
  21. :value="item.value"
  22. />
  23. </el-select>
  24. </el-form-item>
  25. <el-form-item label="区域:" prop="region">
  26. <el-select v-model="queryParams.area" value-key="id" filterable @change="selectArea($event)">
  27. <el-option
  28. v-for="item in areaOptions"
  29. :key="item.id"
  30. :label="item.name"
  31. :value="item"
  32. >
  33. <span style="float: left">{{ item.name }}</span>
  34. <span style="float: right; color: #8492a6; font-size: 13px">{{ item.type=="1"?"饱和":"可办" }}</span>
  35. </el-option>
  36. </el-select>
  37. </el-form-item>
  38. </el-form>
  39. </div>
  40. <div id="container" v-bind:style="'width: 100%;border: 1px solid #cecece;height:'+pageHeight*0.797+'px;'">
  41. </div>
  42. <div class="scroll-box-Position">
  43. <h3>区域许可证办理情况</h3>
  44. <div class="scroll-item-Position">
  45. <vue-seamless-scroll :data="areaOptions" class="warp" :class-option="defaultOption">
  46. <div v-for="c in areaOptions" class="customer-info">
  47. <table align="center" width="98%" cellpadding="0">
  48. <tr>
  49. <td width="50%">区域名:</td>
  50. <td width="50%">{{c.name}}</td>
  51. </tr>
  52. <tr>
  53. <td>状态:</td>
  54. <td>{{c.type=='1'?'已饱和':"可办证"}}</td>
  55. </tr>
  56. <tr>
  57. <td>可办证:</td>
  58. <td>{{c.type=='1'?"0":c.num}}</td>
  59. </tr>
  60. </table>
  61. </div>
  62. </vue-seamless-scroll>
  63. </div>
  64. </div>
  65. </div>
  66. </template>
  67. <script>
  68. import request from '@/utils/request'
  69. import vueSeamlessScroll from 'vue-seamless-scroll'
  70. export default {
  71. data() {
  72. return {
  73. address: "",
  74. queryParams: {
  75. address: {},
  76. distance: "50",
  77. area: ""
  78. },
  79. placeInfo: [
  80. {value: "", label: ""}
  81. ],
  82. selectPoint: {},
  83. distanceOptions: [
  84. {value: "50", label: "50米"},
  85. {value: "100", label: "100米"},
  86. {value: "200", label: "200米"}
  87. ],
  88. areaOptions: [
  89. {id: "", name: "",type:"",num:""},
  90. ],
  91. map: null,
  92. pageHeight: document.documentElement.clientHeight
  93. }
  94. },
  95. components: {
  96. vueSeamlessScroll
  97. },
  98. computed: {
  99. defaultOption () {
  100. return {
  101. step: 0.2, // 数值越大速度滚动越快
  102. limitMoveNum: 3, // 开始无缝滚动的数据量 this.dataList.length
  103. hoverStop: true, // 是否开启鼠标悬停stop
  104. direction: 1, // 0向下 1向上 2向左 3向右
  105. openWatch: true, // 开启数据实时监控刷新dom
  106. singleHeight: 0, // 单步运动停止的高度(默认值0是无缝不停止的滚动) direction => 0/1
  107. singleWidth: 0, // 单步运动停止的宽度(默认值0是无缝不停止的滚动) direction => 2/3
  108. waitTime: 1000 // 单步运动停止的时间(默认值1000ms)
  109. }
  110. }
  111. },
  112. created() {
  113. setTimeout(() => {
  114. this.initMap()
  115. }, 100)
  116. },
  117. mounted() {
  118. this.initAreaOptions();
  119. },
  120. methods: {
  121. initAreaOptions(){
  122. const t=this;
  123. request({
  124. url:"/monitorArea/getRegionMonitorInfo"
  125. }).then(rs=>{
  126. t.areaOptions=rs;
  127. })
  128. },
  129. addMarker(points) {
  130. //循环建立标注点
  131. var len = points.length;
  132. for (var i = 0, pointsLen = points.length; i < pointsLen; i++) {
  133. var point = points[i];
  134. this.addMarkerPoint(point);
  135. }
  136. },
  137. addTargetMarkerPoint(pointInfo, distance) {
  138. let pt = new BMap.Point(pointInfo.longitude, pointInfo.latitude);
  139. let icon = new BMap.Icon(require("@/assets/images/area_icon16x16.png"), new BMap.Size(16, 16));
  140. let options = {
  141. icon: icon
  142. }
  143. var marker = new BMap.Marker(pt, options)
  144. var circle = new BMap.Circle(pt, distance, {
  145. strokeColor: 'blue',
  146. strokeWeight: 2,
  147. strokeOpacity: 0.5
  148. });
  149. var content =
  150. '<ul class="map-customer-info">'
  151. + '<li ><span>名称:</span>' + pointInfo.value + '</li>'
  152. + '<li ><span>地址:</span>' + pointInfo.address + '</li>'
  153. + '</ul>';
  154. marker.addEventListener("mouseover", () => {
  155. var infoWindow = new BMap.InfoWindow(content);
  156. marker.openInfoWindow(infoWindow);
  157. });
  158. marker.addEventListener("mouseout", () => {
  159. marker.closeInfoWindow();
  160. });
  161. this.map.addOverlay(marker)
  162. this.map.addOverlay(circle)
  163. this.map.setZoom(20);
  164. // 移动到目标点
  165. this.map.setCenter(pt)
  166. },
  167. addMarkerPoint(pointInfo) {
  168. let pt = new BMap.Point(pointInfo.longitude, pointInfo.latitude);
  169. var marker = new BMap.Marker(pt)
  170. this.showInfo(marker, pointInfo)
  171. this.map.addOverlay(marker)
  172. },
  173. showInfo(thisMarker, point) {
  174. if (!point.clientCode) {
  175. console.log('未取到值 ...')
  176. return;
  177. }
  178. let pt = new BMap.Point(point.longitude, point.latitude);
  179. //获取点的信息
  180. var content =
  181. '<ul class="map-customer-info">'
  182. + '<li ><span>许可证号:</span>' + point.clientCode + '</li>'
  183. + '<li ><span>名称:</span>' + point.shortName + '</li>'
  184. + '<li ><span>店名:</span>' + point.clientName + '</li>'
  185. + '<li ><span>电话:</span>' + point.telphonea + '</li>'
  186. + '<li ><span>地址:</span>' + point.address + '</li>'
  187. + '<li ><span>客户经理:</span>' + point.cnname + '</li>'
  188. + '<li ><span>距离:</span>' + this.showDist(parseFloat(point.distance)) + '</li>'
  189. + '</ul>';
  190. thisMarker.addEventListener("mouseover", () => {
  191. var infoWindow = new BMap.InfoWindow(content);
  192. thisMarker.openInfoWindow(infoWindow);
  193. });
  194. thisMarker.addEventListener("mouseout", () => {
  195. thisMarker.closeInfoWindow();
  196. });
  197. },
  198. showDist(d) {
  199. return d ? d.toFixed(2) * 1000 + 'M' : '未知';
  200. },
  201. initMap() {
  202. var longitude = 113.450713
  203. var latitude = 30.366039
  204. let pt = new BMap.Point(longitude, latitude);
  205. var marker = new BMap.Marker(pt)
  206. // 鼠标经过窗口模板
  207. let tem = `<ul class="map-customer-info">
  208. <li>仙桃市烟草专卖局</li>
  209. </ul>`;
  210. marker.addEventListener("mouseover", () => {
  211. var infoWindow = new BMap.InfoWindow(tem);
  212. marker.openInfoWindow(infoWindow);
  213. });
  214. marker.addEventListener("mouseout", () => {
  215. marker.closeInfoWindow();
  216. });
  217. this.map = new BMap.Map("container", {enableMapClick: false}); // 创建Map实例 命名空间为BMAP
  218. this.map.centerAndZoom(new BMap.Point(113.465771, 30.368834), 13); // 初始化地图,设置中心点坐标和地图级别
  219. this.map.setCurrentCity("仙桃");
  220. this.map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
  221. this.map.disableDoubleClickZoom(); //禁用双击放大
  222. this.map.addOverlay(marker);
  223. },
  224. querySearch(queryString, cb) {
  225. request({
  226. url: '/api/map/search?key=' + queryString,
  227. method: 'get'
  228. }).then(function (res) {
  229. cb(res);
  230. })
  231. },
  232. handleSelect(item) {
  233. if (!this.queryParams.distance) {
  234. return;
  235. }
  236. if (typeof item == "object") {
  237. this.selectPoint = item;
  238. }
  239. const t = this;
  240. this.map.clearOverlays();
  241. this.addTargetMarkerPoint(t.selectPoint, this.queryParams.distance);
  242. // 查询周围选定距离distance 以内的零售户
  243. request({
  244. url: "/api/map/customer/search",
  245. method: 'post',
  246. data: {
  247. latitude: t.selectPoint.latitude,
  248. longitude: t.selectPoint.longitude,
  249. count: 10,
  250. distance: this.queryParams.distance / 1000
  251. }
  252. }).then(function (rs) {
  253. if (rs && rs.length) {
  254. t.addMarker(rs);
  255. } else {
  256. t.$modal.msgError("未找到附近零售户");
  257. }
  258. })
  259. },
  260. selectArea(option) {
  261. if(option.type==1){
  262. this.$message({
  263. message: option.name+"零售户已饱和",
  264. type:"error"
  265. });
  266. }else{
  267. this.$message({
  268. message: option.name+"零售户可办"+option.num+"户",
  269. type:"success"
  270. });
  271. }
  272. }
  273. }
  274. };
  275. </script>
  276. <style rel="stylesheet/scss" lang="scss">
  277. .BMap_cpyCtrl {
  278. display: none;
  279. }
  280. .anchorBL {
  281. display: none;
  282. }
  283. .scroll-box-Position {
  284. width: 240px;
  285. height: 200px !important;
  286. position: absolute;
  287. z-index: 1999;
  288. background: #ffffff;
  289. right: 10px;
  290. top: 60px !important;
  291. border-radius: 8px;
  292. opacity: 0.8;
  293. }
  294. .scroll-box-Position h3 {
  295. text-align: center;
  296. line-height: 40px;
  297. }
  298. .scroll-item-Position {
  299. height: 100px !important;
  300. overflow: hidden;
  301. }
  302. .customer-info {
  303. font-size: 12px;
  304. margin-top: 20px;
  305. padding: 2px;
  306. }
  307. </style>