package org.ruoyi.system.service.impl; import cn.dev33.satoken.exception.NotLoginException; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.TypeReference; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import okhttp3.Request; import org.apache.commons.lang3.math.NumberUtils; import org.ruoyi.common.core.exception.base.BaseException; import org.ruoyi.common.core.service.ConfigService; import org.ruoyi.common.mybatis.core.page.PageQuery; import org.ruoyi.common.mybatis.core.page.TableDataInfo; import org.ruoyi.common.wechat.itchat4j.utils.enums.ResultEnum; import org.ruoyi.system.cofing.OkHttpConfig; import org.ruoyi.system.domain.Cover; import org.ruoyi.system.domain.CoverPromptAudio; import org.ruoyi.system.domain.model.ApiResult; import org.ruoyi.system.domain.vo.cover.*; import org.ruoyi.system.mapper.CoverMapper; import org.ruoyi.system.mapper.CoverPromptAudioMapper; import org.ruoyi.system.service.ICoverService; import org.ruoyi.system.util.WeChatScanHttpUtil; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import static org.ruoyi.common.satoken.utils.LoginHelper.getLoginUser; /** * 翻唱Service业务层处理 * * @author NSL * @since 2024-12-25 */ @RequiredArgsConstructor @Service @Slf4j public class CoverServiceImpl implements ICoverService { private final CoverMapper coverMapper; private final CoverPromptAudioMapper coverPromptAudioMapper; private final ConfigService configService; private final IChatCostService chatCostService; private final WeChatScanHttpUtil weChatScanHttpUtil; private final OkHttpConfig okHttpConfig; @Override public List searchMusic(String musicName) { Map queryMap = new HashMap<>(); queryMap.put("keyword", musicName); String json = JSONUtil.toJsonStr(queryMap); Request postRequest = weChatScanHttpUtil.createPostRequest(getKey("search_music_url"), json); String body = weChatScanHttpUtil.executeRequest(postRequest); ApiResult apiResult = JSONUtil.toBean(body, ApiResult.class); Object data = apiResult.getData(); Map> userMap = JSONUtil.toBean(JSONUtil.toJsonStr(data), new TypeReference<>() {}, true); return userMap.get("musicList"); } @Override public void callback(CoverCallbackVo coverCallbackVo) { Cover cover = BeanUtil.copyProperties(coverCallbackVo, Cover.class); coverMapper.insertOrUpdate(cover); } @Override public void saveCoverTask(CoverParamVo coverParamVo) { Long userId = null; try { userId = getLoginUser().getUserId(); } catch (Exception e) { throw new NotLoginException(NotLoginException.NOT_TOKEN_MESSAGE, NotLoginException.NOT_TOKEN, NotLoginException.NOT_TOKEN); } List promptAudioUrl = coverParamVo.getPromptAudioUrl(); Cover cover = BeanUtil.copyProperties(coverParamVo, Cover.class); cover.setUserId(userId); coverMapper.insertOrUpdate(cover); if (CollUtil.isEmpty(promptAudioUrl)) { // 查询用户最近一次翻唱记录 List coverPromptAudioVoList = coverPromptAudioMapper.selectLatestVoByUserId(userId); if (CollUtil.isEmpty(coverPromptAudioVoList)) { throw new BaseException("未查询到翻唱记录,请上传参考音频!"); } List promptAudioUrlList = coverPromptAudioVoList.stream().map(CoverPromptAudioVo::getPromptAudioUrl).collect(Collectors.toList()); coverParamVo.setPromptAudioUrl(promptAudioUrlList); } else { // 保存用户翻唱记录 for (String audioUrl : promptAudioUrl) { CoverPromptAudio coverPromptAudio = new CoverPromptAudio(); coverPromptAudio.setPromptAudioUrl(audioUrl); coverPromptAudio.setUserId(userId); coverPromptAudio.setCoverId(cover.getId()); coverPromptAudioMapper.insertOrUpdate(coverPromptAudio); } } coverParamVo.setUserId(String.valueOf(userId)); coverParamVo.setOrderId(String.valueOf(cover.getId())); coverParamVo.setUserGender(""); log.info("发起翻唱任务,入参{}", JSONUtil.toJsonStr(coverParamVo)); // 调用翻唱API Request postRequest = weChatScanHttpUtil.createPostRequest(getKey("cover_url"), JSONUtil.toJsonStr(coverParamVo)); String body = weChatScanHttpUtil.executeRequest(postRequest); ApiResult apiResult = JSONUtil.toBean(body, ApiResult.class); if (ResultEnum.SUCCESS.getCode().equals(String.valueOf(apiResult.getCode()))) { // 扣费 chatCostService.taskDeduct("cover", "token", NumberUtils.toDouble(okHttpConfig.getGenerate(), 2.5)); } log.info("调用翻唱结果,出参{}", body); } @Override public TableDataInfo searchCoverRecord(PageQuery pageQuery) { LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(Cover::getUserId, getLoginUser().getUserId()); queryWrapper.orderByDesc(Cover::getCreateTime); Page result = coverMapper.selectVoPage(pageQuery.build(), queryWrapper); return TableDataInfo.build(result); } public String getKey(String key) { return configService.getConfigValue("cover", key); } }