This commit is contained in:
Jerry Yan 2025-01-17 12:16:22 +08:00
parent 937e1c1ff5
commit e70098bf29
6 changed files with 100 additions and 9 deletions

View File

@ -62,6 +62,7 @@ public interface SourceMapper {
int hasRelationTo(Long memberId, Long sourceId, int type); int hasRelationTo(Long memberId, Long sourceId, int type);
List<SourceEntity> listVideoByScenicFaceRelation(Long scenicId, Long faceId); List<SourceEntity> listVideoByScenicFaceRelation(Long scenicId, Long faceId);
List<SourceEntity> listVideoByFaceRelation(Long faceId); List<SourceEntity> listVideoByFaceRelation(Long memberId, Long faceId);
List<SourceEntity> listImageByFaceRelation(Long memberId, Long faceId);
} }

View File

@ -7,6 +7,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.util.Date; import java.util.Date;
import java.util.List;
/** /**
* @Authorlongbinbin * @Authorlongbinbin
@ -44,4 +45,5 @@ public class OrderItemVO {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime; private Date createTime;
private Date shootingTime; private Date shootingTime;
private List<String> coverList;
} }

View File

@ -24,12 +24,15 @@ import com.ycwl.basic.model.pc.order.resp.OrderItemVO;
import com.ycwl.basic.model.pc.order.resp.OrderRespVO; import com.ycwl.basic.model.pc.order.resp.OrderRespVO;
import com.ycwl.basic.model.pc.orderOp.entity.OrderOperationEntity; import com.ycwl.basic.model.pc.orderOp.entity.OrderOperationEntity;
import com.ycwl.basic.model.pc.source.entity.SourceEntity; import com.ycwl.basic.model.pc.source.entity.SourceEntity;
import com.ycwl.basic.model.pc.video.entity.MemberVideoEntity;
import com.ycwl.basic.model.pc.video.entity.VideoEntity; import com.ycwl.basic.model.pc.video.entity.VideoEntity;
import com.ycwl.basic.model.pc.video.resp.VideoRespVO;
import com.ycwl.basic.model.wx.WXPayOrderReqVO; import com.ycwl.basic.model.wx.WXPayOrderReqVO;
import com.ycwl.basic.model.wx.WxPayRespVO; import com.ycwl.basic.model.wx.WxPayRespVO;
import com.ycwl.basic.service.mobile.GoodsService; import com.ycwl.basic.service.mobile.GoodsService;
import com.ycwl.basic.service.mobile.WxPayService; import com.ycwl.basic.service.mobile.WxPayService;
import com.ycwl.basic.service.pc.OrderService; import com.ycwl.basic.service.pc.OrderService;
import com.ycwl.basic.service.task.impl.TaskTaskServiceImpl;
import com.ycwl.basic.utils.ApiResponse; import com.ycwl.basic.utils.ApiResponse;
import com.ycwl.basic.utils.BigDecimalUtil; import com.ycwl.basic.utils.BigDecimalUtil;
import com.ycwl.basic.utils.SnowFlakeUtil; import com.ycwl.basic.utils.SnowFlakeUtil;
@ -40,9 +43,11 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors;
/** /**
* @Authorlongbinbin * @Authorlongbinbin
@ -69,6 +74,8 @@ public class OrderServiceImpl implements OrderService {
private StatisticsMapper statisticsMapper; private StatisticsMapper statisticsMapper;
@Autowired @Autowired
private OrderBiz orderBiz; private OrderBiz orderBiz;
@Autowired
private TaskTaskServiceImpl taskTaskServiceImpl;
@Override @Override
public ApiResponse<PageInfo<OrderRespVO>> pageQuery(OrderReqQuery query) { public ApiResponse<PageInfo<OrderRespVO>> pageQuery(OrderReqQuery query) {
@ -214,6 +221,33 @@ public class OrderServiceImpl implements OrderService {
public ApiResponse<PageInfo<OrderAppRespVO>> appPageQuery(OrderAppPageReq orderReqQuery) { public ApiResponse<PageInfo<OrderAppRespVO>> appPageQuery(OrderAppPageReq orderReqQuery) {
PageHelper.startPage(orderReqQuery.getPageNum(), orderReqQuery.getPageSize()); PageHelper.startPage(orderReqQuery.getPageNum(), orderReqQuery.getPageSize());
List<OrderAppRespVO> list = orderMapper.appList(orderReqQuery); List<OrderAppRespVO> list = orderMapper.appList(orderReqQuery);
list.forEach(order -> {
List<OrderItemVO> orderItemList = order.getOrderItemList();
if (orderItemList == null) {
return;
}
orderItemList.forEach(item -> {
if (Integer.valueOf(1).equals(item.getGoodsType())) { // 原片
List<SourceEntity> memberVideoEntityList = sourceMapper.listVideoByFaceRelation(orderReqQuery.getMemberId(), item.getFaceId());
item.setCoverList(memberVideoEntityList.stream().map(SourceEntity::getUrl).collect(Collectors.toList()));
if (!memberVideoEntityList.isEmpty()) {
item.setShootingTime(memberVideoEntityList.get(0).getCreateTime());
}
} else if (Integer.valueOf(2).equals(item.getGoodsType())) {
List<SourceEntity> memberVideoEntityList = sourceMapper.listImageByFaceRelation(orderReqQuery.getMemberId(), item.getFaceId());
item.setCoverList(memberVideoEntityList.stream().map(SourceEntity::getUrl).collect(Collectors.toList()));
if (!memberVideoEntityList.isEmpty()) {
item.setShootingTime(memberVideoEntityList.get(0).getCreateTime());
}
} else {
item.setCoverList(Collections.singletonList(item.getCoverUrl()));
VideoRespVO videoMapperById = videoMapper.getById(item.getGoodsId());
if (videoMapperById != null) {
item.setShootingTime(taskTaskServiceImpl.getTaskShotDate(videoMapperById.getTaskId()));
}
}
});
});
PageInfo<OrderAppRespVO> pageInfo = new PageInfo<>(list); PageInfo<OrderAppRespVO> pageInfo = new PageInfo<>(list);
return ApiResponse.success(pageInfo); return ApiResponse.success(pageInfo);
} }

View File

@ -15,6 +15,7 @@ import com.aliyuncs.facebody.model.v20191230.ListFaceEntitiesRequest;
import com.aliyuncs.facebody.model.v20191230.ListFaceEntitiesResponse; import com.aliyuncs.facebody.model.v20191230.ListFaceEntitiesResponse;
import com.aliyuncs.facebody.model.v20191230.SearchFaceRequest; import com.aliyuncs.facebody.model.v20191230.SearchFaceRequest;
import com.aliyuncs.facebody.model.v20191230.SearchFaceResponse; import com.aliyuncs.facebody.model.v20191230.SearchFaceResponse;
import com.ycwl.basic.biz.OrderBiz;
import com.ycwl.basic.config.FaceDetectConfig; import com.ycwl.basic.config.FaceDetectConfig;
import com.ycwl.basic.constant.FaceConstant; import com.ycwl.basic.constant.FaceConstant;
import com.ycwl.basic.exception.BaseException; import com.ycwl.basic.exception.BaseException;
@ -22,6 +23,8 @@ import com.ycwl.basic.mapper.FaceDetectLogMapper;
import com.ycwl.basic.mapper.FaceMapper; import com.ycwl.basic.mapper.FaceMapper;
import com.ycwl.basic.mapper.FaceSampleMapper; import com.ycwl.basic.mapper.FaceSampleMapper;
import com.ycwl.basic.mapper.ScenicMapper; import com.ycwl.basic.mapper.ScenicMapper;
import com.ycwl.basic.mapper.SourceMapper;
import com.ycwl.basic.model.mobile.order.IsBuyRespVO;
import com.ycwl.basic.model.pc.face.entity.FaceEntity; import com.ycwl.basic.model.pc.face.entity.FaceEntity;
import com.ycwl.basic.model.pc.face.resp.FaceRespVO; import com.ycwl.basic.model.pc.face.resp.FaceRespVO;
import com.ycwl.basic.model.pc.faceDetectLog.entity.FaceDetectLog; import com.ycwl.basic.model.pc.faceDetectLog.entity.FaceDetectLog;
@ -30,6 +33,8 @@ import com.ycwl.basic.model.pc.faceSample.entity.FaceSampleEntity;
import com.ycwl.basic.model.pc.faceSample.req.FaceSampleReqQuery; import com.ycwl.basic.model.pc.faceSample.req.FaceSampleReqQuery;
import com.ycwl.basic.model.pc.faceSample.resp.FaceSampleRespVO; import com.ycwl.basic.model.pc.faceSample.resp.FaceSampleRespVO;
import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity;
import com.ycwl.basic.model.pc.source.entity.MemberSourceEntity;
import com.ycwl.basic.model.pc.source.entity.SourceEntity;
import com.ycwl.basic.model.task.resp.AddFaceSampleRespVo; import com.ycwl.basic.model.task.resp.AddFaceSampleRespVo;
import com.ycwl.basic.model.task.resp.SearchFaceRespVo; import com.ycwl.basic.model.task.resp.SearchFaceRespVo;
import com.ycwl.basic.repository.FaceRepository; import com.ycwl.basic.repository.FaceRepository;
@ -37,6 +42,7 @@ import com.ycwl.basic.service.task.TaskFaceService;
import com.ycwl.basic.storage.StorageFactory; import com.ycwl.basic.storage.StorageFactory;
import com.ycwl.basic.storage.adapters.IStorageAdapter; import com.ycwl.basic.storage.adapters.IStorageAdapter;
import com.ycwl.basic.storage.utils.StorageUtil; import com.ycwl.basic.storage.utils.StorageUtil;
import com.ycwl.basic.task.VideoPieceGetter;
import com.ycwl.basic.utils.DateUtils; import com.ycwl.basic.utils.DateUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -55,6 +61,7 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -75,6 +82,10 @@ public class TaskFaceServiceImpl implements TaskFaceService {
private FaceDetectLogMapper logMapper; private FaceDetectLogMapper logMapper;
@Autowired @Autowired
private FaceRepository faceRepository; private FaceRepository faceRepository;
@Autowired
private SourceMapper sourceMapper;
@Autowired
private OrderBiz orderBiz;
private IAcsClient getClient() { private IAcsClient getClient() {
DefaultProfile profile = DefaultProfile.getProfile( DefaultProfile profile = DefaultProfile.getProfile(
@ -86,7 +97,13 @@ public class TaskFaceServiceImpl implements TaskFaceService {
@Override @Override
public SearchFaceRespVo searchFace(Long faceId) { public SearchFaceRespVo searchFace(Long faceId) {
FaceRespVO faceRespVO = faceMapper.getById(faceId); FaceRespVO faceRespVO = faceMapper.getById(faceId);
SearchFaceRespVo respVo = searchFace(faceRespVO.getScenicId().toString(), faceRespVO.getFaceUrl()); if (faceRespVO == null) {
SearchFaceRespVo vo = new SearchFaceRespVo();
vo.setSampleListIds(new ArrayList<>());
return vo;
}
Long scenicId = faceRespVO.getScenicId();
SearchFaceRespVo respVo = searchFace(scenicId.toString(), faceRespVO.getFaceUrl());
if (respVo != null) { if (respVo != null) {
FaceEntity faceEntity = new FaceEntity(); FaceEntity faceEntity = new FaceEntity();
faceEntity.setId(faceId); faceEntity.setId(faceId);
@ -96,6 +113,35 @@ public class TaskFaceServiceImpl implements TaskFaceService {
faceEntity.setMatchSampleIds(StringUtils.join(respVo.getSampleListIds(), ",")); faceEntity.setMatchSampleIds(StringUtils.join(respVo.getSampleListIds(), ","));
faceMapper.update(faceEntity); faceMapper.update(faceEntity);
faceRepository.clearFaceCache(faceId); faceRepository.clearFaceCache(faceId);
List<Long> sampleListIds = respVo.getSampleListIds();
if (sampleListIds != null && !sampleListIds.isEmpty()) {// 匹配原片照片
List<SourceEntity> sourceEntities = sourceMapper.listBySampleIds(sampleListIds);
List<MemberSourceEntity> memberSourceEntityList = sourceEntities.stream().map(sourceEntity -> {
MemberSourceEntity memberSourceEntity = new MemberSourceEntity();
memberSourceEntity.setScenicId(scenicId);
memberSourceEntity.setFaceId(faceEntity.getId());
memberSourceEntity.setMemberId(faceRespVO.getMemberId());
memberSourceEntity.setSourceId(sourceEntity.getId());
memberSourceEntity.setType(sourceEntity.getType());
IsBuyRespVO isBuy = orderBiz.isBuy(faceRespVO.getMemberId(), scenicId, sourceEntity.getType(), sourceEntity.getId());
if (isBuy.isBuy()) { // 如果用户买过
memberSourceEntity.setIsBuy(1);
} else if (isBuy.isFree()) { // 全免费逻辑
memberSourceEntity.setIsBuy(1);
} else {
memberSourceEntity.setIsBuy(0);
}
return memberSourceEntity;
}).collect(Collectors.toList());
if (!memberSourceEntityList.isEmpty()) {
sourceMapper.addRelations(memberSourceEntityList);
VideoPieceGetter.Task task = new VideoPieceGetter.Task();
task.faceId = faceEntity.getId();
task.faceSampleIds = sampleListIds;
task.memberId = faceRespVO.getMemberId();
VideoPieceGetter.addTask(task);
}
}
} }
return respVo; return respVo;
} }
@ -378,17 +424,19 @@ public class TaskFaceServiceImpl implements TaskFaceService {
} }
private static final String DATE_FORMAT="yyyyMMddHHmmssSSS"; private static final String DATE_FORMAT="yyyyMMddHHmmss";
public static String generateEntityId(FaceSampleEntity entity) { public static String generateEntityId(FaceSampleEntity entity) {
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT); SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
String entityId = entity.getDeviceId().toString() + "_" + sdf.format(entity.getCreateAt()); Random random = new Random();
return entityId; int randomNumber = random.nextInt(900) + 100;
return entity.getDeviceId().toString() + "_" + sdf.format(entity.getCreateAt()) + randomNumber;
} }
public static String generateEntityId(FaceSampleRespVO entity) { public static String generateEntityId(FaceSampleRespVO entity) {
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT); SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
String entityId = entity.getDeviceId().toString() + "_" + sdf.format(entity.getCreateAt()); Random random = new Random();
return entityId; int randomNumber = random.nextInt(900) + 100;
return entity.getDeviceId().toString() + "_" + sdf.format(entity.getCreateAt()) + randomNumber;
} }
public String getFaceUrl(Long faceId) { public String getFaceUrl(Long faceId) {

View File

@ -155,7 +155,7 @@ public class DynamicTaskGenerator {
public static void addTask(Long faceSampleId) { public static void addTask(Long faceSampleId) {
Date createTime = new Date(); Date createTime = new Date();
// 两分钟后 // 两分钟后
createTime.setTime(createTime.getTime() + 80000L); createTime.setTime(createTime.getTime() + 30000L);
queue.add(new Task(faceSampleId, createTime)); queue.add(new Task(faceSampleId, createTime));
} }

View File

@ -160,7 +160,7 @@
select s.* select s.*
from member_source ms from member_source ms
left join source s on ms.source_id = s.id left join source s on ms.source_id = s.id
where ms.face_id = #{faceId} and ms.type = 1 where ms.face_id = #{faceId} and ms.member_id = #{memberId} and ms.type = 1
order by create_time desc order by create_time desc
</select> </select>
<select id="listVideoByScenicFaceRelation" resultType="com.ycwl.basic.model.pc.source.entity.SourceEntity"> <select id="listVideoByScenicFaceRelation" resultType="com.ycwl.basic.model.pc.source.entity.SourceEntity">
@ -170,4 +170,10 @@
where ms.face_id = #{faceId} and ms.type = 1 and ms.scenic_id = #{scenicId} where ms.face_id = #{faceId} and ms.type = 1 and ms.scenic_id = #{scenicId}
order by create_time desc order by create_time desc
</select> </select>
<select id="listImageByFaceRelation" resultType="com.ycwl.basic.model.pc.source.entity.SourceEntity">
select s.*
from member_source ms
left join source s on ms.source_id = s.id
where ms.face_id = #{faceId} and ms.member_id = #{memberId} and ms.type = 2
</select>
</mapper> </mapper>