ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtLiveController.java
@@ -5,7 +5,7 @@ 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.XiaoeLiveVoV2; import com.ruoyi.goods.domain.vo.XiaoeLiveVo; import com.ruoyi.goods.service.biz.XiaoeLiveService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -40,7 +40,7 @@ */ @ApiOperation("直播分页列表") @PostMapping("/page") public R<Page<XiaoeLiveVoV2>> page(@Valid @RequestBody XiaoeLiveQueryDto dto) { public R<Page<XiaoeLiveVo>> page(@Valid @RequestBody XiaoeLiveQueryDto dto) { return R.ok(xiaoeLiveService.getMgtLivePage(dto)); } /** ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/staff/StaffLiveController.java
New file @@ -0,0 +1,39 @@ package com.ruoyi.goods.controller.staff; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.R; import com.ruoyi.goods.domain.dto.XiaoeLiveQueryDto; import com.ruoyi.goods.domain.vo.XiaoeLiveVo; import com.ruoyi.goods.service.biz.XiaoeLiveService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.validation.Valid; /** * @author mitao * @date 2025/1/15 */ @Api(tags = {"员工端直播相关接口"}) @RestController @RequestMapping("/staff/live") @RequiredArgsConstructor public class StaffLiveController { private final XiaoeLiveService xiaoeLiveService; /** * 员工端直播列表 * @param dto * @return */ @ApiOperation("直播列表") @PostMapping("/page") public R<Page<XiaoeLiveVo>> minePage(@Valid @RequestBody XiaoeLiveQueryDto dto) { return R.ok(xiaoeLiveService.getStaffLivePage(dto)); } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/XiaoeLiveDto.java
@@ -53,7 +53,7 @@ private String userId; @ApiModelProperty(value = "支付类型:1-免费,3-加密,仅当goods_info.sale_type=2时才可用", example = "1") @NotNull(message = "支付类型不能为空") @NotNull(message = "直播类型不能为空") @JSONField(name = "payment_type") private Integer paymentType; ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/XiaoeCourseVO.java
@@ -18,6 +18,10 @@ @JSONField(name = "resource_id") private String resourceId; @ApiModelProperty("课程id") @JSONField(name = "resource_type") private Integer resourceType; @ApiModelProperty("课程名称") @JSONField(name = "title") private String title; @@ -38,6 +42,10 @@ @JSONField(name = "curriculum_time") private Date curriculumTime; @ApiModelProperty("更新时间") @JSONField(name = "last_updated_at") private Date lastUpdatedAt; @ApiModelProperty("开课结束时间") @JSONField(name = "curriculum_end_time") private Date curriculumEndTime; ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/biz/XiaoeLiveService.java
@@ -16,7 +16,6 @@ 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; @@ -88,11 +87,13 @@ //根据直播类型过滤平台和店铺直播 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()); if (CollUtil.isEmpty(liveRecordList)) { return new Page<>(); } 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; } @@ -129,6 +130,7 @@ Date aliveStartAt = DateUtil.parse(liveDetail.getAliveStartAt(), DatePattern.NORM_DATETIME_PATTERN); xiaoeLiveAppointment.setAliveStartAt(aliveStartAt); xiaoeLiveAppointment.setCreateTime(DateUtils.getNowDate()); xiaoeLiveAppointment.setTitle(liveDetail.getTitle()); xiaoeLiveAppointmentService.save(xiaoeLiveAppointment); /// 若为C端用户向 redis 添加预约记录 if (sysUser.getUserType().equals("03")) { @@ -186,7 +188,10 @@ //当前商家创建的直播 Set<String> liveIdSet = xiaoeLiveRecordList.stream().map(XiaoeLiveRecord::getLiveId).collect(Collectors.toSet()); //过滤数据 List<XiaoeLiveVo> filteredRecords = livePageList.getRecords().stream().filter(item -> liveIdSet.contains(item.getId()) && !item.getAliveState().equals(2)).collect(Collectors.toList()); List<XiaoeLiveVo> filteredRecords = livePageList.getRecords().stream() .filter(item -> liveIdSet.contains(item.getId()) && !item.getAliveState().equals(2)) // 按照直播状态排序 .sorted(Comparator.comparing(XiaoeLiveVo::getAliveState).reversed()).collect(Collectors.toList()); livePageList.setRecords(filteredRecords); return livePageList; } @@ -269,17 +274,26 @@ * @param dto * @return */ public Page<XiaoeLiveVoV2> getMgtLivePage(XiaoeLiveQueryDto dto) { Page<XiaoeLiveVoV2> livePageList = xiaoeUtils.getLivePageListV2(dto); public Page<XiaoeLiveVo> getMgtLivePage(XiaoeLiveQueryDto dto) { Page<XiaoeLiveVo> livePageList = xiaoeUtils.getLivePageList(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<XiaoeLiveVoV2> filteredList = livePageList.getRecords().stream().filter(item -> liveIdList.contains(item.getId())).collect(Collectors.toList()); livePageList.setRecords(filteredList); if (CollUtil.isEmpty(xiaoeLiveRecords)) { return new Page<>(); } 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()); livePageList.setRecords(filteredList); } List<XiaoeLiveRecord> shopRecordList = xiaoeLiveRecordService.lambdaQuery().eq(XiaoeLiveRecord::getType, 2).list(); Map<String, String> shopNameMap = shopRecordList.stream().collect(Collectors.toMap(XiaoeLiveRecord::getLiveId, XiaoeLiveRecord::getShopName)); livePageList.setRecords(livePageList.getRecords().stream().peek(item -> { String name = shopNameMap.get(item.getId()); if (StringUtils.isNotBlank(name)) { item.setShopName(name); } }).collect(Collectors.toList())); return livePageList; } @@ -294,4 +308,27 @@ xiaoeLiveRecordService.lambdaUpdate().eq(XiaoeLiveRecord::getLiveId, id).remove(); } } /** * 员工端直播列表 * @param dto * @return */ public Page<XiaoeLiveVo> getStaffLivePage(XiaoeLiveQueryDto dto) { Page<XiaoeLiveVo> page = new Page<>(); List<XiaoeLiveRecord> xiaoeLiveRecordList = xiaoeLiveRecordService.getMgtRecord(); if (CollectionUtil.isEmpty(xiaoeLiveRecordList)) { return page; } Page<XiaoeLiveVo> livePageList = xiaoeUtils.getLivePageList(dto); if (CollectionUtil.isEmpty(livePageList.getRecords())) { return page; } //筛选平台创建的直播 Set<String> liveIdSet = xiaoeLiveRecordList.stream().map(XiaoeLiveRecord::getLiveId).collect(Collectors.toSet()); //过滤数据 List<XiaoeLiveVo> filteredRecords = livePageList.getRecords().stream().filter(item -> liveIdSet.contains(item.getId()) && !item.getAliveState().equals(2)).collect(Collectors.toList()); livePageList.setRecords(filteredRecords); return livePageList; } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/live/XiaoeLiveRecordServiceImpl.java
@@ -58,4 +58,13 @@ xiaoeLiveRecord.setCreateTime(DateUtils.getNowDate()); save(xiaoeLiveRecord); } /** * 平台直播哦添加记录 * @return */ @Override public List<XiaoeLiveRecord> getMgtRecord() { return lambdaQuery().eq(XiaoeLiveRecord::getType, 1).list(); } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/live/IXiaoeLiveRecordService.java
@@ -36,4 +36,6 @@ * @param liveId */ void add(Long shopId, Integer type, String shopName, String liveId); List<XiaoeLiveRecord> getMgtRecord(); } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/utils/WeChatSubscribeMessageSender.java
@@ -16,6 +16,7 @@ @Slf4j public class WeChatSubscribeMessageSender { private static final String ACCESS_TOKEN_HOST = "https://api.weixin.qq.com/cgi-bin/token"; private static final String STABLE_ACCESS_TOKEN_HOST = "https://api.weixin.qq.com/cgi-bin/stable_token"; private static final String API_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send"; private static final String WX_APPID = "wxb7f0ea286fc4e535"; @@ -41,13 +42,14 @@ params.put("touser", touser); // 构建订阅消息内容的JSON对象 JSONObject messageData = new JSONObject(); messageData.put("thing1", createDataItem("直播主题", title)); messageData.put("thing4", createDataItem("直播间名称", shopName)); messageData.put("time5", createDataItem("直播时间", DateUtil.format(aliveStartAt, "MM-dd HH:mm:ss"))); params.put("data", messageData.toJSONString()); messageData.put("thing4", createDataItem("直播间名称", shopName)); messageData.put("thing1", createDataItem("直播主题", title)); params.put("data", messageData); params.put("miniprogram_state", "trial"); params.put("lang", "zh_CN"); try { log.info("发送消息参数:{}", JSONObject.toJSONString(params)); String post = HttpUtil.post(url, JSONObject.toJSONString(params)); log.info("发送消息返回结果:{}", post); } catch (Exception e) { @@ -59,10 +61,15 @@ * 获取access_token * @return */ public static String getAccessTokenByWX() { String host = ACCESS_TOKEN_HOST + "?appid=" + WX_APPID + "&secret=" + WX_SECRET + "&grant_type=client_credential"; log.info("host:{}", host); return HttpUtil.get(host); private static String getAccessTokenByWX() { Map<String, Object> params = new HashMap<>(); params.put("appid", WX_APPID); params.put("secret", WX_SECRET); params.put("grant_type", "client_credential"); String token = HttpUtil.post(STABLE_ACCESS_TOKEN_HOST,JSONObject.toJSONString(params)); log.info("token:{}", token); JSONObject jsonObject = JSONObject.parseObject(token); return jsonObject.getString("access_token"); } private static Map<String, Object> createDataItem(String name, String value) { Map<String, Object> item = new HashMap<>();