Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

zhangqin 2 дней назад
Родитель
Сommit
5882787eb1
35 измененных файлов с 343 добавлено и 117 удалено
  1. 29 2
      fs-admin/src/main/java/com/fs/course/controller/FsVideoResourceController.java
  2. 1 0
      fs-admin/src/main/java/com/fs/his/controller/FsIntegralGoodsController.java
  3. 33 2
      fs-admin/src/main/java/com/fs/his/controller/FsUserAddressController.java
  4. 9 1
      fs-admin/src/main/java/com/fs/live/controller/LiveVideoController.java
  5. 2 2
      fs-admin/src/main/resources/application.yml
  6. 1 0
      fs-company/src/main/java/com/fs/hisStore/controller/FsIntegralGoodsController.java
  7. 10 29
      fs-live-app/src/main/java/com/fs/live/task/LiveCompletionPointsTask.java
  8. 18 6
      fs-live-app/src/main/java/com/fs/live/websocket/service/WebSocketServer.java
  9. 2 0
      fs-service/src/main/java/com/fs/course/domain/FsVideoResource.java
  10. 8 6
      fs-service/src/main/java/com/fs/course/mapper/FsUserCourseVideoMapper.java
  11. 2 0
      fs-service/src/main/java/com/fs/course/service/IFsUserCourseVideoService.java
  12. 51 39
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  13. 1 1
      fs-service/src/main/java/com/fs/his/param/FsIntegralCartParam.java
  14. 10 0
      fs-service/src/main/java/com/fs/his/utils/RedisCacheUtil.java
  15. 3 0
      fs-service/src/main/java/com/fs/his/vo/FsIntegralCartVO.java
  16. 49 0
      fs-service/src/main/java/com/fs/hisStore/enums/LiveEnum.java
  17. 16 3
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
  18. 6 0
      fs-service/src/main/java/com/fs/live/domain/LiveVideo.java
  19. 9 0
      fs-service/src/main/java/com/fs/live/mapper/LiveMapper.java
  20. 6 0
      fs-service/src/main/java/com/fs/live/service/ILiveService.java
  21. 18 0
      fs-service/src/main/java/com/fs/live/service/impl/LiveServiceImpl.java
  22. 3 0
      fs-service/src/main/java/com/fs/live/vo/LiveVo.java
  23. 18 14
      fs-service/src/main/java/com/fs/newAdv/service/impl/LeadServiceImpl.java
  24. 14 1
      fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java
  25. 1 0
      fs-service/src/main/resources/application-config-druid-cfryt-test.yml
  26. 1 0
      fs-service/src/main/resources/application-config-druid-cfryt.yml
  27. 1 0
      fs-service/src/main/resources/application-config-druid-fby.yml
  28. 1 0
      fs-service/src/main/resources/application-config-druid-gzzdy.yml
  29. 1 0
      fs-service/src/main/resources/application-config-druid-hat.yml
  30. 1 0
      fs-service/src/main/resources/application-config-druid-hst.yml
  31. 7 11
      fs-service/src/main/resources/application-config-druid-jnsyj.yml
  32. 1 0
      fs-service/src/main/resources/application-config-druid-kyt.yml
  33. 1 0
      fs-service/src/main/resources/application-config-druid-qdtst.yml
  34. 8 0
      fs-service/src/main/resources/application-config-druid-sft.yml
  35. 1 0
      fs-service/src/main/resources/mapper/his/FsIntegralCartMapper.xml

+ 29 - 2
fs-admin/src/main/java/com/fs/course/controller/FsVideoResourceController.java

@@ -16,6 +16,7 @@ import com.fs.config.cloud.CloudHostProper;
 import com.fs.course.business.FsVideoResourceBusinessService;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.FsVideoResource;
+import com.fs.course.service.IFsUserCourseVideoService;
 import com.fs.course.service.IFsUserVideoService;
 import com.fs.course.service.IFsVideoResourceService;
 import com.fs.course.vo.FsVideoResourceVO;
@@ -23,6 +24,7 @@ import com.fs.framework.web.service.TokenService;
 import com.fs.system.service.ISysConfigService;
 import com.github.pagehelper.PageHelper;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -34,6 +36,7 @@ import java.util.stream.Collectors;
 /**
  * 资源库管理
  */
+@Slf4j
 @RestController
 @RequestMapping("/course/videoResource")
 @AllArgsConstructor
@@ -50,6 +53,8 @@ public class FsVideoResourceController extends BaseController {
     private final FsVideoResourceBusinessService videoResourceBusinessService;
     @Autowired
     private IFsUserVideoService fsUserVideoService;
+    @Autowired
+    private IFsUserCourseVideoService fsUserCourseVideoService;
 
     /**
      * 查询视频素材库列表
@@ -102,8 +107,17 @@ public class FsVideoResourceController extends BaseController {
         if (ObjectUtil.isNotEmpty(config.getIsBound()) && config.getIsBound()) {
             fsVideoResource.setUserId(userId);
         }
+
         fsVideoResource.setCreateTime(LocalDateTime.now());
-        fsVideoResourceService.save(fsVideoResource);
+        boolean save = fsVideoResourceService.save(fsVideoResource);
+        if (save&&StringUtils.isNotEmpty(fsVideoResource.getHsyVid())){
+            try {
+                fsUserCourseVideoService.updateMediaPublishStatus(fsVideoResource.getHsyVid());
+                log.info("更新视频发布状态成功,hsyVid: {}", fsVideoResource.getHsyVid());
+            } catch (Exception e) {
+                log.error("更新视频发布状态失败,hsyVid: {}, 错误: {}", fsVideoResource.getHsyVid(), e.getMessage());
+            }
+        }
         return AjaxResult.success();
     }
 
@@ -193,7 +207,20 @@ public class FsVideoResourceController extends BaseController {
                 v.setUserId(userId);
             }
         });
-        fsVideoResourceService.saveBatch(list);
+        boolean saveStatus = fsVideoResourceService.saveBatch(list);
+        if (saveStatus) {
+            list.forEach(fsVideoResource -> {
+                // 检查hsyVid是否存在且不为空
+                if (ObjectUtil.isNotEmpty(fsVideoResource.getHsyVid())) {
+                    try {
+                        fsUserCourseVideoService.updateMediaPublishStatus(fsVideoResource.getHsyVid());
+                        log.info("更新视频发布状态成功,hsyVid: {}", fsVideoResource.getHsyVid());
+                    } catch (Exception e) {
+                        log.error("更新视频发布状态失败,hsyVid: {}, 错误: {}", fsVideoResource.getHsyVid(), e.getMessage());
+                    }
+                }
+            });
+        }
         return AjaxResult.success();
     }
 }

+ 1 - 0
fs-admin/src/main/java/com/fs/his/controller/FsIntegralGoodsController.java

@@ -117,6 +117,7 @@ public class FsIntegralGoodsController extends BaseController
     {
 
         redisCacheUtil.delRedisKey("getIntegralGoodsList");
+        redisCacheUtil.delSpringCacheKey("getIntegralGoodsById", fsIntegralGoods.getGoodsId());
         redisCacheUtil.delRedisKey("getIntegralGoodsById");
         return toAjax(fsIntegralGoodsService.updateFsIntegralGoods(fsIntegralGoods));
     }

+ 33 - 2
fs-admin/src/main/java/com/fs/his/controller/FsUserAddressController.java

@@ -4,9 +4,12 @@ import java.util.List;
 
 import com.alibaba.fastjson.JSON;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.domain.entity.SysRole;
+import com.fs.common.core.domain.entity.SysUser;
 import com.fs.common.utils.ParseUtils;
 import com.fs.common.utils.SecurityUtils;
 import com.fs.his.dto.AddressInfoDTO;
+import com.fs.system.service.ISysRoleService;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -50,13 +53,41 @@ public class FsUserAddressController extends BaseController
     {
         startPage();
         List<FsUserAddress> list = fsUserAddressService.selectFsUserAddressList(fsUserAddress);
+        SysRole sysRole = null;
+        try {
+            sysRole = isCheckPermission();
+        } catch (Exception e) {
+        }
         for (FsUserAddress userAddress : list) {
-            userAddress.setPhone(decryptAutoPhoneMk(userAddress.getPhone()));
-            userAddress.setDetail(ParseUtils.parseAddress(userAddress.getDetail()));
+            if (sysRole == null || sysRole.getIsCheckPhone() != 1 ) {
+                userAddress.setPhone(decryptAutoPhoneMk(userAddress.getPhone()));
+            }
+            if (sysRole == null || sysRole.getIsCheckAddress() != 1 ) {
+                userAddress.setDetail(ParseUtils.parseAddress(userAddress.getDetail()));
+            }
         }
         return getDataTable(list);
     }
 
+    @Autowired
+    private ISysRoleService sysRoleService;
+    private SysRole isCheckPermission() {
+        SysRole sysRole = new SysRole();
+        SysUser user = getLoginUser().getUser();
+        boolean flag = user.isAdmin();
+        if (flag) {
+            sysRole.setIsCheckPhone(1);
+            sysRole.setIsCheckAddress(1);
+        } else {
+            List<SysRole> roles = user.getRoles();
+            if (roles != null && !roles.isEmpty()) {
+                Long[] roleIds = roles.stream().map(SysRole::getRoleId).toArray(Long[]::new);
+                return sysRoleService.getIsCheckPermission(roleIds);
+            }
+        }
+        return sysRole;
+    }
+
     /**
      * 导出用户地址列表
      */

+ 9 - 1
fs-admin/src/main/java/com/fs/live/controller/LiveVideoController.java

@@ -6,6 +6,9 @@ import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.config.cloud.CloudHostProper;
+import com.fs.hisStore.enums.CompanyEnum;
+import com.fs.hisStore.enums.LiveEnum;
 import com.fs.live.domain.LiveVideo;
 import com.fs.live.service.ILiveVideoService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -26,7 +29,8 @@ public class LiveVideoController extends BaseController
 {
     @Autowired
     private ILiveVideoService liveVideoService;
-
+    @Autowired
+    private CloudHostProper cloudHostProper;
     /**
      * 查询直播视频列表
      */
@@ -89,6 +93,10 @@ public class LiveVideoController extends BaseController
     @PostMapping
     public AjaxResult add(@RequestBody LiveVideo liveVideo)
     {
+        if (LiveEnum.contains(cloudHostProper.getCompanyName())) {
+            liveVideo.setVideoUrl(liveVideo.getLineOne());
+            liveVideo.setFinishStatus(1);
+        }
         return toAjax(liveVideoService.insertLiveVideo(liveVideo));
     }
 

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

@@ -4,11 +4,11 @@ server:
 # Spring配置
 spring:
   profiles:
-    active: druid-ylrz
+#    active: druid-ylrz
 #    active: druid-hdt
 #    active: druid-yzt
 #    active: druid-sxjz-test
 #    active: druid-sft
 #    active: druid-fby
-#    active: dev
+    active: dev
 

+ 1 - 0
fs-company/src/main/java/com/fs/hisStore/controller/FsIntegralGoodsController.java

@@ -110,6 +110,7 @@ public class FsIntegralGoodsController extends BaseController
     {
 
         redisCacheUtil.delRedisKey("getIntegralGoodsList");
+        redisCacheUtil.delSpringCacheKey("getIntegralGoodsById", fsIntegralGoods.getGoodsId());
         redisCacheUtil.delRedisKey("getIntegralGoodsById");
         return toAjax(fsIntegralGoodsService.updateFsIntegralGoods(fsIntegralGoods));
     }

+ 10 - 29
fs-live-app/src/main/java/com/fs/live/task/LiveCompletionPointsTask.java

@@ -41,16 +41,20 @@ public class LiveCompletionPointsTask {
     /**
      * 定时检查观看时长并创建完课记录
      * 每分钟执行一次
-     * 优化:使用Hash结构 + 防重复推送
+     * 优化:防重复推送 + 只查询开启了完课积分的直播间
      */
     @Scheduled(cron = "0 */1 * * * ?")
     public void checkCompletionStatus() {
         try {
-            List<Live> activeLives = liveService.selectNoEndLiveList();
+            // 只查询开启了完课积分配置的直播间
+            List<Live> activeLives = liveService.selectLiveListWithCompletionPointsEnabled();
             
             if (activeLives == null || activeLives.isEmpty()) {
+                log.debug("当前没有开启完课积分的直播间");
                 return;
             }
+            
+            log.info("开始检查完课状态, 开启完课积分的直播间数量: {}", activeLives.size());
 
             for (Live live : activeLives) {
                 try {
@@ -61,9 +65,13 @@ public class LiveCompletionPointsTask {
                     Map<Object, Object> userDurations = redisCache.redisTemplate.opsForHash().entries(hashKey);
                     
                     if (userDurations == null || userDurations.isEmpty()) {
+                        log.debug("直播间没有观看时长数据, liveId={}, liveName={}", liveId, live.getLiveName());
                         continue;
                     }
                     
+                    log.info("直播间有观看数据, liveId={}, liveName={}, 用户数: {}", 
+                            liveId, live.getLiveName(), userDurations.size());
+                    
                     // 3. 逐个用户处理
                     for (Map.Entry<Object, Object> entry : userDurations.entrySet()) {
                         try {
@@ -129,31 +137,4 @@ public class LiveCompletionPointsTask {
             log.error("发送完课通知失败, liveId={}, userId={}", liveId, userId, e);
         }
     }
-
-    /**
-     * 发送完课通知(通过WebSocket推送弹窗) - 旧版本(保留)
-     */
-    private void sendCompletionNotification(Long liveId, Long userId) {
-        try {
-            // 查询未领取的完课记录
-            List<LiveCompletionPointsRecord> unreceivedRecords = completionPointsRecordService.getUserUnreceivedRecords(liveId, userId);
-            
-            if (unreceivedRecords != null && !unreceivedRecords.isEmpty()) {
-                // 构造弹窗消息
-                SendMsgVo sendMsgVo = new SendMsgVo();
-                sendMsgVo.setLiveId(liveId);
-                sendMsgVo.setUserId(userId);
-                sendMsgVo.setCmd("completionPoints");
-                sendMsgVo.setMsg("完成任务!");
-                sendMsgVo.setData(JSONObject.toJSONString(unreceivedRecords.get(0)));
-
-                // 通过WebSocket发送给特定用户(调用已有的发送方法)
-                webSocketServer.sendCompletionPointsMessage(liveId, userId, sendMsgVo);
-                
-                log.info("发送完课积分弹窗通知成功, liveId={}, userId={}", liveId, userId);
-            }
-        } catch (Exception e) {
-            log.error("发送完课通知失败, liveId={}, userId={}", liveId, userId, e);
-        }
-    }
 }

+ 18 - 6
fs-live-app/src/main/java/com/fs/live/websocket/service/WebSocketServer.java

@@ -4,6 +4,7 @@ package com.fs.live.websocket.service;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.fs.common.constant.LiveKeysConstant;
+import com.fs.common.core.redis.RedisCacheT;
 import com.fs.common.exception.base.BaseException;
 import com.fs.common.utils.date.DateUtil;
 import com.fs.his.domain.FsUser;
@@ -320,30 +321,41 @@ public class WebSocketServer {
 
                     // 心跳时同步更新观看时长到Redis Hash
                     long watchUserId = (long) userProperties.get("userId");
+
+                    log.info("[心跳-观看时长] 接收心跳, liveId={}, userId={}, data={}",
+                            liveId, watchUserId, msg.getData());
                     
                     if (msg.getData() != null && !msg.getData().isEmpty()) {
                         try {
                             Long currentDuration = Long.parseLong(msg.getData());
-                            
+                            log.info("[心跳-观看时长] 解析成功, duration={}", currentDuration);
+
                             // 使用Hash结构存储:一个直播间一个Hash,包含所有用户的时长
                             String hashKey = "live:watch:duration:hash:" + liveId;
                             String userIdField = String.valueOf(watchUserId);
                             
+                            log.info("[心跳-观看时长] 开始处理, liveId={}, userId={}, hashKey={}, userIdField={}, currentDuration={}", 
+                                    liveId, watchUserId, hashKey, userIdField, currentDuration);
+                            
                             // 获取现有时长
-                            Object existingDuration = redisCache.redisTemplate.opsForHash().get(hashKey, userIdField);
+                            Object existingDuration = redisCache.hashGet(hashKey, userIdField);
                             
-                            // 只有当新的时长更大时才更新(避免时间倒退)
+                            // 只有当新的时长更大时才更新
                             if (existingDuration == null || currentDuration > Long.parseLong(existingDuration.toString())) {
                                 // 更新Hash中的用户时长
-                                redisCache.redisTemplate.opsForHash().put(hashKey, userIdField, currentDuration.toString());
+                                redisCache.hashPut(hashKey, userIdField, currentDuration.toString());
                                 // 设置过期时间(2小时)
-                                redisCache.redisTemplate.expire(hashKey, 2, TimeUnit.HOURS);
+                                redisCache.expire(hashKey, 2, TimeUnit.HOURS);
+                                
+                                log.info("[心跳-观看时长] 更新成功, liveId={}, userId={}, duration={}, hashKey={}", 
+                                        liveId, watchUserId, currentDuration, hashKey);
                                 
                                 // 实时更新用户看课状态(仅在直播期间)
                                 updateWatchLogTypeInRealTime(liveId, watchUserId, currentDuration);
                             }
                         } catch (Exception e) {
-                            log.error("心跳更新观看时长失败, liveId={}, userId={}", liveId, watchUserId, e);
+                            log.error("[心跳-观看时长] 更新失败, liveId={}, userId={}, data={}", 
+                                    liveId, watchUserId, msg.getData(), e);
                         }
                     }
                     

+ 2 - 0
fs-service/src/main/java/com/fs/course/domain/FsVideoResource.java

@@ -102,4 +102,6 @@ public class FsVideoResource {
 
     //火山云vid
     private String hsyVid;
+
+    private String jobId;
 }

+ 8 - 6
fs-service/src/main/java/com/fs/course/mapper/FsUserCourseVideoMapper.java

@@ -2,6 +2,7 @@ package com.fs.course.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.course.domain.FsUserCourseVideo;
+import com.fs.course.domain.FsVideoResource;
 import com.fs.course.param.CourseVideoUpdates;
 import com.fs.course.param.FsCourseListBySidebarParam;
 import com.fs.course.param.FsUserCourseVideoListUParam;
@@ -266,12 +267,13 @@ public interface FsUserCourseVideoMapper extends BaseMapper<FsUserCourseVideo> {
     @MapKey("videoId")
     Map<Long, FsUserCourseVideo> selectAllMap();
 
-    @Select("select * from fs_user_course_video where line_two is not null and job_id is null")
-    List<FsUserCourseVideo> selectVideoByHuaWei();
+    @Select("select * from fs_video_resource where line2 is not null and job_id is null")
+    List<FsVideoResource> selectVideoByHuaWei();
 
-    @Select("select * from fs_user_course_video where job_id is not null and  (vid is null or vid='')")
-    List<FsUserCourseVideo> selectVideoByJobId();
+    @Select("select * from fs_video_resource where job_id is not null and  (hsy_vid is null or hsy_vid='')")
+    List<FsVideoResource> selectVideoByJobId();
 
-    @Select("select * from fs_user_course_video where vid is not null")
-    List<FsUserCourseVideo> selectVideoByVid();
+
+    @Select("select * from fs_video_resource where hsy_vid is not null")
+    List<FsVideoResource> selectVideoByVid();
 }

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

@@ -243,4 +243,6 @@ public interface IFsUserCourseVideoService extends IService<FsUserCourseVideo> {
     R getVideoInfoByVid();
 
     R createRoomMiniLinkByCourse(FsCourseLinkRoomNewParam param);
+
+    void updateMediaPublishStatus(String vid);
 }

+ 51 - 39
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -2621,10 +2621,13 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
         }
         // 项目看课数限制
         if (!EXCLUDE_PROJECTS.contains(signProjectName) && !CloudHostUtils.hasCloudHostName("弘德堂")) {
+            log.error("进入了看课限制:传入参数:={},watchCourseVideo={}",param, watchCourseVideo);
             Integer logCount = fsUserCourseMapper.selectTodayCourseWatchLogCountByUserIdAndProjectId(param.getUserId(), courseProject);
             if (Objects.isNull(watchCourseVideo) && logCount > 0) {
                 return ResponseResult.fail(504, "超过项目看课数量限制");
             }
+        }else {
+            log.error("没有进入看课限制:传入参数:={},watchCourseVideo={}存在问题 ",param, watchCourseVideo);
         }
         //添加判断:该用户是否已经存在此课程的看课记录,并且看课记录的销售id不是传入的销售id
         if (watchCourseVideo != null) {
@@ -4076,8 +4079,8 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
 
     @Override
     public R uploadVideoToHuoShanByUrl() {
-        List <FsUserCourseVideo> videos = fsUserCourseVideoMapper.selectVideoByHuaWei();
-        for (FsUserCourseVideo video : videos){
+        List <FsVideoResource> videos = fsUserCourseVideoMapper.selectVideoByHuaWei();
+        for (FsVideoResource video : videos){
             uploadVideoByUrl(video);
         }
         return R.ok();
@@ -4087,7 +4090,7 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
     private IVodService vodService;
 
     //通过Url上传视频
-    public void uploadVideoByUrl(FsUserCourseVideo courseVideo) {
+    public void uploadVideoByUrl(FsVideoResource videoResource) {
 
         try {
             VodUrlUploadRequest.Builder reqBuilder = VodUrlUploadRequest.newBuilder();
@@ -4095,7 +4098,7 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
             reqBuilder.setSpaceName(cloudHostProper.getSpaceName());
             VodUrlUploadURLSet.Builder uRLSetsBuilder = VodUrlUploadURLSet.newBuilder();
             //源文件 URL
-            uRLSetsBuilder.setSourceUrl(courseVideo.getLineTwo());//华为云
+            uRLSetsBuilder.setSourceUrl(videoResource.getLine2());//华为云
             //存储类型。默认为 1。取值如下:
             //1:标准存储。
             //2:归档存储。
@@ -4110,7 +4113,7 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
 //            String fileName = System.currentTimeMillis() + ".mp4";
 //            String remoteFileName = "fs/" + datePath + "/" + fileName;
 
-            uRLSetsBuilder.setFileName(courseVideo.getFileKey());
+            uRLSetsBuilder.setFileName(videoResource.getFileKey());
             reqBuilder.addURLSets(uRLSetsBuilder);
 
             VodUrlUploadResponse resp = vodService.uploadMediaByUrl(reqBuilder.build());
@@ -4119,11 +4122,11 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
                 log.info("上传返回异常:{}",resp.getResponseMetadata().getError());
                 System.exit(-1);
             }else {
-                FsUserCourseVideo video = new FsUserCourseVideo();
-                video.setVideoId(courseVideo.getVideoId());
+                FsVideoResource video = new FsVideoResource();
+                video.setId(videoResource.getId());
                 video.setJobId(resp.getResult().getData(0).getJobId());
                 //更新JobId
-                fsUserCourseVideoMapper.updateFsUserCourseVideo(video);
+                fsVideoResourceMapper.updateById(video);
             }
             log.info("上传返回参数:{}",resp);
         } catch (Exception e) {
@@ -4134,25 +4137,25 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
     @Override
     public R getVidByJob() {
         // 查询有JobId的视频
-        List<FsUserCourseVideo> list = fsUserCourseVideoMapper.selectVideoByJobId();
+        List<FsVideoResource> list = fsUserCourseVideoMapper.selectVideoByJobId();
         if (list.isEmpty()) {
             log.info("没有待上传的视频任务");
             return R.error();
         }
         // 按五百一批切割
-        List<List<FsUserCourseVideo>> batches = splitList(list, 500);
+        List<List<FsVideoResource>> batches = splitList(list, 500);
         log.info("总任务 {} 条,分成 {} 批", list.size(), batches.size());
 
         int batchIndex = 1;
 
         // 批次顺序执行,每批内部多线程并发执行
-        for (List<FsUserCourseVideo> batch : batches) {
+        for (List<FsVideoResource> batch : batches) {
 
             log.info("开始执行批次 {}/{},本批任务 {} 条", batchIndex, batches.size(), batch.size());
 
             CountDownLatch latch = new CountDownLatch(batch.size());
 
-            for (FsUserCourseVideo video : batch) {
+            for (FsVideoResource video : batch) {
                 uploadExecutor.submit(() -> {
                     try {
                         uploadSingleTaskWithRetry(video,1);
@@ -4180,25 +4183,25 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
     @Override
     public R getVideoInfoByVid() {
         // 查询有JobId的视频
-        List<FsUserCourseVideo> list = fsUserCourseVideoMapper.selectVideoByVid();
+        List<FsVideoResource> list = fsUserCourseVideoMapper.selectVideoByVid();
         if (list.isEmpty()) {
             log.info("没有包含vid的视频");
             return R.error();
         }
         // 按五百一批切割
-        List<List<FsUserCourseVideo>> batches = splitList(list, 500);
+        List<List<FsVideoResource>> batches = splitList(list, 500);
         log.info("总任务 {} 条,分成 {} 批", list.size(), batches.size());
 
         int batchIndex = 1;
 
         // 批次顺序执行,每批内部多线程并发执行
-        for (List<FsUserCourseVideo> batch : batches) {
+        for (List<FsVideoResource> batch : batches) {
 
             log.info("开始执行批次 {}/{},本批任务 {} 条", batchIndex, batches.size(), batch.size());
 
             CountDownLatch latch = new CountDownLatch(batch.size());
 
-            for (FsUserCourseVideo video : batch) {
+            for (FsVideoResource video : batch) {
                 uploadExecutor.submit(() -> {
                     try {
                         uploadSingleTaskWithRetry(video,2);
@@ -4280,10 +4283,10 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
     }
 
     //根据jobid查询上传视频的vid
-    public void getVidByJobId(FsUserCourseVideo courseVideo){
+    public void getVidByJobId(FsVideoResource videoResource){
         try {
             VodQueryUploadTaskInfoRequest.Builder reqBuilder = VodQueryUploadTaskInfoRequest.newBuilder();
-            reqBuilder.setJobIds(courseVideo.getJobId());
+            reqBuilder.setJobIds(videoResource.getJobId());
 
             VodQueryUploadTaskInfoResponse resp = vodService.queryUploadTaskInfo(reqBuilder.build());
             if (resp.getResponseMetadata().hasError()) {
@@ -4293,10 +4296,15 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
                 if (StringUtils.isEmpty(resp.getResult().getData().getMediaInfoList(0).getVid())){
                     return;
                 }
-                FsUserCourseVideo video = new FsUserCourseVideo();
-                video.setVideoId(courseVideo.getVideoId());
-                video.setVid(resp.getResult().getData().getMediaInfoList(0).getVid());
-                fsUserCourseVideoMapper.updateFsUserCourseVideo(video);
+                FsVideoResource video = new FsVideoResource();
+                video.setId(videoResource.getId());
+                //视频上传失败,清空jobid
+                if (StringUtils.isEmpty(resp.getResult().getData().getMediaInfoList(0).getVid())){
+                    video.setJobId("");
+                }else {
+                    video.setHsyVid(resp.getResult().getData().getMediaInfoList(0).getVid());
+                }
+                fsVideoResourceMapper.updateById(video);
             }
             System.out.println(resp);
         } catch (Exception e) {
@@ -4305,10 +4313,11 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
     }
 
 
-    public void getVideoInfoByVid(FsUserCourseVideo courseVideo) {
+    //根据vid获取视频详情
+    public void getVideoInfoByVid(FsVideoResource videoResource) {
         try {
             VodGetMediaInfosRequest.Builder reqBuilder = VodGetMediaInfosRequest.newBuilder();
-            reqBuilder.setVids(courseVideo.getVid());
+            reqBuilder.setVids(videoResource.getHsyVid());
 
             VodGetMediaInfosResponse resp = vodService.getMediaInfos20230701(reqBuilder.build());
             if (resp.getResponseMetadata().hasError()) {
@@ -4321,19 +4330,22 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
                 }
                 //如果是未发布状态修改发布状态
                 if (resp.getResult().getMediaInfoList(0).getBasicInfo().getPublishStatus().equals("Unpublished")){
-                    updateMediaPublishStatus(courseVideo.getVid());
+                    updateMediaPublishStatus(videoResource.getHsyVid());
                 }
+                //更新视频资源
+                String url = cloudHostProper.volcengineUrl+"/"+resp.getResult().getMediaInfoList(0).getSourceInfo().getStoreUri();
+
+                FsVideoResource fsVideoResource = new FsVideoResource();
+                fsVideoResource.setId(videoResource.getId());
+                fsVideoResource.setLine2(url);
+                fsVideoResourceMapper.updateById(fsVideoResource);
 
                 //更新小节
-                FsUserCourseVideo video = new FsUserCourseVideo();
-                video.setVideoId(courseVideo.getVideoId());
-                String url = cloudHostProper.volcengineUrl+"/"+resp.getResult().getMediaInfoList(0).getSourceInfo().getStoreUri();
-                video.setLineTwo(url);
-                fsUserCourseVideoMapper.updateFsUserCourseVideo(video);
-                //更新视频资源
-                FsVideoResource videoResource = fsVideoResourceMapper.selectByFileKey(courseVideo.getFileKey());
-                videoResource.setLine2(url);
-                fsVideoResourceMapper.updateById(videoResource);
+                FsUserCourseVideo courseVideo = new FsUserCourseVideo();
+                courseVideo.setFileKey(videoResource.getFileKey());
+                courseVideo.setLineTwo(url);
+                fsUserCourseVideoMapper.updateFsUserCourseVideoByFileKey(courseVideo);
+
             }
             System.out.println(resp);
         } catch (Exception e) {
@@ -4362,23 +4374,23 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
     }
 
 
-    public void uploadSingleTaskWithRetry(FsUserCourseVideo courseVideo,Integer type) {
+    public void uploadSingleTaskWithRetry(FsVideoResource videoResource,Integer type) {
         int maxRetry = 3;
         for (int i = 1; i <= maxRetry; i++) {
             try {
                 if (type == 1){
                     //获取上传成功的视频vid,同步到数据库
-                    getVidByJobId(courseVideo);
+                    getVidByJobId(videoResource);
                 }else if (type == 2){
                     //获取视频地址同步到线路二
-                    getVideoInfoByVid(courseVideo);
+                    getVideoInfoByVid(videoResource);
                 }
                 return;
             } catch (Exception e) {
                 log.error("视频 {} 上传失败,第 {} 次重试,原因:{}",
-                        courseVideo.getVideoId(), i, e.getMessage());
+                        videoResource.getId(), i, e.getMessage());
                 if (i == maxRetry) {
-                    log.error("视频 {} 上传最终失败!", courseVideo.getVideoId());
+                    log.error("视频 {} 上传最终失败!", videoResource.getId());
                 }
             }
         }

+ 1 - 1
fs-service/src/main/java/com/fs/his/param/FsIntegralCartParam.java

@@ -16,7 +16,7 @@ public class FsIntegralCartParam {
 
     @NotNull(message = "添加数量不能为空")
     @Min(value = 1, message = "数量不再合法范围内")
-    @Max(value = 999, message = "数量不再合法范围内")
+    @Max(value = 9999, message = "数量不再合法范围内")
     @ApiModelProperty("数量")
     private Integer cartNum;
 

+ 10 - 0
fs-service/src/main/java/com/fs/his/utils/RedisCacheUtil.java

@@ -20,4 +20,14 @@ public class RedisCacheUtil {
             redisCache.deleteObject(key);
         }
     }
+
+    /**
+     * 删除 Spring Cache 格式的缓存(带双冒号)
+     * @param cacheName 缓存名称(如 getIntegralGoodsById)
+     * @param cacheKey 缓存key(如 商品ID)
+     */
+    public void delSpringCacheKey(String cacheName, Object cacheKey) {
+        String key = cacheName + "::" + cacheKey;
+        redisCache.deleteObject(key);
+    }
 }

+ 3 - 0
fs-service/src/main/java/com/fs/his/vo/FsIntegralCartVO.java

@@ -34,6 +34,9 @@ public class FsIntegralCartVO {
     @ApiModelProperty("最新所需金额")
     private BigDecimal newCash;
 
+    @ApiModelProperty("库存")
+    private Long stock;
+
     @ApiModelProperty("数量")
     private Integer cartNum;
 

+ 49 - 0
fs-service/src/main/java/com/fs/hisStore/enums/LiveEnum.java

@@ -0,0 +1,49 @@
+package com.fs.hisStore.enums;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * 设置不转码的项目
+ */
+public enum LiveEnum {
+    KANGNIAN_TANG("康年堂"),
+    SIFU_TANG("四福堂"),
+    NMG_MYT("内蒙古一贴"),
+    CQ_TYT("重庆泰医堂"),
+    HDT("弘德堂"),
+    JNMY("金牛明医"),
+    HYT("鹤颜堂"),
+    Z_K("中康");
+
+    private final String companyName;
+
+    LiveEnum(String companyName) {
+        this.companyName = companyName;
+    }
+
+    public String getCompanyName() {
+        return companyName;
+    }
+
+    /**
+     * 静态集合,避免每次调用都重新创建
+     */
+    private static final Set<String> COMPANY_NAMES = Collections.unmodifiableSet(
+            Arrays.stream(values())
+                    .map(LiveEnum::getCompanyName)
+                    .collect(Collectors.toSet())
+    );
+
+    /**
+     * 比较是否存在
+     *
+     * @param companyName
+     * @return
+     */
+    public static boolean contains(String companyName) {
+        return COMPANY_NAMES.contains(companyName);
+    }
+}

+ 16 - 3
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -3111,10 +3111,23 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
 
             //获取运费模板区域列表按照城市排序
             List<FsShippingTemplatesRegionScrm> shippingTemplatesRegionList = shippingTemplatesRegionService.selectFsShippingTemplatesRegionListByTempIdsAndCityIds(StringUtils.join(tempIds, ","), StringUtils.join(citys, ","));
-
+            boolean isQg = false;
+
+            if (CollectionUtils.isEmpty(shippingTemplatesRegionList)&&CollectionUtils.isNotEmpty(shippingTemplatesList)&&shippingTemplatesList.size()<2) {
+                List<RegionInfoDTO> regionList = JSONObject.parseArray(
+                        shippingTemplatesList.get(0).getRegionInfo(),
+                        RegionInfoDTO.class
+                );
+                if (regionList != null && !regionList.isEmpty()) {
+                    RegionInfoDTO regionDTO = regionList.get(0);
+                    if ("默认全国".equals(regionDTO.getRegionName())) {
+                        isQg = true;
+                    }
+                }
+            }
             // 有运费模板,但当前城市没有匹配的区域
             if (shippingTemplatesList != null && !shippingTemplatesList.isEmpty()
-                    && (shippingTemplatesRegionList == null || shippingTemplatesRegionList.isEmpty())) {
+                    && (shippingTemplatesRegionList == null || shippingTemplatesRegionList.isEmpty())&&!isQg) {
                 logger.error("运费模板存在,但城市不在运费模板区域内,cityId: {}", cityId);
                 return badCode;
             }
@@ -3143,7 +3156,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                 // 如果商品有运费模板,但没有找到对应的区域配置,返回错误码
                 if (shippingTemplatesList != null && !shippingTemplatesList.isEmpty()
                         && shippingTemplatesList.stream().anyMatch(t -> t.getId().equals(tempId))
-                        && shippingTemplatesRegion == null) {
+                        && shippingTemplatesRegion == null&&!isQg) {
                     logger.error("商品运费模板存在,但城市不在运费模板区域内,tempId: {}, cityId: {}", tempId, cityId);
                     return badCode;
                 }

+ 6 - 0
fs-service/src/main/java/com/fs/live/domain/LiveVideo.java

@@ -43,4 +43,10 @@ public class LiveVideo extends BaseEntity {
     private Long sort;
     @Excel(name = "转码状态")
     private Integer finishStatus;
+
+
+    /**
+     * 未转码数据
+     */
+    private String lineOne;
 }

+ 9 - 0
fs-service/src/main/java/com/fs/live/mapper/LiveMapper.java

@@ -118,6 +118,15 @@ public interface LiveMapper
     @Select("select * from live where status != 3 and live_type in (2,3) and is_audit = 1")
     List<Live> selectNoEndLiveList();
 
+    /**
+     * 查询开启了完课积分配置的直播间(用于完课积分定时任务)
+     * @return 直播列表
+     */
+    @Select("select * from live where status != 3 and live_type in (2,3) and is_audit = 1 " +
+            "and config_json is not null " +
+            "and JSON_EXTRACT(config_json, '$.enabled') = true")
+    List<Live> selectLiveListWithCompletionPointsEnabled();
+
     void updateStatusAndTimeBatchById(@Param("liveList") List<Live> list);
 
     @Select("select * from live where (company_id = #{companyId} or company_id is null)  and is_audit = 1 and is_del = 0 and is_show = 1 and status != 3\n")

+ 6 - 0
fs-service/src/main/java/com/fs/live/service/ILiveService.java

@@ -164,6 +164,12 @@ public interface ILiveService
 
     List<Live> selectNoEndLiveList();
 
+    /**
+     * 查询开启了完课积分配置的直播间
+     * @return 直播列表
+     */
+    List<Live> selectLiveListWithCompletionPointsEnabled();
+
     void updateBatchById(List<Live> list);
 
     void updateStatusAndTimeBatchById(List<Live> list);

+ 18 - 0
fs-service/src/main/java/com/fs/live/service/impl/LiveServiceImpl.java

@@ -228,6 +228,11 @@ public class LiveServiceImpl implements ILiveService
         return baseMapper.selectNoEndLiveList();
     }
 
+    @Override
+    public List<Live> selectLiveListWithCompletionPointsEnabled() {
+        return baseMapper.selectLiveListWithCompletionPointsEnabled();
+    }
+
     @Override
     public void updateBatchById(List<Live> list) {
         baseMapper.updateLiveList(list);
@@ -265,6 +270,19 @@ public class LiveServiceImpl implements ILiveService
         // liveVo.setStoreId(storeId);
 		BeanUtils.copyProperties(live, liveVo);
 		liveVo.setNowDuration(200L);
+
+        Boolean completionPointsEnabled = false;
+        String configJson = live.getConfigJson();
+        if (StringUtils.isNotEmpty(configJson)) {
+            try {
+                JSONObject jsonConfig = JSON.parseObject(configJson);
+                completionPointsEnabled = jsonConfig.getBooleanValue("enabled");
+            } catch (Exception e) {
+                log.warn("解析直播完课积分配置失败, liveId={}", id, e);
+            }
+        }
+        liveVo.setCompletionPointsEnabled(completionPointsEnabled);
+        
         LiveVideo liveVideo = liveVideoService.selectLiveVideoByLiveIdAndType(id, 3);
         if (liveVideo != null) {
             liveVo.setPreviewUrl(liveVideo.getVideoUrl());

+ 3 - 0
fs-service/src/main/java/com/fs/live/vo/LiveVo.java

@@ -55,4 +55,7 @@ public class LiveVo {
     private Integer previewVideoType;
     private Long previewVideoId;
     private Integer globalVisible;
+    
+    /** 是否开启直播完课积分功能 */
+    private Boolean completionPointsEnabled;
 }

+ 18 - 14
fs-service/src/main/java/com/fs/newAdv/service/impl/LeadServiceImpl.java

@@ -119,20 +119,24 @@ public class LeadServiceImpl extends ServiceImpl<LeadMapper, Lead> implements IL
     @Override
     @Async
     public void weChatAuthorizationLead(String traceId, String unionId, String mpOpenId, String phone) {
-        Lead byTraceId = this.getByTraceId(traceId);
-        if (byTraceId == null) {
-            return;
-        }
-        this.update(new LambdaUpdateWrapper<Lead>()
-                .eq(Lead::getTraceId, traceId)
-                .set(Lead::getUnionid, unionId)
-                .set(Lead::getPhone, phone)
-                .set(Lead::getOpenid, mpOpenId)
-                .set(Lead::getMiniAuth, 1));
-        if (ObjectUtil.isNotEmpty(byTraceId.getLandingPageTs()) && byTraceId.getLandingPageTs().toLocalDate().isEqual(LocalDate.now())) {
-            // 微信授权且当日创建事件
-            conversionEventPublisher.publishConversionEvent(traceId, SystemEventTypeEnum.AUTH_TODAY_CREATE);
-        }
+       try{
+           Lead byTraceId = this.getByTraceId(traceId);
+           if (byTraceId == null) {
+               return;
+           }
+           this.update(new LambdaUpdateWrapper<Lead>()
+                   .eq(Lead::getTraceId, traceId)
+                   .set(Lead::getUnionid, unionId)
+                   .set(Lead::getPhone, phone)
+                   .set(Lead::getOpenid, mpOpenId)
+                   .set(Lead::getMiniAuth, 1));
+           if (ObjectUtil.isNotEmpty(byTraceId.getLandingPageTs()) && byTraceId.getLandingPageTs().toLocalDate().isEqual(LocalDate.now())) {
+               // 微信授权且当日创建事件
+               conversionEventPublisher.publishConversionEvent(traceId, SystemEventTypeEnum.AUTH_TODAY_CREATE);
+           }
+       }catch (Exception e){
+           e.printStackTrace();
+       }
     }
 
     @Override

+ 14 - 1
fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java

@@ -5,7 +5,9 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONException;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.ad.enums.AdUploadType;
@@ -15,6 +17,7 @@ import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.PubFun;
 import com.fs.common.utils.StringUtils;
 import com.fs.company.service.ICompanyConfigService;
+import com.fs.config.cloud.CloudHostProper;
 import com.fs.course.domain.FsCourseSop;
 import com.fs.course.domain.FsCourseSopLogs;
 import com.fs.course.domain.FsCourseWatchLog;
@@ -212,7 +215,8 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
     private AsyncQwAiChatSopService asyncQwAiChatSopService;
     @Autowired
     private QwExternalContactTransferCompanyAuditUserMapper companyAuditUserMapper;
-
+    @Autowired
+    private CloudHostProper cloudHostProper;
 
     Logger logger = LoggerFactory.getLogger(getClass());
 
@@ -2883,6 +2887,15 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
                 qwContactWayMapper.addInformationNum(wayId.getInformationId());
             }
         }
+        /*只有ddgy加重粉*/
+        if (("叮当国医".equals(cloudHostProper.getCompanyName()))) {
+            if (qwExternalContactMapper.selectCount(new LambdaQueryWrapper<QwExternalContact>().eq(QwExternalContact::getExternalUserId, qwExternalContact.getExternalUserId()))
+            >1){
+                qwExternalContact.setIsRepeat(1);
+                qwExternalContactMapper.update(null,new LambdaUpdateWrapper<QwExternalContact>().eq(QwExternalContact::getId,qwExternalContact.getId())
+                        .set(QwExternalContact::getIsRepeat,1));
+            }
+        }
     }
     public void checkHaveQwSop(Set<String> combinedTagsSet,QwUser qwUser,String corpId,List<String> combinedTagsList,
                                String userID,String externalUserID,ExternalContact externalContact,QwExternalContact contact,

+ 1 - 0
fs-service/src/main/resources/application-config-druid-cfryt-test.yml

@@ -77,6 +77,7 @@ cloud_host:
   company_name: 赤峰润
   projectCode: ryt
   spaceName:
+  volcengineUrl:
 #看课授权时显示的头像
 headerImg:
   imgUrl: https://ysy-1329817240.cos.ap-guangzhou.myqcloud.com/ysy/20250820/2c47e4f105b641b4a49df50a77338e32.png

+ 1 - 0
fs-service/src/main/resources/application-config-druid-cfryt.yml

@@ -83,6 +83,7 @@ cloud_host:
   company_name: 赤峰润
   projectCode: ryt
   spaceName:
+  volcengineUrl:
 #看课授权时显示的头像
 headerImg:
   imgUrl: https://ysy-1329817240.cos.ap-guangzhou.myqcloud.com/ysy/20250820/2c47e4f105b641b4a49df50a77338e32.png

+ 1 - 0
fs-service/src/main/resources/application-config-druid-fby.yml

@@ -107,6 +107,7 @@ cloud_host:
   company_name: 福本源
   projectCode: FBY
   spaceName:
+  volcengineUrl:
 headerImg:
   imgUrl: https://fbylive.obs.cn-southwest-2.myhuaweicloud.com/fs/20250730/1753840024082.png
 ipad:

+ 1 - 0
fs-service/src/main/resources/application-config-druid-gzzdy.yml

@@ -84,6 +84,7 @@ cloud_host:
   company_name: 广州郑多燕
   projectCode: GZZDY
   spaceName:
+  volcengineUrl:
 #看课授权时显示的头像
 headerImg:
   imgUrl:

+ 1 - 0
fs-service/src/main/resources/application-config-druid-hat.yml

@@ -88,6 +88,7 @@ cloud_host:
   company_name: 恒安图
   projectCode: HAT
   spaceName:
+  volcengineUrl:
 #看课授权时显示的头像
 headerImg:
   imgUrl: https://hat-1323137866.cos.ap-chongqing.myqcloud.com/fs/20250928/hatlogo.png

+ 1 - 0
fs-service/src/main/resources/application-config-druid-hst.yml

@@ -84,6 +84,7 @@ cloud_host:
   company_name: 鸿森堂
   projectCode: HST
   spaceName:
+  volcengineUrl:
 #看课授权时显示的头像
 headerImg:
   imgUrl:

+ 7 - 11
fs-service/src/main/resources/application-config-druid-jnsyj.yml

@@ -10,16 +10,11 @@ logging:
 wx:
   miniapp:
     configs:
-#      - appid: wx4115995705bb0ea0   #中康智慧
-#        secret: 58910ae743005c396012b029c7def579
-#        token: Ncbnd7lJvkripVOpyTFAna6NAWCxCrvC
-#        aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
-#        msgDataFormat: JSON
-#      - appid: wxedde588767b358b1   #中康未来智慧药房
-#        secret: 928d2961c81610d8f64b019597212fcd
-#        token: Ncbnd7lJvkripVOpyTFAna6NAWCxCrvC
-#        aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
-#        msgDataFormat: JSON
+      - appid:
+        secret:
+        token:
+        aesKey:
+        msgDataFormat: JSON
   cp:
     corpId: wwb2a10556ca7c2
     appConfigs:
@@ -85,7 +80,8 @@ tencent_cloud_config:
 cloud_host:
   company_name: 济南顺亿景
   projectCode: JNSYJ
-  spaceName:
+  spaceName: jnsyj-2114522511
+  volcengineUrl: https://jnsyjvolcengine.ylrztop.com
 #看课授权时显示的头像
 headerImg:
   imgUrl: https://jz-cos-1356808054.cos.ap-chengdu.myqcloud.com/fs/20250515/0877754b59814ea8a428fa3697b20e68.png

+ 1 - 0
fs-service/src/main/resources/application-config-druid-kyt.yml

@@ -84,6 +84,7 @@ cloud_host:
   company_name: 宽益堂
   projectCode: KYT
   spaceName:
+  volcengineUrl:
 #看课授权时显示的头像
 headerImg:
   imgUrl: https://kuanyitang-1317640934.cos.ap-shanghai.myqcloud.com/kuanyitang/20250813/6b3b62e01672407c98f0561b73e35f6a.jpg

+ 1 - 0
fs-service/src/main/resources/application-config-druid-qdtst.yml

@@ -91,6 +91,7 @@ cloud_host:
   company_name: 同顺堂
   projectCode: QDTST
   spaceName:
+  volcengineUrl:
 #看课授权时显示的头像
 headerImg:
   imgUrl: https://qdtst-1360717104.cos.ap-nanjing.myqcloud.com/qdtst-1360717104/20250624/937019e4090f46788ef29c4e7df479c3.jpg

+ 8 - 0
fs-service/src/main/resources/application-config-druid-sft.yml

@@ -62,6 +62,12 @@ watch:
 fs :
   commonApi: http://172.30.0.11:8010
   h5CommonApi: http://119.29.195.254:8010
+  jwt:
+    # 加密秘钥
+    secret: 9a3f7b1c2e8d45a0f632b819e4c56d12
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 nuonuo:
   key: 10924508
   secret: A2EB20764D304D16
@@ -77,6 +83,8 @@ cloud_host:
   company_name: 四福堂
   projectCode: SFT
   spaceName:
+  volcengineUrl:
+
 #看课授权时显示的头像
 headerImg:
   imgUrl: https://sft-1361917636.cos.ap-chongqing.myqcloud.com/sft/20250606/b08b1a6212f44f2998423c8c5d7712ee.png

+ 1 - 0
fs-service/src/main/resources/mapper/his/FsIntegralCartMapper.xml

@@ -61,6 +61,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             ic.cash,
             ig.integral newIntegral,
             ig.cash newCash,
+            ig.stock,
             ic.cart_num,
             ic.create_time,
             ic.update_time