diff --git a/ruoyi-modules/ruoyi-job/pom.xml b/ruoyi-modules/ruoyi-job/pom.xml
index 492628f4b..6b5440d5b 100644
--- a/ruoyi-modules/ruoyi-job/pom.xml
+++ b/ruoyi-modules/ruoyi-job/pom.xml
@@ -75,6 +75,18 @@
de.codecentric
spring-boot-admin-starter-client
+
+ com.squareup.okhttp3
+ okhttp
+ 3.12.13
+
+
+ com.ujcms
+ ujcms-commons
+ 9.6.0.0.1
+ compile
+
+
diff --git a/ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/config/SmsConfig.java b/ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/config/SmsConfig.java
new file mode 100644
index 000000000..9e483832d
--- /dev/null
+++ b/ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/config/SmsConfig.java
@@ -0,0 +1,23 @@
+package com.ruoyi.job.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 验证码配置
+ *
+ * @author ruoyi
+ */
+@Data
+@Configuration
+@RefreshScope
+@ConfigurationProperties(prefix = "security.sms.aliyuncs")
+public class SmsConfig
+{
+ private String accessKeyId;
+ private String accessKeySecret;
+ private String signName;
+ private String templateCode;
+}
diff --git a/ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/domain/ScClassUserInfo.java b/ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/domain/ScClassUserInfo.java
new file mode 100644
index 000000000..aacd7cf74
--- /dev/null
+++ b/ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/domain/ScClassUserInfo.java
@@ -0,0 +1,78 @@
+package com.ruoyi.job.domain;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.ruoyi.common.core.web.domain.BaseEntity;
+import com.ruoyi.job.util.ProgressFormatterUtil;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.data.annotation.Id;
+
+import java.math.BigDecimal;
+
+/**
+ * 直播预告报名信息导出实体
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class ScClassUserInfo extends BaseEntity {
+
+ @Id
+ private Long id;
+
+ //@ExcelIgnore // 不导出该字段
+ private Long userId;
+
+ //@ExcelIgnore // 不导出该字段
+ private Long classId;
+
+ //@ColumnWidth(25)
+ // @ExcelProperty("名称(报名时)")
+ private String name;
+
+ //@ColumnWidth(25)
+ //@ExcelProperty("单位")
+ private String firm;
+
+ //@ColumnWidth(25)
+ //@ExcelProperty("专业")
+ private String specialized;
+
+ //@ColumnWidth(35)
+ //@ExcelProperty("手机号")
+ private String phonenumber;
+
+ //@ColumnWidth(35)
+ //@ExcelProperty("昵称")
+ private String nickName;
+
+ /**
+ * 客户订单编号
+ */
+ //@ExcelProperty("客户订单编号")
+ private String userSn;
+
+ //@ExcelIgnore
+ private Boolean todayAttendanceIs;
+
+ @JsonIgnore
+ // @ExcelProperty("是否打卡")
+ private String attendanceIs;
+
+ //@ExcelProperty("签到次数")
+ private Integer attendanceCount;
+
+ //@ExcelIgnore
+ private BigDecimal progress;
+
+ //@ExcelProperty("总学习进度")
+ private String progressPercent;
+
+ public String getAttendanceIs() {
+ return attendanceCount.compareTo(0) > 0 ? "是" : "否";
+ }
+
+ public String getProgressPercent() {
+ return ProgressFormatterUtil.format(this.progress.multiply(BigDecimal.valueOf(100)));
+ }
+
+}
diff --git a/ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/SmsService.java b/ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/SmsService.java
new file mode 100644
index 000000000..67a8602b1
--- /dev/null
+++ b/ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/SmsService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.job.service;
+
+import com.ruoyi.common.core.exception.CaptchaException;
+
+/**
+ * 验证码处理
+ *
+ * @author ruoyi
+ */
+public interface SmsService
+{
+ /**
+ * 发送学习短信通知
+ */
+ public void sendStudyNoticeSms(String phone) throws CaptchaException;
+}
diff --git a/ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/impl/SmsServiceImpl.java b/ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/impl/SmsServiceImpl.java
new file mode 100644
index 000000000..e8407555f
--- /dev/null
+++ b/ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/impl/SmsServiceImpl.java
@@ -0,0 +1,35 @@
+package com.ruoyi.job.service.impl;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.ruoyi.common.core.exception.CaptchaException;
+import com.ruoyi.job.config.SmsConfig;
+import com.ruoyi.job.service.SmsService;
+import com.ujcms.commons.sms.AliyunUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 验证码实现处理
+ *
+ * @author ruoyi
+ */
+@Service
+public class SmsServiceImpl implements SmsService
+{
+ @Autowired
+ private SmsConfig smsConfig;
+
+ /**
+ * 发送学习短信通知
+ */
+ @Override
+ public void sendStudyNoticeSms(String phone) throws CaptchaException {
+ AliyunUtils.sendSms(smsConfig.getAccessKeyId(),
+ smsConfig.getAccessKeySecret(),
+ smsConfig.getSignName(),
+ smsConfig.getTemplateCode(),
+ JSONObject.of(),
+ phone
+ );
+ }
+}
diff --git a/ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/task/LiveTask.java b/ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/task/LiveTask.java
new file mode 100644
index 000000000..b9ffdfcf7
--- /dev/null
+++ b/ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/task/LiveTask.java
@@ -0,0 +1,34 @@
+package com.ruoyi.job.task;
+
+import com.ruoyi.job.config.SmsConfig;
+import com.ruoyi.job.domain.ScClassUserInfo;
+import com.ruoyi.job.mapper.ScClassUserInfoMapper;
+import com.ruoyi.job.service.SmsService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@Slf4j
+@Component("liveTask")
+public class LiveTask {
+ @Resource
+ ScClassUserInfoMapper scClassUserInfoMapper;
+ @Autowired
+ private SmsService smsAliyuncs;
+
+ @Autowired
+ private SmsConfig smsConfig;
+ /**
+ * 短信打卡
+ */
+ public void CourseSmsNotice(){
+ List list = scClassUserInfoMapper.waitNoticeCourseUser();
+ list.forEach(item->{
+ log.info("发送打卡提醒",item.getUserId(),item.getNickName(),item.getPhonenumber());
+ smsAliyuncs.sendStudyNoticeSms(item.getPhonenumber());
+ });
+ }
+}
diff --git a/ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/ProgressFormatterUtil.java b/ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/ProgressFormatterUtil.java
new file mode 100644
index 000000000..b88d4bb91
--- /dev/null
+++ b/ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/ProgressFormatterUtil.java
@@ -0,0 +1,18 @@
+package com.ruoyi.job.util;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.NumberFormat;
+
+public class ProgressFormatterUtil {
+ public static String format(BigDecimal progress ) {
+ if (progress == null) return "0";
+ // 保留两位小数(四舍五入)
+ BigDecimal scaled = progress.setScale(2, RoundingMode.HALF_UP);
+ // 去除末尾零和小数点
+ NumberFormat nf = NumberFormat.getInstance();
+ nf.setMaximumFractionDigits(2);
+ nf.setMinimumFractionDigits(0);
+ return nf.format(scaled) + "%";
+ }
+}
diff --git a/ruoyi-modules/ruoyi-job/src/main/resources/mapper/job/ScClassUserInfoMapper.xml b/ruoyi-modules/ruoyi-job/src/main/resources/mapper/job/ScClassUserInfoMapper.xml
new file mode 100644
index 000000000..5e405ee42
--- /dev/null
+++ b/ruoyi-modules/ruoyi-job/src/main/resources/mapper/job/ScClassUserInfoMapper.xml
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+