فهرست منبع

Merge remote-tracking branch 'origin/master'

yjwang 1 روز پیش
والد
کامیت
39d6d888e6
28فایلهای تغییر یافته به همراه414 افزوده شده و 69 حذف شده
  1. 29 0
      fs-admin/src/main/java/com/fs/his/task/PeriodTask.java
  2. 4 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyUserMapper.java
  3. 2 0
      fs-service/src/main/java/com/fs/company/service/ICompanyUserService.java
  4. 5 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java
  5. 6 0
      fs-service/src/main/java/com/fs/course/domain/FsCourseLink.java
  6. 7 0
      fs-service/src/main/java/com/fs/course/domain/FsCourseRealLink.java
  7. 2 0
      fs-service/src/main/java/com/fs/course/param/FsCourseWatchLogListParam.java
  8. 1 1
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseLinkServiceImpl.java
  9. 25 8
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java
  10. 41 14
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  11. 2 0
      fs-service/src/main/java/com/fs/his/mapper/FsPackageMapper.java
  12. 4 0
      fs-service/src/main/java/com/fs/his/mapper/FsUserDoctorMapper.java
  13. 7 0
      fs-service/src/main/java/com/fs/his/service/IFsPackageService.java
  14. 3 0
      fs-service/src/main/java/com/fs/his/service/IFsUserDoctorService.java
  15. 6 0
      fs-service/src/main/java/com/fs/his/service/impl/FsPackageServiceImpl.java
  16. 6 0
      fs-service/src/main/java/com/fs/his/service/impl/FsUserDoctorServiceImpl.java
  17. 43 39
      fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java
  18. 8 0
      fs-service/src/main/java/com/fs/sop/params/QwSopLogsParam.java
  19. 39 5
      fs-service/src/main/java/com/fs/sop/service/impl/QwSopLogsServiceImpl.java
  20. 1 1
      fs-service/src/main/resources/application-config-druid-fcky.yml
  21. 6 0
      fs-service/src/main/resources/mapper/company/CompanyUserMapper.xml
  22. 4 1
      fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml
  23. 7 0
      fs-service/src/main/resources/mapper/his/FsPackageMapper.xml
  24. 4 0
      fs-service/src/main/resources/mapper/sop/QwSopLogsMapper.xml
  25. 6 0
      fs-user-app/src/main/java/com/fs/app/controller/DoctorController.java
  26. 7 0
      fs-user-app/src/main/java/com/fs/app/controller/PackageController.java
  27. 129 0
      fs-user-app/src/main/java/com/fs/app/controller/WxH5MpController.java
  28. 10 0
      fs-user-app/src/main/java/com/fs/app/param/FsUserLoginByMpParam.java

+ 29 - 0
fs-admin/src/main/java/com/fs/his/task/PeriodTask.java

@@ -0,0 +1,29 @@
+package com.fs.his.task;
+
+import com.fs.course.service.IFsUserCoursePeriodDaysService;
+import com.fs.course.service.IFsUserCoursePeriodService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component("periodTask")
+public class PeriodTask {
+
+    @Autowired
+    private IFsUserCoursePeriodService userCoursePeriodService;
+    @Autowired
+    private IFsUserCoursePeriodDaysService userCoursePeriodDaysService;
+
+    /**
+     * 更新营期状态
+     */
+    public void refreshPeriod() {
+        userCoursePeriodService.changePeriodStatus();
+    }
+
+    /**
+     * 更新营期课程状态
+     */
+    public void refreshPeriodDays() {
+        userCoursePeriodDaysService.changePeriodCourseStatus();
+    }
+}

+ 4 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyUserMapper.java

@@ -1,5 +1,7 @@
 package com.fs.company.mapper;
 
+import com.fs.common.annotation.DataSource;
+import com.fs.common.enums.DataSourceType;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.param.CompanyUserAreaParam;
 import com.fs.company.param.CompanyUserQwParam;
@@ -259,4 +261,6 @@ public interface CompanyUserMapper
      * @return 结果
      * **/
     List<CompanyUser> getUserInfoByUserIds(@Param("ids") List<Long> ids);
+    @DataSource(DataSourceType.MASTER)
+    CompanyUser selectCompanyUserByPhone(String phone);
 }

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

@@ -193,4 +193,6 @@ public interface ICompanyUserService {
     Boolean setIsRegisterMember(boolean status,  List<Long> userIds);
 
     void auditUsers(List<Long> userIds);
+
+    CompanyUser selectCompanyUserByPhone(String phone);
 }

+ 5 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java

@@ -512,4 +512,9 @@ public class CompanyUserServiceImpl implements ICompanyUserService
         }
         companyUserMapper.auditUsers(userIds);
     }
+
+    @Override
+    public CompanyUser selectCompanyUserByPhone(String phone) {
+        return companyUserMapper.selectCompanyUserByPhone(phone);
+    }
 }

+ 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();
+    }
 }

+ 43 - 39
fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java

@@ -169,6 +169,9 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
     @Autowired
     private SopUserLogsInfoMapper sopUserLogsInfoMapper;
 
+    @Autowired
+    private IQwCompanyService iQwCompanyService;
+
     @Autowired
     private ISopUserLogsService sopUserLogsService;
 
@@ -3114,9 +3117,7 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
             return attachments;
         }
 
-        String json = configService.selectConfigByKey("course.config");
-        CourseConfig config = JSON.parseObject(json, CourseConfig.class);
-
+        QwCompany qwCompany = iQwCompanyService.getQwCompanyByRedis(corpId);
 
         attachments.forEach(att -> {
             // 生成短链的条件判断
@@ -3161,51 +3162,54 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
 
                 try {
 
-                    String mediaId = (String) redisCache.getCacheObject("miniprogram:" + corpId + ":" + att.getMiniprogram().getCourseId());
-                    if (!StringUtil.strIsNullOrEmpty(mediaId)) {
-
-                        FsCourseLinkCreateParam param = new FsCourseLinkCreateParam();
-                        param.setVideoId(Long.valueOf(att.getMiniprogram().getVideoId()));
-                        param.setQwUserId(qwUser.getId());
-                        param.setDays(att.getMiniprogram().getExpiresDays());
-                        param.setCorpId(corpId);
-                        param.setCourseId(Long.valueOf(att.getMiniprogram().getCourseId()));
-                        param.setCompanyUserId(qwUser.getCompanyUserId());
-                        param.setCompanyId(qwUser.getCompanyId());
-                        param.setQwExternalId(qwExternalId);
-                        param.setSendTime(new Date());
+                    //小程序
+                    if("miniprogram".equals(att.getMsgtype())
+                            && !StringUtil.strIsNullOrEmpty(att.getMiniprogram().getCourseId())
+                            && !StringUtil.strIsNullOrEmpty(att.getMiniprogram().getVideoId())){
 
-                        String linkUrl = iFsCourseLinkService.createLinkUrlWcmini(param);
+                        try {
 
-                        if (!StringUtil.strIsNullOrEmpty(linkUrl)) {
-                            att.getMiniprogram().setPage(linkUrl);
-                        }
+                            String mediaId =(String)redisCache.getCacheObject("miniprogram:"+corpId+":"+att.getMiniprogram().getCourseId());
+                            if (!StringUtil.strIsNullOrEmpty(mediaId)){
 
-                        if (config!=null){
+                                FsCourseLinkCreateParam param = new FsCourseLinkCreateParam();
+                                param.setVideoId(Long.valueOf(att.getMiniprogram().getVideoId()));
+                                param.setQwUserId(qwUser.getId());
+                                param.setDays(att.getMiniprogram().getExpiresDays());
+                                param.setCorpId(corpId);
+                                param.setCourseId(Long.valueOf(att.getMiniprogram().getCourseId()));
+                                param.setCompanyUserId(qwUser.getCompanyUserId());
+                                param.setCompanyId(qwUser.getCompanyId());
+                                param.setQwExternalId(qwExternalId);
+                                param.setSendTime(new Date());
 
-                            if (StringUtil.strIsNullOrEmpty(config.getMiniprogramAppid())) {
-                                logger.error("配置中无小程序id,采用默认的");
-                                att.getMiniprogram().setAppid("wxc84c6f789ba7f176");
-                            } else {
+                                String linkUrl = iFsCourseLinkService.createLinkUrlWcmini(param);
 
-                                att.getMiniprogram().setAppid(config.getMiniprogramAppid());
+                                if (!StringUtil.strIsNullOrEmpty(linkUrl)) {
+                                    att.getMiniprogram().setPage(linkUrl);
+                                }
+                                if (!StringUtil.strIsNullOrEmpty(qwCompany.getMiniAppId())){
+                                    att.getMiniprogram().setAppid(qwCompany.getMiniAppId());
+                                }else {
+                                    logger.error("欢迎语:企业未配置小程序id:采用默认appid"+corpId);
+                                }
+                                att.getMiniprogram().setPic_media_id(mediaId);
+
+                                //生成观看记录
+                                addWatchLogIfNeeded(Integer.valueOf(att.getMiniprogram().getVideoId()),
+                                        Integer.valueOf(att.getMiniprogram().getCourseId()),
+                                        String.valueOf(qwUser.getId()),
+                                        String.valueOf(qwUser.getCompanyUserId()),
+                                        String.valueOf(qwUser.getCompanyId()),
+                                        String.valueOf(qwExternalId));
+                            }else {
+                                logger.error("查到课程相关信息:"+corpId+":"+att.getMiniprogram().getCourseId());
                             }
 
+                        }  catch (Exception e) {
+                            logger.error("欢迎语生成小程序消息失败:"+e.getMessage()+"|"+corpId+"|"+att.getMiniprogram().getCourseId());
                         }
-
-                        att.getMiniprogram().setPic_media_id(mediaId);
-
-                        //生成观看记录
-                        addWatchLogIfNeeded(Integer.valueOf(att.getMiniprogram().getVideoId()),
-                                Integer.valueOf(att.getMiniprogram().getCourseId()),
-                                String.valueOf(qwUser.getId()),
-                                String.valueOf(qwUser.getCompanyUserId()),
-                                String.valueOf(qwUser.getCompanyId()),
-                                String.valueOf(qwExternalId));
-                    }else {
-                        logger.error("查到课程相关信息:"+corpId+":"+att.getMiniprogram().getCourseId());
                     }
-
                 }  catch (Exception e) {
                     logger.error("欢迎语生成小程序消息失败:"+e.getMessage()+"|"+corpId+"|"+att.getMiniprogram().getCourseId());
                 }

+ 8 - 0
fs-service/src/main/java/com/fs/sop/params/QwSopLogsParam.java

@@ -3,6 +3,8 @@ package com.fs.sop.params;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
+import java.util.List;
+
 @Data
 public class QwSopLogsParam {
     /**
@@ -16,6 +18,7 @@ public class QwSopLogsParam {
     private String qwUserName;
 
     private String qwUserid;
+    private List<String> qwUseridByList;
 
     /**
      * 客户昵称
@@ -51,4 +54,9 @@ public class QwSopLogsParam {
 
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private String sendTime;
+
+    /**
+     * 手机号
+     */
+    private String phone;
 }

+ 39 - 5
fs-service/src/main/java/com/fs/sop/service/impl/QwSopLogsServiceImpl.java

@@ -1,13 +1,17 @@
 package com.fs.sop.service.impl;
 
 
+import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.StringUtils;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.service.ICompanyUserService;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.FsCourseWatchLog;
 import com.fs.course.service.IFsCourseWatchLogService;
+import com.fs.course.service.IFsUserCompanyUserService;
 import com.fs.fastGpt.service.IFastGptChatSessionService;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.domain.QwUser;
@@ -37,6 +41,7 @@ import com.fs.sop.vo.QwSopLogsDoSendListTVO;
 import com.fs.sop.vo.QwSopLogsListCVO;
 import com.fs.system.service.ISysConfigService;
 import com.fs.voice.utils.StringUtil;
+import org.apache.commons.collections.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -99,6 +104,9 @@ public class QwSopLogsServiceImpl implements IQwSopLogsService
     @Autowired
     private IFastGptChatSessionService fastGptChatSessionService;
 
+    @Autowired
+    private ICompanyUserService companyUserService;
+
 
     /**
      * 查询企业微信SOP  定时任务
@@ -129,16 +137,42 @@ public class QwSopLogsServiceImpl implements IQwSopLogsService
      */
     @Override
     public List<QwSopLogsListCVO> selectQwSopLogsListBySopId(QwSopLogsParam param) {
+        if (param == null || param.getType() == null) {
+            return Collections.emptyList();
+        }
 
-        switch (param.getType()){
-            //个微
+        switch (param.getType()) {
+            // 个微
             case 1:
                 return qwSopLogsMapper.selectQwSopLogsListByGwSopId(param);
-            //企微
+            // 企微
             case 2:
-                return qwSopLogsMapper.selectQwSopLogsListByQwSopId(param);
+                return handleQwSopLogs(param);
+            default:
+                return Collections.emptyList();
+        }
+    }
+
+    private List<QwSopLogsListCVO> handleQwSopLogs(QwSopLogsParam param) {
+        if (StringUtils.isNotEmpty(param.getPhone())) {
+            try {
+                CompanyUser companyUser = companyUserService.selectCompanyUserByPhone(param.getPhone());
+                if (companyUser == null) {
+                    return Collections.emptyList();
+                }
+                QwUser qwUser = new QwUser();
+                qwUser.setCompanyUserId(companyUser.getUserId());
+                List<QwUser> qwUsers = qwUserMapper.selectQwUserList(qwUser);
+                if (CollectionUtils.isNotEmpty(qwUsers)){
+                    List<String> qwUserIds = qwUsers.stream().map(QwUser::getQwUserId).collect(Collectors.toList());
+                    param.setQwUseridByList(qwUserIds);
+                }
+            } catch (Exception e) {
+                logger.error("根据手机号查询企业用户出现异常,手机号: {}, 异常信息: {}", param.getPhone(), e.getMessage(), e);
+                return Collections.emptyList();
+            }
         }
-       return null;
+        return qwSopLogsMapper.selectQwSopLogsListByQwSopId(param);
     }
 
 

+ 1 - 1
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:80108010
   h5CommonApi: http://127.0.0.1:7771
 nuonuo:
   key: 10924508

+ 6 - 0
fs-service/src/main/resources/mapper/company/CompanyUserMapper.xml

@@ -280,6 +280,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </select>
 
 
+
+    <select id="selectCompanyUserByPhone" resultType="com.fs.company.domain.CompanyUser">
+        select user_id, dept_id, user_name, nick_name, user_type, email, phonenumber, sex, avatar, password, status, del_flag, login_ip, login_date, create_by, create_time, update_by, update_time, remark, open_id, id_card, company_id, qr_code_weixin, qr_code_wecom, jpush_id, qw_user_id, qw_status, voice_print_url, address_id, `domain`, parent_id, bind_code from company_user where phonenumber=#{phone} and del_flag=0
+    </select>
+
+
     <sql id="selectUserVo">
         select u.user_id,u.qw_user_id,u.company_id,u.voice_print_url, u.dept_id, u.user_name, u.nick_name,
                u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip,

+ 4 - 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>

+ 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=",">

+ 4 - 0
fs-service/src/main/resources/mapper/sop/QwSopLogsMapper.xml

@@ -181,6 +181,10 @@
             <if test="map.externalUserName != null and map.externalUserName!= '' ">AND external_user_name = #{map.externalUserName}</if>
             <if test="map.scheduleStartTime != null">AND send_time &gt;= #{map.scheduleStartTime}</if>
             <if test="map.scheduleEndTime != null">AND send_time &lt;=  #{map.scheduleEndTime}</if>
+            <if test="map.qwUseridByList != null">AND qw_userid IN
+                <foreach collection="map.qwUseridByList" item="item" open="(" separator="," close=")">
+                    #{item}
+                </foreach></if>
         </where>
         ORDER BY send_time desc,real_send_time desc
 

+ 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;
 }