Browse Source

Merge remote-tracking branch 'origin/master'

三七 1 day ago
parent
commit
16a0de34ab
36 changed files with 636 additions and 74 deletions
  1. 3 2
      fs-company-app/src/main/java/com/fs/app/controller/CompanyUserController.java
  2. 5 2
      fs-qw-task/src/main/java/com/fs/app/controller/CommonController.java
  3. 2 2
      fs-qw-task/src/main/java/com/fs/app/task/UserCourseWatchCountTask.java
  4. 1 1
      fs-qw-task/src/main/resources/application.yml
  5. 2 1
      fs-service/src/main/java/com/fs/company/mapper/CompanyUserMapper.java
  6. 2 1
      fs-service/src/main/java/com/fs/company/service/ICompanyUserService.java
  7. 3 2
      fs-service/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java
  8. 6 0
      fs-service/src/main/java/com/fs/course/domain/FsCourseLink.java
  9. 7 0
      fs-service/src/main/java/com/fs/course/domain/FsCourseRealLink.java
  10. 2 0
      fs-service/src/main/java/com/fs/course/param/FsCourseWatchLogListParam.java
  11. 1 1
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseLinkServiceImpl.java
  12. 25 8
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java
  13. 41 14
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  14. 2 0
      fs-service/src/main/java/com/fs/his/mapper/FsPackageMapper.java
  15. 4 0
      fs-service/src/main/java/com/fs/his/mapper/FsUserDoctorMapper.java
  16. 7 0
      fs-service/src/main/java/com/fs/his/service/IFsPackageService.java
  17. 3 0
      fs-service/src/main/java/com/fs/his/service/IFsUserDoctorService.java
  18. 6 0
      fs-service/src/main/java/com/fs/his/service/impl/FsPackageServiceImpl.java
  19. 6 0
      fs-service/src/main/java/com/fs/his/service/impl/FsUserDoctorServiceImpl.java
  20. 2 0
      fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java
  21. 12 0
      fs-service/src/main/java/com/fs/store/domain/FsUserCourseCount.java
  22. 6 0
      fs-service/src/main/java/com/fs/store/mapper/FsUserCourseCountMapper.java
  23. 17 0
      fs-service/src/main/java/com/fs/store/service/impl/FsUserCourseCountServiceImpl.java
  24. 3 1
      fs-service/src/main/java/com/fs/store/vo/h5/UserDetailsVO.java
  25. 94 0
      fs-service/src/main/resources/application-config-druid-bnkc.yml
  26. 2 2
      fs-service/src/main/resources/application-config-druid-fcky.yml
  27. 149 0
      fs-service/src/main/resources/application-druid-bnkc.yml
  28. 5 2
      fs-service/src/main/resources/mapper/company/CompanyUserMapper.xml
  29. 7 1
      fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml
  30. 7 0
      fs-service/src/main/resources/mapper/his/FsPackageMapper.xml
  31. 19 19
      fs-service/src/main/resources/mapper/his/FsUserMapper.xml
  32. 33 15
      fs-service/src/main/resources/mapper/store/FsUserCourseCountMapper.xml
  33. 6 0
      fs-user-app/src/main/java/com/fs/app/controller/DoctorController.java
  34. 7 0
      fs-user-app/src/main/java/com/fs/app/controller/PackageController.java
  35. 129 0
      fs-user-app/src/main/java/com/fs/app/controller/WxH5MpController.java
  36. 10 0
      fs-user-app/src/main/java/com/fs/app/param/FsUserLoginByMpParam.java

+ 3 - 2
fs-company-app/src/main/java/com/fs/app/controller/CompanyUserController.java

@@ -73,12 +73,12 @@ public class CompanyUserController extends AppBaseController {
         // 判断是否管理员 或者包含 1:全部数据权限
         if (companyUser.isAdmin() || companyRoles.stream().anyMatch(r -> "1".equals(r.getDataScope()))) {
             PageHelper.startPage(pageNum, pageSize);
-            companyUsers = companyUserService.getCompanyUserListByDeptId(null);
+            companyUsers = companyUserService.getCompanyUserListByCompanyIdAndDeptId(companyUser.getCompanyId(), null);
         }
         // 判断是否包含 3:本部门数据权限 4:本部门及以下数据权限
         else if (companyRoles.stream().anyMatch(r -> "3".equals(r.getDataScope()) || "4".equals(r.getDataScope()))) {
             PageHelper.startPage(pageNum, pageSize);
-            companyUsers = companyUserService.getCompanyUserListByDeptId(companyUser.getDeptId());
+            companyUsers = companyUserService.getCompanyUserListByCompanyIdAndDeptId(companyUser.getCompanyId(), companyUser.getDeptId());
         }
         // 默认空 -- 判断是否包含 5:仅可查看本人
         else {
@@ -190,6 +190,7 @@ public class CompanyUserController extends AppBaseController {
         BeanUtils.copyProperties(param, companyUser);
 
         companyUser.setUserName(param.getPhoneNumber());
+        companyUser.setUserType("01");
         companyUser.setPhonenumber(param.getPhoneNumber());
         companyUser.setPassword(SecurityUtils.encryptPassword(companyUser.getPassword()));
         companyUser.setCreateTime(new Date());

+ 5 - 2
fs-qw-task/src/main/java/com/fs/app/controller/CommonController.java

@@ -20,6 +20,7 @@ import com.fs.sop.mapper.QwSopMapper;
 import com.fs.sop.mapper.SopUserLogsMapper;
 import com.fs.sop.service.*;
 import com.fs.sop.vo.QwSopLogsDoSendListTVO;
+import com.fs.store.service.IFsUserCourseCountService;
 import io.swagger.annotations.Api;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -82,6 +83,9 @@ public class CommonController {
     @Autowired
     private ISopUserLogsService iSopUserLogsService;
 
+    @Autowired
+    private IFsUserCourseCountService userCourseCountService;
+
 
     @GetMapping("/testSop")
     public R testSop() throws Exception {
@@ -194,8 +198,7 @@ public class CommonController {
     private SopLogsChatTaskService sopLogsChatTaskService;
     @GetMapping("/test2")
     public String selectChatSopUserLogsListByTime() throws Exception {
-        System.out.println("test2");
-       // sopLogsChatTaskService.createAiChatSopLogs();
+        userCourseCountService.insertFsUserCourseCountTask();
         return "s";
     }
 

+ 2 - 2
fs-qw-task/src/main/java/com/fs/app/task/UserCourseWatchCountTask.java

@@ -14,9 +14,9 @@ public class UserCourseWatchCountTask {
 
 
     /**
-     * 每天两点进行会员看课统计
+     * 每15分钟执行一次
      */
-    @Scheduled(cron = "0 0 2 * * ?")  // 2点0分0秒执行
+    @Scheduled(cron = "0 */15 * * * ?")  // 每15分钟执行一次
     public void userCourseCountTask() {
         try {
             log.info("==============会员看课统计任务执行===============开始");

+ 1 - 1
fs-qw-task/src/main/resources/application.yml

@@ -10,4 +10,4 @@ spring:
 #    active: druid-hcl
 #    active: druid-sxjz
 #    active: druid-hdt
-    active: druid-myhk
+    active: druid-fcky-test

+ 2 - 1
fs-service/src/main/java/com/fs/company/mapper/CompanyUserMapper.java

@@ -233,10 +233,11 @@ public interface CompanyUserMapper
 
     /**
      * 根据部门ID查询销售列表
+     * @param companyId 公司ID
      * @param deptId    部门ID
      * @return  list
      */
-    List<CompanyUser> selectAllCompanyUserByDeptId(@Param("deptId") Long deptId);
+    List<CompanyUser> selectAllCompanyUserByCompanyIdAndDeptId(@Param("companyId") Long companyId, @Param("deptId") Long deptId);
 
     @Select("select * from company_user where ma_open_id = #{maOpenId}")
     CompanyUser getCompanyUserByOpenId(String openId);

+ 2 - 1
fs-service/src/main/java/com/fs/company/service/ICompanyUserService.java

@@ -151,10 +151,11 @@ public interface ICompanyUserService {
 
     /**
      * 查询销售列表
+     * @param companyId 公司ID
      * @param deptId 部门ID
      * @return list
      */
-    List<CompanyUser> getCompanyUserListByDeptId(Long deptId);
+    List<CompanyUser> getCompanyUserListByCompanyIdAndDeptId(Long companyId, Long deptId);
 
     /**
      * 根据openid获取销售

+ 3 - 2
fs-service/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java

@@ -457,12 +457,13 @@ public class CompanyUserServiceImpl implements ICompanyUserService
 
     /**
      * 查询销售列表
+     * @param companyId 公司ID
      * @param deptId 部门ID
      * @return list
      */
     @Override
-    public List<CompanyUser> getCompanyUserListByDeptId(Long deptId) {
-        return companyUserMapper.selectAllCompanyUserByDeptId(deptId);
+    public List<CompanyUser> getCompanyUserListByCompanyIdAndDeptId(Long companyId, Long deptId) {
+        return companyUserMapper.selectAllCompanyUserByCompanyIdAndDeptId(companyId, deptId);
     }
 
     @Override

+ 6 - 0
fs-service/src/main/java/com/fs/course/domain/FsCourseLink.java

@@ -2,6 +2,7 @@ package com.fs.course.domain;
 
 import com.fs.common.annotation.Excel;
 import com.fs.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -57,6 +58,11 @@ public class FsCourseLink extends BaseEntity
     private Integer isRoom;//是否发群
     private String chatId;//是否发群
 
+    private Long periodId;
+
+    @ApiModelProperty(value = "营期课程id")
+    private Long id;
+
 //    private String link_uuid;
 
 }

+ 7 - 0
fs-service/src/main/java/com/fs/course/domain/FsCourseRealLink.java

@@ -2,6 +2,7 @@ package com.fs.course.domain;
 
 import com.fs.common.annotation.Excel;
 import com.fs.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -36,4 +37,10 @@ public class FsCourseRealLink implements Serializable
     private Integer isRoom;
     private Long fsUserId;
 
+    private Long periodId;
+
+    @ApiModelProperty(value = "营期课程id")
+    private Long id;
+
+
 }

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

@@ -35,6 +35,8 @@ public class FsCourseWatchLogListParam implements Serializable {
 
     private String sopDate;
 
+    private Integer sendType;
+
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date eTime;
 

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

@@ -533,7 +533,7 @@ public class FsCourseLinkServiceImpl implements IFsCourseLinkService
                         return R.error("真实链接不存在").put("realLink", sLink);
                     }
                     log.info("链接仍然有效: {}", sLink);
-                    String json = configService.selectConfigByKey("h5.course.config");
+                    String json = configService.selectConfigByKey("course.config");
                     CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
                     String domainName = companyUserMapper.selectDomainByUserId(courseLink.getCompanyUserId());
                     if (StringUtils.isEmpty(domainName)){

+ 25 - 8
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java

@@ -650,20 +650,37 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
         }
         return domainName;
     }
+
     public static String generateRandomString() {
         return FsCourseLinkServiceImpl.generateRandomString();
     }
+
     private static Calendar getExpireDay(FsCourseLinkCreateParam param, CourseConfig config, Date createTime) {
-        Integer expireDuration;
-        if (param.getEffectiveDuration() == null || param.getEffectiveDuration() == 0){
-            expireDuration = config.getVideoLinkExpireDate();
-        }else {
-            expireDuration = param.getEffectiveDuration();
+        if (param == null || config == null || createTime == null) {
+            throw new IllegalArgumentException("Parameters cannot be null");
         }
-        // 设置过期时间
+
         Calendar calendar = Calendar.getInstance();
-        calendar.setTime(createTime);
-        calendar.add(Calendar.MINUTE, expireDuration);
+
+        if (param.getEffectiveDuration() == null || param.getEffectiveDuration() == 0) {
+            // 未传时间分钟的走配置,当天24:00(次日0:00)过期
+            Integer expireDays = config.getVideoLinkExpireDate() != null ? config.getVideoLinkExpireDate() : 1; // 默认1天
+
+            Date baseDate = param.getSendTime() != null ? param.getSendTime() : createTime;
+            calendar.setTime(baseDate);
+            calendar.add(Calendar.DAY_OF_MONTH, expireDays);
+
+            // 设置为次日0:00(即当天的24:00)
+            calendar.set(Calendar.HOUR_OF_DAY, 0);
+            calendar.set(Calendar.MINUTE, 0);
+            calendar.set(Calendar.SECOND, 0);
+            calendar.set(Calendar.MILLISECOND, 0);
+        } else {
+            // 传入时间分钟的
+            calendar.setTime(createTime);
+            calendar.add(Calendar.MINUTE, param.getEffectiveDuration());
+        }
+
         return calendar;
     }
     /**

+ 41 - 14
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -877,17 +877,45 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
 
         System.out.println("红包商户号"+amount);
         System.out.println("红包商户号"+packetParam);
-        // 发送红包
-        R sendRedPacket = paymentService.sendRedPacket(packetParam);
-        if (sendRedPacket.get("code").equals(200)) {
-            FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
-            TransferBillsResult transferBillsResult;
-            if (sendRedPacket.get("isNew").equals(1)){
-                transferBillsResult = (TransferBillsResult)sendRedPacket.get("data");
-                redPacketLog.setOutBatchNo(transferBillsResult.getOutBillNo());
-            }else {
-                redPacketLog.setOutBatchNo(sendRedPacket.get("orderCode").toString());
+        //2025.6.19 红包金额为0的时候
+        if (amount.compareTo(BigDecimal.ZERO)>0){
+            // 发送红包
+            R sendRedPacket = paymentService.sendRedPacket(packetParam);
+            if (sendRedPacket.get("code").equals(200)) {
+                FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
+                TransferBillsResult transferBillsResult;
+                if (sendRedPacket.get("isNew").equals(1)){
+                    transferBillsResult = (TransferBillsResult)sendRedPacket.get("data");
+                    redPacketLog.setOutBatchNo(transferBillsResult.getOutBillNo());
+                }else {
+                    redPacketLog.setOutBatchNo(sendRedPacket.get("orderCode").toString());
+                }
+                // 添加红包记录
+                redPacketLog.setCourseId(param.getCourseId());
+//            redPacketLog.setOutBatchNo(sendRedPacket.get("orderCode").toString());
+                redPacketLog.setCompanyId(param.getCompanyId());
+                redPacketLog.setUserId(param.getUserId());
+                redPacketLog.setVideoId(param.getVideoId());
+                redPacketLog.setStatus(0);
+                redPacketLog.setQwUserId(param.getQwUserId() != null ? param.getQwUserId() : null);
+                redPacketLog.setCompanyUserId(param.getCompanyUserId());
+                redPacketLog.setCreateTime(new Date());
+                redPacketLog.setAmount(amount);
+                redPacketLog.setWatchLogId(log.getLogId() != null ? log.getLogId() : null);
+                redPacketLog.setPeriodId(param.getPeriodId());
+                redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
+
+                // 更新观看记录的奖励类型
+//            if (param.getLinkType() == null || param.getLinkType() == 0) {
+                log.setRewardType(config.getRewardType());
+                courseWatchLogMapper.updateFsCourseWatchLog(log);
+//            }
+                return sendRedPacket;
+            } else {
+                return R.error("奖励发送失败,请联系客服");
             }
+        } else {
+            FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
             // 添加红包记录
             redPacketLog.setCourseId(param.getCourseId());
 //            redPacketLog.setOutBatchNo(sendRedPacket.get("orderCode").toString());
@@ -898,7 +926,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             redPacketLog.setQwUserId(param.getQwUserId() != null ? param.getQwUserId() : null);
             redPacketLog.setCompanyUserId(param.getCompanyUserId());
             redPacketLog.setCreateTime(new Date());
-            redPacketLog.setAmount(amount);
+            redPacketLog.setAmount(BigDecimal.ZERO);
             redPacketLog.setWatchLogId(log.getLogId() != null ? log.getLogId() : null);
             redPacketLog.setPeriodId(param.getPeriodId());
             redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
@@ -908,10 +936,9 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             log.setRewardType(config.getRewardType());
             courseWatchLogMapper.updateFsCourseWatchLog(log);
 //            }
-            return sendRedPacket;
-        } else {
-            return R.error("奖励发送失败,请联系客服");
+            return R.ok("红包发送成功");
         }
+
     }
 
     /**

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

@@ -139,4 +139,6 @@ public interface FsPackageMapper
             "</foreach>"+
             "</script>"})
     int updatePackagesStatus(@Param("packageIds")Long[] packageIds,@Param("status")Long status);
+
+    List<String> selectIcdNameByPackageId(@Param("packageId")Long packageId);
 }

+ 4 - 0
fs-service/src/main/java/com/fs/his/mapper/FsUserDoctorMapper.java

@@ -3,6 +3,7 @@ package com.fs.his.mapper;
 import java.util.List;
 
 import com.fs.common.core.domain.R;
+import com.fs.his.domain.FsDoctor;
 import com.fs.his.domain.FsUserDoctor;
 import com.fs.his.param.FsUserDoctorListUParam;
 import com.fs.his.vo.FsUserDoctorListUVO;
@@ -85,4 +86,7 @@ public interface FsUserDoctorMapper
     int checkFollow(@Param("doctorId") Long doctorId,@Param("userId")long userId);
     @Delete("delete from fs_user_doctor  where type=1 and doctor_id=#{doctorId} and user_id=#{userId} ")
     int deleteFollow(@Param("doctorId") Long doctorId,@Param("userId")long userId);
+
+    @Select("select doctor_name as doctorName,avatar as avatar from fs_doctor where is_agreement_prescribe_doctor = 1 ORDER BY RAND() LIMIT 1")
+    FsDoctor getAgreement();
 }

+ 7 - 0
fs-service/src/main/java/com/fs/his/service/IFsPackageService.java

@@ -79,4 +79,11 @@ public interface IFsPackageService
     int updatePackagesStatus(Long[] packageIds, Long status);
 
     String convertImageToJpg(String imgUrl, Long packageId);
+
+    /**
+     * 根据套餐id查询icd名字
+     * @param packageId
+     * @return icdName
+     */
+    List<String> selectIcdNameByPackageId(Long packageId);
 }

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

@@ -3,6 +3,7 @@ package com.fs.his.service;
 import java.util.List;
 
 import com.fs.common.core.domain.R;
+import com.fs.his.domain.FsDoctor;
 import com.fs.his.domain.FsUserDoctor;
 import com.fs.his.param.FsUserDoctorListUParam;
 import com.fs.his.vo.FsUserDoctorListUVO;
@@ -69,4 +70,6 @@ public interface IFsUserDoctorService
     R checkFollow(Long doctorId, long userId);
 
     int deleteFollow(Long doctorId, long userId);
+
+    FsDoctor getAgreement();
 }

+ 6 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsPackageServiceImpl.java

@@ -5,6 +5,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.net.URL;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -293,5 +294,10 @@ public class FsPackageServiceImpl implements IFsPackageService {
         }
         return null;
     }
+
+    @Override
+    public List<String> selectIcdNameByPackageId(Long packageId) {
+        return fsPackageMapper.selectIcdNameByPackageId(packageId);
+    }
 }
 

+ 6 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsUserDoctorServiceImpl.java

@@ -3,6 +3,7 @@ package com.fs.his.service.impl;
 import java.util.List;
 
 import com.fs.common.core.domain.R;
+import com.fs.his.domain.FsDoctor;
 import com.fs.his.param.FsUserDoctorListUParam;
 import com.fs.his.vo.FsUserDoctorListUVO;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -109,4 +110,9 @@ public class FsUserDoctorServiceImpl implements IFsUserDoctorService
     public int deleteFollow(Long doctorId, long userId) {
         return fsUserDoctorMapper.deleteFollow(doctorId,userId);
     }
+
+    @Override
+    public FsDoctor getAgreement() {
+        return fsUserDoctorMapper.getAgreement();
+    }
 }

+ 2 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java

@@ -703,6 +703,8 @@ public class FsUserServiceImpl implements IFsUserService
         if (countRedPacket != null) {
             vo.setAnswerRedPacketTime(countRedPacket.getAnswerRedPacketTime());
             vo.setAnswerRedPacketAmount(countRedPacket.getAnswerRedPacketAmount());
+        } else {
+            vo.setAnswerRedPacketAmount(BigDecimal.ZERO);
         }
         if (countAnswer != null) {
             vo.setAnswerTime(countAnswer.getAnswerTime());

+ 12 - 0
fs-service/src/main/java/com/fs/store/domain/FsUserCourseCount.java

@@ -80,6 +80,10 @@ public class FsUserCourseCount extends BaseEntity
     @Excel(name = "创建日期,为了创建唯一索引", width = 30, dateFormat = "yyyy-MM-dd")
     private Date createDate;
 
+    //最大的看课日期,用于查询唯一数据
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date lastDate;
+
     public void setId(Long id)
     {
         this.id = id;
@@ -215,6 +219,14 @@ public class FsUserCourseCount extends BaseEntity
         this.createDate = createDate;
     }
 
+    public Date getLastDate() {
+        return lastDate;
+    }
+
+    public void setLastDate(Date lastDate) {
+        this.lastDate = lastDate;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)

+ 6 - 0
fs-service/src/main/java/com/fs/store/mapper/FsUserCourseCountMapper.java

@@ -69,6 +69,12 @@ public interface FsUserCourseCountMapper
      */
     List<FsUserCourseCount> getCountResult();
 
+    /**
+     * 获取最近七天每天最大心跳时间的看课记录数据
+     * @return
+     */
+    List<FsUserCourseCount> getUserStatusAndLastWatchDate();
+
     /**
      * 往看课统计表中插入数据
      */

+ 17 - 0
fs-service/src/main/java/com/fs/store/service/impl/FsUserCourseCountServiceImpl.java

@@ -13,6 +13,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 用户看课统计Service业务层处理
@@ -116,6 +118,21 @@ public class FsUserCourseCountServiceImpl implements IFsUserCourseCountService
         // 1、获取统计结果
         List<FsUserCourseCount> countResult = fsUserCourseCountMapper.getCountResult();
 
+        // 查询用户-每天的最新的看课状态,和最后的心跳时间
+        List<FsUserCourseCount> userStatusAndLastWatchDate = fsUserCourseCountMapper.getUserStatusAndLastWatchDate();
+        Map<String, FsUserCourseCount> map = userStatusAndLastWatchDate.stream()
+                .collect(Collectors.toMap(k -> String.format("%s-%s", k.getUserId(), k.getLastDate()), v -> v));
+
+        for (FsUserCourseCount data : countResult) {
+            String key = String.format("%s-%s",data.getUserId(), data.getLastDate());
+            FsUserCourseCount fsUserCourseCount = map.get(key);
+            if(fsUserCourseCount != null){
+                data.setLastWatchDate(fsUserCourseCount.getLastWatchDate());
+                data.setStatus(fsUserCourseCount.getStatus());
+                data.setStopWatchDays(fsUserCourseCount.getStopWatchDays());
+            }
+        }
+
         // 2、分批插入数据
         this.batchInsert(countResult);
 

+ 3 - 1
fs-service/src/main/java/com/fs/store/vo/h5/UserDetailsVO.java

@@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 /**
  * 用户会员详情 输出参数
  */
@@ -21,7 +23,7 @@ public class UserDetailsVO {
     private int answerRedPacketTime;
 
     @ApiModelProperty(value = "答题红包金额")
-    private int answerRedPacketAmount;
+    private BigDecimal answerRedPacketAmount;
 
     @ApiModelProperty(value = "完播次数")
     private int completeWatchCount;

+ 94 - 0
fs-service/src/main/resources/application-config-druid-bnkc.yml

@@ -0,0 +1,94 @@
+baidu:
+  token: 12313231232
+  back-domain: https://www.xxxx.com
+#配置
+logging:
+  level:
+    org.springframework.web: INFO
+    com.github.binarywang.demo.wx.cp: DEBUG
+    me.chanjar.weixin: DEBUG
+wx:
+  miniapp:
+    configs:
+      - appid: wx4115995705bb0ea0   #中康智慧
+        secret: 58910ae743005c396012b029c7def579
+        token: Ncbnd7lJvkripVOpyTFAna6NAWCxCrvC
+        aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
+        msgDataFormat: JSON
+      - appid: wxedde588767b358b1   #中康未来智慧药房
+        secret: 928d2961c81610d8f64b019597212fcd
+        token: Ncbnd7lJvkripVOpyTFAna6NAWCxCrvC
+        aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
+        msgDataFormat: JSON
+  cp:
+    corpId: wwb2a1055fb6c9a7c2
+    appConfigs:
+      - agentId: 1000005
+        secret: ec7okROXJqkNafq66-L6aKNv0asTzQIG0CYrj3vyBbo
+        token: PPKOdAlCoMO
+        aesKey: PKvaxtpSv8NGpfTDm7VUHIK8Wok2ESyYX24qpXJAdMP
+#  pay:
+#    appId:  #微信公众号或者小程序等的appid
+#    mchId:  #微信支付商户号
+#    mchKey:  #微信支付商户密钥
+#    subAppId:  #服务商模式下的子商户公众账号ID
+#    subMchId:  #服务商模式下的子商户号
+#    keyPath: c:\\cert\\apiclient_cert.p12 # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)
+#    notifyUrl: https://userapp.his.runtzh.com/app/wxpay/wxPayNotify
+  mp:
+    useRedis: false
+    redisConfig:
+      host: 127.0.0.1
+      port: 6379
+      timeout: 2000
+    configs:
+      - appId: wx5d3096e20e4bd8ba # 第一个公众号的appid  //公众号名称:成都九州在线互联网医院
+        secret: 1afa05f0c71beff0d52fb849c62e479a # 公众号的appsecret
+        token: PPKOdAlCoMO # 接口配置里的Token值
+        aesKey: Eswa6VjwtVMCcw03qZy6fWllgrv5aytIA1SZPEU0kU2 # 接口配置里的EncodingAESKey值
+aifabu:  #爱链接
+  appKey: 7b471be905ab17e00f3b858c6710dd117601d008
+watch:
+  watchUrl: watch.ylrzcloud.com/prod-api
+  #  account: tcloud
+  #  password: mdf-m2h_6yw2$hq
+  account1: ccif #866655060138751
+  password1: cp-t5or_6xw7$mt
+  account2: tcloud #rt500台
+  password2: mdf-m2h_6yw2$hq
+  account3: whr
+  password3: v9xsKuqn_$d2y
+
+fs :
+  commonApi: http://127.0.0.1:7771
+  h5CommonApi: http://127.0.0.1:7771
+nuonuo:
+  key: 10924508
+  secret: A2EB20764D304D16
+
+# 存储捅配置
+tencent_cloud_config:
+  secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT
+  secret_key: u5SuS80342xzx8FRBukza9lVNHKNMSaB
+  bucket: bnkc-1323137866
+  app_id: 1323137866
+  region: ap-chongqing
+  proxy: bnkc
+tmp_secret_config:
+  secret_id: AKIDCj7NSNAovtqeJpBau8GZ4CGB71thXIxX
+  secret_key: lTB5zwqqz7CNhzDOWivFWedgfTBgxgBT
+  bucket: fs-1319721001
+  app_id: 1319721001
+  region: ap-chongqing
+  proxy: fs
+cloud_host:
+  company_name: 百年康成
+headerImg:
+  imgUrl: https
+ipad:
+  ipadUrl: http://ipad.cdwjyyh.com
+wx_miniapp_temp:
+  pay_order_temp_id:
+  inquiry_temp_id:
+
+

+ 2 - 2
fs-service/src/main/resources/application-config-druid-fcky.yml

@@ -46,7 +46,7 @@ watch:
   password3: v9xsKuqn_$d2y
 
 fs :
-  commonApi: http://127.0.0.1:7771
+  commonApi: http://10.206.0.16:8010
   h5CommonApi: http://127.0.0.1:7771
 nuonuo:
   key: 10924508
@@ -70,7 +70,7 @@ tmp_secret_config:
 cloud_host:
   company_name: 蜂巢快药
 headerImg:
-  imgUrl: https
+  imgUrl: https://fc-1361520560.cos.ap-beijing.myqcloud.com/fs/20250619/ca569852d1da47f3bac8b209347c8011.png
 ipad:
   ipadUrl: http://ipad.cdwjyyh.com
 wx_miniapp_temp:

+ 149 - 0
fs-service/src/main/resources/application-druid-bnkc.yml

@@ -0,0 +1,149 @@
+# 数据源配置
+spring:
+    profiles:
+        include: config-druid-bnkc,common
+    # redis 配置
+    redis:
+        host: 10.206.0.4
+        port: 6379
+        # 数据库索引
+        database: 0
+        # 密码
+        password: Ylrz_1q2w3e4r5t6y
+        # 连接超时时间
+        timeout: 10s
+        lettuce:
+            pool:
+                # 连接池中的最小空闲连接
+                min-idle: 0
+                # 连接池中的最大空闲连接
+                max-idle: 8
+                # 连接池的最大数据库连接数
+                max-active: 100
+                # #连接池最大阻塞等待时间(使用负值表示没有限制)
+                max-wait: -1ms
+    datasource:
+#        clickhouse:
+#            type: com.alibaba.druid.pool.DruidDataSource
+#            driverClassName: com.clickhouse.jdbc.ClickHouseDriver
+#            url: jdbc:clickhouse://1.14.104.71:8123/sop_test?compress=0&use_server_time_zone=true&use_client_time_zone=false&timezone=Asia/Shanghai
+#            username: rt_2024
+#            password: Yzx_19860213
+#            initialSize: 10
+#            maxActive: 100
+#            minIdle: 10
+#            maxWait: 6000
+        mysql:
+            type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: com.mysql.cj.jdbc.Driver
+            druid:
+                # 主库数据源
+                master:
+                  url: jdbc:mysql://10.206.0.15:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                  username: root
+                  password: Ylrz_1q2w3e4r5t6y
+                # 从库数据源
+                slave:
+                    # 从数据源开关/默认关闭
+                    enabled: false
+                    url:
+                    username:
+                    password:
+                # 初始连接数
+                initialSize: 5
+                # 最小连接池数量
+                minIdle: 10
+                # 最大连接池数量
+                maxActive: 20
+                # 配置获取连接等待超时的时间
+                maxWait: 60000
+                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+                timeBetweenEvictionRunsMillis: 60000
+                # 配置一个连接在池中最小生存的时间,单位是毫秒
+                minEvictableIdleTimeMillis: 300000
+                # 配置一个连接在池中最大生存的时间,单位是毫秒
+                maxEvictableIdleTimeMillis: 900000
+                # 配置检测连接是否有效
+                validationQuery: SELECT 1 FROM DUAL
+                testWhileIdle: true
+                testOnBorrow: false
+                testOnReturn: false
+                webStatFilter:
+                    enabled: true
+                statViewServlet:
+                    enabled: true
+                    # 设置白名单,不填则允许所有访问
+                    allow:
+                    url-pattern: /druid/*
+                    # 控制台管理用户名和密码
+                    login-username: fs
+                    login-password: 123456
+                filter:
+                    stat:
+                        enabled: true
+                        # 慢SQL记录
+                        log-slow-sql: true
+                        slow-sql-millis: 1000
+                        merge-sql: true
+                    wall:
+                        config:
+                            multi-statement-allow: true
+        sop:
+            type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: com.mysql.cj.jdbc.Driver
+            druid:
+                # 主库数据源
+                master:
+                    url: jdbc:mysql://10.206.0.15:3306/fs_his_sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Ylrz_1q2w3e4r5t6y
+                # 初始连接数
+                initialSize: 5
+                # 最小连接池数量
+                minIdle: 10
+                # 最大连接池数量
+                maxActive: 20
+                # 配置获取连接等待超时的时间
+                maxWait: 60000
+                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+                timeBetweenEvictionRunsMillis: 60000
+                # 配置一个连接在池中最小生存的时间,单位是毫秒
+                minEvictableIdleTimeMillis: 300000
+                # 配置一个连接在池中最大生存的时间,单位是毫秒
+                maxEvictableIdleTimeMillis: 900000
+                # 配置检测连接是否有效
+                validationQuery: SELECT 1 FROM DUAL
+                testWhileIdle: true
+                testOnBorrow: false
+                testOnReturn: false
+                webStatFilter:
+                    enabled: true
+                statViewServlet:
+                    enabled: true
+                    # 设置白名单,不填则允许所有访问
+                    allow:
+                    url-pattern: /druid/*
+                    # 控制台管理用户名和密码
+                    login-username: fs
+                    login-password: 123456
+                filter:
+                    stat:
+                        enabled: true
+                        # 慢SQL记录
+                        log-slow-sql: true
+                        slow-sql-millis: 1000
+                        merge-sql: true
+                    wall:
+                        config:
+                            multi-statement-allow: true
+rocketmq:
+    name-server: rmq-16xj8o92zp.rocketmq.cd.qcloud.tencenttdmq.com:8080
+    producer:
+        group: my-producer-group
+        access-key: ak16xj8o92zp984557f83ba2 # 替换为实际的 accessKey
+        secret-key: sk2ff1c6b15b74b888 # 替换为实际的 secretKey
+    consumer:
+        group: common-group
+        access-key: ak16xj8o92zp984557f83ba2 # 替换为实际的 accessKey
+        secret-key: sk2ff1c6b15b74b888 # 替换为实际的 secretKey
+

+ 5 - 2
fs-service/src/main/resources/mapper/company/CompanyUserMapper.xml

@@ -138,6 +138,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="voicePrintUrl != null">voice_print_url,</if>
             <if test="addressId != null">address_id,</if>
             <if test="domain != null">domain,</if>
+            <if test="isAudit != null">`is_audit`,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="companyId != null">#{companyId},</if>
@@ -170,7 +171,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="voicePrintUrl != null">#{voicePrintUrl},</if>
             <if test="addressId != null">#{addressId},</if>
             <if test="domain != null">#{domain},</if>
-         </trim>
+            <if test="isAudit != null">#{isAudit},</if>
+        </trim>
     </insert>
 
     <update id="updateCompanyUser" parameterType="CompanyUser">
@@ -299,8 +301,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		    left join company_role r on r.role_id = ur.role_id
     </sql>
 
-    <select id="selectAllCompanyUserByDeptId" resultType="com.fs.company.domain.CompanyUser">
+    <select id="selectAllCompanyUserByCompanyIdAndDeptId" resultType="com.fs.company.domain.CompanyUser">
         select * from company_user where del_flag = '0'
+        and company_id = #{companyId}
         <if test="deptId != null">
             and dept_id = #{deptId}
         </if>

+ 7 - 1
fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml

@@ -56,7 +56,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         select l.log_id,l.user_id,uc.course_name,v.title as video_name,qec.avatar as external_user_avatar,
         l.log_type,SEC_TO_TIME(l.duration) as duration,c.company_name,l.camp_period_time,l.finish_time,
         cu.nick_name as company_user_name ,l.send_type,l.create_time,l.update_time,l.last_heartbeat_time,
-        qu.qw_user_name,qec.name as external_user_name,c.company_id
+        qu.qw_user_name,qec.name as external_user_name,c.company_id,u.avatar as fsAvatar,u.nick_name as fsNickName
          from fs_course_watch_log l
          left join fs_user_course_video v on v.video_id = l.video_id
          left join fs_user_course uc on uc.course_id = l.course_id
@@ -66,6 +66,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
          LEFT JOIN qw_user qu on qu.id= l.qw_user_id
          LEFT JOIN qw_external_contact qec on l.qw_external_contact_id = qec.id
         <where>
+            <if test ='maps.sendType !=null'>
+                and l.send_type = #{maps.sendType}
+            </if>
             <if test ='maps.userId !=null'>
                 and l.user_id = #{maps.userId}
             </if>
@@ -208,6 +211,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="finishTime != null">finish_time,</if>
             <if test="sendFinishMsg != null">send_finish_msg,</if>
             <if test="campPeriodTime != null">camp_period_time,</if>
+            <if test="periodId != null">period_id,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="userId != null">#{userId},</if>
@@ -227,6 +231,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="finishTime != null">#{finishTime},</if>
             <if test="sendFinishMsg != null">#{sendFinishMsg},</if>
             <if test="campPeriodTime != null">#{campPeriodTime},</if>
+            <if test="periodId != null">#{periodId},</if>
         </trim>
     </insert>
 
@@ -341,6 +346,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="finishTime != null">finish_time = #{finishTime},</if>
             <if test="sendFinishMsg != null">send_finish_msg = #{sendFinishMsg},</if>
             <if test="lastHeartbeatTime != null">last_heartbeat_time = #{lastHeartbeatTime},</if>
+            <if test="periodId != null">period_id = #{periodId},</if>
         </trim>
         where log_id = #{logId}
     </update>

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

@@ -69,6 +69,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where package_id = #{packageId}
     </select>
 
+    <select id="selectIcdNameByPackageId" resultType="java.lang.String">
+        SELECT i.icd_name
+        FROM fs_package p
+                 LEFT JOIN fs_icd i ON FIND_IN_SET(i.icd_code, p.icd_code) > 0
+        WHERE package_id = #{packageId};
+    </select>
+
     <insert id="insertFsPackage" parameterType="FsPackage" useGeneratedKeys="true" keyProperty="packageId">
         insert into fs_package
         <trim prefix="(" suffix=")" suffixOverrides=",">

+ 19 - 19
fs-service/src/main/resources/mapper/his/FsUserMapper.xml

@@ -611,14 +611,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                     <when test = "dateTag == '今天'">
                         and to_days(fs_user_course_count.create_time) = to_days(now())
                     </when>
-                    <when test = "dateTag == ' 昨天'">
-                        and to_days(now()) - to_days(fs_user_course_count.create_time) &lt;= 1
+                    <when test = "dateTag == '昨天'">
+                        and fs_user_course_count.create_time &gt;= CURDATE() - INTERVAL 1 DAY AND fs_user_course_count.create_time &lt; CURDATE()
                     </when>
                     <when test = "dateTag == '前天'">
-                        and to_days(now()) - to_days(fs_user_course_count.create_time) &lt;= 2
+                        and fs_user_course_count.create_time &gt;= CURDATE() - INTERVAL 2 DAY AND fs_user_course_count.create_time &lt; CURDATE() - INTERVAL 1 DAY
                     </when>
                     <when test = "dateTag == '近七天'">
-                        and DATE_SUB(CURDATE(), INTERVAL 7 DAY) &lt;= date(fs_user_course_count.create_time)
+                        and fs_user_course_count.create_time &gt;= CURDATE() - INTERVAL 7 DAY
                     </when>
                 </choose>
             </if>
@@ -639,20 +639,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         LEFT JOIN fs_user ON fs_user.user_id = fs_course_answer_logs.user_id
         LEFT JOIN company_user ON company_user.user_id = fs_user.company_user_id
         WHERE
-        company_user.parent_id = #{userId}
+        (company_user.user_id = #{userId} or company_user.parent_id = #{userId} )
         <if test="dateTag != null and dateTag !='' ">
             <choose>
                 <when test = "dateTag == '今天'">
                     and to_days(fs_course_answer_logs.create_time) = to_days(now())
                 </when>
-                <when test = "dateTag == ' 昨天'">
-                    and to_days(now()) - to_days(fs_course_answer_logs.create_time) &lt;= 1
+                <when test = "dateTag == '昨天'">
+                    and fs_course_answer_logs.create_time &gt;= CURDATE() - INTERVAL 1 DAY AND fs_course_answer_logs.create_time &lt; CURDATE()
                 </when>
                 <when test = "dateTag == '前天'">
-                    and to_days(now()) - to_days(fs_course_answer_logs.create_time) &lt;= 2
+                    and fs_course_answer_logs.create_time &gt;= CURDATE() - INTERVAL 2 DAY AND fs_course_answer_logs.create_time &lt; CURDATE() - INTERVAL 1 DAY
                 </when>
                 <when test = "dateTag == '近七天'">
-                    and DATE_SUB(CURDATE(), INTERVAL 7 DAY) &lt;= date(fs_course_answer_logs.create_time)
+                    and fs_course_answer_logs.create_time &gt;= CURDATE() - INTERVAL 7 DAY
                 </when>
             </choose>
         </if>
@@ -669,21 +669,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         LEFT JOIN fs_user ON fs_user.user_id = fs_course_answer_logs.user_id
         LEFT JOIN company_user ON company_user.user_id = fs_user.company_user_id
         WHERE
-        company_user.parent_id = #{userId}
+        (company_user.user_id = #{userId} or company_user.parent_id = #{userId} )
         AND fs_course_answer_logs.is_right = 1
         <if test="dateTag != null and dateTag !='' ">
             <choose>
                 <when test = "dateTag == '今天'">
                     and to_days(fs_course_answer_logs.create_time) = to_days(now())
                 </when>
-                <when test = "dateTag == ' 昨天'">
-                    and to_days(now()) - to_days(fs_course_answer_logs.create_time) &lt;= 1
+                <when test = "dateTag == '昨天'">
+                    and fs_course_answer_logs.create_time &gt;= CURDATE() - INTERVAL 1 DAY AND fs_course_answer_logs.create_time &lt; CURDATE()
                 </when>
                 <when test = "dateTag == '前天'">
-                    and to_days(now()) - to_days(fs_course_answer_logs.create_time) &lt;= 2
+                    and fs_course_answer_logs.create_time &gt;= CURDATE() - INTERVAL 2 DAY AND fs_course_answer_logs.create_time &lt; CURDATE() - INTERVAL 1 DAY
                 </when>
                 <when test = "dateTag == '近七天'">
-                    and DATE_SUB(CURDATE(), INTERVAL 7 DAY) &lt;= date(fs_course_answer_logs.create_time)
+                    and fs_course_answer_logs.create_time &gt;= CURDATE() - INTERVAL 7 DAY
                 </when>
             </choose>
         </if>
@@ -704,20 +704,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         LEFT JOIN fs_user ON fs_user.user_id = fs_course_red_packet_log.user_id
         LEFT JOIN company_user ON company_user.user_id = fs_user.company_user_id
         WHERE
-        company_user.parent_id = #{userId}
+        (company_user.user_id = #{userId} or company_user.parent_id = #{userId} )
         <if test="dateTag != null and dateTag !='' ">
             <choose>
                 <when test = "dateTag == '今天'">
                     and to_days(fs_course_red_packet_log.create_time) = to_days(now())
                 </when>
-                <when test = "dateTag == ' 昨天'">
-                    and to_days(now()) - to_days(fs_course_red_packet_log.create_time) &lt;= 1
+                <when test = "dateTag == '昨天'">
+                    and fs_course_red_packet_log.create_time &gt;= CURDATE() - INTERVAL 1 DAY AND fs_course_red_packet_log.create_time &lt; CURDATE()
                 </when>
                 <when test = "dateTag == '前天'">
-                    and to_days(now()) - to_days(fs_course_red_packet_log.create_time) &lt;= 2
+                    and fs_course_red_packet_log.create_time &gt;= CURDATE() - INTERVAL 2 DAY AND fs_course_red_packet_log.create_time &lt; CURDATE() - INTERVAL 1 DAY
                 </when>
                 <when test = "dateTag == '近七天'">
-                    and DATE_SUB(CURDATE(), INTERVAL 7 DAY) &lt;= date(fs_course_red_packet_log.create_time)
+                    and fs_course_red_packet_log.create_time &gt;= CURDATE() - INTERVAL 7 DAY
                 </when>
             </choose>
         </if>

+ 33 - 15
fs-service/src/main/resources/mapper/store/FsUserCourseCountMapper.xml

@@ -149,30 +149,48 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             ( count( DISTINCT CASE WHEN fwl.log_type = 3 THEN fwl.video_id END ) > 0, 1, 2 ) AS missCourseStatus,
             GROUP_CONCAT( DISTINCT fwl.period_id ) AS courseIds,
             count(DISTINCT fwl.period_id ) AS partCourseCount,
-            a.last_heartbeat_time AS lastWatchDate,
-            CASE
-                WHEN a.log_type = 1
-                    OR a.log_type = 2 THEN
-                    1
-                WHEN a.log_type = 4 THEN
-                    2
-                WHEN a.log_type = 3 THEN
-                    3
-                END AS STATUS,
-            DATEDIFF(DATE_FORMAT(NOW(),'%Y-%m-%d'),DATE_FORMAT(a.last_heartbeat_time,'%Y-%m-%d')) as stop_watch_days,
             max( CASE WHEN fwl.log_type = 2 THEN fwl.last_heartbeat_time END ) AS completeWatchDate,
             count( CASE WHEN fwl.log_type = 2 THEN fwl.log_id END ) AS completeWatchCount,
             count( CASE WHEN fwl.log_type != 3 THEN fwl.log_id END ) AS watch_times,
-            NOW() AS create_time,
+            DATE_FORMAT(fwl.create_time,'%Y-%m-%d 00:00:00') AS createTime,
             NOW() AS updateTime,
-            curdate() AS create_date
+            DATE_FORMAT(fwl.create_time,'%Y-%m-%d') AS create_date,
+            DATE (fwl.create_time ) AS lastDate
         FROM
-            ( SELECT fs_course_watch_log.user_id, Max( fs_course_watch_log.last_heartbeat_time ) AS last_heartbeat_time, log_type FROM fs_course_watch_log GROUP BY fs_course_watch_log.user_id ) a
-                INNER JOIN fs_course_watch_log fwl ON fwl.user_id = a.user_id
+            fs_course_watch_log fwl
+        where fwl.send_type = 1 and fwl.create_time &gt;= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
         GROUP BY
             fwl.user_id
     </select>
 
+    <select id="getUserStatusAndLastWatchDate" resultType="FsUserCourseCount">
+        SELECT
+            fs_course_watch_log.user_id,
+            Max( fs_course_watch_log.last_heartbeat_time ) AS lastWatchDate,
+            Max( DATE ( fs_course_watch_log.create_time ) ) AS lastDate,
+            CASE
+
+                WHEN fs_course_watch_log.log_type = 1
+                    OR fs_course_watch_log.log_type = 2 THEN
+                    1
+                WHEN fs_course_watch_log.log_type = 4 THEN
+                    2
+                WHEN fs_course_watch_log.log_type = 3 THEN
+                    3
+                END AS STATUS,
+            DATEDIFF(
+                    DATE_FORMAT( NOW(), '%Y-%m-%d' ),
+                    DATE_FORMAT( fs_course_watch_log.last_heartbeat_time, '%Y-%m-%d' )) AS stop_watch_days
+        FROM
+            fs_course_watch_log
+        WHERE
+            fs_course_watch_log.send_type = 1
+          AND fs_course_watch_log.create_time >= DATE_SUB( CURDATE(), INTERVAL 7 DAY )
+        GROUP BY
+            fs_course_watch_log.user_id, date(fs_course_watch_log.create_time)
+    </select>
+
+
     <insert id="insertFsUserCourseCountTask" parameterType="FsUserCourseCount" useGeneratedKeys="true" keyProperty="id">
         insert into fs_user_course_count
         <trim prefix="(" suffix=")" suffixOverrides=",">

+ 6 - 0
fs-user-app/src/main/java/com/fs/app/controller/DoctorController.java

@@ -137,4 +137,10 @@ public class DoctorController extends  AppBaseController {
             return R.ok("已关注");
         }
     }
+
+    @ApiOperation("随机获取一个协定方医生")
+    @GetMapping("/getAgreement")
+    public R getAgreement(){
+        return R.ok().put("doctor",userDoctorService.getAgreement());
+    }
 }

+ 7 - 0
fs-user-app/src/main/java/com/fs/app/controller/PackageController.java

@@ -135,6 +135,13 @@ public class PackageController extends AppBaseController {
 //        return R.ok().put("data",fsPackage).put("storeName",storeName);
     }
 
+    @ApiOperation("获取ic名字")
+    @GetMapping("/getIcdNameByPackageId")
+    public R getIcdNameByPackageId(@RequestParam("packageId") Long packageId) {
+        List<String> icdNames = packageService.selectIcdNameByPackageId(packageId);
+        return R.ok().put("icdNames", icdNames);
+    }
+
     @ApiOperation("获取套餐下医生")
     @GetMapping("/getPackageDoctorList")
     public R getPackageDoctorList(FsDoctorListUParam param) {

+ 129 - 0
fs-user-app/src/main/java/com/fs/app/controller/WxH5MpController.java

@@ -0,0 +1,129 @@
+package com.fs.app.controller;
+
+import cn.hutool.core.date.DateTime;
+import com.fs.app.param.FsUserLoginByMpParam;
+import com.fs.app.utils.JwtUtils;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.redis.RedisCache;
+import com.fs.company.domain.Company;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.service.ICompanyService;
+import com.fs.company.service.ICompanyUserService;
+import com.fs.course.mapper.FsCourseWatchLogMapper;
+import com.fs.qw.mapper.QwExternalContactMapper;
+import com.fs.his.domain.FsUser;
+import com.fs.his.service.IFsUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.bean.WxOAuth2UserInfo;
+import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.mp.api.WxMpService;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@Api("会员-h5-微信相关接口(后面不需要这个接口了,再删除))")
+@RestController
+@RequestMapping("/app/wx/h5/mp")
+@Slf4j
+public class WxH5MpController {
+    Logger logger = LoggerFactory.getLogger(getClass());
+    @Autowired
+    private WxMpService wxMpService;
+
+    @Autowired
+    private IFsUserService userService;
+
+    @Autowired
+    JwtUtils jwtUtils;
+    @Autowired
+    RedisCache redisCache;
+
+    @Autowired
+    FsCourseWatchLogMapper fsCourseWatchLogMapper;
+    @Autowired
+    QwExternalContactMapper qwExternalContactMapper;
+    @Autowired
+    ICompanyService companyService;
+    @Autowired
+    ICompanyUserService companyUserService;
+
+
+    @ApiOperation("课程分享链接公众号登录")
+    @PostMapping("/loginByMp")
+    public R loginByMp(@Valid @RequestBody FsUserLoginByMpParam param) throws WxErrorException {
+//        try {
+            //获取微信用户信息
+            WxOAuth2AccessToken wxMpOAuth2AccessToken = wxMpService.getOAuth2Service().getAccessToken(param.getCode());
+            WxOAuth2UserInfo wxMpUser = wxMpService.getOAuth2Service().getUserInfo(wxMpOAuth2AccessToken, null);
+            //1、特殊(需求设计:需要根据公司是否开启黑名单来设置会员初始化的状态)
+            Company company = null;
+            if(param.getCompanyId() != null){
+                company = companyService.selectCompanyById(param.getCompanyId());
+            }
+            // 根据销售后台设置的  是否需要单独注册会员 来判断是否需要设置销售的值
+            CompanyUser companyUser = companyUserService.selectCompanyUserById(param.getCompanyUserId());
+
+            FsUser user;
+            if(StringUtils.isNotEmpty(wxMpUser.getUnionId())) {
+                user = userService.selectFsUserByUnionId(wxMpUser.getUnionId());
+            } else {
+                user = userService.selectFsUserByMpOpenId(wxMpUser.getOpenid());
+            }
+            if (user != null) {
+                //修改
+                FsUser userMap = new FsUser();
+                userMap.setUserId(user.getUserId());
+                userMap.setMpOpenId(wxMpUser.getOpenid());
+                userMap.setUnionId(wxMpUser.getUnionId());
+                userMap.setUpdateTime(new DateTime());
+                userMap.setAvatar(wxMpUser.getHeadImgUrl());
+                userMap.setNickName(wxMpUser.getNickname());
+                userService.updateFsUser(userMap);
+            } else {
+                //新增
+                user = new FsUser();
+                user.setNickName(wxMpUser.getNickname());
+                user.setAvatar(wxMpUser.getHeadImgUrl());
+                user.setStatus((company != null ? company.getFsUserIsDefaultBlack() : 0) == 1 ? 0 : 1);
+                user.setMpOpenId(wxMpUser.getOpenid());
+                user.setUnionId(wxMpUser.getUnionId());
+                user.setCreateTime(new Date());
+                if(companyUser.getIsNeedRegisterMember() != 1){
+                    user.setCompanyId(param.getCompanyId());
+                    user.setCompanyUserId(param.getCompanyUserId());
+                }
+                userService.insertFsUser(user);
+            }
+            log.error("用户信息user: {}, 用户id: {}", user, user.getUserId());
+            String token = jwtUtils.generateToken(user.getUserId());
+            redisCache.setCacheObject("token:" + user.getUserId(), token, 604800, TimeUnit.SECONDS);
+            Map<String, Object> map = new HashMap<>();
+            map.put("token", token);
+            map.put("user", user);
+            return R.ok(map);
+//        } catch (WxErrorException e) {
+//            if (e.getError().getErrorCode() == 40163) {
+//                return R.error(40163, e.getError().getErrorMsg());
+//            } else {
+//                return R.error("授权失败," + e.getMessage());
+//            }
+//        }
+
+    }
+
+
+}

+ 10 - 0
fs-user-app/src/main/java/com/fs/app/param/FsUserLoginByMpParam.java

@@ -1,8 +1,10 @@
 package com.fs.app.param;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 import java.io.Serializable;
 
 @Data
@@ -10,4 +12,12 @@ public class FsUserLoginByMpParam implements Serializable {
     @NotBlank(message = "code参数缺失")
     private String code;
     private Long videoId;
+
+    @NotNull(message = "公司id不能为空")
+    @ApiModelProperty(value = "公司id")
+    private Long companyId;
+
+    @NotNull(message = "销售id不能为空")
+    @ApiModelProperty(value = "销售id")
+    private Long companyUserId;
 }