后台服务
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

312 lines
14 KiB

  1. package com.iformall.controller;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.github.pagehelper.PageInfo;
  4. import com.iformall.annotation.AuthIgnore;
  5. import com.iformall.common.ErrorCode;
  6. import com.iformall.common.ResultData;
  7. import com.iformall.domain.po.base.BaseEntity;
  8. import com.iformall.domain.po.sm.MouldPatch;
  9. import com.iformall.domain.po.sm.MouldPatchSign;
  10. import com.iformall.domain.po.sm.UserMouldVideo;
  11. import com.iformall.domain.po.sm.VoiceInfo;
  12. import com.iformall.domain.vo.WxCouponOrderBVo;
  13. import com.iformall.enums.EnumMouldSendType;
  14. import com.iformall.enums.EnumVideoStatus;
  15. import com.iformall.enums.EnumaMouldPatchStatus;
  16. import com.iformall.exception.MallinkException;
  17. import com.iformall.service.sm.MouldPatchService;
  18. import com.iformall.service.sm.MouldPatchSignService;
  19. import com.iformall.service.sm.UserMouldVideoService;
  20. import com.iformall.service.sm.VoiceInfoService;
  21. import com.iformall.video.VideoFactory;
  22. import com.iformall.video.entity.VideUploadResult;
  23. import io.swagger.annotations.Api;
  24. import io.swagger.annotations.ApiImplicitParam;
  25. import io.swagger.annotations.ApiImplicitParams;
  26. import io.swagger.annotations.ApiOperation;
  27. import lombok.SneakyThrows;
  28. import me.chanjar.weixin.common.error.WxError;
  29. import me.chanjar.weixin.common.error.WxErrorException;
  30. import me.chanjar.weixin.common.util.fs.FileUtils;
  31. import org.apache.commons.lang3.StringUtils;
  32. import org.slf4j.Logger;
  33. import org.slf4j.LoggerFactory;
  34. import org.springframework.beans.factory.annotation.Autowired;
  35. import org.springframework.web.bind.annotation.*;
  36. import javax.servlet.http.HttpServletRequest;
  37. import javax.servlet.http.HttpServletResponse;
  38. import java.io.*;
  39. import java.net.URL;
  40. import java.net.URLEncoder;
  41. import java.nio.charset.StandardCharsets;
  42. import java.util.Date;
  43. import java.util.List;
  44. import java.util.UUID;
  45. @RestController
  46. @RequestMapping("/api/userVideo")
  47. @Api(description = "模板接口")
  48. public class UserMouldVideoController extends BaseController {
  49. private final Logger logger = LoggerFactory.getLogger(this.getClass());
  50. @Autowired
  51. private UserMouldVideoService userMouldVideoService;
  52. @Autowired
  53. private MouldPatchService mouldPatchService;
  54. @Autowired
  55. private VoiceInfoService voiceInfoService;
  56. @Autowired
  57. private VideoFactory videoFactory;
  58. @Autowired
  59. String videoType;
  60. @ApiOperation("分页列表接口")
  61. @GetMapping("list")
  62. @ApiImplicitParams({
  63. @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
  64. @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
  65. public ResultData list(@ModelAttribute UserMouldVideo record, Integer pageNum, Integer pageSize) {
  66. logger.debug("[" + getIpAddr() + "] UserMouldVideoController::list");
  67. if (record == null) record = new UserMouldVideo();
  68. if(record.getVideoType() != null && record.getVideoType().intValue() == -1){
  69. record.setVideoType(null);
  70. }
  71. record.setUserId(getMemberId());
  72. record.setSortColumns(BaseEntity.SortField.UpdateDate_DESC);
  73. final PageInfo<UserMouldVideo> page = userMouldVideoService.cListAsPage(record, pageNum, pageSize);
  74. return new ResultData(page);
  75. }
  76. @ApiOperation("根据id查询接口")
  77. @GetMapping("/findById")
  78. @ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true)
  79. public ResultData findById(Long id) {
  80. logger.debug("[" + getIpAddr() + "] MouldPatchController::findById");
  81. if(id == null){
  82. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"参数为空");
  83. }
  84. UserMouldVideo mouldVideo = userMouldVideoService.getById(id);
  85. if(mouldVideo == null || !mouldVideo.getUserId().equals(getMemberId())){
  86. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未找到用户数据");
  87. }
  88. if(mouldVideo.getVoiceMouldId() != null){
  89. VoiceInfo voiceInfo = voiceInfoService.getById(mouldVideo.getVoiceMouldId());
  90. mouldVideo.setVoiceInfo(voiceInfo);
  91. }
  92. return new ResultData(mouldVideo);
  93. }
  94. @ApiOperation("根据id删除接口")
  95. @GetMapping("/del")
  96. @ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true)
  97. public ResultData del(Long id) {
  98. logger.debug("[" + getIpAddr() + "] MouldPatchController::del");
  99. if(id == null){
  100. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"参数为空");
  101. }
  102. UserMouldVideo mouldVideo = userMouldVideoService.getById(id);
  103. if(mouldVideo == null || !mouldVideo.getUserId().equals(getMemberId())){
  104. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未找到用户数据");
  105. }
  106. // if(EnumVideoStatus.ing.getCode().equals(mouldVideo.getVideoStatus())
  107. // || EnumVideoStatus.success.getCode().equals(mouldVideo.getVideoStatus())
  108. // || EnumVideoStatus.upload_ing.getCode().equals(mouldVideo.getVideoStatus())
  109. // || EnumVideoStatus.upload_fail.getCode().equals(mouldVideo.getVideoStatus())){
  110. // return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"视频生成中");
  111. // }
  112. userMouldVideoService.deleteById(id);
  113. return new ResultData();
  114. }
  115. @ApiOperation("新增接口")
  116. @PostMapping("saveOrUpdate")
  117. public ResultData saveOrUpdate(@RequestBody UserMouldVideo record) {
  118. logger.debug("[" + getIpAddr() + "] MouldPatchController::saveOrUpdate");
  119. record.setUserId(getMemberId());
  120. if(record.getId() != null){
  121. UserMouldVideo userMouldVideo = userMouldVideoService.findVideo(record.getId());
  122. if(userMouldVideo == null){
  123. return new ResultData(ErrorCode.SYS_SERVER_ERROR);
  124. }
  125. if(EnumVideoStatus.ing.getCode().equals(userMouldVideo.getVideoStatus())
  126. || EnumVideoStatus.success.getCode().equals(userMouldVideo.getVideoStatus())
  127. || EnumVideoStatus.upload_ing.getCode().equals(userMouldVideo.getVideoStatus())
  128. || EnumVideoStatus.upload_fail.getCode().equals(userMouldVideo.getVideoStatus())){
  129. return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"视频生成中");
  130. }
  131. if(EnumVideoStatus.upload_success.getCode().equals(userMouldVideo.getVideoStatus())){
  132. //上传阿里云状态 生成成功
  133. return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"视频已生成完成");
  134. }
  135. }
  136. if(record.getPersonMouldId() == null){
  137. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未选择数字人");
  138. }
  139. return userMouldVideoService.saveOrUpdate(record);
  140. }
  141. @ApiOperation("生成视频")
  142. @PostMapping("createVideo")
  143. public ResultData create(@RequestBody UserMouldVideo record) {
  144. logger.debug("[" + getIpAddr() + "] MouldPatchController::saveOrUpdate");
  145. if(record.getId() == null){
  146. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
  147. }
  148. UserMouldVideo mouldVideo = userMouldVideoService.getById(record.getId());
  149. logger.info("TEST--"+ JSONObject.toJSONString(mouldVideo));
  150. if(mouldVideo == null || !mouldVideo.getUserId().equals(getMemberId())){
  151. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未找到用户数据");
  152. }
  153. if(StringUtils.isEmpty(mouldVideo.getPaperwork())){
  154. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未填写视频文案");
  155. }
  156. if(EnumVideoStatus.ing.getCode().equals(mouldVideo.getVideoStatus())
  157. || EnumVideoStatus.success.getCode().equals(mouldVideo.getVideoStatus())
  158. || EnumVideoStatus.upload_ing.getCode().equals(mouldVideo.getVideoStatus())
  159. || EnumVideoStatus.upload_fail.getCode().equals(mouldVideo.getVideoStatus())){
  160. return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"视频生成中");
  161. }
  162. if(EnumVideoStatus.upload_success.getCode().equals(mouldVideo.getVideoStatus())){
  163. //上传阿里云状态 生成成功
  164. return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"视频已生成完成");
  165. }
  166. UserMouldVideo mouldVideoUpd = new UserMouldVideo();
  167. mouldVideoUpd.setId(record.getId());
  168. mouldVideoUpd.setVideoStatus(EnumVideoStatus.ing.getCode());
  169. mouldVideoUpd.setVideoMsg("");
  170. mouldVideoUpd.setCreateVideoDate(new Date());
  171. userMouldVideoService.saveOrUpdate(mouldVideoUpd);
  172. userMouldVideoService.createVideo(mouldVideo);
  173. return new ResultData();
  174. }
  175. @ApiOperation("根据id查询接口")
  176. @GetMapping("/findVideo")
  177. @ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true)
  178. public ResultData findVideo(Long id) {
  179. logger.debug("[" + getIpAddr() + "] MouldPatchController::findVideo");
  180. UserMouldVideo userMouldVideo = userMouldVideoService.findVideo(id);
  181. // if(EnumVideoStatus.upload_ing.getCode().equals(userMouldVideo.getVideoStatus())
  182. // || EnumVideoStatus.upload_success.getCode().equals(userMouldVideo.getVideoStatus())
  183. // || EnumVideoStatus.upload_fail.getCode().equals(userMouldVideo.getVideoStatus())){
  184. // //上传阿里云状态 都是生成成功
  185. // userMouldVideo.setVideoStatus(EnumVideoStatus.success.getCode());
  186. // }
  187. return new ResultData(userMouldVideo);
  188. }
  189. @GetMapping(value = "/videoDetial")
  190. @ApiOperation("视频详情")
  191. @ApiImplicitParams({
  192. @ApiImplicitParam(name = "videoId", value = "视频编号", dataType = "String", paramType = "query", required = true)})
  193. public ResultData videoDetial(String videoId) {
  194. try {
  195. VideUploadResult videoDetail = videoFactory.getExcutor(videoType).getVideoDetailWithCache(videoId,true);
  196. return new ResultData(videoDetail);
  197. } catch (Exception e) {
  198. logger.error(e.getMessage());
  199. return new ResultData(ErrorCode.PICTURE_ANALYZING_ERROR);
  200. }
  201. }
  202. @AuthIgnore
  203. @SneakyThrows
  204. @GetMapping("exportVideo")
  205. public void exportVideo(Long id, HttpServletRequest request, HttpServletResponse response) {
  206. logger.debug("[" + getIpAddr() + "] UserMouldVideoController::exportVideo");
  207. response.reset();
  208. File tmpFile = null;
  209. OutputStream outputStream = null;
  210. try {
  211. outputStream = response.getOutputStream();
  212. } catch (IOException e) {
  213. throw new MallinkException(ErrorCode.SYS_SERVER_ERROR);
  214. }
  215. try{
  216. if(id == null){
  217. throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL);
  218. }
  219. UserMouldVideo mouldVideo = userMouldVideoService.getById(id);
  220. // if(mouldVideo == null || !mouldVideo.getUserId().equals(getMemberId())){
  221. // throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未找到用户数据");
  222. // }
  223. if(!EnumVideoStatus.upload_success.getCode().equals(mouldVideo.getVideoStatus())){
  224. throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"视频未生成成功");
  225. }
  226. //获取响应的输出流
  227. InputStream inputStream = new URL(mouldVideo.getVideoPlayUrl()).openStream();
  228. //获取从那个字节开始读取文件
  229. // String rangeString = request.getHeader("Range");
  230. // if(StringUtils.isNotBlank(rangeString)){
  231. // tmpFile = FileUtils.createTmpFile(inputStream, mouldVideo.getId().toString(), "mp4");
  232. // RandomAccessFile targetFile = new RandomAccessFile(tmpFile, "r");
  233. // long fileLength = targetFile.length();
  234. // long range = Long.valueOf(rangeString.substring(rangeString.indexOf("=") + 1, rangeString.indexOf("-")));
  235. // //设置内容类型
  236. // response.setHeader("Content-Type", "video/mp4");
  237. // //设置此次相应返回的数据长度
  238. // response.setHeader("Content-Length", String.valueOf(fileLength - range));
  239. // //设置此次相应返回的数据范围
  240. // response.setHeader("Content-Range", "bytes "+range+"-"+(fileLength-1)+"/"+fileLength);
  241. // //返回码需要为206,而不是200
  242. // response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
  243. // //设定文件读取开始位置(以字节为单位)
  244. // targetFile.seek(range);
  245. //
  246. // byte[] cache = new byte[1024 * 300];
  247. // int flag;
  248. // while ((flag = targetFile.read(cache))!=-1){
  249. // outputStream.write(cache, 0, flag);
  250. // }
  251. // }else{
  252. response.setHeader("Content-Disposition", "attachment; filename="
  253. + URLEncoder.encode(mouldVideo.getId()+".mp4", "UTF-8"));
  254. //解决编码问题
  255. response.setCharacterEncoding("UTF-8");
  256. response.setHeader("Content-Type","application/octet-stream");
  257. byte[] cache = new byte[1024 * 300];
  258. int flag;
  259. while ((flag = inputStream.read(cache))!=-1){
  260. outputStream.write(cache, 0, flag);
  261. }
  262. // }
  263. }catch(MallinkException e){
  264. ResultData resultData = new ResultData(e.getErrorCode(), e.getMessage());
  265. //解决编码问题
  266. response.setCharacterEncoding("UTF-8");
  267. response.setHeader("Content-Type","application/json");
  268. outputStream.write(JSONObject.toJSONString(resultData).getBytes(StandardCharsets.UTF_8));
  269. }finally {
  270. if (tmpFile != null) {
  271. tmpFile.delete();
  272. }
  273. outputStream.flush();
  274. outputStream.close();
  275. }
  276. }
  277. }