|
@@ -0,0 +1,781 @@
|
|
|
|
|
+package controllers
|
|
|
|
|
+
|
|
|
|
|
+import (
|
|
|
|
|
+ // 根据实际项目结构调整导入路径
|
|
|
|
|
+
|
|
|
|
|
+ "Tech/models"
|
|
|
|
|
+ "bytes"
|
|
|
|
|
+ "encoding/json"
|
|
|
|
|
+ "fmt"
|
|
|
|
|
+ "io"
|
|
|
|
|
+ "net/http"
|
|
|
|
|
+ "strings"
|
|
|
|
|
+ "time"
|
|
|
|
|
+
|
|
|
|
|
+ "github.com/beego/beego/v2/client/orm"
|
|
|
|
|
+ beego "github.com/beego/beego/v2/server/web"
|
|
|
|
|
+ // 新增导入
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
|
|
+var (
|
|
|
|
|
+ dtLastPauseTime time.Time // 全局变量记录上次暂停时间
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
|
|
+type CourseRunController struct {
|
|
|
|
|
+ beego.Controller
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (c *CourseRunController) CourseRun() {
|
|
|
|
|
+ type Request struct {
|
|
|
|
|
+ CourseID int `json:"courseID"`
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ var req Request
|
|
|
|
|
+ requestBody := c.Ctx.Input.RequestBody
|
|
|
|
|
+ println("Request Body:", string(requestBody))
|
|
|
|
|
+
|
|
|
|
|
+ if err := json.Unmarshal(requestBody, &req); err != nil {
|
|
|
|
|
+ c.Ctx.Output.SetStatus(400)
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 400,
|
|
|
|
|
+ "msg": "请求参数格式错误: " + err.Error(),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if req.CourseID == 0 {
|
|
|
|
|
+ c.Ctx.Output.SetStatus(400)
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 400,
|
|
|
|
|
+ "msg": "缺少课程ID参数",
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ o := orm.NewOrm()
|
|
|
|
|
+
|
|
|
|
|
+ // 查询是否存在正在运行的课程(课程用时为0表示正在运行)
|
|
|
|
|
+ var runningCourse models.CourseRunLog
|
|
|
|
|
+ err := o.QueryTable(new(models.CourseRunLog)).
|
|
|
|
|
+ Filter("CourseTime", 0).
|
|
|
|
|
+ OrderBy("-RunLogID").
|
|
|
|
|
+ One(&runningCourse)
|
|
|
|
|
+
|
|
|
|
|
+ if err == nil {
|
|
|
|
|
+ // 存在正在运行的课程
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "有课程正在运行中,无法开始新课程",
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ } else if err != orm.ErrNoRows {
|
|
|
|
|
+ // 查询出错
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "查询运行课程状态失败: " + err.Error(),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 查询课程信息
|
|
|
|
|
+ var course models.CourseInfo
|
|
|
|
|
+ err = o.QueryTable(new(models.CourseInfo)).
|
|
|
|
|
+ Filter("CourseID", req.CourseID).
|
|
|
|
|
+ One(&course)
|
|
|
|
|
+
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "查询课程信息失败: " + err.Error(),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 获取最大的课程运行ID号,然后ID号加1
|
|
|
|
|
+ var maxRunLogID int
|
|
|
|
|
+ err = o.Raw("SELECT COALESCE(MAX(运行记录编号), 0) FROM CourseRunLog").QueryRow(&maxRunLogID)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "查询最大运行日志ID失败: " + err.Error(),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ nextRunLogID := maxRunLogID + 1
|
|
|
|
|
+
|
|
|
|
|
+ // 创建新的课程运行记录
|
|
|
|
|
+ newRunLog := models.CourseRunLog{
|
|
|
|
|
+ RunLogID: nextRunLogID, // 使用计算出的ID
|
|
|
|
|
+ RunCourseID: req.CourseID,
|
|
|
|
|
+ RunCourseName: course.CourseName,
|
|
|
|
|
+ RunDateTime: time.Now().Format("2006-01-02 15:04:05"),
|
|
|
|
|
+ CourseTime: 0, // 初始为0,表示正在运行
|
|
|
|
|
+ CourseScore: 0,
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 插入课程运行记录
|
|
|
|
|
+ id, err := o.Insert(&newRunLog)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "创建课程运行记录失败: " + err.Error(),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 通知电调开课
|
|
|
|
|
+ isret, err := c.tellEStartCourse(req.CourseID, int(id))
|
|
|
|
|
+ if !isret || err != nil {
|
|
|
|
|
+ // 如果通知电调开课失败,删除刚刚创建的课程运行记录
|
|
|
|
|
+ o.Delete(&newRunLog)
|
|
|
|
|
+
|
|
|
|
|
+ // 错误信息已经在 tellEStartCourse 中设置
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 开课成功则继续后续操作
|
|
|
|
|
+ // 根据课程评价列表生成评价日志记录
|
|
|
|
|
+ var evaList []*models.CourseEvaList
|
|
|
|
|
+ _, err = o.QueryTable(new(models.CourseEvaList)).
|
|
|
|
|
+ Filter("CourseID", req.CourseID).
|
|
|
|
|
+ OrderBy("SeqNo").
|
|
|
|
|
+ All(&evaList)
|
|
|
|
|
+
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "查询课程评价列表失败: " + err.Error(),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 为每个评价项创建评价日志记录
|
|
|
|
|
+ for _, eva := range evaList {
|
|
|
|
|
+ evaLog := models.CourseEvaLog{
|
|
|
|
|
+ RunLogID: int(id), // 使用运行记录ID作为关联标识
|
|
|
|
|
+ RunCourseID: req.CourseID,
|
|
|
|
|
+ RunOperID: eva.SeqNo, // 使用评价序号作为操作ID
|
|
|
|
|
+ OperName: eva.EvaName, // 使用评价名称作为操作名称
|
|
|
|
|
+ OperTime: 0, // 初始化时间为0
|
|
|
|
|
+ OperScore: 0, // 初始化得分为0
|
|
|
|
|
+ OperParam1: "", // 参数初始化为空字符串
|
|
|
|
|
+ OperParam2: "",
|
|
|
|
|
+ OperParam3: "",
|
|
|
|
|
+ OperParam4: "",
|
|
|
|
|
+ OperParam5: "",
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ _, err = o.Insert(&evaLog)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "创建课程评价日志失败: " + err.Error(),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 成功返回记录ID
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 200,
|
|
|
|
|
+ "msg": "课程开始运行",
|
|
|
|
|
+ "data": map[string]interface{}{
|
|
|
|
|
+ "runLogID": id,
|
|
|
|
|
+ },
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// / 通知电调服务课程开始
|
|
|
|
|
+func (c *CourseRunController) tellEStartCourse(courseID int, runLogID int) (bool, error) {
|
|
|
|
|
+
|
|
|
|
|
+ // 从配置文件读取电调服务IP和端口
|
|
|
|
|
+ electricalIP, err := beego.AppConfig.String("ElectricalIP")
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "读取电调服务IP配置失败: " + err.Error(),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return false, err
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ electricalPort, err := beego.AppConfig.Int("ElectricalPort")
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "读取电调服务端口配置失败: " + err.Error(),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return false, err
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 构造电调服务地址
|
|
|
|
|
+ electricalAddr := fmt.Sprintf("http://%s:%d/ServerCtrl/Run", electricalIP, electricalPort)
|
|
|
|
|
+
|
|
|
|
|
+ // 准备请求数据
|
|
|
|
|
+ type CourseStartReq struct {
|
|
|
|
|
+ CourseID int `json:"CourseID"`
|
|
|
|
|
+ CourseRunID int `json:"CourseRunID"`
|
|
|
|
|
+ SubParam1 string `json:"subParam1"`
|
|
|
|
|
+ SubParam2 string `json:"subParam2"`
|
|
|
|
|
+ }
|
|
|
|
|
+ startReq := CourseStartReq{
|
|
|
|
|
+ CourseID: courseID,
|
|
|
|
|
+ CourseRunID: runLogID,
|
|
|
|
|
+ SubParam1: "",
|
|
|
|
|
+ SubParam2: "",
|
|
|
|
|
+ }
|
|
|
|
|
+ reqBody, err := json.Marshal(startReq)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "构造通知电调服务请求体失败: " + err.Error(),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return false, err
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 调用电调服务CourseStart接口
|
|
|
|
|
+ resp, err := http.Post(electricalAddr, "application/json", bytes.NewBuffer(reqBody))
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "调用电调服务开课接口失败: " + err.Error(),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return false, err
|
|
|
|
|
+ }
|
|
|
|
|
+ defer resp.Body.Close()
|
|
|
|
|
+
|
|
|
|
|
+ // 检查响应状态
|
|
|
|
|
+ if resp.StatusCode != http.StatusOK {
|
|
|
|
|
+ bodyBytes, _ := io.ReadAll(resp.Body)
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": fmt.Sprintf("电调服务返回异常状态码: %d,响应内容: %s", resp.StatusCode, string(bodyBytes)),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return false, fmt.Errorf("电调服务返回异常状态码: %d", resp.StatusCode)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 读取响应体(可根据实际需求解析响应内容)
|
|
|
|
|
+ _, _ = io.ReadAll(resp.Body)
|
|
|
|
|
+ return true, nil
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// / 通知电调服务课程结束
|
|
|
|
|
+func (c *CourseRunController) tellEStopCourse(courseID int, runLogID int) (bool, error) {
|
|
|
|
|
+
|
|
|
|
|
+ // 从配置文件读取电调服务IP和端口
|
|
|
|
|
+ electricalIP, err := beego.AppConfig.String("ElectricalIP")
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "读取电调服务IP配置失败: " + err.Error(),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return false, err
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ electricalPort, err := beego.AppConfig.Int("ElectricalPort")
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "读取电调服务端口配置失败: " + err.Error(),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return false, err
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 构造电调服务地址
|
|
|
|
|
+ electricalAddr := fmt.Sprintf("http://%s:%d/ServerCtrl/Stop", electricalIP, electricalPort)
|
|
|
|
|
+
|
|
|
|
|
+ // 准备请求数据
|
|
|
|
|
+ type CourseStopReq struct {
|
|
|
|
|
+ CourseID int `json:"CourseID"`
|
|
|
|
|
+ CourseRunID int `json:"CourseRunID"`
|
|
|
|
|
+ CtrlStatus int `json:"CtrlStatus"`
|
|
|
|
|
+ }
|
|
|
|
|
+ stopReq := CourseStopReq{
|
|
|
|
|
+ CourseID: courseID,
|
|
|
|
|
+ CourseRunID: runLogID,
|
|
|
|
|
+ CtrlStatus: 0,
|
|
|
|
|
+ }
|
|
|
|
|
+ reqBody, err := json.Marshal(stopReq)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "构造通知电调服务请求体失败: " + err.Error(),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return false, err
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 调用电调服务CourseStop接口
|
|
|
|
|
+ resp, err := http.Post(electricalAddr, "application/json", bytes.NewBuffer(reqBody))
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "调用电调服务停课接口失败: " + err.Error(),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return false, err
|
|
|
|
|
+ }
|
|
|
|
|
+ defer resp.Body.Close()
|
|
|
|
|
+
|
|
|
|
|
+ // 检查响应状态
|
|
|
|
|
+ if resp.StatusCode != http.StatusOK {
|
|
|
|
|
+ bodyBytes, _ := io.ReadAll(resp.Body)
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": fmt.Sprintf("电调服务返回异常状态码: %d,响应内容: %s", resp.StatusCode, string(bodyBytes)),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return false, fmt.Errorf("电调服务返回异常状态码: %d", resp.StatusCode)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 读取响应体(可根据实际需求解析响应内容)
|
|
|
|
|
+ _, _ = io.ReadAll(resp.Body)
|
|
|
|
|
+ return true, nil
|
|
|
|
|
+}
|
|
|
|
|
+func (c *CourseRunController) CoursePause() {
|
|
|
|
|
+ type Request struct {
|
|
|
|
|
+ SetFlag int `json:"setFlag"` // 1表示暂停,2表示恢复
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ var req Request
|
|
|
|
|
+ if err := json.Unmarshal(c.Ctx.Input.RequestBody, &req); err != nil {
|
|
|
|
|
+ c.Ctx.Output.SetStatus(400)
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 400,
|
|
|
|
|
+ "msg": "请求参数格式错误: " + err.Error(),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if req.SetFlag != 1 && req.SetFlag != 2 {
|
|
|
|
|
+ c.Ctx.Output.SetStatus(400)
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 400,
|
|
|
|
|
+ "msg": "参数值错误,SetFlag应为1或2",
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ o := orm.NewOrm()
|
|
|
|
|
+
|
|
|
|
|
+ // 查询正在进行的课程(课程用时为0表示正在运行)
|
|
|
|
|
+ var runningCourse models.CourseRunLog
|
|
|
|
|
+ err := o.QueryTable(new(models.CourseRunLog)).
|
|
|
|
|
+ Filter("CourseTime", 0).
|
|
|
|
|
+ OrderBy("-RunLogID").
|
|
|
|
|
+ One(&runningCourse)
|
|
|
|
|
+
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ if err == orm.ErrNoRows {
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "没有正在运行的课程",
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "查询运行课程状态失败: " + err.Error(),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ switch req.SetFlag {
|
|
|
|
|
+ case 1: // 暂停课程
|
|
|
|
|
+ if runningCourse.PauseFlag == 1 {
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "课程已在暂停状态",
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 设置暂停标记并记录暂停开始时间
|
|
|
|
|
+ runningCourse.PauseFlag = 1
|
|
|
|
|
+ dtLastPauseTime = time.Now()
|
|
|
|
|
+
|
|
|
|
|
+ case 2: // 恢复课程
|
|
|
|
|
+ if runningCourse.PauseFlag != 1 {
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "课程未处于暂停状态",
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 如果有暂停开始时间,则计算暂停时长并累加到总暂停时长
|
|
|
|
|
+ if !dtLastPauseTime.IsZero() {
|
|
|
|
|
+ pauseDuration := int(time.Since(dtLastPauseTime).Seconds())
|
|
|
|
|
+ if pauseDuration > 0 {
|
|
|
|
|
+ runningCourse.PauseTotalTime += pauseDuration
|
|
|
|
|
+ }
|
|
|
|
|
+ // 清除暂停开始时间
|
|
|
|
|
+ dtLastPauseTime = time.Time{}
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 清除暂停标记
|
|
|
|
|
+ runningCourse.PauseFlag = 0
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 更新课程运行记录,修改PauseFlag和PauseTotalTime字段
|
|
|
|
|
+ _, err = o.Update(&runningCourse, "PauseFlag", "PauseTotalTime")
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "更新课程暂停状态失败: " + err.Error(),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ var msg string
|
|
|
|
|
+ if req.SetFlag == 1 {
|
|
|
|
|
+ msg = "课程已暂停"
|
|
|
|
|
+ } else {
|
|
|
|
|
+ msg = "课程已恢复"
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 200,
|
|
|
|
|
+ "msg": msg,
|
|
|
|
|
+ "data": runningCourse, // 返回完整的CourseRunLog数据
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// /course/stop 停止课程运行
|
|
|
|
|
+func (c *CourseRunController) CourseStop() {
|
|
|
|
|
+ o := orm.NewOrm()
|
|
|
|
|
+
|
|
|
|
|
+ // 查询最新的课程运行记录
|
|
|
|
|
+ var latestCourse models.CourseRunLog
|
|
|
|
|
+ err := o.QueryTable(new(models.CourseRunLog)).
|
|
|
|
|
+ OrderBy("-RunLogID").
|
|
|
|
|
+ One(&latestCourse)
|
|
|
|
|
+
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ if err == orm.ErrNoRows {
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "没有找到任何课程运行记录",
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "查询课程运行记录失败: " + err.Error(),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 检查课程是否已经结束
|
|
|
|
|
+ if latestCourse.CourseTime > 0 {
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "课程已经结束,无法再次结束",
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 计算课程用时(从开始时间到当前时间的秒数)
|
|
|
|
|
+ startTime, err := time.ParseInLocation("2006-01-02 15:04:05", latestCourse.RunDateTime, time.Local)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "解析课程开始时间失败: " + err.Error(),
|
|
|
|
|
+ "runStatus": 0,
|
|
|
|
|
+ "data": nil,
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ courseDuration := int(time.Since(startTime).Seconds())
|
|
|
|
|
+
|
|
|
|
|
+ // 更新课程记录
|
|
|
|
|
+ latestCourse.CourseTime = courseDuration
|
|
|
|
|
+ latestCourse.PauseFlag = -1
|
|
|
|
|
+
|
|
|
|
|
+ _, err = o.Update(&latestCourse, "CourseTime", "PauseFlag")
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "更新课程运行记录失败: " + err.Error(),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 200,
|
|
|
|
|
+ "msg": "课程运行已停止",
|
|
|
|
|
+ "data": map[string]interface{}{
|
|
|
|
|
+ "runLogID": latestCourse.RunLogID,
|
|
|
|
|
+ "courseID": latestCourse.RunCourseID,
|
|
|
|
|
+ "duration": courseDuration,
|
|
|
|
|
+ "startTime": latestCourse.RunDateTime,
|
|
|
|
|
+ },
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 通知电调服务课程结束
|
|
|
|
|
+ _, err = c.tellEStopCourse(latestCourse.RunCourseID, latestCourse.RunLogID)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ fmt.Println("通知电调服务停止课程失败: " + err.Error())
|
|
|
|
|
+ // c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ // "code": 500,
|
|
|
|
|
+ // "msg": "通知电调服务停止课程失败: " + err.Error(),
|
|
|
|
|
+ // }
|
|
|
|
|
+ // c.ServeJSON()
|
|
|
|
|
+ // return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// /course/status 查询课程运行状态
|
|
|
|
|
+func (c *CourseRunController) CourseStatus() {
|
|
|
|
|
+ o := orm.NewOrm()
|
|
|
|
|
+
|
|
|
|
|
+ // 查询最新的课程运行记录
|
|
|
|
|
+ var latestCourse models.CourseRunLog
|
|
|
|
|
+ err := o.QueryTable(new(models.CourseRunLog)).
|
|
|
|
|
+ OrderBy("-RunLogID").
|
|
|
|
|
+ One(&latestCourse)
|
|
|
|
|
+
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ if err == orm.ErrNoRows {
|
|
|
|
|
+ // 没有课程运行记录
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 200,
|
|
|
|
|
+ "msg": "成功",
|
|
|
|
|
+ "data": map[string]interface{}{
|
|
|
|
|
+ "runStatus": 0, // 0表示无记录/未运行
|
|
|
|
|
+ },
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "查询课程运行记录失败: " + err.Error(),
|
|
|
|
|
+ "data": map[string]interface{}{
|
|
|
|
|
+ "runStatus": 0,
|
|
|
|
|
+ },
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 判断课程是否结束
|
|
|
|
|
+ if latestCourse.CourseTime > 0 {
|
|
|
|
|
+ // 课程已结束,返回空data
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 200,
|
|
|
|
|
+ "msg": "成功",
|
|
|
|
|
+ "data": map[string]interface{}{
|
|
|
|
|
+ "runStatus": 0, // 0表示未运行(课程已结束)
|
|
|
|
|
+ },
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 课程正在进行中,计算运行时间并返回详细信息
|
|
|
|
|
+ startTime, err := time.ParseInLocation("2006-01-02 15:04:05", latestCourse.RunDateTime, time.Local)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "解析课程开始时间失败: " + err.Error(),
|
|
|
|
|
+ "data": map[string]interface{}{
|
|
|
|
|
+ "runStatus": 0,
|
|
|
|
|
+ },
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 获取当前时间
|
|
|
|
|
+ now := time.Now()
|
|
|
|
|
+
|
|
|
|
|
+ fmt.Printf("目标时间: %v\n", startTime)
|
|
|
|
|
+ fmt.Printf("当前时间: %v\n", now)
|
|
|
|
|
+
|
|
|
|
|
+ // 计算时间差(秒)
|
|
|
|
|
+ diff := int(now.Sub(startTime).Seconds())
|
|
|
|
|
+
|
|
|
|
|
+ // 确定运行状态
|
|
|
|
|
+ runStatus := 1 // 默认为正在运行
|
|
|
|
|
+ if latestCourse.PauseFlag == 1 {
|
|
|
|
|
+ runStatus = 2 // 2表示暂停中
|
|
|
|
|
+ }
|
|
|
|
|
+ // 计算calTime为开始时间加上暂停时间后的格式化时间
|
|
|
|
|
+ calTime := startTime.Add(time.Duration(latestCourse.PauseTotalTime) * time.Second).Format("2006-01-02 15:04:05")
|
|
|
|
|
+
|
|
|
|
|
+ // 课程正在进行中,返回详细信息
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 200,
|
|
|
|
|
+ "msg": "成功",
|
|
|
|
|
+ "data": map[string]interface{}{
|
|
|
|
|
+ "runLogID": latestCourse.RunLogID,
|
|
|
|
|
+ "runCourseID": latestCourse.RunCourseID,
|
|
|
|
|
+ "runCourseName": latestCourse.RunCourseName,
|
|
|
|
|
+ "runDateTime": latestCourse.RunDateTime,
|
|
|
|
|
+ "courseTime": diff, // 实时计算的运行时间
|
|
|
|
|
+ "courseScore": latestCourse.CourseScore,
|
|
|
|
|
+ "pauseFlag": latestCourse.PauseFlag,
|
|
|
|
|
+ "pauseTotalTime": latestCourse.PauseTotalTime,
|
|
|
|
|
+ "calTime": calTime, // 开始时间+暂停时间后的时间
|
|
|
|
|
+ "runStatus": runStatus, // 0表示未运行,1表示正在运行,2表示暂停中
|
|
|
|
|
+ },
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// /runrecord/list 获取课程运行记录列表 查询课程运行时间
|
|
|
|
|
+func (c *CourseRunController) RunRecordList() {
|
|
|
|
|
+ // 定义请求参数结构体
|
|
|
|
|
+ type Request struct {
|
|
|
|
|
+ CourseName string `json:"courseName"`
|
|
|
|
|
+ TypeID int `json:"typeID"`
|
|
|
|
|
+ CourseID int `json:"courseID"`
|
|
|
|
|
+ LineNo int `json:"lineNo"`
|
|
|
|
|
+ Creator string `json:"creator"`
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ var req Request
|
|
|
|
|
+ // 解析请求参数
|
|
|
|
|
+ if err := json.Unmarshal(c.Ctx.Input.RequestBody, &req); err != nil {
|
|
|
|
|
+ c.Ctx.Output.SetStatus(400)
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 400,
|
|
|
|
|
+ "msg": "请求参数格式错误: " + err.Error(),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ o := orm.NewOrm()
|
|
|
|
|
+
|
|
|
|
|
+ // 先查询所有运行记录
|
|
|
|
|
+ var runRecords []models.CourseRunLog
|
|
|
|
|
+ qs := o.QueryTable(new(models.CourseRunLog)).OrderBy("-RunLogID")
|
|
|
|
|
+ _, err := qs.All(&runRecords)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "查询课程运行记录失败: " + err.Error(),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 构建结果
|
|
|
|
|
+ type RunRecordDetail struct {
|
|
|
|
|
+ RunLogID int `json:"runLogID"`
|
|
|
|
|
+ RunCourseID int `json:"runCourseID"`
|
|
|
|
|
+ RunCourseName string `json:"runCourseName"`
|
|
|
|
|
+ RunDateTime string `json:"runDateTime"`
|
|
|
|
|
+ CourseTime int `json:"courseTime"`
|
|
|
|
|
+ CourseScore float64 `json:"courseScore"`
|
|
|
|
|
+ PauseFlag int `json:"pauseFlag"`
|
|
|
|
|
+ PauseTotalTime int `json:"pauseTotalTime"`
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ var results []RunRecordDetail
|
|
|
|
|
+
|
|
|
|
|
+ // 遍历运行记录并获取课程详细信息及应用筛选
|
|
|
|
|
+ for _, record := range runRecords {
|
|
|
|
|
+ // 查询对应的课程信息
|
|
|
|
|
+ var courseInfo models.CourseInfo
|
|
|
|
|
+ err = o.QueryTable(new(models.CourseInfo)).Filter("CourseID", record.RunCourseID).One(&courseInfo)
|
|
|
|
|
+ if err != nil && err != orm.ErrNoRows {
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 500,
|
|
|
|
|
+ "msg": "查询课程信息失败: " + err.Error(),
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 检查是否符合筛选条件
|
|
|
|
|
+ match := true
|
|
|
|
|
+
|
|
|
|
|
+ // 如果有筛选条件,检查是否匹配
|
|
|
|
|
+ if req.CourseName != "" && (err == orm.ErrNoRows || !strings.Contains(courseInfo.CourseName, req.CourseName)) {
|
|
|
|
|
+ match = false
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if req.TypeID != 0 && (err == orm.ErrNoRows || courseInfo.TypeID != req.TypeID) {
|
|
|
|
|
+ match = false
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if req.CourseID != 0 && record.RunCourseID != req.CourseID {
|
|
|
|
|
+ match = false
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if req.LineNo != 0 && (err == orm.ErrNoRows || courseInfo.LineNo != req.LineNo) {
|
|
|
|
|
+ match = false
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if req.Creator != "" && (err == orm.ErrNoRows || !strings.Contains(courseInfo.Creator, req.Creator)) {
|
|
|
|
|
+ match = false
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 如果匹配筛选条件,则添加到结果中
|
|
|
|
|
+ if match {
|
|
|
|
|
+ detail := RunRecordDetail{
|
|
|
|
|
+ RunLogID: record.RunLogID,
|
|
|
|
|
+ RunCourseID: record.RunCourseID,
|
|
|
|
|
+ RunCourseName: record.RunCourseName,
|
|
|
|
|
+ RunDateTime: record.RunDateTime,
|
|
|
|
|
+ CourseTime: record.CourseTime,
|
|
|
|
|
+ CourseScore: record.CourseScore,
|
|
|
|
|
+ PauseFlag: record.PauseFlag,
|
|
|
|
|
+ PauseTotalTime: record.PauseTotalTime,
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if err != orm.ErrNoRows {
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ results = append(results, detail)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ c.Data["json"] = map[string]interface{}{
|
|
|
|
|
+ "code": 200,
|
|
|
|
|
+ "msg": "查询成功",
|
|
|
|
|
+ "count": len(results),
|
|
|
|
|
+ "data": results,
|
|
|
|
|
+ }
|
|
|
|
|
+ c.ServeJSON()
|
|
|
|
|
+}
|