diff --git a/module-map/pom.xml b/module-map/pom.xml
new file mode 100644
index 00000000..d4565dec
--- /dev/null
+++ b/module-map/pom.xml
@@ -0,0 +1,23 @@
+
+
+
+ wg-basic
+ ink.wgink
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ module-map
+ 地图模块
+
+
+
+ ink.wgink
+ common
+ 1.0-SNAPSHOT
+
+
+
+
\ No newline at end of file
diff --git a/module-map/src/main/java/ink/wgink/module/map/dao/grid/IGridDao.java b/module-map/src/main/java/ink/wgink/module/map/dao/grid/IGridDao.java
new file mode 100644
index 00000000..0b370b1e
--- /dev/null
+++ b/module-map/src/main/java/ink/wgink/module/map/dao/grid/IGridDao.java
@@ -0,0 +1,59 @@
+package ink.wgink.module.map.dao.grid;
+
+import ink.wgink.exceptions.RemoveException;
+import ink.wgink.exceptions.SaveException;
+import ink.wgink.exceptions.SearchException;
+import ink.wgink.interfaces.init.IInitBaseTable;
+import ink.wgink.module.map.pojo.dto.grid.GridDTO;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * When you feel like quitting. Think about why you started
+ * 当你想要放弃的时候,想想当初你为何开始
+ *
+ * @ClassName: IGridDao
+ * @Description: 网格业务
+ * @Author: WangGeng
+ * @Date: 2020/10/21 11:16
+ * @Version: 1.0
+ **/
+@Repository
+public interface IGridDao extends IInitBaseTable {
+ /**
+ * 保存网格
+ *
+ * @param params
+ * @throws SaveException
+ */
+ void save(Map params) throws SaveException;
+
+ /**
+ * 删除网格
+ *
+ * @param params
+ * @throws RemoveException
+ */
+ void delete(Map params) throws RemoveException;
+
+ /**
+ * 获取网格列表
+ *
+ * @param params
+ * @return
+ * @throws SearchException
+ */
+ List list(Map params) throws SearchException;
+
+ /**
+ * 网格列表group
+ *
+ * @param params
+ * @return
+ * @throws SearchException
+ */
+ List listGroup(Map params) throws SearchException;
+
+}
diff --git a/module-map/src/main/java/ink/wgink/module/map/dao/grid/IGridPointDao.java b/module-map/src/main/java/ink/wgink/module/map/dao/grid/IGridPointDao.java
new file mode 100644
index 00000000..721fe29d
--- /dev/null
+++ b/module-map/src/main/java/ink/wgink/module/map/dao/grid/IGridPointDao.java
@@ -0,0 +1,51 @@
+package ink.wgink.module.map.dao.grid;
+
+import ink.wgink.exceptions.RemoveException;
+import ink.wgink.exceptions.SaveException;
+import ink.wgink.exceptions.SearchException;
+import ink.wgink.interfaces.init.IInitBaseTable;
+import ink.wgink.module.map.pojo.dto.grid.GridPointDTO;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * When you feel like quitting. Think about why you started
+ * 当你想要放弃的时候,想想当初你为何开始
+ *
+ * @ClassName: IGridDao
+ * @Description: 网格业务
+ * @Author: WangGeng
+ * @Date: 2020/10/21 11:16
+ * @Version: 1.0
+ **/
+@Repository
+public interface IGridPointDao extends IInitBaseTable {
+
+ /**
+ * 保存网格点
+ *
+ * @param params
+ * @throws SaveException
+ */
+ void save(Map params) throws SaveException;
+
+ /**
+ * 删除网格点
+ *
+ * @param params
+ * @throws RemoveException
+ */
+ void delete(Map params) throws RemoveException;
+
+ /**
+ * 获取网格点列表
+ *
+ * @param params
+ * @return
+ * @throws SearchException
+ */
+ List list(Map params) throws SearchException;
+
+}
diff --git a/module-map/src/main/java/ink/wgink/module/map/dao/grid/IGridRelationDao.java b/module-map/src/main/java/ink/wgink/module/map/dao/grid/IGridRelationDao.java
new file mode 100644
index 00000000..f9acf8be
--- /dev/null
+++ b/module-map/src/main/java/ink/wgink/module/map/dao/grid/IGridRelationDao.java
@@ -0,0 +1,51 @@
+package ink.wgink.module.map.dao.grid;
+
+import ink.wgink.exceptions.RemoveException;
+import ink.wgink.exceptions.SaveException;
+import ink.wgink.exceptions.SearchException;
+import ink.wgink.interfaces.init.IInitBaseTable;
+import ink.wgink.module.map.pojo.dto.grid.GridRelationDTO;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * When you feel like quitting. Think about why you started
+ * 当你想要放弃的时候,想想当初你为何开始
+ *
+ * @ClassName: IGridDao
+ * @Description: 网格业务
+ * @Author: WangGeng
+ * @Date: 2020/10/21 11:16
+ * @Version: 1.0
+ **/
+@Repository
+public interface IGridRelationDao extends IInitBaseTable {
+
+ /**
+ * 保存网格关联关系
+ *
+ * @param params
+ * @throws SaveException
+ */
+ void save(Map params) throws SaveException;
+
+ /**
+ * 删除网格关联关系
+ *
+ * @param params
+ * @throws RemoveException
+ */
+ void delete(Map params) throws RemoveException;
+
+ /**
+ * 网关关联列表
+ *
+ * @param params
+ * @return
+ * @throws SearchException
+ */
+ List list(Map params) throws SearchException;
+
+}
diff --git a/module-map/src/main/java/ink/wgink/module/map/pojo/dto/grid/GridDTO.java b/module-map/src/main/java/ink/wgink/module/map/pojo/dto/grid/GridDTO.java
new file mode 100644
index 00000000..8afa36b4
--- /dev/null
+++ b/module-map/src/main/java/ink/wgink/module/map/pojo/dto/grid/GridDTO.java
@@ -0,0 +1,83 @@
+package ink.wgink.module.map.pojo.dto.grid;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * When you feel like quitting. Think about why you started
+ * 当你想要放弃的时候,想想当初你为何开始
+ *
+ * @ClassName: GridDTO
+ * @Description: 网格
+ * @Author: WangGeng
+ * @Date: 2020/10/21 17:01
+ * @Version: 1.0
+ **/
+@ApiModel
+public class GridDTO extends GridRelationDTO {
+
+ @ApiModelProperty(name = "fillColor", value = "填充颜色")
+ private String fillColor;
+ @ApiModelProperty(name = "gridName", value = "网格名称")
+ private String gridName;
+ @ApiModelProperty(name = "relationIdArray", value = "关联ID列表")
+ private List relationIdArray;
+ @ApiModelProperty(name = "pointArray", value = "网格点列表")
+ private List pointArray;
+
+ public String getFillColor() {
+ return fillColor == null ? "" : fillColor.trim();
+ }
+
+ public void setFillColor(String fillColor) {
+ this.fillColor = fillColor;
+ }
+
+ public String getGridName() {
+ return gridName == null ? "" : gridName.trim();
+ }
+
+ public void setGridName(String gridName) {
+ this.gridName = gridName;
+ }
+
+ public List getRelationIdArray() {
+ if (relationIdArray == null) {
+ return new ArrayList<>();
+ }
+ return relationIdArray;
+ }
+
+ public void setRelationIdArray(List relationIdArray) {
+ this.relationIdArray = relationIdArray;
+ }
+
+ public List getPointArray() {
+ if (pointArray == null) {
+ return new ArrayList<>();
+ }
+ return pointArray;
+ }
+
+ public void setPointArray(List pointArray) {
+ this.pointArray = pointArray;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder("{");
+ sb.append("\"fillColor\":\"")
+ .append(fillColor).append('\"');
+ sb.append(",\"gridName\":\"")
+ .append(gridName).append('\"');
+ sb.append(",\"relationIdArray\":")
+ .append(relationIdArray);
+ sb.append(",\"pointArray\":")
+ .append(pointArray);
+ sb.append('}');
+ return sb.toString();
+ }
+}
diff --git a/module-map/src/main/java/ink/wgink/module/map/pojo/dto/grid/GridPointDTO.java b/module-map/src/main/java/ink/wgink/module/map/pojo/dto/grid/GridPointDTO.java
new file mode 100644
index 00000000..1863b53f
--- /dev/null
+++ b/module-map/src/main/java/ink/wgink/module/map/pojo/dto/grid/GridPointDTO.java
@@ -0,0 +1,65 @@
+package ink.wgink.module.map.pojo.dto.grid;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * When you feel like quitting. Think about why you started
+ * 当你想要放弃的时候,想想当初你为何开始
+ *
+ * @ClassName: BaiduGridPointVO
+ * @Description: 百度地图网格点
+ * @Author: WangGeng
+ * @Date: 2020/10/21 11:02
+ * @Version: 1.0
+ **/
+@ApiModel
+public class GridPointDTO implements Serializable {
+
+ private static final long serialVersionUID = -2367199018377785048L;
+ @ApiModelProperty(name = "gridId", value = "网格ID")
+ private String gridId;
+ @ApiModelProperty(name = "lng", value = "经度")
+ private String lng;
+ @ApiModelProperty(name = "lat", value = "纬度")
+ private String lat;
+
+ public String getGridId() {
+ return gridId == null ? "" : gridId.trim();
+ }
+
+ public void setGridId(String gridId) {
+ this.gridId = gridId;
+ }
+
+ public String getLng() {
+ return lng == null ? "" : lng.trim();
+ }
+
+ public void setLng(String lng) {
+ this.lng = lng;
+ }
+
+ public String getLat() {
+ return lat == null ? "" : lat.trim();
+ }
+
+ public void setLat(String lat) {
+ this.lat = lat;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder("{");
+ sb.append("\"gridId\":\"")
+ .append(gridId).append('\"');
+ sb.append(",\"lng\":\"")
+ .append(lng).append('\"');
+ sb.append(",\"lat\":\"")
+ .append(lat).append('\"');
+ sb.append('}');
+ return sb.toString();
+ }
+}
diff --git a/module-map/src/main/java/ink/wgink/module/map/pojo/dto/grid/GridRelationDTO.java b/module-map/src/main/java/ink/wgink/module/map/pojo/dto/grid/GridRelationDTO.java
new file mode 100644
index 00000000..7a7c4fcf
--- /dev/null
+++ b/module-map/src/main/java/ink/wgink/module/map/pojo/dto/grid/GridRelationDTO.java
@@ -0,0 +1,53 @@
+package ink.wgink.module.map.pojo.dto.grid;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * When you feel like quitting. Think about why you started
+ * 当你想要放弃的时候,想想当初你为何开始
+ *
+ * @ClassName: GridRelationDTO
+ * @Description: 网格关联
+ * @Author: WangGeng
+ * @Date: 2020/10/21 12:11
+ * @Version: 1.0
+ **/
+@ApiModel
+public class GridRelationDTO implements Serializable {
+
+ private static final long serialVersionUID = 9159203095930603288L;
+ @ApiModelProperty(name = "gridId", value = "网格ID")
+ private String gridId;
+ @ApiModelProperty(name = "relationId", value = "关联ID")
+ private String relationId;
+
+ public String getGridId() {
+ return gridId == null ? "" : gridId.trim();
+ }
+
+ public void setGridId(String gridId) {
+ this.gridId = gridId;
+ }
+
+ public String getRelationId() {
+ return relationId == null ? "" : relationId.trim();
+ }
+
+ public void setRelationId(String relationId) {
+ this.relationId = relationId;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder("{");
+ sb.append("\"gridId\":\"")
+ .append(gridId).append('\"');
+ sb.append(",\"relationId\":\"")
+ .append(relationId).append('\"');
+ sb.append('}');
+ return sb.toString();
+ }
+}
diff --git a/module-map/src/main/java/ink/wgink/module/map/pojo/vo/grid/GridPointVO.java b/module-map/src/main/java/ink/wgink/module/map/pojo/vo/grid/GridPointVO.java
new file mode 100644
index 00000000..282f93ec
--- /dev/null
+++ b/module-map/src/main/java/ink/wgink/module/map/pojo/vo/grid/GridPointVO.java
@@ -0,0 +1,62 @@
+package ink.wgink.module.map.pojo.vo.grid;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * When you feel like quitting. Think about why you started
+ * 当你想要放弃的时候,想想当初你为何开始
+ *
+ * @ClassName: BaiduGridPointVO
+ * @Description: 百度地图网格点
+ * @Author: WangGeng
+ * @Date: 2020/10/21 11:02
+ * @Version: 1.0
+ **/
+@ApiModel
+public class GridPointVO {
+
+ @ApiModelProperty(name = "gridId", value = "网格ID")
+ private String gridId;
+ @ApiModelProperty(name = "lng", value = "经度")
+ private String lng;
+ @ApiModelProperty(name = "lat", value = "纬度")
+ private String lat;
+
+ public String getGridId() {
+ return gridId == null ? "" : gridId.trim();
+ }
+
+ public void setGridId(String gridId) {
+ this.gridId = gridId;
+ }
+
+ public String getLng() {
+ return lng == null ? "" : lng.trim();
+ }
+
+ public void setLng(String lng) {
+ this.lng = lng;
+ }
+
+ public String getLat() {
+ return lat == null ? "" : lat.trim();
+ }
+
+ public void setLat(String lat) {
+ this.lat = lat;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder("{");
+ sb.append("\"gridId\":\"")
+ .append(gridId).append('\"');
+ sb.append(",\"lng\":\"")
+ .append(lng).append('\"');
+ sb.append(",\"lat\":\"")
+ .append(lat).append('\"');
+ sb.append('}');
+ return sb.toString();
+ }
+}
diff --git a/module-map/src/main/java/ink/wgink/module/map/pojo/vo/grid/GridVO.java b/module-map/src/main/java/ink/wgink/module/map/pojo/vo/grid/GridVO.java
new file mode 100644
index 00000000..25285ced
--- /dev/null
+++ b/module-map/src/main/java/ink/wgink/module/map/pojo/vo/grid/GridVO.java
@@ -0,0 +1,95 @@
+package ink.wgink.module.map.pojo.vo.grid;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * When you feel like quitting. Think about why you started
+ * 当你想要放弃的时候,想想当初你为何开始
+ *
+ * @ClassName: BaiduGridVO
+ * @Description: 百度地图网格
+ * @Author: WangGeng
+ * @Date: 2020/10/21 11:02
+ * @Version: 1.0
+ **/
+@ApiModel
+public class GridVO {
+
+ @ApiModelProperty(name = "id", value = "网格ID")
+ private String id;
+ @ApiModelProperty(name = "fillColor", value = "填充颜色")
+ private String fillColor;
+ @ApiModelProperty(name = "gridName", value = "网格名称")
+ private String gridName;
+ @ApiModelProperty(name = "relationIdArray", value = "关联ID列表")
+ private List relationIdArray;
+ @ApiModelProperty(name = "pointArray", value = "网格点列表")
+ private List pointArray;
+
+ public String getId() {
+ return id == null ? "" : id.trim();
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getFillColor() {
+ return fillColor == null ? "" : fillColor.trim();
+ }
+
+ public void setFillColor(String fillColor) {
+ this.fillColor = fillColor;
+ }
+
+ public String getGridName() {
+ return gridName == null ? "" : gridName.trim();
+ }
+
+ public void setGridName(String gridName) {
+ this.gridName = gridName;
+ }
+
+ public List getRelationIdArray() {
+ if (relationIdArray == null) {
+ return new ArrayList<>();
+ }
+ return relationIdArray;
+ }
+
+ public void setRelationIdArray(List relationIdArray) {
+ this.relationIdArray = relationIdArray;
+ }
+
+ public List getPointArray() {
+ if (pointArray == null) {
+ return new ArrayList<>();
+ }
+ return pointArray;
+ }
+
+ public void setPointArray(List pointArray) {
+ this.pointArray = pointArray;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder("{");
+ sb.append("\"id\":\"")
+ .append(id).append('\"');
+ sb.append(",\"fillColor\":\"")
+ .append(fillColor).append('\"');
+ sb.append(",\"gridName\":\"")
+ .append(gridName).append('\"');
+ sb.append(",\"relationIdArray\":")
+ .append(relationIdArray);
+ sb.append(",\"pointArray\":")
+ .append(pointArray);
+ sb.append('}');
+ return sb.toString();
+ }
+}
diff --git a/module-map/src/main/java/ink/wgink/module/map/service/grid/IGridPointService.java b/module-map/src/main/java/ink/wgink/module/map/service/grid/IGridPointService.java
new file mode 100644
index 00000000..8d541bd4
--- /dev/null
+++ b/module-map/src/main/java/ink/wgink/module/map/service/grid/IGridPointService.java
@@ -0,0 +1,67 @@
+package ink.wgink.module.map.service.grid;
+
+import ink.wgink.exceptions.RemoveException;
+import ink.wgink.module.map.pojo.dto.grid.GridPointDTO;
+import ink.wgink.module.map.pojo.vo.grid.GridPointVO;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName: IGridPointService
+ * @Description: 网格点业务
+ * @Author: wanggeng
+ * @Date: 2021/8/30 10:06 下午
+ * @Version: 1.0
+ */
+public interface IGridPointService {
+
+ /**
+ * 保存网格点
+ *
+ * @param gridId
+ * @param pointArray
+ */
+ void save(String gridId, List pointArray);
+
+ /**
+ * 删除网格点
+ *
+ * @param gridIds 网格ID列表
+ * @throws RemoveException
+ */
+ void deleteByGridIds(List gridIds);
+
+ /**
+ * 更新网格数组
+ *
+ * @param gridId 网格ID
+ * @param pointArray 点数组
+ * @throws Exception
+ */
+ void updatePointArrayByGridId(String gridId, List pointArray) throws Exception;
+
+ /**
+ * 网格点列表
+ *
+ * @param params
+ * @return
+ */
+ List list(Map params);
+
+ /**
+ * 网格点列表
+ *
+ * @param gridId 网格ID
+ * @return
+ */
+ List list(String gridId);
+
+ /**
+ * 网格点列表
+ *
+ * @param gridIds 网格ID列表
+ * @return
+ */
+ List list(List gridIds);
+}
diff --git a/module-map/src/main/java/ink/wgink/module/map/service/grid/IGridRelationService.java b/module-map/src/main/java/ink/wgink/module/map/service/grid/IGridRelationService.java
new file mode 100644
index 00000000..455907c8
--- /dev/null
+++ b/module-map/src/main/java/ink/wgink/module/map/service/grid/IGridRelationService.java
@@ -0,0 +1,102 @@
+package ink.wgink.module.map.service.grid;
+
+import ink.wgink.module.map.pojo.dto.grid.GridRelationDTO;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName: IGridRelationService
+ * @Description: 网格关联业务
+ * @Author: wanggeng
+ * @Date: 2021/8/30 10:07 下午
+ * @Version: 1.0
+ */
+public interface IGridRelationService {
+
+ /**
+ * 保存关联关系
+ *
+ * @param gridId
+ * @param relationIdArray
+ */
+ void save(String gridId, List relationIdArray);
+
+ /**
+ * 删除网格
+ *
+ * @param gridId 网格ID
+ * @param relationId 关联ID
+ */
+ void delete(String gridId, String relationId);
+
+ /**
+ * 删除网格关联
+ *
+ * @param gridIds 网格ID列表
+ */
+ void deleteByGridIds(List gridIds);
+
+ /**
+ * 删除网格关联
+ *
+ * @param relationId 关联ID
+ */
+ void deleteByRelationId(String relationId);
+
+ /**
+ * 获取网格关联列表
+ *
+ * @param params
+ * @return
+ */
+ List list(Map params);
+
+ /**
+ * 获取网格关系列表
+ *
+ * @param relationId 关联ID
+ * @return
+ */
+ List listByRelationId(String relationId);
+
+ /**
+ * 获取网格关系列表
+ *
+ * @param relationIds 关联ID列表
+ * @return
+ */
+ List listByRelationIds(List relationIds);
+
+ /**
+ * 获取网格关系列表
+ *
+ * @param gridId 网格ID
+ * @return
+ */
+ List listByGridId(String gridId);
+
+ /**
+ * 获取网格关系列表
+ *
+ * @param gridIds 网格ID列表
+ * @return
+ */
+ List listByGridIds(List gridIds);
+
+ /**
+ * 获取网格ID列表
+ *
+ * @param relationId 关联ID
+ * @return
+ */
+ List listGridId(String relationId);
+
+ /**
+ * 获取网格ID列表
+ *
+ * @param relationIds 关联ID列表
+ * @return
+ */
+ List listGridId(List relationIds);
+}
diff --git a/module-map/src/main/java/ink/wgink/module/map/service/grid/IGridService.java b/module-map/src/main/java/ink/wgink/module/map/service/grid/IGridService.java
new file mode 100644
index 00000000..6a15333c
--- /dev/null
+++ b/module-map/src/main/java/ink/wgink/module/map/service/grid/IGridService.java
@@ -0,0 +1,105 @@
+package ink.wgink.module.map.service.grid;
+
+import ink.wgink.exceptions.SearchException;
+import ink.wgink.module.map.pojo.dto.grid.GridDTO;
+import ink.wgink.module.map.pojo.vo.grid.GridVO;
+import ink.wgink.pojo.ListPage;
+import ink.wgink.pojo.result.SuccessResultList;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * When you feel like quitting. Think about why you started
+ * 当你想要放弃的时候,想想当初你为何开始
+ *
+ * @ClassName: IGridService
+ * @Description: 网格业务
+ * @Author: WangGeng
+ * @Date: 2020/10/21 11:14
+ * @Version: 1.0
+ **/
+public interface IGridService {
+
+ /**
+ * 保存网格并返回ID
+ *
+ * @param gridVO
+ * @return
+ * @throws Exception
+ */
+ void save(GridVO gridVO) throws Exception;
+
+
+ /**
+ * 删除网格
+ *
+ * @param relationId 关联关系
+ */
+ void deleteByRelationId(String relationId);
+
+ /**
+ * 删除网格
+ *
+ * @param gridIds 网格ID列表
+ */
+ void deleteByGridIds(List gridIds);
+
+ /**
+ * 删除空网格(没有节点的网格)
+ *
+ * @param gridIds
+ */
+ void deleteEmpty(List gridIds);
+
+ /**
+ * 网格列表
+ *
+ * @param params
+ * @return
+ */
+ List list(Map params);
+
+ /**
+ * 网格列表
+ *
+ * @param gridIds 网格ID
+ * @return
+ */
+ List list(List gridIds);
+
+ /**
+ * 获取网格列表
+ *
+ * @param relationId 关联ID
+ * @return
+ */
+ List listByRelationId(String relationId);
+
+ /**
+ * 获取网格列表
+ *
+ * @param relationIds 关联ID列表
+ * @return
+ */
+ List listGroupByRelationIds(List relationIds);
+
+ /**
+ * 获取全部网格列表
+ *
+ * @param relationIds
+ * @return
+ * @throws SearchException
+ */
+ List listByRelationIds(List relationIds);
+
+ /**
+ * 获取网格分页列表
+ *
+ * @param relationIds
+ * @return
+ */
+ SuccessResultList> listPageByRelationIds(ListPage page, List relationIds);
+
+
+}
diff --git a/module-map/src/main/java/ink/wgink/module/map/service/grid/impl/GridPointServiceImpl.java b/module-map/src/main/java/ink/wgink/module/map/service/grid/impl/GridPointServiceImpl.java
new file mode 100644
index 00000000..fd73a521
--- /dev/null
+++ b/module-map/src/main/java/ink/wgink/module/map/service/grid/impl/GridPointServiceImpl.java
@@ -0,0 +1,82 @@
+package ink.wgink.module.map.service.grid.impl;
+
+import ink.wgink.common.base.DefaultBaseService;
+import ink.wgink.exceptions.RemoveException;
+import ink.wgink.module.map.dao.grid.IGridPointDao;
+import ink.wgink.module.map.pojo.dto.grid.GridPointDTO;
+import ink.wgink.module.map.pojo.vo.grid.GridPointVO;
+import ink.wgink.module.map.service.grid.IGridPointService;
+import ink.wgink.util.map.HashMapUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName: GridPointServiceImpl
+ * @Description: 网格点
+ * @Author: wanggeng
+ * @Date: 2021/8/30 10:07 下午
+ * @Version: 1.0
+ */
+@Service
+public class GridPointServiceImpl extends DefaultBaseService implements IGridPointService {
+
+ @Autowired
+ private IGridPointDao gridPointDao;
+
+ @Override
+ public void save(String gridId, List pointArray) {
+ if (pointArray == null || pointArray.isEmpty()) {
+ return;
+ }
+ Map params = getHashMap(4);
+ params.put("gridId", gridId);
+ for (GridPointVO gridPointVO : pointArray) {
+ params.put("lng", gridPointVO.getLng());
+ params.put("lat", gridPointVO.getLat());
+ gridPointDao.save(params);
+ }
+ }
+
+ @Override
+ public void deleteByGridIds(List gridIds) throws RemoveException {
+ Map params = getHashMap(2);
+ params.put("gridIds", gridIds);
+ gridPointDao.delete(params);
+ }
+
+ @Override
+ public void updatePointArrayByGridId(String gridId, List pointArray) throws Exception {
+ // 删除原有网格数组
+ Map params = getHashMap(2);
+ params.put("gridId", gridId);
+ gridPointDao.delete(params);
+ // 新增网格数组
+ for (GridPointVO gridPointVO : pointArray) {
+ params = HashMapUtil.beanToMap(gridPointVO);
+ params.put("gridId", gridId);
+ gridPointDao.save(params);
+ }
+ }
+
+ @Override
+ public List list(Map params) {
+ return gridPointDao.list(params);
+ }
+
+ @Override
+ public List list(String gridId) {
+ Map params = getHashMap(2);
+ params.put("gridId", gridId);
+ return list(params);
+ }
+
+ @Override
+ public List list(List gridIds) {
+ Map params = getHashMap(2);
+ params.put("gridIds", gridIds);
+ return list(params);
+ }
+}
diff --git a/module-map/src/main/java/ink/wgink/module/map/service/grid/impl/GridRelationServiceImpl.java b/module-map/src/main/java/ink/wgink/module/map/service/grid/impl/GridRelationServiceImpl.java
new file mode 100644
index 00000000..fe72d073
--- /dev/null
+++ b/module-map/src/main/java/ink/wgink/module/map/service/grid/impl/GridRelationServiceImpl.java
@@ -0,0 +1,123 @@
+package ink.wgink.module.map.service.grid.impl;
+
+import ink.wgink.common.base.DefaultBaseService;
+import ink.wgink.exceptions.RemoveException;
+import ink.wgink.module.map.dao.grid.IGridRelationDao;
+import ink.wgink.module.map.pojo.dto.grid.GridRelationDTO;
+import ink.wgink.module.map.service.grid.IGridRelationService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+/**
+ * @ClassName: GridRelationServiceImpl
+ * @Description: 网格关联业务
+ * @Author: wanggeng
+ * @Date: 2021/8/30 10:08 下午
+ * @Version: 1.0
+ */
+@Service
+public class GridRelationServiceImpl extends DefaultBaseService implements IGridRelationService {
+
+ @Autowired
+ private IGridRelationDao gridRelationDao;
+
+ @Override
+ public void save(String gridId, List relationIdArray) {
+ if (relationIdArray == null || relationIdArray.isEmpty()) {
+ return;
+ }
+ Map params = getHashMap(4);
+ params.put("gridId", gridId);
+ for (String relationId : relationIdArray) {
+ params.put("relationId", relationId);
+ gridRelationDao.save(params);
+ }
+ }
+
+ @Override
+ public void delete(String gridId, String relationId) throws RemoveException {
+ Map params = getHashMap(4);
+ params.put("gridId", gridId);
+ params.put("relationId", relationId);
+ gridRelationDao.delete(params);
+ }
+
+ @Override
+ public void deleteByGridIds(List gridIds) {
+ Map params = getHashMap(2);
+ params.put("gridIds", gridIds);
+ gridRelationDao.delete(params);
+ }
+
+ @Override
+ public void deleteByRelationId(String relationId) {
+ Map params = getHashMap(2);
+ params.put("relationId", relationId);
+ gridRelationDao.delete(params);
+ }
+
+ @Override
+ public List listByRelationId(String relationId) {
+ Map params = getHashMap(2);
+ params.put("relationId", relationId);
+ return gridRelationDao.list(params);
+ }
+
+ @Override
+ public List list(Map params) {
+ return gridRelationDao.list(params);
+ }
+
+ @Override
+ public List listByRelationIds(List relationIds) {
+ Map params = getHashMap(2);
+ params.put("relationIds", relationIds);
+ return list(params);
+ }
+
+ @Override
+ public List listByGridId(String gridId) {
+ Map params = getHashMap(2);
+ params.put("gridId", gridId);
+ return list(params);
+ }
+
+ @Override
+ public List listByGridIds(List gridIds) {
+ Map params = getHashMap(2);
+ params.put("gridIds", gridIds);
+ return list(params);
+ }
+
+ @Override
+ public List listGridId(String relationId) {
+ List gridRelationDTOs = listByRelationId(relationId);
+ return listGridIdByGridRelation(gridRelationDTOs);
+ }
+
+ @Override
+ public List listGridId(List relationIds) {
+ List gridRelationDTOs = listByRelationIds(relationIds);
+ return listGridIdByGridRelation(gridRelationDTOs);
+ }
+
+ /**
+ * 获取网格ID列表
+ *
+ * @param gridRelationDTOs
+ * @return
+ */
+ private List listGridIdByGridRelation(List gridRelationDTOs) {
+ if (gridRelationDTOs.isEmpty()) {
+ return new ArrayList<>();
+ }
+ Set gridIdSet = new HashSet<>();
+ gridRelationDTOs.forEach(gridRelationDTO -> {
+ gridIdSet.add(gridRelationDTO.getGridId());
+ });
+ return new ArrayList<>(gridIdSet);
+ }
+
+}
diff --git a/module-map/src/main/java/ink/wgink/module/map/service/grid/impl/GridServiceImpl.java b/module-map/src/main/java/ink/wgink/module/map/service/grid/impl/GridServiceImpl.java
new file mode 100644
index 00000000..6dc38b6c
--- /dev/null
+++ b/module-map/src/main/java/ink/wgink/module/map/service/grid/impl/GridServiceImpl.java
@@ -0,0 +1,284 @@
+package ink.wgink.module.map.service.grid.impl;
+
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import ink.wgink.common.base.DefaultBaseService;
+import ink.wgink.exceptions.SearchException;
+import ink.wgink.module.map.dao.grid.IGridDao;
+import ink.wgink.module.map.pojo.dto.grid.GridDTO;
+import ink.wgink.module.map.pojo.dto.grid.GridPointDTO;
+import ink.wgink.module.map.pojo.dto.grid.GridRelationDTO;
+import ink.wgink.module.map.pojo.vo.grid.GridPointVO;
+import ink.wgink.module.map.pojo.vo.grid.GridVO;
+import ink.wgink.module.map.service.grid.IGridPointService;
+import ink.wgink.module.map.service.grid.IGridRelationService;
+import ink.wgink.module.map.service.grid.IGridService;
+import ink.wgink.pojo.ListPage;
+import ink.wgink.pojo.result.SuccessResultList;
+import ink.wgink.util.UUIDUtil;
+import ink.wgink.util.map.HashMapUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+/**
+ * When you feel like quitting. Think about why you started
+ * 当你想要放弃的时候,想想当初你为何开始
+ *
+ * @ClassName: GridServiceImpl
+ * @Description: 网格业务
+ * @Author: WangGeng
+ * @Date: 2020/10/21 11:14
+ * @Version: 1.0
+ **/
+@Service
+public class GridServiceImpl extends DefaultBaseService implements IGridService {
+
+ @Autowired
+ private IGridDao gridDao;
+ @Autowired
+ private IGridRelationService gridRelationService;
+ @Autowired
+ private IGridPointService gridPointService;
+
+ @Override
+ public void save(GridVO gridVO) throws Exception {
+ String gridId = UUIDUtil.getUUID();
+ List relationIdArray = gridVO.getRelationIdArray();
+ List pointArray = gridVO.getPointArray();
+ // 保存网格
+ Map params = HashMapUtil.beanToMap(gridVO);
+ params.put("gridId", gridId);
+ params.remove("relationIdArray");
+ params.remove("pointArray");
+ setSaveInfo(params);
+ gridDao.save(params);
+ // 保存拓展属性
+ gridRelationService.save(gridId, relationIdArray);
+ gridPointService.save(gridId, pointArray);
+ }
+
+ @Override
+ public void deleteByRelationId(String relationId) {
+ List gridIds = gridRelationService.listGridId(relationId);
+ if (gridIds.isEmpty()) {
+ return;
+ }
+ Map params = getHashMap(2);
+ params.put("gridIds", gridIds);
+ // 删除网格
+ gridDao.delete(params);
+ // 删除网格点
+ gridPointService.deleteByGridIds(gridIds);
+ // 删除关联关系
+ gridRelationService.deleteByRelationId(relationId);
+ }
+
+ @Override
+ public void deleteByGridIds(List gridIds) {
+ if (gridIds == null || gridIds.isEmpty()) {
+ return;
+ }
+ // 删除网格
+ Map params = getHashMap(2);
+ params.put("gridIds", gridIds);
+ gridDao.delete(params);
+ // 删除点数组
+ gridPointService.deleteByGridIds(gridIds);
+ // 删除关联
+ gridRelationService.deleteByGridIds(gridIds);
+ }
+
+ @Override
+ public void deleteEmpty(List gridIds) {
+ if (gridIds == null || gridIds.isEmpty()) {
+ return;
+ }
+ // 所有的网格和人员关联关系列表
+ List gridRelationDTOs = gridRelationService.listByGridIds(gridIds);
+ // 得到为空的网格
+ List emptyGridIds = new ArrayList<>();
+ for (String gridId : gridIds) {
+ boolean isEmpty = true;
+ for (GridRelationDTO gridRelationDTO : gridRelationDTOs) {
+ if (StringUtils.equals(gridId, gridRelationDTO.getGridId())) {
+ isEmpty = false;
+ break;
+ }
+ }
+ if (isEmpty) {
+ emptyGridIds.add(gridId);
+ }
+ }
+ // 删除空网格
+ deleteByGridIds(emptyGridIds);
+ }
+
+ @Override
+ public List list(Map params) {
+ return gridDao.list(params);
+ }
+
+ @Override
+ public List list(List gridIds) {
+ Map params = getHashMap(2);
+ params.put("gridIds", gridIds);
+ return list(params);
+ }
+
+ @Override
+ public List listByRelationId(String relationId) throws SearchException {
+ if (StringUtils.isBlank(relationId)) {
+ return new ArrayList<>();
+ }
+ List gridIds = gridRelationService.listGridId(relationId);
+ if (gridIds.isEmpty()) {
+ return new ArrayList<>();
+ }
+ List gridDTOs = list(gridIds);
+ for (GridDTO gridDTO : gridDTOs) {
+ List gridPointDTOs = gridPointService.list(gridDTO.getGridId());
+ gridDTO.setPointArray(gridPointDTOs);
+ }
+ return gridDTOs;
+ }
+
+ @Override
+ public List listGroupByRelationIds(List relationIds) throws SearchException {
+ if (relationIds == null || relationIds.size() == 0) {
+ return new ArrayList<>();
+ }
+ List gridIds = gridRelationService.listGridId(relationIds);
+ if (gridIds.isEmpty()) {
+ return new ArrayList<>();
+ }
+ List gridDTOs = list(gridIds);
+ if (gridDTOs.isEmpty()) {
+ return gridDTOs;
+ }
+ // 聚合后的网格
+ List gridGroupDTOs = listGridGroup(gridDTOs);
+ // 只能展示包含关联人员列表的网格,比如:查询AB,那么可以展示的应该是AB...而不能是A
+ for (int i = 0; i < gridGroupDTOs.size(); i++) {
+ GridDTO gridDTO = gridGroupDTOs.get(i);
+ // 关联人数多于片区人数,排除
+ if (relationIds.size() > gridDTO.getRelationIdArray().size()) {
+ gridGroupDTOs.remove(i);
+ i--;
+ continue;
+ }
+ // 判断关联人是否全部被片区包含
+ boolean isAllExist = true;
+ for (String relationId : relationIds) {
+ if (!gridDTO.getRelationId().contains(relationId)) {
+ isAllExist = false;
+ break;
+ }
+ }
+ // 不是全部包含,就删除
+ if (!isAllExist) {
+ gridGroupDTOs.remove(i);
+ i--;
+ continue;
+ }
+ }
+ setGridPoints(gridGroupDTOs);
+ return gridGroupDTOs;
+ }
+
+ @Override
+ public List listByRelationIds(List relationIds) throws SearchException {
+ if (relationIds == null || relationIds.size() == 0) {
+ return new ArrayList<>();
+ }
+ List gridIds = gridRelationService.listGridId(relationIds);
+ if (gridIds.isEmpty()) {
+ return new ArrayList<>();
+ }
+ List gridDTOs = list(gridIds);
+ if (gridDTOs.isEmpty()) {
+ return gridDTOs;
+ }
+ setGridPoints(gridDTOs);
+ return gridDTOs;
+ }
+
+ @Override
+ public SuccessResultList> listPageByRelationIds(ListPage page, List relationIds) {
+ if (relationIds == null || relationIds.size() == 0) {
+ return new SuccessResultList<>(new ArrayList<>(), 1, 0L);
+ }
+ List gridIds = gridRelationService.listGridId(relationIds);
+ if (gridIds.isEmpty()) {
+ return new SuccessResultList<>(new ArrayList<>(), 1, 0L);
+ }
+ PageHelper.startPage(page.getPage(), page.getRows());
+ List gridDTOs = list(relationIds);
+ PageInfo pageInfo = new PageInfo<>(gridDTOs);
+ return new SuccessResultList<>(gridDTOs, pageInfo.getPageNum(), pageInfo.getTotal());
+ }
+
+
+ /**
+ * 设置网格点
+ *
+ * @param gridDTOs
+ */
+ private void setGridPoints(List gridDTOs) {
+ if (gridDTOs.isEmpty()) {
+ return;
+ }
+ List gridIds = new ArrayList<>();
+ for (GridDTO gridDTO : gridDTOs) {
+ gridIds.add(gridDTO.getGridId());
+ }
+ // 获取所有点
+ List gridPointDTOs = gridPointService.list(gridIds);
+ if (gridPointDTOs.isEmpty()) {
+ return;
+ }
+ // 构建所有点
+ for (GridDTO gridDTO : gridDTOs) {
+ List pointArray = new ArrayList<>();
+ for (GridPointDTO gridPointDTO : gridPointDTOs) {
+ if (StringUtils.equals(gridDTO.getGridId(), gridPointDTO.getGridId())) {
+ pointArray.add(gridPointDTO);
+ }
+ }
+ gridDTO.setPointArray(pointArray);
+ }
+ }
+
+ /**
+ * 得到聚合后的列表
+ *
+ * @param gridDTOs
+ * @return
+ */
+ private List listGridGroup(List gridDTOs) {
+ Map gridMap = new HashMap<>(16);
+ for (GridDTO gridDTO : gridDTOs) {
+ GridDTO grid = gridMap.get(gridDTO.getGridId());
+ if (grid == null) {
+ grid = gridDTO;
+ List getRelationIdArray = new ArrayList<>();
+ getRelationIdArray.add(gridDTO.getRelationId());
+ gridDTO.setRelationIdArray(getRelationIdArray);
+ gridMap.put(gridDTO.getGridId(), gridDTO);
+ }
+ // 合并relationId
+ grid.getRelationIdArray().add(gridDTO.getRelationId());
+ }
+ List gridGroups = new ArrayList<>();
+ for (Map.Entry kv : gridMap.entrySet()) {
+ GridDTO gridDTO = kv.getValue();
+ Collections.sort(gridDTO.getRelationIdArray());
+ gridDTO.setRelationId(gridDTO.getRelationIdArray().toString());
+ gridGroups.add(gridDTO);
+ }
+ return gridGroups;
+ }
+
+}
diff --git a/module-map/src/main/resources/mybatis/mapper/grid/grid-mapper.xml b/module-map/src/main/resources/mybatis/mapper/grid/grid-mapper.xml
new file mode 100644
index 00000000..dc7c5c0b
--- /dev/null
+++ b/module-map/src/main/resources/mybatis/mapper/grid/grid-mapper.xml
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CREATE TABLE `map_grid` (
+ `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+ `grid_id` char(36) NOT NULL,
+ `grid_name` varchar(255) NOT NULL,
+ `fill_color` varchar(7) NOT NULL DEFAULT '#000000' COMMENT '颜色',
+ `gmt_create` datetime DEFAULT NULL,
+ `creator` char(36) DEFAULT NULL,
+ `gmt_modified` datetime DEFAULT NULL,
+ `modifier` char(36) DEFAULT NULL,
+ `is_delete` int(1) DEFAULT '0',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `grid_id` (`grid_id`)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='网格';
+
+
+
+
+ INSERT INTO map_grid(
+ grid_id,
+ grid_name,
+ fill_color,
+ gmt_create,
+ creator,
+ gmt_modified,
+ modifier,
+ is_delete
+ ) VALUES(
+ #{gridId},
+ #{gridName},
+ #{fillColor},
+ #{gmtCreate},
+ #{creator},
+ #{gmtModified},
+ #{modifier},
+ #{isDelete}
+ )
+
+
+
+
+ DELETE FROM
+ map_grid
+ WHERE
+
+ grid_id = #{gridId}
+
+
+ grid_id IN
+
+ #{gridIds[${index}]}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/module-map/src/main/resources/mybatis/mapper/grid/grid-point-mapper.xml b/module-map/src/main/resources/mybatis/mapper/grid/grid-point-mapper.xml
new file mode 100644
index 00000000..e215c11d
--- /dev/null
+++ b/module-map/src/main/resources/mybatis/mapper/grid/grid-point-mapper.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CREATE TABLE `map_grid_point` (
+ `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+ `grid_id` char(36) NOT NULL,
+ `lng` varchar(255) DEFAULT NULL COMMENT '点经度',
+ `lat` varchar(255) DEFAULT NULL COMMENT '点纬度',
+ PRIMARY KEY (`id`),
+ KEY `grid_id` (`grid_id`)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='网格点';
+
+
+
+
+ INSERT INTO map_grid_point(
+ grid_id,
+ lng,
+ lat
+ ) VALUES(
+ #{gridId},
+ #{lng},
+ #{lat}
+ )
+
+
+
+
+ DELETE FROM
+ map_grid_point
+ WHERE
+
+ grid_id = #{gridId}
+
+
+ grid_id IN
+
+ #{gridIds[${index}]}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/module-map/src/main/resources/mybatis/mapper/grid/grid-relation-mapper.xml b/module-map/src/main/resources/mybatis/mapper/grid/grid-relation-mapper.xml
new file mode 100644
index 00000000..520f0e00
--- /dev/null
+++ b/module-map/src/main/resources/mybatis/mapper/grid/grid-relation-mapper.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CREATE TABLE `map_grid_relation` (
+ `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+ `relation_id` char(36) NOT NULL COMMENT '关联ID',
+ `grid_id` char(36) NOT NULL COMMENT '网格ID',
+ PRIMARY KEY (`id`,`relation_id`),
+ KEY `relation_id` (`relation_id`) USING BTREE,
+ KEY `grid_id` (`grid_id`)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='网格与关联';
+
+
+
+
+ INSERT INTO map_grid_relation(
+ grid_id,
+ relation_id
+ ) VALUES(
+ #{gridId},
+ #{relationId}
+ )
+
+
+
+
+ DELETE FROM
+ map_grid_relation
+
+
+ grid_id = #{gridId}
+
+
+ AND
+ grid_id IN
+
+ #{gridIds[${index}]}
+
+
+
+ AND
+ relation_id = #{relationId}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 0e4c63a6..bab33824 100644
--- a/pom.xml
+++ b/pom.xml
@@ -35,6 +35,7 @@
module-sms
register-wechat
module-file-media
+ module-map
pom