Selaa lähdekoodia

feat:注册用户会员相关接口

caoliqin 2 kuukautta sitten
vanhempi
commit
8b03b5420f

+ 65 - 0
fs-company-app/src/main/java/com/fs/app/controller/FsUserController.java

@@ -0,0 +1,65 @@
+package com.fs.app.controller;
+
+
+import com.fs.app.annotation.Login;
+import com.fs.common.core.domain.ResponseResult;
+import com.fs.qw.service.IQwExternalContactService;
+import com.fs.qw.vo.newvo.ExternalContactDetailsVO;
+import com.fs.store.param.h5.FsUserPageListParam;
+import com.fs.store.service.IFsUserService;
+import com.fs.store.vo.h5.FsUserPageListVO;
+import com.fs.store.vo.h5.UserListPageVO;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+
+@Api(tags = "用户会员相关接口")
+@RestController
+@RequestMapping("/app/fs/user")
+public class FsUserController extends AppBaseController {
+
+
+    @Autowired
+    private IFsUserService fsUserService;
+//
+//    @Autowired
+//    private IQwTagService tagService;
+
+    @Login
+    @PostMapping("/pageList")
+    @ApiOperation("用户会员分页列表")
+    public ResponseResult<PageInfo<FsUserPageListVO>> pageList(@RequestBody FsUserPageListParam param) {
+        param.setUserId(Long.parseLong(getUserId()));
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
+        List<FsUserPageListVO> list = fsUserService.selectFsUserPageList(param);
+        PageInfo<FsUserPageListVO> pageInfo = new PageInfo<>(list);
+        return ResponseResult.ok(pageInfo);
+    }
+
+    @Login
+    @GetMapping("/totalNumber")
+    @ApiOperation("用户会员数量统计")
+    public ResponseResult<UserListPageVO> getTotalNumber() {
+        UserListPageVO userNumber = fsUserService.getUserNumber(Long.parseLong(getUserId()));
+        return ResponseResult.ok(userNumber);
+    }
+
+    @Login
+    @GetMapping("/details")
+    @ApiOperation("用户会员详情")
+    public ResponseResult<ExternalContactDetailsVO> getUserDetails(@ApiParam(value = "用户id", required = true) @RequestParam Long userId,
+                                                                   @ApiParam(value = "时间tab,不传表示查询全部,分别是:今天、昨天、前天、近七天", required = true) @RequestParam String dateTag) {
+//        qwExternalContactService.getUserDetails(Long.parseLong(getUserId()), contactId, dateTag)
+        return ResponseResult.ok();
+    }
+
+
+
+}

+ 213 - 0
fs-service-system/src/main/java/com/fs/store/domain/FsUserCourseCount.java

@@ -0,0 +1,213 @@
+package com.fs.store.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 用户看课统计对象 fs_user_course_count
+ *
+ * @author fs
+ * @date 2025-04-02
+ */
+public class FsUserCourseCount extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    private Long id;
+
+    /** 用户id */
+    @Excel(name = "用户id")
+    private Long userId;
+
+    /** 看课数量 */
+    @Excel(name = "看课数量")
+    private Long watchCourseCount;
+
+    /** 缺课数量 */
+    @Excel(name = "缺课数量")
+    private Long missCourseCount;
+
+    /** 缺课状态,1-已缺课;2-未缺课 */
+    @Excel(name = "缺课状态,1-已缺课;2-未缺课")
+    private Long missCourseStatus;
+
+    /** 关联课程(营期)id */
+    @Excel(name = "关联课程", readConverterExp = "营=期")
+    private Long courseId;
+
+    /** 参与营期数量 */
+    @Excel(name = "参与营期数量")
+    private String partCourseCount;
+
+    /** 最后一次看课时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "最后一次看课时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date lastWatchDate;
+
+    /** 用户状态,1-正常;2-停止;3-未看 */
+    @Excel(name = "用户状态,1-正常;2-停止;3-未看")
+    private Long status;
+
+    /** 停课天数(如果状态是停止) */
+    @Excel(name = "停课天数", readConverterExp = "如=果状态是停止")
+    private Long stopWatchDays;
+
+    /** 完播时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "完播时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date completeWatchDate;
+
+    /** 完播次数 */
+    @Excel(name = "完播次数")
+    private Long completeWatchCount;
+
+    /** 观看次数 */
+    @Excel(name = "观看次数")
+    private Long watchTimes;
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public Long getId()
+    {
+        return id;
+    }
+    public void setUserId(Long userId)
+    {
+        this.userId = userId;
+    }
+
+    public Long getUserId()
+    {
+        return userId;
+    }
+    public void setWatchCourseCount(Long watchCourseCount)
+    {
+        this.watchCourseCount = watchCourseCount;
+    }
+
+    public Long getWatchCourseCount()
+    {
+        return watchCourseCount;
+    }
+    public void setMissCourseCount(Long missCourseCount)
+    {
+        this.missCourseCount = missCourseCount;
+    }
+
+    public Long getMissCourseCount()
+    {
+        return missCourseCount;
+    }
+    public void setMissCourseStatus(Long missCourseStatus)
+    {
+        this.missCourseStatus = missCourseStatus;
+    }
+
+    public Long getMissCourseStatus()
+    {
+        return missCourseStatus;
+    }
+    public void setCourseId(Long courseId)
+    {
+        this.courseId = courseId;
+    }
+
+    public Long getCourseId()
+    {
+        return courseId;
+    }
+    public void setPartCourseCount(String partCourseCount)
+    {
+        this.partCourseCount = partCourseCount;
+    }
+
+    public String getPartCourseCount()
+    {
+        return partCourseCount;
+    }
+    public void setLastWatchDate(Date lastWatchDate)
+    {
+        this.lastWatchDate = lastWatchDate;
+    }
+
+    public Date getLastWatchDate()
+    {
+        return lastWatchDate;
+    }
+    public void setStatus(Long status)
+    {
+        this.status = status;
+    }
+
+    public Long getStatus()
+    {
+        return status;
+    }
+    public void setStopWatchDays(Long stopWatchDays)
+    {
+        this.stopWatchDays = stopWatchDays;
+    }
+
+    public Long getStopWatchDays()
+    {
+        return stopWatchDays;
+    }
+    public void setCompleteWatchDate(Date completeWatchDate)
+    {
+        this.completeWatchDate = completeWatchDate;
+    }
+
+    public Date getCompleteWatchDate()
+    {
+        return completeWatchDate;
+    }
+    public void setCompleteWatchCount(Long completeWatchCount)
+    {
+        this.completeWatchCount = completeWatchCount;
+    }
+
+    public Long getCompleteWatchCount()
+    {
+        return completeWatchCount;
+    }
+    public void setWatchTimes(Long watchTimes)
+    {
+        this.watchTimes = watchTimes;
+    }
+
+    public Long getWatchTimes()
+    {
+        return watchTimes;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("userId", getUserId())
+            .append("watchCourseCount", getWatchCourseCount())
+            .append("missCourseCount", getMissCourseCount())
+            .append("missCourseStatus", getMissCourseStatus())
+            .append("courseId", getCourseId())
+            .append("partCourseCount", getPartCourseCount())
+            .append("lastWatchDate", getLastWatchDate())
+            .append("status", getStatus())
+            .append("stopWatchDays", getStopWatchDays())
+            .append("createTime", getCreateTime())
+            .append("updateTime", getUpdateTime())
+            .append("createBy", getCreateBy())
+            .append("updateBy", getUpdateBy())
+            .append("completeWatchDate", getCompleteWatchDate())
+            .append("completeWatchCount", getCompleteWatchCount())
+            .append("watchTimes", getWatchTimes())
+            .toString();
+    }
+}

+ 61 - 0
fs-service-system/src/main/java/com/fs/store/mapper/FsUserCourseCountMapper.java

@@ -0,0 +1,61 @@
+package com.fs.store.mapper;
+
+import java.util.List;
+import com.fs.store.domain.FsUserCourseCount;
+
+/**
+ * 用户看课统计Mapper接口
+ * 
+ * @author fs
+ * @date 2025-04-02
+ */
+public interface FsUserCourseCountMapper 
+{
+    /**
+     * 查询用户看课统计
+     * 
+     * @param id 用户看课统计ID
+     * @return 用户看课统计
+     */
+    public FsUserCourseCount selectFsUserCourseCountById(Long id);
+
+    /**
+     * 查询用户看课统计列表
+     * 
+     * @param fsUserCourseCount 用户看课统计
+     * @return 用户看课统计集合
+     */
+    public List<FsUserCourseCount> selectFsUserCourseCountList(FsUserCourseCount fsUserCourseCount);
+
+    /**
+     * 新增用户看课统计
+     * 
+     * @param fsUserCourseCount 用户看课统计
+     * @return 结果
+     */
+    public int insertFsUserCourseCount(FsUserCourseCount fsUserCourseCount);
+
+    /**
+     * 修改用户看课统计
+     * 
+     * @param fsUserCourseCount 用户看课统计
+     * @return 结果
+     */
+    public int updateFsUserCourseCount(FsUserCourseCount fsUserCourseCount);
+
+    /**
+     * 删除用户看课统计
+     * 
+     * @param id 用户看课统计ID
+     * @return 结果
+     */
+    public int deleteFsUserCourseCountById(Long id);
+
+    /**
+     * 批量删除用户看课统计
+     * 
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteFsUserCourseCountByIds(Long[] ids);
+}

+ 14 - 0
fs-service-system/src/main/java/com/fs/store/mapper/FsUserMapper.java

@@ -4,12 +4,17 @@ import java.util.List;
 
 import com.fs.qw.param.QwFsUserParam;
 import com.fs.qw.vo.QwFsUserVO;
+import com.fs.qw.vo.newvo.ExternalContactNumVO;
 import com.fs.store.domain.FsStorePayment;
 import com.fs.store.domain.FsUser;
+import com.fs.store.param.h5.FsUserPageListParam;
 import com.fs.store.vo.FSUserVO;
 
 import com.fs.store.vo.FsCompanyUserListQueryVO;
 import com.fs.store.vo.FsUserTuiVO;
+import com.fs.store.vo.h5.FsUserPageListVO;
+import com.fs.store.vo.h5.UserDetailsVO;
+import com.fs.store.vo.h5.UserListCountVO;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
@@ -200,4 +205,13 @@ public interface FsUserMapper
 
     @Select("select * from fs_user where union_id=#{unionid} limit 1")
     FsUser selectFsUserByUnionid(String unionId);
+
+    List<FsUserPageListVO> selectFsUserPageList(FsUserPageListParam param);
+
+    List<UserListCountVO> getUserNumber(@Param("userId") Long userId);
+
+    UserDetailsVO getCountAnswer (@Param("userId") Long userId, @Param("fsUserId") Long fsUserId, @Param("dateTag") String dateTag);
+
+    UserDetailsVO getCountRedPacket(@Param("userId") Long userId, @Param("fsUserId") Long fsUserId, @Param("dateTag") String dateTag);
+
 }

+ 47 - 0
fs-service-system/src/main/java/com/fs/store/param/h5/FsUserPageListParam.java

@@ -0,0 +1,47 @@
+package com.fs.store.param.h5;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+@Data
+public class FsUserPageListParam implements Serializable {
+
+    @ApiModelProperty(value = "页码,默认为1", required = true)
+    private Integer pageNum = 1;
+
+    @ApiModelProperty(value = "页大小,默认为10", required = true)
+    private Integer pageSize = 10;
+
+    @ApiModelProperty(value = "模糊搜索,可以通过微信名称、电话来模糊匹配")
+    private String keyword;
+
+    @ApiModelProperty(value = "用户id,不用传")
+    private Long userId;
+
+    @ApiModelProperty(value = "是否是黑名单,默认是false", required = true)
+    private Boolean isBlack = false;
+
+    @ApiModelProperty(value = "注册时间-开始")
+    private String registerStartTime;
+
+    @ApiModelProperty(value = "注册时间-结束")
+    private String registerEndTime;
+
+    @ApiModelProperty(value = "标签")
+    private String[] tagIds;
+
+    @ApiModelProperty(value = "tab序号,0全部;1今日新增;2今日完播;3未看过课")
+    private String tabValue;
+
+    @ApiModelProperty(value = "看课状态,0全部;1未看过课;2正常看课;3停止看课")
+    private String watchCourseType;
+
+    @ApiModelProperty(value = "缺课状态,1-已缺课;2-未缺课")
+    private String missCourseStatus;
+
+}
+

+ 61 - 0
fs-service-system/src/main/java/com/fs/store/service/IFsUserCourseCountService.java

@@ -0,0 +1,61 @@
+package com.fs.store.service;
+
+import java.util.List;
+import com.fs.store.domain.FsUserCourseCount;
+
+/**
+ * 用户看课统计Service接口
+ * 
+ * @author fs
+ * @date 2025-04-02
+ */
+public interface IFsUserCourseCountService 
+{
+    /**
+     * 查询用户看课统计
+     * 
+     * @param id 用户看课统计ID
+     * @return 用户看课统计
+     */
+    public FsUserCourseCount selectFsUserCourseCountById(Long id);
+
+    /**
+     * 查询用户看课统计列表
+     * 
+     * @param fsUserCourseCount 用户看课统计
+     * @return 用户看课统计集合
+     */
+    public List<FsUserCourseCount> selectFsUserCourseCountList(FsUserCourseCount fsUserCourseCount);
+
+    /**
+     * 新增用户看课统计
+     * 
+     * @param fsUserCourseCount 用户看课统计
+     * @return 结果
+     */
+    public int insertFsUserCourseCount(FsUserCourseCount fsUserCourseCount);
+
+    /**
+     * 修改用户看课统计
+     * 
+     * @param fsUserCourseCount 用户看课统计
+     * @return 结果
+     */
+    public int updateFsUserCourseCount(FsUserCourseCount fsUserCourseCount);
+
+    /**
+     * 批量删除用户看课统计
+     * 
+     * @param ids 需要删除的用户看课统计ID
+     * @return 结果
+     */
+    public int deleteFsUserCourseCountByIds(Long[] ids);
+
+    /**
+     * 删除用户看课统计信息
+     * 
+     * @param id 用户看课统计ID
+     * @return 结果
+     */
+    public int deleteFsUserCourseCountById(Long id);
+}

+ 13 - 0
fs-service-system/src/main/java/com/fs/store/service/IFsUserService.java

@@ -5,13 +5,20 @@ import java.util.List;
 import com.fs.common.core.domain.R;
 import com.fs.qw.param.QwFsUserParam;
 import com.fs.qw.vo.QwFsUserVO;
+import com.fs.qw.vo.newvo.ExternalContactDetailsVO;
+import com.fs.qw.vo.newvo.ExternalContactPageVO;
 import com.fs.store.domain.FsStoreOrder;
 import com.fs.store.domain.FsStoreOrderItem;
 import com.fs.store.domain.FsUser;
 
+import com.fs.store.param.h5.FsUserPageListParam;
 import com.fs.store.vo.FSUserVO;
 import com.fs.store.vo.FsCompanyUserListQueryVO;
 import com.fs.store.vo.FsUserTuiVO;
+import com.fs.store.vo.h5.FsUserPageListVO;
+import com.fs.store.vo.h5.UserDetailsVO;
+import com.fs.store.vo.h5.UserListCountVO;
+import com.fs.store.vo.h5.UserListPageVO;
 
 /**
  * 用户Service接口
@@ -121,4 +128,10 @@ public interface IFsUserService
     R clearUserVip(Long l);
 
     FsUser selectFsUserByUnionid(String unionId);
+
+    List<FsUserPageListVO> selectFsUserPageList(FsUserPageListParam param);
+
+    UserListPageVO getUserNumber(Long userId);
+
+    UserDetailsVO getUserDetails(Long userId, Long fsUserId, String dateTag);
 }

+ 96 - 0
fs-service-system/src/main/java/com/fs/store/service/impl/FsUserCourseCountServiceImpl.java

@@ -0,0 +1,96 @@
+package com.fs.store.service.impl;
+
+import java.util.List;
+import com.fs.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.fs.store.mapper.FsUserCourseCountMapper;
+import com.fs.store.domain.FsUserCourseCount;
+import com.fs.store.service.IFsUserCourseCountService;
+
+/**
+ * 用户看课统计Service业务层处理
+ * 
+ * @author fs
+ * @date 2025-04-02
+ */
+@Service
+public class FsUserCourseCountServiceImpl implements IFsUserCourseCountService 
+{
+    @Autowired
+    private FsUserCourseCountMapper fsUserCourseCountMapper;
+
+    /**
+     * 查询用户看课统计
+     * 
+     * @param id 用户看课统计ID
+     * @return 用户看课统计
+     */
+    @Override
+    public FsUserCourseCount selectFsUserCourseCountById(Long id)
+    {
+        return fsUserCourseCountMapper.selectFsUserCourseCountById(id);
+    }
+
+    /**
+     * 查询用户看课统计列表
+     * 
+     * @param fsUserCourseCount 用户看课统计
+     * @return 用户看课统计
+     */
+    @Override
+    public List<FsUserCourseCount> selectFsUserCourseCountList(FsUserCourseCount fsUserCourseCount)
+    {
+        return fsUserCourseCountMapper.selectFsUserCourseCountList(fsUserCourseCount);
+    }
+
+    /**
+     * 新增用户看课统计
+     * 
+     * @param fsUserCourseCount 用户看课统计
+     * @return 结果
+     */
+    @Override
+    public int insertFsUserCourseCount(FsUserCourseCount fsUserCourseCount)
+    {
+        fsUserCourseCount.setCreateTime(DateUtils.getNowDate());
+        return fsUserCourseCountMapper.insertFsUserCourseCount(fsUserCourseCount);
+    }
+
+    /**
+     * 修改用户看课统计
+     * 
+     * @param fsUserCourseCount 用户看课统计
+     * @return 结果
+     */
+    @Override
+    public int updateFsUserCourseCount(FsUserCourseCount fsUserCourseCount)
+    {
+        fsUserCourseCount.setUpdateTime(DateUtils.getNowDate());
+        return fsUserCourseCountMapper.updateFsUserCourseCount(fsUserCourseCount);
+    }
+
+    /**
+     * 批量删除用户看课统计
+     * 
+     * @param ids 需要删除的用户看课统计ID
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserCourseCountByIds(Long[] ids)
+    {
+        return fsUserCourseCountMapper.deleteFsUserCourseCountByIds(ids);
+    }
+
+    /**
+     * 删除用户看课统计信息
+     * 
+     * @param id 用户看课统计ID
+     * @return 结果
+     */
+    @Override
+    public int deleteFsUserCourseCountById(Long id)
+    {
+        return fsUserCourseCountMapper.deleteFsUserCourseCountById(id);
+    }
+}

+ 31 - 0
fs-service-system/src/main/java/com/fs/store/service/impl/FsUserServiceImpl.java

@@ -3,11 +3,16 @@ package com.fs.store.service.impl;
 import java.math.BigDecimal;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 import cn.hutool.json.JSONUtil;
 import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
 import com.fs.qw.param.QwFsUserParam;
 import com.fs.qw.vo.QwFsUserVO;
+import com.fs.qw.vo.newvo.ExternalContactNumVO;
+import com.fs.qw.vo.newvo.ExternalContactPageVO;
 import com.fs.store.domain.FsStoreOrder;
 import com.fs.store.domain.FsStoreOrderItem;
 import com.fs.store.domain.FsUserBill;
@@ -15,10 +20,15 @@ import com.fs.store.dto.FsStoreCartDTO;
 import com.fs.store.enums.BillDetailEnum;
 import com.fs.store.mapper.FsStoreOrderMapper;
 import com.fs.store.mapper.FsStoreProductAttrValueMapper;
+import com.fs.store.param.h5.FsUserPageListParam;
 import com.fs.store.service.IFsUserBillService;
 import com.fs.store.vo.FSUserVO;
 import com.fs.store.vo.FsCompanyUserListQueryVO;
 import com.fs.store.vo.FsUserTuiVO;
+import com.fs.store.vo.h5.FsUserPageListVO;
+import com.fs.store.vo.h5.UserDetailsVO;
+import com.fs.store.vo.h5.UserListCountVO;
+import com.fs.store.vo.h5.UserListPageVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.fs.store.mapper.FsUserMapper;
@@ -347,4 +357,25 @@ public class FsUserServiceImpl implements IFsUserService
     public FsUser selectFsUserByUnionid(String unionId) {
         return fsUserMapper.selectFsUserByUnionid(unionId);
     }
+
+    @Override
+    public List<FsUserPageListVO> selectFsUserPageList(FsUserPageListParam param) {
+        return fsUserMapper.selectFsUserPageList(param);
+    }
+
+    @Override
+    public UserListPageVO getUserNumber(Long userId) {
+        List<UserListCountVO> list = fsUserMapper.getUserNumber(userId);
+        Map<String, Integer> map = list.stream().collect(Collectors.toMap(UserListCountVO::getStatus, UserListCountVO::getNum, (v1, v2) -> v1));
+        UserListPageVO pageVO = new UserListPageVO();
+        pageVO.setNumber(map.getOrDefault("1",0));
+        pageVO.setBlackNum(map.getOrDefault("0",0));
+        return pageVO;
+    }
+
+    @Override
+    public UserDetailsVO getUserDetails(Long userId, Long fsUserId, String dateTag) {
+        fsUserMapper.getCountAnswer(userId, fsUserId, dateTag);
+        return null;
+    }
 }

+ 76 - 0
fs-service-system/src/main/java/com/fs/store/vo/h5/FsUserPageListVO.java

@@ -0,0 +1,76 @@
+package com.fs.store.vo.h5;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 用户分页列表返回对象
+ */
+@Data
+@ApiModel
+public class FsUserPageListVO {
+
+    @ApiModelProperty(value = "用户id")
+    private Long userId;
+
+    @ApiModelProperty(value = "用户头像")
+    private String avatar;
+
+    @ApiModelProperty(value = "用户昵称")
+    private String nickname;
+
+    @ApiModelProperty(value = "手机号码")
+    private String phone;
+
+    @ApiModelProperty(value = "状态:1为正常,0为禁止")
+    private Integer status;
+
+    @ApiModelProperty(value = "公司id")
+    private Long companyId;
+
+    @ApiModelProperty(value = "销售id(目前的登录用户id)")
+    private Long companyUserId;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "注册时间")
+    private Date createTime;
+
+    @ApiModelProperty(value = "看课数量")
+    private Long watchCourseCount;
+
+    @ApiModelProperty(value = "缺课数量")
+    private Long missCourseCount;
+
+    @ApiModelProperty(value = "缺课状态,1-已缺课;2-未缺课")
+    private Long missCourseStatus;
+
+    @ApiModelProperty(value = "参与营期数量")
+    private Long partCourseCount;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "最后一次看课时间")
+    private Date lastWatchDate;
+
+    @ApiModelProperty(value = "用户状态,1-正常;2-停止;3-未看")
+    private Long courseCountStatus;
+
+    @ApiModelProperty(value = "停课天数")
+    private Long stopWatchDays;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "完播时间")
+    private Date completeWatchDate;
+
+    @ApiModelProperty(value = "标签ids,多个用逗号隔开")
+    private String tagIds;
+
+    @ApiModelProperty(value = "标签名称")
+    private String tag;
+
+
+
+}

+ 26 - 0
fs-service-system/src/main/java/com/fs/store/vo/h5/UserDetailsVO.java

@@ -0,0 +1,26 @@
+package com.fs.store.vo.h5;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 用户会员详情 输出参数
+ */
+@Data
+@ApiModel
+public class UserDetailsVO {
+
+    @ApiModelProperty(value = "答题次数")
+    private int answerTime;
+
+    @ApiModelProperty(value = "答题正确次数")
+    private int answerRightTime;
+
+    @ApiModelProperty(value = "答题红包数")
+    private int answerRedPacketTime;
+
+    @ApiModelProperty(value = "答题红包金额")
+    private int answerRedPacketAmount;
+
+}

+ 20 - 0
fs-service-system/src/main/java/com/fs/store/vo/h5/UserListCountVO.java

@@ -0,0 +1,20 @@
+package com.fs.store.vo.h5;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 用户列表查询数量统计
+ */
+@Data
+@ApiModel
+public class UserListCountVO {
+
+    @ApiModelProperty(value = "人员状态")
+    private String status;
+
+    @ApiModelProperty(value = "人员状态对应的数量")
+    private Integer num;
+
+}

+ 20 - 0
fs-service-system/src/main/java/com/fs/store/vo/h5/UserListPageVO.java

@@ -0,0 +1,20 @@
+package com.fs.store.vo.h5;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 用户人员数量统计返回对象
+ */
+@Data
+@ApiModel
+public class UserListPageVO {
+
+    @ApiModelProperty(value = "会员数量")
+    private int number;
+
+    @ApiModelProperty(value = "黑名单数量")
+    private int blackNum;
+
+}

+ 115 - 0
fs-service-system/src/main/resources/mapper/store/FsUserCourseCountMapper.xml

@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.store.mapper.FsUserCourseCountMapper">
+    
+    <resultMap type="FsUserCourseCount" id="FsUserCourseCountResult">
+        <result property="id"    column="id"    />
+        <result property="userId"    column="user_id"    />
+        <result property="watchCourseCount"    column="watch_course_count"    />
+        <result property="missCourseCount"    column="miss_course_count"    />
+        <result property="missCourseStatus"    column="miss_course_status"    />
+        <result property="courseId"    column="course_id"    />
+        <result property="lastWatchDate"    column="last_watch_date"    />
+        <result property="status"    column="status"    />
+        <result property="stopWatchDays"    column="stop_watch_days"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="completeWatchDate"    column="complete_watch_date"    />
+    </resultMap>
+
+    <sql id="selectFsUserCourseCountVo">
+        select id, user_id, watch_course_count, miss_course_count, miss_course_status, course_id, last_watch_date, status, stop_watch_days, create_time, update_time, create_by, update_by, complete_watch_date from fs_user_course_count
+    </sql>
+
+    <select id="selectFsUserCourseCountList" parameterType="FsUserCourseCount" resultMap="FsUserCourseCountResult">
+        <include refid="selectFsUserCourseCountVo"/>
+        <where>  
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="watchCourseCount != null "> and watch_course_count = #{watchCourseCount}</if>
+            <if test="missCourseCount != null "> and miss_course_count = #{missCourseCount}</if>
+            <if test="missCourseStatus != null "> and miss_course_status = #{missCourseStatus}</if>
+            <if test="courseId != null "> and course_id = #{courseId}</if>
+            <if test="lastWatchDate != null "> and last_watch_date = #{lastWatchDate}</if>
+            <if test="status != null "> and status = #{status}</if>
+            <if test="stopWatchDays != null "> and stop_watch_days = #{stopWatchDays}</if>
+            <if test="completeWatchDate != null "> and complete_watch_date = #{completeWatchDate}</if>
+        </where>
+    </select>
+    
+    <select id="selectFsUserCourseCountById" parameterType="Long" resultMap="FsUserCourseCountResult">
+        <include refid="selectFsUserCourseCountVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertFsUserCourseCount" parameterType="FsUserCourseCount">
+        insert into fs_user_course_count
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="userId != null">user_id,</if>
+            <if test="watchCourseCount != null">watch_course_count,</if>
+            <if test="missCourseCount != null">miss_course_count,</if>
+            <if test="missCourseStatus != null">miss_course_status,</if>
+            <if test="courseId != null">course_id,</if>
+            <if test="lastWatchDate != null">last_watch_date,</if>
+            <if test="status != null">status,</if>
+            <if test="stopWatchDays != null">stop_watch_days,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="completeWatchDate != null">complete_watch_date,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="watchCourseCount != null">#{watchCourseCount},</if>
+            <if test="missCourseCount != null">#{missCourseCount},</if>
+            <if test="missCourseStatus != null">#{missCourseStatus},</if>
+            <if test="courseId != null">#{courseId},</if>
+            <if test="lastWatchDate != null">#{lastWatchDate},</if>
+            <if test="status != null">#{status},</if>
+            <if test="stopWatchDays != null">#{stopWatchDays},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="completeWatchDate != null">#{completeWatchDate},</if>
+         </trim>
+    </insert>
+
+    <update id="updateFsUserCourseCount" parameterType="FsUserCourseCount">
+        update fs_user_course_count
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="watchCourseCount != null">watch_course_count = #{watchCourseCount},</if>
+            <if test="missCourseCount != null">miss_course_count = #{missCourseCount},</if>
+            <if test="missCourseStatus != null">miss_course_status = #{missCourseStatus},</if>
+            <if test="courseId != null">course_id = #{courseId},</if>
+            <if test="lastWatchDate != null">last_watch_date = #{lastWatchDate},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="stopWatchDays != null">stop_watch_days = #{stopWatchDays},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="completeWatchDate != null">complete_watch_date = #{completeWatchDate},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteFsUserCourseCountById" parameterType="Long">
+        delete from fs_user_course_count where id = #{id}
+    </delete>
+
+    <delete id="deleteFsUserCourseCountByIds" parameterType="String">
+        delete from fs_user_course_count where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    
+</mapper>

+ 183 - 0
fs-service-system/src/main/resources/mapper/store/FsUserMapper.xml

@@ -227,4 +227,187 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </foreach>
     </delete>
 
+    <select id="selectFsUserPageList" resultType="FsUserPageListVO">
+        SELECT
+        fs_user.*,
+        fs_user_course_count.id,
+        fs_user_course_count.user_id,
+        fs_user_course_count.watch_course_count,
+        fs_user_course_count.miss_course_count,
+        fs_user_course_count.miss_course_status,
+        fs_user_course_count.course_id,
+        fs_user_course_count.part_course_count,
+        fs_user_course_count.last_watch_date,
+        fs_user_course_count.STATUS AS course_count,
+        fs_user_course_count.stop_watch_days,
+        fs_user_course_count.create_time,
+        fs_user_course_count.complete_watch_date,
+        company_tag.tag,
+        company_tag_user.tag_ids
+        FROM
+        fs_user
+        left join company_user on fs_user.company_user_id = company_user.user_id
+        LEFT JOIN fs_user_course_count ON fs_user.user_id = fs_user_course_count.user_id
+        LEFT JOIN company_tag_user ON fs_user.user_id = company_tag_user.user_id
+        LEFT JOIN company_tag ON FIND_IN_SET(company_tag.tag_id, company_tag_user.tag_ids) > 0
+        where company_user.parent_id = #{userId}
+        <choose>
+            <when test = "isBlack">
+                AND fs_user.status = 0
+            </when>
+            <otherwise>
+                AND fs_user.status = 1
+            </otherwise>
+        </choose>
+        <if test="keyword != null and keyword !='' ">
+            AND (fs_user.nickname LIKE concat('%',#{keyword},'%')
+            or  fs_user.phone LIKE concat('%',#{keyword},'%')
+            )
+        </if>
+        <if test="registerStartTime != null and registerStartTime !='' ">
+            AND fs_user.create_time &gt;= #{registerStartTime}
+        </if>
+        <if test="registerEndTime != null and registerEndTime !='' ">
+            AND fs_user.create_time &lt;= #{registerEndTime}
+        </if>
+        <if test="tagIds != null and tagIds.length > 0">
+            AND
+            <foreach collection="tagIds" item="item" index="index" open="(" separator="or" close=")">
+                company_tag_user.tag_ids LIKE concat('%"',#{item},'"%')
+            </foreach>
+        </if>
+        <if test="tabValue != null and tabValue !='' ">
+            <choose>
+                <when test = "tabValue == 1">
+                    AND DAY(fs_user.create_time) = DAY(NOW())
+                </when>
+                <when test = "tabValue == 2">
+                    AND DAY(fs_user_course_count.complete_watch_date) = DAY(NOW())
+                </when>
+                <when test = "tabValue == 3">
+                    AND fs_user_course_count.status = 3
+                </when>
+            </choose>
+        </if>
+        <if test="watchCourseType != null and watchCourseType !='' ">
+            <choose>
+                <when test = "watchCourseType == 1">
+                    AND fs_user_course_count.status = 3
+                </when>
+                <when test = "watchCourseType == 2">
+                    AND fs_user_course_count.status = 1
+                </when>
+                <when test = "watchCourseType == 3">
+                    AND fs_user_course_count.status = 2
+                </when>
+            </choose>
+        </if>
+        <if test="missCourseStatus != null and missCourseStatus !='' ">
+            <choose>
+                <when test = "missCourseStatus == 1">
+                    AND fs_user_course_count.miss_course_status = 1
+                </when>
+                <when test = "missCourseStatus == 2">
+                    AND fs_user_course_count.miss_course_status = 2
+                </when>
+            </choose>
+        </if>
+
+    </select>
+
+    <select id="getUserNumber" resultType="UserListCountVO">
+        SELECT
+            fs_user.`status` as status,
+            count( fs_user.user_id ) as num
+        FROM
+            fs_user
+                LEFT JOIN company_user ON fs_user.company_user_id = company_user.user_id
+        WHERE
+            company_user.parent_id = #{userId}
+        GROUP BY
+            fs_user.`status`
+    </select>
+
+    <select id="getCountAnswer" resultType="UserDetailsVO">
+        SELECT
+            (
+                SELECT
+                    count( DISTINCT log_id ) AS answerTime
+                FROM
+                    fs_course_answer_logs
+                        LEFT JOIN fs_user ON fs_user.user_id = fs_course_answer_logs.user_id
+                        LEFT JOIN company_user ON company_user.user_id = fs_user.company_user_id
+                WHERE
+                    company_user.parent_id = #{userId}
+                    <if test="dateTag != null and dateTag !='' ">
+                        <choose>
+                            <when test = "dateTag == '今天'">
+                                and to_days(fs_course_answer_logs.create_time) = to_days(now())
+                            </when>
+                            <when test = "dateTag == ' 昨天'">
+                                and to_days(now()) - to_days(fs_course_answer_logs.create_time) &lt;= 1
+                            </when>
+                            <when test = "dateTag == '前天'">
+                                and to_days(now()) - to_days(fs_course_answer_logs.create_time) &lt;= 2
+                            </when>
+                            <when test = "dateTag == '近七天'">
+                                and DATE_SUB(CURDATE(), INTERVAL 7 DAY) &lt;= date(fs_course_answer_logs.create_time)
+                            </when>
+                        </choose>
+                    </if>
+                GROUP BY
+                    fs_user.user_id
+                HAVING
+                    fs_user.user_id = #{fsUserId}
+            ),
+            (
+                SELECT
+                    count( DISTINCT log_id ) AS answerRightTime
+                FROM
+                    fs_course_answer_logs
+                        LEFT JOIN fs_user ON fs_user.user_id = fs_course_answer_logs.user_id
+                        LEFT JOIN company_user ON company_user.user_id = fs_user.company_user_id
+                WHERE
+                    company_user.parent_id = #{userId}
+                  AND fs_course_answer_logs.is_right = 1
+                <if test="dateTag != null and dateTag !='' ">
+                    <choose>
+                        <when test = "dateTag == '今天'">
+                            and to_days(fs_course_answer_logs.create_time) = to_days(now())
+                        </when>
+                        <when test = "dateTag == ' 昨天'">
+                            and to_days(now()) - to_days(fs_course_answer_logs.create_time) &lt;= 1
+                        </when>
+                        <when test = "dateTag == '前天'">
+                            and to_days(now()) - to_days(fs_course_answer_logs.create_time) &lt;= 2
+                        </when>
+                        <when test = "dateTag == '近七天'">
+                            and DATE_SUB(CURDATE(), INTERVAL 7 DAY) &lt;= date(fs_course_answer_logs.create_time)
+                        </when>
+                    </choose>
+                </if>
+                GROUP BY
+                    fs_user.user_id
+                HAVING
+                    fs_user.user_id = #{fsUserId}
+            );
+    </select>
+
+    <select id="getCountRedPacket" resultType="UserDetailsVO">
+        SELECT
+            count( DISTINCT log_id ) AS answerRedPacketTime,
+            sum( amount ) AS answerRedPacketAmount,
+            complete_watch_count,
+            watch_times,
+            fs_user.user_id
+        FROM
+            fs_course_red_packet_log
+                LEFT JOIN fs_user ON fs_user.user_id = fs_course_red_packet_log.user_id
+                LEFT JOIN company_user ON company_user.user_id = fs_user.company_user_id
+        WHERE
+            company_user.parent_id = #{userId}
+    </select>
+
+
+
 </mapper>