Forráskód Böngészése

Merge branch '20250925-wyp-uploadVideo' into test

wangyunpeng 3 hete
szülő
commit
7f5e73adef
23 módosított fájl, 601 hozzáadás és 53 törlés
  1. 6 3
      api-module/src/main/java/com/tzld/piaoquan/api/common/enums/EnumUploadFileType.java
  2. 42 0
      api-module/src/main/java/com/tzld/piaoquan/api/common/enums/contentplatform/UploadVideoAuditStatusEnum.java
  3. 1 1
      api-module/src/main/java/com/tzld/piaoquan/api/component/VideoApiService.java
  4. 10 0
      api-module/src/main/java/com/tzld/piaoquan/api/config/AliOssConfig.java
  5. 20 0
      api-module/src/main/java/com/tzld/piaoquan/api/controller/FileController.java
  6. 2 1
      api-module/src/main/java/com/tzld/piaoquan/api/controller/contentplatform/ContentPlatformSettingController.java
  7. 20 0
      api-module/src/main/java/com/tzld/piaoquan/api/controller/contentplatform/ContentPlatformUploadContentController.java
  8. 5 0
      api-module/src/main/java/com/tzld/piaoquan/api/dao/mapper/contentplatform/ext/ContentPlatformPlanMapperExt.java
  9. 57 0
      api-module/src/main/java/com/tzld/piaoquan/api/job/contentplatform/ContentPlatformVideoJob.java
  10. 15 0
      api-module/src/main/java/com/tzld/piaoquan/api/model/param/contentplatform/OssUploadSignParam.java
  11. 196 0
      api-module/src/main/java/com/tzld/piaoquan/api/model/param/contentplatform/VideoApiBaseParam.java
  12. 1 1
      api-module/src/main/java/com/tzld/piaoquan/api/model/param/contentplatform/WxWebLoginParam.java
  13. 11 0
      api-module/src/main/java/com/tzld/piaoquan/api/model/po/contentplatform/ContentPlatformUploadVideo.java
  14. 60 0
      api-module/src/main/java/com/tzld/piaoquan/api/model/po/contentplatform/ContentPlatformUploadVideoExample.java
  15. 14 0
      api-module/src/main/java/com/tzld/piaoquan/api/model/vo/contentplatform/SignatureVO.java
  16. 2 3
      api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/impl/ContentPlatformPlanServiceImpl.java
  17. 3 0
      api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/impl/ContentPlatformSettingServiceImpl.java
  18. 8 5
      api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/impl/ContentPlatformUploadContentServiceImpl.java
  19. 30 30
      api-module/src/main/java/com/tzld/piaoquan/api/util/AliOssFileTool.java
  20. 2 1
      api-module/src/main/resources/application.properties
  21. 23 6
      api-module/src/main/resources/mapper/contentplatform/ContentPlatformUploadVideoMapper.xml
  22. 9 2
      api-module/src/main/resources/mapper/contentplatform/ext/ContentPlatformPlanMapperExt.xml
  23. 64 0
      common-module/src/main/java/com/tzld/piaoquan/growth/common/utils/RandomUtil.java

+ 6 - 3
api-module/src/main/java/com/tzld/piaoquan/api/common/enums/EnumUploadFileType.java

@@ -1,11 +1,14 @@
 package com.tzld.piaoquan.api.common.enums;
 
 public enum EnumUploadFileType {
-	FILE(4,"4"),
-	GIF(5,"5"),
+	PICTURE(1,"1"),
 	VIDEO(2,"2"),
 	VOICE(3,"3"),
-	PICTURE(1,"1");
+	FILE(4,"4"),
+	GIF(5,"5"),
+	SUBTITLE(6,"6"),
+	;
+
 	private Integer intType;
 	private String strType;
 	EnumUploadFileType(Integer intType, String strType){

+ 42 - 0
api-module/src/main/java/com/tzld/piaoquan/api/common/enums/contentplatform/UploadVideoAuditStatusEnum.java

@@ -0,0 +1,42 @@
+package com.tzld.piaoquan.api.common.enums.contentplatform;
+
+import lombok.Getter;
+
+@Getter
+public enum UploadVideoAuditStatusEnum {
+    WAIT_AUDIT(0, "待审核"),
+    AUDITING(1, "审核中"),
+    AUDIT_PASS(2, "审核通过"),
+    AUDIT_REJECT(3, "审核不通过"),
+
+    other(999, "其他");
+
+    // 状态 0-待审核 1-审核中 2-审核通过 3-审核不通过
+    private final int val;
+    private final String description;
+
+    UploadVideoAuditStatusEnum(int val, String description) {
+        this.val = val;
+        this.description = description;
+    }
+
+    public static UploadVideoAuditStatusEnum from(int val) {
+        for (UploadVideoAuditStatusEnum typeEnum : UploadVideoAuditStatusEnum.values()) {
+            if (typeEnum.getVal() == val) {
+                return typeEnum;
+            }
+        }
+        return other;
+    }
+
+    public static UploadVideoAuditStatusEnum from(String description) {
+        for (UploadVideoAuditStatusEnum typeEnum : UploadVideoAuditStatusEnum.values()) {
+            if (typeEnum.getDescription().equals(description)) {
+                return typeEnum;
+            }
+        }
+        return other;
+    }
+
+
+}

+ 1 - 1
api-module/src/main/java/com/tzld/piaoquan/api/component/ManagerApiService.java → api-module/src/main/java/com/tzld/piaoquan/api/component/VideoApiService.java

@@ -11,7 +11,7 @@ import java.util.List;
 
 @Slf4j
 @Component
-public class ManagerApiService {
+public class VideoApiService {
 
     @Autowired
     private HttpPoolClient httpPoolClient;

+ 10 - 0
api-module/src/main/java/com/tzld/piaoquan/api/config/AliOssConfig.java

@@ -87,6 +87,7 @@ public class AliOssConfig {
 	public static String cdnDomain;
 	public static String imgDomain;
 	public static String videoDomain;
+	public static String uploadDomain;
 	public static String lvvideoDomain;
 	public static String pubBucket;
 	public static String priBucket;
@@ -108,6 +109,7 @@ public class AliOssConfig {
 			setCdnDomain(cdnDomain);
 			setImgDomain(imgDomain);
 			setVideoDomain(videoDomain);
+			setUploadDomain(uploadDomain);
 			setInternalEndPoint(internalEndPoint);
 			setPubBucket(pubBucket);
 			try{
@@ -325,6 +327,14 @@ public class AliOssConfig {
 		AliOssConfig.expiration = expiration;
 	}
 
+	public static String getUploadDomain() {
+		return uploadDomain;
+	}
+	@Value("${cdn.upload.domain}")
+	public void setUploadDomain(String uploadDomain) {
+		AliOssConfig.uploadDomain = uploadDomain;
+	}
+
 	public static PolicyDetailVO getPolicyDetail() {
 		return policyDetail;
 	}

+ 20 - 0
api-module/src/main/java/com/tzld/piaoquan/api/controller/FileController.java

@@ -1,13 +1,18 @@
 package com.tzld.piaoquan.api.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.stuuudy.commons.external.filestorage.enums.EnumPublicBuckets;
 import com.tzld.piaoquan.api.common.enums.ExceptionEnum;
 import com.tzld.piaoquan.api.common.exception.CommonException;
 import com.tzld.piaoquan.api.config.AliOssConfig;
 import com.tzld.piaoquan.api.model.param.FileUploadParam;
+import com.tzld.piaoquan.api.model.param.contentplatform.OssUploadSignParam;
 import com.tzld.piaoquan.api.model.vo.FileInfo;
+import com.tzld.piaoquan.api.model.vo.contentplatform.SignatureVO;
 import com.tzld.piaoquan.api.util.AliOssFileTool;
 import com.tzld.piaoquan.growth.common.common.base.CommonResponse;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.validation.BindingResult;
 import org.springframework.validation.annotation.Validated;
@@ -20,6 +25,7 @@ import java.io.IOException;
 
 @RestController
 @RequestMapping("/file")
+@Slf4j
 public class FileController {
 
     @CrossOrigin(origins = "*")
@@ -48,4 +54,18 @@ public class FileController {
         return CommonResponse.create(fileInfo);
     }
 
+    @CrossOrigin(origins = "*")
+    @PostMapping("/signature")
+    @ApiOperation(value = "获取签名")
+    public CommonResponse<SignatureVO> signature(@Validated OssUploadSignParam ossUploadSignParam) {
+        log.info("获取OSS签名失败 param" + JSON.toJSONString(ossUploadSignParam));
+        SignatureVO signatureVO;
+        try {
+            signatureVO = AliOssFileTool.getUploadPolicy(ossUploadSignParam.getFileType());
+        } catch (Exception e) {
+            log.error("获取OSS签名失败", e);
+            return CommonResponse.create(ExceptionEnum.SYSTEM_ERROR.getCode(), "获取OSS签名失败");
+        }
+        return CommonResponse.success(signatureVO);
+    }
 }

+ 2 - 1
api-module/src/main/java/com/tzld/piaoquan/api/controller/contentplatform/ContentPlatformSettingController.java

@@ -6,6 +6,7 @@ import com.tzld.piaoquan.api.service.contentplatform.ContentPlatformSettingServi
 import com.tzld.piaoquan.growth.common.common.base.CommonResponse;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 @RestController
@@ -18,7 +19,7 @@ public class ContentPlatformSettingController {
 
     @ApiOperation(value = "票圈账号绑定")
     @PostMapping(value = "/webLogin")
-    public CommonResponse<WxBaseUserInfoVO> wxLoginByWeb(@RequestBody WxWebLoginParam param) {
+    public CommonResponse<WxBaseUserInfoVO> wxLoginByWeb(@Validated WxWebLoginParam param) {
         return CommonResponse.success(service.wxLoginByWeb(param));
     }
 

+ 20 - 0
api-module/src/main/java/com/tzld/piaoquan/api/controller/contentplatform/ContentPlatformUploadContentController.java

@@ -1,5 +1,7 @@
 package com.tzld.piaoquan.api.controller.contentplatform;
 
+import com.tzld.piaoquan.api.annotation.JwtIgnore;
+import com.tzld.piaoquan.api.job.contentplatform.ContentPlatformVideoJob;
 import com.tzld.piaoquan.api.model.param.contentplatform.DeleteVideoParam;
 import com.tzld.piaoquan.api.model.param.contentplatform.PublishVideoParam;
 import com.tzld.piaoquan.api.model.param.contentplatform.UploadVideoListParam;
@@ -19,6 +21,8 @@ public class ContentPlatformUploadContentController {
 
     @Autowired
     ContentPlatformUploadContentService service;
+    @Autowired
+    ContentPlatformVideoJob job;
 
     @ApiOperation(value = "发布视频")
     @PostMapping("/publishVideo")
@@ -52,4 +56,20 @@ public class ContentPlatformUploadContentController {
         return CommonResponse.success(service.uploadVideoList(param));
     }
 
+    @JwtIgnore
+    @ApiOperation(value = "同步手动上传视频裂变分", hidden = true)
+    @GetMapping("/job/syncContentPlatformUploadVideoScoreJob")
+    public CommonResponse<Void> syncContentPlatformUploadVideoScoreJob() {
+        job.syncContentPlatformUploadVideoScoreJob(null);
+        return CommonResponse.success();
+    }
+
+    @JwtIgnore
+    @ApiOperation(value = "检查手动上传视频状态", hidden = true)
+    @GetMapping("/job/checkContentPlatformUploadVideoStatusJob")
+    public CommonResponse<Void> checkContentPlatformUploadVideoStatusJob() {
+        job.checkContentPlatformUploadVideoStatusJob(null);
+        return CommonResponse.success();
+    }
+
 }

+ 5 - 0
api-module/src/main/java/com/tzld/piaoquan/api/dao/mapper/contentplatform/ext/ContentPlatformPlanMapperExt.java

@@ -124,4 +124,9 @@ public interface ContentPlatformPlanMapperExt {
                                                   @Param("offset") int offset,
                                                   @Param("pageSize") Integer pageSize,
                                                   @Param("sort") String sort);
+
+    void updateUploadVideoStatusWithOldStatus(@Param("videoId") Long videoId,
+                                              @Param("status") Integer status,
+                                              @Param("now") Long now);
+
 }

+ 57 - 0
api-module/src/main/java/com/tzld/piaoquan/api/job/contentplatform/ContentPlatformVideoJob.java

@@ -2,6 +2,7 @@ package com.tzld.piaoquan.api.job.contentplatform;
 
 import com.aliyun.odps.data.Record;
 import com.google.common.collect.Lists;
+import com.tzld.piaoquan.api.common.enums.contentplatform.UploadVideoAuditStatusEnum;
 import com.tzld.piaoquan.api.dao.mapper.contentplatform.*;
 import com.tzld.piaoquan.api.dao.mapper.contentplatform.ext.ContentPlatformPlanMapperExt;
 import com.tzld.piaoquan.api.model.po.contentplatform.*;
@@ -46,6 +47,9 @@ public class ContentPlatformVideoJob {
     @Autowired
     private MessageAttachmentService messageAttachmentService;
 
+    @Autowired
+    ContentPlatformUploadVideoMapper uploadVideoMapper;
+
     @Value("${video.agg.days:3}")
     private Integer videoAggDays;
 
@@ -325,6 +329,59 @@ public class ContentPlatformVideoJob {
         return videoDataStatMapper.selectByExample(example);
     }
 
+    @XxlJob("syncContentPlatformUploadVideoScoreJob")
+    public ReturnT<String> syncContentPlatformUploadVideoScoreJob(String param) {
+        String aggDt = DateUtil.getBeforeDayDateString("yyyyMMdd");
+        List<ContentPlatformVideoAgg> saveAggList = getVideoListByDt(aggDt);
+        Map<Long, ContentPlatformVideoAgg> videoIdMap = saveAggList.stream().collect(Collectors.toMap(ContentPlatformVideoAgg::getVideoId, o -> o));
+        List<ContentPlatformUploadVideo> uploadVideoList = getAllUploadVideo();
+        if (CollectionUtils.isNotEmpty(uploadVideoList)) {
+            for (ContentPlatformUploadVideo uploadVideo : uploadVideoList) {
+                ContentPlatformVideoAgg agg = videoIdMap.get(uploadVideo.getVideoId());
+                if (Objects.nonNull(agg)) {
+                    uploadVideo.setScore(agg.getScore());
+                    uploadVideoMapper.updateByPrimaryKeySelective(uploadVideo);
+                }
+            }
+        }
+        return ReturnT.SUCCESS;
+    }
+
+    private List<ContentPlatformUploadVideo> getAllUploadVideo() {
+        ContentPlatformUploadVideoExample example = new ContentPlatformUploadVideoExample();
+        example.createCriteria().andIsDeleteEqualTo(0);
+        return uploadVideoMapper.selectByExample(example);
+    }
+
+    @XxlJob("checkContentPlatformUploadVideoStatusJob")
+    public ReturnT<String> checkContentPlatformUploadVideoStatusJob(String param) {
+        List<ContentPlatformUploadVideo> uploadVideoList = getAllUploadVideo();
+        Long now = System.currentTimeMillis();
+        for (List<ContentPlatformUploadVideo> partition : Lists.partition(uploadVideoList, 20)) {
+            List<Long> videoIds = partition.stream().map(ContentPlatformUploadVideo::getVideoId).collect(Collectors.toList());
+            Map<Long, VideoDetail> videoDetailMap = messageAttachmentService.getVideoDetail(new HashSet<>(videoIds));
+            for (ContentPlatformUploadVideo video : partition) {
+                VideoDetail videoDetail = videoDetailMap.get(video.getVideoId());
+                if (videoDetail == null || videoDetail.getAuditStatus() != 5) {
+                    updateUploadVideoStatusWithOldStatus(video.getVideoId(), UploadVideoAuditStatusEnum.AUDIT_REJECT.getVal(), now);
+                }
+            }
+        }
+        // 检查视频是否违规
+        List<ContentPlatformIllegalVideo> illegalVideoList = getAllIllegalVideoList();
+        List<Long> illegalVideoIds = illegalVideoList.stream().map(ContentPlatformIllegalVideo::getVideoId).collect(Collectors.toList());
+        if (CollectionUtils.isNotEmpty(illegalVideoIds)) {
+            for (Long illegalVideoId : illegalVideoIds) {
+                updateUploadVideoStatusWithOldStatus(illegalVideoId, UploadVideoAuditStatusEnum.AUDIT_REJECT.getVal(), now);
+            }
+        }
+        return ReturnT.SUCCESS;
+    }
+
+    private void updateUploadVideoStatusWithOldStatus(Long videoId, Integer status, Long now) {
+        planMapperExt.updateUploadVideoStatusWithOldStatus(videoId, status, now);
+    }
+
 }
 
 

+ 15 - 0
api-module/src/main/java/com/tzld/piaoquan/api/model/param/contentplatform/OssUploadSignParam.java

@@ -0,0 +1,15 @@
+package com.tzld.piaoquan.api.model.param.contentplatform;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+public class OssUploadSignParam extends VideoApiBaseParam {
+
+	@ApiModelProperty(value = "文件类型1:picture 2:视频 3:声音 4:文件  5:gif 6:字幕", required = true)
+	@NotNull
+	private Integer fileType;
+
+}

+ 196 - 0
api-module/src/main/java/com/tzld/piaoquan/api/model/param/contentplatform/VideoApiBaseParam.java

@@ -0,0 +1,196 @@
+package com.tzld.piaoquan.api.model.param.contentplatform;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class VideoApiBaseParam {
+
+	//用户登陆相关的参数
+	@ApiModelProperty(value = "公共参数-登录用户ID")
+	private Long loginUid;
+	@ApiModelProperty(value = "公共参数-token值")
+	private String token;
+
+	//APP相关的参数
+	@ApiModelProperty(value = "公共参数-版本号")
+	private Integer versionCode;
+	@ApiModelProperty(value = "公共参数-app发布版本")
+	private String versionName;
+	@ApiModelProperty(value = "公共参数-产品类型:0-VLOG,1-轻趣视频,2-搞笑视频,3-爱电影,4-爱生活,5-长视频,6-短视频,7-惊奇视频,8-PC端,9-票圈长视频APP,10-票圈长视频lite,11-票圈相册,12-H5,13-票圈视频APP,14-小程序极速版,15-闪音卡点APP,16-社区APP")
+	private Integer appType;
+	@ApiModelProperty(value = "公共参数-appid")
+	private String appId;
+
+	//手机设备信息相关的参数
+	@ApiModelProperty(value = "公共参数-手机设备的唯一码")
+	private String machineCode;
+	@ApiModelProperty(value = "公共参数-ios,android")
+	private String platform;
+	@ApiModelProperty(value = "公共参数-精确到ios,android的哪个版本")
+	private String system;
+	@ApiModelProperty(value = "公共参数-手机信息")
+	private String machineInfo;
+	@ApiModelProperty(value = "公共参数-网络类型")
+	private String networkType;
+	@ApiModelProperty(value = "公共参数-客户端ip")
+	private String clientIp;
+
+	//pageSource相关的参数
+	@ApiModelProperty(value = "公共参数-页面来源")
+	private String pageSource;
+	@ApiModelProperty(value = "公共参数-页面分类ID,只在首页分发列表中才有")
+	private Long pageCategoryId;
+	@ApiModelProperty(value = "公共参数-root页面来源")
+	private String rootPageSource;
+	@ApiModelProperty(value = "公共参数-root页面分类ID")
+	private Long rootPageCategoryId;
+	@ApiModelProperty(value = "公共参数-root页面时间戳")
+	private Long rootPageTimestamp;
+
+	//某次操作相关的参数
+	@ApiModelProperty(value = "公共参数-小程序打开类型")
+	private String openType;
+	@ApiModelProperty(value = "公共参数-前端请求时间")
+	private Long clientTimestamp;
+	@ApiModelProperty(value = "公共参数-sessionId")
+	private String sessionId;
+
+	//视频相关的参数
+	@ApiModelProperty(value = "公共参数-视频加载时长,毫秒")
+	private Long videoLoadTime;
+	@ApiModelProperty(value = "公共参数-视频事件发生的时间点,相对于视频时长,秒")
+	private Long videoEventTime;
+	@ApiModelProperty(value = "公共参数-videoPlayError事件,播放器返回的错误信息")
+	private String errorMsg;
+
+	//分享相关的参数
+	@ApiModelProperty(value = "公共参数-分享的深度")
+	private Integer shareDepth;
+	@ApiModelProperty(value = "公共参数-分享者手机设备的唯一码,只有在分享页才有")
+	private String shareMachineCode;
+	@ApiModelProperty(value = "公共参数-分享者uid,只有在分享页才有")
+	private Long shareUid;
+	@ApiModelProperty(value = "公共参数-是否为分享页标识,0:不是分享页,1:是分享页")
+	private Integer sharePageFlag;
+	@ApiModelProperty(value = "公共参数-分享按钮类型")
+	private Integer shareButtonType;
+	@ApiModelProperty(value = "公共参数-从哪个产品分享出来的")
+	private Integer shareAppType;
+
+	@ApiModelProperty(value = "公共参数-0 综合模块 1 feed流 ")
+	private String sharePageType;
+	@ApiModelProperty(value = "公共参数-分享页跳转")
+	private String videoShareJumpModel;
+	//推荐相关的参数
+	@ApiModelProperty(value = "公共参数-推荐来源 0 默认")
+	private Integer recommendSource = 0;
+
+	@ApiModelProperty(value = "公共参数-视频上报数据,使用后端返回的原样数据")
+	private String videoReportMeta;
+
+	@ApiModelProperty(value = "公共参数-事件ID")
+	private String eventId;
+	@ApiModelProperty(value = "公共参数-root事件ID")
+	private String rootEventId;
+
+	@ApiModelProperty(value = "公共参数-root分享页面类型")
+	private String rootSharePageType;
+	@ApiModelProperty(value = "公共参数-自动标志位类型")
+	private String autoType;
+	@ApiModelProperty(value = "公共参数-动作发生的页面位置")
+	private String actionPosition;
+
+	@ApiModelProperty(value = "公共参数-运营消息ID")
+	private String operationMsgId;
+	@ApiModelProperty(value = "公共参数-playId")
+	private String playId;
+	@ApiModelProperty(value = "公共参数-活动id")
+	private String activityId;
+
+	@ApiModelProperty(value = "公共参数-AB信息")
+	private String abInfoData;
+
+	// h5
+	@ApiModelProperty(value = "公共参数-h5分享id")
+	private String h5ShareId;
+	@ApiModelProperty(value = "公共参数-h5打开场景")
+	private String h5OpenFrom;
+	@ApiModelProperty(value = "公共参数-h5分享场景")
+	private String h5ShareFrom;
+	@ApiModelProperty(value = "公共参数-h5页面-小程序分享根源rootPageSource")
+	private String h5WxRootPageSource;
+
+	@ApiModelProperty(value = "公共参数-搜索上报")
+	private String searchActionCode;
+
+	@ApiModelProperty(value = "公共参数-AB的根实验集合")
+	private String rootEventIds;
+
+	@ApiModelProperty(value = "公共参数-returnId")
+	private String returnId;
+	@ApiModelProperty(value = "公共参数-viewId")
+	private String viewId;
+	@ApiModelProperty(value = "公共参数-shareId")
+	private String shareId;
+	@ApiModelProperty(value = "公共参数-subSessionId")
+	private String subSessionId;
+
+	@ApiModelProperty(value = "公共参数-headVideoId")
+	private String headVideoId;
+    @ApiModelProperty(value = "公共参数-推荐链路ID")
+    private String recommendId;
+	@ApiModelProperty(value = "公共参数-推荐日志对象")
+	private String recommendLogVO;
+
+	@ApiModelProperty(value = "公共参数-分享ID")
+	private String jumpHomeVideoId;
+	@ApiModelProperty(value = "公共参数-根分享ID")
+	private String rootJumpHomeVideoId;
+
+	@ApiModelProperty(value = "公共参数-小程序打开场景")
+	private Integer senceType=-1;
+	@ApiModelProperty(value = "公共参数-小程序打开场景 热启动")
+	private Integer hotSenceType;
+	@ApiModelProperty(value = "公共参数-rootMid")
+	private String rootMid;
+	@ApiModelProperty(value = "公共参数-渠道:yybstore xmstore hwstore oppostore vivostore sougou bdstore mzstore store360 douyin kuaishou")
+	private String appChannel;
+	//	@ApiModelProperty(value = "微信AB实验参数 例如:22031801")
+//	private String wechatAbcode;
+	@ApiModelProperty(value = "通过微信实验分流获取到的对应数据")
+    private String abExpInfo; //Map<String, List<AbExpItemDTO>>
+    @ApiModelProperty(value = "H5")
+    private Long adBlockVideoId;
+
+    private Boolean showDistribute;
+
+    private Boolean showShare;
+
+    private Boolean showFocusExp;
+
+    private Boolean isFirstPageOrFirstPageFeed;
+
+	private String newExpGroup;
+
+	private Boolean isTest;
+	/**
+	 * 代表用户来自哪个外部来源,包括:公众号文章、投流等等,
+	 */
+	private String rootSourceId;
+	/**
+	 * 代表一个通过分享卡片进入的用户,他最初来自哪个用户mid的分享
+	 */
+	private String rootShareMid;
+	/**
+	 * 代表一个通过分享卡片进入的用户,他最初来自哪个用户mid的哪次冷启动sessionId的分享
+	 */
+	private String rootSessionId;
+
+	private String rootShareId;
+	/**
+	 * 微信群ID
+	 */
+	private String openGId;
+
+}

+ 1 - 1
api-module/src/main/java/com/tzld/piaoquan/api/model/param/contentplatform/WxWebLoginParam.java

@@ -5,7 +5,7 @@ import lombok.Data;
 import org.hibernate.validator.constraints.NotBlank;
 
 @Data
-public class WxWebLoginParam {
+public class WxWebLoginParam extends VideoApiBaseParam {
 
     @ApiModelProperty(value = "code")
     @NotBlank(message = "code不能为空")

+ 11 - 0
api-module/src/main/java/com/tzld/piaoquan/api/model/po/contentplatform/ContentPlatformUploadVideo.java

@@ -15,6 +15,8 @@ public class ContentPlatformUploadVideo {
 
     private String auditReason;
 
+    private Double score;
+
     private Integer isDelete;
 
     private Long createAccountId;
@@ -79,6 +81,14 @@ public class ContentPlatformUploadVideo {
         this.auditReason = auditReason;
     }
 
+    public Double getScore() {
+        return score;
+    }
+
+    public void setScore(Double score) {
+        this.score = score;
+    }
+
     public Integer getIsDelete() {
         return isDelete;
     }
@@ -124,6 +134,7 @@ public class ContentPlatformUploadVideo {
         sb.append(", video=").append(video);
         sb.append(", auditStatus=").append(auditStatus);
         sb.append(", auditReason=").append(auditReason);
+        sb.append(", score=").append(score);
         sb.append(", isDelete=").append(isDelete);
         sb.append(", createAccountId=").append(createAccountId);
         sb.append(", createTimestamp=").append(createTimestamp);

+ 60 - 0
api-module/src/main/java/com/tzld/piaoquan/api/model/po/contentplatform/ContentPlatformUploadVideoExample.java

@@ -575,6 +575,66 @@ public class ContentPlatformUploadVideoExample {
             return (Criteria) this;
         }
 
+        public Criteria andScoreIsNull() {
+            addCriterion("score is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andScoreIsNotNull() {
+            addCriterion("score is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andScoreEqualTo(Double value) {
+            addCriterion("score =", value, "score");
+            return (Criteria) this;
+        }
+
+        public Criteria andScoreNotEqualTo(Double value) {
+            addCriterion("score <>", value, "score");
+            return (Criteria) this;
+        }
+
+        public Criteria andScoreGreaterThan(Double value) {
+            addCriterion("score >", value, "score");
+            return (Criteria) this;
+        }
+
+        public Criteria andScoreGreaterThanOrEqualTo(Double value) {
+            addCriterion("score >=", value, "score");
+            return (Criteria) this;
+        }
+
+        public Criteria andScoreLessThan(Double value) {
+            addCriterion("score <", value, "score");
+            return (Criteria) this;
+        }
+
+        public Criteria andScoreLessThanOrEqualTo(Double value) {
+            addCriterion("score <=", value, "score");
+            return (Criteria) this;
+        }
+
+        public Criteria andScoreIn(List<Double> values) {
+            addCriterion("score in", values, "score");
+            return (Criteria) this;
+        }
+
+        public Criteria andScoreNotIn(List<Double> values) {
+            addCriterion("score not in", values, "score");
+            return (Criteria) this;
+        }
+
+        public Criteria andScoreBetween(Double value1, Double value2) {
+            addCriterion("score between", value1, value2, "score");
+            return (Criteria) this;
+        }
+
+        public Criteria andScoreNotBetween(Double value1, Double value2) {
+            addCriterion("score not between", value1, value2, "score");
+            return (Criteria) this;
+        }
+
         public Criteria andIsDeleteIsNull() {
             addCriterion("is_delete is null");
             return (Criteria) this;

+ 14 - 0
api-module/src/main/java/com/tzld/piaoquan/api/model/vo/contentplatform/SignatureVO.java

@@ -0,0 +1,14 @@
+package com.tzld.piaoquan.api.model.vo.contentplatform;
+
+import com.tzld.piaoquan.api.config.AliOssConfig;
+import lombok.Data;
+
+@Data
+public class SignatureVO {
+    private String accessId;
+    private String policy;
+    private String signature;
+    private String fileName;
+    private String host;
+    private String expire;
+}

+ 2 - 3
api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/impl/ContentPlatformPlanServiceImpl.java

@@ -78,7 +78,7 @@ public class ContentPlatformPlanServiceImpl implements ContentPlatformPlanServic
     @Autowired
     private AigcApiService aigcApiService;
     @Autowired
-    private ManagerApiService managerApiService;
+    private VideoApiService videoApiService;
     @Autowired
     private MessageAttachmentService messageAttachmentService;
     @Autowired
@@ -587,7 +587,6 @@ public class ContentPlatformPlanServiceImpl implements ContentPlatformPlanServic
             result.setObjs(new ArrayList<>());
             return result;
         }
-        // todo video.score
         String sort = getVideoContentListSort(param.getSort());
         String type = getVideoContentListType(param.getType());
         String channel = getVideoContentListChannel(param.getSort(), user.getChannel());
@@ -606,7 +605,7 @@ public class ContentPlatformPlanServiceImpl implements ContentPlatformPlanServic
 
     @Override
     public List<String> getVideoContentCoverFrameList(VideoContentCoverFrameParam param) {
-        return managerApiService.getCoverImagePaths(param.getVideoId());
+        return videoApiService.getCoverImagePaths(param.getVideoId());
     }
 
     @Override

+ 3 - 0
api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/impl/ContentPlatformSettingServiceImpl.java

@@ -1,5 +1,6 @@
 package com.tzld.piaoquan.api.service.contentplatform.impl;
 
+import com.tzld.piaoquan.api.component.VideoApiService;
 import com.tzld.piaoquan.api.dao.mapper.contentplatform.ContentPlatformPqAccountRelMapper;
 import com.tzld.piaoquan.api.model.config.LoginUserContext;
 import com.tzld.piaoquan.api.model.param.contentplatform.WxWebLoginParam;
@@ -23,6 +24,8 @@ public class ContentPlatformSettingServiceImpl implements ContentPlatformSetting
 
     @Autowired
     private ContentPlatformPqAccountRelMapper pqAccountRelMapper;
+    @Autowired
+    VideoApiService videoApiService;
 
     @Override
     public WxBaseUserInfoVO wxLoginByWeb(WxWebLoginParam param) {

+ 8 - 5
api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/impl/ContentPlatformUploadContentServiceImpl.java

@@ -1,5 +1,7 @@
 package com.tzld.piaoquan.api.service.contentplatform.impl;
 
+import com.tzld.piaoquan.api.common.enums.contentplatform.UploadVideoAuditStatusEnum;
+import com.tzld.piaoquan.api.component.VideoApiService;
 import com.tzld.piaoquan.api.dao.mapper.contentplatform.ContentPlatformUploadVideoMapper;
 import com.tzld.piaoquan.api.model.config.LoginUserContext;
 import com.tzld.piaoquan.api.model.param.contentplatform.DeleteVideoParam;
@@ -28,6 +30,8 @@ public class ContentPlatformUploadContentServiceImpl implements ContentPlatformU
 
     @Autowired
     ContentPlatformUploadVideoMapper uploadVideoMapper;
+    @Autowired
+    VideoApiService videoApiService;
 
     @Override
     public UploadVideoItemVO publishVideo(PublishVideoParam param) {
@@ -39,7 +43,7 @@ public class ContentPlatformUploadContentServiceImpl implements ContentPlatformU
         uploadVideo.setTitle(param.getTitle());
         uploadVideo.setCover(param.getCoverUrl());
         uploadVideo.setVideo(param.getVideoUrl());
-        uploadVideo.setAuditStatus(0);
+        uploadVideo.setAuditStatus(UploadVideoAuditStatusEnum.WAIT_AUDIT.getVal());
         uploadVideo.setCreateAccountId(user.getId());
         uploadVideo.setCreateTimestamp(System.currentTimeMillis());
         uploadVideo.setUpdateTimestamp(System.currentTimeMillis());
@@ -56,7 +60,7 @@ public class ContentPlatformUploadContentServiceImpl implements ContentPlatformU
         uploadVideo.setTitle(param.getTitle());
         uploadVideo.setCover(param.getCoverUrl());
         uploadVideo.setVideo(param.getVideoUrl());
-        uploadVideo.setAuditStatus(1);
+        uploadVideo.setAuditStatus(UploadVideoAuditStatusEnum.AUDITING.getVal());
         uploadVideo.setUpdateTimestamp(System.currentTimeMillis());
         uploadVideoMapper.updateByPrimaryKeySelective(uploadVideo);
         // todo 调用修改视频接口
@@ -103,14 +107,13 @@ public class ContentPlatformUploadContentServiceImpl implements ContentPlatformU
     public Page<UploadVideoItemVO> uploadVideoList(UploadVideoListParam param) {
         ContentPlatformAccount user = LoginUserContext.getUser();
         Page<UploadVideoItemVO> result = new Page<>(param.getPageNum(), param.getPageSize());
-        int offset = (param.getPageNum() - 1) * param.getPageSize();
         Long count = getUploadVideoCount(param, user.getId());
         result.setTotalSize(count.intValue());
         if (count == 0) {
             result.setObjs(new ArrayList<>());
             return result;
         }
-        List<ContentPlatformUploadVideo> videoList = getUploadVideoList(param, user.getId(), offset, param.getPageSize());
+        List<ContentPlatformUploadVideo> videoList = getUploadVideoList(param, user.getId());
         List<UploadVideoItemVO> list = buildUploadVideoItemVOList(videoList);
         result.setObjs(list);
         return result;
@@ -130,7 +133,7 @@ public class ContentPlatformUploadContentServiceImpl implements ContentPlatformU
         return uploadVideoMapper.countByExample(example);
     }
 
-    private List<ContentPlatformUploadVideo> getUploadVideoList(UploadVideoListParam param, Long id, int offset, Integer pageSize) {
+    private List<ContentPlatformUploadVideo> getUploadVideoList(UploadVideoListParam param, Long id) {
         ContentPlatformUploadVideoExample example = new ContentPlatformUploadVideoExample();
         ContentPlatformUploadVideoExample.Criteria criteria = example.createCriteria();
         if (param.getAuditStatus() != null) {

+ 30 - 30
api-module/src/main/java/com/tzld/piaoquan/api/util/AliOssFileTool.java

@@ -27,9 +27,11 @@ import com.stuuudy.commons.util.CompressImage;
 import com.stuuudy.commons.util.MD5.Md5Util;
 import com.stuuudy.commons.util.exception.CommonsException;
 import com.stuuudy.commons.util.exception.EnumErrorException;
-import com.tzld.piaoquan.api.config.AliOssConfig;
 import com.tzld.piaoquan.api.common.enums.EnumUploadFileType;
+import com.tzld.piaoquan.api.config.AliOssConfig;
+import com.tzld.piaoquan.api.model.vo.contentplatform.SignatureVO;
 import com.tzld.piaoquan.growth.common.utils.DateUtils;
+import com.tzld.piaoquan.growth.common.utils.RandomUtil;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -513,6 +515,7 @@ public class AliOssFileTool extends AliOssConfig {
         }
         return "";
     }
+
     /**
      * (重命名文件,实现是先拷贝文件,再删掉旧的文件)<BR>
      * 方法名:renameFile<BR>
@@ -737,48 +740,45 @@ public class AliOssFileTool extends AliOssConfig {
         }
     }
 
-    public static Map<String, String> getUploadPolicy(String fileName, Integer fileType, String bucketName)
-            throws Exception {
-
+    public static SignatureVO getUploadPolicy(Integer fileType) throws Exception {
+        // 后台随机生成唯一文件名
+        String env = PropertiesUtils.getProjectEnv();
+        if (StringUtils.isEmpty(env)) {
+            env = "qa";
+        }
+        String fileName = RandomUtil.generate18String();
+        String contentType = "";
         if (EnumUploadFileType.VIDEO.getIntType().equals(fileType)) {
-            fileName = "/video/" + fileName;
+            fileName = "/video/" + env + "/" + DateUtils.dateToStringyyyyMMdd(new Date()) + "/" + fileName;
         } else if (EnumUploadFileType.VOICE.getIntType().equals(fileType)) {
-            fileName = "/voice/" + fileName;
-        } else if (EnumUploadFileType.FILE.getIntType().equals(fileType)) {
-            fileName = "/file/" + fileName;
+            fileName = "/voice/" + env + "/" + DateUtils.dateToStringyyyyMMdd(new Date()) + "/" + fileName;
         } else {
-            fileName = "/pic/" + fileName;
+            fileName = "/pic/" + env + "/" + DateUtils.dateToStringyyyyMMdd(new Date()) + "/" + fileName;
         }
-        // String host = "http://" + bucket + "." + AliOssConfig.getOssEndPoint();
-
         long expireTime = 60 * 60 * 4;
         long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
         Date expiration = new Date(expireEndTime);
         PolicyConditions policyConds = new PolicyConditions();
-        policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 5261334938L);
-
-        policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY,
+        //4.95G  上限是5个G
+        policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 5261334938l);
+        policyConds.addConditionItem(MatchMode.Exact, PolicyConditions.COND_KEY,
                 AliOssConfig.getProjectName() + fileName);
+        if (!StringUtils.isEmpty(contentType)) {
+            policyConds.addConditionItem(PolicyConditions.COND_CONTENT_TYPE, contentType);
+        }
+
         String postPolicy = AliOssConfig.getOssClient().generatePostPolicy(expiration, policyConds);
         byte[] binaryData = postPolicy.getBytes("utf-8");
         String encodedPolicy = BinaryUtil.toBase64String(binaryData);
         String postSignature = AliOssConfig.getOssClient().calculatePostSignature(postPolicy);
-        Map<String, String> respMap = new LinkedHashMap<String, String>();
-        respMap.put("accessId", AliOssConfig.getAccessKeyId());
-        respMap.put("policy", encodedPolicy);
-        respMap.put("signature", postSignature);
-        respMap.put("fileName", AliOssConfig.getProjectName() + fileName);
-
-        if ("clipres".equals(bucketName)) {
-            respMap.put("host", PropertiesUtils.getValue("oss.clipres.upload.domain"));
-        } else {
-            respMap.put("host", AliOssConfig.getLvvideoDomain());
-        }
-
-        // respMap.put("host", "https://oss.zuluki.com");
-        // respMap.put("callback", getCallBackStr(signUploadParams));
-        respMap.put("expire", String.valueOf(expireEndTime / 1000));
-        return respMap;
+        SignatureVO signatureVO = new SignatureVO();
+        signatureVO.setAccessId(AliOssConfig.getAccessKeyId());
+        signatureVO.setPolicy(encodedPolicy);
+        signatureVO.setSignature(postSignature);
+        signatureVO.setFileName(AliOssConfig.getProjectName() + fileName);
+        signatureVO.setHost(AliOssConfig.getUploadDomain());
+        signatureVO.setExpire(String.valueOf(expireEndTime / 1000));
+        return signatureVO;
     }
 
     public static String getSignaturedUrl(String fileName, Boolean isPrivate) {

+ 2 - 1
api-module/src/main/resources/application.properties

@@ -87,4 +87,5 @@ oss.growth.pubBucket=public:art-pubbucket,publicVideo:art-pubbucket
 oss.growth.priBucket=private:art-pribucket,privateVideo:art-privideo,privateVideoIn:art-privideo-in
 oss.growth.priEndPoint=pricdn.yishihui.com
 oss.growth.needPress=true
-oss.growth.internal.endPoint=oss-cn-hangzhou.aliyuncs.com
+oss.growth.internal.endPoint=oss-cn-hangzhou.aliyuncs.com
+cdn.upload.domain=https://weappupload.piaoquantv.com/

+ 23 - 6
api-module/src/main/resources/mapper/contentplatform/ContentPlatformUploadVideoMapper.xml

@@ -9,6 +9,7 @@
     <result column="video" jdbcType="VARCHAR" property="video" />
     <result column="audit_status" jdbcType="INTEGER" property="auditStatus" />
     <result column="audit_reason" jdbcType="VARCHAR" property="auditReason" />
+    <result column="score" jdbcType="DOUBLE" property="score" />
     <result column="is_delete" jdbcType="INTEGER" property="isDelete" />
     <result column="create_account_id" jdbcType="BIGINT" property="createAccountId" />
     <result column="create_timestamp" jdbcType="BIGINT" property="createTimestamp" />
@@ -73,8 +74,8 @@
     </where>
   </sql>
   <sql id="Base_Column_List">
-    id, video_id, title, cover, video, audit_status, audit_reason, is_delete, create_account_id, 
-    create_timestamp, update_timestamp
+    id, video_id, title, cover, video, audit_status, audit_reason, score, is_delete, 
+    create_account_id, create_timestamp, update_timestamp
   </sql>
   <select id="selectByExample" parameterType="com.tzld.piaoquan.api.model.po.contentplatform.ContentPlatformUploadVideoExample" resultMap="BaseResultMap">
     select
@@ -112,12 +113,14 @@
   <insert id="insert" parameterType="com.tzld.piaoquan.api.model.po.contentplatform.ContentPlatformUploadVideo">
     insert into content_platform_upload_video (id, video_id, title, 
       cover, video, audit_status, 
-      audit_reason, is_delete, create_account_id, 
-      create_timestamp, update_timestamp)
+      audit_reason, score, is_delete, 
+      create_account_id, create_timestamp, update_timestamp
+      )
     values (#{id,jdbcType=BIGINT}, #{videoId,jdbcType=BIGINT}, #{title,jdbcType=VARCHAR}, 
       #{cover,jdbcType=VARCHAR}, #{video,jdbcType=VARCHAR}, #{auditStatus,jdbcType=INTEGER}, 
-      #{auditReason,jdbcType=VARCHAR}, #{isDelete,jdbcType=INTEGER}, #{createAccountId,jdbcType=BIGINT}, 
-      #{createTimestamp,jdbcType=BIGINT}, #{updateTimestamp,jdbcType=BIGINT})
+      #{auditReason,jdbcType=VARCHAR}, #{score,jdbcType=DOUBLE}, #{isDelete,jdbcType=INTEGER}, 
+      #{createAccountId,jdbcType=BIGINT}, #{createTimestamp,jdbcType=BIGINT}, #{updateTimestamp,jdbcType=BIGINT}
+      )
   </insert>
   <insert id="insertSelective" parameterType="com.tzld.piaoquan.api.model.po.contentplatform.ContentPlatformUploadVideo">
     insert into content_platform_upload_video
@@ -143,6 +146,9 @@
       <if test="auditReason != null">
         audit_reason,
       </if>
+      <if test="score != null">
+        score,
+      </if>
       <if test="isDelete != null">
         is_delete,
       </if>
@@ -178,6 +184,9 @@
       <if test="auditReason != null">
         #{auditReason,jdbcType=VARCHAR},
       </if>
+      <if test="score != null">
+        #{score,jdbcType=DOUBLE},
+      </if>
       <if test="isDelete != null">
         #{isDelete,jdbcType=INTEGER},
       </if>
@@ -222,6 +231,9 @@
       <if test="record.auditReason != null">
         audit_reason = #{record.auditReason,jdbcType=VARCHAR},
       </if>
+      <if test="record.score != null">
+        score = #{record.score,jdbcType=DOUBLE},
+      </if>
       <if test="record.isDelete != null">
         is_delete = #{record.isDelete,jdbcType=INTEGER},
       </if>
@@ -248,6 +260,7 @@
       video = #{record.video,jdbcType=VARCHAR},
       audit_status = #{record.auditStatus,jdbcType=INTEGER},
       audit_reason = #{record.auditReason,jdbcType=VARCHAR},
+      score = #{record.score,jdbcType=DOUBLE},
       is_delete = #{record.isDelete,jdbcType=INTEGER},
       create_account_id = #{record.createAccountId,jdbcType=BIGINT},
       create_timestamp = #{record.createTimestamp,jdbcType=BIGINT},
@@ -277,6 +290,9 @@
       <if test="auditReason != null">
         audit_reason = #{auditReason,jdbcType=VARCHAR},
       </if>
+      <if test="score != null">
+        score = #{score,jdbcType=DOUBLE},
+      </if>
       <if test="isDelete != null">
         is_delete = #{isDelete,jdbcType=INTEGER},
       </if>
@@ -300,6 +316,7 @@
       video = #{video,jdbcType=VARCHAR},
       audit_status = #{auditStatus,jdbcType=INTEGER},
       audit_reason = #{auditReason,jdbcType=VARCHAR},
+      score = #{score,jdbcType=DOUBLE},
       is_delete = #{isDelete,jdbcType=INTEGER},
       create_account_id = #{createAccountId,jdbcType=BIGINT},
       create_timestamp = #{createTimestamp,jdbcType=BIGINT},

+ 9 - 2
api-module/src/main/resources/mapper/contentplatform/ext/ContentPlatformPlanMapperExt.xml

@@ -373,7 +373,7 @@
     <select id="getUploadVideoCount" resultType="java.lang.Integer">
         select count(1)
         from content_platform_upload_video
-        where audit_status = 2 and create_account_id = #{createAccountId}
+        where audit_status = 2 and create_account_id = #{createAccountId} and is_delete = 0
         <if test="param.title!= null and param.title!= ''">
             and title like concat('%', #{param.title}, '%')
         </if>
@@ -385,7 +385,7 @@
         from content_platform_upload_video video
         left join content_platform_video_datastat_agg datastat
         on datastat.dt = #{datastatDt} and datastat.type = #{type} and datastat.channel = #{channel} and datastat.video_id = video.video_id
-        where audit_status = 2 and create_account_id = #{createAccountId}
+        where video.audit_status = 2 and video.create_account_id = #{createAccountId} and video.is_delete = 0
         <if test="param.title!= null and param.title!= ''">
             and video.title like concat('%', #{param.title}, '%')
         </if>
@@ -393,5 +393,12 @@
         limit #{offset}, #{pageSize}
     </select>
 
+    <update id="updateUploadVideoStatusWithOldStatus">
+        update content_platform_upload_video
+        set audit_status = #{status},
+            update_timestamp = #{now}
+        where video_id = #{videoId}
+    </update>
+
 
 </mapper>

+ 64 - 0
common-module/src/main/java/com/tzld/piaoquan/growth/common/utils/RandomUtil.java

@@ -0,0 +1,64 @@
+package com.tzld.piaoquan.growth.common.utils;
+
+import java.math.BigDecimal;
+import java.util.Calendar;
+import java.util.Random;
+import java.util.UUID;
+
+public class RandomUtil {
+
+	public static final String ALLNUMBER = "0123456789";  
+	public static final String ALLCHAR = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";  
+	public static final Integer FIXLENG=18;
+    /** 
+     * 返回一个定长的随机字符串(只包含大小写字母、数字)
+     *  随机字符串长度
+     * @return 随机字符串 
+     */  
+    public static String generate18String() {  
+        StringBuffer sb = new StringBuffer();  
+        Random random = new Random();  
+        for (int i = 0; i < FIXLENG; i++) {  
+            sb.append(ALLCHAR.charAt(random.nextInt(ALLCHAR.length())));  
+        }  
+        return sb.toString();  
+    } 
+    
+    public static void main(String[] args) {
+		//System.out.println(generate18String())
+        String proportion="0.01";
+        Long price=150l;
+        Double incomeMoney=price*(Double.valueOf(proportion));
+        System.out.println(incomeMoney);
+
+
+        BigDecimal b = new BigDecimal(incomeMoney);
+        Long t = b.setScale(0,BigDecimal.ROUND_HALF_UP).longValue();
+        System.out.println(t);
+
+    	
+	}
+    
+    public static String generateString(int length) {  
+        StringBuffer sb = new StringBuffer();  
+        Random random = new Random();  
+        for (int i = 0; i < length; i++) {  
+            sb.append(ALLCHAR.charAt(random.nextInt(ALLCHAR.length())));  
+        }  
+        return sb.toString();  
+    }
+    
+    public static String generateNumber(int length) {  
+        StringBuffer sb = new StringBuffer();  
+        Random random = new Random();  
+        for (int i = 0; i < length; i++) {  
+            sb.append(ALLNUMBER.charAt(random.nextInt(ALLNUMBER.length())));  
+        }  
+        return sb.toString();  
+    } 
+    
+    public static String getRandomUUIDStr() {
+		return UUID.randomUUID().toString().replaceAll("-", "")+Calendar.getInstance().getTimeInMillis();
+	}
+
+}