From 4ea102e9177923f091412bd0c261d651c51725b9 Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期二, 14 一月 2025 18:21:12 +0800
Subject: [PATCH] bug修改

---
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerLiveController.java   |    6 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeLiveDto.java                 |    8 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/miniapp/AppCourseController.java  |   11 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeCourseQueryDto.java          |    4 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeLiveDetailVOV2.java           |  181 +++++++++++++++
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/biz/XiaoeLiveService.java            |   82 +++---
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/sys/SysUserController.java      |   20 +
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeLiveVoV2.java                 |  182 +++++++++++++++
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/Shop.java             |    2 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java              |   11 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/biz/XiaoeCourseService.java          |    9 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerCourseController.java |   11 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeLiveQueryDto.java            |    3 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/live/IXiaoeLiveRecordService.java    |    8 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/utils/XiaoeUtils.java                        |  122 ++++++++-
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtLiveController.java |    7 
 16 files changed, 592 insertions(+), 75 deletions(-)

diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/Shop.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/Shop.java
index ed91abb..92890a1 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/Shop.java
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/shop/Shop.java
@@ -295,7 +295,7 @@
     /**
      * 小鹅通讲师id
      */
-    @TableField("xiaoe_guest_id")
+    @TableField("xiaoe_user_id")
     private String xiaoeUserId;
 
 
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java
index dee9fc5..71ea2c8 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java
@@ -222,4 +222,15 @@
         }
         return sb.toString();
     }
+
+    public static Date getTodayStartTime() {
+        // 获取今天的日期
+        LocalDate today = LocalDate.now();
+
+        // 获取当天的开始时间(00:00:00)
+        LocalDateTime startOfDay = today.atStartOfDay();
+
+        // 转换为 Date 类型
+        return Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant());
+    }
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerCourseController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerCourseController.java
index 8302029..931550f 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerCourseController.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerCourseController.java
@@ -4,6 +4,7 @@
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.goods.domain.dto.XiaoeCourseQueryDto;
 import com.ruoyi.goods.domain.vo.XiaoeCourseChapterVO;
+import com.ruoyi.goods.domain.vo.XiaoeCourseGroupVO;
 import com.ruoyi.goods.domain.vo.XiaoeCourseVO;
 import com.ruoyi.goods.service.biz.XiaoeCourseService;
 import io.swagger.annotations.Api;
@@ -54,4 +55,14 @@
     public R<List<XiaoeCourseChapterVO>> detail(@ApiParam(name = "id",value = "课程id",required = true)@PathVariable("id") String id) {
         return R.ok(xiaoeCourseService.getCourseDetail(id));
     }
+
+    /**
+     * 获取课程分组列表
+     * @return
+     */
+    @ApiOperation("获取课程分组列表")
+    @GetMapping("/group")
+    public R<List<XiaoeCourseGroupVO>> getCourseGroupList() {
+        return R.ok(xiaoeCourseService.getCourseGroupList());
+    }
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerLiveController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerLiveController.java
index 428ab64..cb6fe5e 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerLiveController.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerLiveController.java
@@ -4,6 +4,7 @@
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.goods.domain.dto.XiaoeLiveDto;
 import com.ruoyi.goods.domain.dto.XiaoeLiveQueryDto;
+import com.ruoyi.goods.domain.vo.XiaoeLiveDetailVOV2;
 import com.ruoyi.goods.domain.vo.XiaoeLiveVo;
 import com.ruoyi.goods.service.biz.XiaoeLiveService;
 import io.swagger.annotations.Api;
@@ -14,7 +15,6 @@
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -52,7 +52,7 @@
      */
     @ApiOperation("直播详情")
     @GetMapping("/detail/{id}")
-    public R<XiaoeLiveVo> detail(@ApiParam(name = "id",value = "直播id", required = true) @PathVariable("id") String id) {
+    public R<XiaoeLiveDetailVOV2> detail(@ApiParam(name = "id",value = "直播id", required = true) @PathVariable("id") String id) {
         return R.ok(xiaoeLiveService.getLiveDetail(id));
     }
 
@@ -105,7 +105,7 @@
      * @return
      */
     @ApiOperation("编辑直播")
-    @PutMapping
+    @PostMapping
     public R<Boolean> edit(@Valid @RequestBody XiaoeLiveDto dto) {
         return R.ok(xiaoeLiveService.edit(dto));
     }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtLiveController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtLiveController.java
index 278fa26..17bc223 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtLiveController.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtLiveController.java
@@ -4,7 +4,8 @@
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.goods.domain.dto.XiaoeLiveDto;
 import com.ruoyi.goods.domain.dto.XiaoeLiveQueryDto;
-import com.ruoyi.goods.domain.vo.XiaoeLiveVo;
+import com.ruoyi.goods.domain.vo.XiaoeLiveDetailVOV2;
+import com.ruoyi.goods.domain.vo.XiaoeLiveVoV2;
 import com.ruoyi.goods.service.biz.XiaoeLiveService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -39,7 +40,7 @@
      */
     @ApiOperation("直播分页列表")
     @PostMapping("/page")
-    public R<Page<XiaoeLiveVo>> page(@Valid @RequestBody XiaoeLiveQueryDto dto) {
+    public R<Page<XiaoeLiveVoV2>> page(@Valid @RequestBody XiaoeLiveQueryDto dto) {
         return R.ok(xiaoeLiveService.getMgtLivePage(dto));
     }
     /**
@@ -49,7 +50,7 @@
      */
     @ApiOperation("直播详情")
     @GetMapping("/detail/{id}")
-    public R<XiaoeLiveVo> detail(@ApiParam(name = "id",value = "直播id", required = true) @PathVariable("id") String id) {
+    public R<XiaoeLiveDetailVOV2> detail(@ApiParam(name = "id",value = "直播id", required = true) @PathVariable("id") String id) {
         return R.ok(xiaoeLiveService.getLiveDetail(id));
     }
     /**
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/miniapp/AppCourseController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/miniapp/AppCourseController.java
index aa86dd2..d624487 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/miniapp/AppCourseController.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/miniapp/AppCourseController.java
@@ -4,6 +4,7 @@
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.goods.domain.dto.XiaoeCourseQueryDto;
 import com.ruoyi.goods.domain.vo.XiaoeCourseChapterVO;
+import com.ruoyi.goods.domain.vo.XiaoeCourseGroupVO;
 import com.ruoyi.goods.domain.vo.XiaoeCourseVO;
 import com.ruoyi.goods.service.biz.XiaoeCourseService;
 import io.swagger.annotations.Api;
@@ -54,4 +55,14 @@
     public R<List<XiaoeCourseChapterVO>> detail(@ApiParam(name = "id",value = "课程id",required = true)@PathVariable("id") String id) {
         return R.ok(xiaoeCourseService.getCourseDetail(id));
     }
+
+    /**
+     * 获取课程分组列表
+     * @return
+     */
+    @ApiOperation("获取课程分组列表")
+    @GetMapping("/group")
+    public R<List<XiaoeCourseGroupVO>> getCourseGroupList() {
+        return R.ok(xiaoeCourseService.getCourseGroupList());
+    }
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeCourseQueryDto.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeCourseQueryDto.java
index 8bae0c9..ccb16f3 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeCourseQueryDto.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeCourseQueryDto.java
@@ -1,7 +1,6 @@
 package com.ruoyi.goods.domain.dto;
 
 import com.alibaba.fastjson2.annotation.JSONField;
-import com.fasterxml.jackson.annotation.JsonIgnore;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -21,7 +20,7 @@
     @JSONField(name = "search_content")
     private String searchContent;
 
-    @ApiModelProperty(value = "课程创建来源")
+    @ApiModelProperty(value = "课程创建来源 0:全部,1:课程,2:圈子")
     @JSONField(name = "created_source")
     private Integer createdSource;
 
@@ -39,7 +38,6 @@
 
     @ApiModelProperty("排序类型 1:创建时间倒序 2:开始时间升序")
     @NotNull(message = "排序类型不能为空")
-    @JsonIgnore
     private Integer sortBy;
 
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeLiveDto.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeLiveDto.java
index c321af8..70b255d 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeLiveDto.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeLiveDto.java
@@ -4,8 +4,8 @@
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.hibernate.validator.constraints.Length;
 
-import javax.validation.constraints.Max;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 
@@ -24,7 +24,7 @@
 
     @ApiModelProperty(value = "直播简介", notes = "字符长度必须小于256,默认为空")
     @NotBlank(message = "直播简介不能为空")
-    @Max(value = 256, message = "直播简介长度不能超过256")
+    @Length(max = 256, message = "直播简介长度不能超过256")
     @JSONField(name = "summary")
     private String summary;
 
@@ -37,7 +37,7 @@
     @JSONField(name = "zb_stop_at")
     private Integer zbStopAt;
 
-    @ApiModelProperty(value = "直播类型", notes = "0-语音,1-录播直播,2-推流直播,默认为0-语音直播")
+    @ApiModelProperty(value = "直播类型 0-语音,1-录播直播,2-推流直播,默认为0-语音直播")
     @NotNull(message = "直播类型不能为空")
     @JSONField(name = "alive_type")
     private Integer aliveType;
@@ -63,7 +63,7 @@
 
     @ApiModelProperty(value = "直播详情", notes = "仅允许纯文本,不得超过5000个字符,默认为空")
     @NotBlank(message = "直播详情不能为空")
-    @Max(value = 5000, message = "直播详情长度不能超过5000")
+    @Length(max = 5000, message = "直播详情长度不能超过5000")
     @JSONField(name = "descrb")
     private String descrb;
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeLiveQueryDto.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeLiveQueryDto.java
index 7f4bd6d..c8d2a67 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeLiveQueryDto.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeLiveQueryDto.java
@@ -35,4 +35,7 @@
 
     @ApiModelProperty("门店id")
     private Long shopId;
+
+    @ApiModelProperty("直播类型 1:平台直播 2:商家直播")
+    private Integer liveType;
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeLiveDetailVOV2.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeLiveDetailVOV2.java
new file mode 100644
index 0000000..5d58758
--- /dev/null
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeLiveDetailVOV2.java
@@ -0,0 +1,181 @@
+package com.ruoyi.goods.domain.vo;
+
+import com.alibaba.fastjson2.annotation.JSONField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author mitao
+ * @date 2025/1/14
+ */
+@Data
+@ApiModel("直播详情2.0视图对象")
+public class XiaoeLiveDetailVOV2 {
+    @ApiModelProperty(value = "资源信息")
+    @JSONField(name = "resource_info")
+    private ResourceInfo resourceInfo;
+    @ApiModelProperty(value = "配置信息")
+    @JSONField(name = "module_info")
+    private ModuleInfo moduleInfo;
+    @ApiModelProperty(value = "商品信息")
+    @JSONField(name = "goods_info")
+    private GoodsInfo goodsInfo;
+    @ApiModelProperty(value = "关联信息")
+    @JSONField(name = "relation_info")
+    private RelationInfo relationInfo;
+    @ApiModelProperty(value = "讲师信息")
+    @JSONField(name = "role_info")
+    private List<RelationInfo.RoleInfo> roleInfo;
+
+    @Data
+    @ApiModel(description = "资源信息")
+    public static class ResourceInfo {
+        @ApiModelProperty(value = "店铺id", example = "app_id")
+        @JSONField(name = "app_id")
+        private String appId;
+        @ApiModelProperty(value = "直播ID", example = "id")
+        @JSONField(name = "id")
+        private String id;
+        @ApiModelProperty(value = "直播标题", example = "title")
+        @JSONField(name = "title")
+        private String title;
+        @ApiModelProperty(value = "直播简介", example = "summary")
+        @JSONField(name = "summary")
+        private String summary;
+        @ApiModelProperty(value = "直播详情(仅允许纯文本)", example = "descrb")
+        @JSONField(name = "descrb")
+        private String descrb;
+        @ApiModelProperty(value = "直播类型:0-语音,1-录播直播,2-推流直播", example = "2")
+        @JSONField(name = "alive_type")
+        private Integer aliveType;
+        @ApiModelProperty(value = "预设直播开始时间", example = "2023-05-31 18:00:00")
+        @JSONField(name = "zb_start_at")
+        private String zbStartAt;
+        @ApiModelProperty(value = "预设直播时长,单位:秒", example = "3600")
+        @JSONField(name = "zb_stop_at")
+        private Integer zbStopAt;
+        @ApiModelProperty(value = "详情封面图素材ID", example = "img_material_id")
+        @JSONField(name = "img_material_id")
+        private String imgMaterialId;
+        @ApiModelProperty(value = "宣传封面图素材ID", example = "alive_img_material_id")
+        @JSONField(name = "alive_img_material_id")
+        private String aliveImgMaterialId;
+        @ApiModelProperty(value = "暖场封面图素材ID", example = "aliveroom_img_material_id")
+        @JSONField(name = "aliveroom_img_material_id")
+        private String aliveroomImgMaterialId;
+        @ApiModelProperty(value = "暖场视频封面图素材ID", example = "warm_up_video_cover_material_id")
+        @JSONField(name = "warm_up_video_cover_material_id")
+        private String warmUpVideoCoverMaterialId;
+        @ApiModelProperty(value = "暖场视频素材ID", example = "warm_up_video_material_id")
+        @JSONField(name = "warm_up_video_material_id")
+        private String warmUpVideoMaterialId;
+        @ApiModelProperty(value = "录播视频素材ID", example = "alive_video_material_id")
+        @JSONField(name = "alive_video_material_id")
+        private String aliveVideoMaterialId;
+
+    }
+
+    @Data
+    @ApiModel(description = "配置信息")
+    public static class ModuleInfo {
+        @ApiModelProperty(value = "是否开启回放:0-开启,1-关闭", example = "0")
+        @JSONField(name = "is_lookback")
+        private Integer isLookback;
+        @ApiModelProperty(value = "回放是否允许倍速播放或快进:0-允许,1-禁止", example = "0")
+        @JSONField(name = "play_fast_state_switch")
+        private Integer playFastStateSwitch;
+        @ApiModelProperty(value = "直播模式:0-横屏直播,1-竖屏直播", example = "0")
+        @JSONField(name = "alive_mode")
+        private Integer aliveMode;
+        @ApiModelProperty(value = "回放有效期设置:1-永久,2-限时", example = "1")
+        @JSONField(name = "expire_type")
+        private Integer expireType;
+        @ApiModelProperty(value = "回放过期时间", example = "2023-06-30")
+        @JSONField(name = "expire")
+        private String expire;
+        @ApiModelProperty(value = "暖场设置:1-暖场图,2-暖场视频", example = "1")
+        @JSONField(name = "warm_up")
+        private Integer warmUp;
+        @ApiModelProperty(value = "是否开启完成条件:0-关闭,1-开启", example = "0")
+        @JSONField(name = "is_open_complete_time")
+        private Integer isOpenCompleteTime;
+        @ApiModelProperty(value = "设置最短学习时间(单位:分钟)", example = "0")
+        @JSONField(name = "complete_time")
+        private Integer completeTime;
+        @ApiModelProperty(value = "是否开启联系学员:0-关闭,1-开启", example = "0")
+        @JSONField(name = "is_contact_on")
+        private Integer isContactOn;
+    }
+
+    @Data
+    @ApiModel(description = "商品信息")
+    public static class GoodsInfo {
+        @ApiModelProperty(value = "售卖类型:1-单独售卖、2-关联售卖", example = "1")
+        @JSONField(name = "sale_type")
+        private Integer saleType;
+        @ApiModelProperty(value = "支付类型:1-免费,2-收费,3-加密,4-指定学员可用,5-仅关联上级资源", example = "1")
+        @JSONField(name = "payment_type")
+        private Integer paymentType;
+        @ApiModelProperty(value = "价格(单位:分)", example = "0")
+        @JSONField(name = "piece_price")
+        private Integer piecePrice;
+        @ApiModelProperty(value = "划线价格(单位:分)", example = "0")
+        @JSONField(name = "line_price")
+        private Integer linePrice;
+        @ApiModelProperty(value = "密码", example = "resource_password")
+        @JSONField(name = "resource_password")
+        private String resourcePassword;
+        @ApiModelProperty(value = "上下架:1-下架,0-上架", example = "0")
+        @JSONField(name = "recycle_bin_state")
+        private Integer recycleBinState;
+        @ApiModelProperty(value = "定时上架时间", example = "2023-05-31 17:19:26")
+        @JSONField(name = "start_at")
+        private String startAt;
+        @ApiModelProperty(value = "是否停售:0-否,1-是", example = "0")
+        @JSONField(name = "is_stop_sell")
+        private Integer isStopSell;
+        @ApiModelProperty(value = "商品编码", example = "goods_sn")
+        @JSONField(name = "goods_sn")
+        private String goodsSn;
+        @ApiModelProperty(value = "商品状态:0-可见,1-隐藏,2-删除", example = "0")
+        @JSONField(name = "state")
+        private Integer state;
+    }
+
+    @Data
+    @ApiModel(description = "关联信息")
+    public static class RelationInfo {
+        @ApiModelProperty(value = "资源id")
+        @JSONField(name = "package")
+        private List<String> packageIds;
+        @ApiModelProperty(value = "预留字段,暂未支持")
+        @JSONField(name = "attach_goods")
+        private List<String> attachGoods;
+        @ApiModelProperty(value = "预留字段,暂未支持")
+        @JSONField(name = "tags")
+        private List<String> tags;
+
+        @Data
+        @ApiModel(description = "讲师信息列表")
+        public static class RoleInfo {
+            @ApiModelProperty(value = "自定义身份标签", example = "讲师")
+            @JSONField(name = "role_name")
+            private String roleName;
+            @ApiModelProperty(value = "用户id", example = "u_6688888888889999999")
+            @JSONField(name = "user_id")
+            private String userId;
+            @ApiModelProperty(value = "用户昵称", example = "测试")
+            @JSONField(name = "nickname")
+            private String nickname;
+            @ApiModelProperty(value = "用户头像", example = "avator")
+            @JSONField(name = "avator")
+            private String avator;
+            @ApiModelProperty(value = "是否接受打赏:1-接受打赏,0-不接受打赏", example = "1")
+            @JSONField(name = "is_can_exceptional")
+            private Integer isCanExceptional;
+        }
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeLiveVoV2.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeLiveVoV2.java
new file mode 100644
index 0000000..6b8a1c4
--- /dev/null
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeLiveVoV2.java
@@ -0,0 +1,182 @@
+package com.ruoyi.goods.domain.vo;
+
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.alibaba.fastjson2.annotation.JSONField;
+
+@Data
+@ApiModel(description = "小鹅通直播视图对象2.0")
+public class XiaoeLiveVoV2 {
+
+    @ApiModelProperty(value = "店铺ID", example = "app_id")
+    @JSONField(name = "app_id")
+    private String appId;
+
+    @ApiModelProperty(value = "直播ID", example = "id")
+    @JSONField(name = "id")
+    private String id;
+
+    @ApiModelProperty(value = "房间ID", example = "room_id")
+    @JSONField(name = "room_id")
+    private String roomId;
+
+    @ApiModelProperty(value = "直播标题", example = "title")
+    @JSONField(name = "title")
+    private String title;
+
+    @ApiModelProperty(value = "直播封面图", example = "img_url")
+    @JSONField(name = "img_url")
+    private String imgUrl;
+
+    @ApiModelProperty(value = "页面url", example = "page_url")
+    @JSONField(name = "page_url")
+    private String pageUrl;
+
+    @ApiModelProperty(value = "封面压缩后的路径", example = "img_url_compressed")
+    @JSONField(name = "img_url_compressed")
+    private String imgUrlCompressed;
+
+    @ApiModelProperty(value = "评论数量", example = "comment_count")
+    @JSONField(name = "comment_count")
+    private Integer commentCount;
+
+    @ApiModelProperty(value = "带货开关:1=开,0=关", example = "1")
+    @JSONField(name = "is_takegoods")
+    private Integer isTakegoods;
+
+    @ApiModelProperty(value = "带货商品分组ID", example = "takegoods")
+    @JSONField(name = "takegoods")
+    private String takegoods;
+
+    @ApiModelProperty(value = "付费类型:1-免费、2-单笔、3-付费产品包", example = "1")
+    @JSONField(name = "payment_type")
+    private Integer paymentType;
+
+    @ApiModelProperty(value = "是否公开售卖,1公开,0不公开", example = "1")
+    @JSONField(name = "is_public")
+    private Integer isPublic;
+
+    @ApiModelProperty(value = "是否停售,0-否、1-是", example = "0")
+    @JSONField(name = "is_stop_sell")
+    private Integer isStopSell;
+
+    @ApiModelProperty(value = "视频是否转码,0-表示未转码,1-表示已转码,2-转码失败", example = "0")
+    @JSONField(name = "is_transcode")
+    private Integer isTranscode;
+
+    @ApiModelProperty(value = "payment_type为2时,单笔价格(分);payment_type为3时,专栏价格(分)", example = "0")
+    @JSONField(name = "piece_price")
+    private Integer piecePrice;
+
+    @ApiModelProperty(value = "划线价", example = "0")
+    @JSONField(name = "line_price")
+    private Integer linePrice;
+
+    @ApiModelProperty(value = "该资源是否需要密码", example = "0")
+    @JSONField(name = "have_password")
+    private Integer havePassword;
+
+    @ApiModelProperty(value = "直播类型:0-语音直播,1-视频直播,2-推流直播,3-ppt直播", example = "1")
+    @JSONField(name = "alive_type")
+    private Integer aliveType;
+
+    @ApiModelProperty(value = "订阅量", example = "0")
+    @JSONField(name = "purchase_count")
+    private Integer purchaseCount;
+
+    @ApiModelProperty(value = "打赏金额", example = "0")
+    @JSONField(name = "reward_sum")
+    private Integer rewardSum;
+
+    @ApiModelProperty(value = "强制封禁:0-否 1-是", example = "0")
+    @JSONField(name = "is_ban")
+    private Integer isBan;
+
+    @ApiModelProperty(value = "强制下架:0-否 1-是", example = "0")
+    @JSONField(name = "on_shelf")
+    private Integer onShelf;
+
+    @ApiModelProperty(value = "上下架状态:0-上架,1-下架", example = "0")
+    @JSONField(name = "recycle_bin_state")
+    private Integer recycleBinState;
+
+    @ApiModelProperty(value = "推流状态,0断流,1推流中,2推流未开始", example = "0")
+    @JSONField(name = "push_state")
+    private Integer pushState;
+
+    @ApiModelProperty(value = "直播状态:0-可见,1-关闭,2-删除", example = "0")
+    @JSONField(name = "state")
+    private Integer state;
+
+    @ApiModelProperty(value = "上架时间", example = "2023-05-31 17:19:26")
+    @JSONField(name = "start_at")
+    private String startAt;
+
+    @ApiModelProperty(value = "直播开始时间", example = "2023-05-31 17:19:26")
+    @JSONField(name = "zb_start_at")
+    private String zbStartAt;
+
+    @ApiModelProperty(value = "手动结束直播时间", example = "2023-05-31 17:19:26")
+    @JSONField(name = "manual_stop_at")
+    private String manualStopAt;
+
+    @ApiModelProperty(value = "转播店铺名称", example = "source_shop_name")
+    @JSONField(name = "source_shop_name")
+    private String sourceShopName;
+
+    @ApiModelProperty(value = "素材状态", example = "0")
+    @JSONField(name = "material_state")
+    private Integer materialState;
+
+    @ApiModelProperty(value = "视频时长(s)", example = "0")
+    @JSONField(name = "video_length")
+    private Integer videoLength;
+
+    @ApiModelProperty(value = "直播状态", example = "0")
+    @JSONField(name = "alive_state")
+    private Integer aliveState;
+
+    @ApiModelProperty(value = "直播模式:0.无;1竖屏直播", example = "0")
+    @JSONField(name = "alive_mode")
+    private Integer aliveMode;
+
+    @ApiModelProperty(value = "创建类型:0-自创建,1-转播创建", example = "0")
+    @JSONField(name = "create_mode")
+    private Integer createMode;
+
+    @ApiModelProperty(value = "圆桌会议功能是否开启", example = "0")
+    @JSONField(name = "is_round_table_on")
+    private Integer isRoundTableOn;
+
+    @ApiModelProperty(value = "关联商品", example = "query_package_list")
+    @JSONField(name = "query_package_list")
+    private String queryPackageList;
+
+    @ApiModelProperty(value = "售卖有效期", example = "course_expire")
+    @JSONField(name = "course_expire")
+    private CourseExpire courseExpire;
+
+    @ApiModelProperty("预约状态 1:已预约 0:未预约")
+    private Integer appointmentState=0;
+
+    @ApiModelProperty("创建门店")
+    private String shopName;
+
+    @Data
+    @ApiModel(description = "Course Expire Information")
+    public static class CourseExpire {
+
+        @ApiModelProperty(value = "有效期类型:0=永久有效,1=固定有效期,2=自定义有效期", example = "0")
+        @JSONField(name = "period_type")
+        private Integer periodType;
+
+        @ApiModelProperty(value = "自定义有效时长", example = "period_value")
+        @JSONField(name = "period_value")
+        private String periodValue;
+
+        @ApiModelProperty(value = "是否允许重复购买:1=是,0=否", example = "0")
+        @JSONField(name = "is_allow_repeat_purchase")
+        private Integer isAllowRepeatPurchase;
+    }
+}
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/biz/XiaoeCourseService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/biz/XiaoeCourseService.java
index cf72f59..87b8e5b 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/biz/XiaoeCourseService.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/biz/XiaoeCourseService.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.goods.domain.dto.XiaoeCourseQueryDto;
 import com.ruoyi.goods.domain.vo.XiaoeCourseChapterVO;
+import com.ruoyi.goods.domain.vo.XiaoeCourseGroupVO;
 import com.ruoyi.goods.domain.vo.XiaoeCourseVO;
 import com.ruoyi.goods.utils.XiaoeUtils;
 import lombok.RequiredArgsConstructor;
@@ -36,4 +37,12 @@
     public List<XiaoeCourseChapterVO> getCourseDetail(String id) {
         return xiaoeUtils.getCourseChapterDetail(id);
     }
+
+    /**
+     * 获取课程分组列表
+     * @return
+     */
+    public List<XiaoeCourseGroupVO> getCourseGroupList() {
+        return xiaoeUtils.getCourseGroupList();
+    }
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/biz/XiaoeLiveService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/biz/XiaoeLiveService.java
index 43fe15b..bb1426b 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/biz/XiaoeLiveService.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/biz/XiaoeLiveService.java
@@ -14,7 +14,9 @@
 import com.ruoyi.goods.domain.dto.XiaoeLiveQueryDto;
 import com.ruoyi.goods.domain.pojo.live.XiaoeLiveAppointment;
 import com.ruoyi.goods.domain.pojo.live.XiaoeLiveRecord;
+import com.ruoyi.goods.domain.vo.XiaoeLiveDetailVOV2;
 import com.ruoyi.goods.domain.vo.XiaoeLiveVo;
+import com.ruoyi.goods.domain.vo.XiaoeLiveVoV2;
 import com.ruoyi.goods.service.live.IXiaoeLiveAppointmentService;
 import com.ruoyi.goods.service.live.IXiaoeLiveRecordService;
 import com.ruoyi.goods.utils.XiaoeUtils;
@@ -32,6 +34,7 @@
 import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
@@ -67,17 +70,29 @@
         //已预约的记录
         List<XiaoeLiveAppointment> appointments = xiaoeLiveAppointmentService.lambdaQuery()
                 .gt(XiaoeLiveAppointment::getAliveStartAt, DateUtils.getNowDate()).eq(XiaoeLiveAppointment::getUserId, userId).list();
-        //处理获取到的直播数据
+        Map<String, XiaoeLiveAppointment> appointmentMap = appointments.stream().collect(Collectors.toMap(XiaoeLiveAppointment::getLiveId, appointment -> appointment));
+        // 处理直播数据
         List<XiaoeLiveVo> filteredRecords = livePageList.getRecords().stream()
-                .filter(item -> !item.getAliveState().equals(2))
-                .flatMap(item -> appointments.stream().map(appointment -> {
-                    //直播状态为未开始 且 预约记录存在 设置状态为已预约
-                    if (item.getAliveState().equals(0) && appointment.getLiveId().equals(item.getId())) {
-                        item.setAppointmentState(1);
+                .filter(item -> !item.getAliveState().equals(2)) // 过滤直播状态为已结束的记录
+                .peek(item -> {
+                    // 查找对应的预约记录
+                    XiaoeLiveAppointment appointment = appointmentMap.get(item.getId());
+
+                    // 如果预约记录存在且直播状态为未开始,则设置状态为已预约
+                    if (item.getAliveState().equals(0) && appointment != null) {
+                        item.setAppointmentState(1); // 设置为已预约
                     }
-                    return item;
-                })).sorted(Comparator.comparing(XiaoeLiveVo::getAliveState).reversed())
+                })
+                .sorted(Comparator.comparing(XiaoeLiveVo::getAliveState).reversed()) // 按照直播状态排序
                 .collect(Collectors.toList());
+        //根据直播类型过滤平台和店铺直播
+        if (Objects.nonNull(dto.getLiveType())) {
+            List<XiaoeLiveRecord> liveRecordList = xiaoeLiveRecordService.lambdaQuery().eq(XiaoeLiveRecord::getType, dto.getLiveType()).list();
+            if (CollUtil.isNotEmpty(liveRecordList)) {
+                List<String> liveIdList = liveRecordList.stream().map(XiaoeLiveRecord::getLiveId).collect(Collectors.toList());
+                filteredRecords = filteredRecords.stream().filter(item -> liveIdList.contains(item.getId())).collect(Collectors.toList());
+            }
+        }
         livePageList.setRecords(filteredRecords);
         return livePageList;
     }
@@ -87,8 +102,8 @@
      * @param id
      * @return
      */
-    public XiaoeLiveVo getLiveDetail(String id) {
-        return xiaoeUtils.getLiveDetail(id);
+    public XiaoeLiveDetailVOV2 getLiveDetail(String id) {
+        return xiaoeUtils.getLiveDetailV2(id);
     }
     /**
      * 预约直播
@@ -117,8 +132,6 @@
         xiaoeLiveAppointmentService.save(xiaoeLiveAppointment);
         /// 若为C端用户向 redis 添加预约记录
         if (sysUser.getUserType().equals("03")) {
-            // 如果活动在1小时内生成自动开始任务的延时任务
-            Date checkTime = DateUtils.addMinutes(new Date(), 61);
             // 获取当前时间
             Date nowTime = new Date();
 
@@ -126,28 +139,25 @@
             long startTimeDifference = aliveStartAt.getTime() - nowTime.getTime();
             startTimeDifference = Math.max(startTimeDifference, 3000L); // 确保差值至少为3秒
 
-            // 根据条件判断是否创建延时任务
-            if (checkTime.compareTo(aliveStartAt) > 0 || nowTime.compareTo(aliveStartAt) > 0) {
-                // 获取延时任务
-                DelayTask startDelayTask = remoteConfigService.getDelayTask(DelayTaskEnum.LIVE_APPOINTMENT_TASK.getCode() + "-" + xiaoeLiveAppointment.getId()).getData();
-                // 创建或者更新延时任务
-                if (startDelayTask == null || !startDelayTask.getEndTime().equals(aliveStartAt)) {
-                    // 删除旧的延时任务及缓存
-                    if (startDelayTask != null) {
-                        remoteConfigService.deleteDelayTask(DelayTaskEnum.LIVE_APPOINTMENT_TASK.getCode() + "-" + xiaoeLiveAppointment.getId());
-                        redisService.deleteObject(DelayTaskEnum.LIVE_APPOINTMENT_TASK.getCode() + "-" + xiaoeLiveAppointment.getId());
-                    }
-                    // 设置新的延时任务
-                    redisService.setCacheObject(DelayTaskEnum.LIVE_APPOINTMENT_TASK.getCode() + "-" + xiaoeLiveAppointment.getId(), aliveStartAt, startTimeDifference, TimeUnit.MILLISECONDS);
-                    startDelayTask = new DelayTask();
-                    startDelayTask.setDelFlag(0);
-                    startDelayTask.setCreateTime(new Date());
-                    startDelayTask.setEndTime(aliveStartAt);
-                    startDelayTask.setRedisKey(DelayTaskEnum.LIVE_APPOINTMENT_TASK.getCode() + "-" + xiaoeLiveAppointment.getId());
-
-                    // 添加新的延时任务
-                    remoteConfigService.addDelayTask(startDelayTask);
+            // 获取延时任务
+            DelayTask startDelayTask = remoteConfigService.getDelayTask(DelayTaskEnum.LIVE_APPOINTMENT_TASK.getCode() + "-" + xiaoeLiveAppointment.getId()).getData();
+            // 创建或者更新延时任务
+            if (startDelayTask == null || !startDelayTask.getEndTime().equals(aliveStartAt)) {
+                // 删除旧的延时任务及缓存
+                if (startDelayTask != null) {
+                    remoteConfigService.deleteDelayTask(DelayTaskEnum.LIVE_APPOINTMENT_TASK.getCode() + "-" + xiaoeLiveAppointment.getId());
+                    redisService.deleteObject(DelayTaskEnum.LIVE_APPOINTMENT_TASK.getCode() + "-" + xiaoeLiveAppointment.getId());
                 }
+                // 设置新的延时任务
+                redisService.setCacheObject(DelayTaskEnum.LIVE_APPOINTMENT_TASK.getCode() + "-" + xiaoeLiveAppointment.getId(), aliveStartAt, startTimeDifference, TimeUnit.MILLISECONDS);
+                startDelayTask = new DelayTask();
+                startDelayTask.setDelFlag(0);
+                startDelayTask.setCreateTime(new Date());
+                startDelayTask.setEndTime(aliveStartAt);
+                startDelayTask.setRedisKey(DelayTaskEnum.LIVE_APPOINTMENT_TASK.getCode() + "-" + xiaoeLiveAppointment.getId());
+
+                // 添加新的延时任务
+                remoteConfigService.addDelayTask(startDelayTask);
             }
         }
         return true;
@@ -259,14 +269,14 @@
      * @param dto
      * @return
      */
-    public Page<XiaoeLiveVo> getMgtLivePage(XiaoeLiveQueryDto dto) {
-        Page<XiaoeLiveVo> livePageList = xiaoeUtils.getLivePageList(dto);
+    public Page<XiaoeLiveVoV2> getMgtLivePage(XiaoeLiveQueryDto dto) {
+        Page<XiaoeLiveVoV2> livePageList = xiaoeUtils.getLivePageListV2(dto);
         Long shopId = dto.getShopId();
         if (Objects.nonNull(shopId)) {
             List<XiaoeLiveRecord> xiaoeLiveRecords = xiaoeLiveRecordService.getListByShopId(shopId);
             if (CollUtil.isNotEmpty(xiaoeLiveRecords)) {
                 List<String> liveIdList = xiaoeLiveRecords.stream().map(XiaoeLiveRecord::getLiveId).collect(Collectors.toList());
-                List<XiaoeLiveVo> filteredList = livePageList.getRecords().stream().filter(item -> liveIdList.contains(item.getId())).collect(Collectors.toList());
+                List<XiaoeLiveVoV2> filteredList = livePageList.getRecords().stream().filter(item -> liveIdList.contains(item.getId())).collect(Collectors.toList());
                 livePageList.setRecords(filteredList);
             }
         }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/live/IXiaoeLiveRecordService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/live/IXiaoeLiveRecordService.java
index a1db5cf..32e5c0f 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/live/IXiaoeLiveRecordService.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/live/IXiaoeLiveRecordService.java
@@ -28,6 +28,12 @@
      * @return
      */
     List<XiaoeLiveRecord> getListByShopId(Long shopId);
-
+    /**
+     * 添加直播创建记录
+     * @param shopId
+     * @param type
+     * @param shopName
+     * @param liveId
+     */
     void add(Long shopId, Integer type, String shopName, String liveId);
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/utils/XiaoeUtils.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/utils/XiaoeUtils.java
index b34b7b4..d6f9a23 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/utils/XiaoeUtils.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/utils/XiaoeUtils.java
@@ -1,9 +1,13 @@
 package com.ruoyi.goods.utils;
 
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.http.HttpUtil;
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.utils.DateUtils;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.redis.service.RedisService;
 import com.ruoyi.goods.domain.dto.XiaoeCourseQueryDto;
@@ -12,7 +16,9 @@
 import com.ruoyi.goods.domain.vo.XiaoeCourseChapterVO;
 import com.ruoyi.goods.domain.vo.XiaoeCourseGroupVO;
 import com.ruoyi.goods.domain.vo.XiaoeCourseVO;
+import com.ruoyi.goods.domain.vo.XiaoeLiveDetailVOV2;
 import com.ruoyi.goods.domain.vo.XiaoeLiveVo;
+import com.ruoyi.goods.domain.vo.XiaoeLiveVoV2;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
@@ -27,6 +33,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 小鹅通工具类
@@ -48,9 +55,11 @@
     //固定填写client_credential
     private  String grant_type = "client_credential";
     //获取直播列表
-    private static final String LIVE_PAGE_LIST = "https://api.xiaoe-tech.com/xe.alive.list.get/2.0.0";
+    private static final String LIVE_PAGE_LIST = "https://api.xiaoe-tech.com/xe.alive.list.get/1.0.0";
+    private static final String LIVE_PAGE_LIST_V2 = "https://api.xiaoe-tech.com/xe.alive.list.get/2.0.0";
     //获取直播详情
     private static final String LIVE_DETAIL = "https://api.xiaoe-tech.com/xe.alive.detail.get/1.0.0";
+    private static final String LIVE_DETAIL_V2 = "https://api.xiaoe-tech.com/xe.alive.detail.get/2.0.0";
     //创建直播
     private static final String LIVE_ADD = "https://api.xiaoe-tech.com/xe.alive.live.create/1.0.0";
     //编辑直播
@@ -63,6 +72,7 @@
     private static final String COURSE_CHAPTER = "https://api.xiaoe-tech.com/xe.course.course.chapter.get/1.0.0";
     //获取店铺商品分组列表
     private static final String COURSE_GROUP_LIST = "https://api.xiaoe-tech.com/xe.resource_tags.list/1.0.0";
+
 
     /**
      * 获取小鹅通access_token
@@ -98,7 +108,9 @@
             }
             JSONObject jsonObject = JSONObject.parseObject(result);
             Map data = (Map) jsonObject.get("data");
-            accessToken = (String) data.get("access_token");
+            accessToken = (String)data.get("access_token");
+            Integer expiresIn = (int) data.get("expires_in");
+            redisService.setCacheObject("xiaoe:access_token", accessToken,Long.parseLong(expiresIn.toString()), TimeUnit.SECONDS);
         }
         return accessToken;
     }
@@ -121,15 +133,17 @@
         String post = HttpUtil.post(LIVE_PAGE_LIST, JSONObject.toJSONString(postParams));
         Page<XiaoeLiveVo> xiaoeLiveVOPage = new Page<>();
         if (StringUtils.isNotBlank(post)) {
+            log.info("获取直播列表返回结果:{}", post);
             JSONObject jsonObject = JSONObject.parseObject(post);
-            if (jsonObject.get("code").equals(0)) {
+            if (jsonObject.get("code").equals(0) ) {
                 JSONObject data = jsonObject.getJSONObject("data");
                 JSONArray list = data.getJSONArray("list");
-                List<XiaoeLiveVo> xiaoeLiveVos = JSONArray.parseArray(list.toJSONString(), XiaoeLiveVo.class);
-                xiaoeLiveVOPage.setRecords(xiaoeLiveVos);
-                xiaoeLiveVOPage.setCurrent(data.getLong("page"));
-                xiaoeLiveVOPage.setTotal(data.getLong("total"));
-                xiaoeLiveVOPage.setPages(data.getLong("page_count"));
+                if (CollectionUtil.isNotEmpty(list)) {
+                    List<XiaoeLiveVo> xiaoeLiveVos = JSONArray.parseArray(list.toJSONString(), XiaoeLiveVo.class);
+                    xiaoeLiveVOPage.setRecords(xiaoeLiveVos);
+                    xiaoeLiveVOPage.setCurrent(dto.getPage());
+                    xiaoeLiveVOPage.setPages(data.getLong("page_count"));
+                }
             }
         }
         return xiaoeLiveVOPage;
@@ -157,6 +171,61 @@
     }
 
     /**
+     * 获取直播列表2.0
+     * @param dto
+     * @return
+     */
+    public Page<XiaoeLiveVoV2> getLivePageListV2(XiaoeLiveQueryDto dto) {
+        Map<String,Object> postParams = new HashMap<>();
+        postParams.put("search_content", dto.getSearchContent());
+        postParams.put("create_mode", dto.getCreateMode());
+        postParams.put("state", 0);
+        postParams.put("search_alive_type", dto.getSearchAliveType());
+        postParams.put("alive_play_state", dto.getAlivePlayState());
+        postParams.put("page", dto.getPage());
+        postParams.put("page_size", dto.getPageSize());
+        postParams.put("access_token", getAccessToken());
+        postParams.put("zb_start_at_min", DateUtil.format(DateUtils.getTodayStartTime(), DatePattern.NORM_DATETIME_PATTERN));
+        String post = HttpUtil.post(LIVE_PAGE_LIST_V2, JSONObject.toJSONString(postParams));
+        Page<XiaoeLiveVoV2> xiaoeLiveVOPage = new Page<>();
+        if (StringUtils.isNotBlank(post)) {
+            log.info("获取直播详情2.0返回结果:{}", post);
+            JSONObject jsonObject = JSONObject.parseObject(post);
+            if (jsonObject.get("code").equals(0)) {
+                JSONObject data = jsonObject.getJSONObject("data");
+                JSONArray list = data.getJSONArray("live_list");
+                if (!list.isEmpty()){
+                    List<XiaoeLiveVoV2> xiaoeLiveVos = JSONArray.parseArray(list.toJSONString(), XiaoeLiveVoV2.class);
+                    xiaoeLiveVOPage.setRecords(xiaoeLiveVos);
+                    xiaoeLiveVOPage.setCurrent(dto.getPage());
+                    xiaoeLiveVOPage.setTotal(data.getLong("total_count"));
+                }
+            }
+        }
+        return xiaoeLiveVOPage;
+    }
+
+    /**
+     *获取直播详情
+     * @param id 直播ID
+     * @return
+     */
+    public XiaoeLiveDetailVOV2 getLiveDetailV2(String id) {
+        Map<String, Object> postParams = new HashMap<>();
+        postParams.put("id", id);
+        postParams.put("access_token", getAccessToken());
+        String post = HttpUtil.post(LIVE_DETAIL_V2, JSONObject.toJSONString(postParams));
+        XiaoeLiveDetailVOV2 vo = null;
+        if (StringUtils.isNotBlank(post)) {
+            JSONObject jsonObject = JSONObject.parseObject(post);
+            if (jsonObject.get("code").equals(0)) {
+                JSONObject data = jsonObject.getJSONObject("data");
+                vo = JSONObject.parseObject(data.toJSONString(), XiaoeLiveDetailVOV2.class);
+            }
+        }
+        return vo;
+    }
+    /**
      * 创建直播
      * @param dto
      * @return
@@ -176,18 +245,22 @@
         moudleInfoMap.put("alive_mode", dto.getAliveMode());
         requestParams.put("module_info", moudleInfoMap);
         //讲师信息
+        List<Map<String, Object>> roleList = new ArrayList<>();
         Map<String, Object> roleInfoMap = new HashMap<>();
+        roleInfoMap.put("role_name", "讲师");
         roleInfoMap.put("user_id", dto.getUserId());
-        requestParams.put("role_info", roleInfoMap);
+        roleList.add(roleInfoMap);
+        requestParams.put("role_info", roleList);
         //商品信息
         Map<String, Object> goodsInfoMap = new HashMap<>();
-        goodsInfoMap.put("sale_type", 2);//售卖类型:1-单独售卖、2-关联售卖
+        goodsInfoMap.put("sale_type", 1);//售卖类型:1-单独售卖、2-关联售卖
         goodsInfoMap.put("payment_type", dto.getPaymentType());
         if (dto.getPaymentType().equals(3)) {
             goodsInfoMap.put("resource_password", dto.getResourcePassword());
         }
         requestParams.put("goods_info", goodsInfoMap);
         requestParams.put("access_token", getAccessToken());
+        log.info("创建直播参数:{}" ,JSONObject.toJSONString(requestParams));
         String post = HttpUtil.post(LIVE_ADD, JSONObject.toJSONString(requestParams));
         if (StringUtils.isNotBlank(post)) {
             JSONObject jsonObject = JSONObject.parseObject(post);
@@ -200,7 +273,7 @@
         return null;
     }
     /**
-     * 创建直播
+     * 编辑直播
      * @param dto
      * @return
      */
@@ -221,18 +294,22 @@
         moudleInfoMap.put("alive_mode", dto.getAliveMode());
         requestParams.put("module_info", moudleInfoMap);
         //讲师信息
+        List<Map<String, Object>> roleList = new ArrayList<>();
         Map<String, Object> roleInfoMap = new HashMap<>();
+        roleInfoMap.put("role_name", "讲师");
         roleInfoMap.put("user_id", dto.getUserId());
-        requestParams.put("role_info", roleInfoMap);
+        roleList.add(roleInfoMap);
+        requestParams.put("role_info", roleList);
         //商品信息
         Map<String, Object> goodsInfoMap = new HashMap<>();
-        goodsInfoMap.put("sale_type", 2);//售卖类型:1-单独售卖、2-关联售卖
+        goodsInfoMap.put("sale_type", 1);//售卖类型:1-单独售卖、2-关联售卖
         goodsInfoMap.put("payment_type", dto.getPaymentType());
         if (dto.getPaymentType().equals(3)) {
             goodsInfoMap.put("resource_password", dto.getResourcePassword());
         }
         requestParams.put("goods_info", goodsInfoMap);
         requestParams.put("access_token", getAccessToken());
+        log.info("编辑直播参数:{}" ,JSONObject.toJSONString(requestParams));
         String post = HttpUtil.post(LIVE_EDIT, JSONObject.toJSONString(requestParams));
         if (StringUtils.isNotBlank(post)) {
             JSONObject jsonObject = JSONObject.parseObject(post);
@@ -294,15 +371,20 @@
      * @return
      */
     public Page<XiaoeCourseVO> getCoursePageList(XiaoeCourseQueryDto dto) {
-        JSONObject requestParams = JSONObject.parseObject(JSONObject.toJSONString(dto));
+        Map<String, Object> requestParams = new HashMap<>();
+        requestParams.put("search_content", dto.getSearchContent());
+        requestParams.put("page", dto.getPageNo());
+        requestParams.put("page_size", dto.getPageSize());
+        requestParams.put("created_source", dto.getCreatedSource());
+        requestParams.put("tags", dto.getTags());
         if (dto.getSortBy().equals(1)) {
             requestParams.put("order_by", "modify");//根据创建时间排序
-            requestParams.put("order_type", "降序");
+            requestParams.put("order_type",1);
         }
 
         requestParams.put("sale_status", 1);
         requestParams.put("access_token", getAccessToken());
-        String post = HttpUtil.post(COURSE_PAGE_LIST, requestParams.toJSONString());
+        String post = HttpUtil.post(COURSE_PAGE_LIST, JSONObject.toJSONString(requestParams));
         Page<XiaoeCourseVO> page = new Page<>();
         if (StringUtils.isNotBlank(post)) {
             log.info("获取课程列表返回结果:{}" ,post);
@@ -331,16 +413,16 @@
         requestParams.put("course_id", id);
         requestParams.put("access_token", getAccessToken());
         String post = HttpUtil.post(COURSE_CHAPTER, JSONObject.toJSONString(requestParams));
-        List<XiaoeCourseChapterVO> xiaoeCourseChapterVO = new ArrayList<>();
+        List<XiaoeCourseChapterVO> courseChapterVOList = new ArrayList<>();
         if (StringUtils.isNotBlank(post)) {
             log.info("查询课程目录小节返回结果:{}" ,post);
             JSONObject jsonObject = JSONObject.parseObject(post);
             if (jsonObject.get("code").equals(0)) {
-                String data = jsonObject.getString("data");
-                xiaoeCourseChapterVO = JSONArray.parseArray(data, XiaoeCourseChapterVO.class);
+                JSONObject data = jsonObject.getJSONObject("data");
+                courseChapterVOList = JSONArray.parseArray(data.getString("list"), XiaoeCourseChapterVO.class);
             }
         }
-        return xiaoeCourseChapterVO;
+        return courseChapterVOList;
     }
     public static void main(String[] args) {
         String urlString = BASE_URL +
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/sys/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/sys/SysUserController.java
index 57776ec..54c0ff6 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/sys/SysUserController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/sys/SysUserController.java
@@ -1,6 +1,5 @@
 package com.ruoyi.system.controller.sys;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.exception.ServiceException;
 import com.ruoyi.common.core.utils.StringUtils;
@@ -18,19 +17,31 @@
 import com.ruoyi.system.api.domain.dto.MgtFrozenMemberDto;
 import com.ruoyi.system.api.domain.poji.sys.SysDept;
 import com.ruoyi.system.api.domain.poji.sys.SysRole;
+import com.ruoyi.system.api.domain.poji.sys.SysStaff;
 import com.ruoyi.system.api.domain.poji.sys.SysUser;
 import com.ruoyi.system.api.model.LoginUser;
 import com.ruoyi.system.api.model.QwH5LoginVo;
 import com.ruoyi.system.api.model.QwUserDetailDto;
 import com.ruoyi.system.domain.dto.UserMenuEditDto;
-import com.ruoyi.system.api.domain.poji.sys.SysStaff;
 import com.ruoyi.system.service.staff.SysStaffService;
-import com.ruoyi.system.service.sys.*;
+import com.ruoyi.system.service.sys.ISysConfigService;
+import com.ruoyi.system.service.sys.ISysDeptService;
+import com.ruoyi.system.service.sys.ISysPermissionService;
+import com.ruoyi.system.service.sys.ISysPostService;
+import com.ruoyi.system.service.sys.ISysRoleService;
+import com.ruoyi.system.service.sys.ISysUserService;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.ArrayUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
@@ -459,6 +470,7 @@
      * @return  R<QwH5LoginVo>
      */
     @PostMapping("/qwH5StaffLogin")
+    @ApiOperation(value = "员工端登录")
     public R<QwH5LoginVo> qwH5StaffLogin(@RequestBody QwUserDetailDto qwUserDetail)
     {
         String mobile = qwUserDetail.getMobile();

--
Gitblit v1.7.1