| 
					
				 | 
			
			
				@@ -3,6 +3,7 @@ package com.fs.course.service.impl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import cn.hutool.core.util.NumberUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import cn.hutool.json.JSONUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.alibaba.fastjson.JSON; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.fs.common.BeanCopyUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.fs.common.core.domain.R; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.fs.common.core.domain.ResponseResult; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1249,7 +1250,9 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (Objects.isNull(courseProject) || !courseProject.equals(param.getProjectId())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return ResponseResult.fail(504, "课程项目不匹配"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (!isUserCoursePeriodValid(param)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return ResponseResult.fail(504, "请观看最新的课程项目"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 项目看课数限制 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Integer logCount = fsUserCourseMapper.selectTodayCourseWatchLogCountByUserIdAndProjectId(param.getUserId(), param.getProjectId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (Objects.isNull(watchCourseVideo) && logCount > 0) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1319,7 +1322,66 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 //        fsUserCompanyUser.setCompanyUserId(param.getCompanyUserId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 //        return fsUserCompanyUser; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 //    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 检查用户课程时间段是否有效 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param param 查询参数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return 如果当前时间在有效范围内且状态为1,返回true,否则返回false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public boolean isUserCoursePeriodValid(FsUserCourseAddCompanyUserParam param) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 查询课程周期信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        FsUserCoursePeriodDays periodDays = getPeriodDaysInfo(param); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 获取公司用户时间段信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        LocalDateTime[] companyUserTimeRange = getCompanyUserTimeRange(param); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        LocalDateTime companyUserStartDateTime = companyUserTimeRange[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        LocalDateTime companyUserEndDateTime = companyUserTimeRange[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 确定实际使用的开始和结束时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        LocalDateTime effectiveStartTime = companyUserStartDateTime != null ? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                companyUserStartDateTime : periodDays.getStartDateTime(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        LocalDateTime effectiveEndTime = companyUserEndDateTime != null ? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                companyUserEndDateTime : periodDays.getEndDateTime(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 检查时间范围和状态 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return DateUtil.isWithinRangeSafe(LocalDateTime.now(), effectiveStartTime, effectiveEndTime)&& periodDays.getStatus() == 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 其他辅助方法保持不变 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private FsUserCoursePeriodDays getPeriodDaysInfo(FsUserCourseAddCompanyUserParam param) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        FsUserCoursePeriodDays query = new FsUserCoursePeriodDays(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        query.setVideoId(param.getVideoId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        query.setPeriodId(param.getPeriodId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<FsUserCoursePeriodDays> periodDaysList = fsUserCoursePeriodDaysMapper.selectFsUserCoursePeriodDaysList(query); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return CollectionUtils.isNotEmpty(periodDaysList) ? periodDaysList.get(0) : query; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private LocalDateTime[] getCompanyUserTimeRange(FsUserCourseAddCompanyUserParam param) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        CompanyUserTimeQueryParam query = new CompanyUserTimeQueryParam(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        query.setPeriodId(param.getPeriodId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        query.setCourseId(param.getCourseId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        query.setVideoId(param.getVideoId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        query.setCompanyUserId(param.getCompanyUserId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<FsUserCourseCompanyUserTime> companyUserTimes = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                companyUserTimeMapper.batchSelectByParams(Collections.singletonList(query)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (CollectionUtils.isEmpty(companyUserTimes)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return new LocalDateTime[]{null, null}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        FsUserCourseCompanyUserTime companyUserTime = companyUserTimes.get(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return new LocalDateTime[]{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                convertDateToLocalDateTime(companyUserTime.getStartDateTime()), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                convertDateToLocalDateTime(companyUserTime.getEndDateTime()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private LocalDateTime convertDateToLocalDateTime(Date date) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (date == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private String getCompanyUserQRCode(CompanyUser companyUser) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         String companyUserQRCode; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if(StringUtils.isNotEmpty(companyUser.getQrCodeWeixin())){ 
			 |