Преглед изворни кода

Merge remote-tracking branch 'origin/企微聊天' into 企微聊天

yh пре 1 недеља
родитељ
комит
96cb1f7a5d
25 измењених фајлова са 378 додато и 349 уклоњено
  1. 26 0
      fs-admin/src/main/java/com/fs/his/controller/FsPackageController.java
  2. 21 7
      fs-company/src/main/java/com/fs/company/controller/company/IndexStatisticsController.java
  3. 1 1
      fs-company/src/main/java/com/fs/framework/service/CompanyLoginService.java
  4. 1 1
      fs-framework/src/main/java/com/fs/framework/web/service/SysLoginService.java
  5. 211 12
      fs-ipad-task/src/main/java/com/fs/app/service/IpadSendServer.java
  6. 4 87
      fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java
  7. 21 7
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  8. 2 1
      fs-service/src/main/java/com/fs/course/vo/FsUserCourseVideoH5DVO.java
  9. 2 1
      fs-service/src/main/java/com/fs/course/vo/newfs/FsUserCourseVideoDetailsVO.java
  10. 1 1
      fs-service/src/main/java/com/fs/his/mapper/FsPackageMapper.java
  11. 2 0
      fs-service/src/main/java/com/fs/his/param/FsPackageParam.java
  12. 15 0
      fs-service/src/main/java/com/fs/his/vo/FsPackageAndTypeListVO.java
  13. 3 122
      fs-service/src/main/java/com/fs/qw/service/AsyncQwAiChatSopService.java
  14. 5 0
      fs-service/src/main/java/com/fs/qw/vo/QwSopCourseFinishTempSetting.java
  15. 5 0
      fs-service/src/main/java/com/fs/qw/vo/QwSopTempSetting.java
  16. 9 92
      fs-service/src/main/java/com/fs/sop/service/impl/SopUserLogsInfoServiceImpl.java
  17. 1 1
      fs-service/src/main/java/com/fs/statis/dto/AnalysisPreviewQueryDTO.java
  18. 6 1
      fs-service/src/main/java/com/fs/statis/service/impl/StatisticsServiceImpl.java
  19. 1 0
      fs-service/src/main/java/com/fs/store/config/StoreConfig.java
  20. 4 3
      fs-service/src/main/resources/application-druid-jnmy.yml
  21. 1 1
      fs-service/src/main/resources/mapper/his/FsPackageMapper.xml
  22. 2 2
      fs-service/src/main/resources/mapper/his/FsUserInformationCollectionMapper.xml
  23. 2 2
      fs-service/src/main/resources/mapper/statis/ConsumptionBalanceMapper.xml
  24. 9 0
      fs-user-app/src/main/java/com/fs/app/controller/CommonController.java
  25. 23 7
      fs-user-app/src/main/java/com/fs/app/controller/course/CourseQwController.java

+ 26 - 0
fs-admin/src/main/java/com/fs/his/controller/FsPackageController.java

@@ -5,9 +5,16 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.utils.CloudHostUtils;
 import com.fs.common.utils.SecurityUtils;
+import com.fs.common.utils.StringUtils;
 import com.fs.his.domain.FsChineseMedicine;
 import com.fs.his.domain.FsFollowTemp;
 import com.fs.his.param.FsPackageParam;
@@ -18,6 +25,7 @@ import com.fs.his.vo.FsPackageChooseVO;
 import com.fs.his.vo.FsPackageExcelVO;
 import com.fs.his.vo.FsPackageListVO;
 import com.fs.his.vo.OptionsVO;
+import com.fs.wxwork.utils.WxWorkHttpUtilNew;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -57,6 +65,24 @@ public class FsPackageController extends BaseController
     @GetMapping("/list")
     public TableDataInfo list(FsPackageParam fsPackage)
     {
+
+        if (fsPackage != null && fsPackage.getIsShow() != null && fsPackage.getIsShow() == 2 && CloudHostUtils.hasCloudHostName("金牛明医")){
+            //康年商城套餐
+            String urlPath = "https://admin.kangniantangyiyao.top/prod-api/store/store/storeProductPackage/list";
+            Map<String, Object>  map = new HashMap<>();
+            map.put("pageNum",fsPackage.getPageNum());
+            map.put("pageSize",fsPackage.getPageSize());
+            map.put("title",fsPackage.getPackageName());
+            map.put("status",1);
+            String response = WxWorkHttpUtilNew.get(urlPath, map);
+            if (StringUtils.isNotBlank(response)){
+                TableDataInfo tableDataInfo = JSON.parseObject(response, TableDataInfo.class);
+                if (tableDataInfo.getCode() == 200){
+                    return tableDataInfo;
+                }
+            }
+            return new TableDataInfo();
+        }
         startPage();
         List<FsPackageListVO> list = fsPackageService.selectFsPackageListVO(fsPackage);
         return getDataTable(list);

+ 21 - 7
fs-company/src/main/java/com/fs/company/controller/company/IndexStatisticsController.java

@@ -7,6 +7,7 @@ import com.fs.framework.security.LoginUser;
 import com.fs.framework.service.TokenService;
 import com.fs.statis.StatisticsRedisConstant;
 import com.fs.statis.dto.*;
+import com.fs.statis.service.IStatisticsCompanyService;
 import com.fs.statis.service.IStatisticsService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -31,6 +32,9 @@ public class IndexStatisticsController {
     @Autowired
     private IStatisticsService statisticsService;
 
+    @Autowired
+    private IStatisticsCompanyService statisticsCompanyService;
+
     /**
      * 分析概览
      */
@@ -49,7 +53,11 @@ public class IndexStatisticsController {
         }
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         param.setCompanyId(loginUser.getCompany().getCompanyId());
-        analysisPreviewDTO = redisCache.getCacheObject(String.format("%s:%d:%d:%d",DATA_OVERVIEW_DEALER_ANALYSISPREVIEW,type,userType,param.getCompanyId()));
+        if(type == 5) {
+            analysisPreviewDTO = statisticsCompanyService.analysisPreview(param);
+        } else {
+            analysisPreviewDTO = redisCache.getCacheObject(String.format("%s:%d:%d:%d",DATA_OVERVIEW_DEALER_ANALYSISPREVIEW,type,userType,param.getCompanyId()));
+        }
 
         return R.ok().put("data",analysisPreviewDTO);
     }
@@ -96,9 +104,14 @@ public class IndexStatisticsController {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         Long companyId = loginUser.getCompany().getCompanyId();
         param.setCompanyId(companyId);
+        List<WatchEndPlayTrendDTO> deaMemberTopTenDTOS = new ArrayList<>();
+        if(type == 5) {
+            deaMemberTopTenDTOS = statisticsCompanyService.watchEndPlayTrend(param);
+        } else {
+            String key = String.format("%s:%d:%d:%d", DATA_OVERVIEW_DEALER_CHARTS, type,userType,param.getCompanyId());
+            deaMemberTopTenDTOS = redisCache.getCacheObject(key);
+        }
 
-        String key = String.format("%s:%d:%d:%d", DATA_OVERVIEW_DEALER_CHARTS, type,userType,param.getCompanyId());
-        List<DeaMemberTopTenDTO> deaMemberTopTenDTOS = redisCache.getCacheObject(key);
         return R.ok().put("data", deaMemberTopTenDTOS);
     }
 
@@ -120,10 +133,11 @@ public class IndexStatisticsController {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         Long companyId = loginUser.getCompany().getCompanyId();
         param.setCompanyId(companyId);
-
-        List<DeaMemberTopTenDTO> deaMemberTopTenDTOS = redisCache.getCacheObject(String.format("%s:%d:%d:%d:%d", CHARTS_MEMBER_TOP_TEN_WATCH, type, statisticalType,userType,param.getCompanyId()));
-        if(deaMemberTopTenDTOS == null){
-            deaMemberTopTenDTOS = new ArrayList<>();
+        List<DeaMemberTopTenDTO> deaMemberTopTenDTOS = new ArrayList<>();
+        if(type == 5) {
+            deaMemberTopTenDTOS = statisticsCompanyService.deaMemberTopTen(param);
+        } else {
+            deaMemberTopTenDTOS = redisCache.getCacheObject(String.format("%s:%d:%d:%d:%d", CHARTS_MEMBER_TOP_TEN_WATCH, type, statisticalType,userType,param.getCompanyId()));
         }
         return R.ok().put("data", deaMemberTopTenDTOS);
     }

+ 1 - 1
fs-company/src/main/java/com/fs/framework/service/CompanyLoginService.java

@@ -64,7 +64,7 @@ public class CompanyLoginService
     private String secret;
     @Value("${wechat.company.redirectUri:#{null}}")
     private String redirectUri;
-    @Value("${wechat.isNeedScan:false}")
+    @Value("${wechat.company.isNeedScan:false}")
     private Boolean isNeedScan;
 
     @Autowired

+ 1 - 1
fs-framework/src/main/java/com/fs/framework/web/service/SysLoginService.java

@@ -65,7 +65,7 @@ public class SysLoginService
     private String secret;
     @Value("${wechat.admin.redirectUri:#{null}}")
     private String redirectUri;
-    @Value("${wechat.isNeedScan:false}")
+    @Value("${wechat.admin.isNeedScan:false}")
     private Boolean isNeedScan;
 
     /**

+ 211 - 12
fs-ipad-task/src/main/java/com/fs/app/service/IpadSendServer.java

@@ -1,5 +1,6 @@
 package com.fs.app.service;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -9,13 +10,13 @@ import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.date.DateUtil;
 import com.fs.common.utils.http.HttpUtils;
 import com.fs.common.utils.spring.SpringUtils;
+import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyMiniapp;
+import com.fs.company.mapper.CompanyMapper;
 import com.fs.company.service.ICompanyMiniappService;
 import com.fs.config.ai.AiHostProper;
-import com.fs.course.domain.FsCoursePlaySourceConfig;
-import com.fs.course.domain.FsCourseWatchLog;
-import com.fs.course.domain.FsUserCourseVideo;
-import com.fs.course.domain.LuckyBagCollectRecord;
+import com.fs.course.config.CourseConfig;
+import com.fs.course.domain.*;
 import com.fs.course.mapper.FsCoursePlaySourceConfigMapper;
 import com.fs.course.mapper.FsUserCourseVideoMapper;
 import com.fs.course.service.IFsCoursePlaySourceConfigService;
@@ -31,6 +32,7 @@ import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.domain.QwUser;
 import com.fs.qw.domain.QwUserVideo;
 import com.fs.qw.mapper.LuckyBagCollectRecordMapper;
+import com.fs.qw.mapper.LuckyBagMapper;
 import com.fs.qw.mapper.QwExternalContactMapper;
 import com.fs.qw.mapper.QwUserMapper;
 import com.fs.qw.service.IQwUserService;
@@ -40,6 +42,7 @@ import com.fs.qw.vo.QwSopCourseFinishTempSetting;
 import com.fs.sop.domain.QwSopLogs;
 import com.fs.sop.service.IQwSopLogsService;
 import com.fs.sop.service.impl.QwSopLogsServiceImpl;
+import com.fs.system.service.ISysConfigService;
 import com.fs.wxwork.dto.*;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -49,12 +52,15 @@ import org.json.JSONObject;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.*;
 import java.util.Optional;
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -73,6 +79,9 @@ public class IpadSendServer {
     private final ICompanyMiniappService companyMiniappService;
     private final AiHookService aiHookService;
     private final AiHostProper aiHostProper;
+    private final ISysConfigService configService;
+    private final LuckyBagMapper luckyBagMapper;
+    private final CompanyMapper companyMapper;
     private final ExecutorService executor = new ThreadPoolExecutor(
             8, 32, 60L, TimeUnit.SECONDS,
             new LinkedBlockingQueue<>(1000),
@@ -759,7 +768,7 @@ public class IpadSendServer {
                     break;
                 case "14":
                     // 记录福袋发送记录
-                    addLuckyBagCollectRecord(vo, content,qwSopLogs);
+                    addLuckyBagCollectRecord(qwUser, content,qwSopLogs);
                     // 福袋
                     sendMiniProgram(vo, content, miniMap);
                     break;
@@ -777,14 +786,17 @@ public class IpadSendServer {
             content.setSendRemarks("发送失败:" + e.getMessage());
         }
     }
-    private void addLuckyBagCollectRecord(BaseVo vo,QwSopCourseFinishTempSetting.Setting content,QwSopLogs qwSopLogs) {
-        try {
-            // 写入福袋发放记录
-            LuckyBagCollectRecord luckyBagCollectRecord = luckyBagCollectRecordMapper.selectLuckyBagCollectRecordById(Long.valueOf(content.getBusinessId()));
-            luckyBagCollectRecord.setSendTime(new Date());
-            luckyBagCollectRecord.setCollectType("0");
-            luckyBagCollectRecordMapper.updateLuckyBagCollectRecord(luckyBagCollectRecord);
+    private void addLuckyBagCollectRecord(QwUser qwUser, QwSopCourseFinishTempSetting.Setting content, QwSopLogs qwSopLogs) {
 
+        try {
+            String json = configService.selectConfigByKey("course.config");
+            CourseConfig config = JSON.parseObject(json, CourseConfig.class);
+            Date updateTime = createUpdateTime(content, new Date(), config);
+            LuckyBag luckyBag = luckyBagMapper.selectLuckyBagById(content.getLuckyBagId());
+            String companyUserId = String.valueOf(qwUser.getCompanyUserId()).trim();
+            String companyId = String.valueOf(qwUser.getCompanyId()).trim();
+            Long businessId = addLuckyBagCollectRecord(qwUser,luckyBag,content,qwSopLogs,updateTime,companyUserId,companyId,content.getChatId());
+            content.setMiniprogramPage(quickProcess(content.getMiniprogramPage(),businessId));
         }catch (Exception e){
             log.error("ID:" + qwSopLogs.getId() + "-添加福袋记录失败", e);
         }
@@ -793,4 +805,191 @@ public class IpadSendServer {
     public void loginOut(QwUser user) {
         ipadSendUtils.loginOut(user.getUid(), user.getServerId());
     }
+
+    /**
+     * 过期时间
+     *
+     * @param setting
+     * @param sendTime
+     * @param config
+     * @return
+     */
+    private Date createUpdateTime(QwSopCourseFinishTempSetting.Setting setting, Date sendTime, CourseConfig config) {
+
+        Integer expireDays = (setting.getExpiresDays() == null || setting.getExpiresDays() == 0)
+                ? config.getVideoLinkExpireDate()
+                : setting.getExpiresDays();
+
+//         使用 Java 8 时间 API 计算过期时间
+        LocalDateTime sendDateTime = sendTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+        LocalDateTime expireDateTime = sendDateTime.plusDays(expireDays - 1);
+        expireDateTime = expireDateTime.toLocalDate().atTime(23, 59, 59);
+        Date updateTime = Date.from(expireDateTime.atZone(ZoneId.systemDefault()).toInstant());
+
+        return updateTime;
+    }
+    private static final Pattern LINK_PATTERN =
+            Pattern.compile("link=([^&]*)");
+    /**
+     * 快速处理方法(使用fastjson)
+     */
+    public static String quickProcess(String miniprogramPage, Long businessId) {
+        if (miniprogramPage == null || businessId == null) {
+            return miniprogramPage;
+        }
+
+        try {
+            Matcher matcher = LINK_PATTERN.matcher(miniprogramPage);
+            if (matcher.find()) {
+                String encodedLink = matcher.group(1);
+                String decodedLink = java.net.URLDecoder.decode(encodedLink, "UTF-8");
+
+                // 解析JSON
+                com.alibaba.fastjson.JSONObject linkJson = JSON.parseObject(decodedLink);
+
+                // 检查并添加businessId
+                if (!linkJson.containsKey("businessId") ||
+                        linkJson.getString("businessId").isEmpty()) {
+                    linkJson.put("businessId", businessId);
+
+                    // 重新编码
+                    String updatedJson = linkJson.toJSONString();
+                    String updatedEncoded = java.net.URLEncoder.encode(updatedJson, "UTF-8");
+
+                    // 替换原link参数
+                    return miniprogramPage.replaceFirst(
+                            "link=" + Pattern.quote(encodedLink),
+                            "link=" + updatedEncoded
+                    );
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return miniprogramPage;
+    }
+
+
+    /**
+     * 增加福袋发放记录、领取记录
+     *
+     * @param companyId
+     * @param qwUser
+     * @param luckyBag
+     * @param content
+     * @param qwSopLogs
+     * @param sendTime
+     * @param companyUserId
+     * @param chatId
+     */
+    private Long addLuckyBagCollectRecord(QwUser qwUser, LuckyBag luckyBag, QwSopCourseFinishTempSetting.Setting content,
+                                          QwSopLogs qwSopLogs,
+                                          Date sendTime,
+                                          String companyUserId,
+                                          String companyId,
+                                          String chatId) {
+        try {
+            // 参数校验
+            if (content == null || qwSopLogs == null || sendTime == null) {
+                log.warn("添加福袋记录失败:必要参数为空 [content:{}, qwSopLogs:{}, sendTime:{}]",
+                        content, qwSopLogs, sendTime);
+                return null;
+            }
+
+            // 验证福袋ID
+            if (content.getLuckyBagId() == null) {
+                log.warn("福袋ID为空");
+                return null;
+            }
+
+            // 查询福袋信息
+            if (luckyBag == null) {
+                log.warn("未找到对应的福袋信息 [luckyBagId:{}]", content.getLuckyBagId());
+                return null;
+            }
+
+            // 检查福袋状态
+            if (luckyBag.getDataStatus() != null && luckyBag.getDataStatus().equals(0)) {
+                log.warn("福袋被禁用 [luckyBagId:{}]", content.getLuckyBagId());
+                return null;
+            }
+
+            // 查询公司信息
+            Company company = companyMapper.selectCompanyById(Long.valueOf(companyId));
+
+            // 构建福袋记录
+            LuckyBagCollectRecord luckyBagCollectRecord = buildLuckyBagRecord(qwUser,content, qwSopLogs, sendTime,
+                    companyUserId, companyId, chatId, company, luckyBag);
+            luckyBagCollectRecord.setSendTime(new Date());
+            luckyBagCollectRecord.setCollectType("0");
+            // 插入记录并返回ID
+            int result = luckyBagCollectRecordMapper.insertLuckyBagCollectRecord(luckyBagCollectRecord);
+            if (result <= 0) {
+                log.warn("福袋记录插入失败 [luckyBagId:{}]", content.getLuckyBagId());
+                return null;
+            }
+
+            // 返回新增记录的ID
+            Long recordId = luckyBagCollectRecord.getId();
+            if (recordId == null) {
+                log.warn("福袋记录插入成功但未返回ID [luckyBagId:{}]", content.getLuckyBagId());
+                return null;
+            }
+
+            log.info("福袋记录添加成功 [recordId:{}, luckyBagId:{}]", recordId, content.getLuckyBagId());
+            return recordId;
+
+        } catch (NumberFormatException e) {
+            log.error("ID转换失败 [companyId:{}, companyUserId:{}]", companyId, companyUserId, e);
+            return null;
+        } catch (Exception e) {
+            log.error("ID:" + (content != null ? content.getLuckyBagId() : "unknown") + "-添加福袋记录失败", e);
+            return null;
+        }
+    }
+
+    /**
+     * 构建福袋记录对象
+     */
+    private LuckyBagCollectRecord buildLuckyBagRecord(QwUser qwUser,QwSopCourseFinishTempSetting.Setting content,
+                                                      QwSopLogs qwSopLogs,
+                                                      Date sendTime,
+                                                      String companyUserId,
+                                                      String companyId,
+                                                      String chatId,
+                                                      Company company,
+                                                      LuckyBag luckyBag) {
+        LuckyBagCollectRecord record = new LuckyBagCollectRecord();
+        record.setQwUserId(qwUser.getQwUserId());
+        record.setQwUserName(qwUser.getQwUserName());
+        record.setLuckyBagId(content.getLuckyBagId());
+        record.setExpiryTime(sendTime);
+        record.setCollectType("3");
+        record.setCompanyId(Long.valueOf(companyId));
+        record.setUserId(qwSopLogs.getFsUserId());
+        if (ObjectUtil.isNotEmpty(qwSopLogs.getFsUserId())){
+            FsUser fsUser = fsUserMapper.selectFsUserByUserId(qwSopLogs.getFsUserId());
+            record.setUserName(ObjectUtil.isNotEmpty(fsUser)?fsUser.getNickName():null);
+        }
+        record.setCompanyName(company.getCompanyName());
+        record.setCompanyUserId(Long.valueOf(companyUserId));
+        record.setSendLink(content.getMiniprogramPage());
+
+        // 设置奖励类型和聊天信息
+        if (StringUtils.isNotEmpty(chatId)) {
+            record.setRewardType(1L);
+            record.setChatId(chatId);
+            record.setExternalUserName(qwSopLogs.getExternalUserName());
+        } else {
+            record.setRewardType(2L);
+        }
+
+        // 设置币种金额
+        if (luckyBag.getRewardType() != null && luckyBag.getRewardType().equals("1")) {
+            record.setCoinAmount(luckyBag.getAmount());
+        }
+
+        return record;
+    }
 }

+ 4 - 87
fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java

@@ -2836,10 +2836,11 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
         link.setUpdateTime(updateTime);
         FsCourseRealLink courseMap = new FsCourseRealLink();
         BeanUtils.copyProperties(link, courseMap);
-        Long businessId = addLuckyBagCollectRecord(st,sopLogs,updateTime,companyUserId,companyId,chatId);
-        courseMap.setBusinessId(String.valueOf(businessId));
-        st.setBusinessId(String.valueOf(businessId));
+//        Long businessId = addLuckyBagCollectRecord(st,sopLogs,updateTime,companyUserId,companyId,chatId);
+//        courseMap.setBusinessId(String.valueOf(businessId));
+//        st.setBusinessId(String.valueOf(businessId));
         st.setExternalUserId(sopLogs.getExternalUserId());
+        st.setChatId(chatId);
         String json = configService.selectConfigByKey("luckyBag.config");
         Map<String, Object> luckyBagConfig = JSON.parseObject(json, Map.class);
         Object miniprogramPicUrl = luckyBagConfig.get("miniprogramPicUrl");
@@ -2882,90 +2883,6 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
         return link;
     }
 
-    /**
-     * 增加福袋发放记录、领取记录
-     *
-     * @param content
-     * @param qwSopLogs
-     * @param sendTime
-     * @param companyUserId
-     * @param companyId
-     * @param chatId
-     */
-    private Long addLuckyBagCollectRecord(QwSopTempSetting.Content.Setting content,
-                                          QwSopLogs qwSopLogs,
-                                          Date sendTime,
-                                          String companyUserId,
-                                          String companyId,
-                                          String chatId) {
-        try {
-            // 参数校验
-            if (content == null || qwSopLogs == null || sendTime == null) {
-                log.warn("添加福袋记录失败:必要参数为空 [content:{}, qwSopLogs:{}, sendTime:{}]",
-                        content, qwSopLogs, sendTime);
-                return null;
-            }
-
-            if (StringUtils.isEmpty(companyId) || StringUtils.isEmpty(companyUserId)) {
-                log.warn("公司ID或用户ID为空 [companyId:{}, companyUserId:{}]", companyId, companyUserId);
-                return null;
-            }
-
-            // 验证福袋ID
-            if (content.getLuckyBagId() == null) {
-                log.warn("福袋ID为空");
-                return null;
-            }
-
-            // 查询福袋信息
-            LuckyBag luckyBag = luckyBagMapper.selectLuckyBagById(content.getLuckyBagId());
-            if (luckyBag == null) {
-                log.warn("未找到对应的福袋信息 [luckyBagId:{}]", content.getLuckyBagId());
-                return null;
-            }
-
-            // 检查福袋状态
-            if (luckyBag.getDataStatus() != null && luckyBag.getDataStatus().equals(0)) {
-                log.warn("福袋被禁用 [luckyBagId:{}]", content.getLuckyBagId());
-                return null;
-            }
-
-            // 查询公司信息
-            Company company = companyMapper.selectCompanyById(Long.valueOf(companyId));
-            if (company == null) {
-                log.warn("未找到对应的公司信息 [companyId:{}]", companyId);
-                return null;
-            }
-
-            // 构建福袋记录
-            LuckyBagCollectRecord luckyBagCollectRecord = buildLuckyBagRecord(content, qwSopLogs, sendTime,
-                    companyUserId, companyId, chatId, company, luckyBag);
-
-            // 插入记录并返回ID
-            int result = luckyBagCollectRecordMapper.insertLuckyBagCollectRecord(luckyBagCollectRecord);
-            if (result <= 0) {
-                log.warn("福袋记录插入失败 [luckyBagId:{}]", content.getLuckyBagId());
-                return null;
-            }
-
-            // 返回新增记录的ID
-            Long recordId = luckyBagCollectRecord.getId();
-            if (recordId == null) {
-                log.warn("福袋记录插入成功但未返回ID [luckyBagId:{}]", content.getLuckyBagId());
-                return null;
-            }
-
-            log.info("福袋记录添加成功 [recordId:{}, luckyBagId:{}]", recordId, content.getLuckyBagId());
-            return recordId;
-
-        } catch (NumberFormatException e) {
-            log.error("ID转换失败 [companyId:{}, companyUserId:{}]", companyId, companyUserId, e);
-            return null;
-        } catch (Exception e) {
-            log.error("ID:" + (content != null ? content.getLuckyBagId() : "unknown") + "-添加福袋记录失败", e);
-            return null;
-        }
-    }
 
     /**
      * 构建福袋记录对象

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

@@ -65,6 +65,7 @@ import com.fs.his.service.IFsUserIntegralLogsService;
 import com.fs.his.service.IFsUserService;
 import com.fs.his.service.IFsUserWxService;
 import com.fs.his.utils.ConfigUtil;
+import com.fs.his.vo.FsPackageAndTypeListVO;
 import com.fs.his.vo.FsPackageListVO;
 import com.fs.his.vo.OptionsVO;
 import com.fs.im.service.OpenIMService;
@@ -2963,17 +2964,30 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
                 throw new RuntimeException(e);
             }
             if (jsonNode.isArray()) {
+                List<FsPackageAndTypeListVO> fsPackageListVOS = new ArrayList<>();
                 for (JsonNode node : jsonNode) {
-                    String packageId = node.path("packageId").asText();
-                    if (StringUtils.isNotEmpty(packageId)) {
-                        packageIds.add(packageId);
+                    String type = node.path("type").asText();
+                    if (StringUtils.isNotBlank(type) && "3".equals(type)) {
+                        FsPackageAndTypeListVO fsPackageListVO = new FsPackageAndTypeListVO();
+                        fsPackageListVO.setPackageId(node.path("packageId").asLong());
+                        fsPackageListVO.setPackageName(node.path("packageName").asText());
+                        fsPackageListVO.setSecondName(node.path("secondName").asText());
+                        fsPackageListVO.setTotalPrice(new BigDecimal(node.path("totalPrice").asText()));
+                        fsPackageListVO.setImgUrl(node.path("imgUrl").asText());
+                        fsPackageListVO.setType(3);
+                        fsPackageListVOS.add(fsPackageListVO);
+                    } else {
+                        String packageId = node.path("packageId").asText();
+                        if (StringUtils.isNotEmpty(packageId)) {
+                            packageIds.add(packageId);
+                        }
                     }
                 }
-                List<FsPackageListVO> fsPackageListVOS = new ArrayList<>();
                 if (!packageIds.isEmpty()) {
-                    fsPackageListVOS = fsPackageMapper.selectFsPackagesByIds(packageIds);
-                }else {
-                    fsPackageListVOS = new ArrayList<>();
+                    List<FsPackageAndTypeListVO>  fsPackageList= fsPackageMapper.selectFsPackagesByIds(packageIds);
+                    if (!fsPackageList.isEmpty()) {
+                        fsPackageListVOS.addAll(fsPackageList);
+                    }
                 }
                 vo.setTreatmentPackage(fsPackageListVOS);
             }

+ 2 - 1
fs-service/src/main/java/com/fs/course/vo/FsUserCourseVideoH5DVO.java

@@ -1,6 +1,7 @@
 package com.fs.course.vo;
 
 import com.fs.common.core.domain.BaseEntity;
+import com.fs.his.vo.FsPackageAndTypeListVO;
 import com.fs.his.vo.FsPackageListVO;
 import lombok.Data;
 
@@ -63,6 +64,6 @@ public class FsUserCourseVideoH5DVO extends BaseEntity
     /**
      * 疗法包套餐
      */
-    private List<FsPackageListVO> treatmentPackage;
+    private List<FsPackageAndTypeListVO> treatmentPackage;
 
 }

+ 2 - 1
fs-service/src/main/java/com/fs/course/vo/newfs/FsUserCourseVideoDetailsVO.java

@@ -1,5 +1,6 @@
 package com.fs.course.vo.newfs;
 
+import com.fs.his.vo.FsPackageAndTypeListVO;
 import com.fs.his.vo.FsPackageListVO;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -43,7 +44,7 @@ public class FsUserCourseVideoDetailsVO {
     /**
      * 疗法包套餐
      */
-    private List<FsPackageListVO> treatmentPackage;
+    private List<FsPackageAndTypeListVO> treatmentPackage;
 
     /**
      * 疗法包展示

+ 1 - 1
fs-service/src/main/java/com/fs/his/mapper/FsPackageMapper.java

@@ -167,5 +167,5 @@ public interface FsPackageMapper
      */
     List<FsGoodsVO> getFsGoodsVOListByIds(@Param("packageIds") List<Long> packageIds);
 
-    List<FsPackageListVO> selectFsPackagesByIds(@Param("packageIdList") List<String> packageIds);
+    List<FsPackageAndTypeListVO> selectFsPackagesByIds(@Param("packageIdList") List<String> packageIds);
 }

+ 2 - 0
fs-service/src/main/java/com/fs/his/param/FsPackageParam.java

@@ -26,4 +26,6 @@ public class FsPackageParam implements Serializable {
     private Integer isShow;
     private Long solarTerm;
     private String appId; //所属小程序
+    private Integer pageNum;
+    private Integer pageSize;
 }

+ 15 - 0
fs-service/src/main/java/com/fs/his/vo/FsPackageAndTypeListVO.java

@@ -0,0 +1,15 @@
+package com.fs.his.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class FsPackageAndTypeListVO extends  FsPackageListVO {
+
+    private Integer type; //3为康年商城
+}

+ 3 - 122
fs-service/src/main/java/com/fs/qw/service/AsyncQwAiChatSopService.java

@@ -321,9 +321,9 @@ public class AsyncQwAiChatSopService {
         link.setUpdateTime(updateTime);
         FsCourseRealLink courseMap = new FsCourseRealLink();
         BeanUtils.copyProperties(link, courseMap);
-        Long businessId = addLuckyBagCollectRecord(st,sopLogs,updateTime,companyUserId,companyId,chatId);
-        courseMap.setBusinessId(String.valueOf(businessId));
-        st.setBusinessId(String.valueOf(businessId));
+//        Long businessId = addLuckyBagCollectRecord(st,sopLogs,updateTime,companyUserId,companyId,chatId);
+//        courseMap.setBusinessId(String.valueOf(businessId));
+//        st.setBusinessId(String.valueOf(businessId));
         st.setExternalUserId(sopLogs.getExternalUserId());
         String json = configService.selectConfigByKey("luckyBag.config");
         Map<String, Object> luckyBagConfig = JSON.parseObject(json, Map.class);
@@ -518,125 +518,6 @@ public class AsyncQwAiChatSopService {
         return updateTime;
     }
 
-    private Long addLuckyBagCollectRecord(QwSopTempSetting.Content.Setting content,
-                                          QwSopLogs qwSopLogs,
-                                          Date sendTime,
-                                          String companyUserId,
-                                          String companyId,
-                                          String chatId) {
-        try {
-            // 参数校验
-            if (content == null || qwSopLogs == null || sendTime == null) {
-                log.warn("添加福袋记录失败:必要参数为空 [content:{}, qwSopLogs:{}, sendTime:{}]",
-                        content, qwSopLogs, sendTime);
-                return null;
-            }
-
-            if (StringUtils.isEmpty(companyId) || StringUtils.isEmpty(companyUserId)) {
-                log.warn("公司ID或用户ID为空 [companyId:{}, companyUserId:{}]", companyId, companyUserId);
-                return null;
-            }
-
-            // 验证福袋ID
-            if (content.getLuckyBagId() == null) {
-                log.warn("福袋ID为空");
-                return null;
-            }
-
-            // 查询福袋信息
-            LuckyBag luckyBag = luckyBagMapper.selectLuckyBagById(content.getLuckyBagId());
-            if (luckyBag == null) {
-                log.warn("未找到对应的福袋信息 [luckyBagId:{}]", content.getLuckyBagId());
-                return null;
-            }
-
-            // 检查福袋状态
-            if (luckyBag.getDataStatus() != null && luckyBag.getDataStatus().equals(0)) {
-                log.warn("福袋被禁用 [luckyBagId:{}]", content.getLuckyBagId());
-                return null;
-            }
-
-            // 查询公司信息
-            Company company = companyMapper.selectCompanyById(Long.valueOf(companyId));
-            if (company == null) {
-                log.warn("未找到对应的公司信息 [companyId:{}]", companyId);
-                return null;
-            }
-
-            // 构建福袋记录
-            LuckyBagCollectRecord luckyBagCollectRecord = buildLuckyBagRecord(content, qwSopLogs, sendTime,
-                    companyUserId, companyId, chatId, company, luckyBag);
-
-            // 插入记录并返回ID
-            int result = luckyBagCollectRecordMapper.insertLuckyBagCollectRecord(luckyBagCollectRecord);
-            if (result <= 0) {
-                log.warn("福袋记录插入失败 [luckyBagId:{}]", content.getLuckyBagId());
-                return null;
-            }
-
-            // 返回新增记录的ID
-            Long recordId = luckyBagCollectRecord.getId();
-            if (recordId == null) {
-                log.warn("福袋记录插入成功但未返回ID [luckyBagId:{}]", content.getLuckyBagId());
-                return null;
-            }
-
-            log.info("福袋记录添加成功 [recordId:{}, luckyBagId:{}]", recordId, content.getLuckyBagId());
-            return recordId;
-
-        } catch (NumberFormatException e) {
-            log.error("ID转换失败 [companyId:{}, companyUserId:{}]", companyId, companyUserId, e);
-            return null;
-        } catch (Exception e) {
-            log.error("ID:" + (content != null ? content.getLuckyBagId() : "unknown") + "-添加福袋记录失败", e);
-            return null;
-        }
-    }
-
-    private LuckyBagCollectRecord buildLuckyBagRecord(QwSopTempSetting.Content.Setting content,
-                                                      QwSopLogs qwSopLogs,
-                                                      Date sendTime,
-                                                      String companyUserId,
-                                                      String companyId,
-                                                      String chatId,
-                                                      Company company,
-                                                      LuckyBag luckyBag) {
-        LuckyBagCollectRecord record = new LuckyBagCollectRecord();
-        if (luckyBag.getType().equals("1")) {
-            record.setCoinAmount(luckyBag.getAmount());
-        }
-        QwUser qwUser = qwUserMapper.selectQwUserEntityByQwUserIdAndCorId(qwSopLogs.getQwUserid(),qwSopLogs.getCorpId());
-        record.setQwUserId(qwUser.getQwUserId());
-        record.setQwUserName(qwUser.getQwUserName());
-        record.setLuckyBagId(content.getLuckyBagId());
-        record.setExpiryTime(sendTime);
-        record.setCollectType("3");
-        record.setCompanyId(Long.valueOf(companyId));
-        record.setUserId(qwSopLogs.getFsUserId());
-        if (ObjectUtil.isNotEmpty(qwSopLogs.getFsUserId())){
-            FsUser fsUser = fsUserMapper.selectFsUserByUserId(qwSopLogs.getFsUserId());
-            record.setUserName(ObjectUtil.isNotEmpty(fsUser)?fsUser.getNickName():null);
-        }
-        record.setCompanyName(company.getCompanyName());
-        record.setCompanyUserId(Long.valueOf(companyUserId));
-        record.setSendLink(content.getMiniprogramPage());
-
-        // 设置奖励类型和聊天信息
-        if (StringUtils.isNotEmpty(chatId)) {
-            record.setRewardType(1L);
-            record.setChatId(chatId);
-            record.setExternalUserName(qwSopLogs.getExternalUserName());
-        } else {
-            record.setRewardType(2L);
-        }
-
-        // 设置币种金额
-        if (luckyBag.getRewardType() != null && luckyBag.getRewardType().equals("1")) {
-            record.setCoinAmount(luckyBag.getAmount());
-        }
-
-        return record;
-    }
 
 
 }

+ 5 - 0
fs-service/src/main/java/com/fs/qw/vo/QwSopCourseFinishTempSetting.java

@@ -135,6 +135,11 @@ public class QwSopCourseFinishTempSetting implements Serializable,Cloneable{
          * 业务id
          */
         private String businessId;
+
+        /**
+         * 群id
+         */
+        private String chatId;
         @Override
         public Setting clone() {
             try {

+ 5 - 0
fs-service/src/main/java/com/fs/qw/vo/QwSopTempSetting.java

@@ -162,6 +162,11 @@ public class QwSopTempSetting implements Serializable{
              */
             private String businessId;
 
+            /**
+             * 群id
+             */
+            private String chatId;
+
 
             @Override
             public Setting clone() {

+ 9 - 92
fs-service/src/main/java/com/fs/sop/service/impl/SopUserLogsInfoServiceImpl.java

@@ -719,7 +719,7 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                             case "14":
 
                                 linkByMiniApp = createActivityLinkByMiniApp(st,sopLogs, qwGroupChat.getCorpId(), new Date(), param.getCourseId(), param.getVideoId(),
-                                        String.valueOf(qwUser.getId()), qwUser.getCompanyUserId().toString(), qwUser.getCompanyId().toString(),null ,config, groupUser.getChatId());
+                                        String.valueOf(qwUser.getId()), qwUser.getCompanyUserId().toString(), qwUser.getCompanyId().toString() ,config, groupUser.getChatId());
 
                                 miniAppId = null;
                                 if (!miniMap.isEmpty() && qwUser.getSendMsgType() == 1) {
@@ -922,7 +922,7 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                             case "14":
                                 String companyId = String.valueOf(qwUser.getCompanyId()).trim();
                                 linkByMiniApp = createActivityLinkByMiniApp(st,sopLogs, qwUser.getCorpId(), new Date(), param.getCourseId(), param.getVideoId(),
-                                        String.valueOf(qwUser.getId()), qwUser.getCompanyUserId().toString(), qwUser.getCompanyId().toString(),null, config, groupChat.getChatId());
+                                        String.valueOf(qwUser.getId()), qwUser.getCompanyUserId().toString(), qwUser.getCompanyId().toString(), config, groupChat.getChatId());
                                 miniAppId = null;
                                 if (!miniMap.isEmpty() && qwUser.getSendMsgType() == 1) {
                                     Map<Integer, List<CompanyMiniapp>> integerListMap = miniMap.get(Long.valueOf(companyId));
@@ -1241,7 +1241,7 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                                 }
                             }
                             linkByMiniApp = createActivityLinkByMiniApp(st,sopLogs, param.getCorpId(), createTime, param.getCourseId(), param.getVideoId(),
-                                    qwUserId, companyUserId, companyId, item.getExternalId(), config,null);
+                                    qwUserId, companyUserId, companyId, config,null);
 
                             miniAppId = null;
 
@@ -1876,7 +1876,7 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                     }
 
                     linkByMiniApp = createActivityLinkByMiniApp(st,sopLogs, param.getCorpId(), dataTime, param.getCourseId(), param.getVideoId(),
-                            String.valueOf(qwUser.getId()), companyUserId, companyId, item.getExternalId(), config,null);
+                            String.valueOf(qwUser.getId()), companyUserId, companyId,  config,null);
 
                     miniAppId = null;
 
@@ -1926,17 +1926,18 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
         return  list;
     }
 
-    public String createActivityLinkByMiniApp(QwSopCourseFinishTempSetting.Setting st, QwSopLogs sopLogs, String corpId, Date sendTime, Integer courseId, Integer videoId, String qwUserId, String companyUserId, String companyId, Long externalId, CourseConfig config, String chatId) {
+    public String createActivityLinkByMiniApp(QwSopCourseFinishTempSetting.Setting st, QwSopLogs sopLogs, String corpId, Date sendTime, Integer courseId, Integer videoId, String qwUserId, String companyUserId, String companyId,  CourseConfig config, String chatId) {
         FsCourseLink link = createFsCourseLink(corpId, sendTime, courseId, videoId, Long.valueOf(qwUserId),
                 companyUserId, companyId, null, 3, chatId);
         Date updateTime = createUpdateTime(st, sendTime, config);
         link.setUpdateTime(updateTime);
         FsCourseRealLink courseMap = new FsCourseRealLink();
         BeanUtils.copyProperties(link, courseMap);
-        Long businessId = addLuckyBagCollectRecord(st,sopLogs,updateTime,companyUserId,companyId,chatId);
-        courseMap.setBusinessId(String.valueOf(businessId));
-        st.setBusinessId(String.valueOf(businessId));
+//        Long businessId = addLuckyBagCollectRecord(qwUser,luckyBag,st,sopLogs,updateTime,companyUserId,companyId,chatId);
+//        courseMap.setBusinessId(String.valueOf(businessId));
+//        st.setBusinessId(String.valueOf(businessId));
         st.setExternalUserId(sopLogs.getExternalUserId());
+        st.setChatId(chatId);
         String json = configService.selectConfigByKey("luckyBag.config");
         Map<String, Object> luckyBagConfig = JSON.parseObject(json, Map.class);
         Object miniprogramPicUrl = luckyBagConfig.get("miniprogramPicUrl");
@@ -1953,90 +1954,6 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
         return link.getRealLink();
     }
 
-    /**
-     * 增加福袋发放记录、领取记录
-     *
-     * @param content
-     * @param qwSopLogs
-     * @param sendTime
-     * @param companyUserId
-     * @param companyId
-     * @param chatId
-     */
-    private Long addLuckyBagCollectRecord(QwSopCourseFinishTempSetting.Setting content,
-                                          QwSopLogs qwSopLogs,
-                                          Date sendTime,
-                                          String companyUserId,
-                                          String companyId,
-                                          String chatId) {
-        try {
-            // 参数校验
-            if (content == null || qwSopLogs == null || sendTime == null) {
-                log.warn("添加福袋记录失败:必要参数为空 [content:{}, qwSopLogs:{}, sendTime:{}]",
-                        content, qwSopLogs, sendTime);
-                return null;
-            }
-
-            if (StringUtils.isEmpty(companyId) || StringUtils.isEmpty(companyUserId)) {
-                log.warn("公司ID或用户ID为空 [companyId:{}, companyUserId:{}]", companyId, companyUserId);
-                return null;
-            }
-
-            // 验证福袋ID
-            if (content.getLuckyBagId() == null) {
-                log.warn("福袋ID为空");
-                return null;
-            }
-
-            // 查询福袋信息
-            LuckyBag luckyBag = luckyBagMapper.selectLuckyBagById(content.getLuckyBagId());
-            if (luckyBag == null) {
-                log.warn("未找到对应的福袋信息 [luckyBagId:{}]", content.getLuckyBagId());
-                return null;
-            }
-
-            // 检查福袋状态
-            if (luckyBag.getDataStatus() != null && luckyBag.getDataStatus().equals(0)) {
-                log.warn("福袋被禁用 [luckyBagId:{}]", content.getLuckyBagId());
-                return null;
-            }
-
-            // 查询公司信息
-            Company company = companyMapper.selectCompanyById(Long.valueOf(companyId));
-            if (company == null) {
-                log.warn("未找到对应的公司信息 [companyId:{}]", companyId);
-                return null;
-            }
-
-            // 构建福袋记录
-            LuckyBagCollectRecord luckyBagCollectRecord = buildLuckyBagRecord(content, qwSopLogs, sendTime,
-                    companyUserId, companyId, chatId, company, luckyBag);
-
-            // 插入记录并返回ID
-            int result = luckyBagCollectRecordMapper.insertLuckyBagCollectRecord(luckyBagCollectRecord);
-            if (result <= 0) {
-                log.warn("福袋记录插入失败 [luckyBagId:{}]", content.getLuckyBagId());
-                return null;
-            }
-
-            // 返回新增记录的ID
-            Long recordId = luckyBagCollectRecord.getId();
-            if (recordId == null) {
-                log.warn("福袋记录插入成功但未返回ID [luckyBagId:{}]", content.getLuckyBagId());
-                return null;
-            }
-
-            log.info("福袋记录添加成功 [recordId:{}, luckyBagId:{}]", recordId, content.getLuckyBagId());
-            return recordId;
-
-        } catch (NumberFormatException e) {
-            log.error("ID转换失败 [companyId:{}, companyUserId:{}]", companyId, companyUserId, e);
-            return null;
-        } catch (Exception e) {
-            log.error("ID:" + (content != null ? content.getLuckyBagId() : "unknown") + "-添加福袋记录失败", e);
-            return null;
-        }
-    }
 
     private void createVoiceUrlToIm(QwSopCourseFinishTempSetting.Setting st, String companyUserId, QwSop qwSop) {
         QwSopTempVoice qwSopTempVoice = sopTempVoiceService.selectQwSopTempVoiceByCompanyUserIdAndVoiceTxt(Long.valueOf(companyUserId), st.getValue());

+ 1 - 1
fs-service/src/main/java/com/fs/statis/dto/AnalysisPreviewQueryDTO.java

@@ -10,7 +10,7 @@ import java.io.Serializable;
 public class AnalysisPreviewQueryDTO implements Serializable {
 
     /**
-     * 0 今日,1昨日,2本周,3本月,4上月
+     * 0 今日,1昨日,2本周,3本月,4上月,5自定义
      */
     private Integer type;
 

+ 6 - 1
fs-service/src/main/java/com/fs/statis/service/impl/StatisticsServiceImpl.java

@@ -1105,8 +1105,13 @@ public class StatisticsServiceImpl implements IStatisticsService {
 
     @Override
     public List<WatchCourseStatisticsResultDTO> getWatchCourseStatisticsData(AnalysisPreviewQueryDTO param) {
+        String redisData;
+        if (param.getType() != null && param.getType() == 5) {
+            redisData = "";
+        } else {
+            redisData = redisCache.getCacheObject(FsConstants.WATCH_COURSE_STATISTICS_GROUP_COMPANY + param.getType());
+        }
 
-        String redisData = redisCache.getCacheObject(FsConstants.WATCH_COURSE_STATISTICS_GROUP_COMPANY + param.getType());
         List<WatchCourseStatisticsResultDTO> watchCourseStatisticsDTOS = new ArrayList<>();
         if (StringUtils.isNotBlank(redisData)) {
             watchCourseStatisticsDTOS = JSONObject.parseArray(redisData, WatchCourseStatisticsResultDTO.class);

+ 1 - 0
fs-service/src/main/java/com/fs/store/config/StoreConfig.java

@@ -23,5 +23,6 @@ public class StoreConfig implements Serializable {
     private String refundAddress;
     private Integer auditSwitch; // 订单审核开关
     private BigDecimal payPostage; // 货到付款邮费
+    private String jumpStoreAppId; // 跳转商城小程序appid
 
 }

+ 4 - 3
fs-service/src/main/resources/application-druid-jnmy.yml

@@ -237,13 +237,14 @@ isNewWxMerchant: true
 
 wechat:
     company:
-        appid: wxd7c1e221622a0ccf
-        secret: 70d3ed4f8eb68cca0cf525b8ce07405d
+        appid: wxff0d2ab979546bf7
+        secret: 01edaa0c0596f54add4133079cf8042c
         redirectUri: https://company.jnmyunl.com/prod-api/callback
+        isNeedScan: false
     admin:
         appid: wxd7c1e221622a0ccf
         secret: 70d3ed4f8eb68cca0cf525b8ce07405d
         redirectUri: https://admin.jnmyunl.com/prod-api/callback
-    isNeedScan: true
+        isNeedScan: true
 
 

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

@@ -133,7 +133,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </foreach>
     </select>
 
-    <select id="selectFsPackagesByIds" resultType="com.fs.his.vo.FsPackageListVO">
+    <select id="selectFsPackagesByIds" resultType="com.fs.his.vo.FsPackageAndTypeListVO">
         select
         *
         from fs_package

+ 2 - 2
fs-service/src/main/resources/mapper/his/FsUserInformationCollectionMapper.xml

@@ -95,8 +95,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="selectFsUserInformationCollectionByDoctorType2"
             resultType="com.fs.his.domain.FsUserInformationCollection">
         select fui.*,fp.patient_name as patientName from fs_user_information_collection fui left join fs_patient fp on fui.patient_id = fp.patient_id
-            where fui.doctor_confirm = 1
-                <if test="maps.doctorType2Id != null and maps.doctorType2Id != ''"> and fui.doctor_type2_id = #{maps.doctorType2Id}</if>
+            where fui.doctor_confirm = 1 and fui.store_order_id IS NOT NULL
+        <if test="maps.doctorType2Id != null and maps.doctorType2Id != ''"> and fui.doctor_type2_id = #{maps.doctorType2Id}</if>
                 <if test="maps.doctorType2Confirm != null"> and fui.doctor_type2_confirm = #{maps.doctorType2Confirm}</if>
                 <if test="maps.packageOrderCode != null  and maps.packageOrderCode != ''"> and fui.package_order_code = #{maps.packageOrderCode}</if>
                 <if test="maps.patientName != null  and maps.patientName != ''"> and fp.patient_name like concat(#{maps.patientName},"%")</if>

+ 2 - 2
fs-service/src/main/resources/mapper/statis/ConsumptionBalanceMapper.xml

@@ -174,7 +174,7 @@
                 DATE_FORMAT(create_time, '%H') AS start_date,
             </when>
             <!-- 按天分组 -->
-            <when test="type == 2 or type == 3 or type == 4">
+            <when test="type == 2 or type == 3 or type == 4 or type == 5">
                 DATE_FORMAT(create_time, '%Y-%m-%d') AS start_date,
             </when>
         </choose>
@@ -196,7 +196,7 @@
         GROUP BY
         <choose>
             <when test="type == 0 or type == 1">DATE_FORMAT(create_time, '%H')</when>
-            <when test="type == 2 or type == 3 or type == 4">DATE_FORMAT(create_time, '%Y-%m-%d')</when>
+            <when test="type == 2 or type == 3 or type == 4 or type == 5">DATE_FORMAT(create_time, '%Y-%m-%d')</when>
         </choose>
         ORDER BY
         start_date

+ 9 - 0
fs-user-app/src/main/java/com/fs/app/controller/CommonController.java

@@ -53,6 +53,7 @@ import com.fs.im.service.IImService;
 import com.fs.qw.domain.FsAppContactWay;
 import com.fs.qw.service.IFsAppContactWayService;
 import com.fs.qw.service.IQwAppContactWayService;
+import com.fs.store.config.StoreConfig;
 import com.fs.system.oss.CloudStorageService;
 import com.fs.system.oss.OSSFactory;
 import com.fs.system.service.ISysConfigService;
@@ -679,4 +680,12 @@ public class CommonController {
 		return  R.ok().put("isSmsVerification",0);
 
 	}
+
+	@ApiOperation("跳转商城小程序")
+	@GetMapping("/getJumpStoreAppId")
+	public R getJumpStoreAppId() {
+		String json=configService.selectConfigByKey("his.store");
+		StoreConfig config=JSONUtil.toBean(json,StoreConfig.class);
+		return R.ok(config.getJumpStoreAppId());
+	}
 }

+ 23 - 7
fs-user-app/src/main/java/com/fs/app/controller/course/CourseQwController.java

@@ -32,6 +32,7 @@ import com.fs.fastGpt.service.IFastgptEventLogTotalService;
 import com.fs.his.enums.FsUserOperationEnum;
 import com.fs.his.mapper.FsPackageMapper;
 import com.fs.his.service.IFsIntegralGoodsService;
+import com.fs.his.vo.FsPackageAndTypeListVO;
 import com.fs.his.vo.FsPackageListVO;
 import com.fs.sop.domain.QwSop;
 import com.fs.sop.service.IQwSopService;
@@ -53,6 +54,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -265,17 +267,31 @@ public class CourseQwController extends AppBaseController {
                 throw new RuntimeException(e);
             }
             if (jsonNode.isArray()) {
+                List<FsPackageAndTypeListVO> fsPackageListVOS = new ArrayList<>();
                 for (JsonNode node : jsonNode) {
-                    String packageId = node.path("packageId").asText();
-                    if (StringUtils.isNotEmpty(packageId)) {
-                        packageIds.add(packageId);
+                    String type = node.path("type").asText();
+                    if (StringUtils.isNotBlank(type) && "3".equals(type)) {
+                        FsPackageAndTypeListVO fsPackageListVO = new FsPackageAndTypeListVO();
+                        fsPackageListVO.setPackageId(node.path("packageId").asLong());
+                        fsPackageListVO.setPackageName(node.path("packageName").asText());
+                        fsPackageListVO.setSecondName(node.path("secondName").asText());
+                        fsPackageListVO.setTotalPrice(new BigDecimal(node.path("totalPrice").asText()));
+                        fsPackageListVO.setImgUrl(node.path("imgUrl").asText());
+                        fsPackageListVO.setType(3);
+                        fsPackageListVOS.add(fsPackageListVO);
+                    } else {
+                        String packageId = node.path("packageId").asText();
+                        if (StringUtils.isNotEmpty(packageId)) {
+                            packageIds.add(packageId);
+                        }
                     }
                 }
-                List<FsPackageListVO> fsPackageListVOS = new ArrayList<>();
+
                 if (!packageIds.isEmpty()) {
-                    fsPackageListVOS = fsPackageMapper.selectFsPackagesByIds(packageIds);
-                }else {
-                    fsPackageListVOS = new ArrayList<>();
+                    List<FsPackageAndTypeListVO>  fsPackageList= fsPackageMapper.selectFsPackagesByIds(packageIds);
+                    if (!fsPackageList.isEmpty()) {
+                        fsPackageListVOS.addAll(fsPackageList);
+                    }
                 }
                 course.setTreatmentPackage(fsPackageListVOS);
             }