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

View File

@ -71,7 +71,7 @@ public class AppGoodsController {
@GetMapping("/getTaskStatus/")
public ApiResponse<VideoTaskStatusVO> getAllTaskStatus() {
JwtInfo worker = JwtTokenUtil.getWorker();
return goodsService.getAllTaskStatus(worker.getUserId());
return ApiResponse.success(goodsService.getAllTaskStatus(worker.getUserId()));
}
/**
@ -84,6 +84,6 @@ public class AppGoodsController {
@GetMapping("/task/face/{faceId}/template/{templateId}")
public ApiResponse<VideoTaskStatusVO> getTemplateTaskStatus(@PathVariable("faceId") Long faceId, @PathVariable("templateId") Long templateId) {
JwtInfo worker = JwtTokenUtil.getWorker();
return goodsService.getTaskStatusByTemplateId(worker.getUserId(), faceId, templateId);
return ApiResponse.success(goodsService.getTaskStatusByTemplateId(worker.getUserId(), faceId, templateId));
}
}

View File

@ -29,13 +29,15 @@ public class AppTaskController {
@IgnoreLogReq
public ApiResponse<VideoTaskStatusVO> getTaskStatusByFaceId(@PathVariable("faceId") Long faceId) {
JwtInfo worker = JwtTokenUtil.getWorker();
return goodsService.getTaskStatusByFaceId(worker.getUserId(), faceId);
return ApiResponse.success(goodsService.getTaskStatusByFaceId(worker.getUserId(), faceId));
}
@GetMapping("/scenic/{scenicId}")
@IgnoreLogReq
public ApiResponse<VideoTaskStatusVO> getAllTaskStatusByScenicId(@PathVariable("scenicId") Long scenicId) {
JwtInfo worker = JwtTokenUtil.getWorker();
return goodsService.getTaskStatusByScenicId(worker.getUserId(), scenicId);
VideoTaskStatusVO taskStatus = goodsService.getTaskStatusByScenicId(worker.getUserId(), scenicId);
taskStatus.setScenicId(scenicId);
return ApiResponse.success(taskStatus);
}
/**
@ -49,7 +51,7 @@ public class AppTaskController {
@IgnoreLogReq
public ApiResponse<VideoTaskStatusVO> getTemplateTaskStatus(@PathVariable("faceId") Long faceId, @PathVariable("templateId") Long templateId) {
JwtInfo worker = JwtTokenUtil.getWorker();
return goodsService.getTaskStatusByTemplateId(worker.getUserId(), faceId, templateId);
return ApiResponse.success(goodsService.getTaskStatusByTemplateId(worker.getUserId(), faceId, templateId));
}
@PostMapping("/submit")

View File

@ -0,0 +1,38 @@
package com.ycwl.basic.controller.mobile.manage;
import com.ycwl.basic.constant.BaseContextHandler;
import com.ycwl.basic.mapper.ScenicAccountMapper;
import com.ycwl.basic.model.pc.order.req.OrderReqQuery;
import com.ycwl.basic.model.pc.order.resp.OrderRespVO;
import com.ycwl.basic.model.pc.scenic.entity.ScenicAccountEntity;
import com.ycwl.basic.service.pc.OrderService;
import com.ycwl.basic.utils.ApiResponse;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/api/mobile/scenic/order/v1")
@Api(tags = "景区账号相关接口")
public class AppScenicOrderController {
@Autowired
private OrderService orderService;
@Autowired
private ScenicAccountMapper scenicAccountMapper;
@PostMapping("/list")
public ApiResponse<List<OrderRespVO>> list(@RequestBody OrderReqQuery query) {
String userId = BaseContextHandler.getUserId();
ScenicAccountEntity account = scenicAccountMapper.findAccountById(userId);
if (account == null) {
return ApiResponse.fail("用户未绑定景区");
}
query.setScenicId(account.getScenicId());
return orderService.list(query);
}
}

View File

@ -64,6 +64,7 @@ public class AppStatisticsController {
@ApiOperation("统计数据记录")
@PostMapping("/addStatistics")
@IgnoreToken
public ApiResponse addStatistics(@RequestBody StatisticsRecordAddReq req) {
return statisticsService.addStatistics(req);

View File

@ -82,4 +82,9 @@ public class ScenicController {
scenicService.saveConfig(id, config);
return ApiResponse.success(null);
}
@PostMapping("/saveConfig/undefined")
public ApiResponse saveConfig(@RequestBody ScenicConfigEntity config) {
scenicService.addConfig(config);
return ApiResponse.success(null);
}
}

View File

@ -5,9 +5,11 @@ import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.ycwl.basic.annotation.IgnoreLogReq;
import com.ycwl.basic.annotation.IgnoreToken;
import com.ycwl.basic.annotation.RequestToFile;
import com.ycwl.basic.mapper.DeviceMapper;
import com.ycwl.basic.mapper.FaceSampleMapper;
import com.ycwl.basic.mapper.SourceMapper;
import com.ycwl.basic.model.pc.device.entity.DeviceConfigEntity;
import com.ycwl.basic.model.pc.device.entity.DeviceEntity;
import com.ycwl.basic.model.pc.faceSample.entity.FaceSampleEntity;
import com.ycwl.basic.model.pc.source.entity.SourceEntity;
@ -50,6 +52,7 @@ import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import java.util.UUID;
import java.util.stream.Collectors;
@IgnoreToken
@RestController
@ -190,6 +193,7 @@ public class ViidController {
*/
@RequestMapping(value = "/Faces", method = RequestMethod.POST)
@IgnoreLogReq
@RequestToFile
public VIIDBaseResp faces(@RequestBody FaceUploadReq req) {
FaceListObject faceListObject = req.getFaceListObject();
List<FaceObject> faceObject = faceListObject.getFaceObject();
@ -198,7 +202,6 @@ public class ViidController {
for (FaceObject face : faceObject) {
// 设置FaceId
faceId = face.getFaceID();
Long newFaceSampleId = SnowFlakeUtil.getLongId();
// 获取图片信息
SubImageList subImageList = face.getSubImageList();
// 判断人脸对象中的列表是否为空
@ -207,14 +210,31 @@ public class ViidController {
if (device == null) {
continue;
}
Date shotTime = new Date();
DeviceConfigEntity deviceConfig = deviceRepository.getDeviceConfig(device.getId());
int viidMode = 0;
if (deviceConfig != null && deviceConfig.getViidType() != null) {
viidMode = deviceConfig.getViidType();
}
Date shotTime = null;
if (StringUtils.isNotBlank(face.getShotTime())) {
try {
shotTime = sdfTime.parse(face.getShotTime());
} catch (ParseException e) {
throw new RuntimeException(e);
log.warn("拍摄时间时间转换失败使用当前时间。错误entity{}", face);
}
}
if (shotTime == null) {
if (StringUtils.isNotBlank(face.getFaceAppearTime())) {
try {
shotTime = sdfTime.parse(face.getFaceAppearTime());
} catch (ParseException e) {
log.warn("拍摄时间时间转换失败使用当前时间。错误entity{}", face);
}
}
}
if (shotTime == null) {
shotTime = new Date();
}
Long scenicId = device.getScenicId();
if (scenicId == null) {
continue;
@ -225,48 +245,79 @@ public class ViidController {
facePosition.setRbY(face.getRightBtmY());
facePosition.setRbX(face.getRightBtmX());
if (ObjectUtil.isNotEmpty(subImageList) && CollUtil.isNotEmpty(subImageList.getSubImageInfoObject())) {
// 遍历每个图片对象
for (SubImageInfoObject subImage : subImageList.getSubImageInfoObject()) {
// base64转换成MultipartFIle
MultipartFile file = ImageUtils.base64ToMultipartFile(subImage.getData());
String ext = subImage.getFileFormat();
if (ext.equalsIgnoreCase("jpeg")) {
ext = "jpg";
if (viidMode == 0) {
// 遍历每个图片对象
// 先找到type14的图片
List<SubImageInfoObject> type14ImageList = subImageList.getSubImageInfoObject().stream().filter(subImage -> "14".equals(subImage.getType())).collect(Collectors.toList());
for (SubImageInfoObject subImage : subImageList.getSubImageInfoObject()) {
// base64转换成MultipartFIle
MultipartFile file = ImageUtils.base64ToMultipartFile(subImage.getData());
String ext = subImage.getFileFormat();
if (ext.equalsIgnoreCase("jpeg")) {
ext = "jpg";
}
IStorageAdapter adapter = StorageFactory.use("faces");
// Type=11 人脸
if (subImage.getType().equals("11")) {
// 上传oss
FaceSampleEntity faceSample = new FaceSampleEntity();
Long newFaceSampleId = SnowFlakeUtil.getLongId();
faceSample.setId(newFaceSampleId);
faceSample.setScenicId(scenicId);
faceSample.setDeviceId(device.getId());
faceSample.setStatus(0);
faceSample.setCreateAt(shotTime);
String url = adapter.uploadFile(file, "user-face", UUID.randomUUID() + "." + ext);
faceSample.setFaceUrl(url);
faceSampleMapper.add(faceSample);
DynamicTaskGenerator.addTask(faceSample.getId());
taskFaceService.addFaceSample(faceSample.getId());
for (SubImageInfoObject _subImage : type14ImageList) {
facePosition.setImgHeight(_subImage.getHeight());
facePosition.setImgWidth(_subImage.getWidth());
SourceEntity source = new SourceEntity();
source.setId(SnowFlakeUtil.getLongId());
source.setDeviceId(device.getId());
source.setScenicId(device.getScenicId());
source.setFaceSampleId(newFaceSampleId);
source.setCreateTime(shotTime);
source.setType(2);
// 上传oss
MultipartFile _file = ImageUtils.base64ToMultipartFile(_subImage.getData());
String _sourceUrl = adapter.uploadFile(_file, "user-photo", UUID.randomUUID() + "." + ext);
source.setUrl(_sourceUrl);
source.setPosJson(JSON.toJSONString(facePosition));
sourceMapper.add(source);
}
log.info("人脸信息及原图{}张入库成功设备ID{}", type14ImageList.size(), deviceID);
}
}
IStorageAdapter adapter = StorageFactory.use("faces");
// Type=11 人脸
if (subImage.getType().equals("11")) {
// 上传oss
FaceSampleEntity faceSample = new FaceSampleEntity();
faceSample.setId(newFaceSampleId);
faceSample.setScenicId(scenicId);
faceSample.setDeviceId(device.getId());
faceSample.setStatus(0);
faceSample.setCreateAt(shotTime);
String url = adapter.uploadFile(file, "user-face", UUID.randomUUID() + "." + ext);
faceSample.setFaceUrl(url);
faceSampleMapper.add(faceSample);
log.info("人脸信息入库成功设备ID{}", deviceID);
DynamicTaskGenerator.addTask(faceSample.getId());
taskFaceService.addFaceSample(faceSample.getId());
}
// Type=14 场景图
else if (subImage.getType().equals("14")) {
facePosition.setImgHeight(subImage.getHeight());
facePosition.setImgWidth(subImage.getWidth());
SourceEntity source = new SourceEntity();
source.setId(SnowFlakeUtil.getLongId());
source.setDeviceId(device.getId());
source.setScenicId(device.getScenicId());
source.setFaceSampleId(newFaceSampleId);
source.setCreateTime(shotTime);
source.setType(2);
// 上传oss
String url = adapter.uploadFile(file, "user-photo", UUID.randomUUID() + "." + ext);
source.setUrl(url);
source.setPosJson(JSON.toJSONString(facePosition));
sourceMapper.add(source);
log.info("源照片入库成功设备ID{}", deviceID);
} else if (viidMode == 1) {
for (SubImageInfoObject subImage : subImageList.getSubImageInfoObject()) {
// base64转换成MultipartFIle
MultipartFile file = ImageUtils.base64ToMultipartFile(subImage.getData());
String ext = subImage.getFileFormat();
if (ext.equalsIgnoreCase("jpeg")) {
ext = "jpg";
}
IStorageAdapter adapter = StorageFactory.use("faces");
// Type=14 人脸有这么传的嘛
if (subImage.getType().equals("14")) {
// 上传oss
FaceSampleEntity faceSample = new FaceSampleEntity();
Long newFaceSampleId = SnowFlakeUtil.getLongId();
faceSample.setId(newFaceSampleId);
faceSample.setScenicId(scenicId);
faceSample.setDeviceId(device.getId());
faceSample.setStatus(0);
faceSample.setCreateAt(shotTime);
String url = adapter.uploadFile(file, "user-face", UUID.randomUUID() + "." + ext);
faceSample.setFaceUrl(url);
faceSampleMapper.add(faceSample);
DynamicTaskGenerator.addTask(faceSample.getId());
taskFaceService.addFaceSample(faceSample.getId());
log.info("模式1人脸信息入库成功设备ID{}", deviceID);
}
}
}
}

View File

@ -13,6 +13,7 @@ public enum StatisticEnum {
MESSAGE_PUSH(6,"消息推送"),
DOWNLOAD(8,"下载"),
CLICK_ON_PAYMENT(9,"点击支付、购买"),
OTHER_ENTER(10,"其他渠道进入"),
;

View File

@ -33,4 +33,5 @@ public class ContentPageVO {
@ApiModelProperty("是否购买0未购买1已购买")
private Integer isBuy;
private BigDecimal duration;
private Integer goodsType;
}

View File

@ -13,7 +13,8 @@ import lombok.Data;
public class AppStatisticsFunnelVO {
@ApiModelProperty("镜头检测游客数")
private Integer cameraShotOfMemberNum;
// private Integer cameraShotOfMemberNum;
private String cameraShotOfMemberNum;
@ApiModelProperty("镜头检测游客数_扫码访问人数_转化率")
private String csom_scaom;
@ApiModelProperty("扫码访问人数")

View File

@ -15,6 +15,7 @@ public class DeviceConfigEntity {
* 设备id
*/
private Long deviceId;
private Integer viidType;
/**
* 启用时间
*/

View File

@ -31,6 +31,7 @@ public class OrderItemVO {
@ApiModelProperty("商品IDgoods_type=1关联video.id=2关联source.id")
private Long goodsId;
private Long faceId;
private String faceUrl;
@ApiModelProperty("景区名称")
private String scenicName;
@ApiModelProperty("商品名称 模版名称/原片x个/照片x个")

View File

@ -12,11 +12,14 @@ public class SlidingWindowRateLimiter {
public SlidingWindowRateLimiter(int maxRequestsPerSecond) {
this.semaphore = new Semaphore(maxRequestsPerSecond);
// Schedule a task to release all permits every second
scheduler.scheduleAtFixedRate(() -> semaphore.release(maxRequestsPerSecond - semaphore.availablePermits()), 1, 1, TimeUnit.SECONDS);
scheduler.scheduleAtFixedRate(() -> {
if (semaphore.availablePermits() < maxRequestsPerSecond) {
semaphore.release(1);
}
}, 0, (1000 / maxRequestsPerSecond), TimeUnit.MILLISECONDS);
}
public void allowRequest() throws InterruptedException {
public void aquire() throws InterruptedException {
semaphore.acquire();
}

View File

@ -70,8 +70,12 @@ public class DeviceRepository {
}
if (redisTemplate.hasKey(String.format(DEVICE_CACHE_KEY, deviceNo))) {
DeviceEntity device = getDeviceByDeviceNo(deviceNo);
redisTemplate.delete(String.format(DEVICE_CACHE_KEY, device.getNo()));
clearDeviceCache(device.getId());
if (device != null) {
redisTemplate.delete(String.format(DEVICE_CACHE_KEY, device.getNo()));
clearDeviceCache(device.getId());
} else {
redisTemplate.delete(String.format(DEVICE_CACHE_KEY, deviceNo));
}
}
redisTemplate.delete(String.format(DEVICE_CACHE_KEY, deviceNo));
return true;

View File

@ -70,6 +70,9 @@ public class ScenicRepository {
return JSONObject.parseObject(redisTemplate.opsForValue().get(String.format(SCENIC_MP_NOTIFY_CACHE_KEY, scenicId)), ScenicMpNotifyVO.class);
}
MpConfigEntity mpConfig = getScenicMpConfig(scenicId);
if (mpConfig == null) {
return null;
}
ScenicMpNotifyVO mpNotifyConfig = new ScenicMpNotifyVO();
mpNotifyConfig.setAppId(mpConfig.getAppId());
mpNotifyConfig.setAppSecret(mpConfig.getAppSecret());

View File

@ -8,6 +8,7 @@ import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Objects;
@Component
public class SourceRepository {
@ -44,10 +45,16 @@ public class SourceRepository {
switch (type) {
case 1:
List<SourceEntity> videoSourceList = sourceMapper.listVideoByFaceRelation(userId, faceId);
return videoSourceList.stream().anyMatch(item -> Integer.valueOf(1).equals(item.getIsBuy()));
if (videoSourceList == null || videoSourceList.isEmpty()) {
return false;
}
return videoSourceList.stream().filter(Objects::nonNull).anyMatch(item -> Integer.valueOf(1).equals(item.getIsBuy()));
case 2:
List<SourceEntity> imageSourceList = sourceMapper.listImageByFaceRelation(userId, faceId);
return imageSourceList.stream().anyMatch(item -> Integer.valueOf(1).equals(item.getIsBuy()));
if (imageSourceList == null || imageSourceList.isEmpty()) {
return false;
}
return imageSourceList.stream().filter(Objects::nonNull).anyMatch(item -> Integer.valueOf(1).equals(item.getIsBuy()));
default:
return false;
}

View File

@ -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);

View File

@ -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){

View File

@ -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());
}

View File

@ -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);

View File

@ -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;
}

View File

@ -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());

View File

@ -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);
}

View File

@ -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) {

View File

@ -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}}

View File

@ -57,7 +57,7 @@ public class DownloadNotificationTasker {
log.info("发送模板消息");
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}}
* 备注 {{thing3.DATA}}
@ -91,6 +91,9 @@ public class DownloadNotificationTasker {
MpConfigEntity scenicMp = scenicRepository.getScenicMpConfig(member.getScenicId());
ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(item.getScenicId());
Integer videoStoreDay = scenicConfig.getVideoStoreDay();
if (videoStoreDay == null) {
videoStoreDay = 3;
}
// 发送模板消息
String templateId = scenicRepository.getVideoPreExpireTemplateId(item.getScenicId());
if (StringUtils.isBlank(templateId)) {
@ -100,7 +103,7 @@ public class DownloadNotificationTasker {
log.info("发送模板消息");
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}}
* 过期时间 {{time2.DATA}}

View File

@ -85,12 +85,12 @@ public class DynamicTaskGenerator {
public static void addTask(Long faceSampleId) {
Date createTime = new Date();
// 分钟后
// 分钟后
createTime.setTime(createTime.getTime() + 30000L);
queue.add(new Task(faceSampleId, createTime));
}
@Scheduled(fixedRate = 10000L)
@Scheduled(fixedDelay = 500L)
public void doTask() {
Task task = queue.poll();
if (task == null) {

View File

@ -41,7 +41,7 @@ public class WxMpUtil {
JSONObject json = new JSONObject();
json.put("env_version", "trial");
json.put("path", path);
json.put("width", 430);
json.put("width", 1000);
StringEntity entity = new StringEntity(json.toJSONString(), "utf-8");
httpPost.setEntity(entity);
httpPost.setHeader("Content-Type", "application/json");
@ -58,6 +58,6 @@ public class WxMpUtil {
}
public static void main(String[] args) throws Exception {
generateWXAQRCode("wxe7ff26af70bfc37c", "5252fbbc68513bc77b7cc0052b9f9695", "pages/home/index?scenicId=3942994647776890880", "a.jpg");
generateWXAQRCode("wxe7ff26af70bfc37c", "5252fbbc68513bc77b7cc0052b9f9695", "pages/home/index?scenicId=3946669713328836608", "cxzh_t.jpg");
}
}

View File

@ -29,7 +29,8 @@
</update>
<update id="updateConfig">
update device_config
set store_type = #{storeType},
set viid_type = #{viidType},
store_type = #{storeType},
store_config_json = #{storeConfigJson},
store_expire_day = #{storeExpireDay},
online_check = #{onlineCheck},

View File

@ -63,14 +63,16 @@
</resultMap>
<select id="getOrderItemList" parameterType="java.lang.Long" resultType="com.ycwl.basic.model.pc.order.resp.OrderItemVO">
WITH member_video_data AS (
SELECT mv.member_id, mv.video_id, t.cover_url, t.name, mv.face_id, v.video_url
SELECT mv.member_id, mv.video_id, t.cover_url, t.name, mv.face_id, f.face_url, v.video_url
FROM member_video mv
LEFT JOIN face f ON mv.face_id = f.id
LEFT JOIN template t ON mv.template_id = t.id
LEFT JOIN video v ON mv.video_id = v.id
),
member_source_data AS (
SELECT ms.member_id, ms.source_id, ms.face_id, s.video_url, s.url
SELECT ms.member_id, ms.source_id, ms.face_id, f.face_url, s.video_url, s.url
FROM member_source ms
LEFT JOIN face f ON ms.face_id = f.id
LEFT JOIN source s ON ms.source_id = s.id
)
SELECT
@ -94,6 +96,11 @@
WHEN '1' THEN oi.goods_id
WHEN '2' THEN oi.goods_id
END AS face_id,
CASE oi.goods_type
WHEN '0' THEN mvd.face_url
WHEN '1' THEN msd.face_url
WHEN '2' THEN msd.face_url
END AS face_url,
CASE oi.goods_type
WHEN '0' THEN mvd.video_url
WHEN '1' THEN msd.video_url

View File

@ -55,6 +55,9 @@
<if test="logoUrl!=null">
logo_url=#{logoUrl},
</if>
<if test="price!=null">
price=#{price},
</if>
</set>
where id = #{id}
</update>

View File

@ -10,7 +10,7 @@
select ifnull(sum(pay_price),0) as payPrice
from `order`
where
status = 1 and scenic_id = #{scenicId}
(status = 1 or status = 2) and scenic_id = #{scenicId}
<if test="startTime!= null">
and create_at >= #{startTime}
</if>
@ -36,7 +36,7 @@
</select>
<select id="countScanCodeOfMember" resultType="java.lang.Integer">
SELECT
IFNULL(SUM(count), 0) AS count
IFNULL(count(count), 0) AS count
FROM (
select count(1) as count
from statistics
@ -52,7 +52,7 @@
</select>
<select id="countClickPayOfMember" resultType="java.lang.Integer">
SELECT
IFNULL(SUM(count), 0) AS count
IFNULL(count(count), 0) AS count
FROM (
select count(1) as count
from statistics
@ -68,7 +68,7 @@
</select>
<select id="countPayOfMember" resultType="java.lang.Integer">
SELECT
IFNULL(SUM(count), 0) AS count
IFNULL(count(count), 0) AS count
FROM (
select count(1) as count
from statistics
@ -116,7 +116,7 @@
</select>
<select id="countPushOfMember" resultType="java.lang.Integer">
SELECT
IFNULL(SUM(count), 0) AS count
IFNULL(count(count), 0) AS count
FROM (
select count(1) as count
from statistics
@ -142,15 +142,17 @@
</if>
</select>
<select id="countUploadFaceOfMember" resultType="java.lang.Integer">
select count(1) as count
from face
where scenic_id = #{scenicId}
<if test="startTime!= null">
and create_at >= #{startTime}
</if>
<if test="endTime!= null">
and create_at &lt;= #{endTime}
select ifnull(count(1),0) as count
from(
select count(1) as count
from face
where scenic_id = #{scenicId}
<if test="startTime!= null">and create_at >= #{startTime}
</if><if test="
endTime!= null">and create_at &lt;= #{endTime}
</if>
group by member_id
) a
</select>
<select id="countCompleteVideoOfMember" resultType="java.lang.Integer">
select ifnull(count(1),0) as count
@ -170,11 +172,11 @@
</select>
<select id="countTotalVisitorOfMember" resultType="java.lang.Integer">
SELECT
IFNULL(SUM(count), 0) AS count
IFNULL(count(count), 0) AS count
FROM (
select count(1) as count
from statistics
where type=0 and scenic_id = #{scenicId}
where type in (0,10) and scenic_id = #{scenicId}
<if test="startTime!= null">
and create_time >= #{startTime}
</if>
@ -186,7 +188,7 @@
</select>
<select id="countCompleteOfVideo" resultType="java.lang.Integer">
select count(1) as count
from video
from task
where scenic_id = #{scenicId}
<if test="startTime!= null">
and create_time >= #{startTime}

View File

@ -68,7 +68,7 @@
delete from template_config where id = #{id}
</delete>
<select id="list" resultType="com.ycwl.basic.model.pc.template.resp.TemplateRespVO">
select t.id, t.scenic_id, s.name as scenic_name, t.`name`, t.cover_url, t.status, t.create_time, t.update_time, t.price, t.slash_price, t.sort
select t.*, s.name as scenic_name
from template t left join scenic s on s.id = t.scenic_id
<where>
pid = 0
@ -84,12 +84,12 @@
</where>
</select>
<select id="getById" resultType="com.ycwl.basic.model.pc.template.resp.TemplateRespVO">
select t.id, t.scenic_id, s.name as scenic_name, t.`name`, pid, is_placeholder, source_url, luts, overlays, audios, frame_rate, speed, t.cover_url, t.status, t.create_time, t.update_time, t.price, t.sort
select t.*, s.name as scenic_name
from template t left join scenic s on s.id = t.scenic_id
where t.id = #{id}
</select>
<select id="getByPid" resultType="com.ycwl.basic.model.pc.template.resp.TemplateRespVO">
select t.id, t.scenic_id, s.name as scenic_name, t.`name`, pid, is_placeholder, source_url, luts, overlays, audios, frame_rate, speed, t.cover_url, t.status, t.create_time, t.update_time
select t.*, s.name as scenic_name
from template t left join scenic s on s.id = t.scenic_id
where pid = #{id}
</select>