Browse Source

用户行为优化

huangzhiguo 1 year ago
parent
commit
7221f8a8ac
22 changed files with 528 additions and 52 deletions
  1. 3 2
      src/main/java/com/caimei365/user/controller/ClubApi.java
  2. 7 5
      src/main/java/com/caimei365/user/controller/CmBehaviorRecordApi.java
  3. 24 2
      src/main/java/com/caimei365/user/controller/LoginApi.java
  4. 41 5
      src/main/java/com/caimei365/user/controller/SellerApi.java
  5. 13 4
      src/main/java/com/caimei365/user/idempotent/IpSaveAspect.java
  6. 1 1
      src/main/java/com/caimei365/user/mapper/ClubMapper.java
  7. 15 0
      src/main/java/com/caimei365/user/mapper/LoginMapper.java
  8. 23 1
      src/main/java/com/caimei365/user/mapper/SellerMapper.java
  9. 4 0
      src/main/java/com/caimei365/user/model/dto/LoginCodeDto.java
  10. 4 0
      src/main/java/com/caimei365/user/model/dto/LoginPasswordDto.java
  11. 8 0
      src/main/java/com/caimei365/user/model/po/ClubRemarksPo.java
  12. 4 0
      src/main/java/com/caimei365/user/model/vo/BehaviorRecodeVo.java
  13. 8 0
      src/main/java/com/caimei365/user/model/vo/ClubVo.java
  14. 23 0
      src/main/java/com/caimei365/user/model/vo/RetuenDataVo.java
  15. 18 1
      src/main/java/com/caimei365/user/service/SellerService.java
  16. 13 3
      src/main/java/com/caimei365/user/service/impl/ClubServiceImpl.java
  17. 21 0
      src/main/java/com/caimei365/user/service/impl/LoginServiceImpl.java
  18. 161 15
      src/main/java/com/caimei365/user/service/impl/SellerServiceImpl.java
  19. 34 11
      src/main/resources/mapper/ClubMapper.xml
  20. 12 0
      src/main/resources/mapper/LoginMapper.xml
  21. 2 2
      src/main/resources/mapper/RegisterMapper.xml
  22. 89 0
      src/main/resources/mapper/SellerMapper.xml

+ 3 - 2
src/main/java/com/caimei365/user/controller/ClubApi.java

@@ -611,15 +611,16 @@ public class ClubApi {
      * 机构访问记录详情
      * 机构访问记录详情
      * @param clubId
      * @param clubId
      * @param accessDate
      * @param accessDate
+     * @param ip
      * @return
      * @return
      */
      */
     @GetMapping("/record/detail")
     @GetMapping("/record/detail")
     public ResponseJson recordDetail(Integer clubId, String accessDate,String ip, Integer pageNum, Integer pageSize) {
     public ResponseJson recordDetail(Integer clubId, String accessDate,String ip, Integer pageNum, Integer pageSize) {
         if (null == clubId) {
         if (null == clubId) {
-            return ResponseJson.error("机构id不能为空",null);
+            return ResponseJson.error("机构id不能为空", null);
         }
         }
         if (!StringUtils.isNotBlank(accessDate)) {
         if (!StringUtils.isNotBlank(accessDate)) {
-            return ResponseJson.error("详情时间不能为空",null);
+            return ResponseJson.error("详情时间不能为空", null);
         }
         }
         return clubService.recordDetail(clubId, accessDate, ip, pageNum, pageSize);
         return clubService.recordDetail(clubId, accessDate, ip, pageNum, pageSize);
     }
     }

+ 7 - 5
src/main/java/com/caimei365/user/controller/CmBehaviorRecordApi.java

@@ -35,16 +35,18 @@ public class CmBehaviorRecordApi {
      */
      */
     @IpSave(saveName = "用户行为记录", saveParams = true)
     @IpSave(saveName = "用户行为记录", saveParams = true)
     @GetMapping("/Statistics")
     @GetMapping("/Statistics")
-    public ResponseJson<String> behaviorRecordApp(HttpServletRequest request, Integer userId, String pagePath, String pageType, String pageLabel, String behaviorType, Integer productId, String accessDuration, Integer accessClient, Integer shopId) {
+    public ResponseJson<String> behaviorRecordApp(HttpServletRequest request, Integer userId, String pagePath, String pageType, String pageLabel, String behaviorType, Integer productId, String accessDuration, Integer accessClient, Integer shopId, String openId) {
         HttpSession session = request.getSession();
         HttpSession session = request.getSession();
         Cookie[] cookies = request.getCookies();
         Cookie[] cookies = request.getCookies();
-        for (Cookie cookie : cookies) {
-            if ("tid".equals(cookie.getName())) {
-                log.info("tid------------>" + cookie.getValue());
+        if (null != cookies) {
+            for (Cookie cookie : cookies) {
+                if ("tid".equals(cookie.getName())) {
+                    log.info("tid------------>" + cookie.getValue());
+                }
             }
             }
         }
         }
         String touristId = (String) session.getAttribute("touristId");
         String touristId = (String) session.getAttribute("touristId");
-        log.info("用户行为记录=======userId==》" + userId + "==pagePath==" + pagePath + "==pageType==" + pageType + "==pageLabel==" + pageLabel + "==behaviorType==" + behaviorType + "==productId==" + productId + "==accessDuration==" + accessDuration + "==accessClient==" + accessClient + "==shopId==" + shopId);
+        log.info("用户行为记录=======userId==》" + userId + "==pagePath==" + pagePath + "==pageType==" + pageType + "==pageLabel==" + pageLabel + "==behaviorType==" + behaviorType + "==productId==" + productId + "==accessDuration==" + accessDuration + "==accessClient==" + accessClient + "==shopId==" + shopId + "==openId=="+openId);
         return ResponseJson.success("用户行为记录完成");
         return ResponseJson.success("用户行为记录完成");
     }
     }
 
 

+ 24 - 2
src/main/java/com/caimei365/user/controller/LoginApi.java

@@ -14,6 +14,8 @@ import lombok.RequiredArgsConstructor;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpHeaders;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
 import java.text.ParseException;
 import java.text.ParseException;
 import java.util.Map;
 import java.util.Map;
 
 
@@ -48,7 +50,17 @@ public class LoginApi {
     @ApiOperation("登录(用户名,密码)")
     @ApiOperation("登录(用户名,密码)")
     @IpSave(saveName = "用户登录", saveParams = true)
     @IpSave(saveName = "用户登录", saveParams = true)
     @PostMapping("/password")
     @PostMapping("/password")
-    public ResponseJson<UserLoginVo> passwordLogin(LoginPasswordDto loginPasswordDto) throws ParseException {
+    public ResponseJson<UserLoginVo> passwordLogin(HttpServletRequest request, LoginPasswordDto loginPasswordDto) throws ParseException {
+        String touristId = "";
+        Cookie[] cookies = request.getCookies();
+        if (null != cookies) {
+            for (Cookie cookie : cookies) {
+                if ("tid".equals(cookie.getName())) {
+                    touristId = cookie.getValue();
+                }
+            }
+        }
+        loginPasswordDto.setTouristId(touristId);
         return loginService.passwordLogin(loginPasswordDto);
         return loginService.passwordLogin(loginPasswordDto);
     }
     }
 
 
@@ -83,7 +95,17 @@ public class LoginApi {
      */
      */
     @ApiOperation("登录(手机号,验证码)")
     @ApiOperation("登录(手机号,验证码)")
     @PostMapping("/codeLogin")
     @PostMapping("/codeLogin")
-    public ResponseJson<UserLoginVo> codeLogin(LoginCodeDto loginCodeDto) throws ParseException {
+    public ResponseJson<UserLoginVo> codeLogin(HttpServletRequest request, LoginCodeDto loginCodeDto) throws ParseException {
+        String touristId = "";
+        Cookie[] cookies = request.getCookies();
+        if (null != cookies) {
+            for (Cookie cookie : cookies) {
+                if ("tid".equals(cookie.getName())) {
+                    touristId = cookie.getValue();
+                }
+            }
+        }
+        loginCodeDto.setTouristId(touristId);
         return loginService.codeLogin(loginCodeDto);
         return loginService.codeLogin(loginCodeDto);
     }
     }
     /**
     /**

+ 41 - 5
src/main/java/com/caimei365/user/controller/SellerApi.java

@@ -4,10 +4,7 @@ import com.caimei365.user.model.ResponseJson;
 import com.caimei365.user.model.dto.ClubTemporaryDto;
 import com.caimei365.user.model.dto.ClubTemporaryDto;
 import com.caimei365.user.model.dto.OnlineDto;
 import com.caimei365.user.model.dto.OnlineDto;
 import com.caimei365.user.model.po.ServiceProviderPo;
 import com.caimei365.user.model.po.ServiceProviderPo;
-import com.caimei365.user.model.vo.ClubTemporaryVo;
-import com.caimei365.user.model.vo.ClubVo;
-import com.caimei365.user.model.vo.CmBehaviorRecordVo;
-import com.caimei365.user.model.vo.ServiceProviderVo;
+import com.caimei365.user.model.vo.*;
 import com.caimei365.user.service.SellerService;
 import com.caimei365.user.service.SellerService;
 import com.caimei365.user.utils.MathUtil;
 import com.caimei365.user.utils.MathUtil;
 import com.github.pagehelper.PageInfo;
 import com.github.pagehelper.PageInfo;
@@ -103,12 +100,14 @@ public class SellerApi {
                                                       String name,
                                                       String name,
                                                       Integer userIdentity,
                                                       Integer userIdentity,
                                                       Integer groupServiceId,
                                                       Integer groupServiceId,
+                                                      String startTime,
+                                                      String endTime,
                                                       @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
                                                       @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
                                                       @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
                                                       @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
         if (null == spId || null == status || null == type) {
         if (null == spId || null == status || null == type) {
             return ResponseJson.error("spId 或 status 或 type 参数不全!", null);
             return ResponseJson.error("spId 或 status 或 type 参数不全!", null);
         }
         }
-        return sellerService.getClubList(spId, status, type, name, userIdentity, groupServiceId, pageNum, pageSize);
+        return sellerService.getClubList(spId, status, type, name, userIdentity, groupServiceId, startTime, endTime, pageNum, pageSize);
     }
     }
 
 
     /**
     /**
@@ -217,4 +216,41 @@ public class SellerApi {
         return sellerService.getBehaviorRecordClubFrom(spId,clubId, accessTime);
         return sellerService.getBehaviorRecordClubFrom(spId,clubId, accessTime);
     }
     }
 
 
+    /**
+     * 机构重点访问页面
+     * @param clubId
+     * @return
+     */
+    @ApiOperation("机构重点访问页面")
+    @ApiImplicitParam(required = true, name = "clubId", value = "机构Id")
+    @GetMapping("/getClubKeynoteRecord")
+    public ResponseJson<PageInfo<RetuenDataVo>> getClubKeynoteRecord(Integer clubId,
+                                                              @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                              @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
+
+        if (null == clubId) {
+            return ResponseJson.error(-1, "机构id不能为空", null);
+        }
+        return sellerService.getClubRecord(clubId, pageNum, pageSize);
+    }
+
+    /**
+     * 协销不活跃机构
+     * @param serviceProviderId
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    @ApiOperation("协销不活跃机构")
+    @ApiImplicitParam(required = true, name = "serviceProviderId", value = "协销Id")
+    @GetMapping("/getUnActiveClubList")
+    public ResponseJson<PageInfo<ClubVo>> getUnActiveClubList(Integer serviceProviderId,
+                                                              @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                              @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
+        if (null == serviceProviderId) {
+            return ResponseJson.error(-1, "协销Id不能为空", null);
+        }
+        return sellerService.getUnActiveClubList(serviceProviderId, pageNum, pageSize);
+    }
+
 }
 }

+ 13 - 4
src/main/java/com/caimei365/user/idempotent/IpSaveAspect.java

@@ -18,10 +18,12 @@ import org.springframework.web.context.request.ServletRequestAttributes;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartFile;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
+import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 import javax.servlet.http.HttpSession;
 import java.lang.reflect.Method;
 import java.lang.reflect.Method;
+import java.util.Enumeration;
 
 
 
 
 /**
 /**
@@ -69,10 +71,17 @@ public class IpSaveAspect {
         if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
         if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ip)) {
             ip = request.getRemoteAddr();
             ip = request.getRemoteAddr();
         }
         }
-        // 获取session缓存
-        HttpSession session = request.getSession();
-        String touristId = (String) session.getAttribute("touristId");
-        log.info("touristId===="+touristId);
+        // 获取cookie缓存
+        String touristId = "";
+        Cookie[] cookies = request.getCookies();
+        if (null != cookies) {
+            for (Cookie cookie : cookies) {
+                if ("tid".equals(cookie.getName())) {
+                    touristId = cookie.getValue();
+                }
+            }
+        }
+        log.info("touristId====cookie:=="+touristId);
         // 接口路径
         // 接口路径
         String requestURI = request.getRequestURI();
         String requestURI = request.getRequestURI();
         //获取自定义注解
         //获取自定义注解

+ 1 - 1
src/main/java/com/caimei365/user/mapper/ClubMapper.java

@@ -402,7 +402,7 @@ public interface ClubMapper {
 
 
     List<BehaviorRecodeVo> selBehaviorList(CmPortraitDto cmPortrait);
     List<BehaviorRecodeVo> selBehaviorList(CmPortraitDto cmPortrait);
 
 
-    List<BehaviorRecodeVo> selRegion(@Param("ip") String ip, @Param("accessDate") String accessDate);
+    List<BehaviorRecodeVo> selRegion(@Param("ip") String ip, @Param("accessDate") String accessDate, @Param("type") Integer type, @Param("accessDateList") List<String> accessDateList);
 
 
     List<CmClubRemarksVo> selRemarksList(CmPortraitDto cmPortrait);
     List<CmClubRemarksVo> selRemarksList(CmPortraitDto cmPortrait);
 
 

+ 15 - 0
src/main/java/com/caimei365/user/mapper/LoginMapper.java

@@ -80,6 +80,14 @@ public interface LoginMapper {
      * @return
      * @return
      */
      */
     List<String> getShopProductGroudMall(@Param("shopId") Integer shopId);
     List<String> getShopProductGroudMall(@Param("shopId") Integer shopId);
+
+    /**
+     * 修改用户微信授权信息
+     * @param openId
+     * @param unionId
+     * @param userId
+     */
+    void updateUserInfo(@Param("openId") String openId, @Param("unionId") String unionId, @Param("userId") Integer userId);
     /**
     /**
      * 根据userId获取协销
      * 根据userId获取协销
      * @param userId
      * @param userId
@@ -188,4 +196,11 @@ public interface LoginMapper {
      */
      */
     Integer getClubSpUserId(Integer clubId);
     Integer getClubSpUserId(Integer clubId);
 
 
+    /**
+     * 关联用户和游客
+     * @param userId
+     * @param touristId
+     */
+    void updateTourist(@Param("userId") Integer userId,@Param("touristId") String touristId);
+
 }
 }

+ 23 - 1
src/main/java/com/caimei365/user/mapper/SellerMapper.java

@@ -66,7 +66,7 @@ public interface SellerMapper {
      */
      */
     void deleteTemporaryClub(Integer id);
     void deleteTemporaryClub(Integer id);
 
 
-    List<ClubVo> findClubs(@Param("serviceProviderId") Integer serviceProviderId, @Param("status") Integer status, @Param("name") String name, @Param("userIdentity") Integer userIdentity, @Param("type") Integer type, @Param("serviceIds") List<Integer> serviceIds);
+    List<ClubVo> findClubs(@Param("serviceProviderId") Integer serviceProviderId, @Param("status") Integer status, @Param("name") String name, @Param("userIdentity") Integer userIdentity, @Param("type") Integer type, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("serviceIds") List<Integer> serviceIds);
 
 
     /***
     /***
      * 功能描述: 机构活跃分析用户登录数量
      * 功能描述: 机构活跃分析用户登录数量
@@ -112,4 +112,26 @@ public interface SellerMapper {
     List<CmBehaviorRecordVo> getBehaviorRecordYesterdayClubFrom(@Param("spId") Integer spId, @Param("clubId") Integer clubId, @Param("accessTime")String accessTime);
     List<CmBehaviorRecordVo> getBehaviorRecordYesterdayClubFrom(@Param("spId") Integer spId, @Param("clubId") Integer clubId, @Param("accessTime")String accessTime);
 
 
     List<CmBehaviorRecordVo> getBehaviorRecordYesterdayClub(@Param("spId") Integer spId,@Param("accessTime")String accessTime);
     List<CmBehaviorRecordVo> getBehaviorRecordYesterdayClub(@Param("spId") Integer spId,@Param("accessTime")String accessTime);
+
+    /**
+     * 获取机构有访问记录的日期
+     * @param clubId
+     * @return
+     */
+    List<RetuenDataVo> getClubAccessDate(@Param("clubId") Integer clubId);
+
+    /**
+     * 访问详情
+     * @param clubId
+     * @param accessDateList
+     * @return
+     */
+    List<BehaviorRecodeVo> getClubKeynoteRecord(@Param("clubId") Integer clubId, @Param("accessDateList") List<String> accessDateList);
+    /**
+     * 协销不活跃机构列表
+     * @param serviceProviderId
+     * @return
+     */
+    List<ClubVo> getUnActiveClub(@Param("serviceProviderId") Integer serviceProviderId);
+
 }
 }

+ 4 - 0
src/main/java/com/caimei365/user/model/dto/LoginCodeDto.java

@@ -48,4 +48,8 @@ public class LoginCodeDto implements Serializable {
      */
      */
     @ApiModelProperty("验证类型")
     @ApiModelProperty("验证类型")
     private String codeType;
     private String codeType;
+    /**
+     * 游客id
+     */
+    private String touristId;
 }
 }

+ 4 - 0
src/main/java/com/caimei365/user/model/dto/LoginPasswordDto.java

@@ -35,4 +35,8 @@ public class LoginPasswordDto implements Serializable {
      */
      */
     @ApiModelProperty("微信unionId")
     @ApiModelProperty("微信unionId")
     private String unionId;
     private String unionId;
+    /**
+     * 游客id
+     */
+    private String touristId;
 }
 }

+ 8 - 0
src/main/java/com/caimei365/user/model/po/ClubRemarksPo.java

@@ -103,4 +103,12 @@ public class ClubRemarksPo implements Serializable {
      * 静态标签
      * 静态标签
      */
      */
     private String stateKeyword;
     private String stateKeyword;
+    /**
+     * 首次访问时间
+     */
+    private String firstTime;
+    /**
+     * 最近访问时间
+     */
+    private String recentlyTime;
 }
 }

+ 4 - 0
src/main/java/com/caimei365/user/model/vo/BehaviorRecodeVo.java

@@ -49,6 +49,10 @@ public class BehaviorRecodeVo {
      * 访问客户端
      * 访问客户端
      */
      */
     private String accessClient;
     private String accessClient;
+    /**
+     * 访问日期
+     */
+    private String accessDate;
     /**
     /**
      * 访问时间
      * 访问时间
      */
      */

+ 8 - 0
src/main/java/com/caimei365/user/model/vo/ClubVo.java

@@ -241,5 +241,13 @@ public class ClubVo implements Serializable {
      * 电话是否触达
      * 电话是否触达
      */
      */
     private String mob;
     private String mob;
+    /**
+     * 首次访问时间
+     */
+    private String firstTime;
+    /**
+     * 最近访问时间
+     */
+    private String recentlyTime;
 
 
 }
 }

+ 23 - 0
src/main/java/com/caimei365/user/model/vo/RetuenDataVo.java

@@ -0,0 +1,23 @@
+package com.caimei365.user.model.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : hzg
+ * @date : 2023/11/16
+ */
+@Data
+public class RetuenDataVo {
+    /**
+     * 时间
+     */
+    private String accessDate;
+    /**
+     * 机构访问数据
+     */
+    private List<BehaviorRecodeVo> record;
+}

+ 18 - 1
src/main/java/com/caimei365/user/service/SellerService.java

@@ -26,7 +26,7 @@ public interface SellerService {
      * @param name              机构名字关键字(搜索用)
      * @param name              机构名字关键字(搜索用)
      * @return
      * @return
      */
      */
-    ResponseJson<PageInfo<ClubVo>> getClubList(Integer serviceProviderId, Integer status, Integer type, String name, Integer userIdentity, Integer groupServiceId, Integer pageNum, Integer pageSize);
+    ResponseJson<PageInfo<ClubVo>> getClubList(Integer serviceProviderId, Integer status, Integer type, String name, Integer userIdentity, Integer groupServiceId, String startTime, String endTime, Integer pageNum, Integer pageSize);
 /**
 /**
  * 功能描述: 机构活跃分析
  * 功能描述: 机构活跃分析
  * @auther: Kaick
  * @auther: Kaick
@@ -121,4 +121,21 @@ public interface SellerService {
     ResponseJson<List<CmBehaviorRecordVo>> getBehaviorRecordClubFrom(Integer spId, Integer clubId, String accessTime);
     ResponseJson<List<CmBehaviorRecordVo>> getBehaviorRecordClubFrom(Integer spId, Integer clubId, String accessTime);
 
 
     ResponseJson<List<ServiceProviderVo>> getServiceTeam(Integer spId,Integer status);
     ResponseJson<List<ServiceProviderVo>> getServiceTeam(Integer spId,Integer status);
+
+    /**
+     * 机构重点访问页面
+     * @param clubId
+     * @return
+     */
+    ResponseJson<PageInfo<RetuenDataVo>> getClubRecord(Integer clubId, int pageNum, int pageSize);
+
+    /**
+     * 协销不活跃机构列表
+     * @param serviceProviderId
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    ResponseJson<PageInfo<ClubVo>> getUnActiveClubList(Integer serviceProviderId, int pageNum, int pageSize);
+
 }
 }

+ 13 - 3
src/main/java/com/caimei365/user/service/impl/ClubServiceImpl.java

@@ -30,6 +30,7 @@ import java.text.NumberFormat;
 import java.text.ParseException;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.*;
+import java.util.stream.Collectors;
 
 
 import static com.alibaba.fastjson.JSON.parseArray;
 import static com.alibaba.fastjson.JSON.parseArray;
 import static com.alibaba.fastjson.JSON.parseObject;
 import static com.alibaba.fastjson.JSON.parseObject;
@@ -78,6 +79,7 @@ public class ClubServiceImpl implements ClubService {
         if (user == null) {
         if (user == null) {
             return ResponseJson.error("用户信息不存在", null);
             return ResponseJson.error("用户信息不存在", null);
         }
         }
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
         if (!StringUtils.isBlank(user.getAuditNote()) && 2 == user.getAuditStatus()) {
         if (!StringUtils.isBlank(user.getAuditNote()) && 2 == user.getAuditStatus()) {
             if (user.getAuditNote().contains(",")) {
             if (user.getAuditNote().contains(",")) {
                 List<String> list = Arrays.asList(user.getAuditNote().split(","));
                 List<String> list = Arrays.asList(user.getAuditNote().split(","));
@@ -120,6 +122,12 @@ public class ClubServiceImpl implements ClubService {
                     club.setMob("未触达");
                     club.setMob("未触达");
                 }
                 }
             }
             }
+            try {
+                club.setFirstTime(remarksInfo.getFirstTime() != null ? dateFormat.format(dateFormat.parse(remarksInfo.getFirstTime())) : null);
+                club.setRecentlyTime(remarksInfo.getRecentlyTime() != null ? dateFormat.format(dateFormat.parse(remarksInfo.getRecentlyTime())) : null);
+            }catch (ParseException e) {
+                e.printStackTrace();
+            }
         }
         }
         // 资料完整度
         // 资料完整度
         Integer number = 0;
         Integer number = 0;
@@ -1294,6 +1302,7 @@ public class ClubServiceImpl implements ClubService {
             clubMapper.updateRemarksSp(clubId, oldSpId, spId, 1);
             clubMapper.updateRemarksSp(clubId, oldSpId, spId, 1);
         }
         }
         if (!spId.equals(choseServiceId)) {
         if (!spId.equals(choseServiceId)) {
+            log.info("更新协销微信模板提醒"+choseServiceId);
             asyncService.sendChoseServiceMessage(1, clubId, spId, choseServiceId);
             asyncService.sendChoseServiceMessage(1, clubId, spId, choseServiceId);
         }
         }
         // 添加协销更换记录
         // 添加协销更换记录
@@ -2550,8 +2559,8 @@ public class ClubServiceImpl implements ClubService {
         List<BehaviorRecodeVo> recordDetail = clubMapper.recordDetail(clubId, accessDate);
         List<BehaviorRecodeVo> recordDetail = clubMapper.recordDetail(clubId, accessDate);
         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-
-        List<BehaviorRecodeVo> region = clubMapper.selRegion(ip,accessDate);
+        // 访问来源数据
+        List<BehaviorRecodeVo> region = clubMapper.selRegion(ip, accessDate, 0, null);
         String format = "";
         String format = "";
         for(BehaviorRecodeVo record: recordDetail) {
         for(BehaviorRecodeVo record: recordDetail) {
             // 图片处理
             // 图片处理
@@ -2568,7 +2577,7 @@ public class ClubServiceImpl implements ClubService {
                 for (BehaviorRecodeVo behaviorRecord : region) {
                 for (BehaviorRecodeVo behaviorRecord : region) {
                     format = simpleDateFormat.format(behaviorRecord.getAccessTime());
                     format = simpleDateFormat.format(behaviorRecord.getAccessTime());
                     if (StringUtils.isNotBlank(record.getPageType()) && StringUtils.isNotBlank(behaviorRecord.getPageType())) {
                     if (StringUtils.isNotBlank(record.getPageType()) && StringUtils.isNotBlank(behaviorRecord.getPageType())) {
-                        if (record.getPageType().equals(behaviorRecord.getPageType()) && s.equals(format)) {
+                        if (s.equals(format)) {
                             record.setAccessSource(behaviorRecord.getAccessSource());
                             record.setAccessSource(behaviorRecord.getAccessSource());
                         }
                         }
                     }
                     }
@@ -3025,6 +3034,7 @@ public class ClubServiceImpl implements ClubService {
         }
         }
         return ResponseJson.success(map);
         return ResponseJson.success(map);
     }
     }
+
     /**
     /**
      * 时间计算
      * 时间计算
      * @param recordTime
      * @param recordTime

+ 21 - 0
src/main/java/com/caimei365/user/service/impl/LoginServiceImpl.java

@@ -128,6 +128,10 @@ public class LoginServiceImpl implements LoginService {
             String md5Password = Md5Util.md5(password);
             String md5Password = Md5Util.md5(password);
             String dbPassword = baseUser.getPassword();
             String dbPassword = baseUser.getPassword();
             if (md5Password.equals(dbPassword)) {
             if (md5Password.equals(dbPassword)) {
+                // 游客id与用户关联
+                if (StringUtils.isNotBlank(loginPasswordDto.getTouristId()) && StringUtils.isNotEmpty(loginPasswordDto.getTouristId())) {
+                    loginMapper.updateTourist(baseUser.getUserId(), loginPasswordDto.getTouristId());
+                }
                 if (baseUser.getUserIdentity() == 1) {
                 if (baseUser.getUserIdentity() == 1) {
                     // 协销登录
                     // 协销登录
                     return ResponseJson.success(baseUser);
                     return ResponseJson.success(baseUser);
@@ -294,6 +298,10 @@ public class LoginServiceImpl implements LoginService {
                     redisService.remove("code:" + mobile);
                     redisService.remove("code:" + mobile);
                     // 根据手机号获取用户信息
                     // 根据手机号获取用户信息
                     UserLoginVo baseUser = loginMapper.getLoginUserByMobileOrEmail(mobile);
                     UserLoginVo baseUser = loginMapper.getLoginUserByMobileOrEmail(mobile);
+                    // 游客id与用户关联
+                    if (StringUtils.isNotBlank(loginCodeDto.getTouristId()) && StringUtils.isNotEmpty(loginCodeDto.getTouristId())) {
+                        loginMapper.updateTourist(baseUser.getUserId(), loginCodeDto.getTouristId());
+                    }
                     // 如果前端传入unionId,则存入返回前端
                     // 如果前端传入unionId,则存入返回前端
                     baseUser.setUnionId(unionId);
                     baseUser.setUnionId(unionId);
                     if (baseUser.getUserIdentity() == 1) {
                     if (baseUser.getUserIdentity() == 1) {
@@ -455,8 +463,15 @@ public class LoginServiceImpl implements LoginService {
             seller.setToken(sellerToken);
             seller.setToken(sellerToken);
             seller.setManager(sellerMapper.findManagerByUser(seller.getUserId()));
             seller.setManager(sellerMapper.findManagerByUser(seller.getUserId()));
             seller.setLeaderId(sellerMapper.findLeaderId(seller.getUserId()));
             seller.setLeaderId(sellerMapper.findLeaderId(seller.getUserId()));
+            // 更新用户openId、unionId 用于后续追踪
+            try {
+                loginMapper.updateUserInfo(openId, unionId, seller.getUserId());
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
             return ResponseJson.success(seller);
             return ResponseJson.success(seller);
         }
         }
+
         // 运营人员授权登录
         // 运营人员授权登录
         return operationAuthLogin(openId, unionId, "mini");
         return operationAuthLogin(openId, unionId, "mini");
     }
     }
@@ -919,6 +934,12 @@ public class LoginServiceImpl implements LoginService {
             }
             }
             loginUser.setListingFee(listingFee);
             loginUser.setListingFee(listingFee);
         }
         }
+        // 更新用户openId、unionId 用于后续追踪
+        try {
+            loginMapper.updateUserInfo(loginUser.getOpenId(), loginUser.getUnionId(), loginUser.getUserId());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
 
 
         // 登录异步赠送10采美豆
         // 登录异步赠送10采美豆
         asyncService.loginUpdateBeans(loginUser.getUserId(), loginUser.getUserIdentity());
         asyncService.loginUpdateBeans(loginUser.getUserId(), loginUser.getUserIdentity());

+ 161 - 15
src/main/java/com/caimei365/user/service/impl/SellerServiceImpl.java

@@ -10,6 +10,7 @@ import com.caimei365.user.model.po.ServiceProviderPo;
 import com.caimei365.user.model.po.SuperVipPo;
 import com.caimei365.user.model.po.SuperVipPo;
 import com.caimei365.user.model.vo.*;
 import com.caimei365.user.model.vo.*;
 import com.caimei365.user.service.SellerService;
 import com.caimei365.user.service.SellerService;
+import com.caimei365.user.utils.ImageUtils;
 import com.caimei365.user.utils.JwtUtil;
 import com.caimei365.user.utils.JwtUtil;
 import com.caimei365.user.utils.MathUtil;
 import com.caimei365.user.utils.MathUtil;
 import com.caimei365.user.utils.Md5Util;
 import com.caimei365.user.utils.Md5Util;
@@ -19,17 +20,20 @@ import io.swagger.models.auth.In;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.math.RoundingMode;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 
 /**
 /**
  * Description
  * Description
@@ -40,7 +44,8 @@ import java.util.regex.Pattern;
 @Slf4j
 @Slf4j
 @Service
 @Service
 public class SellerServiceImpl implements SellerService {
 public class SellerServiceImpl implements SellerService {
-
+    @Value("${caimei.wwwDomain}")
+    private String wwwDomain;
     @Resource
     @Resource
     private RedisService redisService;
     private RedisService redisService;
     @Resource
     @Resource
@@ -55,6 +60,8 @@ public class SellerServiceImpl implements SellerService {
     private SuperVipMapper vipMapper;
     private SuperVipMapper vipMapper;
     @Resource
     @Resource
     private LoginMapper loginMapper;
     private LoginMapper loginMapper;
+    @Resource
+    private ClubMapper clubMapper;
 
 
     /**
     /**
      * 协销机构列表
      * 协销机构列表
@@ -70,7 +77,21 @@ public class SellerServiceImpl implements SellerService {
      * @return
      * @return
      */
      */
     @Override
     @Override
-    public ResponseJson<PageInfo<ClubVo>> getClubList(Integer serviceProviderId, Integer status, Integer type, String name, Integer userIdentity, Integer groupServiceId, Integer pageNum, Integer pageSize) {
+    public ResponseJson<PageInfo<ClubVo>> getClubList(Integer serviceProviderId, Integer status, Integer type, String name, Integer userIdentity, Integer groupServiceId, String startTime, String endTime, Integer pageNum, Integer pageSize) {
+        // 处理时间格式
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        try {
+            if (StringUtils.isNotBlank(startTime)) {
+                String start = dateFormat.format(dateFormat.parse(startTime));
+                startTime = start + " 00:00:00";
+            }
+            if (StringUtils.isNotBlank(endTime)){
+                String end = dateFormat.format(dateFormat.parse(endTime));
+                endTime = end + " 23:59:59";
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
         // 获取协销用户下的机构列表
         // 获取协销用户下的机构列表
         List<ClubVo> clubList = new ArrayList<ClubVo>();
         List<ClubVo> clubList = new ArrayList<ClubVo>();
         List<Integer> serviceIds = new ArrayList<Integer>();
         List<Integer> serviceIds = new ArrayList<Integer>();
@@ -79,12 +100,12 @@ public class SellerServiceImpl implements SellerService {
                 return ResponseJson.success();
                 return ResponseJson.success();
             }else{
             }else{
                 PageHelper.startPage(pageNum, pageSize);
                 PageHelper.startPage(pageNum, pageSize);
-                clubList = sellerMapper.findClubs(serviceProviderId, status, name, userIdentity, type, null);
+                clubList = sellerMapper.findClubs(serviceProviderId, status, name, userIdentity, type, startTime, endTime, null);
             }
             }
         } else if (2 == type) {
         } else if (2 == type) {
             if (null != groupServiceId && groupServiceId > 0) {
             if (null != groupServiceId && groupServiceId > 0) {
                 PageHelper.startPage(pageNum, pageSize);
                 PageHelper.startPage(pageNum, pageSize);
-                clubList = sellerMapper.findClubs(groupServiceId, status, name, userIdentity, 1, null);
+                clubList = sellerMapper.findClubs(groupServiceId, status, name, userIdentity, 1,  startTime, endTime, null);
             } else {
             } else {
                 Integer leaderId = sellerMapper.findLeaderIdByServiceId(serviceProviderId);
                 Integer leaderId = sellerMapper.findLeaderIdByServiceId(serviceProviderId);
                 Integer managerId = sellerMapper.findmanagerIdByServiceId(serviceProviderId);
                 Integer managerId = sellerMapper.findmanagerIdByServiceId(serviceProviderId);
@@ -95,7 +116,7 @@ public class SellerServiceImpl implements SellerService {
                     serviceIds = sellerMapper.findAllServiceIds(serviceProviderId);
                     serviceIds = sellerMapper.findAllServiceIds(serviceProviderId);
                 }
                 }
                 PageHelper.startPage(pageNum, pageSize);
                 PageHelper.startPage(pageNum, pageSize);
-                clubList = sellerMapper.findClubs(serviceProviderId, status, name, userIdentity, type, serviceIds);
+                clubList = sellerMapper.findClubs(serviceProviderId, status, name, userIdentity, type, startTime, endTime, serviceIds);
             }
             }
         }
         }
         for (ClubVo club : clubList) {
         for (ClubVo club : clubList) {
@@ -109,15 +130,7 @@ public class SellerServiceImpl implements SellerService {
             } else {
             } else {
                 club.setVipFlag(0);
                 club.setVipFlag(0);
             }
             }
-            String newClubId = club.getClubId().toString();
-            int maxLen = 6;
-            int len = newClubId.length();
-            if (len < maxLen) {
-                for (int i = 0;i < (maxLen - len); i++) {
-                    newClubId = "0" + newClubId;
-                }
-            }
-            club.setNewClubId(newClubId);
+            setClubNumber(club);
         }
         }
         PageInfo<ClubVo> pageData = new PageInfo<>(clubList);
         PageInfo<ClubVo> pageData = new PageInfo<>(clubList);
         return ResponseJson.success(pageData);
         return ResponseJson.success(pageData);
@@ -140,7 +153,7 @@ public class SellerServiceImpl implements SellerService {
     public ResponseJson<Map<String, Object>> getLivelyClubList(Integer serviceProviderId, Integer status, Integer type, String name, Integer userIdentity, Integer pageNum, Integer pageSize) {
     public ResponseJson<Map<String, Object>> getLivelyClubList(Integer serviceProviderId, Integer status, Integer type, String name, Integer userIdentity, Integer pageNum, Integer pageSize) {
         PageHelper.startPage(pageNum, pageSize);
         PageHelper.startPage(pageNum, pageSize);
         Map<String, Object> map = new HashMap<>();
         Map<String, Object> map = new HashMap<>();
-        map.put("clubList", new PageInfo<>(sellerMapper.findClubs(serviceProviderId, status, name, userIdentity, type, null)));
+        map.put("clubList", new PageInfo<>(sellerMapper.findClubs(serviceProviderId, status, name, userIdentity, type,null,null, null)));
         return ResponseJson.success(map);
         return ResponseJson.success(map);
     }
     }
     /**
     /**
@@ -386,6 +399,7 @@ public class SellerServiceImpl implements SellerService {
         for (CmBehaviorRecordVo cmBehaviorRecordVo : behaviorRecordYesterdayClubFrom) {
         for (CmBehaviorRecordVo cmBehaviorRecordVo : behaviorRecordYesterdayClubFrom) {
             String pageLabel = sellerMapper.getBehaviorRecordYesterdayPageLabel(spId, cmBehaviorRecordVo.getClubId(), accessTime);
             String pageLabel = sellerMapper.getBehaviorRecordYesterdayPageLabel(spId, cmBehaviorRecordVo.getClubId(), accessTime);
             cmBehaviorRecordVo.setPageLabel(pageLabel);
             cmBehaviorRecordVo.setPageLabel(pageLabel);
+            cmBehaviorRecordVo.setAccessDuration(calculationTime(cmBehaviorRecordVo.getAccessDuration()));
             if (cmBehaviorRecordVo.getProductID() != 0 && cmBehaviorRecordVo.getPageType().equals("6") ) {
             if (cmBehaviorRecordVo.getProductID() != 0 && cmBehaviorRecordVo.getPageType().equals("6") ) {
                 ProductItemVo productShown = shopMapper.getProductShown(cmBehaviorRecordVo.getProductID());
                 ProductItemVo productShown = shopMapper.getProductShown(cmBehaviorRecordVo.getProductID());
                 cmBehaviorRecordVo.setTitleId(cmBehaviorRecordVo.getProductID());
                 cmBehaviorRecordVo.setTitleId(cmBehaviorRecordVo.getProductID());
@@ -423,4 +437,136 @@ public class SellerServiceImpl implements SellerService {
         return ResponseJson.success(serviceProviderVos);
         return ResponseJson.success(serviceProviderVos);
     }
     }
 
 
+    /**
+     * 机构重点访问页面
+     *
+     * @param clubId
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    @Override
+    public ResponseJson<PageInfo<RetuenDataVo>> getClubRecord(Integer clubId, int pageNum, int pageSize) {
+
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        // 获取机构访问日期
+        List<RetuenDataVo> data = sellerMapper.getClubAccessDate(clubId);
+        // 访问时间集合
+        List<String> access = data.stream().map(RetuenDataVo::getAccessDate).collect(Collectors.toList());
+        // 访问来源数据
+        List<BehaviorRecodeVo> region = clubMapper.selRegion(null, null, 1, access);
+
+        // 机构访问记录
+        List<BehaviorRecodeVo> recordDataList = sellerMapper.getClubKeynoteRecord(clubId, access);
+        String format = "";
+        // 组装数据
+        if (null != data && data.size() > 0) {
+            for (RetuenDataVo rd : data) {
+                // 该日期下机构访问记录
+                List<BehaviorRecodeVo> recordList = recordDataList.stream().filter(r -> r.getAccessDate().equals(rd.getAccessDate())).collect(Collectors.toList());
+
+                for (BehaviorRecodeVo record : recordList) {
+                    // 图片处理
+                    if (StringUtils.isNotBlank(record.getProductImage())) {
+                        record.setProductImage(ImageUtils.getImageURL("product", record.getProductImage(), 0, wwwDomain));
+                    }
+                    String time = calculationTime(record.getAccessDuration());
+                    record.setAccessDuration(time);
+                    record.setAccessNewTime(dateFormat.format(record.getAccessTime()));
+                    String s = simpleDateFormat.format(record.getAccessTime());
+
+                    // 访问来源
+                    if (region.size() != 0) {
+                        for (BehaviorRecodeVo behaviorRecord : region) {
+                            format = simpleDateFormat.format(behaviorRecord.getAccessTime());
+                            if (StringUtils.isNotBlank(record.getPageType()) && StringUtils.isNotBlank(behaviorRecord.getPageType())) {
+                                if (s.equals(format)) {
+                                    record.setAccessSource(behaviorRecord.getAccessSource());
+                                }
+                            }
+                        }
+                    }
+                }
+                rd.setRecord(recordList);
+            }
+            // 没有重点访问页面数据删除不回显
+            data.removeIf(d -> d.getRecord().size() <= 0 );
+        }
+        PageHelper.startPage(pageNum, pageSize);
+        PageInfo<RetuenDataVo> page = new PageInfo<>(data);
+        return ResponseJson.success(page);
+    }
+
+    /**
+     * 协销不活跃机构列表
+     *
+     * @param serviceProviderId
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    @Override
+    public ResponseJson<PageInfo<ClubVo>> getUnActiveClubList(Integer serviceProviderId, int pageNum, int pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        List<ClubVo> unActiveClub = sellerMapper.getUnActiveClub(serviceProviderId);
+        for (ClubVo club : unActiveClub) {
+            setClubNumber(club);
+        }
+        PageInfo<ClubVo> page = new PageInfo<>(unActiveClub);
+        return ResponseJson.success(page);
+    }
+
+    /**
+     * 机构编号
+     * @param club
+     */
+    public void setClubNumber(ClubVo club) {
+        String newClubId = club.getClubId().toString();
+        int maxLen = 6;
+        int len = newClubId.length();
+        if (len < maxLen) {
+            for (int i = 0;i < (maxLen - len); i++) {
+                newClubId = "0" + newClubId;
+            }
+        }
+        club.setNewClubId(newClubId);
+    }
+
+    /**
+     * 时间计算
+     * @param recordTime
+     * @return
+     */
+    public String calculationTime(String recordTime){
+        double doc = Double.parseDouble(recordTime);
+        int num = (int)doc;
+        //小时
+        int HH = 0;
+        // 分钟
+        int mm = 0;
+        //秒
+        int ss = 0;
+        int item = num / 1000;
+        if ((item / 60) >0) {
+            mm = item / 60;
+            ss = item % 60;
+        } else {
+            ss = item;
+        }
+        if ((mm / 60) >0) {
+            HH = mm / 60;
+            mm = mm % 60;
+        }
+        String  str= HH+":"+mm+":"+ss;
+        SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
+        Date parse = null;
+        try {
+            parse = dateFormat.parse(str);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        String format = dateFormat.format(parse);
+        return format;
+    }
 }
 }

+ 34 - 11
src/main/resources/mapper/ClubMapper.xml

@@ -503,7 +503,10 @@
     </select>
     </select>
 
 
     <select id="getRemarksInfo" resultType="com.caimei365.user.model.po.ClubRemarksPo">
     <select id="getRemarksInfo" resultType="com.caimei365.user.model.po.ClubRemarksPo">
-        select ccr.communicationSituation, ccr.communicationMethods, ccr.customerSource, ccr.customerGender, ccr.groupAddition, ccr.customerAge
+        select ccr.communicationSituation, ccr.communicationMethods, ccr.customerSource,
+               ccr.customerGender, ccr.groupAddition, ccr.customerAge,
+               (SELECT ADDTIME FROM cm_club_remarks WHERE clubId = c.clubId ORDER BY ADDTIME ASC LIMIT 1) AS firstTime,
+               (SELECT ADDTIME FROM cm_club_remarks WHERE clubId = c.clubId ORDER BY ADDTIME DESC LIMIT 1) AS recentlyTime
         from cm_club_remarks ccr
         from cm_club_remarks ccr
         left join club c on ccr.clubId = c.clubId
         left join club c on ccr.clubId = c.clubId
         where c.userId = #{userId} order by ccr.addTime desc limit 1
         where c.userId = #{userId} order by ccr.addTime desc limit 1
@@ -1099,14 +1102,22 @@
         ORDER BY cbr.accessDate DESC
         ORDER BY cbr.accessDate DESC
     </select>
     </select>
     <select id="recordDetail" resultType="com.caimei365.user.model.vo.BehaviorRecodeVo">
     <select id="recordDetail" resultType="com.caimei365.user.model.vo.BehaviorRecodeVo">
-        SELECT pt.pageType,
-               b.pageLabel,
-               p.name      AS productName,
-               p.mainImage AS productImage,
-               b.accessDuration,
-               b.accessSource,
-               b.accessClient,
-               b.accessTime
+        SELECT
+            b.recordID,
+            b.userID,
+            b.pagePath,
+            pt.pageType,
+            b.pageLabel,
+            b.productID,
+            b.accessTime,
+            b.accessDuration,
+            b.accessDate,
+            b.referer,
+            b.accessClient,
+            b.isReckon,
+            b.region,
+            p.name      AS productName,
+            p.mainImage AS productImage
         FROM cm_behavior_record b
         FROM cm_behavior_record b
                  LEFT JOIN club c ON b.userID = c.userID
                  LEFT JOIN club c ON b.userID = c.userID
                  LEFT JOIN product p ON b.productID = p.productID
                  LEFT JOIN product p ON b.productID = p.productID
@@ -1182,8 +1193,20 @@
                accessTime,
                accessTime,
                pageType
                pageType
         FROM cm_behavior_record_ref
         FROM cm_behavior_record_ref
-        WHERE IP = #{ip}
-          AND accessTime like concat('%', #{accessDate}, '%')
+        <where>
+            <if test="type == 0">
+               IP = #{ip}
+               AND accessTime like concat('%', #{accessDate}, '%')
+            </if>
+            <if test="type == 1">
+                <if test="accessDateList.size()>0">
+                    and
+                    <foreach collection="accessDateList" item="accessDate" open="(" separator="or" close=")">
+                        accessTime like concat('%', #{accessDate}, '%')
+                    </foreach>
+                </if>
+            </if>
+        </where>
     </select>
     </select>
     <select id="selRemarksList" resultType="com.caimei365.user.model.vo.CmClubRemarksVo">
     <select id="selRemarksList" resultType="com.caimei365.user.model.vo.CmClubRemarksVo">
         SELECT
         SELECT

+ 12 - 0
src/main/resources/mapper/LoginMapper.xml

@@ -187,6 +187,12 @@
           and u.validFlag = 1
           and u.validFlag = 1
         limit 1
         limit 1
     </select>
     </select>
+    <update id="updateUserInfo">
+        update user
+        set openId = #{openId},
+            unionId = #{unionId}
+        where userId = #{userId}
+    </update>
     <select id="getServiceProviderByUserId" resultType="com.caimei365.user.model.vo.ServiceProviderVo">
     <select id="getServiceProviderByUserId" resultType="com.caimei365.user.model.vo.ServiceProviderVo">
         select s.serviceProviderId as serviceProviderId,
         select s.serviceProviderId as serviceProviderId,
                s.status            as status,
                s.status            as status,
@@ -487,4 +493,10 @@
         WHERE  c.clubId = #{clubId}
         WHERE  c.clubId = #{clubId}
         limit 1
         limit 1
     </select>
     </select>
+
+    <update id="updateTourist">
+        update cm_behavior_tourist_info
+        set userId = #{userId}
+        where touristId = #{touristId}
+    </update>
 </mapper>
 </mapper>

+ 2 - 2
src/main/resources/mapper/RegisterMapper.xml

@@ -10,8 +10,8 @@
     </select>
     </select>
     <insert id="insertOrgan">
     <insert id="insertOrgan">
         insert into cm_organ_value_system
         insert into cm_organ_value_system
-            (userID, activeState, customerValue, stage, delType)
-            values(#{userID},"新增用户","一般挽留客户",0,1)
+            (userID, activeState, customerValue, activeStatus, customerStatus, stage, delType)
+            values(#{userID}, '活跃用户', '低价值客户', 0, 3, 0, 1)
     </insert>
     </insert>
     <insert id="insertClub" parameterType="com.caimei365.user.model.po.ClubPo" keyProperty="clubId" useGeneratedKeys="true">
     <insert id="insertClub" parameterType="com.caimei365.user.model.po.ClubPo" keyProperty="clubId" useGeneratedKeys="true">
         insert into club(`name`, `sname`, `contractMobile`, `linkMan`, `userID`, `addTime`, `status`, `spID`, `scanFlag`, provinceID, cityID, townID, address, headpic, businessLicenseImage, medicalPracticeLicenseImg, socialCreditCode,newDeal)
         insert into club(`name`, `sname`, `contractMobile`, `linkMan`, `userID`, `addTime`, `status`, `spID`, `scanFlag`, provinceID, cityID, townID, address, headpic, businessLicenseImage, medicalPracticeLicenseImg, socialCreditCode,newDeal)

+ 89 - 0
src/main/resources/mapper/SellerMapper.xml

@@ -138,6 +138,7 @@
         LEFT JOIN cm_organ_value_system covs ON covs.userID = u.userID
         LEFT JOIN cm_organ_value_system covs ON covs.userID = u.userID
         LEFT JOIN serviceprovider sp ON c.spID = sp.serviceProviderID
         LEFT JOIN serviceprovider sp ON c.spID = sp.serviceProviderID
         LEFT JOIN cm_provider_record cpr ON cpr.spID = sp.serviceProviderID and cpr.clubId = c.clubId
         LEFT JOIN cm_provider_record cpr ON cpr.spID = sp.serviceProviderID and cpr.clubId = c.clubId
+        LEFT JOIN (SELECT DISTINCT clubID, checkTime FROM clubchangesprecord WHERE checkStatus = 1 GROUP BY clubID ORDER BY clubChangeSpRecordID DESC )ccs ON ccs.clubId = c.clubId
         where
         where
         <if test="1 == type">
         <if test="1 == type">
             c.spID = #{serviceProviderId}
             c.spID = #{serviceProviderId}
@@ -222,6 +223,14 @@
         <if test="userIdentity != null">
         <if test="userIdentity != null">
             AND u.userIdentity = #{userIdentity}
             AND u.userIdentity = #{userIdentity}
         </if>
         </if>
+        <if test="startTime != null and startTime != ''">
+            AND (ccs.checkTime <![CDATA[ >= ]]> #{startTime}
+                OR cpr.createTime <![CDATA[ >= ]]> #{startTime})
+        </if>
+        <if test="endTime != null and endTime != ''">
+            AND (ccs.checkTime <![CDATA[ <= ]]> #{endTime}
+                OR cpr.createTime <![CDATA[ <= ]]> #{endTime})
+        </if>
         AND covs.stage = 0 AND covs.delType = 1
         AND covs.stage = 0 AND covs.delType = 1
         group by c.clubID
         group by c.clubID
         order by cpr.createTime desc
         order by cpr.createTime desc
@@ -441,4 +450,84 @@
           and  DATE(b.accessTime) = DATE(#{accessTime})
           and  DATE(b.accessTime) = DATE(#{accessTime})
         GROUP BY c.clubId
         GROUP BY c.clubId
     </select>
     </select>
+
+    <select id="getClubAccessDate" resultType="com.caimei365.user.model.vo.RetuenDataVo">
+        select cbr.accessDate
+        from cm_behavior_record cbr
+        LEFT JOIN club c ON cbr.userID = c.userID
+        where c.clubID = #{clubId} group by cbr.accessDate order by cbr.accessDate desc
+    </select>
+    <select id="getClubKeynoteRecord" resultType="com.caimei365.user.model.vo.BehaviorRecodeVo">
+        SELECT
+        b.recordID,
+        b.userID,
+        b.pagePath,
+        pt.pageType,
+        b.pageLabel,
+        b.productID,
+        b.accessTime,
+        b.accessDuration,
+        b.accessDate,
+        b.referer,
+        b.accessClient,
+        b.isReckon,
+        b.region,
+        p.name      AS productName,
+        p.mainImage AS productImage
+        FROM cm_behavior_record b
+        LEFT JOIN club c ON b.userID = c.userID
+        LEFT JOIN product p ON b.productID = p.productID
+        LEFT JOIN cm_page_type pt ON b.pageType = pt.id
+        WHERE c.clubID = #{clubId}
+            and b.pageType IN (6,11)
+            <if test="accessDateList.size()>0">
+                and
+                <foreach collection="accessDateList" item="accessDate" open="(" separator="or" close=")">
+                    b.accessTime like concat('%', #{accessDate}, '%')
+                </foreach>
+            </if>
+        order by b.accessTime desc
+    </select>
+
+    <select id="getUnActiveClub" resultType="com.caimei365.user.model.vo.ClubVo">
+        SELECT c.clubID as clubId,
+               c.userID as userId,
+               c.name,
+               c.sname as shortName,
+               c.contractMobile,
+               c.contractEmail as contractEmail,
+               c.contractPhone,
+               c.linkMan,
+               c.provinceID as proviceId,
+               c.cityID as cityId,
+               c.townID as townId,
+               c.address,
+               c.headpic as shopPhoto,
+               c.businessLicenseImage as businessLicense,
+               c.socialCreditCode,
+               c.firstClubType,
+               c.secondClubType,
+               c.department,
+               c.medicalPracticeLicenseImg as medicalPracticeLicense,
+               c.mainpro as mainProduct,
+               c.fax,
+               c.info as profile,
+               c.spID as serviceProviderId,
+               c.addTime, c.status,
+               c.lastCheckOrderDate,
+               u.userIdentity,
+               c.newDeal as newDeal,IF(r.id IS NOT NULL,1,0) AS recordCount,
+               sp.name AS serviceName,
+               covs.activeState AS activeState,
+               covs.customerValue AS customerValue
+            from club c
+            left join user u on c.userID = u.userID
+            LEFT JOIN record_link r ON r.`clubId`=c.`clubID`
+            LEFT JOIN cm_organ_value_system covs ON covs.userID = u.userID
+            LEFT JOIN serviceprovider sp ON c.spID = sp.serviceProviderID
+        WHERE covs.delType = 1 AND covs.stage = 0 AND covs.activeStatus = 1
+          AND sp.serviceProviderID = #{serviceProviderId}
+        GROUP BY covs.userID
+    </select>
+
 </mapper>
 </mapper>