Browse Source

合并ip规则优化

huangzhiguo 1 year ago
parent
commit
b6b5a53bc6

+ 24 - 0
src/main/java/com/caimei365/tools/mapper/CmBehaviorRecordMapper.java

@@ -5,6 +5,7 @@ import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * Description
@@ -108,6 +109,13 @@ public interface CmBehaviorRecordMapper {
      */
     List<String> getRecodeOpenId(@Param("accessDate") String accessDate);
 
+    /**
+     * 小程序中每个openid有多个用户
+     * @param accessDate
+     * @return
+     */
+    Map<String, Integer> getCuxOpen(@Param("accessDate") String accessDate);
+
     /**
      * 查询openId 对应的用户
      * @param accessDate
@@ -123,6 +131,13 @@ public interface CmBehaviorRecordMapper {
      */
     List<String> getRecodeTouristId(@Param("accessDate") String accessDate);
 
+    /**
+     * 网站中每个touristId有多个用户
+     * @param accessDate
+     * @return
+     */
+    Map<String, Integer> getCuxTouris(@Param("accessDate") String accessDate);
+
     /**
      * 游客对应用户信息
      * @param accessDate
@@ -138,6 +153,15 @@ public interface CmBehaviorRecordMapper {
      * @return
      */
     String getTouristIdByIp(@Param("accessDate") String accessDate, @Param("touristId") String touristId);
+
+    /**
+     * 获取userId 访问属性
+     * @param accessDate
+     * @param openId
+     * @param touristId
+     * @return
+     */
+    List<Integer> getUserIdAttribute(@Param("accessDate") String accessDate, @Param("openId") String openId, @Param("touristId") String touristId);
     /**
      * 修改数据
      * @param cmBehaviorRecordPo

+ 39 - 17
src/main/java/com/caimei365/tools/service/impl/CmBehaviorRecordServiceImpl.java

@@ -387,20 +387,32 @@ public class CmBehaviorRecordServiceImpl implements CmBehaviorRecordService {
         calendar.add(Calendar.DAY_OF_MONTH, -1);
         Date time = calendar.getTime();
         String format = dateFormat.format(time);
+        Integer num = 0;
         // 小程序 合并数据使用openId
         List<String> openIdList = recordMapper.getRecodeOpenId(format);
         if (null != openIdList && openIdList.size() > 0) {
+            // 程序中每个openid有多个用户
+            Map<String, Integer> cuxOpen = recordMapper.getCuxOpen(format);
             // 查询小程序数据
             List<CmBehaviorRecordPo> behaviorList = recordMapper.getRecordOpenIdInfo(format, openIdList);
             for (String openId : openIdList) {
-                // 将游客数据中的ip和userId修改为机构/供应商数据
-                for (CmBehaviorRecordPo cmBehaviorRecordPo : behaviorList) {
-                    if (openId.equals(cmBehaviorRecordPo.getOpenId())) {
-                        cmBehaviorRecordPo.setIP(cmBehaviorRecordPo.getIP());
-                        cmBehaviorRecordPo.setUserId(cmBehaviorRecordPo.getUserId());
-                        cmBehaviorRecordPo.setOpenId(openId);
-                        cmBehaviorRecordPo.setAccessDate(format);
-                        recordMapper.updateBehavior(cmBehaviorRecordPo);
+                // 用户个数
+                num = null == cuxOpen.get(openId) ? 0 : cuxOpen.get(openId);
+                // 获取该openId下访问的用户id
+                List<Integer> userIdAttribute = recordMapper.getUserIdAttribute(format, openId, null);
+                boolean userBean = userBean = userIdAttribute.contains(0);
+
+                // 该openId下只有两个身份 游客-机构、游客-供应商
+                if (num == 2 && userBean) {
+                    // 将游客数据中的ip和userId修改为机构/供应商数据
+                    for (CmBehaviorRecordPo cmBehaviorRecordPo : behaviorList) {
+                        if (openId.equals(cmBehaviorRecordPo.getOpenId())) {
+                            cmBehaviorRecordPo.setIP(cmBehaviorRecordPo.getIP());
+                            cmBehaviorRecordPo.setUserId(cmBehaviorRecordPo.getUserId());
+                            cmBehaviorRecordPo.setOpenId(openId);
+                            cmBehaviorRecordPo.setAccessDate(format);
+                            recordMapper.updateBehavior(cmBehaviorRecordPo);
+                        }
                     }
                 }
             }
@@ -408,19 +420,29 @@ public class CmBehaviorRecordServiceImpl implements CmBehaviorRecordService {
         // 网站 合并按游客Id 合并数据
         List<String> recodeTouristId = recordMapper.getRecodeTouristId(format);
         if (null != recodeTouristId && recodeTouristId.size() > 0) {
+            // 网站中每个touristId有多个用户
+            Map<String, Integer> cuxTouris = recordMapper.getCuxTouris(format);
             // 游客对应用户信息
             List<CmBehaviorTouristInfoPo> touristInfo = recordMapper.getTouristInfo(format, recodeTouristId);
             if (null != touristInfo) {
                 for (String touristId : recodeTouristId) {
-                    for (CmBehaviorTouristInfoPo touristInfoPo : touristInfo) {
-                        if (touristId.equals(touristInfoPo.getTouristId())) {
-                            CmBehaviorRecordPo cmBehaviorRecordPo = new CmBehaviorRecordPo();
-                            cmBehaviorRecordPo.setIP(recordMapper.getTouristIdByIp(touristId, format));
-                            cmBehaviorRecordPo.setUserId(touristInfoPo.getUserId().toString());
-                            cmBehaviorRecordPo.setTouristId(touristId);
-                            cmBehaviorRecordPo.setAccessDate(format);
-                            //更具游客信息合并用户浏览记录
-                            recordMapper.updateBehaviorByTouristId(cmBehaviorRecordPo);
+                    // 用户个数
+                    num = null == cuxTouris.get(touristId) ? 0 : cuxTouris.get(touristId);
+                    // 获取该openId下访问的用户id
+                    List<Integer> userIdAttribute = recordMapper.getUserIdAttribute(format, null, touristId);
+                    boolean userBean = userIdAttribute.contains(0);
+                    // 该openId下只有两个身份 游客-机构、游客-供应商
+                    if(num == 2 && userBean) {
+                        for (CmBehaviorTouristInfoPo touristInfoPo : touristInfo) {
+                            if (touristId.equals(touristInfoPo.getTouristId())) {
+                                CmBehaviorRecordPo cmBehaviorRecordPo = new CmBehaviorRecordPo();
+                                cmBehaviorRecordPo.setIP(recordMapper.getTouristIdByIp(touristId, format));
+                                cmBehaviorRecordPo.setUserId(touristInfoPo.getUserId().toString());
+                                cmBehaviorRecordPo.setTouristId(touristId);
+                                cmBehaviorRecordPo.setAccessDate(format);
+                                //更具游客信息合并用户浏览记录
+                                recordMapper.updateBehaviorByTouristId(cmBehaviorRecordPo);
+                            }
                         }
                     }
                 }

+ 24 - 0
src/main/resources/mapper/CmBehaviorRecordMapper.xml

@@ -206,6 +206,10 @@
         SELECT openId as count FROM cm_behavior_record where accessDate = #{accessDate} and accessClient = 1 GROUP BY openId
     </select>
 
+    <select id="getCuxOpen" resultType="java.util.Map">
+        SELECT openId, COUNT(DISTINCT userId)  FROM cm_behavior_record WHERE accessDate = #{accessDate} AND accessClient = 1 GROUP BY openId
+    </select>
+
     <select id="getRecordOpenIdInfo" resultType="com.caimei365.tools.model.po.CmBehaviorRecordPo">
         SELECT ip as IP, userID as userId, openId FROM cm_behavior_record
         <where>
@@ -224,6 +228,10 @@
         SELECT touristId FROM cm_behavior_record WHERE accessDate = #{accessDate} and accessClient = 0 GROUP BY touristId
     </select>
 
+    <select id="getCuxTouris" resultType="java.util.Map">
+        SELECT touristId, COUNT(DISTINCT userId) FROM cm_behavior_record WHERE accessDate = #{accessDate} AND accessClient = 0 GROUP BY touristId
+    </select>
+
     <select id="getTouristInfo" resultType="com.caimei365.tools.model.po.CmBehaviorTouristInfoPo">
         select userId, touristId, addTime from cm_behavior_tourist_info
         <where>
@@ -242,6 +250,20 @@
         SELECT ip FROM cm_behavior_record WHERE accessDate = #{accessDate} and touristId = #{touristId}
     </select>
 
+    <select id="getUserIdAttribute" resultType="java.lang.Integer">
+        SELECT userId FROM cm_behavior_record
+            <where>
+                accessDate = #{accessDate}
+                <if test="openId != null and openId != ''">
+                    AND openId = #{openId}
+                </if>
+                <if test="touristId != null and touristId != ''">
+                    AND touristId = #{touristId}
+                </if>
+            </where>
+        GROUP BY userId
+    </select>
+
     <update id="updateBehavior">
         UPDATE cm_behavior_record
         SET IP = #{IP},
@@ -332,6 +354,7 @@
               relevanceShop,
               label,
               addTime,
+              touristId,
               delFlag
             ) values (
                    #{IP},
@@ -354,6 +377,7 @@
                    #{relevanceShop},
                    #{label},
                    #{addTime},
+                   #{touristId},
                    '0'
                )
     </select>