فهرست منبع

添加数字人相关的业务类

wuyouzhi 1 ماه پیش
والد
کامیت
6d98252ffb
32فایلهای تغییر یافته به همراه3061 افزوده شده و 0 حذف شده
  1. 250 0
      xyzc-start/src/main/java/com/xyzc/start/controller/NumPersonController.java
  2. 145 0
      xyzc-start/src/main/java/com/xyzc/start/domain/NpCommitTrain.java
  3. 90 0
      xyzc-start/src/main/java/com/xyzc/start/domain/NpMaterial.java
  4. 68 0
      xyzc-start/src/main/java/com/xyzc/start/domain/NpMusic.java
  5. 138 0
      xyzc-start/src/main/java/com/xyzc/start/domain/NpSound.java
  6. 97 0
      xyzc-start/src/main/java/com/xyzc/start/domain/NpTemplate.java
  7. 51 0
      xyzc-start/src/main/java/com/xyzc/start/domain/NpText.java
  8. 175 0
      xyzc-start/src/main/java/com/xyzc/start/domain/NpVideoConflate.java
  9. 39 0
      xyzc-start/src/main/java/com/xyzc/start/domain/NpVideoDraft.java
  10. 84 0
      xyzc-start/src/main/java/com/xyzc/start/domain/vo/NpTemplateVo.java
  11. 10 0
      xyzc-start/src/main/java/com/xyzc/start/mapper/NpCommitTrainMapper.java
  12. 10 0
      xyzc-start/src/main/java/com/xyzc/start/mapper/NpMaterialMapper.java
  13. 15 0
      xyzc-start/src/main/java/com/xyzc/start/mapper/NpMusicMapper.java
  14. 15 0
      xyzc-start/src/main/java/com/xyzc/start/mapper/NpTextMapper.java
  15. 10 0
      xyzc-start/src/main/java/com/xyzc/start/mapper/NpVideoConflateMapper.java
  16. 13 0
      xyzc-start/src/main/java/com/xyzc/start/mapper/NpVideoDraftMapper.java
  17. 24 0
      xyzc-start/src/main/java/com/xyzc/start/mapper/NumPersonMapper.java
  18. 26 0
      xyzc-start/src/main/java/com/xyzc/start/service/INpCommitService.java
  19. 8 0
      xyzc-start/src/main/java/com/xyzc/start/service/INpNotifyService.java
  20. 25 0
      xyzc-start/src/main/java/com/xyzc/start/service/INpQueryService.java
  21. 53 0
      xyzc-start/src/main/java/com/xyzc/start/service/INumPersonService.java
  22. 501 0
      xyzc-start/src/main/java/com/xyzc/start/service/impl/NpCommitServiceImpl.java
  23. 101 0
      xyzc-start/src/main/java/com/xyzc/start/service/impl/NpNotifySeriviceImpl.java
  24. 353 0
      xyzc-start/src/main/java/com/xyzc/start/service/impl/NpQueryServiceImpl.java
  25. 526 0
      xyzc-start/src/main/java/com/xyzc/start/service/impl/NumPersonServiceImpl.java
  26. 140 0
      xyzc-start/src/main/java/com/xyzc/start/utils/SnowflakeIdWorker.java
  27. 7 0
      xyzc-start/src/main/resources/mapper/WebStart/NpCommitTrainMapper.xml
  28. 7 0
      xyzc-start/src/main/resources/mapper/WebStart/NpMaterialMapper.xml
  29. 30 0
      xyzc-start/src/main/resources/mapper/WebStart/NpMusicMapper.xml
  30. 28 0
      xyzc-start/src/main/resources/mapper/WebStart/NpTextMapper.xml
  31. 7 0
      xyzc-start/src/main/resources/mapper/WebStart/NpVideoDraftMapper.xml
  32. 15 0
      xyzc-start/src/main/resources/mapper/WebStart/NumPersonMapper.xml

+ 250 - 0
xyzc-start/src/main/java/com/xyzc/start/controller/NumPersonController.java

@@ -0,0 +1,250 @@
+package com.xyzc.start.controller;
+
+
+import com.xyzc.common.core.utils.Result;
+import com.xyzc.start.domain.*;
+import com.xyzc.start.domain.vo.ComfyuiWorkflowVo;
+import com.xyzc.start.service.*;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.logging.log4j.util.Strings;
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+@RestController
+@RequiredArgsConstructor
+@CrossOrigin
+@Slf4j
+@RequestMapping("/numPerson")
+public class NumPersonController {
+
+
+    private final INumPersonService numPersonService;
+
+    private final INpCommitService npCommitService;
+
+    private final INpQueryService npQueryService;
+
+    private final INpNotifyService npNotifyService;
+
+
+    /**
+     * 提交训练视频
+     */
+    @PostMapping("/commitTrainVideo")
+    @ResponseBody
+    public void commitTrainVideo(@RequestBody NpCommitTrain npCommitTrain){
+        npCommitService.commitTrainVideo(npCommitTrain);
+    }
+
+    /**
+     * 训练数字人的查询
+     */
+    @PostMapping("/queryTrainVideo")
+    @ResponseBody
+    public void queryTrainVideo(@RequestParam("id") String id){
+        npQueryService.queryTrainVideo(id);
+    }
+
+    /**
+     * 提交训练视频的异步通知
+     */
+    @PostMapping("/commitTrainVedioNotify")
+    @ResponseBody
+    public String commitTrainVedioNotify(@RequestBody String notify){
+        log.info("notify:" + notify);
+        if (Strings.isBlank(notify)) {
+            return "\n" +
+                    "    \"code\": \"1\",\n" +
+                    "    \"message\": \"请求失败\",\n" +
+                    "    \"success\": false\n";
+        }
+        npNotifyService.commitTrainVedioNotify(notify);
+
+        return "{\n" +
+                "    \"code\": \"0\",\n" +
+                "    \"message\": \"请求成功\",\n" +
+                "    \"success\": true\n" +
+                "}";
+    }
+
+    /**
+     *上传素材
+     * @param file form-data/file	文件
+     * @param rootId 素材类型 ,0:背景(图片或者视频),1:图片素材,4:视频素材
+     */
+    @PostMapping("/uploadMaterial")
+    @ResponseBody
+    public void uploadMaterial(MultipartFile file, String rootId){
+        npCommitService.uploadMaterial(file, rootId);
+    }
+
+    /**
+     *上传音乐
+     */
+    @PostMapping("/uploadMusic")
+    @ResponseBody
+    public Result<String> uploadMusic(NpMusic npMusic){
+        npCommitService.uploadMusic(npMusic);
+        return Result.ok("上传成功");
+    }
+
+    /**
+     * 查询音乐
+     */
+    @PostMapping("/queryMusic")
+    @ResponseBody
+    public Result<List<NpMusic>> QueryMusic(NpMusic npMusic){
+        List<NpMusic> npMusics = npQueryService.queryMusic(npMusic);
+
+        return Result.ok(npMusics);
+    }
+
+    /**
+     *上传音乐
+     */
+    @PostMapping("/uploadText")
+    @ResponseBody
+    public Result<String> uploadText(NpText npText){
+        npCommitService.uploadText(npText);
+        return Result.ok("上传成功");
+    }
+
+    /**
+     * 查询音乐
+     */
+    @PostMapping("/queryText")
+    @ResponseBody
+    public Result<List<NpText>> queryText(NpText npText){
+        List<NpText> npTextList = npQueryService.queryNpText(npText);
+        return Result.ok(npTextList);
+    }
+
+    /**
+     * 查询素材
+     * rootId  素材类型 ,0:背景(图片或者视频),1:图片素材,4:视频素材
+     * page	   页号默认1
+     * size	   每页大小默认10
+     * asc	   是否正序, true 正序 false 倒序(默认)
+     */
+    @PostMapping("/queryMaterial")
+    @ResponseBody
+    public void queryMaterial(String rootId, String page, String size){
+        npCommitService.queryMaterial(rootId, page, size);
+    }
+
+    /**
+     * 采集数据
+     */
+    @PostMapping("/collectData")
+    @ResponseBody
+    public void collectData() {
+        numPersonService.freeModelListQuery();
+    }
+
+    /**
+     * 获取公司公共声音
+     *
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/queryCompanySound")
+    @ResponseBody
+    public Result<List<NpSound>> queryCompanySound() throws Exception {
+        List<NpSound> companySoundList = numPersonService.queryCompanySound();
+        return Result.ok(companySoundList);
+    }
+
+    /**
+     * 获取公共模特
+     *
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/queryCommonTemplate")
+    @ResponseBody
+    public Result<List<NpTemplate>> queryCommonTemplate() throws Exception {
+        List<NpTemplate> npTemplateList = numPersonService.queryCommonTemplate();
+        return Result.ok(npTemplateList);
+    }
+
+    /**
+     * 查询用户底下的数字人
+     *
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/queryTrainingModel")
+    @ResponseBody
+    public Result<List<NpCommitTrain>> queryTrainingModel() throws Exception {
+        List<NpCommitTrain> npTemplateList = numPersonService.queryTrainingModel();
+        return Result.ok(npTemplateList);
+    }
+
+    /**
+     * 数字人异步通知
+     *
+     * @param notify
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/numberPersonCommitNotify")
+    @ResponseBody
+    public String numberPersonCommitNotify(@RequestBody String notify) throws Exception {
+        log.info("notify:{}", notify);
+        numPersonService.numberPersonCommitNotify(notify);
+        return "{\n" +
+                "    \"code\": \"0\",\n" +
+                "    \"message\": \"请求成功\",\n" +
+                "    \"success\": true\n" +
+                "}";
+    }
+
+    /**
+     * 3.8 合成任务回调接口
+     * @param notify
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/composeVedioNotify")
+    @ResponseBody
+    public String composeVedioNotify(@RequestBody String notify) throws Exception {
+        log.info("notify:{}", notify);
+        npNotifyService.composeVedioNotify(notify);
+        return "{\n" +
+                "    \"code\": \"0\",\n" +
+                "    \"message\": \"请求成功\",\n" +
+                "    \"success\": true\n" +
+                "}";
+    }
+
+    /**
+     * 获取训练任务的详情
+     * @param trainingId
+     * @return
+     */
+    @GetMapping("/getTrainingInfo/{trainingId}")
+    @ResponseBody
+    public Result<Void> getTrainingInfo(@PathVariable("trainingId") String trainingId) {
+        numPersonService.getTrainingInfo(trainingId);
+
+        return Result.ok();
+    }
+
+    @GetMapping("/getTemplateDraft")
+    @ResponseBody
+    public Result<List<NpVideoDraft>> getTemplateDraft(String templateId) {
+        List<NpVideoDraft> npVideoDraft = numPersonService.getTemplateDraft(templateId);
+        return Result.ok(npVideoDraft);
+    }
+
+    @PostMapping("/saveTemplateDraft")
+    @ResponseBody
+    public Result<String> saveTemplateDraft(@RequestBody NpVideoDraft npVideoDraft) {
+        numPersonService.saveTemplateDraft(npVideoDraft);
+        return Result.ok("保存成功!");
+    }
+}

+ 145 - 0
xyzc-start/src/main/java/com/xyzc/start/domain/NpCommitTrain.java

@@ -0,0 +1,145 @@
+package com.xyzc.start.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.xyzc.common.mybatis.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 数字人提交训练对象 xy_np_commit_train
+ *
+ * @author wyz
+ * @date 2024-08-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("xy_np_commit_train")
+public class NpCommitTrain extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 模型id
+     */
+    private Integer modelId;
+
+    /**
+     * 数字人名称
+     */
+    private String name;
+
+    /**
+     * 训练视频url,需公网可访问
+     */
+    private String videoUrl;
+
+    /**
+     * 训练状态回调地址
+训练状态回调地址
+     */
+    private String callbackUrl;
+
+    /**
+     * 定制套餐级别: 空或2.形象克隆-高阶版 358.形象克隆-S级-超清 359.形象克隆-E级 360.形象克隆-S级
+     */
+    private Integer level;
+
+    /**
+     * 是否是绿幕: 0.否 1.是
+     */
+    private Integer greenScreen;
+
+    /**
+     * ID
+     */
+    private Integer trainingId;
+
+    /**
+     * 标题
+     */
+    private String title;
+
+    /**
+     * 训练状态 0或空-准备中 1训练中 2训练成功 3训练失败 4审核不通过
+     */
+    private Integer status;
+
+    /**
+     * 回调状态 0或空-初始态 1-回调成功 2-回调失败
+
+     */
+    private Integer callbackStatus;
+
+    /**
+     * 备注
+     */
+    private String comment;
+
+    /**
+     * 训练完成模特ID
+     */
+    private Integer robotId;
+
+    /**
+     * 训练完成场景ID
+     */
+    private Integer sceneId;
+
+    /**
+     * 模特封面地址
+     */
+    private String coverUrl;
+
+    /**
+     * 训练创建时间
+     */
+    private String trainCreateTime;
+
+    /**
+     * 训练更新时间
+     */
+    private String trainUpdateTime;
+
+    /**
+     * 训练完成后的模特详情
+     */
+    private String robotJson;
+
+    /**
+     * 场景名称
+     */
+    private String sceneName;
+
+    /**
+     * 示例视频
+     */
+    private String exampleUrl;
+
+    /**
+     * 示例图片
+     */
+    private String samplePictureUrl;
+
+    /**
+     * 基础用户
+     */
+    private String baseUserId;
+
+    /**
+     * 原因
+     */
+    private String reason;
+
+
+}

+ 90 - 0
xyzc-start/src/main/java/com/xyzc/start/domain/NpMaterial.java

@@ -0,0 +1,90 @@
+package com.xyzc.start.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.xyzc.common.mybatis.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 数字人素材(背景)对象 xy_np_material
+ *
+ * @author wyz
+ * @date 2024-08-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("xy_np_material")
+public class NpMaterial extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 图片后缀
+     */
+    private String bgFormat;
+
+    /**
+     * 组id
+     */
+    private String groupId;
+
+    /**
+     *
+     */
+    private String proportion;
+    /**
+     * 图片Id
+     */
+    private Long imgId;
+
+    /**
+     * 硅基平台用户Id
+     */
+    private Long userId;
+
+    /**
+     * 背景编码
+     */
+    private String backgroundCode;
+
+    /**
+     * 背景名称
+     */
+    private String backgroundName;
+    /**
+     *
+     */
+    private Integer delFlag;
+
+    /**
+     * 背景图片的地址
+     */
+    private String coverUrl;
+
+    /**
+     * 1:小易平台上传;2:硅基平台提供
+     */
+    private String isMyself;
+
+    private Integer materialType;
+
+    private String zipCoverUrl;
+
+    private Integer materialId;
+    private Integer backgroundType;
+
+    private String url;
+    private String zipUrl;
+    private String thumbnailUrl;
+    private Integer ownerCorpId;
+    private String description;
+}

+ 68 - 0
xyzc-start/src/main/java/com/xyzc/start/domain/NpMusic.java

@@ -0,0 +1,68 @@
+package com.xyzc.start.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xyzc.common.mybatis.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 企业所有发音人列对象 xy_np_sound
+ *
+ * @author wyz
+ * @date 2024-08-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("xy_np_music")
+public class NpMusic extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 基础用户
+     */
+    private Long baseUserId;
+
+    /**
+     * 声音名称
+     */
+    private String musicName;
+
+    /**
+     * 声音介绍
+     */
+    private String musicPic;
+
+    /**
+     * 播放时长
+     */
+    private String musicPlayTime;
+
+    /**
+     * 音乐地址
+     */
+    private String musicUrl;
+
+    /**
+     * 	音乐类型
+     */
+    private String musicType;
+
+    /**
+     * 	音乐描述
+     */
+    private String musicDesc;
+
+
+
+}

+ 138 - 0
xyzc-start/src/main/java/com/xyzc/start/domain/NpSound.java

@@ -0,0 +1,138 @@
+package com.xyzc.start.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.xyzc.common.mybatis.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 企业所有发音人列对象 xy_np_sound
+ *
+ * @author wyz
+ * @date 2024-08-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("xy_np_sound")
+public class NpSound extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 模板id
+     */
+    private Integer modelId;
+
+//    /**
+//     * 模特名称
+//     */
+//    private String rebotName;
+
+//    /**
+//     * 模特描述
+//     */
+//    private String rebotDesc;
+
+//    /**
+//     * 模特地址
+//     */
+//    private String coverUrl;
+
+//    /**
+//     * 性别1男 2女
+//     */
+//    private String gender;
+
+//    /**
+//     * 年龄
+//     */
+//    private Integer age;
+
+//    /**
+//     * 星座
+//1:'白羊座', 2:'金牛座', 3:'双子座', 4:'巨蟹座', 5:'狮子座', 6:'处女座',
+//7:'天秤座', 8:'天蝎座', 9:'射手座', 10:'摩羯座', 11:'水瓶座', 12:'双鱼座'
+//     */
+//    private String starSigns;
+
+//    /**
+//     * 声音ID
+//     */
+//    private Long soundId;
+
+    /**
+     * 声音名称
+     */
+    private String ttsName;
+
+    /**
+     * 声音介绍
+     */
+    private String ttsIntroduction;
+
+    /**
+     * 使用场景
+     */
+    private String ttsScenes;
+
+    /**
+     * 发言者编号
+     */
+    private String ttsSpeaker;
+
+    /**
+     * 	特色
+     */
+    private String ttsFeatures;
+
+    /**
+     * 声音地址
+     */
+    private String ttsAudition;
+
+    /**
+     * 图片地址
+     */
+    private String ttsCover;
+
+    /**
+     * 来源
+     */
+    private String ttsSource;
+
+    /**
+     * 支持的语言类型列表 cn-中文 en-英文
+     */
+    private String languages;
+
+    /**
+     * 是否免费
+     */
+    private String free;
+
+    /**
+     * 性别:2:女;1:男
+     */
+    private String sex;
+
+    /**
+     * 发言特点
+     */
+    private String ttsExtendJson;
+
+    /**
+     *
+     */
+    private Integer phonemeFlag;
+
+
+}

+ 97 - 0
xyzc-start/src/main/java/com/xyzc/start/domain/NpTemplate.java

@@ -0,0 +1,97 @@
+package com.xyzc.start.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.xyzc.common.mybatis.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 数字人对象 xy_np_template
+ *
+ * @author wyz
+ * @date 2024-08-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("xy_np_template")
+public class NpTemplate extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 模型id
+     */
+    private Integer modelId;
+
+    /**
+     * 模型名称
+     */
+    private String robotName;
+
+    /**
+     * 模型描述
+     */
+    private String robotDesc;
+
+    /**
+     * 图片地址
+     */
+    private String coverUrl;
+
+    /**
+     * 性别1男 2女
+性别1男 2女
+性别1男 2女
+1:男,2:女
+     */
+    private Integer gender;
+
+    /**
+     * 年龄
+     */
+    private Integer age;
+
+    /**
+     * 星座
+1:'白羊座', 2:'金牛座', 3:'双子座', 4:'巨蟹座', 5:'狮子座', 6:'处女座',
+7:'天秤座', 8:'天蝎座', 9:'射手座', 10:'摩羯座', 11:'水瓶座', 12:'双鱼座'
+     */
+    private Integer starSigns;
+
+    /**
+     * 
+     */
+    private Integer face;
+
+    /**
+     * 发言人Id
+     */
+    private Integer speackerId;
+
+    /**
+     * 场景list,暂存json
+     */
+    private String sceneList;
+
+    /**
+     * 人气
+     */
+    private Integer popularity;
+
+    /**
+     * 默认适配的tts发言人
+     */
+    private String speakerId;
+
+
+
+}

+ 51 - 0
xyzc-start/src/main/java/com/xyzc/start/domain/NpText.java

@@ -0,0 +1,51 @@
+package com.xyzc.start.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.xyzc.common.mybatis.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 文字-贴图对象 xy_np_text
+ *
+ * @author wyz
+ * @date 2024-08-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("xy_np_text")
+public class NpText extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 文本
+     */
+    private String text;
+
+    /**
+     * 图片地址
+     */
+    private String imgUrl;
+
+    /**
+     * 1:文字;2:贴图
+     */
+    private Integer type;
+
+    /**
+     * 1:文字;2:贴图
+     */
+    private Long baseUserId;
+
+
+}

+ 175 - 0
xyzc-start/src/main/java/com/xyzc/start/domain/NpVideoConflate.java

@@ -0,0 +1,175 @@
+package com.xyzc.start.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.xyzc.common.mybatis.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 视频合成对象 xy_np_video_conflate
+ *
+ * @author wyz
+ * @date 2024-08-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("xy_np_video_conflate")
+public class NpVideoConflate extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 三方平台id
+     */
+    Integer modelId;
+    /**
+     * 音频地址,需公网可访问
+     */
+    private String audioUrl;
+
+    /**
+     * 合成的文本,文本支持以下标签:
+插入停顿(单位:秒):
+自定义读音:100000
+多音字标注:行
+     */
+    private String text;
+
+    /**
+     * 场景ID,从模特列表接口获取
+     */
+    private Integer sceneId;
+
+    /**
+     * 发音人id
+     */
+    private Integer speakerId;
+
+    /**
+     * 自定义背景,需公网可访问
+     */
+    private String backgroundUrl;
+
+    /**
+     * 合成作品名称
+     */
+    private String videoName;
+
+    /**
+     * 视频码率 可选值:1M、1.5M、3M、3.5M、5M、7M、8M、10M、12M、16M
+     */
+    private String bitRate;
+
+    /**
+     * 横向分辨率(默认’1080’)
+
+     */
+    private Integer width;
+
+    /**
+     * 纵向分辨率(默认’1920’)
+     */
+    private Integer height;
+
+    /**
+     * 是否启用mask ‘0’不起用 ’1’: 启用
+
+     */
+    private String mask;
+
+    /**
+     * fps 可选值:"15"、 "20"、 "25"、 "30"
+
+     */
+    private String fps;
+
+    /**
+     * 合成结果回调地址
+     */
+    private String callbackUrl;
+
+    /**
+     * 是否抠图,0-不抠图 1-抠图;如果选择抠图,请同时设置‘backgroundUrl’值
+     */
+    private String matting;
+
+    /**
+     * 色彩度, 如‘yuv444p’
+     */
+    private String pixFmt;
+
+    /**
+     * 合成结果视频格式 可选值:mp4、webm,默认为mp4
+     */
+    private String videoFormat;
+
+    /**
+     * 垂直分辨率
+     */
+    private Integer vertical;
+
+    /**
+     * 水平分辨率
+     */
+    private Integer horizontal;
+    /**
+     * 文字地址
+     */
+    public String strUrl;
+    /**
+     * 文件尺寸(单位MB,只精确到MB)
+     */
+    public Integer videoSize;
+    /**
+     * 时长(单位:秒,如11.32)
+     */
+    public String duration;
+    /**
+     * 时长(单位:秒,如11.32)
+     */
+    public String videoUrl;
+    /**
+     *
+     */
+    private Integer synthesisStatus;
+
+    /**
+     * 控制模特大小及位置(具体位置说明参考第四章位置说明, 注意:目前该功能只支持输出mp4格式视频)
+    x	string	N	控制模特水平方向位置(整数值)
+    y	string	N	控制模特垂直方向位置(整数值)
+    width	string	N	控制模特宽度(整数值)
+    height	string	N	控制模特高度(整数值)
+    indexLayer	Number	N	控制模特图层层级
+     */
+    private String styleJson;
+
+    /**
+     * nodes 在画面中添加素材(注意:目前该功能只支持输出mp4格式视频)  素材类型,'1'-视频素材 '2'-图片素材
+url 素材地址
+indexLayer 控制素材图层层级
+style 控制素材位置
+x 控制素材水平方向位置(整数值)
+y 控制素材垂直方向位置(整数值)
+width 控制素材宽度(整数值)
+height 	控制素材高度(整数值)
+rotation 	旋转角度(整数值,顺时针计算)
+     */
+    private String nodes;
+
+    /**
+     * 1:文本合成;2:语音合成
+     */
+    private Integer type;
+
+
+    private String reason;
+}

+ 39 - 0
xyzc-start/src/main/java/com/xyzc/start/domain/NpVideoDraft.java

@@ -0,0 +1,39 @@
+package com.xyzc.start.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xyzc.common.mybatis.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("xy_np_video_draft")
+public class NpVideoDraft extends BaseEntity {
+
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 用户草稿的模板
+     */
+    private String nodesJson;
+
+    private Long baseUserId;
+
+    // 操作的批次
+    private Integer batch;
+
+    // 0:基础模板,1:用户草稿模板;2:用户已生成草稿
+    private Integer type;
+
+}

+ 84 - 0
xyzc-start/src/main/java/com/xyzc/start/domain/vo/NpTemplateVo.java

@@ -0,0 +1,84 @@
+package com.xyzc.start.domain.vo;
+
+import com.xyzc.start.domain.NpTemplate;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * 数字人视图对象 xy_np_template
+ *
+ * @author wyz
+ * @date 2024-08-14
+ */
+@Data
+@AutoMapper(target = NpTemplate.class)
+public class NpTemplateVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    private Long id;
+
+    /**
+     * 模型id
+     */
+    private Integer modelId;
+
+    /**
+     * 模型名称
+     */
+    private String robotName;
+
+    /**
+     * 模型描述
+     */
+    private String robotDesc;
+
+    /**
+     * 图片地址
+     */
+    private String coverUrl;
+
+    /**
+     * 性别1男 2女
+性别1男 2女
+性别1男 2女
+1:男,2:女
+     */
+    private Integer gender;
+
+    /**
+     * 年龄
+     */
+    private Integer age;
+
+    /**
+     * 星座
+1:'白羊座', 2:'金牛座', 3:'双子座', 4:'巨蟹座', 5:'狮子座', 6:'处女座',
+7:'天秤座', 8:'天蝎座', 9:'射手座', 10:'摩羯座', 11:'水瓶座', 12:'双鱼座'
+     */
+    private Integer starSigns;
+
+    /**
+     * 
+     */
+    private Integer face;
+
+    /**
+     * 发言人Id
+     */
+    private Integer speackerId;
+
+    /**
+     * 场景list,暂存json
+     */
+    private String sceneList;
+
+}

+ 10 - 0
xyzc-start/src/main/java/com/xyzc/start/mapper/NpCommitTrainMapper.java

@@ -0,0 +1,10 @@
+package com.xyzc.start.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xyzc.start.domain.NpCommitTrain;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface NpCommitTrainMapper extends BaseMapper<NpCommitTrain> {
+}

+ 10 - 0
xyzc-start/src/main/java/com/xyzc/start/mapper/NpMaterialMapper.java

@@ -0,0 +1,10 @@
+package com.xyzc.start.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xyzc.start.domain.NpMaterial;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface NpMaterialMapper extends BaseMapper<NpMaterial> {
+}

+ 15 - 0
xyzc-start/src/main/java/com/xyzc/start/mapper/NpMusicMapper.java

@@ -0,0 +1,15 @@
+package com.xyzc.start.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xyzc.start.domain.NpMaterial;
+import com.xyzc.start.domain.NpMusic;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface NpMusicMapper extends BaseMapper<NpMusic> {
+
+    List<NpMusic> queryMusic(NpMusic npMusic);
+}

+ 15 - 0
xyzc-start/src/main/java/com/xyzc/start/mapper/NpTextMapper.java

@@ -0,0 +1,15 @@
+package com.xyzc.start.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xyzc.start.domain.NpMusic;
+import com.xyzc.start.domain.NpText;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface NpTextMapper extends BaseMapper<NpText> {
+
+    List<NpText> queryText(NpText npText);
+}

+ 10 - 0
xyzc-start/src/main/java/com/xyzc/start/mapper/NpVideoConflateMapper.java

@@ -0,0 +1,10 @@
+package com.xyzc.start.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xyzc.start.domain.NpText;
+import com.xyzc.start.domain.NpVideoConflate;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface NpVideoConflateMapper  extends BaseMapper<NpVideoConflate> {
+}

+ 13 - 0
xyzc-start/src/main/java/com/xyzc/start/mapper/NpVideoDraftMapper.java

@@ -0,0 +1,13 @@
+package com.xyzc.start.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xyzc.start.domain.NpVideoDraft;
+import org.springframework.stereotype.Repository;
+
+
+@Repository
+public interface NpVideoDraftMapper extends BaseMapper<NpVideoDraft> {
+
+//    List<NpVideoDraft> queryText(NpText npText);
+}

+ 24 - 0
xyzc-start/src/main/java/com/xyzc/start/mapper/NumPersonMapper.java

@@ -0,0 +1,24 @@
+package com.xyzc.start.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xyzc.start.domain.NpSound;
+import com.xyzc.start.domain.NpTemplate;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface NumPersonMapper extends BaseMapper<NpSound> {
+
+        /**
+         * 查询公司声音
+         * @return
+         */
+        List<NpSound> queryCompanySound();
+
+        /**
+         * 查询公共模特
+         * @return
+         */
+        List<NpTemplate> queryCommonTemplate();
+}

+ 26 - 0
xyzc-start/src/main/java/com/xyzc/start/service/INpCommitService.java

@@ -0,0 +1,26 @@
+package com.xyzc.start.service;
+
+import com.xyzc.start.domain.NpCommitTrain;
+import com.xyzc.start.domain.NpMusic;
+import com.xyzc.start.domain.NpText;
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.security.NoSuchAlgorithmException;
+
+public interface INpCommitService {
+
+    String getToken() throws NoSuchAlgorithmException;
+
+    /**
+     * 提交训练视频
+     */
+    public void commitTrainVideo(NpCommitTrain npCommitTrain);
+
+    void uploadMaterial(MultipartFile file, String rootId);
+    public void queryMaterial(String rootId, String page, String size);
+
+    void uploadMusic(NpMusic npMusic);
+
+    void uploadText(NpText npText);
+}

+ 8 - 0
xyzc-start/src/main/java/com/xyzc/start/service/INpNotifyService.java

@@ -0,0 +1,8 @@
+package com.xyzc.start.service;
+
+public interface INpNotifyService {
+
+    public void commitTrainVedioNotify(String notify);
+
+    public void composeVedioNotify(String notify);
+}

+ 25 - 0
xyzc-start/src/main/java/com/xyzc/start/service/INpQueryService.java

@@ -0,0 +1,25 @@
+package com.xyzc.start.service;
+
+import com.xyzc.start.domain.NpCommitTrain;
+import com.xyzc.start.domain.NpMusic;
+import com.xyzc.start.domain.NpText;
+
+import java.util.List;
+
+public interface INpQueryService {
+
+
+    /**
+     * 提交训练视频
+     */
+    public NpCommitTrain queryTrainVideo(String trainId);
+
+    /**
+     * 查询音乐
+     * @param npMusic
+     */
+    List<NpMusic> queryMusic(NpMusic npMusic);
+
+
+    List<NpText> queryNpText(NpText npText);
+}

+ 53 - 0
xyzc-start/src/main/java/com/xyzc/start/service/INumPersonService.java

@@ -0,0 +1,53 @@
+package com.xyzc.start.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.xyzc.start.domain.NpCommitTrain;
+import com.xyzc.start.domain.NpSound;
+import com.xyzc.start.domain.NpTemplate;
+import com.xyzc.start.domain.NpVideoDraft;
+import lombok.extern.slf4j.Slf4j;
+
+import java.security.NoSuchAlgorithmException;
+import java.util.List;
+
+import static com.xyzc.start.utils.EncryptUtil.getMD5Byparam;
+public interface INumPersonService {
+
+    void freeModelListQuery();
+
+    /**
+     * 查询公司声音
+     * @return
+     */
+    List<NpSound> queryCompanySound();
+
+    /**
+     * 查询共同模板
+     * @return
+     */
+    List<NpTemplate> queryCommonTemplate();
+
+    /**
+     * 查询用户下的数字人模板
+     * @return
+     */
+    List<NpCommitTrain> queryTrainingModel();
+
+    /**
+     * 数字人训练的异步通知
+     * @param notify
+     * @return
+     */
+    String numberPersonCommitNotify(String notify);
+
+    /**
+     * 获取训练id
+     * @param trainingId
+     * @return
+     */
+    String getTrainingInfo(String trainingId);
+
+    List<NpVideoDraft> getTemplateDraft(String templateId);
+
+    void saveTemplateDraft(NpVideoDraft npVideoDraft);
+}

+ 501 - 0
xyzc-start/src/main/java/com/xyzc/start/service/impl/NpCommitServiceImpl.java

@@ -0,0 +1,501 @@
+package com.xyzc.start.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.xyzc.common.core.exception.ErrorCode;
+import com.xyzc.common.core.exception.ServerException;
+import com.xyzc.common.web.security.user.SecurityUser;
+import com.xyzc.start.domain.NpCommitTrain;
+import com.xyzc.start.domain.NpMaterial;
+import com.xyzc.start.domain.NpMusic;
+import com.xyzc.start.domain.NpText;
+import com.xyzc.start.mapper.NpCommitTrainMapper;
+import com.xyzc.start.mapper.NpMaterialMapper;
+import com.xyzc.start.mapper.NpMusicMapper;
+import com.xyzc.start.mapper.NpTextMapper;
+import com.xyzc.start.service.INpCommitService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.logging.log4j.util.Strings;
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static com.xyzc.start.utils.EncryptUtil.getMD5Byparam;
+
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class NpCommitServiceImpl implements INpCommitService {
+    // 基本URL请求
+    String baseUrl = "https://meta.guiji.ai";
+
+    String appKey = "IyeVRCSyBokinWIcrTjXVeOq";
+    String appSecret = "PFp3PZeEJIIRTtHqyG6Hhp1pyiS0ETjsb30XZVVhwR2n4WYQF4aI9A7EzUCrPsML";
+
+    String callBackHost = "https://62e6ffcb.r11.cpolar.top";
+
+    RestTemplate restTemplate = new RestTemplate();
+
+    private final NpCommitTrainMapper npCommitTrainMapper;
+
+    private final NpMaterialMapper npMaterialMapper;
+
+    private final NpMusicMapper npMusicMapper;
+
+    private final NpTextMapper npTextMapper;
+    /**
+     * 获取token
+     * @throws NoSuchAlgorithmException
+     */
+    @Override
+    public String getToken() throws NoSuchAlgorithmException {
+        long timeStamp = System.currentTimeMillis();
+        String encrypted = getMD5Byparam(appKey + timeStamp + appSecret);
+
+        log.info("加密后的结果:" + encrypted);
+
+        String url = "https://meta.guiji.ai/openapi/oauth/token?grant_type=sign&timestamp=" + timeStamp + "&sign=" + encrypted + "&appId=" + appKey;
+
+        String forObject = restTemplate.getForObject(url, String.class);
+        log.info("获取到的token:" + forObject);
+        JSONObject jsonObject = JSONObject.parseObject(forObject);
+        String code = jsonObject.getString("code");
+        String accessToken = "";
+        if ("0".equals(code)) {
+            JSONObject dataJSON = jsonObject.getJSONObject("data");
+            accessToken = dataJSON.getString("access_token");
+            String expiresIn = dataJSON.getString("expires_in");
+            String scope = dataJSON.getString("scope");
+            JSONObject userInfoJSON = dataJSON.getJSONObject("userInfo");
+            Integer corpId = userInfoJSON.getInteger("corpId");
+            Integer id = userInfoJSON.getInteger("id");
+            Integer userId = userInfoJSON.getInteger("userId");
+            // 获取到的token:{"code":"0","data":{"access_token":"796916ae-6fb1-4d51-8e80-6543081366c5","userInfo":{"corpId":1251421,"id":93,"userId":355352},"scope":"all","expires_in":7182},"success":true}
+            // 获取到的token:{"code":"0","data":{"access_token":"7ac45bf8-c3bb-4d19-a187-c1ecbf9b3ed0","userInfo":{"corpId":1251421,"id":93,"userId":355352},"scope":"all","expires_in":7199},"success":true}
+        }else{
+//            errorCode(code);
+        }
+        return accessToken;
+    }
+
+
+
+    /**
+     * 提交训练视频
+     */
+    @Override
+    public void commitTrainVideo(NpCommitTrain npCommitTrain) {
+        // 判断 视频是否上传
+        if (Strings.isBlank(npCommitTrain.getVideoUrl())) {
+            log.error(ErrorCode.NUMERSON_NO_VIDEO.toString());
+            throw new ServerException(ErrorCode.NUMERSON_NO_VIDEO);
+        }
+        // 判断 名称是否定义
+        if (Strings.isBlank(npCommitTrain.getName())) {
+            log.error(ErrorCode.NUMERSON_NO_VIDEO_NAME.toString());
+            throw new ServerException(ErrorCode.NUMERSON_NO_VIDEO_NAME);
+        }
+        // 判断 是否绿幕是否定义
+        if (null == npCommitTrain.getGreenScreen()) {
+            log.error(ErrorCode.NUMERSON_NO_GREEN.toString());
+            throw new ServerException(ErrorCode.NUMERSON_NO_GREEN);
+        }
+
+        String accessToken = "";
+        try {
+            accessToken = getToken();
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException(e);
+        }
+
+        String url = baseUrl + "/openapi/video/v2/create/training?access_token=" + accessToken;
+        MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
+
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("Content-Type","application/json;charset=UTF-8");
+
+        JSONObject jsonParam = new JSONObject();
+
+//        jsonParam.put("id", ""); // 训练任务ID,id为空表示提交新训练,id不为空表示更新训练
+        jsonParam.put("name", npCommitTrain.getName()); // 数字人名称
+        jsonParam.put("level", "359"); // 定制套餐级别: 空或2.形象克隆-高阶版 358.形象克隆-S级-超清 359.形象克隆-E级 360.形象克隆-S级
+        jsonParam.put("videoUrl", npCommitTrain.getVideoUrl()); // 训练视频url,需公网可访问
+//        jsonParam.put("callbackUrl", "http://121.15.198.153:18068/numberPerson/NumberPersonCommitNotify"); // 训练状态回调地址
+        jsonParam.put("callbackUrl", callBackHost + "/numPerson/commitTrainVedioNotify"); // 训练状态回调地址
+        jsonParam.put("greenScreen", npCommitTrain.getGreenScreen()); // 是否是绿幕: 0.否 1.是
+
+        HttpEntity<JSONObject> param = new HttpEntity(jsonParam, headers);
+        log.info("url:"+url);
+        log.info("请求参数:"+jsonParam);
+        String returnData = restTemplate.postForObject(url, param, String.class);
+        JSONObject jsonObject = JSONObject.parseObject(returnData);
+        log.info("返回参数:" + jsonObject);
+        if ("0".equals(jsonObject.getString("code"))) {
+            Integer trainingId = jsonObject.getJSONObject("data").getInteger("trainingId");
+            npCommitTrain.setTrainingId(trainingId);
+            npCommitTrainMapper.insert(npCommitTrain);
+        }
+    }
+
+
+    /**
+     * 3.21 素材上传接口
+     */
+    @Override
+    public void uploadMaterial(MultipartFile file, String rootId) {
+        if (null == file) {
+            log.error("请上传文件");
+            throw new ServerException(ErrorCode.NUMERSON_NO_FILE);
+        }
+        if (Strings.isBlank(rootId)) {
+            log.error("请指定类型");
+            throw new ServerException(ErrorCode.NUMERSON_NO_TYPE);
+        }
+        String accessToken = "";
+        try {
+            accessToken = getToken();
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException(e);
+        }
+        String url = baseUrl + "/openapi/material/upload?access_token=" + accessToken;
+//        new FileSystemResource(file);
+        File imageFile = new File("D:\\wyz_ComfyUI_00003_.png");
+//
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
+
+        HttpEntity<FileSystemResource> requestEntity = new HttpEntity<>(new FileSystemResource(imageFile), headers);
+
+        ResponseEntity<JSONObject> stringResponseEntity = restTemplate.postForEntity(url, requestEntity, JSONObject.class);
+
+
+        /*MultiValueMap<String, Object> form = new LinkedMultiValueMap<>();
+        form.add("file", file);
+        form.add("rootId", rootId);
+
+        HttpHeaders headers = new HttpHeaders();
+        MediaType type = MediaType.parseMediaType("multipart/form-data");
+        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
+        log.info("推送参数:"+form);
+        HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(form, headers);*/
+
+//        JSONObject returnData = restTemplate.postForObject(url, files, JSONObject.class);
+
+        Long userId = SecurityUser.getUserId();
+        NpMaterial npMaterial = new NpMaterial();
+        npMaterial.setUserId(userId);
+        npMaterial.setMaterialType(Integer.parseInt(rootId));
+
+        npMaterialMapper.insert(npMaterial);
+        System.out.println("returnData:+" + stringResponseEntity);
+    }
+
+    @Override
+    public void queryMaterial(String rootId, String page, String size) {
+        if (null == rootId) {
+            log.error("请输入素材类型");
+            throw new ServerException(ErrorCode.NUMERSON_NO_TYPE);
+        }
+        if (Strings.isBlank(page)) {
+            page = "1";
+        }
+        if (Strings.isBlank(size)) {
+            size = "10";
+        }
+        String accessToken = "";
+        try {
+            accessToken = getToken();
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException(e);
+        }
+        String url = baseUrl + "/openapi/material/search?access_token=" + accessToken;
+
+        JSONObject jsonParam = new JSONObject();
+        jsonParam.put("rootId", rootId); // 素材类型 ,0:背景(图片或者视频),1:图片素材,4:视频素材
+        jsonParam.put("page", "1");
+        jsonParam.put("size", "100");
+        jsonParam.put("asc", "true");
+//        jsonParam.put("myself", "true"); // 是否是自己上传的
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("Content-Type","application/json;charset=UTF-8");
+        //构造实体对象
+        HttpEntity<JSONObject> param = new HttpEntity<>(jsonParam, headers);
+
+        JSONObject returnDataJSON = restTemplate.postForObject(url, param, JSONObject.class);
+        System.out.println(returnDataJSON);
+        if ("0".equals(returnDataJSON.getString("code"))) {
+            LinkedHashMap data = (LinkedHashMap) returnDataJSON.get("data");
+            ArrayList records = (ArrayList)data.get("records");
+            List<NpMaterial> materialList = npMaterialMapper.selectList(new QueryWrapper<NpMaterial>().eq("material_type", rootId).select("material_id"));
+            ArrayList<Integer> materialIdList = materialList.stream().map(m -> m.getMaterialId()).collect(Collectors.toCollection(ArrayList::new));
+            for (int i = 0; i < records.size(); i++) {
+                LinkedHashMap record = (LinkedHashMap) records.get(i);
+                if(!materialIdList.contains(record.get("id"))){
+                    NpMaterial npMaterial = new NpMaterial();
+                    if("1".equals(rootId)) {
+                        npMaterial.setMaterialId(Integer.parseInt(record.get("id").toString()));
+                        npMaterial.setMaterialType(Integer.parseInt(rootId));
+                        npMaterial.setDescription(record.get("description").toString());
+                        npMaterial.setBackgroundName(record.get("name").toString());
+                        npMaterial.setUrl(record.get("url").toString());
+                        npMaterial.setThumbnailUrl(record.get("thumbnailUrl").toString());
+                        npMaterial.setOwnerCorpId(Integer.parseInt(record.get("ownerCorpId").toString()));
+                    } else if ("0".equals(rootId)) {
+
+                    }else if("4".equals(rootId)){
+
+                    }
+                    npMaterialMapper.insert(npMaterial);
+                }
+            }
+        }
+    }
+
+    @Override
+    public void uploadMusic(NpMusic npMusic) {
+        if (Strings.isBlank(npMusic.getMusicUrl())) {
+            log.error("请输入地址");
+            throw new ServerException(ErrorCode.NUMERSON_NO_URL);
+        }
+        if (Strings.isBlank(npMusic.getMusicUrl())) {
+            log.error("请输入名称");
+            throw new ServerException(ErrorCode.NUMERSON_NO_NAME);
+        }
+
+        npMusic.setBaseUserId(SecurityUser.getUserId());
+        npMusicMapper.insert(npMusic);
+
+    }
+
+    @Override
+    public void uploadText(NpText npText) {
+        if (Strings.isBlank(npText.getText())) {
+            log.error("请输入文本");
+            throw new ServerException(ErrorCode.NUMERSON_NO_TEXT);
+        }
+        if (Strings.isBlank(npText.getImgUrl())) {
+            log.error("请输入地址");
+            throw new ServerException(ErrorCode.NUMERSON_NO_URL);
+        }
+        if (Strings.isBlank(npText.getImgUrl())) {
+            log.error("请输入地址");
+            throw new ServerException(ErrorCode.NUMERSON_NO_TYPE);
+        }
+
+        npText.setBaseUserId(SecurityUser.getUserId());
+        npTextMapper.insert(npText);
+    }
+
+    /**
+     * 3.6 创建视频合成任务-音频合成
+     */
+    public void createVideoTask(){
+
+        String accessToken = "";
+        try {
+            accessToken = getToken();
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException(e);
+        }
+
+        String url = baseUrl + "/openapi/video/v2/create?access_token=" + accessToken;
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("Content-Type","application/json;charset=UTF-8");
+
+        JSONObject jsonParam = new JSONObject();
+        jsonParam.put("audioUrl", "https://tts.guiji.ai/source/voiceclone/501556zhaozong_sound.wav"); // 音频地址,需公网可访问
+        jsonParam.put("sceneId", "195849044"); // 场景ID,从模特列表接口获取
+        jsonParam.put("backgroundUrl", "https://cdn.guiji.ai/video-server/jpg/1823694251370942465.jpg"); // 自定义背景,需公网可访问
+        jsonParam.put("videoName", "xulonglin");      // 合成作品名称
+        jsonParam.put("bitRate", "16M");        // 视频码率 可选值:1M、1.5M、3M、3.5M、5M、7M、8M、10M、12M、16M
+//        jsonParam.put("width", "100");          // 横向分辨率(默认’1080’)
+//        jsonParam.put("height", "100");         // 纵向分辨率(默认’1920’)
+//        jsonParam.put("mask", "1");
+        jsonParam.put("fps", "30");                 // fps 可选值:"15"、 "20"、 "25"、 "30"
+        jsonParam.put("callbackUrl", "http://121.15.198.153:8068/common/api/NumberPersonCommitNotify");
+//        jsonParam.put("matting", "1");
+//        jsonParam.put("pixFmt", "yuv444p");
+//        jsonParam.put("videoFormat", "100");
+        JSONObject style = new JSONObject();
+        style.put("x", "1");
+        style.put("y", "1");
+        style.put("width", "500");
+        style.put("height", "500");
+        style.put("indexLayer", "100");
+        jsonParam.put("style", style);
+
+
+        JSONArray nodes = new JSONArray();
+
+        JSONObject nodeStyleJSON = new JSONObject();
+        nodeStyleJSON.put("type", "2");
+        nodeStyleJSON.put("url", "https://cdn.guiji.ai/video-server/jpg/1816079643308826626.jpg");
+        nodeStyleJSON.put("indexLayer", "50");
+        nodeStyleJSON.put("rotation", "50");
+        JSONObject json3 = new JSONObject();
+        json3.put("x", "3");
+        json3.put("y", "3");
+        json3.put("width", "300");
+        json3.put("height", "400");
+        nodeStyleJSON.put("style", json3);
+        nodes.add(nodeStyleJSON);
+
+        JSONObject nodeJSON2 = new JSONObject();
+        nodeJSON2.put("type", "1");
+        nodeJSON2.put("url", "http://47.121.123.230:9000/xy-dev/comfyui/video/zhanghongrun.mp4");
+        nodeJSON2.put("rotation", "101");
+        JSONObject json4 = new JSONObject();
+        json4.put("x", "4");
+        json4.put("y", "4");
+        json4.put("width", "50");
+        json4.put("height", "50");
+        nodeJSON2.put("style", json4);
+        nodes.add(nodeJSON2);
+        jsonParam.put("nodes", nodes);
+
+        //构造实体对象
+        HttpEntity<JSONObject> param = new HttpEntity<>(jsonParam, headers);
+        log.info("发送参数jsonParam:" + jsonParam);
+        JSONObject returnDataJSON = restTemplate.postForObject(url, param, JSONObject.class);
+
+        log.info("3.6 创建视频合成任务-音频合成"+returnDataJSON.toJSONString());
+        if ("0".equals(returnDataJSON.getString("code"))) {
+            JSONObject dataJSON = returnDataJSON.getJSONObject("data");
+            System.out.println(dataJSON);
+            ArrayList records = dataJSON.getObject("records", ArrayList.class);
+            for (int i = 0; i < records.size(); i++) {
+                LinkedHashMap map = (LinkedHashMap)records.get(i);
+                Object id = map.get("id");
+                Object robotName = map.get("robotName");
+                Object robotDesc = map.get("robotDesc");
+                Object coverUrl = map.get("coverUrl");
+
+            }
+        }
+    }
+    /**
+     * 3.7 创建合成视频任务-文本合成
+     */
+    public void createVideoTaskText(){
+        String accessToken = "";
+        try {
+            accessToken = getToken();
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException(e);
+        }
+        String url = baseUrl + "/openapi/video/v2/create/tss?access_token=" + accessToken;
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("Content-Type","application/json;charset=UTF-8");
+
+        JSONObject jsonParam = new JSONObject();
+        jsonParam.put("text", "你好,我是小智"); // 合成文本
+        jsonParam.put("speakerId", "942"); // 合成文本
+        jsonParam.put("backgroundUrl", "https://cdn.guiji.ai/video-server/jpg/1823694251370942465.jpg"); // 自定义背景,需公网可访问
+        jsonParam.put("videoName", "me_is_xiaozhi"); // 合成文本
+//        jsonParam.put("audioUrl", "https://tts.guiji.ai/source/voiceclone/501556zhaozong_sound.wav"); // 音频地址,需公网可访问
+        jsonParam.put("sceneId", "195849044"); // 场景ID,从模特列表接口获取
+        jsonParam.put("bitRate", "16M");        // 视频码率 可选值:1M、1.5M、3M、3.5M、5M、7M、8M、10M、12M、16M
+//        jsonParam.put("width", "100");          // 横向分辨率(默认’1080’)
+//        jsonParam.put("height", "100");         // 纵向分辨率(默认’1920’)
+//        jsonParam.put("mask", "1");
+        jsonParam.put("fps", "30");                 // fps 可选值:"15"、 "20"、 "25"、 "30"
+        jsonParam.put("callbackUrl", "http://121.15.198.153:8068/common/api/NumberPersonCommitNotify");
+        jsonParam.put("speechRate", "1");
+        jsonParam.put("volume", "1");
+        jsonParam.put("srtFlag", "1");
+        jsonParam.put("matting", "1");
+//        jsonParam.put("pixFmt", "yuv444p");
+//        jsonParam.put("videoFormat", "100");
+
+//        style	 控制模特大小及位置(具体位置说明参考第四章位置说明, 注意:目前该功能只支持输出mp4格式视频)
+        JSONObject style = new JSONObject();
+        style.put("x", "1");
+        style.put("y", "1");
+        style.put("width", "500");
+        style.put("height", "500");
+        style.put("indexLayer", "100");
+        jsonParam.put("style", style);
+
+//        nodes	array 在画面中添加素材(注意:目前该功能只支持输出mp4格式视频)
+        JSONArray nodes = new JSONArray();
+
+        JSONObject nodeStyleJSON = new JSONObject();
+        nodeStyleJSON.put("type", "2");
+        nodeStyleJSON.put("url", "https://cdn.guiji.ai/video-server/jpg/1816079643308826626.jpg");
+        nodeStyleJSON.put("indexLayer", "50");
+        nodeStyleJSON.put("rotation", "50");
+        JSONObject json3 = new JSONObject();
+        json3.put("x", "3");
+        json3.put("y", "3");
+        json3.put("width", "300");
+        json3.put("height", "400");
+        nodeStyleJSON.put("style", json3);
+        nodes.add(nodeStyleJSON);
+
+        JSONObject nodeJSON2 = new JSONObject();
+        nodeJSON2.put("type", "1");
+        nodeJSON2.put("url", "http://47.121.123.230:9000/xy-dev/comfyui/video/zhanghongrun.mp4");
+        nodeJSON2.put("rotation", "101");
+        JSONObject json4 = new JSONObject();
+        json4.put("x", "4");
+        json4.put("y", "4");
+        json4.put("width", "50");
+        json4.put("height", "50");
+        nodeJSON2.put("style", json4);
+        nodes.add(nodeJSON2);
+
+        jsonParam.put("nodes", nodes);
+
+        // srtStyle	 字幕样式(srtFlag=1生效)
+        JSONObject srtStyle = new JSONObject();
+        srtStyle.put("x", "300");
+        srtStyle.put("y", "300");
+        srtStyle.put("fontSize", "100");
+        srtStyle.put("color", "#000000");
+        srtStyle.put("width", "10");
+        srtStyle.put("height", "10");
+
+        jsonParam.put("srtStyle", srtStyle);
+
+        log.info("创建合成视频任务-文本合成 推送参数jsonParam:" + jsonParam);
+        //构造实体对象
+        HttpEntity<JSONObject> param = new HttpEntity<>(jsonParam, headers);
+
+        JSONObject returnDataJSON = restTemplate.postForObject(url, param, JSONObject.class);
+        log.info("3.7 创建合成视频任务-文本合成:"+returnDataJSON.toJSONString());
+        if ("0".equals(returnDataJSON.getString("code"))) {
+            JSONObject dataJSON = returnDataJSON.getJSONObject("data");
+            System.out.println(dataJSON);
+            ArrayList records = dataJSON.getObject("records", ArrayList.class);
+            for (int i = 0; i < records.size(); i++) {
+                LinkedHashMap map = (LinkedHashMap)records.get(i);
+                Object id = map.get("id");
+                Object robotName = map.get("robotName");
+                Object robotDesc = map.get("robotDesc");
+                Object coverUrl = map.get("coverUrl");
+
+            }
+        }
+
+    }
+}

+ 101 - 0
xyzc-start/src/main/java/com/xyzc/start/service/impl/NpNotifySeriviceImpl.java

@@ -0,0 +1,101 @@
+package com.xyzc.start.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.google.gson.Gson;
+import com.xyzc.start.domain.NpCommitTrain;
+import com.xyzc.start.domain.NpVideoConflate;
+import com.xyzc.start.mapper.NpCommitTrainMapper;
+import com.xyzc.start.mapper.NpVideoConflateMapper;
+import com.xyzc.start.service.INpNotifyService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class NpNotifySeriviceImpl implements INpNotifyService {
+
+    private final NpCommitTrainMapper npCommitTrainMapper;
+
+    private final NpVideoConflateMapper npVideoConflateMapper;
+
+    @Override
+    public void commitTrainVedioNotify(String notify) {
+        JSONObject notifyJson = JSONObject.parseObject(notify);
+        if ("video-training".equals(notifyJson.getString("taskType"))) {
+            JSONObject jsonObject = notifyJson.getJSONObject("data");
+            String result = jsonObject.getString("result");
+            Long createTime = jsonObject.getLong("createTime");
+            Long updateTime = jsonObject.getLong("updateTime");
+            String id = jsonObject.getString("id");
+            String title = jsonObject.getString("title");
+            if("fail".equals(result)) {
+                String reason = jsonObject.getString("reason");
+            }
+            if("success".equals(result)) {
+                String coverUrl = jsonObject.getString("coverUrl");
+                Integer sceneId = jsonObject.getInteger("sceneId");
+                Integer robotId = jsonObject.getInteger("robotId");
+                NpCommitTrain npCommitTrain = npCommitTrainMapper.selectById(id);
+                if(npCommitTrain == null) {
+                    npCommitTrain = new NpCommitTrain();
+                    npCommitTrain.setId(Long.valueOf(id));
+//                    npCommitTrain.setCreateTime(createTime);
+//                    npCommitTrain.setUpdateTime(updateTime);
+                    npCommitTrain.setTitle(title);
+                    npCommitTrain.setCoverUrl(coverUrl);
+                    npCommitTrain.setRobotId(robotId);
+                    npCommitTrain.setSceneId(sceneId);
+                    npCommitTrainMapper.insert(npCommitTrain);
+                } else {
+//                    npCommitTrain.setUpdateTime(updateTime);
+                    npCommitTrain.setTitle(title);
+                    npCommitTrain.setCoverUrl(coverUrl);
+                    npCommitTrain.setRobotId(robotId);
+                }
+                npCommitTrainMapper.insertOrUpdate(npCommitTrain);
+            }
+        }
+    }
+
+    @Override
+    public void composeVedioNotify(String notify) {
+        JSONObject jsonObject = JSONObject.parseObject(notify);
+        String taskType = jsonObject.getString("taskType");
+        if ("video-synthesis".equals(taskType)) {
+            JSONObject dataJSON = jsonObject.getJSONObject("data");
+            Integer synthesisStatus = dataJSON.getInteger("synthesisStatus");
+            String result = dataJSON.getString("result");
+            String id = dataJSON.getString("id");
+            NpVideoConflate videoConflate = npVideoConflateMapper.selectOne(new QueryWrapper<NpVideoConflate>().eq("model_id", id));
+            if(null==videoConflate)
+                videoConflate = new NpVideoConflate();
+            String videoName = dataJSON.getString("videoName");
+            String videoFormat = dataJSON.getString("videoFormat");
+            videoConflate.setReason(result);
+            if(3 == synthesisStatus) {
+                String strUrl = dataJSON.getString("strUrl");
+                Integer vertical = dataJSON.getInteger("vertical");
+                String updateTime = dataJSON.getString("updateTime");
+                Integer videoSize = dataJSON.getInteger("videoSize");
+                String duration = dataJSON.getString("duration");
+                Integer horizontal = dataJSON.getInteger("horizontal");
+                String videoUrl = dataJSON.getString("videoUrl");
+                Long createTime = dataJSON.getLong("createTime");
+
+                videoConflate.setVideoFormat(videoFormat);
+                videoConflate.setVertical(vertical);
+                videoConflate.setHorizontal(horizontal);
+                videoConflate.setStrUrl(strUrl);
+                videoConflate.setVideoSize(videoSize);
+                videoConflate.setDuration(duration);
+                videoConflate.setVideoUrl(videoUrl);
+                videoConflate.setVideoName(videoName);
+                videoConflate.setSynthesisStatus(synthesisStatus);
+            }
+            npVideoConflateMapper.insertOrUpdate(videoConflate);
+        }
+    }
+}

+ 353 - 0
xyzc-start/src/main/java/com/xyzc/start/service/impl/NpQueryServiceImpl.java

@@ -0,0 +1,353 @@
+package com.xyzc.start.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.xyzc.common.core.exception.ErrorCode;
+import com.xyzc.common.core.exception.ServerException;
+import com.xyzc.start.domain.NpCommitTrain;
+import com.xyzc.start.domain.NpMusic;
+import com.xyzc.start.domain.NpText;
+import com.xyzc.start.mapper.NpCommitTrainMapper;
+import com.xyzc.start.mapper.NpMusicMapper;
+import com.xyzc.start.mapper.NpTextMapper;
+import com.xyzc.start.service.INpCommitService;
+import com.xyzc.start.service.INpQueryService;
+import jakarta.annotation.Resource;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class NpQueryServiceImpl implements INpQueryService {
+
+    // 基本URL请求
+    String baseUrl = "https://meta.guiji.ai";
+
+
+//    String appKey = "IyeVRCSyBokinWIcrTjXVeOq";
+//    String appSecret = "PFp3PZeEJIIRTtHqyG6Hhp1pyiS0ETjsb30XZVVhwR2n4WYQF4aI9A7EzUCrPsML";
+
+    private final INpCommitService npCommitService;
+
+    private final NpCommitTrainMapper npCommitTrainMapper;
+
+    private final NpMusicMapper npMusicMapper;
+
+    private final NpTextMapper npTextMapper;
+
+    /**
+     * 3.2 定制模特列表查询
+     */
+    public void getCustomModelList(){
+        String accessToken = "";
+        try {
+            accessToken = npCommitService.getToken();
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException(e);
+        }
+        // /openapi/robot/v2/pageList?access_token=55d1bc37-f960-4a9d-8c7d-5dc8c991c245
+        String url = baseUrl + "/openapi/robot/v2/pageList?access_token=" + accessToken;
+
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("Content-Type","application/json;charset=UTF-8");
+
+        JSONObject jsonParam = new JSONObject();
+        jsonParam.put("page", "1");
+        jsonParam.put("size", "10");
+        jsonParam.put("myself", "true");
+        //构造实体对象
+        HttpEntity<JSONObject> param = new HttpEntity<>(jsonParam, headers);
+        RestTemplate restTemplate = new RestTemplate();
+        JSONObject returnDataJSON = restTemplate.postForObject(url, param, JSONObject.class);
+
+        log.info("3.2 定制模特列表查询 返回报文"+returnDataJSON.toJSONString());
+        if ("0".equals(returnDataJSON.getString("code"))) {
+            JSONObject dataJSON = returnDataJSON.getJSONObject("data");
+            System.out.println(dataJSON);
+            //TODO
+            dataJSON.getInteger("records");
+            LinkedHashMap dataLinkMap = returnDataJSON.getObject("data", java.util.LinkedHashMap.class);
+            System.out.println(dataLinkMap);
+//            (ArrayList)dataLinkMap.get("records");
+        }
+    }
+
+    /**
+     * 3.3 免费模特列表查询(支持分页,推荐使用)
+     */
+    public void freeModelListQuery(){
+        String accessToken = "";
+        try {
+            accessToken = npCommitService.getToken();
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException(e);
+        }
+        String url = baseUrl + "/openapi/robot/v2/freeListPage?access_token=" + accessToken;
+
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("Content-Type","application/json;charset=UTF-8");
+
+        JSONObject jsonParam = new JSONObject();
+        jsonParam.put("page", "1");
+        jsonParam.put("size", "100");
+        //构造实体对象
+        HttpEntity<JSONObject> param = new HttpEntity<>(jsonParam, headers);
+        RestTemplate restTemplate = new RestTemplate();
+        JSONObject returnDataJSON = restTemplate.postForObject(url, param, JSONObject.class);
+
+        log.info("3.3 免费模特列表查询(支持分页,推荐使用) 返回报文"+returnDataJSON.toJSONString());
+        if ("0".equals(returnDataJSON.getString("code"))) {
+            JSONObject dataJSON = returnDataJSON.getJSONObject("data");
+            System.out.println(dataJSON);
+            ArrayList records = dataJSON.getObject("records", ArrayList.class);
+            for (int i = 0; i < records.size(); i++) {
+                LinkedHashMap map = (LinkedHashMap)records.get(i);
+                Object id = map.get("id");
+                Object robotName = map.get("robotName");
+                Object robotDesc = map.get("robotDesc");
+                Object coverUrl = map.get("coverUrl");
+
+            }
+        }
+    }
+
+
+    /**
+     //     * 3.5 企业所有发音人列表
+     */
+    public void allShoudList(){
+        String accessToken = "";
+        try {
+            accessToken = npCommitService.getToken();
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException(e);
+        }
+        // /openapi/robot/v2/freeListPage?access_token=55d1bc37-f960-4a9d-8c7d-5dc8c991c245
+        String url = baseUrl + "/openapi/speaker/v2/list?access_token=" + accessToken;
+        RestTemplate restTemplate = new RestTemplate();
+        JSONObject returnDataJSON = restTemplate.getForObject(url, JSONObject.class);
+
+        log.info("3.5 企业所有发音人列表 返回报文"+returnDataJSON.toJSONString());
+        if ("0".equals(returnDataJSON.getString("code"))) {
+            JSONObject dataJSON = returnDataJSON.getJSONObject("data");
+            System.out.println(dataJSON);
+            ArrayList records = dataJSON.getObject("records", ArrayList.class);
+            for (int i = 0; i < records.size(); i++) {
+                LinkedHashMap map = (LinkedHashMap)records.get(i);
+                Object id = map.get("id");
+                Object robotName = map.get("robotName");
+                Object robotDesc = map.get("robotDesc");
+                Object coverUrl = map.get("coverUrl");
+
+            }
+        }
+    }
+
+
+    /**
+     * 3.18 训练任务信息查询
+     */
+    public void queryTrainTask(){
+        String accessToken = "";
+        try {
+            accessToken = npCommitService.getToken();
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException(e);
+        }
+        String url = baseUrl + "/openapi/video/v2/training/get/387?access_token=" + accessToken;
+
+        RestTemplate restTemplate = new RestTemplate();
+        JSONObject returnDataJSON = restTemplate.getForObject(url, JSONObject.class);
+        log.info(returnDataJSON.toJSONString());
+        if ("0".equals(returnDataJSON.getString("code"))) {
+            System.out.println(returnDataJSON.getString("message"));
+            JSONObject dataJSON = returnDataJSON.getJSONObject("data");
+            System.out.println(dataJSON);
+            //TODO
+            dataJSON.getInteger("records");
+        }
+    }
+
+
+    /**
+     * 视频合成——3.17 训练任务列表查询
+     * @param id
+     */
+    @Override
+    public NpCommitTrain queryTrainVideo(String id) {
+
+        NpCommitTrain npCommitTrain = npCommitTrainMapper.selectById(id);
+//        2训练成功 3训练失败 4审核不通过
+//        status 训练状态 0或空-准备中 1训练中 2训练成功 3训练失败 4审核不通过
+//        callbackStatus 回调状态 0或空-初始态 1-回调成功 2-回调失败
+        if (null == npCommitTrain) {
+            throw new ServerException(ErrorCode.NUMERSON_NO_NUMPERSON);
+        }
+        Integer status = npCommitTrain.getStatus();
+        if (2 == status || 3 == status || 4 == status) {
+            return  npCommitTrain;
+        }
+
+        String accessToken = "";
+        try {
+            accessToken = npCommitService.getToken();
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException(e);
+        }
+        String url = baseUrl + "/openapi/video/v2/training/get/"+npCommitTrain.getModelId()+"?access_token=" + accessToken;
+
+        RestTemplate restTemplate = new RestTemplate();
+        JSONObject returnDataJSON = restTemplate.getForObject(url, JSONObject.class);
+        log.info(returnDataJSON.toJSONString());
+        if ("0".equals(returnDataJSON.getString("code"))) {
+            System.out.println(returnDataJSON.getString("message"));
+            JSONObject dataJSON = returnDataJSON.getJSONObject("data");
+            System.out.println(dataJSON);
+            if(returnDataJSON.getBoolean("success")){}
+            Integer rId = dataJSON.getInteger("id");
+            String title = dataJSON.getString("title");
+            String videoUrl = dataJSON.getString("videoUrl");
+            Integer rStatus = dataJSON.getInteger("status");
+            Integer callbackStatus = dataJSON.getInteger("callbackStatus");
+            Integer robotId = dataJSON.getInteger("robotId");
+            Integer sceneId = dataJSON.getInteger("sceneId");
+            String coverUrl = dataJSON.getString("coverUrl");
+            String createTime = dataJSON.getString("createTime");
+            String updateTime = dataJSON.getString("updateTime");
+            Object robot = dataJSON.get("robot");
+
+            npCommitTrain.setTitle(title);
+        }
+
+//        String accessToken = "";
+//        try {
+//            accessToken = npCommitService.getToken();
+//        } catch (NoSuchAlgorithmException e) {
+//            throw new RuntimeException(e);
+//        }
+//        String url = baseUrl + "/openapi/video/v2/training/get/" + trainId + "?access_token=" + accessToken;
+//
+//        RestTemplate restTemplate = new RestTemplate();
+//        JSONObject returnDataJSON = restTemplate.getForObject(url, JSONObject.class);
+//        log.info(returnDataJSON.toJSONString());
+//        if ("0".equals(returnDataJSON.getString("code"))) {
+//            System.out.println(returnDataJSON.getString("message"));
+//            JSONObject dataJSON = returnDataJSON.getJSONObject("data");
+//            System.out.println(dataJSON);
+//            //TODO
+////            dataJSON.getInteger("records");
+//        }
+        return null;
+    }
+
+    @Override
+    public List<NpMusic> queryMusic(NpMusic npMusic) {
+        List<NpMusic> npMusics = npMusicMapper.queryMusic(npMusic);
+        return npMusics;
+    }
+
+    @Override
+    public List<NpText> queryNpText(NpText npText) {
+        List<NpText> npTextList = npTextMapper.queryText(npText);
+        return npTextList;
+    }
+
+    /**
+     * 3.9 查询合成视频作品列表
+     */
+    public void getVideoList(){
+
+        String accessToken = "";
+        try {
+            accessToken = npCommitService.getToken();
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException(e);
+        }
+        // /openapi/video/v2/pageList?access_token=55d1bc37-f960-4a9d-8c7d-5dc8c991c245
+        String url = baseUrl + "/openapi/video/v2/pageList?access_token=" + accessToken;
+        log.info("3.9 查询合成视频作品列表 请求地址:"+url);
+
+        JSONObject jsonParam = new JSONObject();
+        jsonParam.put("page", "1");
+        jsonParam.put("size", "100");
+        HttpEntity param = new HttpEntity(jsonParam, new HttpHeaders());
+        RestTemplate restTemplate = new RestTemplate();
+        JSONObject returnDataJSON = restTemplate.postForObject(url, param, JSONObject.class);
+
+        log.info("3.9 查询合成视频作品列表 返回报文"+returnDataJSON.toJSONString());
+        if ("0".equals(returnDataJSON.getString("code"))) {
+            JSONObject dataJSON = returnDataJSON.getJSONObject("data");
+            System.out.println(dataJSON);
+            //TODO
+        }
+    }
+
+    /**
+     * 3.19 合成任务信息查询
+     */
+    public void querySynthesisTask(){
+        String accessToken = "";
+        try {
+            accessToken = npCommitService.getToken();
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException(e);
+        }
+        // /openapi/video/v2/get/{id}
+        String url = baseUrl + "/openapi/video/v2/get/1?access_token=" + accessToken;
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("Content-Type","application/json;charset=UTF-8");
+
+        RestTemplate restTemplate = new RestTemplate();
+        JSONObject returnDataJSON = restTemplate.getForObject(url, JSONObject.class);
+        if ("0".equals(returnDataJSON.getString("code"))) {
+            System.out.println(returnDataJSON.getString("message"));
+            JSONObject dataJSON = returnDataJSON.getJSONObject("data");
+            System.out.println(dataJSON);
+            //TODO
+            dataJSON.getInteger("records");
+        }
+    }
+
+    /**
+     * 3.21 素材查询接口
+     */
+    public void queryMaterial() {
+        String accessToken = "";
+        try {
+            accessToken = npCommitService.getToken();
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException(e);
+        }
+        String url = baseUrl + "/openapi/material/search?access_token=" + accessToken;
+        JSONObject jsonParam = new JSONObject();
+
+        jsonParam.put("rootId", "0"); // 素材类型 ,0:背景(图片或者视频),1:图片素材,4:视频素材
+        jsonParam.put("page", "1");
+        jsonParam.put("size", "100");
+        jsonParam.put("asc", "true");
+//        jsonParam.put("myself", "true"); // 是否是自己上传的
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("Content-Type","application/json;charset=UTF-8");
+        //构造实体对象
+        HttpEntity<JSONObject> param = new HttpEntity<>(jsonParam, headers);
+        RestTemplate restTemplate = new RestTemplate();
+        JSONObject returnDataJSON = restTemplate.postForObject(url, param, JSONObject.class);
+        System.out.println(returnDataJSON);
+        if ("0".equals(returnDataJSON.getString("code"))) {
+            LinkedHashMap data = (LinkedHashMap) returnDataJSON.get("data");
+            ArrayList records = (ArrayList)data.get("records");
+            for (int i = 0; i < records.size(); i++) {
+                LinkedHashMap record = (LinkedHashMap) records.get(i);
+            }
+        }
+    }
+}

+ 526 - 0
xyzc-start/src/main/java/com/xyzc/start/service/impl/NumPersonServiceImpl.java

@@ -0,0 +1,526 @@
+package com.xyzc.start.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.xyzc.common.core.exception.ErrorCode;
+import com.xyzc.common.core.exception.ServerException;
+import com.xyzc.common.web.security.user.SecurityUser;
+import com.xyzc.start.domain.*;
+import com.xyzc.start.mapper.NpCommitTrainMapper;
+import com.xyzc.start.mapper.NpMaterialMapper;
+import com.xyzc.start.mapper.NpVideoDraftMapper;
+import com.xyzc.start.mapper.NumPersonMapper;
+import com.xyzc.start.service.INumPersonService;
+import com.xyzc.start.utils.SnowflakeIdWorker;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.logging.log4j.util.Strings;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+import static com.xyzc.start.utils.EncryptUtil.getMD5Byparam;
+
+
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class NumPersonServiceImpl implements INumPersonService {
+
+    private final NumPersonMapper numPersonMapper;
+
+    private final NpCommitTrainMapper npCommitTrainMapper;
+
+    private final NpMaterialMapper npMaterialMapper;
+
+    private final NpVideoDraftMapper npVideoDraftMapper;
+
+    RestTemplate restTemplate = new RestTemplate();
+
+    // 基本URL请求
+    String baseUrl = "https://meta.guiji.ai";
+
+    String appKey = "IyeVRCSyBokinWIcrTjXVeOq";
+    String appSecret = "PFp3PZeEJIIRTtHqyG6Hhp1pyiS0ETjsb30XZVVhwR2n4WYQF4aI9A7EzUCrPsML";
+
+    public String numberPersonCommitNotify(String notify) {
+        JSONObject jsonObject = JSONObject.parseObject(notify);
+        String taskType = jsonObject.getString("taskType");
+        if ("video-training".equals(taskType)) {
+            JSONObject dataJSON = jsonObject.getJSONObject("data");
+            String result = dataJSON.getString("result");
+
+            NpCommitTrain npCommitTrain = npCommitTrainMapper.selectOne(new QueryWrapper<NpCommitTrain>().eq("model_id", dataJSON.getString("id")));
+            if (null == npCommitTrain) {
+                npCommitTrain = new NpCommitTrain();
+            }
+            if("success".equals(result)){
+                JSONObject robot = dataJSON.getJSONObject("robot");
+                String coverUrl = dataJSON.getString("coverUrl");
+                Integer sceneId = dataJSON.getInteger("sceneId");
+                Integer robotId = dataJSON.getInteger("robotId");
+                String title = dataJSON.getString("title");
+                npCommitTrain.setTitle(title);
+                npCommitTrain.setCoverUrl(coverUrl);
+                npCommitTrain.setSceneId(sceneId);
+                npCommitTrain.setRobotId(robotId);
+                npCommitTrain.setRobotJson(robot.toJSONString());
+                npCommitTrain.setStatus(2);
+            }else if("fail".equals(result)){
+                String reason = dataJSON.getString("reason");
+                npCommitTrain.setReason(reason);
+                npCommitTrain.setStatus(3);
+            }
+            log.info("更新成功");
+            npCommitTrainMapper.updateById(npCommitTrain);
+        }else{
+            log.error("无效请求");
+            throw new ServerException(ErrorCode.NUMERSON_NO);
+        }
+        return "";
+    }
+
+    @Override
+    public String getTrainingInfo(String trainingId) {
+
+        String accessToken = "";
+        try {
+            accessToken = getToken();
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException(e);
+        }
+        // /openapi/video/v2/training/get/{id}?access_token=ae4dad61-0dc5-47ad-be20-c51245db2769
+        String url = baseUrl + "/openapi/video/v2/training/get/"+trainingId+"?access_token=" + accessToken;
+
+        JSONObject returnDataJSON = restTemplate.getForObject(url, JSONObject.class);
+        log.info(returnDataJSON.toJSONString());
+        if ("0".equals(returnDataJSON.getString("code"))) {
+            System.out.println(returnDataJSON.getString("message"));
+            JSONObject dataJSON = returnDataJSON.getJSONObject("data");
+            log.info(dataJSON.toJSONString());
+            // TODO
+//            dataJSON.getInteger("records");
+            Integer status = dataJSON.getInteger("status");
+
+        }
+        return "";
+    }
+
+    @Override
+    public List<NpVideoDraft> getTemplateDraft(String templateId) {
+        Long baseUserId = SecurityUser.getUserId();
+        List<NpVideoDraft> videoDraftList = npVideoDraftMapper.selectList(new QueryWrapper<NpVideoDraft>().eq("base_user_id", baseUserId).eq("type", "1"));
+
+        String nodeJson = "";
+        if (Strings.isBlank(templateId) && videoDraftList.isEmpty()) {
+            NpVideoDraft videoDraft = npVideoDraftMapper.selectOne(new QueryWrapper<NpVideoDraft>().eq("id", "1"));
+            nodeJson = videoDraft.getNodesJson();
+
+            SnowflakeIdWorker snowflakeIdWorker = new SnowflakeIdWorker(1, 1);
+            long l = snowflakeIdWorker.nextId();
+            videoDraft.setId(l);
+            videoDraft.setNodesJson(nodeJson);
+        }
+
+        return videoDraftList;
+    }
+
+    @Override
+    public void saveTemplateDraft(NpVideoDraft npVideoDraft) {
+//        if (null == npVideoDraft.getBatch()) {
+//            log.error("请输入批次");
+//            throw new ServerException(ErrorCode.NUMERSON_NO_BATCH);
+//        }
+//        if(npVideoDraft.getId() == null || 1l == npVideoDraft.getId()) {
+//            SnowflakeIdWorker snowflakeIdWorker = new SnowflakeIdWorker(1, 1);
+//            long l = snowflakeIdWorker.nextId();
+//            npVideoDraft.setId(l);
+//        }
+//        npVideoDraftMapper
+//        npVideoDraft.getBatch()
+//        npVideoDraft.setType(1);
+//        npVideoDraft.setBaseUserId(SecurityUser.getUserId());
+
+        boolean isSave = npVideoDraftMapper.insertOrUpdate(npVideoDraft);
+        if (!isSave) {
+            throw new ServerException(ErrorCode.NUMERSON_NO_SAVE);
+        }
+    }
+
+    public List<NpSound> queryCompanySound(){
+        return numPersonMapper.queryCompanySound();
+    }
+
+
+    public List<NpTemplate> queryCommonTemplate() {
+        return numPersonMapper.queryCommonTemplate();
+    }
+
+    public List<NpCommitTrain> queryTrainingModel() {
+        // TODO 必须再加上baseuserId
+        List<NpCommitTrain> npCommitTrains = npCommitTrainMapper.selectList(new QueryWrapper<NpCommitTrain>().eq("base_user_id", SecurityUser.getUserId()).eq("status", "2")
+                .select("model_id, video_url,title, cover_url, scene_id, robot_json"));
+        return npCommitTrains;
+    }
+
+    public String getToken() throws NoSuchAlgorithmException {
+//        String input = "password123";
+//        String encrypted = encrypt(input);
+//        System.out.println("加密后的结果:" + encrypted);
+//        AccessKey+时间戳+SecretKey
+        long timeStamp = System.currentTimeMillis();
+        String encrypted = getMD5Byparam(appKey + timeStamp + appSecret);
+
+        log.info("加密后的结果:" + encrypted);
+
+        String url = "https://meta.guiji.ai/openapi/oauth/token?grant_type=sign&timestamp=" + timeStamp + "&sign=" + encrypted + "&appId=" + appKey;
+
+        String forObject = restTemplate.getForObject(url, String.class);
+        log.info("获取到的token:" + forObject);
+        JSONObject jsonObject = JSONObject.parseObject(forObject);
+        String code = jsonObject.getString("code");
+        String accessToken = "";
+        if ("0".equals(code)) {
+            JSONObject dataJSON = jsonObject.getJSONObject("data");
+            accessToken = dataJSON.getString("access_token");
+            String expiresIn = dataJSON.getString("expires_in");
+            String scope = dataJSON.getString("scope");
+            JSONObject userInfoJSON = dataJSON.getJSONObject("userInfo");
+            Integer corpId = userInfoJSON.getInteger("corpId");
+            Integer id = userInfoJSON.getInteger("id");
+            Integer userId = userInfoJSON.getInteger("userId");
+            // 获取到的token:{"code":"0","data":{"access_token":"796916ae-6fb1-4d51-8e80-6543081366c5","userInfo":{"corpId":1251421,"id":93,"userId":355352},"scope":"all","expires_in":7182},"success":true}
+            // 获取到的token:{"code":"0","data":{"access_token":"7ac45bf8-c3bb-4d19-a187-c1ecbf9b3ed0","userInfo":{"corpId":1251421,"id":93,"userId":355352},"scope":"all","expires_in":7199},"success":true}
+        }else{
+            errorCode(code);
+        }
+        return accessToken;
+    }
+    /**
+     * 3.21 素材查询接口
+     */
+    public void queryMaterial() {
+        String accessToken = "";
+        try {
+            accessToken = getToken();
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException(e);
+        }
+        String url = baseUrl + "/openapi/material/search?access_token=" + accessToken;
+
+        List<Integer> materialTypes = Arrays.asList(0);
+        for(Integer materialType : materialTypes) {
+            for (int k = 0; k < 1; k++) {
+                JSONObject jsonParam = new JSONObject();
+    //        Integer materialType = 0;
+                jsonParam.put("rootId", materialType); // 素材类型 ,0:背景(图片或者视频),1:图片素材,4:视频素材
+                jsonParam.put("page", "1");
+                jsonParam.put("size", "100");
+                jsonParam.put("asc", "true");
+//                String isMyself = "false";
+//                if(1==k) {
+//                    jsonParam.put("myself", "true"); // 是否是自己上传的
+//                    isMyself = "true";
+//                }
+                HttpHeaders headers = new HttpHeaders();
+                headers.add("Content-Type", "application/json;charset=UTF-8");
+                //构造实体对象
+                HttpEntity<JSONObject> param = new HttpEntity<>(jsonParam, headers);
+
+                JSONObject returnDataJSON = restTemplate.postForObject(url, param, JSONObject.class);
+                System.out.println(returnDataJSON);
+                if ("0".equals(returnDataJSON.getString("code"))) {
+                    LinkedHashMap data = (LinkedHashMap) returnDataJSON.get("data");
+                    ArrayList records = (ArrayList) data.get("records");
+                    for (int i = 0; i < records.size(); i++) {
+                        LinkedHashMap record = (LinkedHashMap) records.get(i);
+                        String proportion = "";
+                        if (null != record.get("proportion")) {
+                            proportion = record.get("proportion").toString();
+                        }
+                        String bgFormat = "";
+                        if (null != record.get("bgFormat")) {
+                            bgFormat = record.get("bgFormat").toString();
+                        }
+                        String groupId = "";
+                        if (null != record.get("groupId")) {
+                            groupId = record.get("groupId").toString();
+                        }
+                        String backgroundName = record.get("backgroundName").toString();
+                        Integer delFlag = (Integer) record.get("delFlag");
+                        Long userId = Long.valueOf((Integer) record.get("userId"));
+                        String coverUrl = record.get("coverUrl").toString();
+                        String backgroundCode = record.get("backgroundCode").toString();
+                        Long createTime = (Long) record.get("createTime");
+                        String zipCoverUrl = "";
+                        if (null != record.get("zipCoverUrl"))
+                            zipCoverUrl = record.get("zipCoverUrl").toString();
+                        Integer id = (Integer) record.get("id");
+                        Integer backgroundType = (Integer) record.get("backgroundType");
+
+                        NpMaterial npMaterial = new NpMaterial();
+                        npMaterial.setProportion(proportion);
+                        npMaterial.setBgFormat(bgFormat);
+                        npMaterial.setGroupId(groupId);
+                        npMaterial.setBackgroundName(backgroundName);
+                        npMaterial.setDelFlag(delFlag);
+                        npMaterial.setUserId(userId);
+                        npMaterial.setCoverUrl(coverUrl);
+                        npMaterial.setBackgroundCode(backgroundCode);
+                        npMaterial.setCreateBy(createTime);
+                        npMaterial.setZipCoverUrl(zipCoverUrl);
+                        npMaterial.setMaterialId(id);
+                        npMaterial.setMaterialType(materialType);
+                        npMaterial.setBackgroundType(backgroundType);
+//                        npMaterial.setIsMyself(isMyself);
+
+                        npMaterialMapper.insert(npMaterial);
+
+
+                    }
+                }
+            }
+        }
+    }
+    @Override
+    public void freeModelListQuery(){
+        queryMaterial();
+//        String accessToken = "";
+//        try {
+//            accessToken = getToken();
+//        } catch (NoSuchAlgorithmException e) {
+//            throw new RuntimeException(e);
+//        }
+        // /openapi/robot/v2/freeListPage?access_token=55d1bc37-f960-4a9d-8c7d-5dc8c991c245
+//        String url = baseUrl + "/openapi/robot/v2/freeListPage?access_token=" + accessToken;
+
+//        HttpHeaders headers = new HttpHeaders();
+//        headers.add("Content-Type","application/json;charset=UTF-8");
+//
+//        JSONObject jsonParam = new JSONObject();
+//        jsonParam.put("page", "1");
+//        jsonParam.put("size", "10");
+//        //构造实体对象
+//        HttpEntity<JSONObject> param = new HttpEntity<>(jsonParam, headers);
+//
+//        JSONObject returnDataJSON = restTemplate.postForObject(url, param, JSONObject.class);
+//
+//        log.info("3.3 免费模特列表查询(支持分页,推荐使用) 返回报文"+returnDataJSON.toJSONString());
+//        if ("0".equals(returnDataJSON.getString("code"))) {
+//            JSONObject dataJSON = returnDataJSON.getJSONObject("data");
+//            System.out.println(dataJSON);
+//            ArrayList records = dataJSON.getObject("records", ArrayList.class);
+//            for (int i = 0; i < records.size(); i++) {
+//                NpTemplate npTemplate = new NpTemplate();
+//                LinkedHashMap map = (LinkedHashMap)records.get(i);
+//                Object id = map.get("id");
+//                Object robotName = map.get("robotName");
+//                Object robotDesc = map.get("robotDesc");
+//                Object coverUrl = map.get("coverUrl");
+//                int gender = (Integer) map.get("gender");
+//                int age = (Integer) map.get("age");
+//                int starSigns = (Integer) map.get("starSigns");
+//
+//                Integer face = null;
+//                if(map.get("face")!=null)
+//                    face = (Integer) map.get("face");
+//                int popularity = (Integer) map.get("popularity");
+//                String speakerId = (String) map.get("speakerId");
+//
+//                String sceneList = map.get("sceneList").toString();
+//                npTemplate.setModelId((Integer)id);
+//                npTemplate.setRobotName(robotName.toString());
+//                npTemplate.setRobotDesc(robotDesc.toString());
+//                npTemplate.setCoverUrl(coverUrl.toString());
+//                npTemplate.setGender(gender);
+//                npTemplate.setAge(age);
+//                npTemplate.setStarSigns(starSigns);
+//                npTemplate.setFace(face);
+//                npTemplate.setPopularity(popularity);
+//                npTemplate.setSpeakerId(speakerId);
+//                npTemplate.setSceneList(sceneList.toString());
+//                numPersonMapper.insert(npTemplate);
+//            }
+//        }
+//        String url = baseUrl + "/openapi/speaker/v2/list?access_token=" + accessToken;
+//
+//        JSONObject returnDataJSON = restTemplate.getForObject(url, JSONObject.class);
+//
+//        log.info("3.5 企业所有发音人列表 返回报文"+returnDataJSON.toJSONString());
+//        if ("0".equals(returnDataJSON.getString("code"))) {
+//            JSONArray dataArray = returnDataJSON.getJSONArray("data");
+////            System.out.println(dataArray);
+////            ArrayList records = dataArray.getObject("records", ArrayList.class);
+//            for (int i = 0; i < dataArray.size(); i++) {
+//                LinkedHashMap map = (LinkedHashMap) dataArray.get(i);
+//                Object id = map.get("id");
+//                Object ttsName = map.get("ttsName");
+//                Object ttsIntroduction = map.get("ttsIntroduction");
+//                Object ttsScenes = map.get("ttsScenes");
+//                Object ttsSpeaker = map.get("ttsSpeaker");
+//                Object ttsFeatures = map.get("ttsFeatures");
+//                Object ttsAudition = map.get("ttsAudition");
+//                Object ttsCover = map.get("ttsCover");
+//                Object languages = map.get("languages");
+//                Object free = map.get("free");
+//                String sex = "";
+//                if (null != map.get("sex"))
+//                    sex = map.get("sex").toString();
+//                Object ttsExtendJson = map.get("ttsExtendJson");
+//                Object phonemeFlag = map.get("phonemeFlag");
+//
+//                NpSound npSound = new NpSound();
+//                npSound.setModelId((Integer) id);
+//                npSound.setTtsName(ttsName.toString());
+//                npSound.setTtsIntroduction(ttsIntroduction.toString());
+//                npSound.setTtsScenes(ttsScenes.toString());
+//                npSound.setTtsSpeaker(ttsSpeaker.toString());
+//                npSound.setTtsFeatures(ttsFeatures.toString());
+//                npSound.setTtsAudition(ttsAudition.toString());
+//                npSound.setTtsCover(ttsCover.toString());
+//                npSound.setLanguages(languages.toString());
+//                npSound.setFree(free.toString());
+//                npSound.setSex(sex);
+//                npSound.setTtsExtendJson(ttsExtendJson.toString());
+//                npSound.setPhonemeFlag((Integer) phonemeFlag);
+//
+//                numPersonMapper.insert(npSound);
+//            }
+//        }
+
+//        String url = baseUrl + "/openapi/video/v2/training/pageList?access_token=" + accessToken;
+//        log.info("训练任务列表查询 请求地址:"+url);
+//
+//        JSONObject jsonParam = new JSONObject();
+//        jsonParam.put("page", "1");
+//        jsonParam.put("size", "100");
+//        HttpEntity param = new HttpEntity(jsonParam, new HttpHeaders());
+//        JSONObject returnDataJSON = restTemplate.postForObject(url, param, JSONObject.class);
+//
+//        log.info("3.17 训练任务列表查询 返回报文"+returnDataJSON.toJSONString());
+//        if ("0".equals(returnDataJSON.getString("code"))) {
+//            JSONObject dataJSON = returnDataJSON.getJSONObject("data");
+//            System.out.println(dataJSON);
+//            //TODO
+////            dataJSON.getInteger("records");
+//            LinkedHashMap dataLinkMap2 = returnDataJSON.getObject("data", java.util.LinkedHashMap.class);
+////            System.out.println(dataLinkMap);
+//            for (Object o : (ArrayList) dataLinkMap2.get("records")) {
+//                LinkedHashMap dataLinkMap = (LinkedHashMap) o;
+////            }
+////
+//////            ArrayList records = dataArray.getObject("records", ArrayList.class);
+////            for (int i = 0; i < dataLinkMap.size(); i++) {
+//                NpCommitTrain npCommitTrain = new NpCommitTrain();
+//                Object id = dataLinkMap.get("id");
+//                Object title = dataLinkMap.get("title");
+//                Object videoUrl = dataLinkMap.get("videoUrl");
+//                Object status = dataLinkMap.get("status");
+//                Object callbackStatus = dataLinkMap.get("callbackStatus");
+//                Object comment = dataLinkMap.get("comment");
+//                Object robotId = dataLinkMap.get("robotId");
+//                Object sceneId = dataLinkMap.get("sceneId");
+//                Object createTime = dataLinkMap.get("createTime");
+//                Object updateTime = dataLinkMap.get("updateTime");
+//                Object coverUrl = dataLinkMap.get("coverUrl");
+//                String robot = null;
+//                if(null != dataLinkMap.get("robot"))
+//                    robot = dataLinkMap.get("robot").toString();
+//
+//                npCommitTrain.setModelId((Integer)id);
+//                npCommitTrain.setTitle((String)title);
+//                npCommitTrain.setVideoUrl((String)videoUrl);
+//                npCommitTrain.setStatus((Integer)status);
+//                npCommitTrain.setCallbackStatus((Integer)callbackStatus);
+//                npCommitTrain.setComment((String)comment);
+//                npCommitTrain.setRobotId((Integer)robotId);
+//                npCommitTrain.setSceneId((Integer)sceneId);
+//                npCommitTrain.setTrainCreateTime((String)createTime);
+//                npCommitTrain.setTrainUpdateTime((String)updateTime);
+//                npCommitTrain.setCoverUrl((String)coverUrl);
+//                npCommitTrain.setRobotJson(robot);
+//
+//                numPersonMapper.insert(npCommitTrain);
+//            }
+////            (ArrayList)dataLinkMap.get("records");
+//        }
+
+//        NpCommitTrain
+//        String url = baseUrl + "/openapi/material/search?access_token=" + accessToken;
+//        JSONObject jsonParam = new JSONObject();
+//
+//        jsonParam.put("rootId", "0"); // 素材类型 ,0:背景(图片或者视频),1:图片素材,4:视频素材
+//        jsonParam.put("page", "1");
+//        jsonParam.put("size", "100");
+//        jsonParam.put("asc", "true");
+////        jsonParam.put("myself", "true"); // 是否是自己上传的
+//        HttpHeaders headers = new HttpHeaders();
+//        headers.add("Content-Type","application/json;charset=UTF-8");
+//        //构造实体对象
+//        HttpEntity<JSONObject> param = new HttpEntity<>(jsonParam, headers);
+//
+//        JSONObject returnDataJSON = restTemplate.postForObject(url, param, JSONObject.class);
+////        System.out.println(returnDataJSON);
+//        if ("0".equals(returnDataJSON.getString("code"))) {
+//            LinkedHashMap data = (LinkedHashMap) returnDataJSON.get("data");
+//            ArrayList records = (ArrayList)data.get("records");
+//            for (int i = 0; i < records.size(); i++) {
+//                LinkedHashMap record = (LinkedHashMap) records.get(i);
+//            }
+//        }
+    }
+
+    public void errorCode(String code) {
+        if ("40001".equals(code)) {
+            log.error("内部异常");
+        } else if ("40002".equals(code)) {
+            log.error("token无效");
+        } else if ("40003".equals(code)) {
+            log.error("token超时");
+        } else if ("40010".equals(code)) {
+            log.error("余额不足");
+        } else if ("40011".equals(code)) {
+            log.error("不合法的音频地址");
+        } else if ("40012".equals(code)) {
+            log.error("不合法的音频时长");
+        } else if ("40013".equals(code)) {
+            log.error("不合法的文件大小");
+        } else if ("40014".equals(code)) {
+            log.error("缺少必要文件");
+        } else if ("40015".equals(code)) {
+            log.error("缺少必要参数");
+        } else if ("40016".equals(code)) {
+            log.error("文件上传失败");
+        } else if ("40017".equals(code)) {
+            log.error("文件下载失败");
+        } else if ("40018".equals(code)) {
+            log.error("文件不存在");
+        } else if ("40019".equals(code)) {
+            log.error("超出并发");
+        } else if ("40020".equals(code)) {
+            log.error("不支持的背景图片格式");
+        } else if ("40021".equals(code)) {
+            log.error("提交训练视频失败");
+        } else if ("40022".equals(code)) {
+            log.error("不合法的码率值");
+        } else if ("40023".equals(code)) {
+            log.error("不合法的分辨率值");
+        } else if ("40024".equals(code)) {
+            log.error("不合法的fps值");
+        } else if ("40025".equals(code)) {
+            log.error("模特不存在");
+        } else if ("40026".equals(code)) {
+            log.error("模特已过期");
+        } else if ("40027".equals(code)) {
+            log.error("不合法的视频格式");
+        }
+    }
+}

+ 140 - 0
xyzc-start/src/main/java/com/xyzc/start/utils/SnowflakeIdWorker.java

@@ -0,0 +1,140 @@
+package com.xyzc.start.utils;
+
+public class SnowflakeIdWorker{
+    /** 开始时间截 (2015-01-01) */
+    private final long twepoch = 1288834974657L;
+
+    /** 机器id所占的位数 */
+    private final long workerIdBits = 5L;
+
+    /** 数据标识id所占的位数 */
+    private final long datacenterIdBits = 5L;
+
+    /** 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) */
+    private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
+
+    /** 支持的最大数据标识id,结果是31 */
+    private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
+
+    /** 序列在id中占的位数 */
+    private final long sequenceBits = 12L;
+
+    /** 机器ID向左移12位 */
+    private final long workerIdShift = sequenceBits;
+
+    /** 数据标识id向左移17位(12+5) */
+    private final long datacenterIdShift = sequenceBits + workerIdBits;
+
+    /** 时间截向左移22位(5+5+12) */
+    private final long timestampLeftShift = sequenceBits + workerIdBits
+            + datacenterIdBits;
+
+    /** 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095) */
+    private final long sequenceMask = -1L ^ (-1L << sequenceBits);
+
+    /** 工作机器ID(0~31) */
+    private long workerId;
+
+    /** 数据中心ID(0~31) */
+    private long datacenterId;
+
+    /** 毫秒内序列(0~4095) */
+    private long sequence = 0L;
+
+    /** 上次生成ID的时间截 */
+    private long lastTimestamp = -1L;
+    
+    /**
+     * 构造函数
+     * 
+     * @param workerId
+     *            工作ID (0~31)
+     * @param datacenterId
+     *            数据中心ID (0~31)
+     */
+    public SnowflakeIdWorker(long workerId, long datacenterId) {
+        if (workerId > maxWorkerId || workerId < 0) {
+            throw new IllegalArgumentException(String.format(
+                    "worker Id can't be greater than %d or less than 0",
+                    maxWorkerId));
+        }
+        if (datacenterId > maxDatacenterId || datacenterId < 0) {
+            throw new IllegalArgumentException(String.format(
+                    "datacenter Id can't be greater than %d or less than 0",
+                    maxDatacenterId));
+        }
+        this.workerId = workerId;
+        this.datacenterId = datacenterId;
+    }
+
+    /**
+     * 获得下一个ID (该方法是线程安全的)
+     * 
+     * @return SnowflakeId
+     */
+    public synchronized long nextId() {
+        long timestamp = timeGen();
+
+        // 如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常
+        if (timestamp < lastTimestamp) {
+            throw new RuntimeException(
+                    String.format(
+                            "Clock moved backwards.  Refusing to generate id for %d milliseconds",
+                            (lastTimestamp - timestamp)));
+        }
+
+        // 如果是同一时间生成的,则进行毫秒内序列
+        if (lastTimestamp == timestamp) {
+            sequence = (sequence + 1) & sequenceMask;
+            // 毫秒内序列溢出
+            if (sequence == 0) {
+                // 阻塞到下一个毫秒,获得新的时间戳
+                timestamp = tilNextMillis(lastTimestamp);
+            }
+        }
+        // 时间戳改变,毫秒内序列重置
+        else {
+            sequence = 0L;
+        }
+
+        // 上次生成ID的时间截
+        lastTimestamp = timestamp;
+
+        // 移位并通过或运算拼到一起组成64位的ID
+        return ((timestamp - twepoch) << timestampLeftShift) //
+                | (datacenterId << datacenterIdShift) //
+                | (workerId << workerIdShift) //
+                | sequence;
+    }
+
+    /**
+     * 阻塞到下一个毫秒,直到获得新的时间戳
+     * 
+     * @param lastTimestamp
+     *            上次生成ID的时间截
+     * @return 当前时间戳
+     */
+    protected long tilNextMillis(long lastTimestamp) {
+        long timestamp = timeGen();
+        while (timestamp <= lastTimestamp) {
+            timestamp = timeGen();
+        }
+        return timestamp;
+    }
+
+    /**
+     * 返回以毫秒为单位的当前时间
+     * 
+     * @return 当前时间(毫秒)
+     */
+    protected long timeGen() {
+        return System.currentTimeMillis();
+    }
+
+  //测试方法自己写
+
+    public static void main(String[] args) {
+        SnowflakeIdWorker idGenerator = new SnowflakeIdWorker(1, 1);
+        System.out.println(idGenerator.nextId());
+    }
+}

+ 7 - 0
xyzc-start/src/main/resources/mapper/WebStart/NpCommitTrainMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xyzc.start.mapper.NpCommitTrainMapper">
+
+</mapper>

+ 7 - 0
xyzc-start/src/main/resources/mapper/WebStart/NpMaterialMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xyzc.start.mapper.NpMaterialMapper">
+
+</mapper>

+ 30 - 0
xyzc-start/src/main/resources/mapper/WebStart/NpMusicMapper.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xyzc.start.mapper.NpMusicMapper">
+
+    <select id="queryMusic" resultType="com.xyzc.start.domain.NpMusic">
+        SELECT
+               `id`
+             , `music_name`
+             , `music_pic`
+             , `music_play_time`
+             , `music_url`
+             , `music_type`
+             , `music_desc`
+        FROM xy_np_music
+        <where>
+            <if test="musicName != null and musicName != ''">
+                and music_name like concat('%',#{musicName},'%')
+            </if>
+            <if test="musicType != null and musicType != ''">
+                and music_type = #{musicType}
+            </if>
+            <if test="musicDesc != null and musicDesc != ''">
+                and music_desc like concat('%',#{musicDesc},'%')
+            </if>
+            and base_user_id = #{baseUserId}
+        </where>
+    </select>
+</mapper>

+ 28 - 0
xyzc-start/src/main/resources/mapper/WebStart/NpTextMapper.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xyzc.start.mapper.NpTextMapper">
+
+    <select id="queryText" resultType="com.xyzc.start.domain.NpText">
+        SELECT
+               `id`
+             , `text`
+             , `img_url`
+             , `type`
+             , `base_user_id`
+        FROM xy_np_text
+        <where>
+            <if test="text != null and text != ''">
+                and text like concat('%',#{text},'%')
+            </if>
+            <if test="imgUrl != null and imgUrl != ''">
+                and img_url = #{imgUrl}
+            </if>
+            <if test="type != null and type != ''">
+                and type = #{type}
+            </if>
+            and base_user_id = #{baseUserId}
+        </where>
+    </select>
+</mapper>

+ 7 - 0
xyzc-start/src/main/resources/mapper/WebStart/NpVideoDraftMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xyzc.start.mapper.NpVideoDraftMapper">
+
+</mapper>

+ 15 - 0
xyzc-start/src/main/resources/mapper/WebStart/NumPersonMapper.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xyzc.start.mapper.NumPersonMapper">
+
+    <select id="queryCompanySound" resultType="com.xyzc.start.domain.NpSound">
+        select `id`, `model_id`, `tts_name`, `tts_introduction`, `tts_scenes`, `tts_speaker`, `tts_features`, `tts_audition`, `tts_cover`, `languages`, `free`, `sex`, `tts_extend_json`, `phoneme_flag`
+        from xy_np_sound
+    </select>
+
+    <select id="queryCommonTemplate" resultType="com.xyzc.start.domain.NpTemplate">
+        select `model_id`, `robot_name`, `robot_desc`, `cover_url`, `gender`, `age`, `star_signs`, `face`, `scene_list`, `popularity`, `speaker_id` from xy_np_template
+    </select>
+</mapper>