后台服务
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.

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