Bladeren bron

Merge remote-tracking branch 'origin/bjcz_his_scrm' into bjcz_his_scrm

yjwang 2 dagen geleden
bovenliggende
commit
728b616bf7
27 gewijzigde bestanden met toevoegingen van 703 en 59 verwijderingen
  1. 1 1
      fs-admin/src/main/resources/application.yml
  2. 23 0
      fs-company/src/main/java/com/fs/company/controller/qw/QwSopController.java
  3. 1 1
      fs-company/src/main/resources/application.yml
  4. 3 0
      fs-service/src/main/java/com/fs/company/domain/Company.java
  5. 9 1
      fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java
  6. 3 0
      fs-service/src/main/java/com/fs/company/vo/CompanyVO.java
  7. 17 0
      fs-service/src/main/java/com/fs/course/config/CourseConfig.java
  8. 1 1
      fs-service/src/main/java/com/fs/course/mapper/FsUserVideoFavoriteMapper.java
  9. 33 0
      fs-service/src/main/java/com/fs/course/service/ICourseProjectSalesBindService.java
  10. 249 0
      fs-service/src/main/java/com/fs/course/service/impl/CourseProjectSalesBindServiceImpl.java
  11. 10 0
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  12. 7 7
      fs-service/src/main/java/com/fs/course/service/impl/FsUserVideoFavoriteServiceImpl.java
  13. 6 7
      fs-service/src/main/java/com/fs/course/service/impl/FsUserVideoLikeServiceImpl.java
  14. 1 32
      fs-service/src/main/java/com/fs/course/service/impl/FsUserVideoServiceImpl.java
  15. 30 0
      fs-service/src/main/java/com/fs/course/support/CourseProjectSalesBindConstants.java
  16. 1 0
      fs-service/src/main/java/com/fs/enums/ExceptionCodeEnum.java
  17. 3 0
      fs-service/src/main/java/com/fs/his/mapper/FsIntegralGoodsMapper.java
  18. 3 0
      fs-service/src/main/java/com/fs/hisStore/mapper/FsIntegralGoodsScrmMapper.java
  19. 2 2
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreCartScrmMapper.java
  20. 4 0
      fs-service/src/main/java/com/fs/sop/domain/QwSop.java
  21. 5 0
      fs-service/src/main/java/com/fs/sop/mapper/QwSopMapper.java
  22. 104 0
      fs-service/src/main/resources/application-config-druid-jshz.yml
  23. 172 0
      fs-service/src/main/resources/application-druid-jshz.yml
  24. 6 1
      fs-service/src/main/resources/mapper/company/CompanyMapper.xml
  25. 1 0
      fs-user-app/src/main/java/com/fs/app/controller/TalentController.java
  26. 4 2
      fs-user-app/src/main/java/com/fs/app/controller/VideoController.java
  27. 4 4
      fs-user-app/src/main/java/com/fs/app/controller/store/ProductScrmController.java

+ 1 - 1
fs-admin/src/main/resources/application.yml

@@ -7,7 +7,7 @@ spring:
 #    active: dev
 #    active: druid-hdt
 #    active: druid-yzt
-    active: druid-bjczwh-test
+    active: druid-jshz
 #    active: druid-sft
 #    active: druid-fby
 #    active: dev

+ 23 - 0
fs-company/src/main/java/com/fs/company/controller/qw/QwSopController.java

@@ -12,6 +12,8 @@ import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.CloudHostUtils;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.company.domain.Company;
+import com.fs.company.service.ICompanyService;
 import com.fs.company.service.impl.CompanyDeptServiceImpl;
 import com.fs.course.mapper.FsUserCourseMapper;
 import com.fs.course.mapper.FsUserCourseVideoMapper;
@@ -75,6 +77,9 @@ public class QwSopController extends BaseController
     @Autowired
     private CompanyDeptServiceImpl companyDeptService;
 
+    @Autowired
+    private ICompanyService companyService;
+
     @Autowired
     private IQwUserService iQwUserService;
 
@@ -254,11 +259,13 @@ public class QwSopController extends BaseController
         qwSop.setCompanyId(companyId);
         qwSop.setCreateBy(loginUser.getUser().getNickName());
         qwSop.setCreateTime(sdf.format(new Date()));
+        fillCompanyLevel(qwSop, companyId);
         int count = qwSopService.insertQwSop(qwSop);
         if(count > 0){
             if(qwSop.getQwUserIds() != null){
                 updateTempVoiceInfo(qwSop);
             }
+            return AjaxResult.success(qwSop);
         }
         return toAjax(count);
 
@@ -278,10 +285,26 @@ public class QwSopController extends BaseController
             if(qwSop != null && qwSop.getQwUserIds() != null){
                 updateTempVoiceInfo(qwSop);
             }
+            LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+            Long companyId = loginUser.getCompany().getCompanyId();
+            fillCompanyLevel(qwSop, companyId);
+            sop.put("level", qwSop.getLevel());
         }
         return sop;
     }
 
+    private void fillCompanyLevel(QwSop qwSop, Long companyId) {
+        if (qwSop == null || companyId == null) {
+            return;
+        }
+        Company company = companyService.selectCompanyById(companyId);
+        Integer level = company != null && company.getLevel() != null ? company.getLevel() : 0;
+        qwSop.setLevel(level);
+        if (level == 1) {
+            qwSop.setIsRating(1);
+        }
+    }
+
 
     /**
      * 暂停企微sop

+ 1 - 1
fs-company/src/main/resources/application.yml

@@ -13,4 +13,4 @@ spring:
 #    active: druid-myhk
 #    active: druid-sft
 #    active: dev-jnlzjk
-#    active: dev-yjb
+#    active: druid-jshz

+ 3 - 0
fs-service/src/main/java/com/fs/company/domain/Company.java

@@ -141,6 +141,9 @@ public class Company extends BaseEntity
     // 控制休息提示是否打开要暂停  0-关闭 1-打开 null-默认打开
     private Integer isOpenRestReminder;
 
+    /** 是否强制评级 0否 1是,同步控制该公司下所有SOP */
+    private Integer level;
+
     @TableField(exist = false)
     private List<Long> ids;
 

+ 9 - 1
fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java

@@ -39,6 +39,7 @@ import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
 import com.fs.live.domain.LiveOrder;
 import com.fs.live.mapper.LiveOrderMapper;
 import com.fs.live.service.ILiveService;
+import com.fs.sop.mapper.QwSopMapper;
 import com.fs.store.config.CompanyMenuConfig;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
@@ -141,6 +142,9 @@ public class CompanyServiceImpl implements ICompanyService
     @Autowired
     private ICompanyConfigService companyConfigService;
 
+    @Autowired
+    private QwSopMapper qwSopMapper;
+
 
     @Override
     public List<CompanyVO> liveShowList(CompanyParam param) {
@@ -598,7 +602,11 @@ public class CompanyServiceImpl implements ICompanyService
         if(company.isUpdateMiniApp()){
             bindMiniApp(company);
         }
-        return companyMapper.updateCompany(company);
+        int rows = companyMapper.updateCompany(company);
+        if (rows > 0 && company.getLevel() != null && company.getCompanyId() != null) {
+            qwSopMapper.updateIsRatingByCompanyId(company.getCompanyId(), company.getLevel());
+        }
+        return rows;
     }
     // 绑定小程序
     public void bindMiniApp(Company company){

+ 3 - 0
fs-service/src/main/java/com/fs/company/vo/CompanyVO.java

@@ -108,6 +108,9 @@ public class CompanyVO implements Serializable
 
     // 控制休息提示是否打开要暂停  0-关闭 1-打开 null-默认打开
     private Integer isOpenRestReminder;
+
+    /** 是否强制评级 0否 1是 */
+    private Integer level;
     //主程序
    @TableField(exist = false)
    private String masterAppName;

+ 17 - 0
fs-service/src/main/java/com/fs/course/config/CourseConfig.java

@@ -6,6 +6,7 @@ import lombok.Data;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.time.LocalTime;
+import java.util.Date;
 import java.util.List;
 
 @Data
@@ -102,6 +103,22 @@ public class CourseConfig implements Serializable {
     // 控制休息提示是否打开 默认打开 0-关闭 1-打开
     private Integer isOpenRestReminder;
 
+    /**
+     * 是否开启按项目自动看课重粉限制(关闭则不限制)
+     */
+    private Boolean projectRepeatLimitEnabled;
+
+    /**
+     * 按项目重粉限制生效时间,此时间之后的看课行为才受限
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date projectRepeatLimitEffectiveTime;
+
+    /**
+     * 先导课是否豁免重粉限制,默认 true
+     */
+    private Boolean pilotCourseSkipRepeatLimit;
+
 
     @Data
     public static class DisabledTimeVo{

+ 1 - 1
fs-service/src/main/java/com/fs/course/mapper/FsUserVideoFavoriteMapper.java

@@ -76,7 +76,7 @@ public interface FsUserVideoFavoriteMapper
 
 
     @Select("<script>" +
-            "select video_id, ifnull(count(1), 0) > 0 as favorited " +
+            "select video_id, ifnull(count(1), 0) > 0 as favorite " +
             "from fs_user_video_favorite " +
             "where video_id in " +
             "<foreach item='videoId' collection='videoIds' open='(' separator=',' close=')'>" +

+ 33 - 0
fs-service/src/main/java/com/fs/course/service/ICourseProjectSalesBindService.java

@@ -0,0 +1,33 @@
+package com.fs.course.service;
+
+import com.fs.common.core.domain.R;
+import com.fs.course.config.CourseConfig;
+import com.fs.course.param.FsUserCourseVideoAddKfUParam;
+
+/**
+ * 按项目看课销售绑定:isAddKf 入口同步校验与首次绑定
+ */
+public interface ICourseProjectSalesBindService {
+
+    /**
+     * 全局开关开启且已到生效时间
+     */
+    boolean isLimitActive(CourseConfig config);
+
+    /**
+     * 加载 course.config
+     */
+    CourseConfig loadCourseConfig();
+
+    /**
+     * 是否先导课(豁免重粉限制)
+     */
+    boolean isPilotCourse(Long videoId, CourseConfig config);
+
+    /**
+     * 同步校验并在首次进入时写入 fs_user_company_qw。
+     *
+     * @return null 表示通过,否则为拦截响应
+     */
+    R checkAndBind(FsUserCourseVideoAddKfUParam param);
+}

+ 249 - 0
fs-service/src/main/java/com/fs/course/service/impl/CourseProjectSalesBindServiceImpl.java

@@ -0,0 +1,249 @@
+package com.fs.course.service.impl;
+
+import cn.hutool.json.JSONUtil;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.redis.RedisCache;
+import com.fs.common.utils.StringUtils;
+import com.fs.course.config.CourseConfig;
+import com.fs.course.domain.FsUserCompanyQw;
+import com.fs.course.domain.FsUserCourse;
+import com.fs.course.domain.FsUserCourseVideo;
+import com.fs.course.mapper.FsUserCompanyQwMapper;
+import com.fs.course.mapper.FsUserCourseMapper;
+import com.fs.course.mapper.FsUserCourseVideoMapper;
+import com.fs.course.param.FsUserCourseVideoAddKfUParam;
+import com.fs.course.service.ICourseProjectSalesBindService;
+import com.fs.course.support.CourseProjectEquivalence;
+import com.fs.course.support.CourseProjectSalesBindConstants;
+import com.fs.enums.ExceptionCodeEnum;
+import com.fs.system.service.ISysConfigService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+@Service
+public class CourseProjectSalesBindServiceImpl implements ICourseProjectSalesBindService {
+
+    @Autowired
+    private ISysConfigService configService;
+    @Autowired
+    private RedisCache redisCache;
+    @Autowired
+    private FsUserCompanyQwMapper fsUserCompanyQwMapper;
+    @Autowired
+    private FsUserCourseVideoMapper fsUserCourseVideoMapper;
+    @Autowired
+    private FsUserCourseMapper fsUserCourseMapper;
+
+    @Override
+    public boolean isLimitActive(CourseConfig config) {
+        if (config == null || !Boolean.TRUE.equals(config.getProjectRepeatLimitEnabled())) {
+            return false;
+        }
+        Date effectiveTime = config.getProjectRepeatLimitEffectiveTime();
+        if (effectiveTime == null) {
+            return false;
+        }
+        return !new Date().before(effectiveTime);
+    }
+
+    @Override
+    public CourseConfig loadCourseConfig() {
+        String json = configService.selectConfigByKey("course.config");
+        if (StringUtils.isEmpty(json)) {
+            return new CourseConfig();
+        }
+        return JSONUtil.toBean(json, CourseConfig.class);
+    }
+
+    @Override
+    public boolean isPilotCourse(Long videoId, CourseConfig config) {
+        if (videoId == null) {
+            return false;
+        }
+        if (config != null && Boolean.FALSE.equals(config.getPilotCourseSkipRepeatLimit())) {
+            return false;
+        }
+        FsUserCourseVideo video = getVideoCached(videoId);
+        if (video == null) {
+            return false;
+        }
+        if (video.getIsFirst() != null && video.getIsFirst() == 1) {
+            return true;
+        }
+        return StringUtils.isNotEmpty(video.getTitle()) && video.getTitle().contains("先导课");
+    }
+
+    @Override
+    public R checkAndBind(FsUserCourseVideoAddKfUParam param) {
+        if (param == null || param.getUserId() == null || param.getCompanyUserId() == null) {
+            return null;
+        }
+
+        CourseConfig config = loadCourseConfig();
+        if (!isLimitActive(config)) {
+            return null;
+        }
+
+        if (isPilotCourse(param.getVideoId(), config)) {
+            log.debug("按项目重粉限制跳过先导课 userId={}, videoId={}", param.getUserId(), param.getVideoId());
+            return null;
+        }
+
+        Long projectId = resolveCourseProjectId(param);
+        if (projectId == null || projectId == 0L) {
+            return null;
+        }
+
+        List<Long> equivalentProjectIds = CourseProjectEquivalence.equivalentProjectIds(projectId);
+        if (CollectionUtils.isEmpty(equivalentProjectIds)) {
+            return null;
+        }
+
+        Long currentCompanyUserId = param.getCompanyUserId();
+        FsUserCompanyQw matchedBind = null;
+
+        for (Long equivalentProjectId : equivalentProjectIds) {
+            FsUserCompanyQw existBind = getBindRecord(param.getUserId(), equivalentProjectId);
+            if (existBind == null || existBind.getCompanyUserId() == null) {
+                continue;
+            }
+            if (!existBind.getCompanyUserId().equals(currentCompanyUserId)) {
+                log.info("按项目重粉限制拦截 userId={}, projectId={}, boundSales={}, currentSales={}, firstBindTime={}",
+                        param.getUserId(), equivalentProjectId, existBind.getCompanyUserId(),
+                        currentCompanyUserId, existBind.getFirstBindTime());
+                return R.error(ExceptionCodeEnum.USER_PROJECT_OTHER_SALES_BOUND.getCode(),
+                        ExceptionCodeEnum.USER_PROJECT_OTHER_SALES_BOUND.getDescription());
+            }
+            matchedBind = existBind;
+        }
+
+        if (matchedBind != null) {
+            for (Long equivalentProjectId : equivalentProjectIds) {
+                cacheBind(param.getUserId(), equivalentProjectId, matchedBind.getCompanyUserId());
+            }
+            return null;
+        }
+
+        return tryFirstBind(param, projectId, currentCompanyUserId);
+    }
+
+    private R tryFirstBind(FsUserCourseVideoAddKfUParam param, Long projectId, Long currentCompanyUserId) {
+        Long qwUserId = parseQwUserId(param.getQwUserId());
+        try {
+            fsUserCompanyQwMapper.insertOrUpdate(
+                    param.getUserId(),
+                    projectId,
+                    qwUserId,
+                    currentCompanyUserId,
+                    param.getCompanyId(),
+                    param.getQwExternalId(),
+                    param.getCourseId(),
+                    param.getVideoId()
+            );
+        } catch (Exception e) {
+            log.error("按项目销售绑定写入失败 userId={}, projectId={}", param.getUserId(), projectId, e);
+            return null;
+        }
+
+        FsUserCompanyQw bind = fsUserCompanyQwMapper.selectByUserAndProject(param.getUserId(), projectId);
+        if (bind != null && bind.getCompanyUserId() != null
+                && !bind.getCompanyUserId().equals(currentCompanyUserId)) {
+            log.info("按项目重粉限制并发拦截 userId={}, projectId={}, boundSales={}, currentSales={}, firstBindTime={}",
+                    param.getUserId(), projectId, bind.getCompanyUserId(), currentCompanyUserId, bind.getFirstBindTime());
+            return R.error(ExceptionCodeEnum.USER_PROJECT_OTHER_SALES_BOUND.getCode(),
+                    ExceptionCodeEnum.USER_PROJECT_OTHER_SALES_BOUND.getDescription());
+        }
+
+        cacheBind(param.getUserId(), projectId, currentCompanyUserId);
+        log.info("按项目销售首次绑定 userId={}, projectId={}, companyUserId={}, firstBindTime={}",
+                param.getUserId(), projectId, currentCompanyUserId,
+                bind != null ? bind.getFirstBindTime() : null);
+        return null;
+    }
+
+    private FsUserCompanyQw getBindRecord(Long userId, Long projectId) {
+        Long cachedCompanyUserId = redisCache.getCacheObject(CourseProjectSalesBindConstants.bindCacheKey(userId, projectId));
+        if (cachedCompanyUserId != null) {
+            FsUserCompanyQw cached = new FsUserCompanyQw();
+            cached.setFsUserId(userId);
+            cached.setProjectId(projectId);
+            cached.setCompanyUserId(cachedCompanyUserId);
+            return cached;
+        }
+
+        FsUserCompanyQw existBind = fsUserCompanyQwMapper.selectByUserAndProject(userId, projectId);
+        if (existBind != null && existBind.getCompanyUserId() != null) {
+            cacheBind(userId, projectId, existBind.getCompanyUserId());
+        }
+        return existBind;
+    }
+
+    private void cacheBind(Long userId, Long projectId, Long companyUserId) {
+        if (userId == null || projectId == null || companyUserId == null) {
+            return;
+        }
+        redisCache.setCacheObject(
+                CourseProjectSalesBindConstants.bindCacheKey(userId, projectId),
+                companyUserId,
+                CourseProjectSalesBindConstants.BIND_CACHE_DAYS,
+                TimeUnit.DAYS
+        );
+    }
+
+    private Long resolveCourseProjectId(FsUserCourseVideoAddKfUParam param) {
+        if (param.getCourseId() != null) {
+            FsUserCourse course = fsUserCourseMapper.selectFsUserCourseByCourseId(param.getCourseId());
+            if (course != null && course.getProject() != null && course.getProject() != 0L) {
+                return course.getProject();
+            }
+        }
+        if (param.getVideoId() != null) {
+            FsUserCourseVideo video = getVideoCached(param.getVideoId());
+            if (video != null && video.getCourseId() != null) {
+                FsUserCourse course = fsUserCourseMapper.selectFsUserCourseByCourseId(video.getCourseId());
+                if (course != null && course.getProject() != null && course.getProject() != 0L) {
+                    return course.getProject();
+                }
+            }
+        }
+        return 0L;
+    }
+
+    private FsUserCourseVideo getVideoCached(Long videoId) {
+        String cacheKey = CourseProjectSalesBindConstants.videoMetaCacheKey(videoId);
+        FsUserCourseVideo cached = redisCache.getCacheObject(cacheKey);
+        if (cached != null) {
+            return cached;
+        }
+        FsUserCourseVideo video = fsUserCourseVideoMapper.selectFsUserCourseVideoByVideoId(videoId);
+        if (video != null) {
+            FsUserCourseVideo meta = new FsUserCourseVideo();
+            meta.setVideoId(video.getVideoId());
+            meta.setCourseId(video.getCourseId());
+            meta.setTitle(video.getTitle());
+            meta.setIsFirst(video.getIsFirst());
+            redisCache.setCacheObject(cacheKey, meta,
+                    CourseProjectSalesBindConstants.VIDEO_META_CACHE_HOURS, TimeUnit.HOURS);
+            return meta;
+        }
+        return null;
+    }
+
+    private Long parseQwUserId(String qwUserId) {
+        if (StringUtils.isEmpty(qwUserId)) {
+            return null;
+        }
+        try {
+            return Long.parseLong(qwUserId);
+        } catch (NumberFormatException e) {
+            return null;
+        }
+    }
+}

+ 10 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -46,6 +46,7 @@ import com.fs.course.param.newfs.UserCourseVideoPageParam;
 import com.fs.course.service.IFsCourseLinkService;
 import com.fs.course.service.IFsUserCompanyBindService;
 import com.fs.course.service.IFsUserCompanyUserService;
+import com.fs.course.service.ICourseProjectSalesBindService;
 import com.fs.course.service.IFsUserCourseVideoService;
 import com.fs.course.utils.H5WxUserWatchRedisUtil;
 import com.fs.course.param.newfs.*;
@@ -266,6 +267,9 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
     @Autowired
     private CourseRepeatByProjectMqProducer courseRepeatByProjectMqProducer;
 
+    @Autowired
+    private ICourseProjectSalesBindService courseProjectSalesBindService;
+
     @Autowired
     private SysDictDataMapper sysDictDataMapper;
 
@@ -820,6 +824,12 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
         String noRegisterMsg = "由于您还未完成注册,请联系伴学助手完成注册即可观看!";
         //非独属链接提示
         String noMemberMsg = "此链接已被绑定,请联系伴学助手领取您的专属链接,专属链接请勿分享哦!";
+
+        R bindCheck = courseProjectSalesBindService.checkAndBind(param);
+        if (bindCheck != null) {
+            return bindCheck;
+        }
+
         try {
             courseRepeatByProjectMqProducer.submitCheck(param);
         } catch (Exception e) {

+ 7 - 7
fs-service/src/main/java/com/fs/course/service/impl/FsUserVideoFavoriteServiceImpl.java

@@ -4,7 +4,6 @@ import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 import com.fs.common.core.domain.R;
-import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.DateUtils;
 import lombok.Synchronized;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -26,7 +25,7 @@ public class FsUserVideoFavoriteServiceImpl implements IFsUserVideoFavoriteServi
 {
     @Autowired
     private FsUserVideoFavoriteMapper fsUserVideoFavoriteMapper;
-    @Autowired(required=false)
+    @Autowired(required = false)
     private RedisTemplate<String, Boolean> redisTemplate;
 
     /**
@@ -104,14 +103,17 @@ public class FsUserVideoFavoriteServiceImpl implements IFsUserVideoFavoriteServi
     }
     private static final String FAVORITE_KEY_PREFIX = "favorite:video:";
     private static final String NO_FAVORITE_KEY_PREFIX = "nofavorite:video:";
+
     @Override
     public R checkFavorite(Long videoId, long userId) {
         String key = FAVORITE_KEY_PREFIX + videoId + ":user:" + userId;
         Boolean hasFavorite = redisTemplate.opsForValue().get(key);
         if (hasFavorite != null && hasFavorite) {
-            return R.ok().put("isFavorite",1);
-        }else {
-            return fsUserVideoFavoriteMapper.checkFavorite(videoId, userId) > 0 ? R.ok().put("isFavorite", 1) : R.error().put("isFavorite", 0);
+            return R.ok().put("isFavorite", 1);
+        } else {
+            return fsUserVideoFavoriteMapper.checkFavorite(videoId, userId) > 0
+                    ? R.ok().put("isFavorite", 1)
+                    : R.error().put("isFavorite", 0);
         }
     }
 
@@ -131,8 +133,6 @@ public class FsUserVideoFavoriteServiceImpl implements IFsUserVideoFavoriteServi
     public void deleteFavorite(Long videoId, long userId) {
         String key = FAVORITE_KEY_PREFIX + videoId + ":user:" + userId;
         redisTemplate.delete(key);
-
-        // 将取消点赞记录写入Redis
         String unlikeKey = NO_FAVORITE_KEY_PREFIX + videoId + ":user:" + userId;
         redisTemplate.opsForValue().set(unlikeKey, true, 1, TimeUnit.DAYS);
     }

+ 6 - 7
fs-service/src/main/java/com/fs/course/service/impl/FsUserVideoLikeServiceImpl.java

@@ -4,7 +4,6 @@ import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 import com.fs.common.core.domain.R;
-import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.DateUtils;
 import lombok.Synchronized;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -106,14 +105,17 @@ public class FsUserVideoLikeServiceImpl implements IFsUserVideoLikeService
 
     private static final String LIKE_KEY_PREFIX = "like:video:";
     private static final String UNLIKE_KEY_PREFIX = "unlike:video:";
+
     @Override
     public R checkLike(Long videoId, long userId) {
         String key = LIKE_KEY_PREFIX + videoId + ":user:" + userId;
         Boolean hasLiked = redisTemplate.opsForValue().get(key);
         if (hasLiked != null && hasLiked) {
-            return R.ok().put("isLike",1);
-        }else {
-            return fsUserVideoLikeMapper.checkLike(videoId,userId)>0?R.ok().put("isLike",1):R.error().put("isLike",0);
+            return R.ok().put("isLike", 1);
+        } else {
+            return fsUserVideoLikeMapper.checkLike(videoId, userId) > 0
+                    ? R.ok().put("isLike", 1)
+                    : R.error().put("isLike", 0);
         }
     }
 
@@ -131,11 +133,8 @@ public class FsUserVideoLikeServiceImpl implements IFsUserVideoLikeService
     @Transactional
     @Synchronized
     public void unlikeVideo(Long videoId, long userId) {
-
         String key = LIKE_KEY_PREFIX + videoId + ":user:" + userId;
         redisTemplate.delete(key);
-
-        // 将取消点赞记录写入Redis
         String unlikeKey = UNLIKE_KEY_PREFIX + videoId + ":user:" + userId;
         redisTemplate.opsForValue().set(unlikeKey, true, 1, TimeUnit.DAYS);
     }

+ 1 - 32
fs-service/src/main/java/com/fs/course/service/impl/FsUserVideoServiceImpl.java

@@ -210,36 +210,30 @@ public class FsUserVideoServiceImpl implements IFsUserVideoService {
         if (list != null && !list.isEmpty()) {
             List<Long> videoIds = list.stream().map(vo -> Long.parseLong(vo.getId())).collect(Collectors.toList());
 
-            // 批量查询Redis中的点赞信息
             List<String> likeKeys = videoIds.stream()
                     .map(videoId -> LIKE_KEY_PREFIX + videoId + ":user:" + userId)
                     .collect(Collectors.toList());
             List<Boolean> redisLikes = redisTemplate.opsForValue().multiGet(likeKeys);
 
-            // 批量查询Redis中的收藏信息
             List<String> favoriteKeys = videoIds.stream()
                     .map(videoId -> FAVORITE_KEY_PREFIX + videoId + ":user:" + userId)
                     .collect(Collectors.toList());
             List<Boolean> redisFavorites = redisTemplate.opsForValue().multiGet(favoriteKeys);
 
-            // 缓存未命中的视频ID列表
             List<Long> missingLikeVideoIds = new ArrayList<>();
             List<Long> missingFavoriteVideoIds = new ArrayList<>();
 
-            // 设置点赞和收藏信息
             for (int i = 0; i < list.size(); i++) {
                 FsUserVideoListUVO vo = list.get(i);
                 Long videoId = Long.parseLong(vo.getId());
                 Integer commentCount = fsUserVideoCommentMapper.selectCommentCountByVideos(videoId);
                 vo.setSmsNum(commentCount);
-                // 优先使用Redis中的点赞数据
                 if (redisLikes != null && redisLikes.get(i) != null) {
                     vo.setLike(Boolean.TRUE.equals(redisLikes.get(i)) ? 1 : 0);
                 } else {
                     missingLikeVideoIds.add(videoId);
                 }
 
-                // 优先使用Redis中的收藏数据
                 if (redisFavorites != null && redisFavorites.get(i) != null) {
                     vo.setFavorite(Boolean.TRUE.equals(redisFavorites.get(i)) ? 1 : 0);
                 } else {
@@ -247,7 +241,6 @@ public class FsUserVideoServiceImpl implements IFsUserVideoService {
                 }
             }
 
-            // 查询数据库中的点赞和收藏信息
             if (!missingLikeVideoIds.isEmpty()) {
                 Map<Long, VideoLikeStatusDTO> likeMap = fsUserVideoLikeMapper.checkLikes(missingLikeVideoIds, userId);
                 for (FsUserVideoListUVO vo : list) {
@@ -416,16 +409,9 @@ public class FsUserVideoServiceImpl implements IFsUserVideoService {
     @Override
     public List<FsUserVideoListUVO> selectFsUserVideoListUVOByUser(Long talentId, boolean oneSelf, Long userId) {
         List<FsUserVideoListUVO> list = fsUserVideoMapper.selectFsUserVideoListUVOByUser(talentId, oneSelf);
-        /*if (param != null && param.getUserId() != null) {
-            Long userId = param.getUserId();
+        if (userId != null && !list.isEmpty()) {
             list = selectLikesAndFavorites(userId, list);
-        }*/
-        // 当前视频是否被自己喜欢或收藏
-        if (list.size() > 0) {
-            selectLikesAndFavoritesByMyself(list,userId);
         }
-
-
         return list;
     }
 
@@ -466,23 +452,6 @@ public class FsUserVideoServiceImpl implements IFsUserVideoService {
         return R.ok();
     }
 
-    private void selectLikesAndFavoritesByMyself(List<FsUserVideoListUVO> list, long userId) {
-        List<Long> videoIds = list.stream().map(vo -> Long.parseLong(vo.getId())).collect(Collectors.toList());
-        Map<Long, VideoLikeStatusDTO> likeMaps = fsUserVideoLikeMapper.checkLikes(videoIds, userId);
-        Map<Long, VideoFavoriteStatusDTO> FavoriteMaps = fsUserVideoFavoriteMapper.checkFavorites(videoIds, userId);
-        long videoId;
-        for (FsUserVideoListUVO entity : list) {
-            videoId = Long.parseLong(entity.getId());
-            if (likeMaps.containsKey(videoId)) {
-                entity.setLike(1);
-            }
-            if (FavoriteMaps.containsKey(videoId)) {
-                entity.setFavorite(1);
-            }
-        }
-        fillTalentFollowInfo(userId, list);
-    }
-
     public static String updateUrlPrefix(String url) {
         final String oldPrefix = "https://obs.ylrztop.com";
         final String newPrefix = "https://rtobs.ylrztop.com";

+ 30 - 0
fs-service/src/main/java/com/fs/course/support/CourseProjectSalesBindConstants.java

@@ -0,0 +1,30 @@
+package com.fs.course.support;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 按项目看课销售绑定 Redis 缓存常量
+ */
+public final class CourseProjectSalesBindConstants {
+
+    /** 用户-项目绑定销售缓存:course:project:sales:bind:{userId}:{projectId} -> companyUserId */
+    public static final String BIND_CACHE_KEY_PREFIX = "course:project:sales:bind:";
+
+    /** 视频元数据缓存:course:project:sales:video:{videoId} */
+    public static final String VIDEO_META_CACHE_KEY_PREFIX = "course:project:sales:video:";
+
+    public static final int BIND_CACHE_DAYS = 7;
+
+    public static final int VIDEO_META_CACHE_HOURS = 1;
+
+    private CourseProjectSalesBindConstants() {
+    }
+
+    public static String bindCacheKey(Long userId, Long projectId) {
+        return BIND_CACHE_KEY_PREFIX + userId + ":" + projectId;
+    }
+
+    public static String videoMetaCacheKey(Long videoId) {
+        return VIDEO_META_CACHE_KEY_PREFIX + videoId;
+    }
+}

+ 1 - 0
fs-service/src/main/java/com/fs/enums/ExceptionCodeEnum.java

@@ -26,6 +26,7 @@ public enum ExceptionCodeEnum {
     WATCH_LATEST_COURSE(482, "请观看最新的课程项目"),
     EXCEED_COURSE_LIMIT(483, "超过项目看课数量限制"),
     ALREADY_WATCHED_OTHER_SALES_COURSE(484, "已看过其他销售分享的此课程,不能重复观看"),
+    USER_PROJECT_OTHER_SALES_BOUND(485, "您已在其他伴学助手处观看过该项目课程,请联系原助手继续学习"),
 
     // ============ 参数相关错误 (500-519) ============
     PARAM_ERROR(501, "参数错误!"),

+ 3 - 0
fs-service/src/main/java/com/fs/his/mapper/FsIntegralGoodsMapper.java

@@ -85,6 +85,9 @@ public interface FsIntegralGoodsMapper
             "<if test = 'maps.goodsType != null and maps.goodsType != 0     '> " +
             "and g.goods_type = #{maps.goodsType}  " +
             "</if>" +
+            "<if test = 'maps.keyword != null and maps.keyword != \"\"'> " +
+            "and g.goods_name like CONCAT('%',#{maps.keyword},'%') " +
+            "</if>" +
             " order by g.goods_id desc "+
             "</script>"})
     List<FsIntegralGoodsListUVO> selectFsIntegralGoodsListUVO(@Param("maps")FsIntegralGoodsListUParam param);

+ 3 - 0
fs-service/src/main/java/com/fs/hisStore/mapper/FsIntegralGoodsScrmMapper.java

@@ -80,6 +80,9 @@ public interface FsIntegralGoodsScrmMapper
             "<if test = 'maps.goodsType != null and maps.goodsType != 0     '> " +
             "and g.goods_type = #{maps.goodsType}  " +
             "</if>" +
+            "<if test = 'maps.keyword != null and maps.keyword != \"\"'> " +
+            "and g.goods_name like CONCAT('%',#{maps.keyword},'%') " +
+            "</if>" +
             " order by g.goods_id desc "+
             "</script>"})
     List<FsIntegralGoodsListUVO> selectFsIntegralGoodsListUVO(@Param("maps")FsIntegralGoodsListUParam param);

+ 2 - 2
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreCartScrmMapper.java

@@ -101,10 +101,10 @@ public interface FsStoreCartScrmMapper
     void updateIsPay(String cartIds);
 
 
-    @Select("select ifnull(sum(c.cart_num),0) from fs_store_cart_scrm c inner join fs_store_product_scrm p on p.product_id=c.product_id inner join fs_store_product_attr_value_scrm v on v.id=c.product_attr_value_id where c.is_pay=0 and c.is_del=0 and c.is_buy=0 and p.is_show=1 and p.is_del=0 and c.user_id= #{userId}")
+    @Select("select count(*) from fs_store_cart_scrm c inner join fs_store_product_scrm p on p.product_id=c.product_id inner join fs_store_product_attr_value_scrm v on v.id=c.product_attr_value_id where c.is_pay=0 and c.is_del=0 and c.is_buy=0 and p.is_show=1 and p.is_del=0 and c.user_id= #{userId}")
     Integer selectFsStoreCartCountByUserId(long userId);
     @Select({"<script> " +
-            "select ifnull(sum(c.cart_num),0) from fs_store_cart_scrm c  " +
+            "select count(*) from fs_store_cart_scrm c  " +
             "where c.is_pay=0 and c.is_del=0 and c.is_buy=0 " +
             "<if test = 'maps.userId != null     '> " +
             "and c.user_id =#{maps.userId} " +

+ 4 - 0
fs-service/src/main/java/com/fs/sop/domain/QwSop.java

@@ -161,6 +161,10 @@ public class QwSop implements Serializable
     @TableField(exist = false)
     private List<String> userIds = new ArrayList<>();
 
+    /** 公司是否强制评级 0否 1是 */
+    @TableField(exist = false)
+    private Integer level;
+
 
     private Integer pageNum;
     private Integer pageSize;

+ 5 - 0
fs-service/src/main/java/com/fs/sop/mapper/QwSopMapper.java

@@ -20,6 +20,7 @@ import com.fs.qw.result.QwFilterSopCustomersResult;
 import com.fs.qw.vo.QwSopRuleTimeVO;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
 import org.springframework.stereotype.Repository;
 
 import java.time.LocalDate;
@@ -442,4 +443,8 @@ public interface QwSopMapper extends BaseMapper<QwSop> {
     void updateSopGroupIds(@Param("id") String id, @Param("chatId") String chatId);
 
     void updateSkipSopJson(@Param("sopParamStr") String sopParamStr,@Param("id") String id);
+
+    @DataSource(DataSourceType.SOP)
+    @Update("update qw_sop set is_rating = #{isRating} where company_id = #{companyId}")
+    int updateIsRatingByCompanyId(@Param("companyId") Long companyId, @Param("isRating") Integer isRating);
 }

+ 104 - 0
fs-service/src/main/resources/application-config-druid-jshz.yml

@@ -0,0 +1,104 @@
+baidu:
+  token: 12313231232
+  back-domain: https://www.xxxx.com
+#配置
+logging:
+  level:
+    com.fs: debug
+    org.springframework.web: INFO
+    com.github.binarywang.demo.wx.cp: DEBUG
+    me.chanjar.weixin: DEBUG
+wx:
+  open:
+    appId:
+    secret:
+  miniapp:
+    configs:
+      - appid:   #京视杭州
+        secret:  #京视杭州
+        token: Ncbnd7lJvkripxxna6NAWCxCrvC
+        aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
+        msgDataFormat: JSON
+  cp:
+    corpId:  #企业ID京视杭州
+    appConfigs:
+      - agentId:       #京视杭州
+        secret:  #京视杭州
+        token: PPKOdAlCoMO
+        aesKey: PKvaxtpSv8NGpfTDm7VUHIK8Wok2ESyYX24qpXJAdMP
+  pay:
+    appId:  #微信公众号或者小程序等的appid
+    mchId:  #微信支付商户号
+    mchKey:  #微信支付商户密钥
+    subAppId:  #服务商模式下的子商户公众账号ID
+    subMchId:  #服务商模式下的子商户号
+    keyPath: c:\\cert\\apiclient_cert.p12 # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)
+    notifyUrl: https://userapp.his.runtzh.com/app/wxpay/wxPayNotify
+  mp:
+    useRedis: false
+    redisConfig:
+      host: 127.0.0.1
+      port: 6379
+      timeout: 2000
+    configs:
+      - appId: wxe704b34112659eb1 # 第一个公众号的appid  //公众号名称:京视杭州
+        secret: eaf3a1f3b326bf12c6b1a03e19faca6e # 公众号的appsecret--京视杭州
+        token: PPKOdAlCoMO # 接口配置里的Token值
+        aesKey: Eswa6VjwtVMCcw03qZy6fWllgrv5aytIA1SZPEU0kU2 # 接口配置里的EncodingAESKey值
+aifabu:  #爱链接
+  appKey: 7b471be905ab17e00f3b858c6710dd117601d008
+watch:
+  watchUrl: watch.ylrzcloud.com/prod-api
+  #  account: tcloud
+  #  password: mdf-m2h_6yw2$hq
+  account1: ccif #866655060138751
+  password1: cp-t5or_6xw7$mt
+  account2: tcloud #rt500台
+  password2: mdf-m2h_6yw2$hq
+  account3: whr
+  password3: v9xsKuqn_$d2y
+
+fs :
+  commonApi:
+  h5CommonApi:
+  jwt:
+    # 加密秘钥
+    secret: jshz-bcdefg
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
+nuonuo:
+  key: 10924508
+  secret: A2EB20764D304D16
+
+# 存储捅配置
+tencent_cloud_config:
+  secret_id: AKIDLl1tguyrZ6QddTCi2BLJ4e3OXVIuJVVK
+  secret_key: g9R6kLrMp8EDzXszylLispiQxHRN6cw5
+  bucket: jshz-1323137866
+  app_id: 1323137866
+  region: ap-chongqing
+  proxy: jshz
+tmp_secret_config:
+  secret_id: AKIDCj7NSNAovtqeJpBau8GZ4CGB71thXIxX
+  secret_key: lTB5zwqqz7CNhzDOWivFWedgfTBgxgBT
+  bucket: fs-1319721001
+  app_id: 1319721001
+  region: ap-chongqing
+  proxy: fs
+cloud_host:
+  company_name: 京视杭州
+  projectCode: JSHZ
+  spaceName: jshz-2114522511
+  volcengineUrl: https://jshzvolcengine.ylrztop.com
+headerImg:
+  imgUrl:
+
+ipad:
+  ipadUrl: http://aipad.moonxiang.com
+  aiApi: http://49.232.181.28:3000/api
+  voiceApi: http://81.70.193.34:8667
+  commonApi: http://81.70.193.34:7771
+wx_miniapp_temp:
+  pay_order_temp_id:
+  inquiry_temp_id:

+ 172 - 0
fs-service/src/main/resources/application-druid-jshz.yml

@@ -0,0 +1,172 @@
+# 数据源配置
+spring:
+    profiles:
+        include: config-druid-jshz,common
+    # redis 配置
+    redis:
+        host: 10.0.14.17
+        port: 6379
+        # 数据库索引
+        database: 0
+        username: root
+        # 密码
+        password: 'Kel6GdXBrMm&p&E9'
+        # 连接超时时间
+        timeout: 10s
+        lettuce:
+            pool:
+                # 连接池中的最小空闲连接
+                min-idle: 0
+                # 连接池中的最大空闲连接
+                max-idle: 8
+                # 连接池的最大数据库连接数
+                max-active: 100
+                # #连接池最大阻塞等待时间(使用负值表示没有限制)
+                max-wait: -1ms
+    datasource:
+#        clickhouse:
+#            type: com.alibaba.druid.pool.DruidDataSource
+#            driverClassName: com.clickhouse.jdbc.ClickHouseDriver
+#            url: jdbc:clickhouse://1.14.104.71:8123/sop_test?compress=0&use_server_time_zone=true&use_client_time_zone=false&timezone=Asia/Shanghai
+#            username: rt_2024
+#            password: Yzx_19860213
+#            initialSize: 10
+#            maxActive: 100
+#            minIdle: 10
+#            maxWait: 6000
+        mysql:
+            type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: com.mysql.cj.jdbc.Driver
+            druid:
+                # 主库数据源
+                master:
+                  url: jdbc:mysql://10.0.14.15:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                  username: root
+                  password: 'Kel6GdXBrMm&p&E9'
+                # 从库数据源
+                slave:
+                    # 从数据源开关/默认关闭
+                    enabled: true
+                    url: jdbc:mysql://10.0.14.15:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: 'Kel6GdXBrMm&p&E9'
+              # 从库数据源
+                # 初始连接数
+                initialSize: 5
+                # 最小连接池数量
+                minIdle: 10
+                # 最大连接池数量
+                maxActive: 20
+                # 配置获取连接等待超时的时间
+                maxWait: 60000
+                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+                timeBetweenEvictionRunsMillis: 60000
+                # 配置一个连接在池中最小生存的时间,单位是毫秒
+                minEvictableIdleTimeMillis: 300000
+                # 配置一个连接在池中最大生存的时间,单位是毫秒
+                maxEvictableIdleTimeMillis: 900000
+                # 配置检测连接是否有效
+                validationQuery: SELECT 1 FROM DUAL
+                testWhileIdle: true
+                testOnBorrow: false
+                testOnReturn: false
+                webStatFilter:
+                    enabled: true
+                statViewServlet:
+                    enabled: true
+                    # 设置白名单,不填则允许所有访问
+                    allow:
+                    url-pattern: /druid/*
+                    # 控制台管理用户名和密码
+                    login-username: fs
+                    login-password: 123456
+                filter:
+                    stat:
+                        enabled: true
+                        # 慢SQL记录
+                        log-slow-sql: true
+                        slow-sql-millis: 1000
+                        merge-sql: true
+                    wall:
+                        config:
+                            multi-statement-allow: true
+        sop:
+            type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: com.mysql.cj.jdbc.Driver
+            druid:
+                # 主库数据源
+                master:
+                    url: jdbc:mysql://10.0.14.15:3306/fs_his_sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: 'Kel6GdXBrMm&p&E9'
+                # 读库数据源
+                read:
+                    url: jdbc:mysql://10.0.14.15:3306/fs_his_sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: 'Kel6GdXBrMm&p&E9'
+                # 初始连接数
+                initialSize: 5
+                # 最小连接池数量
+                minIdle: 10
+                # 最大连接池数量
+                maxActive: 20
+                # 配置获取连接等待超时的时间
+                maxWait: 60000
+                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+                timeBetweenEvictionRunsMillis: 60000
+                # 配置一个连接在池中最小生存的时间,单位是毫秒
+                minEvictableIdleTimeMillis: 300000
+                # 配置一个连接在池中最大生存的时间,单位是毫秒
+                maxEvictableIdleTimeMillis: 900000
+                # 配置检测连接是否有效
+                validationQuery: SELECT 1 FROM DUAL
+                testWhileIdle: true
+                testOnBorrow: false
+                testOnReturn: false
+                webStatFilter:
+                    enabled: true
+                statViewServlet:
+                    enabled: true
+                    # 设置白名单,不填则允许所有访问
+                    allow:
+                    url-pattern: /druid/*
+                    # 控制台管理用户名和密码
+                    login-username: fs
+                    login-password: 123456
+                filter:
+                    stat:
+                        enabled: true
+                        # 慢SQL记录
+                        log-slow-sql: true
+                        slow-sql-millis: 1000
+                        merge-sql: true
+                    wall:
+                        config:
+                            multi-statement-allow: true
+rocketmq:
+    name-server: 127.0.0.1:9876   # 占位,仅用于满足 Spring 创建 Bean
+    producer:
+        group: jshz-producer-group
+    consumer:
+        group: common-group
+openIM:
+    secret:
+    userID:
+    url:
+#是否为新商户,新商户不走mpOpenId
+isNewWxMerchant: true
+#是否使用新im
+im:
+    type: OPENIM
+
+qw:
+    enableAutoTag: 1
+tag:
+    thread:
+        num: 5
+    rate:
+        limit: 30
+
+
+liveWebSocketUrl: http://192.168.0.194:7114
+

+ 6 - 1
fs-service/src/main/resources/mapper/company/CompanyMapper.xml

@@ -42,6 +42,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="groupName"    column="group_name"    />
         <result property="maxPadNum"    column="max_pad_num"    />
         <result property="deptId"   column="dept_id" />
+        <result property="isOpenRestReminder" column="is_open_rest_reminder" />
+        <result property="level" column="level" />
     </resultMap>
 
     <sql id="selectCompanyVo">
@@ -123,6 +125,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="maxPadNum != null">max_pad_num,</if>
             <if test="deptId != null">dept_id,</if>
             <if test="isOpenRestReminder != null">is_open_rest_reminder,</if>
+            <if test="level != null">`level`,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="companyName != null">#{companyName},</if>
@@ -159,7 +162,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="groupName != null">#{groupName},</if>
             <if test="maxPadNum != null">#{maxPadNum},</if>
             <if test="deptId != null">#{deptId},</if>
-            <if test="isOpenRestReminder != null">is_open_rest_reminder = #{isOpenRestReminder},</if>
+            <if test="isOpenRestReminder != null">#{isOpenRestReminder},</if>
+            <if test="level != null">#{level},</if>
          </trim>
     </insert>
 
@@ -204,6 +208,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="deptId != null">dept_id = #{deptId},</if>
             <if test="redPackageMoney != null">red_package_money = #{redPackageMoney},</if>
             <if test="isOpenRestReminder != null">is_open_rest_reminder = #{isOpenRestReminder},</if>
+            <if test="level != null">`level` = #{level},</if>
         </trim>
         where company_id = #{companyId}
     </update>

+ 1 - 0
fs-user-app/src/main/java/com/fs/app/controller/TalentController.java

@@ -255,6 +255,7 @@ public class TalentController extends  AppBaseController{
         PageHelper.startPage(param.getPageNum(), param.getPageSize());
         boolean oneSelf = userId == param.getUserId();
         List<FsUserVideoListUVO> list = fsUserVideoService.selectFsUserVideoListUVOByUser(fsUserTalent.getTalentId(),oneSelf,userId);
+        list = fsUserVideoService.addNum(list);
 
         PageInfo<FsUserVideoListUVO> listPageInfo=new PageInfo<>(list);
         return R.ok().put("data",listPageInfo);

+ 4 - 2
fs-user-app/src/main/java/com/fs/app/controller/VideoController.java

@@ -54,8 +54,6 @@ public class VideoController extends  AppBaseController{
         }
         PageHelper.startPage(param.getPageNum(), param.getPageSize());
         List<FsUserVideoListUVO> list= videoService.selectFsUserVideoListUVO(param);
-        //添加假数据
-        list = videoService.addNum(list);
         PageInfo<FsUserVideoListUVO> listPageInfo=new PageInfo<>(list);
         if (param.getUserId() != null) {
             // 对分页后的数据进行推荐排序
@@ -73,6 +71,9 @@ public class VideoController extends  AppBaseController{
                 listPageInfo.setList(list);
             }
         }
+        // 统一在列表最终确定后叠加展示数,避免置顶视频未叠加导致与达人/我的列表不一致
+        list = videoService.addNum(listPageInfo.getList());
+        listPageInfo.setList(list);
         return R.ok().put("data",listPageInfo);
     }
 
@@ -84,6 +85,7 @@ public class VideoController extends  AppBaseController{
         param.setUserId(Long.parseLong(getUserId()));
         PageHelper.startPage(param.getPageNum(), param.getPageSize());
         List<FsUserVideoListUVO> list= videoService.selectFsUserFavoriteVideoListUVO(param);
+        list = videoService.addNum(list);
         PageInfo<FsUserVideoListUVO> listPageInfo=new PageInfo<>(list);
         return R.ok().put("data",listPageInfo);
     }

+ 4 - 4
fs-user-app/src/main/java/com/fs/app/controller/store/ProductScrmController.java

@@ -113,7 +113,7 @@ public class ProductScrmController extends AppBaseController {
     @ApiOperation("获取商品列表")
     @GetMapping("/getProducts")
     public R getProducts(FsStoreProductQueryParam param, HttpServletRequest request){
-        PageHelper.startPage(param.getPage(), param.getPageSize());
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
         param.setIsDisplay(1);
         List<FsStoreProductListQueryVO> productList=productService.selectFsStoreProductListQuery(param);
         PageInfo<FsStoreProductListQueryVO> listPageInfo=new PageInfo<>(productList);
@@ -354,7 +354,7 @@ public class ProductScrmController extends AppBaseController {
     @ApiOperation("获取推荐商品数据")
     @GetMapping("/getTuiProducts")
     public R getTuiProducts(BaseQueryParam param, HttpServletRequest request){
-        PageHelper.startPage(param.getPage(), param.getPageSize());
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
         List<FsStoreProductListQueryVO> list=productService.selectFsStoreProductTuiListQuery(param);
         PageInfo<FsStoreProductListQueryVO> listPageInfo=new PageInfo<>(list);
         return R.ok().put("data",listPageInfo);
@@ -362,7 +362,7 @@ public class ProductScrmController extends AppBaseController {
     @ApiOperation("获取喜欢商品数据")
     @GetMapping("/getGoodsProducts")
     public R getGoodsProducts(BaseQueryParam param, HttpServletRequest request){
-        PageHelper.startPage(param.getPage(), param.getPageSize());
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
         List<FsStoreProductListQueryVO> list=productService.selectFsStoreProductGoodListQuery(param);
         PageInfo<FsStoreProductListQueryVO> listPageInfo=new PageInfo<>(list);
         return R.ok().put("data",listPageInfo);
@@ -372,7 +372,7 @@ public class ProductScrmController extends AppBaseController {
     @ApiOperation("获取推广商品列表")
     @GetMapping("/getStoreProductAttrValueList")
     public R getStoreProductAttrValueList(FsStoreProductAttrValueQueryParam param, HttpServletRequest request){
-        PageHelper.startPage(param.getPage(), param.getPageSize());
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
         List<FsStoreProductAttrValueQueryVO> productList=attrValueService.selectStoreProductAttrValueListQuery(param);
         PageInfo<FsStoreProductAttrValueQueryVO> listPageInfo=new PageInfo<>(productList);
         return R.ok().put("data",listPageInfo);