This commit is contained in:
2025-01-26 02:21:27 +08:00
parent 7bd9a7507f
commit 1b11342e5d
32 changed files with 310 additions and 133 deletions

@ -110,6 +110,7 @@ public class AppScenicServiceImpl implements AppScenicService {
List<ContentPageVO> contentList = templateMapper.listFor(faceRespVO.getScenicId());
contentList.forEach(contentPageVO -> {
List<MemberVideoEntity> memberVideoEntityList = videoMapper.userFaceTemplateVideo(userId, faceId, contentPageVO.getTemplateId());
contentPageVO.setGoodsType(0);
contentPageVO.setContentType(1);
if (!memberVideoEntityList.isEmpty()) {
contentPageVO.setIsBuy(memberVideoEntityList.get(0).getIsBuy());
@ -145,6 +146,8 @@ public class AppScenicServiceImpl implements AppScenicService {
sourceImageContent.setName("照片集");
sourceVideoContent.setScenicId(faceRespVO.getScenicId());
sourceImageContent.setScenicId(faceRespVO.getScenicId());
sourceVideoContent.setGoodsType(1);
sourceImageContent.setGoodsType(2);
sourceVideoContent.setContentType(2);
sourceImageContent.setContentType(2);
sourceVideoContent.setLockType(1);

@ -141,7 +141,8 @@ public class AppStatisticsServiceImpl implements AppStatisticsService {
//扫码访问人数
Integer scanCodeVisitorOfMemberNum=statisticsMapper.countScanCodeOfMember(query);
//镜头检测游客数_扫码访问人数_转化率
vo.setCsom_scaom(calculateConversionRate(scanCodeVisitorOfMemberNum,cameraShotOfMemberNum));
// vo.setCsom_scaom(calculateConversionRate(scanCodeVisitorOfMemberNum,cameraShotOfMemberNum));
vo.setCsom_scaom("-");
//上传头像(人脸)人数
Integer uploadFaceOfMemberNum=statisticsMapper.countUploadFaceOfMember(query);
//扫码访问人数_上传头像人数_转化率
@ -170,9 +171,8 @@ public class AppStatisticsServiceImpl implements AppStatisticsService {
//点击购买人数_支付订单人数_转化率
vo.setCpom_pom((calculateConversionRate(payOfMemberNum,clickOnPayOfMemberNum)));
//总访问人数
//TODO 2024/12/12 17:56 目前只有扫码访问的方式,所以这里总访问人数先等于扫码访问人数
// Integer totalVisitorOfMemberNum =statisticsMapper.countTotalVisitorOfMember(query);
Integer totalVisitorOfMemberNum =scanCodeVisitorOfMemberNum;
Integer totalVisitorOfMemberNum =statisticsMapper.countTotalVisitorOfMember(query);
// Integer totalVisitorOfMemberNum =scanCodeVisitorOfMemberNum;
//生成视频条数
Integer completeOfVideoNum =statisticsMapper.countCompleteOfVideo(query);
//预览视频条数
@ -186,7 +186,8 @@ public class AppStatisticsServiceImpl implements AppStatisticsService {
//退款订单金额
BigDecimal refundOfOrderAmount =statisticsMapper.countRefundAmount(query);
vo.setCameraShotOfMemberNum(cameraShotOfMemberNum);
// vo.setCameraShotOfMemberNum(cameraShotOfMemberNum);
vo.setCameraShotOfMemberNum("-");
vo.setScanCodeVisitorOfMemberNum(scanCodeVisitorOfMemberNum);
vo.setUploadFaceOfMemberNum(uploadFaceOfMemberNum);
vo.setPushOfMemberNum(pushOfMemberNum);
@ -212,9 +213,13 @@ public class AppStatisticsServiceImpl implements AppStatisticsService {
@Override
public ApiResponse addStatistics(StatisticsRecordAddReq req) {
// req.setId(SnowFlakeUtil.getLongId());
JwtInfo worker = JwtTokenUtil.getWorker();
Long userId = worker.getUserId();
req.setMemberId(userId);
try {
JwtInfo worker = JwtTokenUtil.getWorker();
Long userId = worker.getUserId();
req.setMemberId(userId);
} catch (Exception ignored) {
}
Integer type = req.getType();
if(type==null){
return ApiResponse.fail("类型不能为空");
@ -331,6 +336,7 @@ public class AppStatisticsServiceImpl implements AppStatisticsService {
int scanCode=statisticsMapper.countScanCodeOfMember(query);
//查询付费人数
int pay=statisticsMapper.countPayOfMember(query);
int payCount=statisticsMapper.countPayOfOrder(query);
if(cycle==1){
//当前周期的支付订单金额
@ -340,9 +346,9 @@ public class AppStatisticsServiceImpl implements AppStatisticsService {
vo.setNowPreviewPay("0.00");
vo.setNowScanCodePay("0.00");
}else {
BigDecimal previewPay = new BigDecimal(preview).divide(new BigDecimal(pay), 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
BigDecimal previewPay = new BigDecimal(payCount).divide(new BigDecimal(preview), 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
vo.setNowPreviewPay(df.format(previewPay));
BigDecimal scanCodePay = new BigDecimal(scanCode).divide(new BigDecimal(pay), 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
BigDecimal scanCodePay = new BigDecimal(pay).divide(new BigDecimal(scanCode), 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
vo.setNowScanCodePay(df.format(scanCodePay));
}
}else if(cycle==2){

@ -8,6 +8,7 @@ import com.ycwl.basic.mapper.*;
import com.ycwl.basic.model.mobile.goods.*;
import com.ycwl.basic.model.mobile.order.IsBuyRespVO;
import com.ycwl.basic.model.mobile.order.PriceObj;
import com.ycwl.basic.model.pc.face.entity.FaceEntity;
import com.ycwl.basic.model.pc.face.resp.FaceRespVO;
import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity;
import com.ycwl.basic.model.pc.source.req.SourceReqQuery;
@ -17,6 +18,7 @@ import com.ycwl.basic.model.pc.template.resp.TemplateRespVO;
import com.ycwl.basic.model.pc.video.entity.MemberVideoEntity;
import com.ycwl.basic.model.pc.video.req.VideoReqQuery;
import com.ycwl.basic.model.pc.video.resp.VideoRespVO;
import com.ycwl.basic.repository.FaceRepository;
import com.ycwl.basic.repository.OrderRepository;
import com.ycwl.basic.repository.ScenicRepository;
import com.ycwl.basic.repository.VideoTaskRepository;
@ -62,6 +64,8 @@ public class GoodsServiceImpl implements GoodsService {
private OrderRepository orderRepository;
@Autowired
private OrderBiz orderBiz;
@Autowired
private FaceRepository faceRepository;
public ApiResponse<List<GoodsPageVO>> goodsList(GoodsReqQuery query) {
//查询原素材
@ -250,15 +254,20 @@ public class GoodsServiceImpl implements GoodsService {
* @return 0没有任务 1 合成中 2 合成成功
*/
@Override
public ApiResponse<VideoTaskStatusVO> getTaskStatusByFaceId(Long userId, Long faceId) {
public VideoTaskStatusVO getTaskStatusByFaceId(Long userId, Long faceId) {
FaceEntity face = faceRepository.getFace(faceId);
List<MemberVideoEntity> taskList = videoMapper.listRelationByFace(userId, faceId);
VideoTaskStatusVO response = new VideoTaskStatusVO();
response.setFaceId(faceId);
if (face == null) {
response.setStatus(0);
return response;
}
response.setScenicId(face.getScenicId());
if (taskList.isEmpty()) {
response.setStatus(0);
return ApiResponse.success(response);
return response;
}
response.setScenicId(taskList.get(0).getScenicId());
List<TemplateRespVO> templateList = templateRepository.getTemplateListByScenicId(response.getScenicId());
List<Long> templateIds = templateList.stream().map(TemplateRespVO::getId).collect(Collectors.toList());
response.setMaxCount(templateList.size());
@ -277,7 +286,7 @@ public class GoodsServiceImpl implements GoodsService {
response.setTemplateId(notFinishedTasks.get(0).getTemplateId());
response.setTaskId(notFinishedTasks.get(0).getTaskId());
response.setStatus(2);
return ApiResponse.success(response);
return response;
}
MemberVideoEntity lastVideo = taskList.get(taskList.size() - 1);
response.setTaskId(lastVideo.getTaskId());
@ -285,24 +294,24 @@ public class GoodsServiceImpl implements GoodsService {
response.setVideoId(lastVideo.getVideoId());
response.setCount(taskList.size());
response.setStatus(1);
return ApiResponse.success(response);
return response;
}
@Override
public ApiResponse<VideoTaskStatusVO> getAllTaskStatus(Long userId) {
public VideoTaskStatusVO getAllTaskStatus(Long userId) {
FaceRespVO lastFaceByUserId = faceMapper.findLastFaceByUserId(String.valueOf(userId));
return getTaskStatusByFaceId(userId, lastFaceByUserId.getId());
}
@Override
public ApiResponse<VideoTaskStatusVO> getTaskStatusByTemplateId(Long userId, Long faceId, Long templateId) {
public VideoTaskStatusVO getTaskStatusByTemplateId(Long userId, Long faceId, Long templateId) {
List<MemberVideoEntity> taskList = videoMapper.listRelationByFaceAndTemplate(userId, faceId, templateId);
VideoTaskStatusVO response = new VideoTaskStatusVO();
response.setFaceId(faceId);
response.setTemplateId(templateId);
if (taskList.isEmpty()) {
response.setStatus(0);
return ApiResponse.success(response);
return response;
}
response.setScenicId(taskList.get(0).getScenicId());
response.setMaxCount(templateRepository.getTemplateListByScenicId(response.getScenicId()).size());
@ -319,7 +328,7 @@ public class GoodsServiceImpl implements GoodsService {
response.setTemplateId(notFinishedTasks.get(0).getTemplateId());
response.setTaskId(notFinishedTasks.get(0).getTaskId());
response.setStatus(2);
return ApiResponse.success(response);
return response;
}
MemberVideoEntity lastVideo = taskList.get(taskList.size() - 1);
response.setTaskId(lastVideo.getTaskId());
@ -332,18 +341,18 @@ public class GoodsServiceImpl implements GoodsService {
response.setStatus(1);
response.setVideoId(lastVideo.getVideoId());
}
return ApiResponse.success(response);
return response;
}
@Override
public ApiResponse<VideoTaskStatusVO> getTaskStatusByScenicId(Long userId, Long scenicId) {
public VideoTaskStatusVO getTaskStatusByScenicId(Long userId, Long scenicId) {
FaceRespVO faceVO = faceMapper.getByMemberId(userId, scenicId);
VideoTaskStatusVO response = new VideoTaskStatusVO();
response.setScenicId(scenicId);
if (faceVO == null) {
// 从来没露脸
response.setStatus(-2);
return ApiResponse.success(response);
return response;
}
return getTaskStatusByFaceId(userId, faceVO.getId());
}

@ -47,6 +47,7 @@ import com.ycwl.basic.service.HttpService;
import com.ycwl.basic.service.mobile.WxPayService;
import com.ycwl.basic.service.pc.OrderService;
import com.ycwl.basic.utils.ApiResponse;
import com.ycwl.basic.utils.DateUtils;
import com.ycwl.basic.utils.SnowFlakeUtil;
import com.ycwl.basic.utils.WXPayUtil;
import lombok.extern.slf4j.Slf4j;
@ -233,13 +234,18 @@ public class WxPayServiceImpl implements WxPayService {
StatisticsRecordAddReq statisticsRecordAddReq = new StatisticsRecordAddReq();
statisticsRecordAddReq.setMemberId(orderData.getMemberId());
// TODO
//如果订单在商品创建后30分钟内支付,则为现场支付,否则为事后支付
// if(DateUtils.addDateMinute(createTime,30).compareTo(payAt)>0){//
Calendar calendar = Calendar.getInstance();
calendar.setTime(createTime);
calendar.set(Calendar.HOUR_OF_DAY, 21);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
// TODO: 他的购买的内容于内容生成当天晚9点之前算现场订单,否则算推送订单
if(calendar.getTime().compareTo(payAt)>0){//
statisticsRecordAddReq.setType(StatisticEnum.ON_SITE_PAYMENT.code);
// }else {
// statisticsRecordAddReq.setType(StatisticEnum.POST_PAYMENT.code);
// }
}else {
statisticsRecordAddReq.setType(StatisticEnum.POST_PAYMENT.code);
}
calendar.clear();
statisticsRecordAddReq.setScenicId(orderData.getScenicId());
statisticsRecordAddReq.setMorphId(orderId);
statisticsMapper.addStatisticsRecord(statisticsRecordAddReq);

@ -147,7 +147,7 @@ public class FaceServiceImpl implements FaceService {
if (face == null) {
return false;
}
return face.getScenicId().equals(scenicId);
return face.getMemberId().equals(userId);
}).findAny();
if (faceAny.isPresent()) {
oldFaceId = faceAny.get();
@ -197,6 +197,7 @@ public class FaceServiceImpl implements FaceService {
}
SearchFaceRespVo scenicDbSearchResult = faceService.searchFace(face.getScenicId(), face.getFaceUrl());
FaceEntity faceEntity = new FaceEntity();
faceEntity.setId(faceId);
faceEntity.setScore(scenicDbSearchResult.getScore());
faceEntity.setMatchResult(scenicDbSearchResult.getSearchResultJson());
if (scenicDbSearchResult.getFirstMatchRate() != null) {
@ -210,6 +211,8 @@ public class FaceServiceImpl implements FaceService {
faceEntity.setMemberId(face.getMemberId());
faceEntity.setFaceUrl(face.getFaceUrl());
List<Long> sampleListIds = scenicDbSearchResult.getSampleListIds();
faceMapper.update(faceEntity);
faceRepository.clearFaceCache(faceEntity.getId());
if (sampleListIds != null && !sampleListIds.isEmpty()) {// 匹配原片:照片
List<SourceEntity> sourceEntities = sourceMapper.listBySampleIds(sampleListIds);
List<MemberSourceEntity> memberSourceEntityList = sourceEntities.stream().map(sourceEntity -> {
@ -231,16 +234,14 @@ public class FaceServiceImpl implements FaceService {
}).collect(Collectors.toList());
if (!memberSourceEntityList.isEmpty()) {
sourceMapper.addRelations(memberSourceEntityList);
taskTaskService.autoCreateTaskByFaceId(faceEntity.getId());
taskTaskService.autoCreateTaskByFaceId(face.getId());
VideoPieceGetter.Task task = new VideoPieceGetter.Task();
task.faceId = faceEntity.getId();
task.faceId = face.getId();
task.faceSampleIds = sampleListIds;
task.memberId = face.getMemberId();
VideoPieceGetter.addTask(task);
}
}
faceMapper.update(faceEntity);
faceRepository.clearFaceCache(faceEntity.getId());
return scenicDbSearchResult;
}

@ -148,6 +148,9 @@ public class ScenicServiceImpl implements ScenicService {
@Override
public ApiResponse<Boolean> addConfig(ScenicConfigEntity scenicConfig) {
if (scenicConfig.getId() == null) {
scenicConfig.setId(SnowFlakeUtil.getLongId());
}
int i = scenicMapper.addConfig(scenicConfig);
if (i > 0) {
scenicRepository.clearCache(scenicConfig.getScenicId());

@ -39,10 +39,10 @@ public interface GoodsService {
* @param userId
* @return
*/
ApiResponse<VideoTaskStatusVO> getAllTaskStatus(Long userId);
ApiResponse<VideoTaskStatusVO> getTaskStatusByFaceId(Long userId ,Long faceId);
ApiResponse<VideoTaskStatusVO> getTaskStatusByTemplateId(Long userId, Long faceId, Long templateId);
ApiResponse<VideoTaskStatusVO> getTaskStatusByScenicId(Long userId, Long scenicId);
VideoTaskStatusVO getAllTaskStatus(Long userId);
VideoTaskStatusVO getTaskStatusByFaceId(Long userId ,Long faceId);
VideoTaskStatusVO getTaskStatusByTemplateId(Long userId, Long faceId, Long templateId);
VideoTaskStatusVO getTaskStatusByScenicId(Long userId, Long scenicId);
ApiResponse<GoodsDetailVO> sourceGoodsInfo(Long userId, Long sourceId);
}

@ -49,7 +49,6 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
@ -87,7 +86,12 @@ public class TaskFaceServiceImpl implements TaskFaceService {
private SourceMapper sourceMapper;
@Autowired
private OrderBiz orderBiz;
private SlidingWindowRateLimiter limiter = new SlidingWindowRateLimiter(5); // 阿里云人脸检索限制qps=5
// 阿里云人脸检索限制qps=2
private final SlidingWindowRateLimiter addEntityLimiter = new SlidingWindowRateLimiter(1);
// 阿里云人脸检索限制qps=5
private final SlidingWindowRateLimiter searchFaceLimiter = new SlidingWindowRateLimiter(4);
private final SlidingWindowRateLimiter deleteDbLimiter = new SlidingWindowRateLimiter(1);
private final SlidingWindowRateLimiter deleteEntityLimiter = new SlidingWindowRateLimiter(1);
private IAcsClient getClient() {
DefaultProfile profile = DefaultProfile.getProfile(
@ -163,6 +167,10 @@ public class TaskFaceServiceImpl implements TaskFaceService {
request.setLimit(100);
// request.setQualityScoreThreshold(60f);
FaceDetectLog log = FaceDetectLog.quickCreate("预留字段", request);
try {
searchFaceLimiter.aquire();
} catch (InterruptedException ignored) {
}
try {
SearchFaceResponse response = client.getAcsResponse(request);
log.fillResponse(response);
@ -197,7 +205,7 @@ public class TaskFaceServiceImpl implements TaskFaceService {
.collect(Collectors.toList());
log.matchLocalRecord(records);
List<Long> faceSampleIds = records.stream()
.filter(record -> record.getScore() > 0.6)
.filter(record -> record.getScore() > 0.525F)
.map(MatchLocalRecord::getFaceSampleId)
.collect(Collectors.toList());
respVo.setFirstMatchRate(matchList.get(0).getFaceItems().get(0).getScore());
@ -235,9 +243,8 @@ public class TaskFaceServiceImpl implements TaskFaceService {
request.setEntityId(entityId);
IAcsClient client = getClient();
try {
limiter.allowRequest();
} catch (InterruptedException e) {
return null;
addEntityLimiter.aquire();
} catch (InterruptedException ignored) {
}
try {
client.getAcsResponse(request);
@ -256,7 +263,7 @@ public class TaskFaceServiceImpl implements TaskFaceService {
respVo.setScore(acsResponse.getData().getQualitieScore());
return respVo;
} catch (ClientException e) {
log.error("addFaceEntity", e);
log.error("addFace", e);
return null;
}
}
@ -283,6 +290,10 @@ public class TaskFaceServiceImpl implements TaskFaceService {
DeleteFaceEntityRequest request = new DeleteFaceEntityRequest();
request.setDbName(scenicId.toString());
request.setEntityId(entityId);
try {
deleteEntityLimiter.aquire();
} catch (InterruptedException ignored) {
}
try {
client.getAcsResponse(request);
} catch (ClientException e) {
@ -310,9 +321,8 @@ public class TaskFaceServiceImpl implements TaskFaceService {
deleteFaceEntityRequest.setDbName(entity.getDbName());
deleteFaceEntityRequest.setEntityId(entity.getEntityId());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
deleteEntityLimiter.aquire();
} catch (InterruptedException ignored) {
}
try {
client.getAcsResponse(deleteFaceEntityRequest);
@ -323,6 +333,10 @@ public class TaskFaceServiceImpl implements TaskFaceService {
}
DeleteFaceDbRequest deleteFaceDbRequest = new DeleteFaceDbRequest();
deleteFaceDbRequest.setName(dbName);
try {
deleteDbLimiter.aquire();
} catch (InterruptedException ignored) {
}
client.getAcsResponse(deleteFaceDbRequest);
removeFaceDBCache(dbName);
} catch (ClientException e) {

@ -545,7 +545,7 @@ public class TaskTaskServiceImpl implements TaskService {
}
ScenicEntity scenic = scenicRepository.getScenic(item.getScenicId());
String title = "您在【" + scenic.getName() + "】的专属影像";
String page = "pages/videoSynthesis/buy?scenicId=" + item.getScenicId() + "&faceId=" + item.getFaceId() + "&id=" + item.getVideoId();
String page = "pages/videoSynthesis/index?scenicId=" + item.getScenicId() + "&faceId=" + item.getFaceId();
/**
* 视频名称 {{thing1.DATA}}
* 生成时间 {{time4.DATA}}