Browse Source

Merge remote-tracking branch 'origin/master' into Payment-Configuration

# Conflicts:
#	fs-ipad-task/src/main/java/com/fs/app/service/IpadSendServer.java
yfh 1 day ago
parent
commit
f67b14b441
18 changed files with 72 additions and 21 deletions
  1. 14 1
      fs-admin/src/main/java/com/fs/qw/controller/QwExternalContactController.java
  2. 3 0
      fs-admin/src/main/java/com/fs/qw/controller/QwSopTempController.java
  3. 3 0
      fs-company/src/main/java/com/fs/company/controller/qw/QwSopTempController.java
  4. 18 0
      fs-ipad-task/src/main/java/com/fs/app/service/IpadSendServer.java
  5. 3 0
      fs-service/src/main/java/com/fs/course/domain/FsUserCourseVideo.java
  6. 1 0
      fs-service/src/main/java/com/fs/course/mapper/FsCourseAnswerLogsMapper.java
  7. 1 0
      fs-service/src/main/java/com/fs/course/mapper/FsCourseRedPacketLogMapper.java
  8. 2 0
      fs-service/src/main/java/com/fs/course/param/FsCourseAnswerLogsParam.java
  9. 1 0
      fs-service/src/main/java/com/fs/course/param/FsCourseRedPacketLogParam.java
  10. 2 0
      fs-service/src/main/java/com/fs/course/param/FsCourseWatchLogListParam.java
  11. 0 19
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java
  12. 3 0
      fs-service/src/main/java/com/fs/course/vo/FsUserCourseVideoQVO.java
  13. 3 0
      fs-service/src/main/java/com/fs/course/vo/FsUserCourseVideoVO.java
  14. 1 0
      fs-service/src/main/java/com/fs/his/service/impl/MerchantAppConfigServiceImpl.java
  15. 7 1
      fs-service/src/main/java/com/fs/qw/param/QwExternalContactParam.java
  16. 3 0
      fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml
  17. 1 0
      fs-service/src/main/resources/mapper/course/FsUserCourseVideoMapper.xml
  18. 6 0
      fs-service/src/main/resources/mapper/qw/QwExternalContactMapper.xml

+ 14 - 1
fs-admin/src/main/java/com/fs/qw/controller/QwExternalContactController.java

@@ -5,14 +5,17 @@ import java.util.Objects;
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.fs.common.core.domain.R;
 import com.fs.common.exception.ServiceException;
 import com.fs.qw.param.QwExternalContactParam;
 import com.fs.qw.param.QwTagSearchParam;
+import com.fs.qw.service.IQwExternalContactInfoService;
 import com.fs.qw.service.IQwTagService;
 import com.fs.qw.vo.QwExternalContactUnionIdExportVO;
 import com.fs.qw.vo.QwExternalContactVO;
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -33,7 +36,7 @@ import com.fs.common.core.page.TableDataInfo;
 
 /**
  * 企业微信客户Controller
- * 
+ *
  * @author fs
  * @date 2025-06-13
  */
@@ -44,6 +47,9 @@ public class QwExternalContactController extends BaseController
     private IQwExternalContactService qwExternalContactService;
     private IQwTagService iQwTagService;
 
+    @Autowired
+    private IQwExternalContactInfoService qwExternalContactInfoService;
+
     QwExternalContactController(IQwExternalContactService qwExternalContactService,IQwTagService iQwTagService){
         this.qwExternalContactService=qwExternalContactService;
         this.iQwTagService=iQwTagService;
@@ -168,4 +174,11 @@ public class QwExternalContactController extends BaseController
     {
         return toAjax(qwExternalContactService.deleteQwExternalContactByIds(ids));
     }
+
+    @GetMapping(value = "getUserInfo/{id}")
+    public R getUserInfo(@PathVariable("id") Long id)
+    {
+        return R.ok().put("data",qwExternalContactInfoService.selectQwExternalContactInfoByExternalContactId(id));
+    }
+
 }

+ 3 - 0
fs-admin/src/main/java/com/fs/qw/controller/QwSopTempController.java

@@ -219,6 +219,9 @@ public class QwSopTempController extends BaseController
     @PreAuthorize("@ss.hasPermi('qw:sopTemp:edit')")
     @PostMapping("/sortDay")
     public AjaxResult sortDay(@RequestBody List<SortDayVo> list){
+        if (list == null || list.isEmpty()){
+            return AjaxResult.error("请先调整排序");
+        }
         qwSopTempService.sortDay(list);
         return toAjax(1);
     }

+ 3 - 0
fs-company/src/main/java/com/fs/company/controller/qw/QwSopTempController.java

@@ -334,6 +334,9 @@ public class QwSopTempController extends BaseController
     @Log(title = "SOP模板天数调整", businessType = BusinessType.UPDATE)
     @PostMapping("/sortDay")
     public AjaxResult sortDay(@RequestBody List<SortDayVo> list){
+        if (list == null || list.isEmpty()){
+            return AjaxResult.error("请先调整排序");
+        }
         qwSopTempService.sortDay(list);
         return toAjax(1);
     }

+ 18 - 0
fs-ipad-task/src/main/java/com/fs/app/service/IpadSendServer.java

@@ -12,6 +12,9 @@ import com.fs.company.domain.CompanyMiniapp;
 import com.fs.company.service.ICompanyMiniappService;
 import com.fs.course.domain.FsCoursePlaySourceConfig;
 import com.fs.course.domain.FsCourseWatchLog;
+import com.fs.course.domain.FsUserCourseVideo;
+import com.fs.course.mapper.FsCoursePlaySourceConfigMapper;
+import com.fs.course.mapper.FsUserCourseVideoMapper;
 import com.fs.course.service.IFsCoursePlaySourceConfigService;
 import com.fs.course.service.IFsCourseWatchLogService;
 import com.fs.his.domain.FsUser;
@@ -59,6 +62,9 @@ public class IpadSendServer {
     private final ICompanyMiniappService companyMiniappService;
     private final IFsCoursePlaySourceConfigService playSourceConfigService;
     private final FsUserMapper fsUserMapper;
+    private final FsUserCourseVideoMapper fsUserCourseVideoMapper;
+
+
     private static final List<String> PROJECT_NAMES = Arrays.asList("济南联志健康", "北京存在文化","宽益堂");
     private void sendMiniProgram(BaseVo vo, QwSopCourseFinishTempSetting.Setting content, Map<String, FsCoursePlaySourceConfig> miniMap, Long companyId) {
         // 发送参数原本的appid
@@ -366,6 +372,18 @@ public class IpadSendServer {
             return false;
         }
 
+        // 查询视频是否下架
+        if(setting.getVideoId()!= null){
+            FsUserCourseVideo video = fsUserCourseVideoMapper.selectFsUserCourseVideoByVideoId( setting.getVideoId().longValue());
+            if(video != null){
+                if(video.getIsOnPut() == 1){
+                    log.warn("SOP_LOG_ID:{}, 视频已下架,不发送", qwSopLogs.getId());
+                    qwSopLogsService.updateQwSopLogsByWatchLogType(qwSopLogs.getId(), "视频已下架,不发送");
+                    return false;
+                }
+            }
+        }
+
         if (qwSopLogs.getSendType() != 6 && noSop) {
             // 客户的信息
 //            QwExternalContactHParam contactHParam = new QwExternalContactHParam();

+ 3 - 0
fs-service/src/main/java/com/fs/course/domain/FsUserCourseVideo.java

@@ -121,4 +121,7 @@ public class FsUserCourseVideo extends BaseEntity
     private Long listingEndTime;//商品结束售卖时间
 
     private Integer isSpeed; // 是否启用倍速 0:否 1:是
+
+    // 是否上架 0:上架,1:下架
+    private Integer isOnPut;
 }

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

@@ -53,6 +53,7 @@ public interface FsCourseAnswerLogsMapper
             "\tLEFT JOIN company c on cal.company_id=c.company_id " +
             "        <where>  \n" +
             "            <if test=\"map.phone != null \"> and fu.phone = #{map.phone}</if>\n" +
+            "            <if test=\"map.logId != null \"> and cal.log_id = #{map.logId}</if>\n" +
             "            <if test=\"map.courseId != null \"> and uc.course_id = #{map.courseId}</if>\n" +
             "            <if test=\"map.videoId != null \"> and cal.video_id = #{map.videoId}</if>\n" +
             "            <if test=\"map.watchLogId != null \"> and cal.watch_log_id = #{map.watchLogId}</if>\n" +

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

@@ -116,6 +116,7 @@ public interface FsCourseRedPacketLogMapper
             "LEFT JOIN qw_user qu on qu.id= l.qw_user_id  \n" +
             "where 1=1   " +
             "<if test = ' maps.userId !=null '> and l.user_id = #{maps.userId} </if>" +
+            "<if test = ' maps.logId !=null '> and l.log_id = #{maps.logId} </if>" +
             "<if test = ' maps.watchLogId !=null '> and l.watch_log_id = #{maps.watchLogId} </if>" +
             "<if test = ' maps.companyId !=null '> and l.company_id = #{maps.companyId} </if>" +
             "<if test = ' maps.companyUserId !=null '> and l.company_user_id = #{maps.companyUserId} </if>" +

+ 2 - 0
fs-service/src/main/java/com/fs/course/param/FsCourseAnswerLogsParam.java

@@ -12,6 +12,8 @@ import java.util.Set;
 
 @Data
 public class FsCourseAnswerLogsParam  extends BaseEntity  {
+
+    private Long logId;
     private String phone;
     private String phoneMk;
     private String courseId;

+ 1 - 0
fs-service/src/main/java/com/fs/course/param/FsCourseRedPacketLogParam.java

@@ -11,6 +11,7 @@ import java.util.stream.Collectors;
 @Data
 public class FsCourseRedPacketLogParam implements Serializable {
 
+    private Long logId;
     private Long userId;
 
     private Long companyId;

+ 2 - 0
fs-service/src/main/java/com/fs/course/param/FsCourseWatchLogListParam.java

@@ -11,6 +11,8 @@ import java.util.stream.Collectors;
 @Data
 public class FsCourseWatchLogListParam implements Serializable {
 
+    private Long logId;
+
     private Long userId;
 
     private Long qwUserId;

+ 0 - 19
fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java

@@ -380,7 +380,6 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
         CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
 
         List<FsCourseWatchLog> logs = new ArrayList<>();
-        List<FsCourseWatchLog> finishedLogs = new ArrayList<>();
         for (String key : keys) {
             //取key中数据
             String[] parts = key.split(":");
@@ -419,17 +418,12 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
                     redisCache.deleteObject(heartbeatKey);
                     // 完课删除看课时长记录
                     redisCache.deleteObject(key);
-                    finishedLogs.add(watchLog);
                 }
             }
             //集合中增加
             logs.add(watchLog);
         }
         batchUpdateFsUserCourseWatchLog(logs,100);
-
-        if(CollectionUtils.isNotEmpty(finishedLogs)){
-            fsTagUpdateService.onCourseWatchFinishedBatch(finishedLogs);
-        }
     }
     public Long getFsUserVideoDuration(Long videoId){
         //将视频时长也存到redis
@@ -458,7 +452,6 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
         Collection<String> keys = redisCache.keys("h5wxuser:watch:heartbeat:*");
         LocalDateTime now = LocalDateTime.now();
         List<FsCourseWatchLog> logs = new ArrayList<>();
-        List<FsCourseWatchLog> watchingLogs = new ArrayList<>();
         for (String key : keys) {
             FsCourseWatchLog watchLog = new FsCourseWatchLog();
             String[] parts = key.split(":");
@@ -483,14 +476,10 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
                 redisCache.deleteObject(key);
             }else {
                 watchLog.setLogType(1);
-                watchingLogs.add(watchLog);
             }
             logs.add(watchLog);
         }
         batchUpdateFsUserCourseWatchLog(logs,100);
-        if(CollectionUtils.isNotEmpty(watchingLogs)){
-            fsTagUpdateService.onCourseWatchingBatch(watchingLogs);
-        }
     }
 
     @Override
@@ -513,7 +502,6 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
         CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
 
         List<FsCourseWatchLog> logs = new ArrayList<>();
-        List<FsCourseWatchLog> finishedLogs = new ArrayList<>();
         for (String key : keys) {
             //取key中数据
             Long videoId=null;
@@ -562,8 +550,6 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
                     redisCache.deleteObject(heartbeatKey);
                     // 完课删除看课时长记录
                     redisCache.deleteObject(key);
-
-                    finishedLogs.add(watchLog);
                 }
             }
             //集合中增加
@@ -571,11 +557,6 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
         }
 
         batchUpdateFsCourseWatchLogIsOpen(logs,100);
-
-        // 完课打标签
-        if(CollectionUtils.isNotEmpty(finishedLogs)){
-            fsTagUpdateService.onCourseWatchFinishedBatch(finishedLogs);
-        }
     }
 
     public void batchUpdateFsCourseWatchLogIsOpen(List<FsCourseWatchLog> logs, int batchSize) {

+ 3 - 0
fs-service/src/main/java/com/fs/course/vo/FsUserCourseVideoQVO.java

@@ -102,4 +102,7 @@ public class FsUserCourseVideoQVO extends BaseEntity {
      * 课程关联的拍商品
      */
     private List<FsCourseProduct>  courseProducts;
+
+    // 是否上架 0:上架,1:下架
+    private Integer isOnPut;
 }

+ 3 - 0
fs-service/src/main/java/com/fs/course/vo/FsUserCourseVideoVO.java

@@ -68,4 +68,7 @@ public class FsUserCourseVideoVO extends BaseEntity {
     private String redPacketMoney;
 
     private String companyRedPacketMoney;
+
+    // 是否上架 0:上架,1:下架
+    private Integer isOnPut;
 }

+ 1 - 0
fs-service/src/main/java/com/fs/his/service/impl/MerchantAppConfigServiceImpl.java

@@ -52,6 +52,7 @@ public class MerchantAppConfigServiceImpl extends ServiceImpl<MerchantAppConfigM
                 Thread.sleep(5000);
                 Integer count = baseMapper.checkTableExists();
                 if (ObjectUtil.isNotNull(count)&&count>0) {
+                    log.info("异步初始化商户配置表完成");
                     return;
                 }
                 // 1. 检查并创建表

+ 7 - 1
fs-service/src/main/java/com/fs/qw/param/QwExternalContactParam.java

@@ -10,8 +10,12 @@ import java.util.List;
 
 @Data
 public class QwExternalContactParam {
+
     private Long id;
 
+    @TableField(exist = false)
+    private Long extId;
+
     /** 属于用户id */
     @Excel(name = "属于用户id")
     private String userId;
@@ -24,10 +28,12 @@ public class QwExternalContactParam {
 
     /** 外部联系人id */
     @Excel(name = "外部联系人id")
-    private Long externalUserId;
+    private String externalUserId;
 
     private Long companyUserId;
 
+    private Long fsUserId;
+
     /**
      * 销售员工信息(昵称,手机号)
      */

+ 3 - 0
fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml

@@ -82,6 +82,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test ='maps.userId !=null'>
                 and l.user_id = #{maps.userId}
             </if>
+            <if test ='maps.logId !=null'>
+                and l.log_id = #{maps.logId}
+            </if>
             <if test ='maps.project !=null'>
                 and l.project = #{maps.project}
             </if>

+ 1 - 0
fs-service/src/main/resources/mapper/course/FsUserCourseVideoMapper.xml

@@ -239,6 +239,7 @@
             <if test="projectId != null">project_id = #{projectId},</if>
             <if test="isFirst != null">is_first = #{isFirst},</if>
             <if test="isSpeed != null">is_speed = #{isSpeed},</if>
+            <if test="isOnPut != null">is_on_put = #{isOnPut},</if>
         </trim>
         where video_id = #{videoId}
     </update>

+ 6 - 0
fs-service/src/main/resources/mapper/qw/QwExternalContactMapper.xml

@@ -759,6 +759,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 <if test="isBindMini == 'noBindMini'">
                     and ec.fs_user_id is null
                 </if>
+                <if test="extId != null and extId != ''">
+                    and ec.id = #{extId}
+                </if>
+                <if test="fsUserId != null and fsUserId != ''">
+                    and ec.fs_user_id = #{fsUserId}
+                </if>
                 <if test="lossTime != null">
                     and DATE(ec.loss_time) = DATE(#{lossTime})
                 </if>