办学质量监测教学评价系统
ageerle
2025-04-08 57e17e0dda8eaf3b32a684d5401244da9f378e17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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.IChatCostService;
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<MusicVo> searchMusic(String musicName) {
        Map<String, String> 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<String, List<MusicVo>> 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<String> promptAudioUrl = coverParamVo.getPromptAudioUrl();
        Cover cover = BeanUtil.copyProperties(coverParamVo, Cover.class);
        cover.setUserId(userId);
        coverMapper.insertOrUpdate(cover);
        if (CollUtil.isEmpty(promptAudioUrl)) {
            // 查询用户最近一次翻唱记录
            List<CoverPromptAudioVo> coverPromptAudioVoList = coverPromptAudioMapper.selectLatestVoByUserId(userId);
            if (CollUtil.isEmpty(coverPromptAudioVoList)) {
                throw new BaseException("未查询到翻唱记录,请上传参考音频!");
            }
                List<String> 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<CoverVo> searchCoverRecord(PageQuery pageQuery) {
        LambdaQueryWrapper<Cover> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(Cover::getUserId, getLoginUser().getUserId());
        queryWrapper.orderByDesc(Cover::getCreateTime);
        Page<CoverVo> result = coverMapper.selectVoPage(pageQuery.build(), queryWrapper);
        return TableDataInfo.build(result);
    }
 
    public String getKey(String key) {
        return configService.getConfigValue("cover", key);
    }
 
}