Bläddra i källkod

短信发课优化修改

wangxy 20 timmar sedan
förälder
incheckning
da957bfbee
19 ändrade filer med 319 tillägg och 48 borttagningar
  1. 0 5
      fs-company-app/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java
  2. 13 0
      fs-service/src/main/java/com/fs/company/domain/CompanySmsTemp.java
  3. 10 0
      fs-service/src/main/java/com/fs/company/mapper/CompanySmsTempMapper.java
  4. 1 0
      fs-service/src/main/java/com/fs/company/param/CompanySmsTempListQueryParam.java
  5. 2 0
      fs-service/src/main/java/com/fs/company/service/ICompanySmsTempService.java
  6. 14 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanySmsTempServiceImpl.java
  7. 2 0
      fs-service/src/main/java/com/fs/company/vo/CompanySmsTempListQueryVO.java
  8. 2 0
      fs-service/src/main/java/com/fs/company/vo/CompanySmsTempListVO.java
  9. 2 0
      fs-service/src/main/java/com/fs/course/service/IFsUserCourseVideoService.java
  10. 122 0
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  11. 2 0
      fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java
  12. 2 0
      fs-service/src/main/java/com/fs/im/domain/FsSmsShortLink.java
  13. 1 0
      fs-service/src/main/java/com/fs/im/dto/BatchSmsLinkDTO.java
  14. 89 41
      fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java
  15. 6 1
      fs-service/src/main/resources/mapper/company/CompanySmsTempMapper.xml
  16. 3 0
      fs-service/src/main/resources/mapper/course/FsUserCompanyUserMapper.xml
  17. 4 0
      fs-service/src/main/resources/mapper/his/FsUserMapper.xml
  18. 6 0
      fs-service/src/main/resources/mapper/im/FsSmsShortLinkMapper.xml
  19. 38 1
      fs-user-app/src/main/java/com/fs/app/controller/course/CourseFsUserController.java

+ 0 - 5
fs-company-app/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java

@@ -496,11 +496,6 @@ public class FsUserCourseVideoController extends AppBaseController {
     @ApiOperation("会员批量发送课程消息")
     @PostMapping("/batchUrgeCourseTaskCreate")
     public OpenImResponseDTO batchUrgeCourseTaskCreate(@RequestBody BatchUrgeCourseTaskDTO batchUrgeCourseTaskDTO) throws JsonProcessingException {
-        FsCourseLinkCreateParam createParam=new FsCourseLinkCreateParam();
-        BeanUtils.copyProperties(batchUrgeCourseTaskDTO, createParam);
-        R courseSortLink = fsUserCourseService.createAppCourseSortLink(createParam);
-        String url = courseSortLink.get("url").toString();
-        batchUrgeCourseTaskDTO.setUrl(url);
         return openIMService.batchUrgeCourseTaskCreate(batchUrgeCourseTaskDTO);
     }
 

+ 13 - 0
fs-service/src/main/java/com/fs/company/domain/CompanySmsTemp.java

@@ -48,6 +48,10 @@ public class CompanySmsTemp extends BaseEntity
 
     private Integer isAudit;
 
+    /** 项目 */
+    @Excel(name = "项目")
+    private String project;
+
     public Integer getIsAudit() {
         return isAudit;
     }
@@ -56,6 +60,14 @@ public class CompanySmsTemp extends BaseEntity
         this.isAudit = isAudit;
     }
 
+    public String getProject() {
+        return project;
+    }
+
+    public void setProject(String project) {
+        this.project = project;
+    }
+
     public void setTempId(Long tempId)
     {
         this.tempId = tempId;
@@ -142,6 +154,7 @@ public class CompanySmsTemp extends BaseEntity
             .append("updateTime", getUpdateTime())
             .append("status", getStatus())
             .append("cateId", getCateId())
+            .append("project", getProject())
             .toString();
     }
 }

+ 10 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanySmsTempMapper.java

@@ -66,6 +66,10 @@ public interface CompanySmsTempMapper
 
     @Select("select * from company_sms_temp where temp_code=#{tempCode}")
     CompanySmsTemp selectCompanySmsTempByCode(String tempCode);
+
+    @Select("select * from company_sms_temp where temp_code=#{tempCode} and project=#{project}")
+    CompanySmsTemp checkTempCodeProjectUnique(@Param("tempCode") String tempCode, @Param("project") String project);
+
     @Select({"<script> " +
             "select t.*,c.company_name from company_sms_temp t left join company c on c.company_id=t.company_id " +
             "where 1=1 " +
@@ -78,6 +82,9 @@ public interface CompanySmsTempMapper
             "<if test = 'maps.isAudit != null  '> " +
             "and t.is_audit = #{maps.isAudit}" +
             "</if>" +
+            "<if test = 'maps.project != null and maps.project != \"\"  '> " +
+            "and t.project = #{maps.project}" +
+            "</if>" +
             "order by t.temp_id desc " +
             "</script>"})
     List<CompanySmsTempListVO> selectCompanySmsTempListVO(@Param("maps")CompanySmsTemp companySmsTemp);
@@ -90,6 +97,9 @@ public interface CompanySmsTempMapper
             "<if test = 'maps.isAudit != null  '> " +
             "and t.is_audit = #{maps.isAudit}" +
             "</if>" +
+            "<if test = 'maps.project != null and maps.project != \"\"  '> " +
+            "and t.project = #{maps.project}" +
+            "</if>" +
             "order by t.temp_id desc " +
             "</script>"})
     List<CompanySmsTempListQueryVO> selectCompanySmsTempListQuery(@Param("maps")CompanySmsTempListQueryParam companySmsTemp);

+ 1 - 0
fs-service/src/main/java/com/fs/company/param/CompanySmsTempListQueryParam.java

@@ -18,5 +18,6 @@ public class CompanySmsTempListQueryParam  implements Serializable
 
     private Integer isAudit;
 
+    private String project;
 
 }

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

@@ -64,6 +64,8 @@ public interface ICompanySmsTempService
 
     CompanySmsTemp selectCompanySmsTempByCode(String tempCode);
 
+    CompanySmsTemp selectCompanySmsTempByCodeAndProject(String tempCode, String project);
+
     List<CompanySmsTempListVO> selectCompanySmsTempListVO(CompanySmsTemp companySmsTemp);
 
     List<CompanySmsTempListQueryVO> selectCompanySmsTempListQuery(CompanySmsTempListQueryParam companySmsTemp);

+ 14 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanySmsTempServiceImpl.java

@@ -1,6 +1,7 @@
 package com.fs.company.service.impl;
 
 import java.util.List;
+import com.fs.common.exception.ServiceException;
 import com.fs.common.utils.DateUtils;
 import com.fs.company.param.CompanySmsTempListQueryParam;
 import com.fs.company.vo.CompanySmsTempListQueryVO;
@@ -56,6 +57,10 @@ public class CompanySmsTempServiceImpl implements ICompanySmsTempService
     @Override
     public int insertCompanySmsTemp(CompanySmsTemp companySmsTemp)
     {
+        CompanySmsTemp exist = companySmsTempMapper.checkTempCodeProjectUnique(companySmsTemp.getTempCode(), companySmsTemp.getProject());
+        if (exist != null) {
+            throw new ServiceException("该模板CODE在该项目下已存在,不能重复添加");
+        }
         companySmsTemp.setCreateTime(DateUtils.getNowDate());
         return companySmsTempMapper.insertCompanySmsTemp(companySmsTemp);
     }
@@ -69,6 +74,10 @@ public class CompanySmsTempServiceImpl implements ICompanySmsTempService
     @Override
     public int updateCompanySmsTemp(CompanySmsTemp companySmsTemp)
     {
+        CompanySmsTemp exist = companySmsTempMapper.checkTempCodeProjectUnique(companySmsTemp.getTempCode(), companySmsTemp.getProject());
+        if (exist != null && !exist.getTempId().equals(companySmsTemp.getTempId())) {
+            throw new ServiceException("该模板CODE在该项目下已存在,不能重复添加");
+        }
         companySmsTemp.setUpdateTime(DateUtils.getNowDate());
         return companySmsTempMapper.updateCompanySmsTemp(companySmsTemp);
     }
@@ -102,6 +111,11 @@ public class CompanySmsTempServiceImpl implements ICompanySmsTempService
         return companySmsTempMapper.selectCompanySmsTempByCode(tempCode);
     }
 
+    @Override
+    public CompanySmsTemp selectCompanySmsTempByCodeAndProject(String tempCode, String project) {
+        return companySmsTempMapper.checkTempCodeProjectUnique(tempCode, project);
+    }
+
     @Override
     public List<CompanySmsTempListVO> selectCompanySmsTempListVO(CompanySmsTemp companySmsTemp) {
         return companySmsTempMapper.selectCompanySmsTempListVO(companySmsTemp);

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

@@ -44,6 +44,8 @@ public class CompanySmsTempListQueryVO implements Serializable
 
     private Integer isAudit;
 
+    private String project;
+
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
     private Date createTime;

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

@@ -45,6 +45,8 @@ public class CompanySmsTempListVO implements Serializable
 
     private Integer isAudit;
 
+    private String project;
+
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
     private Date createTime;

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

@@ -147,6 +147,8 @@ public interface IFsUserCourseVideoService
      */
     ResponseResult<FsUser> isAddCompanyUser(FsUserCourseAddCompanyUserParam param);
 
+    ResponseResult<FsUser> isAddSmsCourseCompanyUser(FsUserCourseAddCompanyUserParam param);
+
     /**
      * 获取链接用户课程详情
      * @param param 入参

+ 122 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -2343,6 +2343,128 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService {
         return ResponseResult.ok(fsUser);
     }
 
+    @Override
+    @Transactional
+    @RepeatSubmit(interval = 5000)
+    public ResponseResult<FsUser> isAddSmsCourseCompanyUser(FsUserCourseAddCompanyUserParam param) {
+        logger.info("\n 【进入短信H5看课-判断是否关联销售】,入参:{}", param);
+        if (param == null || param.getUserId() == null) {
+            return ResponseResult.fail(400, "用户id不能为空");
+        }
+        FsUser fsUser = fsUserMapper.selectFsUserById(param.getUserId());
+        if (fsUser == null) {
+            return ResponseResult.fail(401, "当前用户信息不存在");
+        }
+        if (fsUser.getStatus() == 0) {
+            return ResponseResult.fail(504, "已被禁用,请联系管理员#" + fsUser.getUserId());
+        }
+
+        CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getCompanyUserId());
+        if (companyUser == null) {
+            return ResponseResult.fail(405, "当前销售不存在");
+        }
+        if (param.getCompanyId() == null) {
+            param.setCompanyId(companyUser.getCompanyId());
+        }
+        if (param.getTypeFlag() == null) {
+            param.setTypeFlag(3);
+        }
+        param.setIsOpenCourse(0);
+
+        if (!isUserCoursePeriodValid(param)) {
+            return ResponseResult.fail(504, "请观看最新的课程项目");
+        }
+        if (param.getPeriodId() == null) {
+            return ResponseResult.fail(504, "营期不存在#1");
+        }
+        FsUserCoursePeriod period = fsUserCoursePeriodMapper.selectFsUserCoursePeriodById(param.getPeriodId());
+        if (period == null) {
+            return ResponseResult.fail(504, "营期不存在#2");
+        }
+
+        Map<Integer, Integer> enabledCheckers = new HashMap<>();
+        enabledCheckers.put(1, period.getAppViewEnabled());
+        enabledCheckers.put(2, period.getMiniProgramViewEnabled());
+        enabledCheckers.put(3, period.getH5ViewEnabled());
+        if (!enabledCheckers.containsKey(param.getTypeFlag())) {
+            return ResponseResult.fail(504, "不支持的看课类型");
+        }
+        Integer enabled = enabledCheckers.get(param.getTypeFlag());
+        if (enabled != null && enabled == 0) {
+            return ResponseResult.fail(504, "业务升级,最新看课频道请联系您的专属客服");
+        }
+
+        FsUserCourse fsUserCourse = fsUserCourseMapper.selectFsUserCourseByCourseId(param.getCourseId());
+        if (fsUserCourse == null || fsUserCourse.getProject() == null) {
+            return ResponseResult.fail(504, "课程配置错误,项目归属为空,课程ID: " + param.getCourseId());
+        }
+        Long courseProject = fsUserCourse.getProject();
+        FsUserCompanyUser userCompanyUser = userCompanyUserService.selectByUserIdAndProjectId(fsUser.getUserId(), courseProject);
+        if (Objects.isNull(userCompanyUser)) {
+            if (fsUser.getCompanyUserId() == null && fsUser.getIsAddQw() == 1) {
+                userCompanyUser = userCompanyUserService.bindRelationship(fsUser.getUserId(), courseProject, param.getCompanyId(), param.getCompanyUserId(), 1);
+            } else {
+                Company company = companyService.selectCompanyById(param.getCompanyId());
+                if (companyUser.getIsAllowedAllRegister() != null && companyUser.getIsAllowedAllRegister() != 1) {
+                    return ResponseResult.fail(504, "当前销售禁止绑定会员,请联系销售!");
+                }
+                if (companyUser.getIsNeedRegisterMember() == null || companyUser.getIsNeedRegisterMember() == 1) {
+                    return ResponseResult.fail(504, "请联系销售发送邀请链接成为会员!");
+                }
+                int defaultStatus = (company != null ? company.getFsUserIsDefaultBlack() : 0) == 1 ? 0 : 1;
+                userCompanyUser = userCompanyUserService.bindRelationship(param.getUserId(), courseProject, companyUser.getCompanyId(), companyUser.getUserId(), defaultStatus);
+            }
+        }
+        if (!param.getCompanyUserId().equals(userCompanyUser.getCompanyUserId())) {
+            return ResponseResult.fail(500, "该用户(" + fsUser.getUserId() + ")已成为其他销售会员");
+        }
+        if (userCompanyUser.getStatus() == 0) {
+            return ResponseResult.fail(BizResponseEnum.WAIT_APPROVAL, getCompanyUserQRCode(companyUser));
+        }
+        if (userCompanyUser.getStatus() == 2) {
+            return ResponseResult.fail(504, "已被拉黑,请联系管理员#" + userCompanyUser.getUserId());
+        }
+
+        FsCourseWatchLog watchCourseVideo = courseWatchLogMapper.selectWatchLogByUserIdAndVideoIdAndPeriodId(param.getUserId(), param.getVideoId(), param.getPeriodId());
+        Integer logCount = fsUserCourseMapper.selectTodayCourseWatchLogCountByUserIdAndProjectId(param.getUserId(), courseProject);
+        int maxWatchCount = courseProject == 11 ? 2 : 1;
+        if (Objects.isNull(watchCourseVideo) && logCount >= maxWatchCount) {
+            return ResponseResult.fail(504, "今日学习打卡成功!坚持的你真棒,明天见。");
+        }
+        if (watchCourseVideo != null) {
+            if (!watchCourseVideo.getCompanyUserId().equals(param.getCompanyUserId())) {
+                log.error("短信看课已存在其他销售看课记录:{},当前销售:{}", watchCourseVideo.getCompanyUserId(), param.getCompanyUserId());
+                return ResponseResult.fail(504, "已看过其他销售分享的此课程,不能重复观看");
+            }
+            FsCourseWatchLog updateLog = new FsCourseWatchLog();
+            updateLog.setLogId(watchCourseVideo.getLogId());
+            updateLog.setCompanyId(companyUser.getCompanyId());
+            updateLog.setPeriodId(param.getPeriodId());
+            updateLog.setProject(courseProject);
+            updateLog.setUpdateTime(new Date());
+            updateLog.setWatchType(param.getTypeFlag());
+            courseWatchLogMapper.updateFsCourseWatchLog(updateLog);
+        } else {
+            FsCourseWatchLog fsCourseWatchLog = new FsCourseWatchLog();
+            BeanUtils.copyProperties(param, fsCourseWatchLog);
+            fsCourseWatchLog.setCompanyId(companyUser.getCompanyId());
+            fsCourseWatchLog.setSendType(1);
+            fsCourseWatchLog.setDuration(0L);
+            fsCourseWatchLog.setCreateTime(new Date());
+            fsCourseWatchLog.setLogType(1);
+            fsCourseWatchLog.setProject(courseProject);
+            fsCourseWatchLog.setWatchType(param.getTypeFlag());
+            courseWatchLogMapper.insertFsCourseWatchLog(fsCourseWatchLog);
+
+            String redisKey = "h5wxuser:watch:heartbeat:" + param.getUserId() + ":" + param.getVideoId() + ":" + param.getCompanyUserId();
+            redisCache.setCacheObject(redisKey, LocalDateTime.now().toString());
+            redisCache.expire(redisKey, 300, TimeUnit.SECONDS);
+            fsAppActiveUserDailyService.recordActiveUserToRedis(param.getUserId(), companyUser.getCompanyId(), param.getCompanyUserId());
+        }
+        addPeriodTagAsync(param.getUserId(), period, userCompanyUser);
+        return ResponseResult.ok(fsUser);
+    }
+
     /**
      * 检查用户课程时间段是否有效
      *

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

@@ -48,6 +48,8 @@ public interface FsUserMapper
      */
     public FsUser selectFsUserByUserId(Long userId);
 
+    public FsUser selectFsUserByUserIdNotDel(Long userId);
+
     /**
      * 查询用户列表
      *

+ 2 - 0
fs-service/src/main/java/com/fs/im/domain/FsSmsShortLink.java

@@ -27,6 +27,8 @@ public class FsSmsShortLink extends BaseEntity {
     private String shortLink;
     private String realLink;
     private String customerAcquisitionLink;
+    private String customerAcquisitionTitle;
+    private String customerAcquisitionContent;
     private String smsContent;
     private Integer sendStatus;
     private String sendMsgId;

+ 1 - 0
fs-service/src/main/java/com/fs/im/dto/BatchSmsLinkDTO.java

@@ -40,6 +40,7 @@ public class BatchSmsLinkDTO implements Serializable {
     @ApiModelProperty(value = "项目id")
     private Long projectId;
 
+
     @ApiModelProperty(value = "获客H5真实地址,type=2时选传")
     private String h5Url;
 

+ 89 - 41
fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java

@@ -33,6 +33,8 @@ import com.fs.course.dto.BatchUrgeCourseTaskDTO;
 import com.fs.course.mapper.FsCourseWatchLogMapper;
 import com.fs.course.mapper.FsUserCompanyUserMapper;
 import com.fs.course.mapper.FsUserCourseMapper;
+import com.fs.course.param.FsCourseLinkCreateParam;
+import com.fs.course.service.IFsUserCourseService;
 import com.fs.fastGpt.service.AiHookService;
 import com.fs.his.config.FsSmsConfig;
 import com.fs.his.domain.FsDoctor;
@@ -136,6 +138,8 @@ public class OpenIMServiceImpl implements OpenIMService {
     private SysConfigMapper sysConfigMapper;
     @Autowired
     private ISysConfigService configService;
+    @Autowired
+    private IFsUserCourseService fsUserCourseService;
 
 
 //    @Value("${openIM.prefix}")
@@ -1310,7 +1314,12 @@ public class OpenIMServiceImpl implements OpenIMService {
             responseDTO.setErrMsg("短信发课参数不完整");
             return responseDTO;
         }
-        CompanySmsTemp smsTemp = companySmsTempService.selectCompanySmsTempByCode(tempCode);
+        CompanySmsTemp smsTemp;
+        if (StringUtils.isNotEmpty(batchSmsLinkDTO.getProjectId().toString())) {
+            smsTemp = companySmsTempService.selectCompanySmsTempByCodeAndProject(tempCode, batchSmsLinkDTO.getProjectId().toString());
+        } else {
+            smsTemp = companySmsTempService.selectCompanySmsTempByCode(tempCode);
+        }
         if (smsTemp == null) {
             responseDTO.setErrCode(400);
             responseDTO.setErrMsg("短信模板不存在");
@@ -1321,6 +1330,19 @@ public class OpenIMServiceImpl implements OpenIMService {
             responseDTO.setErrMsg("短信模板未启用或未审核");
             return responseDTO;
         }
+        String configuredSign = "";
+        FsSmsConfig smsConfig = null;
+        try {
+            SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey("his.sms");
+            smsConfig = JSON.parseObject(sysConfig.getConfigValue(), FsSmsConfig.class);
+            configuredSign = "rf".equals(smsConfig.getType()) ? smsConfig.getRfSign() : smsConfig.getDhSign();
+            if (StringUtils.isEmpty(configuredSign)) {
+                configuredSign = "";
+            }
+        } catch (Exception e) {
+            log.error("获取短信签名配置失败", e);
+        }
+        String strippedContent = smsTemp.getContent().replaceFirst("^【[^】]*】\\s*", "");
         int successCount = 0;
         int failCount = 0;
         List<Map<String, Object>> resultList = new ArrayList<>();
@@ -1332,10 +1354,20 @@ public class OpenIMServiceImpl implements OpenIMService {
                 continue;
             }
             FsSmsShortLink shortLink = createSmsShortLink(batchSmsLinkDTO, fsUser, phone);
+            String smsContent = strippedContent;
+            smsContent = smsContent.replace("${sms.link}", shortLink.getShortLink());
+            smsContent = smsContent.replace("${link}", shortLink.getShortLink());
+            if (!smsContent.contains(shortLink.getShortLink())) {
+                smsContent = smsContent + shortLink.getShortLink();
+            }
+            String customerAcquisitionContent = strippedContent;
+            customerAcquisitionContent = customerAcquisitionContent.replace("${sms.sign}", "");
+            customerAcquisitionContent = customerAcquisitionContent.replace("${sms.link}", "");
+            customerAcquisitionContent = customerAcquisitionContent.replace("${link}", "");
+            shortLink.setCustomerAcquisitionTitle(smsTemp.getTitle());
+            shortLink.setCustomerAcquisitionContent(configuredSign + customerAcquisitionContent);
             fsSmsShortLinkMapper.insertFsSmsShortLink(shortLink);
-
-            String smsContent = buildSmsContent(smsTemp, shortLink.getShortLink());
-            SendSmsResult sendSmsResult = sendSmsByConfig(smsTemp, batchSmsLinkDTO.getCompanyId(), phone, smsContent);
+            SendSmsResult sendSmsResult = sendSmsByConfig(smsTemp, smsConfig, batchSmsLinkDTO.getCompanyId(), phone, smsContent);
             String actualSmsContent = StringUtils.isEmpty(sendSmsResult.content) ? smsContent : sendSmsResult.content;
             shortLink.setSmsContent(actualSmsContent);
             shortLink.setSendStatus(sendSmsResult.success ? 1 : 2);
@@ -1426,9 +1458,7 @@ public class OpenIMServiceImpl implements OpenIMService {
         Date now = new Date();
         shortLink.setCreateTime(now);
         shortLink.setUpdateTime(now);
-        if (param.getEffectiveDuration() != null && param.getEffectiveDuration() > 0) {
-            shortLink.setExpireTime(new Date(now.getTime() + TimeUnit.MINUTES.toMillis(param.getEffectiveDuration())));
-        }
+        shortLink.setExpireTime(new Date(now.getTime() + TimeUnit.DAYS.toMillis(1)));
         return shortLink;
     }
 
@@ -1492,46 +1522,45 @@ public class OpenIMServiceImpl implements OpenIMService {
         return sign + content;
     }
 
-    private SendSmsResult sendSmsByConfig(CompanySmsTemp smsTemp, Long companyId, String phone, String content) {
+    private SendSmsResult sendSmsByConfig(CompanySmsTemp smsTemp, FsSmsConfig sms, Long companyId, String phone, String content) {
         SendSmsResult result = new SendSmsResult();
         try {
-            SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey("his.sms");
-            FsSmsConfig sms = JSON.parseObject(sysConfig.getConfigValue(), FsSmsConfig.class);
             result.smsType = sms.getType();
             String sendContent = buildSmsSendContent(content, sms);
             result.content = sendContent;
-            if ("rf".equals(sms.getType())) {
-                String urls;
-                if (Integer.valueOf(1).equals(smsTemp.getTempType())) {
-                    urls = sms.getRfUrl1() + "sms?action=send&account=" + sms.getRfAccount1()
-                            + "&password=" + sms.getRfPassword1()
-                            + "&mobile=" + phone
-                            + "&content=" + URLEncoder.encode(sendContent, "UTF-8")
-                            + "&extno=" + sms.getRfCode1()
-                            + "&rt=json";
-                } else {
-                    urls = sms.getRfUrl2() + "sms?action=send&account=" + sms.getRfAccount2()
-                            + "&password=" + sms.getRfPassword2()
-                            + "&mobile=" + phone
-                            + "&content=" + URLEncoder.encode(sendContent + "拒收请回复R", "UTF-8")
-                            + "&extno=" + sms.getRfCode2()
-                            + "&rt=json";
-                }
-                String post = HttpRequest.get(urls).execute().body();
-                cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(post);
-                result.success = Objects.equals(jsonObject.getInt("status"), 0);
-                result.message = post;
-                return result;
-            }
+//            if ("rf".equals(sms.getType())) {
+//                String urls;
+//                if (Integer.valueOf(1).equals(smsTemp.getTempType())) {
+//                    urls = sms.getRfUrl1() + "sms?action=send&account=" + sms.getRfAccount1()
+//                            + "&password=" + sms.getRfPassword1()
+//                            + "&mobile=" + phone
+//                            + "&content=" + URLEncoder.encode(sendContent, "UTF-8")
+//                            + "&extno=" + sms.getRfCode1()
+//                            + "&rt=json";
+//                } else {
+//                    urls = sms.getRfUrl2() + "sms?action=send&account=" + sms.getRfAccount2()
+//                            + "&password=" + sms.getRfPassword2()
+//                            + "&mobile=" + phone
+//                            + "&content=" + URLEncoder.encode(sendContent + "拒收请回复R", "UTF-8")
+//                            + "&extno=" + sms.getRfCode2()
+//                            + "&rt=json";
+//                }
+//                String post = HttpRequest.get(urls).execute().body();
+//                cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(post);
+//                result.success = Objects.equals(jsonObject.getInt("status"), 0);
+//                result.msgId = getRfMsgId(jsonObject);
+//                result.message = post;
+//                return result;
+//            }
             SendSmsReturn sendSmsReturn;
-            if (Integer.valueOf(1).equals(smsTemp.getTempType())) {
-                sendSmsReturn = smsTService.sendSms(sms.getDhAccount1(), sms.getDhPassword1(), sendContent, phone);
-            } else {
-                sendSmsReturn = smsTService.sendSms(sms.getDhAccount2(), sms.getDhPassword2(), sendContent + "拒收请回复R", phone);
-            }
-            result.success = sendSmsReturn != null && "0".equals(sendSmsReturn.getResult());
-            result.msgId = sendSmsReturn == null ? null : sendSmsReturn.getMsgid();
-            result.message = sendSmsReturn == null ? "短信发送无响应" : sendSmsReturn.getDesc();
+//            if (Integer.valueOf(1).equals(smsTemp.getTempType())) {
+//                sendSmsReturn = smsTService.sendSms(sms.getDhAccount1(), sms.getDhPassword1(), sendContent, phone);
+//            } else {
+//                sendSmsReturn = smsTService.sendSms(sms.getDhAccount2(), sms.getDhPassword2(), sendContent + "拒收请回复R", phone);
+//            }
+//            result.success = sendSmsReturn != null && "0".equals(sendSmsReturn.getResult());
+//            result.msgId = sendSmsReturn == null ? null : sendSmsReturn.getMsgid();
+//            result.message = sendSmsReturn == null ? "短信发送无响应" : sendSmsReturn.getDesc();
         } catch (Exception e) {
             result.success = false;
             result.message = e.getMessage();
@@ -1540,6 +1569,14 @@ public class OpenIMServiceImpl implements OpenIMService {
         return result;
     }
 
+    private String getRfMsgId(cn.hutool.json.JSONObject jsonObject) {
+        String msgId = jsonObject.getStr("mid");
+        if (StringUtils.isNotEmpty(msgId)) {
+            return msgId;
+        }
+        return StringUtils.isNotEmpty(msgId) ? msgId : jsonObject.getStr("msgId");
+    }
+
     private void saveSmsLog(CompanySmsTemp smsTemp, BatchSmsLinkDTO param, FsUser fsUser, String phone, String content, SendSmsResult sendSmsResult) {
         CompanySmsLogs logs = new CompanySmsLogs();
         logs.setPhone(phone);
@@ -1726,6 +1763,17 @@ public class OpenIMServiceImpl implements OpenIMService {
         batchSendCourseDTO.setUrgeTime(batchUrgeCourseTaskDTO.getUrgeTime());
         batchSendCourseDTO.setTitle(batchUrgeCourseTaskDTO.getTitle());
         batchSendCourseDTO.setUrgeContent(batchUrgeCourseTaskDTO.getUrgeContent());
+        if (Boolean.TRUE.equals(batchUrgeCourseTaskDTO.getSendCourse())) {
+            FsCourseLinkCreateParam fsCourseLinkCreateParam = new FsCourseLinkCreateParam();
+            BeanUtils.copyProperties(batchSendCourseDTO, fsCourseLinkCreateParam);
+            fsCourseLinkCreateParam.setId(batchUrgeCourseTaskDTO.getPeriodDaysId());
+            R courseSortLink = fsUserCourseService.createAppCourseSortLink(fsCourseLinkCreateParam);
+            Object url = courseSortLink.get("url");
+            if (url == null) {
+                throw new ServiceException("生成看课链接失败");
+            }
+            batchSendCourseDTO.setUrl(url.toString());
+        }
 
         FsUserCourse fsUserCourse = fsUserCourseMapper.selectFsUserCourseByCourseId(batchUrgeCourseTaskDTO.getCourseId());
         Long project = fsUserCourse != null ? fsUserCourse.getProject() : null;

+ 6 - 1
fs-service/src/main/resources/mapper/company/CompanySmsTempMapper.xml

@@ -16,10 +16,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="status"    column="status"    />
         <result property="cateId"    column="cate_id"    />
         <result property="isAudit"    column="is_audit"    />
+        <result property="project"    column="project"    />
     </resultMap>
 
     <sql id="selectCompanySmsTempVo">
-        select temp_id, company_id, title, content, temp_code, temp_type, create_time, update_time, status, cate_id,is_audit from company_sms_temp
+        select temp_id, company_id, title, content, temp_code, temp_type, create_time, update_time, status, cate_id,is_audit,project from company_sms_temp
     </sql>
 
     <select id="selectCompanySmsTempList" parameterType="CompanySmsTemp" resultMap="CompanySmsTempResult">
@@ -33,6 +34,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="status != null "> and status = #{status}</if>
             <if test="cateId != null "> and cate_id = #{cateId}</if>
             <if test="isAudit != null "> and is_audit = #{isAudit}</if>
+            <if test="project != null  and project != ''"> and project = #{project}</if>
         </where>
     </select>
     
@@ -54,6 +56,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="status != null">status,</if>
             <if test="cateId != null">cate_id,</if>
             <if test="isAudit != null">is_audit,</if>
+            <if test="project != null">project,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="companyId != null">#{companyId},</if>
@@ -66,6 +69,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="status != null">#{status},</if>
             <if test="cateId != null">#{cateId},</if>
             <if test="isAudit != null">#{isAudit},</if>
+            <if test="project != null">#{project},</if>
          </trim>
     </insert>
 
@@ -82,6 +86,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="status != null">status = #{status},</if>
             <if test="cateId != null">cate_id = #{cateId},</if>
             <if test="isAudit != null">is_audit = #{isAudit},</if>
+            <if test="project != null">project = #{project},</if>
         </trim>
         where temp_id = #{tempId}
     </update>

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

@@ -196,6 +196,9 @@
             <if test="param.companyUserId != null">
                 and fs_user_company_user.company_user_id = #{param.companyUserId}
             </if>
+            <if test="param.projectId != null">
+                and fs_user_company_user.project_id = #{param.projectId}
+            </if>
         </where>
     </select>
     <select id="selectCountByUserId" resultType="java.lang.Integer">

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

@@ -108,6 +108,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectFsUserVo"/>
         where user_id = #{userId}
     </select>
+    <select id="selectFsUserByUserIdNotDel" parameterType="Long" resultMap="FsUserResult">
+        <include refid="selectFsUserVo"/>
+        where user_id = #{userId} and is_del = 0
+    </select>
     <select id="courseAnalysisWatchLog" resultType="com.fs.course.vo.newfs.FsCourseAnalysisCountVO">
         SELECT
         count( DISTINCT CASE WHEN fwl.log_type != 3 THEN fwl.user_id END ) AS courseWatchNum,

+ 6 - 0
fs-service/src/main/resources/mapper/im/FsSmsShortLinkMapper.xml

@@ -20,6 +20,8 @@
         <result property="shortLink" column="short_link" />
         <result property="realLink" column="real_link" />
         <result property="customerAcquisitionLink" column="customer_acquisition_link" />
+        <result property="customerAcquisitionTitle" column="customer_acquisition_title" />
+        <result property="customerAcquisitionContent" column="customer_acquisition_content" />
         <result property="smsContent" column="sms_content" />
         <result property="sendStatus" column="send_status" />
         <result property="sendMsgId" column="send_msg_id" />
@@ -46,6 +48,8 @@
             <if test="shortLink != null">short_link,</if>
             <if test="realLink != null">real_link,</if>
             <if test="customerAcquisitionLink != null">customer_acquisition_link,</if>
+            <if test="customerAcquisitionTitle != null">customer_acquisition_title,</if>
+            <if test="customerAcquisitionContent != null">customer_acquisition_content,</if>
             <if test="smsContent != null">sms_content,</if>
             <if test="sendStatus != null">send_status,</if>
             <if test="sendMsgId != null">send_msg_id,</if>
@@ -69,6 +73,8 @@
             <if test="shortLink != null">#{shortLink},</if>
             <if test="realLink != null">#{realLink},</if>
             <if test="customerAcquisitionLink != null">#{customerAcquisitionLink},</if>
+            <if test="customerAcquisitionTitle != null">#{customerAcquisitionTitle},</if>
+            <if test="customerAcquisitionContent != null">#{customerAcquisitionContent},</if>
             <if test="smsContent != null">#{smsContent},</if>
             <if test="sendStatus != null">#{sendStatus},</if>
             <if test="sendMsgId != null">#{sendMsgId},</if>

+ 38 - 1
fs-user-app/src/main/java/com/fs/app/controller/course/CourseFsUserController.java

@@ -24,6 +24,7 @@ import com.fs.his.domain.FsUser;
 import com.fs.his.dto.FsUserBindSalesParamDTO;
 import com.fs.his.enums.FsUserOperationEnum;
 import com.fs.his.service.IFsUserService;
+import com.fs.im.service.OpenIMService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
@@ -71,6 +72,24 @@ public class CourseFsUserController extends AppBaseController {
     @Autowired
     private IFsCourseWatchLogService courseWatchLogService;
 
+    @Autowired
+    private OpenIMService openIMService;
+
+
+    @ApiOperation("短信H5看课-判断是否关联销售")
+    @PostMapping("/sms/isAddKf")
+    public ResponseResult<FsUser> isAddSmsCourseCompanyUser(@Valid @RequestBody FsUserCourseAddCompanyUserParam param) {
+        if (ObjectUtil.isEmpty(param.getUserId())) {
+            return ResponseResult.fail(400, "用户id不能为空");
+        }
+        if (ObjectUtil.isEmpty(param.getPeriodId()) || ObjectUtil.isEmpty(param.getCourseId())) {
+            return ResponseResult.fail(400, "课程参数不完整");
+        }
+        param.setIsOpenCourse(0);
+        param.setTypeFlag(3);
+        return courseVideoService.isAddSmsCourseCompanyUser(param);
+    }
+
 
     @Login
     @ApiOperation("判断是否添加客服(是否关联销售)")
@@ -127,11 +146,17 @@ public class CourseFsUserController extends AppBaseController {
     @ApiOperation("H5课程详情")
     @GetMapping("/videoDetails")
     @UserOperationLog(operationType = FsUserOperationEnum.STUDY)
-    public ResponseResult<FsUserCourseVideoLinkDetailsVO> getCourseVideoDetails(FsUserCourseVideoLinkParam param) {
+    public ResponseResult<FsUserCourseVideoLinkDetailsVO>   getCourseVideoDetails(FsUserCourseVideoLinkParam param) {
         param.setFsUserId(Long.parseLong(getUserId()));
         return courseVideoService.getLinkCourseVideoDetails(param);
     }
 
+    @ApiOperation("短信H5课程详情")
+    @GetMapping("/smsVideoDetails")
+    public ResponseResult<FsUserCourseVideoLinkDetailsVO> getSmsCourseVideoDetails(FsUserCourseVideoLinkParam param) {
+        return courseVideoService.getLinkCourseVideoDetails(param);
+    }
+
     @ApiOperation("获取真实链接")
     @GetMapping("/getRealLink")
     public R getRealLink(@RequestParam("sortLink") String link) {
@@ -155,6 +180,12 @@ public class CourseFsUserController extends AppBaseController {
         return courseVideoService.getInternetTraffic(param);
     }
 
+    @ApiOperation("短信获取缓冲流量")
+    @PostMapping("/smsGetInternetTraffic")
+    public R getSmsInternetTraffic(@RequestBody FsUserCourseVideoFinishUParam param) {
+        return courseVideoService.getInternetTraffic(param);
+    }
+
     /**
      * 获取公开课流量
      * @return
@@ -283,4 +314,10 @@ public class CourseFsUserController extends AppBaseController {
         return R.ok().put("data", list);
     }
 
+    @ApiOperation("短信短链详情")
+    @GetMapping("/smsShortLink/detail")
+    public R getSmsShortLinkDetail(@RequestParam String code) {
+        return openIMService.getSmsShortLinkDetail(code);
+    }
+
 }