diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java
index 04db67cfed..05e5c200a4 100644
--- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java
+++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java
@@ -10,6 +10,8 @@ package com.epmet.commons.tools.redis;
 
 import com.epmet.commons.tools.constant.NumConstant;
 import com.epmet.commons.tools.constant.StrConstant;
+import com.epmet.commons.tools.exception.EpmetErrorCode;
+import com.epmet.commons.tools.exception.EpmetException;
 import com.epmet.commons.tools.utils.DateUtils;
 import org.apache.commons.lang3.StringUtils;
 
@@ -763,4 +765,16 @@ public class RedisKeys {
 	public static String getNextAreaCodeKey(String areaCode) {
 		return rootPrefix.concat("areaCode:parentCode:").concat(areaCode);
 	}
+
+	/**
+	 * desc:获取分布式锁key
+	 * @param methodName
+	 * @return
+	 */
+	public static String getLockByMethodName(String methodName) {
+		if (StringUtils.isBlank(methodName)){
+			throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(),"参数错误");
+		}
+		return rootPrefix.concat("lock:").concat(methodName);
+	}
 }
diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/OpenDataApplication.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/OpenDataApplication.java
index 532877cf4b..c786abb9ba 100644
--- a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/OpenDataApplication.java
+++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/OpenDataApplication.java
@@ -5,7 +5,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.web.servlet.ServletComponentScan;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.cloud.openfeign.EnableFeignClients;
-import org.springframework.context.annotation.ComponentScan;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 /**
  * @Description OpenData服务启动类
@@ -14,6 +14,7 @@ import org.springframework.context.annotation.ComponentScan;
  * @author wxz
  * @date 2021.10.13 15:16:05
 */
+@EnableScheduling
 @SpringBootApplication
 @EnableDiscoveryClient
 @EnableFeignClients
diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/GriderOnlineNumDao.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/GriderOnlineNumDao.java
new file mode 100644
index 0000000000..9f4080c054
--- /dev/null
+++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/dao/GriderOnlineNumDao.java
@@ -0,0 +1,33 @@
+/**
+ * Copyright 2018 人人开源 https://www.renren.io
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see .
+ */
+
+package com.epmet.opendata.dao;
+
+import com.epmet.commons.mybatis.dao.BaseDao;
+import com.epmet.opendata.entity.GriderOnlineNumEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 在线网格员人数
+ *
+ * @author generator generator@elink-cn.com
+ * @since v1.0.0 2021-10-14
+ */
+@Mapper
+public interface GriderOnlineNumDao extends BaseDao {
+
+}
diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/GriderOnlineNumEntity.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/GriderOnlineNumEntity.java
new file mode 100644
index 0000000000..ca707865cf
--- /dev/null
+++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/entity/GriderOnlineNumEntity.java
@@ -0,0 +1,61 @@
+/**
+ * Copyright 2018 人人开源 https://www.renren.io
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see .
+ */
+
+package com.epmet.opendata.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.epmet.commons.mybatis.entity.BaseEpmetEntity;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * 用户巡查主记录
+ *
+ * @author generator generator@elink-cn.com
+ * @since v1.0.0 2021-10-14
+ */
+@Data
+@EqualsAndHashCode(callSuper=false)
+@TableName("grider_online_num")
+public class GriderOnlineNumEntity extends BaseEpmetEntity {
+
+	private static final long serialVersionUID = 1L;
+
+    /**
+     * 客户Id
+     */
+	private String customerId;
+
+	private String qxGridId;
+
+    /**
+     * 推送时间
+     */
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date pushTime;
+
+	/**
+	 * 在线数
+	 */
+	private Integer onlineNum;
+
+
+
+}
diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/GriderOnlineNumService.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/GriderOnlineNumService.java
new file mode 100644
index 0000000000..55112c1d8d
--- /dev/null
+++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/GriderOnlineNumService.java
@@ -0,0 +1,38 @@
+/**
+ * Copyright 2018 人人开源 https://www.renren.io
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see .
+ */
+
+package com.epmet.opendata.service;
+
+import com.epmet.commons.mybatis.service.BaseService;
+import com.epmet.opendata.entity.GriderOnlineNumEntity;
+
+/**
+ * 用户巡查主记录
+ *
+ * @author generator generator@elink-cn.com
+ * @since v1.0.0 2021-10-14
+ */
+public interface GriderOnlineNumService extends BaseService {
+
+    /**
+     * desc:插入巡查中的网格员数据
+     * @return boolean
+     */
+    Boolean insertData(String agencyId);
+
+
+}
diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/GriderOnlineNumServiceImpl.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/GriderOnlineNumServiceImpl.java
new file mode 100644
index 0000000000..b024c1436e
--- /dev/null
+++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/service/impl/GriderOnlineNumServiceImpl.java
@@ -0,0 +1,69 @@
+/**
+ * Copyright 2018 人人开源 https://www.renren.io
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see .
+ */
+
+package com.epmet.opendata.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.epmet.commons.mybatis.service.impl.BaseServiceImpl;
+import com.epmet.commons.tools.constant.NumConstant;
+import com.epmet.commons.tools.constant.StrConstant;
+import com.epmet.commons.tools.utils.Result;
+import com.epmet.dto.form.PatrolCountFormDTO;
+import com.epmet.dto.result.PatrolCountResultDTO;
+import com.epmet.feign.EpmetUserOpenFeignClient;
+import com.epmet.opendata.dao.GriderOnlineNumDao;
+import com.epmet.opendata.entity.GriderOnlineNumEntity;
+import com.epmet.opendata.service.GriderOnlineNumService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+
+
+/**
+ * 用户巡查主记录
+ *
+ * @author generator generator@elink-cn.com
+ * @since v1.0.0 2021-10-14
+ */
+@Slf4j
+@Service
+public class GriderOnlineNumServiceImpl extends BaseServiceImpl implements GriderOnlineNumService {
+@Autowired
+private EpmetUserOpenFeignClient epmetUserOpenFeignClient;
+    @Override
+    public Boolean insertData(String agencyId) {
+        PatrolCountFormDTO param = new PatrolCountFormDTO();
+        param.setAgencyId(agencyId);
+        Result patrolCountResult = epmetUserOpenFeignClient.patrolCount(param);
+
+        log.debug("insertData patrolCountResult return:{}", JSON.toJSONString(patrolCountResult));
+        if (patrolCountResult == null || !patrolCountResult.success()) {
+            log.warn("insertData patrolCount fail,return null");
+            return false;
+        }
+        PatrolCountResultDTO data = patrolCountResult.getData();
+        int count = data.getPatrollingCount() == null ? NumConstant.ZERO : data.getPatrollingCount();
+        GriderOnlineNumEntity entity = new GriderOnlineNumEntity();
+        entity.setCustomerId(StrConstant.PY_CUSTOMER);
+        entity.setPushTime(new Date());
+        entity.setOnlineNum(count);
+        baseDao.insert(entity);
+        return true;
+    }
+}
diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/task/ExtractBizDataToOpenData.java b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/task/ExtractBizDataToOpenData.java
new file mode 100644
index 0000000000..ebcd5aa27d
--- /dev/null
+++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/java/com/epmet/opendata/task/ExtractBizDataToOpenData.java
@@ -0,0 +1,71 @@
+package com.epmet.opendata.task;
+
+import com.epmet.commons.tools.constant.NumConstant;
+import com.epmet.commons.tools.constant.StrConstant;
+import com.epmet.commons.tools.distributedlock.DistributedLock;
+import com.epmet.commons.tools.redis.RedisKeys;
+import com.epmet.commons.tools.utils.DateUtils;
+import com.epmet.opendata.service.GriderOnlineNumService;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RLock;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+
+/**
+ * desc:
+ *
+ * @author: LiuJanJun
+ * @date: 2022/4/12 4:21 下午
+ * @version: 1.0
+ */
+@Slf4j
+@Component
+public class ExtractBizDataToOpenData {
+
+    @Autowired
+    private DistributedLock distributedLock;
+
+    @Autowired
+    private GriderOnlineNumService griderOnlineNumService;
+
+    @Scheduled(cron = "0 30 */2 * * *")
+    //@Scheduled(cron = "0/15 * * * * *")
+    public void extractGridMemberPatrollingCount() {
+        String currentTime = DateUtils.format(new Date(), DateUtils.DATE_TIME_PATTERN);
+        log.info("extractGridMemberPatrollingCount start,date:{}", currentTime);
+        RLock rLock = null;
+        try {
+            rLock = distributedLock.tryLock(RedisKeys.getLockByMethodName("extractGridMemberPatrollingCount"));
+            if (rLock == null || !rLock.isLocked()) {
+                log.warn("tryLock method extractGridMemberPatrollingCount fail");
+                return;
+            }
+            boolean patrolCountResult;
+            int retryTime = NumConstant.THREE;
+            do {
+                //StrConstant.PY_ROOT_AGENCY
+                patrolCountResult = griderOnlineNumService.insertData(StrConstant.PY_ROOT_AGENCY);
+                if (!patrolCountResult) {
+                    break;
+                }
+                //如果 重试次数为1了 就让歇个 5分钟
+                if (retryTime == 1) {
+                    Thread.sleep(NumConstant.FIVE * NumConstant.SIXTY * NumConstant.ONE_THOUSAND);
+                }
+            } while (retryTime-- > 0);
+            if (!patrolCountResult) {
+                log.error("插入网格员在线人数失败,请检查原因,时间:{}", currentTime);
+            }
+
+        } catch (Exception e) {
+            log.warn("tryLock method extractGridMemberPatrollingCount fail");
+        } finally {
+            distributedLock.unLock(rLock);
+        }
+        log.info("extractGridMemberPatrollingCount end");
+    }
+
+}
diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/db/migration/V0.0.1__add_grider_online_num.sql b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/db/migration/V0.0.1__add_grider_online_num.sql
new file mode 100644
index 0000000000..d4fd9ca93f
--- /dev/null
+++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/db/migration/V0.0.1__add_grider_online_num.sql
@@ -0,0 +1,13 @@
+CREATE TABLE `grider_online_num` (
+                                     `ID` varchar(64) NOT NULL COMMENT '主键',
+                                     `CUSTOMER_ID` varchar(64) NOT NULL COMMENT '客户Id',
+                                     `ONLINE_NUM` int(11) NOT NULL COMMENT '在线人数',
+                                     `PUSH_TIME` datetime NOT NULL COMMENT '推送时间',
+                                     `DEL_FLAG` bigint(1) NOT NULL DEFAULT '0' COMMENT '删除标识 0.未删除 1.已删除',
+                                     `REVISION` int(11) NOT NULL COMMENT '乐观锁',
+                                     `CREATED_BY` varchar(64) NOT NULL COMMENT '创建人',
+                                     `CREATED_TIME` datetime NOT NULL COMMENT '创建时间',
+                                     `UPDATED_BY` varchar(64) NOT NULL COMMENT '更新人',
+                                     `UPDATED_TIME` datetime NOT NULL COMMENT '更新时间',
+                                     PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='网格员在线人数';
diff --git a/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/GriderOnlineNumDao.xml b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/GriderOnlineNumDao.xml
new file mode 100644
index 0000000000..27c636d525
--- /dev/null
+++ b/epmet-module/open-data-worker/open-data-worker-server/src/main/resources/mapper/GriderOnlineNumDao.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+