Procházet zdrojové kódy

用户行为优化1.0.4

huangzhiguo před 1 rokem
rodič
revize
8915248a77

+ 2 - 1
src/main/java/com/caimei365/tools/controller/BaseApi.java

@@ -96,9 +96,10 @@ public class BaseApi {
      * 临时接口
      */
     /*@GetMapping("/base/oldData")
-    public void oldData(String dateTime) {
+    public void oldData(String startTime, String endTime) {
 //        cmBehaviorRecordService.pageStatistics(dateTime);
 //        cmBehaviorRecordService.insertTodayData();
+        cmBehaviorRecordService.clubDemand(startTime, endTime);
     }*/
 
     @ApiOperation("获取小程序二维码图片")

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

@@ -382,5 +382,64 @@ public interface CmBehaviorRecordMapper {
      * @param cmPageShopKeywordPo
      */
     void insertPageKeyword(CmPageShopKeywordPo cmPageShopKeywordPo);
+
+    /**
+     * 机构Id
+     * @return
+     */
+    List<Integer> getClubId();
+
+    /**
+     * 机构咨询记录静态、动态标签
+     * @param clubId
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    List<CmClubLabelPo> getClubLabel(@Param("clubId") Integer clubId,@Param("startTime") String startTime,@Param("endTime") String endTime);
+
+    /**
+     * 用户访问记录数据
+     * @param clubId
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    List<CmBehaviorRecordPo> getClubBehavior(@Param("clubId") Integer clubId,@Param("startTime") String startTime,@Param("endTime") String endTime);
+
+    /**
+     * 动态标签
+     * @return
+     */
+    List<String> getTrendsKeyword();
+
+    /**
+     * 静态标签
+     * @return
+     */
+    List<String> getStateKeyword();
+
+    /**
+     * 机构动态标签
+     * @return
+     */
+    List<CmClubLabelPo> getClubTrendsKeyword();
+
+    /**
+     * 机构静态标签
+     * @return
+     */
+    List<CmClubLabelPo> getClubStateKeyword();
+
+    /**
+     * 保存机构标签
+     */
+    void insertClubLabel(CmClubLabelPo cmClubLabelPo);
+
+    /**
+     * 修改机构标签
+     * @param cmClubLabelPo
+     */
+    void updateClubLabel(CmClubLabelPo cmClubLabelPo);
 }
 

+ 50 - 0
src/main/java/com/caimei365/tools/model/po/CmClubLabelPo.java

@@ -0,0 +1,50 @@
+package com.caimei365.tools.model.po;
+
+import lombok.Data;
+
+/**
+ * Description
+ *
+ * @author : hzg
+ * @date : 2024/1/2
+ */
+@Data
+public class CmClubLabelPo {
+    private Integer id;
+    /**
+     * 机构Id
+     */
+    private Integer clubId;
+    /**
+     * 关键词
+     */
+    private String label;
+    /**
+     * 页面类型
+     */
+    private Integer pageType;
+    /**
+     * 0:动态标签;1:静态标签
+     */
+    private Integer dynamicStatus;
+    /**
+     * 出现次数
+     */
+    private Integer appearNumber;
+    /**
+     * 添加时间
+     */
+    private String addTime;
+    /**
+     * 删除标记
+     */
+    private Integer delFlag;
+    /**
+     * 动态标签
+     */
+    private String trendsKeyword;
+    /**
+     * 静态标签
+     */
+    private String stateKeyword;
+}

+ 7 - 0
src/main/java/com/caimei365/tools/service/CmBehaviorRecordService.java

@@ -32,4 +32,11 @@ public interface CmBehaviorRecordService {
      * 页面统计
      */
     void pageStatistics();
+
+    /**
+     * 机构需求标签
+     * @param startTime
+     * @param endTime
+     */
+    void clubDemand(String startTime, String endTime);
 }

+ 245 - 0
src/main/java/com/caimei365/tools/service/impl/CmBehaviorRecordServiceImpl.java

@@ -855,6 +855,251 @@ public class CmBehaviorRecordServiceImpl implements CmBehaviorRecordService {
         log.info("页面统计结束");
     }
 
+    /**
+     * 机构需求标签
+     *
+     * @param startTime
+     * @param endTime
+     */
+    @Override
+    public void clubDemand(String startTime, String endTime) {
+        log.info("机构需求标签====统计开始");
+        // 获取机构Id
+        List<Integer> clubIdList = recordMapper.getClubId();
+        // 动态标签
+        List<String> trendsKeywordList = recordMapper.getTrendsKeyword();
+        // 静态标签
+        List<String> stateKeywordList = recordMapper.getStateKeyword();
+        // 机构动态标签
+        List<CmClubLabelPo> clubTrendsKeywordList = recordMapper.getClubTrendsKeyword();
+        // 机构静态标签
+        List<CmClubLabelPo> clubStateKeywordList = recordMapper.getClubStateKeyword();
+        if (null != clubIdList && clubIdList.size() > 0) {
+            for (Integer clubId : clubIdList) {
+                log.info("clubId===="+clubId);
+                // 标签
+                List<String> demandList = new ArrayList<>();
+                // 出现次数
+                Map<String, Integer> map = new HashMap<>();
+                // 对应机构Id
+                Map<String, Integer> clubIdMap = new HashMap<>();
+                // 咨询记录
+                List<CmClubLabelPo> clubLabel = recordMapper.getClubLabel(clubId, startTime, endTime);
+                if (clubLabel.size() > 0) {
+                    // 动态标签
+                    List<String> trendsKeywordCollect = clubLabel.stream().map(CmClubLabelPo::getTrendsKeyword).collect(Collectors.toList());
+                    if (null != trendsKeywordCollect && trendsKeywordCollect.size() > 0) {
+                        for (String trendsKeyword : trendsKeywordCollect) {
+                            if (trendsKeyword.contains(",")) {
+                                String[] split = trendsKeyword.split(",");
+                                for (String s : split) {
+                                    // 第一次加入, 初始出现系数为 1
+                                    if (StringUtils.isNotBlank(s) && StringUtils.isNotEmpty(s)) {
+                                        if (!demandList.contains(s)) {
+                                            demandList.add(s);
+                                            map.put(s, 1);
+                                            clubIdMap.put(s, clubId);
+                                        } else {
+                                            // 记录过,出现次数在原来基础上 + 1
+                                            Integer number = map.get(s) + 1;
+                                            map.put(s, number);
+                                        }
+                                    }
+                                }
+                            } else {
+                                // 第一次加入, 初始出现系数为 1
+                                if (StringUtils.isNotBlank(trendsKeyword) && StringUtils.isNotEmpty(trendsKeyword)) {
+                                    if (!demandList.contains(trendsKeyword)) {
+                                        demandList.add(trendsKeyword);
+                                        map.put(trendsKeyword, 1);
+                                        clubIdMap.put(trendsKeyword, clubId);
+                                    } else {
+                                        // 记录过,出现次数在原来基础上 + 1
+                                        Integer number = map.get(trendsKeyword) + 1;
+                                        map.put(trendsKeyword, number);
+                                    }
+                                }
+                            }
+                        }
+                        // 保存动态标签
+                        List<String> collect = new ArrayList<>();
+                        if (null != clubTrendsKeywordList && clubTrendsKeywordList.size() > 0) {
+                            collect = clubTrendsKeywordList.stream().filter(tr -> tr.getClubId().equals(clubId)).map(CmClubLabelPo::getLabel).collect(Collectors.toList());
+                        }
+                        for (String demand : demandList) {
+                            if (!collect.contains(demand)) {
+                                // 不存在 添加进机构标签
+                                CmClubLabelPo cmClubLabelPo = new CmClubLabelPo();
+                                cmClubLabelPo.setLabel(demand);
+                                cmClubLabelPo.setClubId(clubIdMap.get(demand));
+                                cmClubLabelPo.setDynamicStatus(0);
+                                cmClubLabelPo.setAppearNumber(map.get(demand));
+                                recordMapper.insertClubLabel(cmClubLabelPo);
+                                collect.add(demand);
+                                clubTrendsKeywordList.add(cmClubLabelPo);
+                            } else {
+                                // 存在时在原有基础累加
+                                CmClubLabelPo cmClubLabelPo = clubTrendsKeywordList.stream().filter(trend -> trend.getLabel().equals(demand)).collect(Collectors.toList()).get(0);
+                                cmClubLabelPo.setAppearNumber(cmClubLabelPo.getAppearNumber() + 1);
+                                recordMapper.updateClubLabel(cmClubLabelPo);
+                            }
+                        }
+                    }
+                    // 标签
+                    demandList = new ArrayList<>();
+                    // 出现次数
+                    map = new HashMap<>();
+                    // 对应机构Id
+                    clubIdMap = new HashMap<>();
+                    // 静态标签
+                    List<String> stateKeywordCollect = clubLabel.stream().map(CmClubLabelPo::getStateKeyword).collect(Collectors.toList());
+                    if (null != stateKeywordCollect && stateKeywordCollect.size() > 0) {
+                        for (String stateKeyword : stateKeywordCollect) {
+                            if (stateKeyword.contains(",")) {
+                                String[] split = stateKeyword.split(",");
+                                for (String s : split) {
+                                    // 第一次加入, 初始出现系数为 1
+                                    if (StringUtils.isNotBlank(s) && StringUtils.isNotEmpty(s)) {
+                                        if (StringUtils.isNotEmpty(s) && !demandList.contains(s)) {
+                                            demandList.add(s);
+                                            map.put(s, 1);
+                                            clubIdMap.put(s, clubId);
+                                        } else {
+                                            // 记录过,出现次数在原来基础上 + 1
+                                            Integer number = map.get(s) + 1;
+                                            map.put(s, number);
+                                        }
+                                    }
+                                }
+                            } else {
+                                // 第一次加入, 初始出现系数为 1
+                                if (StringUtils.isNotBlank(stateKeyword) && StringUtils.isNotEmpty(stateKeyword)) {
+                                    if (!demandList.contains(stateKeyword)){
+                                        demandList.add(stateKeyword);
+                                        map.put(stateKeyword, 1);
+                                        clubIdMap.put(stateKeyword, clubId);
+                                    } else{
+                                        // 记录过,出现次数在原来基础上 + 1
+                                        Integer number = map.get(stateKeyword) + 1;
+                                        map.put(stateKeyword, number);
+                                    }
+                                }
+                            }
+                        }
+                        List<String> collect = new ArrayList<>();
+                        if (null != clubStateKeywordList && clubStateKeywordList.size() > 0) {
+                            collect = clubStateKeywordList.stream().filter(st -> st.getClubId().equals(clubId)).map(CmClubLabelPo::getLabel).collect(Collectors.toList());
+                        }
+                        // 保存静态标签
+                        for (String demand : demandList) {
+                            if (!collect.contains(demand)) {
+                                CmClubLabelPo cmClubLabelPo = new CmClubLabelPo();
+                                cmClubLabelPo.setLabel(demand);
+                                cmClubLabelPo.setClubId(clubIdMap.get(demand));
+                                cmClubLabelPo.setDynamicStatus(1);
+                                cmClubLabelPo.setAppearNumber(map.get(demand));
+                                recordMapper.insertClubLabel(cmClubLabelPo);
+                                collect.add(demand);
+                                clubStateKeywordList.add(cmClubLabelPo);
+                            } else {
+                                // 存在时在原有基础累加
+                                CmClubLabelPo cmClubLabelPo = clubStateKeywordList.stream().filter(trend -> trend.getLabel().equals(demand)).collect(Collectors.toList()).get(0);
+                                cmClubLabelPo.setAppearNumber(cmClubLabelPo.getAppearNumber() + 1);
+                                recordMapper.updateClubLabel(cmClubLabelPo);
+                            }
+                        }
+                    }
+                }
+                // 标签
+                demandList = new ArrayList<>();
+                // 出现次数
+                map = new HashMap<>();
+                // 对应机构Id
+                clubIdMap = new HashMap<>();
+                // 标签类型
+                Map<String, Integer> pageTypeMap = new HashMap<>();
+                // 访问记录
+                List<CmBehaviorRecordPo> behaviorRecordList = recordMapper.getClubBehavior(clubId, startTime, endTime);
+                log.info("behaviorRecordList===="+behaviorRecordList);
+                if (null != behaviorRecordList && behaviorRecordList.size() > 0) {
+                    for (CmBehaviorRecordPo behaviorRecord : behaviorRecordList) {
+                        if (behaviorRecord.getPageLabel().contains(",")) {
+                            String[] split = behaviorRecord.getPageLabel().split(",");
+                            for (String s : split) {
+                                if (StringUtils.isNotBlank(s) && StringUtils.isNotEmpty(s)) {
+                                    if (!demandList.contains(s)) {
+                                        demandList.add(s);
+                                        map.put(s, Integer.parseInt(behaviorRecord.getNumber()));
+                                        clubIdMap.put(s, clubId);
+                                        pageTypeMap.put(s, behaviorRecord.getPageType());
+                                    } else {
+                                        // 记录过,出现次数在原来基础上 + 1
+                                        Integer number = map.get(s) + Integer.parseInt(behaviorRecord.getNumber());
+                                        map.put(s, number);
+                                    }
+                                }
+                            }
+                        } else {
+                            if (StringUtils.isNotBlank(behaviorRecord.getPageLabel()) && StringUtils.isNotEmpty(behaviorRecord.getPageLabel())) {
+                                if (!demandList.contains(behaviorRecord.getPageLabel())) {
+                                    demandList.add(behaviorRecord.getPageLabel());
+                                    map.put(behaviorRecord.getPageLabel(), Integer.parseInt(behaviorRecord.getNumber()));
+                                    clubIdMap.put(behaviorRecord.getPageLabel(), clubId);
+                                    pageTypeMap.put(behaviorRecord.getPageLabel(), behaviorRecord.getPageType());
+                                } else{
+                                    // 记录过,出现次数在原来基础上 + 1
+                                    Integer number = map.get(behaviorRecord.getPageLabel()) + 1;
+                                    map.put(behaviorRecord.getPageLabel(), number);
+                                }
+                            }
+                        }
+                    }
+                    List<String> trendsCollect = new ArrayList<>();
+                    List<String> stateCollect = new ArrayList<>();
+                    if (null != clubTrendsKeywordList && clubTrendsKeywordList.size() > 0) {
+                        trendsCollect = clubTrendsKeywordList.stream().filter(tr -> tr.getClubId().equals(clubId)).map(CmClubLabelPo::getLabel).collect(Collectors.toList());
+                        stateCollect = clubStateKeywordList.stream().filter(st -> st.getClubId().equals(clubId)).map(CmClubLabelPo::getLabel).collect(Collectors.toList());
+                    }
+                    // 保存访问标签
+                    log.info("demandList==访问标签=="+demandList);
+                    for (String demand : demandList) {
+                        if (!trendsCollect.contains(demand) && !stateCollect.contains(demand)) {
+                            CmClubLabelPo cmClubLabelPo = new CmClubLabelPo();
+                            cmClubLabelPo.setLabel(demand);
+                            cmClubLabelPo.setClubId(clubIdMap.get(demand));
+                            cmClubLabelPo.setAppearNumber(map.get(demand));
+                            cmClubLabelPo.setPageType(pageTypeMap.get(demand));
+                            if (trendsKeywordList.contains(demand)) {
+                                cmClubLabelPo.setDynamicStatus(0);
+                                recordMapper.insertClubLabel(cmClubLabelPo);
+                                trendsCollect.add(demand);
+                                clubTrendsKeywordList.add(cmClubLabelPo);
+                            } else if (stateKeywordList.contains(demand)) {
+                                cmClubLabelPo.setDynamicStatus(1);
+                                recordMapper.insertClubLabel(cmClubLabelPo);
+                                stateCollect.add(demand);
+                                clubStateKeywordList.add(cmClubLabelPo);
+                            }
+                        } else {
+                            // 存在时在原有基础累加
+                            if (trendsCollect.contains(demand)) {
+                                CmClubLabelPo cmClubLabelPo = clubTrendsKeywordList.stream().filter(trend -> trend.getLabel().equals(demand)).collect(Collectors.toList()).get(0);
+                                cmClubLabelPo.setAppearNumber(cmClubLabelPo.getAppearNumber() + 1);
+                                recordMapper.updateClubLabel(cmClubLabelPo);
+                            }
+                            if (stateCollect.contains(demand)) {
+                                CmClubLabelPo cmClubLabelPo = clubStateKeywordList.stream().filter(trend -> trend.getLabel().equals(demand)).collect(Collectors.toList()).get(0);
+                                cmClubLabelPo.setAppearNumber(cmClubLabelPo.getAppearNumber() + 1);
+                                recordMapper.updateClubLabel(cmClubLabelPo);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        log.info("机构需求标签====统计结束");
+    }
+
 
     // 获取IP对应地址 ---- 太平洋
     public static String recordIp(String ip) throws IOException {

+ 18 - 0
src/main/java/com/caimei365/tools/task/CmOrganValueSystemTask.java

@@ -11,6 +11,9 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.Scheduled;
 
 import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
 
 /**
  * Description
@@ -94,4 +97,19 @@ public class CmOrganValueSystemTask {
     public void getMessageSer() {
         messageService.UnActiveMessage();
     }
+
+    /**
+     * 每天获取前一天机构需求标签
+     */
+    @Scheduled(cron = "0 20 0 * * ?")
+    public void getClubDemand(){
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        Date date = new Date();
+        String endTime = dateFormat.format(date);
+        Calendar instance = Calendar.getInstance();
+        instance.setTime(date);
+        instance.add(Calendar.DAY_OF_MONTH, -1);
+        Date time = instance.getTime();
+        String startTime = dateFormat.format(time);
+        cmBehaviorRecordService.clubDemand(startTime, endTime); }
 }

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

@@ -656,5 +656,71 @@
         insert into cm_page_shop_keyword (shopId, searchId, link, accessNumber, accessDuration, accessDate)
         values (#{shopId}, #{searchId}, #{link}, #{accessNumber}, #{accessDuration}, #{accessDate})
     </insert>
+
+    <select id="getClubId" resultType="java.lang.Integer">
+        select clubId from club
+    </select>
+
+    <select id="getClubLabel" resultType="com.caimei365.tools.model.po.CmClubLabelPo">
+        SELECT trendsKeyword, stateKeyword FROM cm_club_remarks
+        where  clubId = #{clubId}
+        <if test="startTime != null and startTime != ''">
+            and addTime > #{startTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            and addTime <![CDATA[ <= ]]> #{endTime}
+        </if>
+        UNION
+        SELECT trendsKeyword, stateKeyword FROM cm_visitor_remarks
+        where clubId = #{clubId}
+        <if test="startTime != null and startTime != ''">
+            and addTime > #{startTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            and addTime <![CDATA[ <= ]]> #{endTime}
+        </if>
+    </select>
+
+    <select id="getClubBehavior" resultType="com.caimei365.tools.model.po.CmBehaviorRecordPo">
+        SELECT cbr.pageLabel, cbr.pageType , COUNT(cbr.pageLabel) number
+        FROM cm_behavior_record cbr
+        LEFT JOIN club c ON c.userID = cbr.userId
+        where cbr.pageType IN (6, 8, 9, 11, 14)
+          AND c.clubId = #{clubId}
+        <if test="startTime != null and startTime != ''">
+            and cbr.accessDate > #{startTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            and cbr.accessDate <![CDATA[ <= ]]> #{endTime}
+        </if>
+        GROUP BY cbr.pageLabel ORDER BY COUNT(cbr.pageLabel) DESC
+    </select>
+
+    <select id="getTrendsKeyword" resultType="java.lang.String">
+        SELECT keyword FROM cm_keyword_info WHERE dynamicStatus = 0
+    </select>
+
+    <select id="getStateKeyword" resultType="java.lang.String">
+        SELECT keyword FROM cm_keyword_info WHERE dynamicStatus = 1
+    </select>
+
+    <select id="getClubTrendsKeyword" resultType="com.caimei365.tools.model.po.CmClubLabelPo">
+        SELECT id, clubId, label, appearNumber FROM cm_club_label WHERE dynamicStatus = 0
+    </select>
+
+    <select id="getClubStateKeyword" resultType="com.caimei365.tools.model.po.CmClubLabelPo">
+        SELECT id, clubId, label, appearNumber FROM cm_club_label WHERE dynamicStatus = 1
+    </select>
+
+    <insert id="insertClubLabel" keyProperty="id" keyColumn="id" useGeneratedKeys="true">
+        INSERT INTO cm_club_label (clubId, label, pageType, dynamicStatus, appearNumber, addTime, delFlag)
+        values(#{clubId}, #{label}, #{pageType}, #{dynamicStatus}, #{appearNumber}, now(), 0)
+    </insert>
+
+    <update id="updateClubLabel">
+        update cm_club_label
+        set appearNumber = #{appearNumber}
+        where id = #{id}
+    </update>
 </mapper>