You've already forked FrameTour-BE
Compare commits
92 Commits
79ea08898b
...
master
Author | SHA1 | Date | |
---|---|---|---|
c2ce6f91ed | |||
da3de2cc89 | |||
d245d09837 | |||
4d8236afa1 | |||
04e2ade669 | |||
cd4678120d | |||
cf9802f9ec | |||
a84b38dab5 | |||
e32f231a8f | |||
f9fcb06355 | |||
2ae0b3c4b3 | |||
3bd8face68 | |||
1841e43b85 | |||
a9655814ae | |||
c1b4bc8952 | |||
4bacdbe39a | |||
4273cda7cd | |||
ceba1e1b01 | |||
34dbc7d036 | |||
89e112e13a | |||
26a9be80f6 | |||
a4a6e9b5af | |||
0d5aabe317 | |||
5d2cf4fd31 | |||
80f4491836 | |||
115edc19fa | |||
bfd37fc764 | |||
ef0ba3ddb4 | |||
88cce9357d | |||
c50cd84af0 | |||
0c40cdad4e | |||
a41b87713f | |||
06a07514cc | |||
0292b754fe | |||
460b4ea42a | |||
7fd62e9aba | |||
3b3c768bbe | |||
1e993c6fd4 | |||
937c2b33d3 | |||
9b00b34a68 | |||
c01ff160c3 | |||
aaddbab2ab | |||
570267fd83 | |||
44e0f4933b | |||
ab2be3d56b | |||
077698cdaa | |||
b141b39e50 | |||
c366495805 | |||
870e79cde5 | |||
2bf8bb4df5 | |||
164e76495e | |||
d9360acb5f | |||
2e92cf5c91 | |||
ef978529ac | |||
6197f13e8e | |||
00f38c949c | |||
c45dffa0a0 | |||
f8f49891a5 | |||
7771f85618 | |||
7583c9e22e | |||
bb26fa43bf | |||
46a8b254b5 | |||
2e41f72e0e | |||
e9d80cecc7 | |||
5a4f6a5af3 | |||
8ef2ef4b15 | |||
3863c0d963 | |||
b36da6ff35 | |||
da20a44049 | |||
877f37b6f9 | |||
f6f847e41c | |||
8ac386242d | |||
3f11aadd75 | |||
d620bde5fa | |||
5a7c39429e | |||
7234e08616 | |||
45409ba1ab | |||
b5b9064f30 | |||
d0d4e37526 | |||
73d393b436 | |||
2835346447 | |||
75eb3732fc | |||
692df3a1a2 | |||
fe0397af8e | |||
f17e2364b6 | |||
59978b6be5 | |||
20d78cb487 | |||
4e9d6807d6 | |||
8af8bd6bcf | |||
248c06a30c | |||
dabdde33a6 | |||
c9a4116ed6 |
25
pom.xml
25
pom.xml
@ -5,38 +5,43 @@
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>2.7.18</version>
|
||||
<version>3.1.4</version>
|
||||
<relativePath/> <!-- lookup parent from repository -->
|
||||
</parent>
|
||||
<groupId>com.ycwl</groupId>
|
||||
<artifactId>basic</artifactId>
|
||||
<artifactId>basic21</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<name>liuying</name>
|
||||
<description>流影</description>
|
||||
|
||||
|
||||
<properties>
|
||||
<java.version>8</java.version>
|
||||
<maven.compiler.source>8</maven.compiler.source>
|
||||
<maven.compiler.target>8</maven.compiler.target>
|
||||
<mybatisplus.boot.starter.version>3.4.0</mybatisplus.boot.starter.version>
|
||||
<java.version>21</java.version>
|
||||
<maven.compiler.source>21</maven.compiler.source>
|
||||
<maven.compiler.target>21</maven.compiler.target>
|
||||
<hutool-all.version>5.8.24</hutool-all.version>
|
||||
<mysql-connector.version>8.0.33</mysql-connector.version>
|
||||
<fastjson.version>1.2.83</fastjson.version>
|
||||
<knife4j-spring-boot-starter.version>2.0.7</knife4j-spring-boot-starter.version>
|
||||
<pagehelper.version>5.3.1</pagehelper.version>
|
||||
<tomcat.version>9.0.102</tomcat.version>
|
||||
<!--跳过单元测试-->
|
||||
<skipTests>true</skipTests>
|
||||
</properties>
|
||||
|
||||
|
||||
<dependencies>
|
||||
<!-- 添加 jakarta.servlet-api 依赖 -->
|
||||
<dependency>
|
||||
<groupId>jakarta.servlet</groupId>
|
||||
<artifactId>jakarta.servlet-api</artifactId>
|
||||
<version>6.0.0</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<!-- 微信支付 -->
|
||||
<dependency>
|
||||
<groupId>com.github.wechatpay-apiv3</groupId>
|
||||
<artifactId>wechatpay-java</artifactId>
|
||||
<version>0.2.12</version>
|
||||
<version>0.2.14</version>
|
||||
</dependency>
|
||||
<!-- 引入aop相关 -->
|
||||
<dependency>
|
||||
@ -85,7 +90,7 @@
|
||||
<dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
<artifactId>mybatis-plus-boot-starter</artifactId>
|
||||
<version>${mybatisplus.boot.starter.version}</version>
|
||||
<version>3.5.5</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 引入lombok工具 -->
|
||||
@ -179,7 +184,7 @@
|
||||
<dependency>
|
||||
<groupId>com.aliyun</groupId>
|
||||
<artifactId>aliyun-java-sdk-core</artifactId>
|
||||
<version>4.6.1</version>
|
||||
<version>4.6.4</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.aliyun</groupId>
|
||||
|
@ -1,11 +0,0 @@
|
||||
package com.ycwl.basic.annotation;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(value = {ElementType.METHOD})
|
||||
public @interface RequestToFile {
|
||||
}
|
@ -1,69 +0,0 @@
|
||||
package com.ycwl.basic.aspectj;
|
||||
|
||||
import com.ycwl.basic.annotation.RequestToFile;
|
||||
import com.ycwl.basic.config.CachedBodyHttpServletRequest;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.aspectj.lang.ProceedingJoinPoint;
|
||||
import org.aspectj.lang.annotation.After;
|
||||
import org.aspectj.lang.annotation.Around;
|
||||
import org.aspectj.lang.annotation.Aspect;
|
||||
import org.aspectj.lang.annotation.Pointcut;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.context.request.RequestContextHolder;
|
||||
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Enumeration;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Aspect
|
||||
@Component
|
||||
@Slf4j
|
||||
public class HttpSaver {
|
||||
|
||||
@Pointcut("@annotation(com.ycwl.basic.annotation.RequestToFile)")
|
||||
public void requestToFilePointCut() {
|
||||
}
|
||||
|
||||
@After("requestToFilePointCut()")
|
||||
public void requestToFile() throws IOException {
|
||||
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
|
||||
if (attributes == null) {
|
||||
return;
|
||||
}
|
||||
HttpServletRequest request = attributes.getRequest();
|
||||
saveRequestToFile(request);
|
||||
}
|
||||
|
||||
public static void saveRequestToFile(HttpServletRequest request) throws IOException {
|
||||
File file = new File("./request/"+System.currentTimeMillis()+".http");
|
||||
// 写入文件
|
||||
if (!file.getParentFile().exists()) {
|
||||
file.getParentFile().mkdirs();
|
||||
}
|
||||
if (!file.exists()) {
|
||||
file.createNewFile();
|
||||
}
|
||||
try (java.io.FileWriter writer = new java.io.FileWriter(file, true)) {
|
||||
writer.append(request.getMethod()).append(" ").append(request.getRequestURL());
|
||||
String queryString = request.getQueryString();
|
||||
if (queryString != null) {
|
||||
writer.append("?").append(queryString);
|
||||
}
|
||||
writer.append("\r\n");
|
||||
Enumeration<String> headerNames = request.getHeaderNames();
|
||||
while (headerNames.hasMoreElements()) {
|
||||
String headerName = headerNames.nextElement();
|
||||
writer.append(headerName).append(": ").append(request.getHeader(headerName)).append("\r\n");
|
||||
}
|
||||
writer.append("\r\n");
|
||||
// 获取body
|
||||
CachedBodyHttpServletRequest cachedRequest = (CachedBodyHttpServletRequest) request;
|
||||
writer.append(new String(cachedRequest.getCachedBody()));
|
||||
writer.append("\r\n");
|
||||
}
|
||||
}
|
||||
}
|
@ -13,8 +13,8 @@ import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.context.request.RequestContextHolder;
|
||||
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashMap;
|
||||
|
@ -53,7 +53,7 @@ public class BrokerBiz {
|
||||
expireDay = scenicConfig.getSampleStoreDay();
|
||||
}
|
||||
List<Long> brokerIdList = statisticsMapper.getBrokerIdListForUser(order.getMemberId(), DateUtil.offsetDay(DateUtil.beginOfDay(order.getCreateAt()), -expireDay), order.getCreateAt());
|
||||
Long directBrokerId = brokerIdList.get(0);
|
||||
Long directBrokerId = brokerIdList.getFirst();
|
||||
List<BrokerRespVO> brokerInfoList = brokerIdList.stream().map(brokerId -> {
|
||||
BrokerRespVO broker = brokerMapper.getById(brokerId);
|
||||
if (broker == null) {
|
||||
@ -77,7 +77,7 @@ public class BrokerBiz {
|
||||
if (brokerInfoList.size() == 1) {
|
||||
// 直接算佣金
|
||||
String reason = "单人提成:";
|
||||
BrokerRespVO broker = brokerInfoList.get(0);
|
||||
BrokerRespVO broker = brokerInfoList.getFirst();
|
||||
BrokerRecord brokerRecord = new BrokerRecord();
|
||||
brokerRecord.setBrokerId(broker.getId());
|
||||
brokerRecord.setOrderId(orderId);
|
||||
@ -95,7 +95,7 @@ public class BrokerBiz {
|
||||
brokerRecord.setReason(reason);
|
||||
brokerRecordList.add(brokerRecord);
|
||||
} else {
|
||||
BrokerRespVO broker = brokerInfoList.get(0);
|
||||
BrokerRespVO broker = brokerInfoList.getFirst();
|
||||
BigDecimal realRate = broker.getBrokerRate();
|
||||
BigDecimal brokerPrice = order.getPayPrice().multiply(realRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN);
|
||||
// todo 需要计算实际提成比例
|
||||
@ -141,9 +141,7 @@ public class BrokerBiz {
|
||||
brokerRecordList.add(brokerRecord);
|
||||
}
|
||||
revokeOrder(orderId);
|
||||
brokerRecordList.forEach(brokerRecord -> {
|
||||
brokerRecordMapper.add(brokerRecord);
|
||||
});
|
||||
brokerRecordList.forEach(brokerRecordMapper::add);
|
||||
}
|
||||
|
||||
public void revokeOrder(Long orderId) {
|
||||
|
@ -32,8 +32,10 @@ import com.ycwl.basic.repository.SourceRepository;
|
||||
import com.ycwl.basic.repository.TemplateRepository;
|
||||
import com.ycwl.basic.repository.VideoRepository;
|
||||
import com.ycwl.basic.repository.VideoTaskRepository;
|
||||
import com.ycwl.basic.service.printer.PrinterService;
|
||||
import com.ycwl.basic.utils.ApiResponse;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
@ -74,6 +76,9 @@ public class OrderBiz {
|
||||
private BrokerBiz brokerBiz;
|
||||
@Autowired
|
||||
private CouponBiz couponBiz;
|
||||
@Autowired
|
||||
@Lazy
|
||||
private PrinterService printerService;
|
||||
|
||||
public PriceObj queryPrice(Long scenicId, int goodsType, Long goodsId) {
|
||||
PriceObj priceObj = new PriceObj();
|
||||
@ -161,15 +166,11 @@ public class OrderBiz {
|
||||
}
|
||||
// 免费送逻辑,之前已经赠送了的
|
||||
if (!isBuy) {
|
||||
switch (goodsType) {
|
||||
case 0:
|
||||
isBuy = videoRepository.getUserIsBuy(userId, goodsId);
|
||||
break;
|
||||
case 1:
|
||||
case 2:
|
||||
isBuy = sourceRepository.getUserIsBuy(userId, goodsType, goodsId);
|
||||
break;
|
||||
}
|
||||
isBuy = switch (goodsType) {
|
||||
case 0 -> videoRepository.getUserIsBuy(userId, goodsId);
|
||||
case 1, 2 -> sourceRepository.getUserIsBuy(userId, goodsType, goodsId);
|
||||
default -> false;
|
||||
};
|
||||
} else {
|
||||
OrderEntity orderEntity = orderRepository.getUserBuyItem(userId, goodsType, goodsId);
|
||||
if (orderEntity != null) {
|
||||
@ -237,6 +238,8 @@ public class OrderBiz {
|
||||
case 1: // 视频原素材
|
||||
case 2: // 照片原素材
|
||||
sourceRepository.setUserIsBuyItem(order.getMemberId(), item.getGoodsType(), item.getGoodsId(), order.getId());
|
||||
case 3:
|
||||
printerService.setUserIsBuyItem(order.getMemberId(), item.getGoodsId(), order.getId());
|
||||
}
|
||||
});
|
||||
orderRepository.clearOrderCache(orderId); // 更新完了,清理下
|
||||
@ -250,7 +253,7 @@ public class OrderBiz {
|
||||
//商品创建时间
|
||||
Date goodsCreateTime = new Date();
|
||||
if (!orderDetail.getOrderItemList().isEmpty()) {
|
||||
OrderItemVO orderItemVO = orderDetail.getOrderItemList().get(0);
|
||||
OrderItemVO orderItemVO = orderDetail.getOrderItemList().getFirst();
|
||||
switch (orderItemVO.getGoodsType()) {
|
||||
case 0:
|
||||
VideoEntity video = videoRepository.getVideo(orderItemVO.getGoodsId());
|
||||
|
@ -112,7 +112,7 @@ public class TaskStatusBiz {
|
||||
int faceCutStatus = getFaceCutStatus(faceId);
|
||||
if (faceCutStatus != 1) {
|
||||
// 正在切片
|
||||
if (templateBiz.determineTemplateCanGenerate(templateList.get(0).getId(), faceId, false)) {
|
||||
if (templateBiz.determineTemplateCanGenerate(templateList.getFirst().getId(), faceId, false)) {
|
||||
response.setStatus(2);
|
||||
} else {
|
||||
response.setStatus(0);
|
||||
|
@ -107,7 +107,7 @@ public class TemplateBiz {
|
||||
List<SourceEntity> sourceEntities = sourceMapper.listVideoByScenicFaceRelation(face.getScenicId(), faceId);
|
||||
count = sourceEntities.stream()
|
||||
.map(SourceEntity::getDeviceId)
|
||||
.filter(deviceId -> deviceId != null) // 添加对 null 的检查
|
||||
.filter(Objects::nonNull) // 添加对 null 的检查
|
||||
.distinct()
|
||||
.filter(deviceId -> placeholderList.contains(deviceId.toString()))
|
||||
.count();
|
||||
|
@ -1,59 +0,0 @@
|
||||
package com.ycwl.basic.config;
|
||||
|
||||
import javax.servlet.ReadListener;
|
||||
import javax.servlet.ServletInputStream;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletRequestWrapper;
|
||||
import java.io.*;
|
||||
|
||||
public class CachedBodyHttpServletRequest extends HttpServletRequestWrapper {
|
||||
private final byte[] cachedBody;
|
||||
|
||||
public CachedBodyHttpServletRequest(HttpServletRequest request) throws IOException {
|
||||
super(request);
|
||||
// 缓存请求体内容
|
||||
InputStream requestInputStream = request.getInputStream();
|
||||
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
||||
byte[] buffer = new byte[1024];
|
||||
int read;
|
||||
while ((read = requestInputStream.read(buffer)) != -1) {
|
||||
byteArrayOutputStream.write(buffer, 0, read);
|
||||
}
|
||||
cachedBody = byteArrayOutputStream.toByteArray();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ServletInputStream getInputStream() {
|
||||
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(cachedBody);
|
||||
return new ServletInputStream() {
|
||||
@Override
|
||||
public int read() {
|
||||
return byteArrayInputStream.read();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFinished() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isReady() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setReadListener(ReadListener readListener) {
|
||||
// 不需要实现
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public BufferedReader getReader() {
|
||||
return new BufferedReader(new InputStreamReader(this.getInputStream()));
|
||||
}
|
||||
|
||||
public byte[] getCachedBody() {
|
||||
return cachedBody;
|
||||
}
|
||||
}
|
@ -3,8 +3,7 @@ package com.ycwl.basic.config;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.module.SimpleModule;
|
||||
import com.ycwl.basic.interceptor.AuthInterceptor;
|
||||
import com.ycwl.basic.xss.XssJacksonDeserializer;
|
||||
import com.ycwl.basic.xss.XssJacksonSerializer;
|
||||
import com.ycwl.basic.stats.interceptor.StatsInterceptor;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
@ -29,13 +28,17 @@ public class WebMvcConfig implements WebMvcConfigurer {
|
||||
|
||||
@Autowired
|
||||
private AuthInterceptor authInterceptor;
|
||||
@Autowired
|
||||
private StatsInterceptor statsInterceptor;
|
||||
|
||||
@Override
|
||||
public void addInterceptors(InterceptorRegistry registry) {
|
||||
registry.addInterceptor(authInterceptor)
|
||||
// 拦截除指定接口外的所有请求,通过判断 注解 来决定是否需要做登录验证
|
||||
.addPathPatterns("/**")
|
||||
.excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v2/api-docs", "/doc.html/**", "/error", "/csrf", "/");
|
||||
.excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v2/api-docs", "/doc.html/**", "/error", "/");
|
||||
registry.addInterceptor(statsInterceptor)
|
||||
.addPathPatterns("/api/mobile/**");
|
||||
}
|
||||
|
||||
/**
|
||||
@ -78,25 +81,6 @@ public class WebMvcConfig implements WebMvcConfigurer {
|
||||
}
|
||||
|
||||
|
||||
@Bean
|
||||
public WebMvcConfigurer createConvert() {
|
||||
return new WebMvcConfigurer() {
|
||||
@Override
|
||||
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
|
||||
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
|
||||
ObjectMapper mapper = builder.build();
|
||||
/*注入自定义的序列化工具,将RequestBody的参数进行转译后传输*/
|
||||
SimpleModule simpleModule = new SimpleModule();
|
||||
// XSS序列化
|
||||
simpleModule.addSerializer(String.class, new XssJacksonSerializer());
|
||||
simpleModule.addDeserializer(String.class, new XssJacksonDeserializer());
|
||||
mapper.registerModule(simpleModule);
|
||||
converters.add(new MappingJackson2HttpMessageConverter(mapper));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@Autowired
|
||||
private StringHttpMessageConverter stringHttpMessageConverter;
|
||||
@Autowired
|
||||
|
@ -1,73 +0,0 @@
|
||||
package com.ycwl.basic.config;
|
||||
|
||||
import lombok.Data;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* 微信小程序配置
|
||||
*
|
||||
* @author songmingsong
|
||||
**/
|
||||
@Data
|
||||
@Component
|
||||
@ConfigurationProperties(prefix = "wx")
|
||||
public class WechatConfig {
|
||||
|
||||
/**
|
||||
* 公众号的appId
|
||||
*/
|
||||
private String appId;
|
||||
|
||||
/**
|
||||
* 公众号的密钥
|
||||
*/
|
||||
private String appSecret;
|
||||
|
||||
|
||||
/**
|
||||
* 小程序的AppId
|
||||
*/
|
||||
private String miniProgramAppId;
|
||||
|
||||
/**
|
||||
* 小程序的secret
|
||||
*/
|
||||
private String miniProgramSecret;
|
||||
|
||||
/**
|
||||
* 申请openid授权
|
||||
*/
|
||||
private String grandType;
|
||||
|
||||
/**
|
||||
* 商户号
|
||||
*/
|
||||
private String mchId;
|
||||
|
||||
/**
|
||||
* 商户证书序列号
|
||||
*/
|
||||
private String mchSerialNo;
|
||||
|
||||
/**
|
||||
* 支付回调接口地址
|
||||
*/
|
||||
private String payNotifyUrl;
|
||||
/**
|
||||
* 退款回调接口地址
|
||||
*/
|
||||
private String refundNotifyUrl;
|
||||
|
||||
/**
|
||||
* 商户API私钥路径
|
||||
*/
|
||||
private String keyPath;
|
||||
|
||||
/**
|
||||
* 商户APIV3密钥
|
||||
*/
|
||||
private String apiV3;
|
||||
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
package com.ycwl.basic.constant;
|
||||
|
||||
import com.ycwl.basic.utils.StringUtil;
|
||||
import lombok.Data;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.HashMap;
|
||||
@ -10,29 +10,29 @@ import java.util.Map;
|
||||
@Data
|
||||
public class BaseContextHandler {
|
||||
|
||||
public static ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal();
|
||||
public static ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal<>();
|
||||
|
||||
public BaseContextHandler() {
|
||||
}
|
||||
|
||||
public static void set(String key, Object value) {
|
||||
Object map;
|
||||
if ((map = (Map) threadLocal.get()) == null) {
|
||||
map = new HashMap();
|
||||
threadLocal.set((Map<String, Object>) map);
|
||||
Map<String, Object> map;
|
||||
if ((map = threadLocal.get()) == null) {
|
||||
map = new HashMap<>();
|
||||
threadLocal.set(map);
|
||||
}
|
||||
|
||||
((Map) map).put(key, value);
|
||||
map.put(key, value);
|
||||
}
|
||||
|
||||
public static Object get(String key) {
|
||||
Object map;
|
||||
if ((map = (Map) threadLocal.get()) == null) {
|
||||
map = new HashMap();
|
||||
threadLocal.set((Map<String, Object>) map);
|
||||
Map<String, Object> map;
|
||||
if ((map = threadLocal.get()) == null) {
|
||||
map = new HashMap<>();
|
||||
threadLocal.set(map);
|
||||
}
|
||||
|
||||
return ((Map) map).get(key);
|
||||
return (map).get(key);
|
||||
}
|
||||
|
||||
public static void setToken(String token) {
|
||||
@ -40,7 +40,13 @@ public class BaseContextHandler {
|
||||
}
|
||||
|
||||
public static String getToken() {
|
||||
return StringUtil.a(get("currentUserToken"));
|
||||
if (get("currentUserToken") == null) {
|
||||
return "";
|
||||
}
|
||||
if (StringUtils.isEmpty(get("currentUserToken").toString())) {
|
||||
return "";
|
||||
}
|
||||
return get("currentUserToken").toString();
|
||||
}
|
||||
|
||||
public static String getAccount() {
|
||||
|
@ -5,4 +5,6 @@ public class StorageConstant {
|
||||
public static final String VIDEO_PIECE_PATH = "source_video";
|
||||
public static final String PHOTO_PATH = "source_photo";
|
||||
public static final String PHOTO_WATERMARKED_PATH = "photo_w";
|
||||
public static final String VIID_FACE = "viid_face";
|
||||
public static final String USER_FACE = "user_face";
|
||||
}
|
||||
|
@ -1,126 +0,0 @@
|
||||
package com.ycwl.basic.constant;
|
||||
|
||||
import com.wechat.pay.java.service.payments.model.Transaction;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* <p>@description: 微信常量 </p>
|
||||
* <p>@author: songmingsong </p>
|
||||
**/
|
||||
public class WeiXinConstant {
|
||||
|
||||
private static final Map<Transaction.TradeStateEnum, String> STATE_DESCRIPTION_MAP = new HashMap<>();
|
||||
|
||||
static {
|
||||
STATE_DESCRIPTION_MAP.put(com.wechat.pay.java.service.payments.model.Transaction.TradeStateEnum.SUCCESS, "SUCCESS");
|
||||
STATE_DESCRIPTION_MAP.put(com.wechat.pay.java.service.payments.model.Transaction.TradeStateEnum.REFUND, "REFUND");
|
||||
STATE_DESCRIPTION_MAP.put(com.wechat.pay.java.service.payments.model.Transaction.TradeStateEnum.NOTPAY, "NOTPAY");
|
||||
STATE_DESCRIPTION_MAP.put(com.wechat.pay.java.service.payments.model.Transaction.TradeStateEnum.CLOSED, "CLOSED");
|
||||
STATE_DESCRIPTION_MAP.put(com.wechat.pay.java.service.payments.model.Transaction.TradeStateEnum.REVOKED, "REVOKED");
|
||||
STATE_DESCRIPTION_MAP.put(com.wechat.pay.java.service.payments.model.Transaction.TradeStateEnum.USERPAYING, "USERPAYING");
|
||||
STATE_DESCRIPTION_MAP.put(com.wechat.pay.java.service.payments.model.Transaction.TradeStateEnum.PAYERROR, "PAYERROR");
|
||||
STATE_DESCRIPTION_MAP.put(com.wechat.pay.java.service.payments.model.Transaction.TradeStateEnum.ACCEPT, "ACCEPT");
|
||||
}
|
||||
|
||||
public static String getDescriptionState(com.wechat.pay.java.service.payments.model.Transaction.TradeStateEnum state) {
|
||||
return STATE_DESCRIPTION_MAP.getOrDefault(state, "未知状态");
|
||||
}
|
||||
|
||||
private static final Map<com.wechat.pay.java.service.payments.model.Transaction.TradeTypeEnum, String> STATE_DESCRIPTION_MAP_TYPE = new HashMap<>();
|
||||
|
||||
static {
|
||||
STATE_DESCRIPTION_MAP_TYPE.put(Transaction.TradeTypeEnum.JSAPI, "JSAPI");
|
||||
STATE_DESCRIPTION_MAP_TYPE.put(Transaction.TradeTypeEnum.NATIVE, "NATIVE");
|
||||
STATE_DESCRIPTION_MAP_TYPE.put(Transaction.TradeTypeEnum.APP, "APP");
|
||||
STATE_DESCRIPTION_MAP_TYPE.put(Transaction.TradeTypeEnum.MICROPAY, "MICROPAY");
|
||||
STATE_DESCRIPTION_MAP_TYPE.put(Transaction.TradeTypeEnum.MWEB, "MWEB");
|
||||
STATE_DESCRIPTION_MAP_TYPE.put(Transaction.TradeTypeEnum.FACEPAY, "FACEPAY");
|
||||
}
|
||||
|
||||
public static String getDescriptionType(Transaction.TradeTypeEnum type) {
|
||||
return STATE_DESCRIPTION_MAP_TYPE.getOrDefault(type, "未知类型");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 公众号模板地址
|
||||
*/
|
||||
public static final String PUBLIC_ACCOUNT_TEMPLATE =
|
||||
"https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=";
|
||||
/**
|
||||
* 获取微信用户基本信息地址
|
||||
*/
|
||||
public static final String WECHAT_OAUTH_ACCESS_TOKEN = "https://api.weixin.qq.com/sns/oauth2/access_token";
|
||||
/**
|
||||
* 获取ACCESS_TOKEN
|
||||
*/
|
||||
public static final String ACCESS_TOKEN = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s";
|
||||
/**
|
||||
* 登录凭证校验
|
||||
*/
|
||||
public static final String GET_OPEN_ID = "https://api.weixin.qq.com/sns/jscode2session";
|
||||
/**
|
||||
* 获取小程序地址
|
||||
*/
|
||||
public static final String GET_MINI_QRCODE = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=%s";
|
||||
/**
|
||||
* 获取用户基本信息
|
||||
*/
|
||||
public static final String GET_USER_BASIC_INFO = "https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN";
|
||||
/**
|
||||
* 获取包含请求参数ACCESS_TOKEN
|
||||
*/
|
||||
public static final String ACCESS_TOKEN_WITH_PARAM = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s";
|
||||
/**
|
||||
* 获取小程序 URL Link
|
||||
*/
|
||||
public static final String GENERATE_URL_LINK = "https://api.weixin.qq.com/wxa/generate_urllink?access_token=%s";
|
||||
|
||||
/**
|
||||
* 发送模板消息
|
||||
*/
|
||||
public static final String MESSAGE_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=";
|
||||
|
||||
/*-----------------------------*/
|
||||
/* */
|
||||
/* 支付相关 */
|
||||
/* */
|
||||
/*-----------------------------*/
|
||||
/**
|
||||
* 退款链接
|
||||
*/
|
||||
public static final String REFUNDS_URL = "https://api.mch.weixin.qq.com/v3/refund/domestic/refunds";
|
||||
public static final String REFUNDS_URi = "/v3/refund/domestic/refunds/";
|
||||
/**
|
||||
* 其他
|
||||
*/
|
||||
public static final String WECHATPAY_STATUS = "status";
|
||||
public static final String WECHATPAY_SUCCESS = "SUCCESS";
|
||||
public static final String WECHATPAY_PROCESSING = "PROCESSING";
|
||||
public static final String WECHATPAY_OUT_TRADE_NO = "out_trade_no";
|
||||
public static final String WECHATPAY_OUT_REFUND_NO = "out_refund_no";
|
||||
public static final String WECHATPAY_REFUND = "refund";
|
||||
public static final String WECHATPAY_TOTAL = "total";
|
||||
public static final String WECHATPAY_CURRENCY = "currency";
|
||||
public static final String WECHATPAY_CURRENCY_CNY = "CNY";
|
||||
public static final String WECHATPAY_AMOUNT = "amount";
|
||||
public static final String WECHATPAY_NOTIFY_URL = "notify_url";
|
||||
|
||||
public static final String REFUNDS_RESOURCE = "resource";
|
||||
public static final String REFUNDS_CIPHERTEXT = "ciphertext";
|
||||
public static final String REFUNDS_NONCE = "nonce";
|
||||
public static final String REFUNDS_REFUND_STATUS = "refund_status";
|
||||
public static final String REFUNDS_ASSOCIATED_DATA = "associated_data";
|
||||
public static final String WECHAT_ERRCODE = "errcode";
|
||||
public static final String WECHAT_ERRMSG = "errmsg";
|
||||
/**
|
||||
* 退款的token的SCHEMA
|
||||
*/
|
||||
public static final String REFUNDS_SCHEMA = "Wechatpay-Signature-Type "; // 注意有一个空格
|
||||
/**
|
||||
* 支付请求头
|
||||
*/
|
||||
public static final String WECHATPAY_SIGNATURE_TYPE = "Wechatpay-Signature-Type";
|
||||
}
|
@ -31,7 +31,7 @@ import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.Enumeration;
|
||||
@ -55,8 +55,6 @@ public class LyCompatibleController {
|
||||
@Autowired
|
||||
private FaceMapper faceMapper;
|
||||
@Autowired
|
||||
private AppScenicService appScenicService;
|
||||
@Autowired
|
||||
private VideoRepository videoRepository;
|
||||
@Autowired
|
||||
private VideoMapper videoMapper;
|
||||
@ -68,7 +66,7 @@ public class LyCompatibleController {
|
||||
@PostMapping("sendPhoto")
|
||||
@IgnoreToken
|
||||
public R sendPhoto(@RequestParam(value = "file", required = false) MultipartFile file, HttpServletRequest request) {
|
||||
Map<String, String> headersMap = new HashMap<String, String>();
|
||||
Map<String, String> headersMap = new HashMap<>();
|
||||
Enumeration<String> headerNames = request.getHeaderNames();
|
||||
while (headerNames.hasMoreElements()) {
|
||||
String key = (String) headerNames.nextElement();
|
||||
@ -125,7 +123,7 @@ public class LyCompatibleController {
|
||||
@RequestMapping("getIsVideo")
|
||||
@IgnoreToken
|
||||
public R getIsVideo(HttpServletRequest request) {
|
||||
Map<String, String> headersMap = new HashMap<String, String>();
|
||||
Map<String, String> headersMap = new HashMap<>();
|
||||
Enumeration<String> headerNames = request.getHeaderNames();
|
||||
while (headerNames.hasMoreElements()) {
|
||||
String key = (String) headerNames.nextElement();
|
||||
@ -167,7 +165,7 @@ public class LyCompatibleController {
|
||||
@RequestMapping("getNewVideo")
|
||||
@IgnoreToken
|
||||
public R getNewVideo(HttpServletRequest request) {
|
||||
Map<String, String> headersMap = new HashMap<String, String>();
|
||||
Map<String, String> headersMap = new HashMap<>();
|
||||
Enumeration<String> headerNames = request.getHeaderNames();
|
||||
while (headerNames.hasMoreElements()) {
|
||||
String key = (String) headerNames.nextElement();
|
||||
@ -193,7 +191,7 @@ public class LyCompatibleController {
|
||||
return R.error("用户没有上传过照片!");
|
||||
}
|
||||
VideoTaskStatusVO taskStatusVO = goodsService.getTaskStatusByScenicId(member.getId(), member.getScenicId());
|
||||
List<ContentPageVO> listApiResponse = appScenicService.faceContentList(faceVO.getId());
|
||||
List<ContentPageVO> listApiResponse = faceService.faceContentList(faceVO.getId());
|
||||
Map<Integer, List<ContentPageVO>> collect = listApiResponse.stream()
|
||||
.filter(contentPageVO -> contentPageVO.getLockType() < 0)
|
||||
.collect(Collectors.groupingBy(ContentPageVO::getGoodsType));
|
||||
@ -206,7 +204,7 @@ public class LyCompatibleController {
|
||||
}
|
||||
List<Map<String, Object>> videoList = collect.get(0).stream().collect(Collectors.groupingBy(ContentPageVO::getTemplateId))
|
||||
.values().stream().map(contentPageVOs -> {
|
||||
ContentPageVO contentPageVO = contentPageVOs.get(0);
|
||||
ContentPageVO contentPageVO = contentPageVOs.getFirst();
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
VideoEntity videoRespVO = videoRepository.getVideo(contentPageVO.getContentId());
|
||||
map.put("id", videoRespVO.getId().toString());
|
||||
|
@ -1,5 +1,6 @@
|
||||
package com.ycwl.basic.controller.extern;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@ -11,6 +12,7 @@ import java.util.Map;
|
||||
* @date 2016年10月27日 下午9:59:27
|
||||
*/
|
||||
public class R extends HashMap<String, Object> {
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public R() {
|
||||
|
@ -2,6 +2,7 @@ package com.ycwl.basic.controller.mobile;
|
||||
|
||||
import com.ycwl.basic.model.jwt.JwtInfo;
|
||||
import com.ycwl.basic.model.mobile.face.FaceRecognizeResp;
|
||||
import com.ycwl.basic.model.mobile.scenic.content.ContentPageVO;
|
||||
import com.ycwl.basic.model.pc.face.resp.FaceRespVO;
|
||||
import com.ycwl.basic.service.pc.FaceService;
|
||||
import com.ycwl.basic.utils.ApiResponse;
|
||||
@ -38,7 +39,7 @@ AppFaceController {
|
||||
*/
|
||||
@ApiOperation("人脸照片上传")
|
||||
@PostMapping("/faceUPload")
|
||||
public ApiResponse faceUpload(@RequestParam("file")MultipartFile file, @RequestParam("scenicId") Long scenicId) {
|
||||
public ApiResponse<FaceRecognizeResp> faceUpload(@RequestParam("file")MultipartFile file, @RequestParam("scenicId") Long scenicId) {
|
||||
//获取用户id
|
||||
JwtInfo worker = JwtTokenUtil.getWorker();
|
||||
Long userId = worker.getUserId();
|
||||
@ -60,13 +61,21 @@ AppFaceController {
|
||||
}
|
||||
|
||||
@DeleteMapping("/{faceId}")
|
||||
public ApiResponse deleteFace(@PathVariable("faceId") Long faceId) {
|
||||
public ApiResponse<String> deleteFace(@PathVariable("faceId") Long faceId) {
|
||||
return faceService.deleteFace(faceId);
|
||||
}
|
||||
|
||||
@PostMapping("/{faceId}/match")
|
||||
public ApiResponse match(@PathVariable("faceId") Long faceId) {
|
||||
public ApiResponse<String> match(@PathVariable("faceId") Long faceId) {
|
||||
faceService.matchFaceId(faceId);
|
||||
return ApiResponse.success("");
|
||||
}
|
||||
|
||||
|
||||
@ApiOperation("景区视频源素材列表")
|
||||
@GetMapping("/{faceId}/contentList")
|
||||
public ApiResponse<List<ContentPageVO>> contentList(@PathVariable Long faceId) {
|
||||
List<ContentPageVO> contentPageVOS = faceService.faceContentList(faceId);
|
||||
return ApiResponse.success(contentPageVOS);
|
||||
}
|
||||
}
|
||||
|
@ -40,6 +40,13 @@ public class AppGoodsController {
|
||||
return ApiResponse.success(goodsDetailVOS);
|
||||
}
|
||||
|
||||
@ApiOperation("源素材(原片/照片)商品数量")
|
||||
@PostMapping("/sourceGoodsCount")
|
||||
public ApiResponse<Integer> sourceGoodsCount(@RequestBody GoodsReqQuery query) {
|
||||
Integer count = goodsService.sourceGoodsCount(query);
|
||||
return ApiResponse.success(count);
|
||||
}
|
||||
|
||||
@PostMapping("/sourceGoodsList/preview")
|
||||
public ApiResponse<List<GoodsUrlVO>> sourceGoodsListPreview(@RequestBody GoodsReqQuery query) {
|
||||
List<GoodsUrlVO> goodsUrlList = goodsService.sourceGoodsListPreview(query);
|
||||
|
@ -64,7 +64,7 @@ public class AppMemberController {
|
||||
|
||||
@ApiOperation("新增或修改景区服务通知状态")
|
||||
@GetMapping("/updateScenicServiceNoticeStatus")
|
||||
public ApiResponse updateScenicServiceNoticeStatus(Long scenicId) {
|
||||
public ApiResponse<String> updateScenicServiceNoticeStatus(Long scenicId) {
|
||||
return memberService.updateScenicServiceNoticeStatus(scenicId);
|
||||
}
|
||||
|
||||
|
@ -6,7 +6,6 @@ import com.ycwl.basic.biz.PriceBiz;
|
||||
import com.ycwl.basic.constant.BaseContextHandler;
|
||||
import com.ycwl.basic.mapper.FaceMapper;
|
||||
import com.ycwl.basic.model.jwt.JwtInfo;
|
||||
import com.ycwl.basic.model.mobile.goods.GoodsPriceQueryReq;
|
||||
import com.ycwl.basic.model.mobile.order.IsBuyBatchRespVO;
|
||||
import com.ycwl.basic.model.mobile.order.IsBuyRespVO;
|
||||
import com.ycwl.basic.model.mobile.order.OrderAppPageReq;
|
||||
@ -14,12 +13,8 @@ import com.ycwl.basic.model.mobile.order.RefundOrderReq;
|
||||
import com.ycwl.basic.model.pc.face.resp.FaceRespVO;
|
||||
import com.ycwl.basic.model.pc.order.req.CreateBatchOrderReqVO;
|
||||
import com.ycwl.basic.model.pc.order.req.CreateOrderReqVO;
|
||||
import com.ycwl.basic.model.pc.order.req.OrderAddReq;
|
||||
import com.ycwl.basic.model.pc.order.resp.OrderAppRespVO;
|
||||
import com.ycwl.basic.model.wx.WxPayRespVO;
|
||||
import com.ycwl.basic.repository.OrderRepository;
|
||||
import com.ycwl.basic.repository.PriceRepository;
|
||||
import com.ycwl.basic.service.mobile.GoodsService;
|
||||
import com.ycwl.basic.pay.entity.PayResponse;
|
||||
import com.ycwl.basic.service.pc.OrderService;
|
||||
import com.ycwl.basic.utils.ApiResponse;
|
||||
import com.ycwl.basic.utils.JwtTokenUtil;
|
||||
@ -28,6 +23,8 @@ import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @Author:longbinbin
|
||||
* @Date:2024/12/4 17:16
|
||||
@ -62,15 +59,20 @@ public class AppOrderController {
|
||||
|
||||
@ApiOperation("用户端订单新增")
|
||||
@PostMapping("/addOrder")
|
||||
public ApiResponse<WxPayRespVO> addOrder(@RequestBody CreateOrderReqVO orderAddReq) throws Exception {
|
||||
public ApiResponse<Map<String, Object>> addOrder(@RequestBody CreateOrderReqVO orderAddReq) throws Exception {
|
||||
JwtInfo worker = JwtTokenUtil.getWorker();
|
||||
return orderService.createOrder(worker.getUserId(), orderAddReq);
|
||||
}
|
||||
|
||||
@ApiOperation("查询订单")
|
||||
@GetMapping("/queryOrder")
|
||||
public ApiResponse<PayResponse> queryOrder(@RequestParam("orderId") Long orderId) {
|
||||
return ApiResponse.success(orderService.queryOrder(orderId));
|
||||
}
|
||||
|
||||
@ApiOperation("用户端打包订单新增")
|
||||
@PostMapping("/addBatchOrder")
|
||||
public ApiResponse<WxPayRespVO> addOrder(@RequestBody CreateBatchOrderReqVO batchOrderReqVO) throws Exception {
|
||||
public ApiResponse<Map<String, Object>> addOrder(@RequestBody CreateBatchOrderReqVO batchOrderReqVO) throws Exception {
|
||||
JwtInfo worker = JwtTokenUtil.getWorker();
|
||||
return orderService.createBatchOrder(worker.getUserId(), batchOrderReqVO);
|
||||
}
|
||||
@ -101,6 +103,9 @@ public class AppOrderController {
|
||||
Long userId = Long.parseLong(BaseContextHandler.getUserId());
|
||||
if (faceId == null) {
|
||||
FaceRespVO lastFaceByUserId = faceMapper.findLastFaceByUserId(BaseContextHandler.getUserId());
|
||||
if (lastFaceByUserId == null) {
|
||||
return ApiResponse.fail("您还未上传人脸");
|
||||
}
|
||||
faceId = lastFaceByUserId.getId();
|
||||
}
|
||||
IsBuyBatchRespVO buy = priceBiz.isBuy(userId, faceId, scenicId, type, goodsIds);
|
||||
|
@ -0,0 +1,106 @@
|
||||
package com.ycwl.basic.controller.mobile;
|
||||
|
||||
import com.ycwl.basic.annotation.IgnoreToken;
|
||||
import com.ycwl.basic.model.jwt.JwtInfo;
|
||||
import com.ycwl.basic.model.pc.printer.resp.MemberPrintResp;
|
||||
import com.ycwl.basic.model.pc.printer.resp.PrinterResp;
|
||||
import com.ycwl.basic.model.printer.req.FromSourceReq;
|
||||
import com.ycwl.basic.service.printer.PrinterService;
|
||||
import com.ycwl.basic.storage.StorageFactory;
|
||||
import com.ycwl.basic.utils.ApiResponse;
|
||||
import com.ycwl.basic.utils.JwtTokenUtil;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
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.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/mobile/printer/v1")
|
||||
public class AppPrinterController {
|
||||
@Autowired
|
||||
private PrinterService printerService;
|
||||
@GetMapping("/listFor/{scenicId}")
|
||||
@IgnoreToken
|
||||
public ApiResponse<List<PrinterResp>> listFor(@PathVariable("scenicId") Long scenicId) {
|
||||
return ApiResponse.success(printerService.listByScenicId(scenicId));
|
||||
}
|
||||
|
||||
@GetMapping("/getListFor/{scenicId}")
|
||||
public ApiResponse<List<MemberPrintResp>> getListFor(@PathVariable("scenicId") Long scenicId) {
|
||||
JwtInfo worker = JwtTokenUtil.getWorker();
|
||||
return ApiResponse.success(printerService.getUserPhotoList(worker.getUserId(), scenicId));
|
||||
}
|
||||
|
||||
@GetMapping("/getItem/{scenicId}/{id}")
|
||||
public ApiResponse<MemberPrintResp> getItem(@PathVariable("scenicId") Long scenicId, @PathVariable("id") Long id) {
|
||||
JwtInfo worker = JwtTokenUtil.getWorker();
|
||||
MemberPrintResp userPhoto = printerService.getUserPhoto(worker.getUserId(), scenicId, id);
|
||||
if (userPhoto == null) {
|
||||
return ApiResponse.fail("未找到该图片");
|
||||
}
|
||||
return ApiResponse.success(userPhoto);
|
||||
}
|
||||
|
||||
@PostMapping("/deleteFrom/{scenicId}/{id}")
|
||||
public ApiResponse<?> deleteFrom(@PathVariable("scenicId") Long scenicId, @PathVariable("id") Long id) throws IOException {
|
||||
JwtInfo worker = JwtTokenUtil.getWorker();
|
||||
printerService.deleteUserPhoto(worker.getUserId(), scenicId, id);
|
||||
return ApiResponse.success(null);
|
||||
}
|
||||
@PostMapping("/uploadTo/{scenicId}")
|
||||
public ApiResponse<?> upload(@PathVariable("scenicId") Long scenicId, @RequestParam(value = "file") MultipartFile file) throws IOException {
|
||||
String[] split = file.getOriginalFilename().split("\\.");
|
||||
String ext = split[split.length - 1];
|
||||
String url = StorageFactory.use().uploadFile(file, "printer", UUID.randomUUID() + "." + ext);
|
||||
printerService.addUserPhoto(JwtTokenUtil.getWorker().getUserId(), scenicId, url);
|
||||
return ApiResponse.success(url);
|
||||
}
|
||||
@PostMapping("/uploadTo/{scenicId}/cropped/{id}")
|
||||
public ApiResponse<?> uploadReplace(@PathVariable("scenicId") Long scenicId, @PathVariable("id") Long id, @RequestParam(value = "file") MultipartFile file) throws IOException {
|
||||
String[] split = file.getOriginalFilename().split("\\.");
|
||||
String ext = split[split.length - 1];
|
||||
String url = StorageFactory.use().uploadFile(file, "printer", UUID.randomUUID() + "." + ext);
|
||||
printerService.setPhotoCropped(JwtTokenUtil.getWorker().getUserId(), scenicId, id, url);
|
||||
return ApiResponse.success(url);
|
||||
}
|
||||
@PostMapping("/uploadTo/{scenicId}/formSource")
|
||||
public ApiResponse<?> uploadFromSource(@PathVariable("scenicId") Long scenicId, @RequestBody FromSourceReq req) throws IOException {
|
||||
printerService.addUserPhotoFromSource(JwtTokenUtil.getWorker().getUserId(), scenicId, req);
|
||||
return ApiResponse.success(null);
|
||||
}
|
||||
|
||||
@PostMapping("/setQuantity/{scenicId}/{id}")
|
||||
public ApiResponse<?> setQuantity(@PathVariable("scenicId") Long scenicId, @PathVariable("id") Long id, @RequestParam("quantity") Integer quantity) {
|
||||
if (quantity == null) {
|
||||
return ApiResponse.fail("请输入数量");
|
||||
}
|
||||
if (quantity < 0) {
|
||||
return ApiResponse.fail("数量不能小于0");
|
||||
}
|
||||
printerService.setPhotoQuantity(JwtTokenUtil.getWorker().getUserId(), scenicId, id, quantity);
|
||||
return ApiResponse.success(null);
|
||||
}
|
||||
@GetMapping("/price/{scenicId}")
|
||||
public ApiResponse<?> queryPrice(@PathVariable("scenicId") Long scenicId) {
|
||||
return ApiResponse.success(printerService.queryPrice(JwtTokenUtil.getWorker().getUserId(), scenicId));
|
||||
}
|
||||
|
||||
@PostMapping("/order/{scenicId}")
|
||||
public ApiResponse<Map<String, Object>> createOrder(@PathVariable("scenicId") Long scenicId) {
|
||||
return ApiResponse.success(printerService.createOrder(JwtTokenUtil.getWorker().getUserId(), scenicId, null));
|
||||
}
|
||||
@PostMapping("/order/{scenicId}/toPrinter/{printerId}")
|
||||
public ApiResponse<Map<String, Object>> createOrderToPrinter(@PathVariable("scenicId") Long scenicId, @PathVariable("printerId") Integer printerId) {
|
||||
return ApiResponse.success(printerService.createOrder(JwtTokenUtil.getWorker().getUserId(), scenicId, printerId));
|
||||
}
|
||||
}
|
@ -2,15 +2,19 @@ package com.ycwl.basic.controller.mobile;
|
||||
|
||||
import com.github.pagehelper.PageInfo;
|
||||
import com.ycwl.basic.annotation.IgnoreToken;
|
||||
import com.ycwl.basic.constant.BaseContextHandler;
|
||||
import com.ycwl.basic.model.jwt.JwtInfo;
|
||||
import com.ycwl.basic.model.mobile.scenic.ScenicAppVO;
|
||||
import com.ycwl.basic.model.mobile.scenic.ScenicDeviceCountVO;
|
||||
import com.ycwl.basic.model.mobile.scenic.ScenicIndexVO;
|
||||
import com.ycwl.basic.model.mobile.scenic.content.ContentPageVO;
|
||||
import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity;
|
||||
import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery;
|
||||
import com.ycwl.basic.model.pc.scenic.resp.ScenicConfigResp;
|
||||
import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO;
|
||||
import com.ycwl.basic.repository.ScenicRepository;
|
||||
import com.ycwl.basic.service.mobile.AppScenicService;
|
||||
import com.ycwl.basic.service.pc.FaceService;
|
||||
import com.ycwl.basic.utils.ApiResponse;
|
||||
import com.ycwl.basic.utils.JwtTokenUtil;
|
||||
import io.swagger.annotations.Api;
|
||||
@ -20,6 +24,7 @@ import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@ -27,20 +32,33 @@ import java.util.List;
|
||||
* @Date:2024/12/5 10:22
|
||||
*/
|
||||
@Slf4j
|
||||
@Deprecated
|
||||
@RestController
|
||||
@RequestMapping("/api/mobile/scenic/v1")
|
||||
@Api(tags = "景区相关接口")
|
||||
public class AppScenicController {
|
||||
|
||||
@Autowired
|
||||
private FaceService faceService;
|
||||
@Autowired
|
||||
private AppScenicService appScenicService;
|
||||
@Autowired
|
||||
private ScenicRepository scenicRepository;
|
||||
private static final List<String> ENABLED_USER_IDs = new ArrayList<>(){{
|
||||
add("3932535453961555968");
|
||||
add("3936121342868459520");
|
||||
add("3936940597855784960");
|
||||
}};
|
||||
|
||||
@ApiOperation("分页查询景区列表")
|
||||
@PostMapping("/page")
|
||||
public ApiResponse<PageInfo<ScenicAppVO>> pageQuery(@RequestBody ScenicReqQuery scenicReqQuery){
|
||||
return appScenicService.pageQuery(scenicReqQuery);
|
||||
String userId = BaseContextHandler.getUserId();
|
||||
if (ENABLED_USER_IDs.contains(userId)) {
|
||||
return appScenicService.pageQuery(scenicReqQuery);
|
||||
} else {
|
||||
return ApiResponse.success(new PageInfo<>(new ArrayList<>()));
|
||||
}
|
||||
}
|
||||
@ApiOperation("根据id查询景区详情")
|
||||
@IgnoreToken
|
||||
@ -51,9 +69,26 @@ public class AppScenicController {
|
||||
|
||||
@GetMapping("/{id}/config")
|
||||
@IgnoreToken
|
||||
public ApiResponse<ScenicConfigEntity> getConfig(@PathVariable Long id){
|
||||
public ApiResponse<ScenicConfigResp> getConfig(@PathVariable Long id){
|
||||
ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(id);
|
||||
return ApiResponse.success(scenicConfig);
|
||||
ScenicConfigResp resp = new ScenicConfigResp();
|
||||
resp.setBookRoutine(scenicConfig.getBookRoutine());
|
||||
resp.setForceFinishTime(scenicConfig.getForceFinishTime());
|
||||
resp.setTourTime(scenicConfig.getTourTime());
|
||||
resp.setSampleStoreDay(scenicConfig.getSampleStoreDay());
|
||||
resp.setFaceStoreDay(scenicConfig.getFaceStoreDay());
|
||||
resp.setVideoStoreDay(scenicConfig.getVideoStoreDay());
|
||||
resp.setAllFree(scenicConfig.getAllFree());
|
||||
resp.setDisableSourceVideo(scenicConfig.getDisableSourceVideo());
|
||||
resp.setDisableSourceImage(scenicConfig.getDisableSourceImage());
|
||||
resp.setAntiScreenRecordType(scenicConfig.getAntiScreenRecordType());
|
||||
resp.setVideoSourceStoreDay(scenicConfig.getVideoSourceStoreDay());
|
||||
resp.setImageSourceStoreDay(scenicConfig.getImageSourceStoreDay());
|
||||
resp.setUserSourceExpireDay(scenicConfig.getUserSourceExpireDay());
|
||||
resp.setBrokerDirectRate(scenicConfig.getBrokerDirectRate());
|
||||
resp.setVideoSourcePackHint(scenicConfig.getVideoSourcePackHint());
|
||||
resp.setImageSourcePackHint(scenicConfig.getImageSourcePackHint());
|
||||
return ApiResponse.success(resp);
|
||||
}
|
||||
|
||||
@ApiOperation("查询景区设备总数和拍到用户的机位数量")
|
||||
@ -65,13 +100,19 @@ public class AppScenicController {
|
||||
@ApiOperation("景区视频源素材列表")
|
||||
@GetMapping("/contentList/")
|
||||
public ApiResponse<List<ContentPageVO>> contentList() {
|
||||
return appScenicService.contentListUseDefaultFace();
|
||||
return faceService.contentListUseDefaultFace();
|
||||
}
|
||||
|
||||
@ApiOperation("景区视频源素材列表")
|
||||
@GetMapping("/face/{faceId}/contentList")
|
||||
public ApiResponse<List<ContentPageVO>> contentList(@PathVariable Long faceId) {
|
||||
List<ContentPageVO> contentPageVOS = appScenicService.faceContentList(faceId);
|
||||
List<ContentPageVO> contentPageVOS = faceService.faceContentList(faceId);
|
||||
return ApiResponse.success(contentPageVOS);
|
||||
}
|
||||
|
||||
@PostMapping("/nearby")
|
||||
public ApiResponse<List<ScenicAppVO>> nearby(@RequestBody ScenicIndexVO scenicIndexVO) {
|
||||
List<ScenicAppVO> list = appScenicService.scenicListByLnLa(scenicIndexVO);
|
||||
return ApiResponse.success(list);
|
||||
}
|
||||
}
|
||||
|
@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@Deprecated
|
||||
@RestController
|
||||
@RequestMapping("/api/mobile/video/v1")
|
||||
public class AppVideoController {
|
||||
|
@ -39,7 +39,7 @@ public class AppWxNotifyController {
|
||||
@GetMapping({"/getIds", "/"})
|
||||
@IgnoreToken
|
||||
public ApiResponse<List<String>> getIds() {
|
||||
return ApiResponse.success(new ArrayList<String>() {{
|
||||
return ApiResponse.success(new ArrayList<>() {{
|
||||
add("5b8vTm7kvwYubqDxb3dxBs0BqxMsgVgGw573aahTEd8");
|
||||
add("vPIzbkA0x4mMj-vdbWx6_45e8juWXzs3FGYnDsIPv3A");
|
||||
add("HB1vp-0BXc2WyYeoYN3a3GuZV9HtPLXUTT7blCBq9eY");
|
||||
@ -49,7 +49,7 @@ public class AppWxNotifyController {
|
||||
@GetMapping("/{scenicId}")
|
||||
@IgnoreToken
|
||||
public ApiResponse<List<String>> getIds(@PathVariable("scenicId") Long scenicId) {
|
||||
return ApiResponse.success(new ArrayList<String>() {{
|
||||
return ApiResponse.success(new ArrayList<>() {{
|
||||
String videoGeneratedTemplateId = scenicRepository.getVideoGeneratedTemplateId(scenicId);
|
||||
if (StringUtils.isNotBlank(videoGeneratedTemplateId)) {
|
||||
add(videoGeneratedTemplateId);
|
||||
|
@ -2,22 +2,24 @@ package com.ycwl.basic.controller.mobile;
|
||||
|
||||
|
||||
import com.ycwl.basic.annotation.IgnoreToken;
|
||||
import com.ycwl.basic.annotation.RequestToFile;
|
||||
import com.ycwl.basic.aspectj.HttpSaver;
|
||||
import com.ycwl.basic.enums.BizCodeEnum;
|
||||
import com.ycwl.basic.model.wx.WXPayOrderReqVO;
|
||||
import com.ycwl.basic.model.wx.WxPayRespVO;
|
||||
import com.ycwl.basic.pay.entity.PayResponse;
|
||||
import com.ycwl.basic.service.mobile.WxPayService;
|
||||
import com.ycwl.basic.utils.ApiResponse;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
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 javax.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.security.GeneralSecurityException;
|
||||
|
||||
@ -35,12 +37,6 @@ public class AppWxPayController {
|
||||
@Autowired
|
||||
private WxPayService wxPayService;
|
||||
|
||||
@ApiOperation(value = "微信预支付", notes = "微信预支付")
|
||||
@PostMapping("/createOrder")
|
||||
public ApiResponse<WxPayRespVO> createOrder(@RequestBody WXPayOrderReqVO req) throws Exception {
|
||||
return ApiResponse.success(wxPayService.createOrder(req));
|
||||
}
|
||||
|
||||
@ApiOperation(value = "微信支付回调", notes = "微信支付回调")
|
||||
@PostMapping("/payNotify")
|
||||
@IgnoreToken
|
||||
@ -49,28 +45,25 @@ public class AppWxPayController {
|
||||
return ApiResponse.success(BizCodeEnum.REQUEST_OK);
|
||||
}
|
||||
|
||||
@ApiOperation(value = "微信退款", notes = "微信退款")
|
||||
@PostMapping("/refundOrder")
|
||||
public ApiResponse<?> refundOrder(@RequestBody String orderId) throws Exception {
|
||||
return ApiResponse.buildResult(wxPayService.refundOrder(orderId) ?
|
||||
BizCodeEnum.SUCCESS :
|
||||
BizCodeEnum.ADVANCE_PAYMENT_REFUND_FAILED);
|
||||
@RequestMapping("/{scenicId}/payNotify")
|
||||
@IgnoreToken
|
||||
public Object payNotifyByScenicId(@PathVariable Long scenicId, HttpServletRequest request) {
|
||||
PayResponse payResponse = wxPayService.payNotify(scenicId, request);
|
||||
if (payResponse == null) {
|
||||
return ApiResponse.buildResult(BizCodeEnum.ADVANCE_PAYMENT_CALLBACK_FAILED);
|
||||
}
|
||||
if (StringUtils.isNotBlank(payResponse.getCustomResponse())) {
|
||||
return payResponse.getCustomResponse();
|
||||
}
|
||||
return ApiResponse.success(BizCodeEnum.REQUEST_OK);
|
||||
}
|
||||
|
||||
@ApiOperation(value = "微信支付退款回调", notes = "微信支付退款回调")
|
||||
@PostMapping("/refundNotify")
|
||||
@PostMapping("/{scenicId}/refundNotify")
|
||||
@IgnoreToken
|
||||
public ApiResponse<?> refundNotify(@RequestBody String refundResult) throws GeneralSecurityException, IOException {
|
||||
return ApiResponse.buildResult(wxPayService.refundNotify(refundResult) ?
|
||||
public ApiResponse<?> refundNotify(@PathVariable Long scenicId, HttpServletRequest request) throws GeneralSecurityException, IOException {
|
||||
return ApiResponse.buildResult(wxPayService.refundNotify(scenicId, request) ?
|
||||
BizCodeEnum.SUCCESS :
|
||||
BizCodeEnum.ADVANCE_PAYMENT_CALLBACK_REFUND_FAILED);
|
||||
}
|
||||
|
||||
@ApiOperation(value = "微信关闭订单", notes = "微信关闭订单")
|
||||
@PostMapping("/closeOrder")
|
||||
@IgnoreToken
|
||||
public ApiResponse<?> closeOrder(@RequestBody String orderId) {
|
||||
wxPayService.closeOrder(orderId);
|
||||
return ApiResponse.buildResult(BizCodeEnum.REQUEST_OK);
|
||||
}
|
||||
}
|
||||
|
@ -61,7 +61,7 @@ public class AppStatisticsController {
|
||||
@ApiOperation("统计数据记录")
|
||||
@PostMapping("/addStatistics")
|
||||
@IgnoreToken
|
||||
public ApiResponse addStatistics(@RequestBody StatisticsRecordAddReq req) {
|
||||
public ApiResponse<String> addStatistics(@RequestBody StatisticsRecordAddReq req) {
|
||||
|
||||
return statisticsService.addStatistics(req);
|
||||
}
|
||||
|
@ -3,7 +3,6 @@ package com.ycwl.basic.controller.pc;
|
||||
import com.ycwl.basic.model.pc.broker.entity.BrokerEntity;
|
||||
import com.ycwl.basic.model.pc.broker.req.BrokerRecordReqQuery;
|
||||
import com.ycwl.basic.model.pc.broker.req.BrokerReqQuery;
|
||||
import com.ycwl.basic.model.pc.broker.resp.BrokerRecordRespVO;
|
||||
import com.ycwl.basic.model.pc.broker.resp.BrokerRespVO;
|
||||
import com.ycwl.basic.model.pc.broker.resp.DailySummaryRespVO;
|
||||
import com.ycwl.basic.service.pc.BrokerRecordService;
|
||||
@ -131,7 +130,7 @@ public class BrokerController {
|
||||
try {
|
||||
WxMpUtil.generateWXAQRCode(appId, appSecret, appState, path, filePath);
|
||||
File file = new File(filePath);
|
||||
String s = adapter.uploadFile(file, filePath);
|
||||
String s = adapter.uploadFile(null, file, filePath);
|
||||
file.delete();
|
||||
adapter.setAcl(StorageAcl.PUBLIC_READ, filePath);
|
||||
return ApiResponse.success(s);
|
||||
|
@ -0,0 +1,23 @@
|
||||
package com.ycwl.basic.controller.pc;
|
||||
|
||||
import com.ycwl.basic.model.pc.scenicDeviceStats.req.DeviceStatsReq;
|
||||
import com.ycwl.basic.model.pc.scenicDeviceStats.resp.ScenicDeviceStatsListResp;
|
||||
import com.ycwl.basic.utils.ApiResponse;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
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;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/deviceStats/v1")
|
||||
public class DeviceStatsController {
|
||||
@Autowired
|
||||
private com.ycwl.basic.service.pc.DeviceStatsService service;
|
||||
|
||||
@PostMapping("/{scenicId}")
|
||||
public ApiResponse<ScenicDeviceStatsListResp> queryByScenic(@PathVariable("scenicId") Long scenicId, @RequestBody DeviceStatsReq req) {
|
||||
return ApiResponse.success(service.queryByScenicId(scenicId, req.getStartTime(), req.getEndTime()));
|
||||
}
|
||||
}
|
@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Deprecated
|
||||
@RestController
|
||||
@RequestMapping("/api/face/detect_log/v1")
|
||||
public class FaceDetectLogController {
|
||||
|
@ -17,6 +17,7 @@ import java.util.List;
|
||||
* @Author:longbinbin
|
||||
* @Date:2024/12/2 16:33
|
||||
*/
|
||||
@Deprecated
|
||||
@RestController
|
||||
@RequestMapping("/api/faceSample/v1")
|
||||
@Api(tags = "人脸样本管理")
|
||||
|
@ -47,6 +47,15 @@ public class PriceConfigController {
|
||||
public ApiResponse<Boolean> deletePriceConfig(@PathVariable Integer id) {
|
||||
priceRepository.clearPriceCache(id);
|
||||
priceConfigService.removeById(id);
|
||||
priceRepository.clearPriceCache(id);
|
||||
return ApiResponse.success(true);
|
||||
}
|
||||
|
||||
@PostMapping("/{id}/status")
|
||||
public ApiResponse<Boolean> updateStatus(@PathVariable Integer id) {
|
||||
priceRepository.clearPriceCache(id);
|
||||
priceConfigService.updateStatus(id);
|
||||
priceRepository.clearPriceCache(id);
|
||||
return ApiResponse.success(true);
|
||||
}
|
||||
|
||||
|
@ -1,10 +1,12 @@
|
||||
package com.ycwl.basic.controller.pc;
|
||||
|
||||
import com.github.pagehelper.PageInfo;
|
||||
import com.ycwl.basic.model.mobile.statistic.req.CommonQueryReq;
|
||||
import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity;
|
||||
import com.ycwl.basic.model.pc.scenic.req.ScenicAddOrUpdateReq;
|
||||
import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery;
|
||||
import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO;
|
||||
import com.ycwl.basic.service.mobile.AppStatisticsService;
|
||||
import com.ycwl.basic.service.pc.ScenicService;
|
||||
import com.ycwl.basic.storage.StorageFactory;
|
||||
import com.ycwl.basic.storage.adapters.IStorageAdapter;
|
||||
@ -35,6 +37,8 @@ public class ScenicController {
|
||||
|
||||
@Autowired
|
||||
private ScenicRepository scenicRepository;
|
||||
@Autowired
|
||||
private AppStatisticsService appStatisticsService;
|
||||
|
||||
@ApiOperation("分页查询景区")
|
||||
@PostMapping("/page")
|
||||
@ -117,7 +121,7 @@ public class ScenicController {
|
||||
try {
|
||||
WxMpUtil.generateWXAQRCode(appId, appSecret, appState, path, filePath);
|
||||
File file = new File(filePath);
|
||||
String s = adapter.uploadFile(file, filePath);
|
||||
String s = adapter.uploadFile(null, file, filePath);
|
||||
file.delete();
|
||||
adapter.setAcl(StorageAcl.PUBLIC_READ, filePath);
|
||||
return ApiResponse.success(s);
|
||||
@ -125,4 +129,25 @@ public class ScenicController {
|
||||
return ApiResponse.fail("生成二维码失败");
|
||||
}
|
||||
}
|
||||
|
||||
@PostMapping("/{scenicId}/one")
|
||||
public ApiResponse getStatisticsOne(@PathVariable("scenicId") Long scenicId, @RequestBody CommonQueryReq query) {
|
||||
query.setScenicId(scenicId);
|
||||
return appStatisticsService.oneStatistics(query);
|
||||
}
|
||||
@PostMapping("/{scenicId}/two")
|
||||
public ApiResponse getStatisticsTwo(@PathVariable("scenicId") Long scenicId, @RequestBody CommonQueryReq query) {
|
||||
query.setScenicId(scenicId);
|
||||
return appStatisticsService.twoStatistics(query);
|
||||
}
|
||||
@PostMapping("/{scenicId}/three")
|
||||
public ApiResponse getStatisticsThree(@PathVariable("scenicId") Long scenicId, @RequestBody CommonQueryReq query) {
|
||||
query.setScenicId(scenicId);
|
||||
return appStatisticsService.freeStatistics(query);
|
||||
}
|
||||
@PostMapping("/{scenicId}/fun")
|
||||
public ApiResponse getStatisticsFun(@PathVariable("scenicId") Long scenicId, @RequestBody CommonQueryReq query) {
|
||||
query.setScenicId(scenicId);
|
||||
return appStatisticsService.userConversionFunnel(query);
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
package com.ycwl.basic.controller.pc;
|
||||
|
||||
import com.ycwl.basic.annotation.IgnoreToken;
|
||||
import com.ycwl.basic.model.jwt.JwtInfo;
|
||||
import com.ycwl.basic.model.pc.source.entity.SourceEntity;
|
||||
import com.ycwl.basic.model.pc.source.req.SourceReqQuery;
|
||||
@ -23,41 +24,29 @@ public class SourceController {
|
||||
@Autowired
|
||||
private SourceService sourceService;
|
||||
|
||||
@Deprecated
|
||||
@ApiOperation("分页查询视频源")
|
||||
@PostMapping("/page")
|
||||
public ApiResponse pageQuery(@RequestBody SourceReqQuery sourceReqQuery) {
|
||||
return sourceService.pageQuery(sourceReqQuery);
|
||||
}
|
||||
@Deprecated
|
||||
@ApiOperation("查询视频源列表")
|
||||
@PostMapping("/list")
|
||||
public ApiResponse list(@RequestBody SourceReqQuery sourceReqQuery) {
|
||||
return sourceService.list(sourceReqQuery);
|
||||
}
|
||||
@ApiOperation("查询视频源详情")
|
||||
@GetMapping("getDetail/{id}")
|
||||
public ApiResponse getById(@PathVariable Long id) {
|
||||
JwtInfo worker = JwtTokenUtil.getWorker();
|
||||
return sourceService.getById(id, worker.getUserId());
|
||||
}
|
||||
@PostMapping("/{id}/cutVideo")
|
||||
@IgnoreToken
|
||||
public ApiResponse cutVideo(@PathVariable("id") Long id) {
|
||||
return sourceService.cutVideo(id);
|
||||
}
|
||||
@ApiOperation("添加视频源")
|
||||
@PostMapping("/add")
|
||||
public ApiResponse add(@RequestBody SourceEntity source) {
|
||||
return sourceService.add(source);
|
||||
}
|
||||
@Deprecated
|
||||
@ApiOperation("删除视频源")
|
||||
@DeleteMapping("/delete/{id}")
|
||||
public ApiResponse deleteById(@PathVariable Long id) {
|
||||
return sourceService.deleteById(id);
|
||||
}
|
||||
@ApiOperation("修改视频源")
|
||||
@PostMapping("/update")
|
||||
public ApiResponse update(@RequestBody SourceEntity source) {
|
||||
return sourceService.update(source);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.*;
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/api/task/v1")
|
||||
@Deprecated
|
||||
@Api(tags = "任务列表管理")
|
||||
public class TaskController {
|
||||
|
||||
|
@ -20,6 +20,7 @@ import java.util.List;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/video/v1")
|
||||
@Deprecated
|
||||
@Api(tags = "视频成片管理")
|
||||
public class VideoController {
|
||||
|
||||
|
@ -0,0 +1,76 @@
|
||||
package com.ycwl.basic.controller.proxy;
|
||||
|
||||
import com.ycwl.basic.annotation.IgnoreToken;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Deprecated
|
||||
@RestController
|
||||
public class ProxyController {
|
||||
@IgnoreToken
|
||||
@RequestMapping(value = "/proxy", method = RequestMethod.GET)
|
||||
public void proxy(@RequestParam(value = "url") String url,
|
||||
HttpServletRequest request,
|
||||
HttpServletResponse response) throws IOException {
|
||||
if (!url.startsWith("http://") && !url.startsWith("https://")) {
|
||||
url = "http://" + url; // 或根据业务逻辑选择默认协议
|
||||
}
|
||||
|
||||
// 新增User-Agent检测逻辑
|
||||
String userAgent = request.getHeader("User-Agent");
|
||||
if (userAgent != null && userAgent.contains("Lavf/")) {
|
||||
response.sendRedirect(url);
|
||||
return;
|
||||
}
|
||||
// 创建HTTP连接
|
||||
URL urlObj = new URL(url);
|
||||
HttpURLConnection connection = (HttpURLConnection) urlObj.openConnection();
|
||||
|
||||
// 设置请求方法和请求头
|
||||
connection.setRequestMethod("GET");
|
||||
for (Enumeration<String> headers = request.getHeaderNames(); headers.hasMoreElements();) {
|
||||
String headerName = headers.nextElement();
|
||||
connection.addRequestProperty(headerName, request.getHeader(headerName));
|
||||
}
|
||||
|
||||
// 处理响应
|
||||
int responseCode = connection.getResponseCode();
|
||||
response.setStatus(responseCode);
|
||||
|
||||
// 转发响应头
|
||||
Map<String, List<String>> headerFields = connection.getHeaderFields();
|
||||
for (Map.Entry<String, List<String>> entry : headerFields.entrySet()) {
|
||||
if (entry.getKey() != null) {
|
||||
for (String value : entry.getValue()) {
|
||||
response.addHeader(entry.getKey(), value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 流式传输响应体
|
||||
try (InputStream inputStream = connection.getInputStream();
|
||||
OutputStream outputStream = response.getOutputStream()) {
|
||||
byte[] buffer = new byte[4096];
|
||||
int bytesRead;
|
||||
while ((bytesRead = inputStream.read(buffer)) != -1) {
|
||||
outputStream.write(buffer, 0, bytesRead);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
@ -2,6 +2,7 @@ package com.ycwl.basic.controller.task;
|
||||
|
||||
import com.ycwl.basic.annotation.IgnoreLogReq;
|
||||
import com.ycwl.basic.annotation.IgnoreToken;
|
||||
import com.ycwl.basic.model.pc.task.resp.TaskRespVO;
|
||||
import com.ycwl.basic.model.pc.template.resp.TemplateRespVO;
|
||||
import com.ycwl.basic.model.task.req.TaskReqVo;
|
||||
import com.ycwl.basic.model.task.req.TaskSuccessReqVo;
|
||||
@ -11,14 +12,13 @@ import com.ycwl.basic.service.task.TaskService;
|
||||
import com.ycwl.basic.utils.ApiResponse;
|
||||
import io.swagger.annotations.Api;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
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.Date;
|
||||
|
||||
@IgnoreToken
|
||||
@RestController
|
||||
@Api(tags = "渲染端对接接口")
|
||||
@ -37,6 +37,11 @@ public class TaskTaskController {
|
||||
return ApiResponse.success(respVo);
|
||||
}
|
||||
|
||||
@GetMapping("/{taskId}/info")
|
||||
public ApiResponse<TaskRespVO> taskInfo(@PathVariable Long taskId) {
|
||||
return ApiResponse.success(taskService.taskInfo(taskId));
|
||||
}
|
||||
|
||||
@PostMapping("/template/{templateId}")
|
||||
public ApiResponse<TemplateRespVO> getTemplateById(@PathVariable Long templateId, @RequestBody WorkerAuthReqVo req) {
|
||||
return ApiResponse.success(taskService.workerGetTemplate(templateId, req));
|
||||
@ -45,7 +50,6 @@ public class TaskTaskController {
|
||||
@PostMapping("/{taskId}/uploadUrl")
|
||||
public ApiResponse<String> getUploadUrl(@PathVariable Long taskId, @RequestBody WorkerAuthReqVo req) {
|
||||
String urlForUpload = taskService.getUploadUrl(taskId, req);
|
||||
urlForUpload = urlForUpload.replace("-internal.aliyuncs.com", ".aliyuncs.com");
|
||||
return ApiResponse.success(urlForUpload);
|
||||
}
|
||||
|
||||
|
@ -1,14 +1,11 @@
|
||||
package com.ycwl.basic.controller.viid;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.thread.ThreadFactoryBuilder;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.ycwl.basic.annotation.IgnoreLogReq;
|
||||
import com.ycwl.basic.annotation.IgnoreToken;
|
||||
import com.ycwl.basic.annotation.RequestToFile;
|
||||
import com.ycwl.basic.aspectj.HttpSaver;
|
||||
import com.ycwl.basic.facebody.FaceBodyFactory;
|
||||
import com.ycwl.basic.facebody.adapter.IFaceBodyAdapter;
|
||||
import com.ycwl.basic.facebody.entity.AddFaceResp;
|
||||
import com.ycwl.basic.mapper.DeviceMapper;
|
||||
@ -17,14 +14,11 @@ 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.scenic.entity.ScenicConfigEntity;
|
||||
import com.ycwl.basic.model.pc.source.entity.SourceEntity;
|
||||
import com.ycwl.basic.model.viid.entity.DeviceIdObject;
|
||||
import com.ycwl.basic.model.viid.entity.FaceListObject;
|
||||
import com.ycwl.basic.model.viid.entity.FaceObject;
|
||||
import com.ycwl.basic.model.viid.entity.FacePositionObject;
|
||||
import com.ycwl.basic.model.viid.entity.ImageListObject;
|
||||
import com.ycwl.basic.model.viid.entity.ImageObject;
|
||||
import com.ycwl.basic.model.viid.entity.ResponseStatusObject;
|
||||
import com.ycwl.basic.model.viid.entity.SubImageInfoObject;
|
||||
import com.ycwl.basic.model.viid.entity.SubImageList;
|
||||
@ -58,7 +52,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import java.io.IOException;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
@ -69,12 +63,13 @@ import java.util.TimeZone;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ArrayBlockingQueue;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static com.ycwl.basic.constant.StorageConstant.PHOTO_PATH;
|
||||
import static com.ycwl.basic.service.task.impl.TaskFaceServiceImpl.generateEntityId;
|
||||
import static com.ycwl.basic.constant.StorageConstant.VIID_FACE;
|
||||
|
||||
@IgnoreToken
|
||||
@RestController
|
||||
@ -93,17 +88,20 @@ public class ViidController {
|
||||
private ScenicRepository scenicRepository;
|
||||
@Autowired
|
||||
private TaskFaceService taskFaceService;
|
||||
private final Map<String, ThreadPoolExecutor> executors = new ConcurrentHashMap<>();
|
||||
private final Map<Long, ThreadPoolExecutor> executors = new ConcurrentHashMap<>();
|
||||
@Autowired
|
||||
private ScenicService scenicService;
|
||||
|
||||
private ThreadPoolExecutor getExecutor(String deviceId) {
|
||||
ThreadPoolExecutor executor = executors.get(deviceId);
|
||||
if (executor == null) {
|
||||
executor = new ThreadPoolExecutor(4, 4096, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(4096));
|
||||
executors.put(deviceId, executor);
|
||||
}
|
||||
return executor;
|
||||
private ThreadPoolExecutor getExecutor(Long scenicId) {
|
||||
return executors.computeIfAbsent(scenicId, k -> {
|
||||
ThreadFactory threadFactory = new ThreadFactoryBuilder()
|
||||
.setNamePrefix("VIID-" + scenicId + "-t")
|
||||
.build();
|
||||
return new ThreadPoolExecutor(
|
||||
4, 1024, 0L, TimeUnit.MILLISECONDS,
|
||||
new ArrayBlockingQueue<>(1024),
|
||||
threadFactory);
|
||||
});
|
||||
}
|
||||
|
||||
// region 注册注销基础接口
|
||||
@ -269,7 +267,7 @@ public class ViidController {
|
||||
}
|
||||
if (shotTime == null) {
|
||||
shotTime = new Date();
|
||||
} else if (Math.abs(shotTime.getTime() - System.currentTimeMillis()) > + 24 * 60 * 60 * 1000) {
|
||||
} else if (Math.abs(shotTime.getTime() - System.currentTimeMillis()) > 24 * 60 * 60 * 1000) {
|
||||
shotTime = new Date();
|
||||
}
|
||||
Long scenicId = device.getScenicId();
|
||||
@ -307,14 +305,14 @@ public class ViidController {
|
||||
faceSample.setDeviceId(device.getId());
|
||||
faceSample.setStatus(0);
|
||||
faceSample.setCreateAt(shotTime);
|
||||
String url = adapter.uploadFile(file, "user-face", UUID.randomUUID() + "." + ext);
|
||||
String url = adapter.uploadFile(file, VIID_FACE, UUID.randomUUID() + "." + ext);
|
||||
faceSample.setFaceUrl(url);
|
||||
faceSampleMapper.add(faceSample);
|
||||
ThreadPoolExecutor executor = getExecutor(device.getId().toString());
|
||||
ThreadPoolExecutor executor = getExecutor(scenicId);
|
||||
executor.execute(() -> {
|
||||
if (faceBodyAdapter != null) {
|
||||
taskFaceService.assureFaceDb(faceBodyAdapter, scenicId.toString());
|
||||
AddFaceResp addFaceResp = faceBodyAdapter.addFace(scenicId.toString(), generateEntityId(faceSample), url, newFaceSampleId.toString());
|
||||
AddFaceResp addFaceResp = faceBodyAdapter.addFace(scenicId.toString(), faceSample.getId().toString(), url, newFaceSampleId.toString());
|
||||
if (addFaceResp != null) {
|
||||
faceSample.setScore(addFaceResp.getScore());
|
||||
faceSampleMapper.update(faceSample);
|
||||
@ -368,21 +366,21 @@ public class ViidController {
|
||||
faceSample.setDeviceId(device.getId());
|
||||
faceSample.setStatus(0);
|
||||
faceSample.setCreateAt(shotTime);
|
||||
String url = adapter.uploadFile(file, "user-face", UUID.randomUUID() + "." + ext);
|
||||
String url = adapter.uploadFile(file, VIID_FACE, UUID.randomUUID() + "." + ext);
|
||||
faceSample.setFaceUrl(url);
|
||||
faceSampleMapper.add(faceSample);
|
||||
DynamicTaskGenerator.addTask(faceSample.getId());
|
||||
ThreadPoolExecutor executor = getExecutor(device.getId().toString());
|
||||
ThreadPoolExecutor executor = getExecutor(scenicId);
|
||||
executor.execute(() -> {
|
||||
if (faceBodyAdapter != null) {
|
||||
taskFaceService.assureFaceDb(faceBodyAdapter, scenicId.toString());
|
||||
AddFaceResp addFaceResp = faceBodyAdapter.addFace(scenicId.toString(), generateEntityId(faceSample), url, newFaceSampleId.toString());
|
||||
AddFaceResp addFaceResp = faceBodyAdapter.addFace(scenicId.toString(), faceSample.getId().toString(), url, newFaceSampleId.toString());
|
||||
if (addFaceResp != null) {
|
||||
faceSample.setScore(addFaceResp.getScore());
|
||||
faceSampleMapper.update(faceSample);
|
||||
}
|
||||
}
|
||||
if (deviceConfig != null && Integer.valueOf(1).equals(deviceConfig.getEnablePreBook())) {
|
||||
if (Integer.valueOf(1).equals(deviceConfig.getEnablePreBook())) {
|
||||
DynamicTaskGenerator.addTask(faceSample.getId());
|
||||
}
|
||||
});
|
||||
@ -402,8 +400,6 @@ public class ViidController {
|
||||
@RequestMapping(value = "/Images", method = RequestMethod.POST)
|
||||
@IgnoreLogReq
|
||||
public VIIDBaseResp images(HttpServletRequest request, @RequestBody ImageUploadReq req) throws IOException {
|
||||
// log.info("Images:{}", req);
|
||||
HttpSaver.saveRequestToFile(request);
|
||||
return new VIIDBaseResp(
|
||||
new ResponseStatusObject("1", "/VIID/Images", "0", "OK", sdfTime.format(new Date()))
|
||||
);
|
||||
|
@ -1,25 +1,18 @@
|
||||
package com.ycwl.basic.controller.vpt;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.ycwl.basic.annotation.IgnoreLogReq;
|
||||
import com.ycwl.basic.annotation.IgnoreToken;
|
||||
import com.ycwl.basic.constant.StorageConstant;
|
||||
import com.ycwl.basic.device.entity.common.FileObject;
|
||||
import com.ycwl.basic.device.operator.VptPassiveStorageOperator;
|
||||
import com.ycwl.basic.device.operator.VptPassiveStorageOperator;
|
||||
import com.ycwl.basic.facebody.adapter.IFaceBodyAdapter;
|
||||
import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity;
|
||||
import com.ycwl.basic.model.wvp.WvpSyncReqVo;
|
||||
import com.ycwl.basic.repository.ScenicRepository;
|
||||
import com.ycwl.basic.service.pc.ScenicService;
|
||||
import com.ycwl.basic.storage.StorageFactory;
|
||||
import com.ycwl.basic.storage.adapters.IStorageAdapter;
|
||||
import com.ycwl.basic.storage.enums.StorageAcl;
|
||||
import com.ycwl.basic.storage.utils.StorageUtil;
|
||||
import com.ycwl.basic.utils.ApiResponse;
|
||||
import io.swagger.annotations.Api;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
@ -29,7 +22,6 @@ import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Slf4j
|
||||
@IgnoreToken
|
||||
@ -48,7 +40,7 @@ public class VptController {
|
||||
}
|
||||
@PostMapping("/scenic/{scenicId}/{taskId}/uploadUrl")
|
||||
public String uploadUrl(@PathVariable("scenicId") Long scenicId, @PathVariable("taskId") Long taskId) {
|
||||
IStorageAdapter adapter = scenicService.getScenicStorageAdapter(scenicId);
|
||||
IStorageAdapter adapter = scenicService.getScenicLocalStorageAdapter(scenicId);
|
||||
String filename = StorageUtil.joinPath(StorageConstant.VIDEO_PIECE_PATH, taskId.toString() + ".mp4");
|
||||
String urlForUpload = adapter.getUrlForUpload(new Date(System.currentTimeMillis() + 1000 * 60 * 60), "video/mp4", filename);
|
||||
urlForUpload = urlForUpload.replace("-internal.aliyuncs.com", ".aliyuncs.com");
|
||||
@ -56,7 +48,7 @@ public class VptController {
|
||||
}
|
||||
@PostMapping("/scenic/{scenicId}/{taskId}/success")
|
||||
public ApiResponse<String> success(@PathVariable("scenicId") Long scenicId, @PathVariable("taskId") Long taskId, @RequestBody FileObject fileObject) {
|
||||
IStorageAdapter adapter = scenicService.getScenicStorageAdapter(scenicId);
|
||||
IStorageAdapter adapter = scenicService.getScenicLocalStorageAdapter(scenicId);
|
||||
String filename = StorageUtil.joinPath(StorageConstant.VIDEO_PIECE_PATH, taskId.toString() + ".mp4");
|
||||
fileObject.setUrl(adapter.getUrl(filename));
|
||||
adapter.setAcl(StorageAcl.PUBLIC_READ, filename);
|
||||
|
@ -1,24 +1,19 @@
|
||||
package com.ycwl.basic.controller.wvp;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.ycwl.basic.annotation.IgnoreLogReq;
|
||||
import com.ycwl.basic.annotation.IgnoreToken;
|
||||
import com.ycwl.basic.constant.StorageConstant;
|
||||
import com.ycwl.basic.device.entity.common.FileObject;
|
||||
import com.ycwl.basic.device.operator.WvpPassiveStorageOperator;
|
||||
import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity;
|
||||
import com.ycwl.basic.model.wvp.WvpSyncReqVo;
|
||||
import com.ycwl.basic.repository.ScenicRepository;
|
||||
import com.ycwl.basic.service.pc.DeviceService;
|
||||
import com.ycwl.basic.service.pc.ScenicService;
|
||||
import com.ycwl.basic.storage.StorageFactory;
|
||||
import com.ycwl.basic.storage.adapters.IStorageAdapter;
|
||||
import com.ycwl.basic.storage.enums.StorageAcl;
|
||||
import com.ycwl.basic.storage.utils.StorageUtil;
|
||||
import com.ycwl.basic.utils.ApiResponse;
|
||||
import io.swagger.annotations.Api;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
@ -28,7 +23,6 @@ import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Slf4j
|
||||
@IgnoreToken
|
||||
@ -51,7 +45,7 @@ public class WvpController {
|
||||
|
||||
@PostMapping("/scenic/{scenicId}/{taskId}/uploadUrl")
|
||||
public String uploadUrl(@PathVariable("scenicId") Long scenicId, @PathVariable("taskId") Long taskId) {
|
||||
IStorageAdapter adapter = scenicService.getScenicStorageAdapter(scenicId);
|
||||
IStorageAdapter adapter = scenicService.getScenicLocalStorageAdapter(scenicId);
|
||||
String filename = StorageUtil.joinPath(StorageConstant.VIDEO_PIECE_PATH, taskId.toString() + ".mp4");
|
||||
String urlForUpload = adapter.getUrlForUpload(new Date(System.currentTimeMillis() + 1000 * 60 * 60), "video/mp4", filename);
|
||||
urlForUpload = urlForUpload.replace("-internal.aliyuncs.com", ".aliyuncs.com");
|
||||
@ -59,7 +53,7 @@ public class WvpController {
|
||||
}
|
||||
@PostMapping("/scenic/{scenicId}/{taskId}/success")
|
||||
public ApiResponse<String> success(@PathVariable("scenicId") Long scenicId, @PathVariable("taskId") Long taskId, @RequestBody FileObject fileObject) {
|
||||
IStorageAdapter adapter = scenicService.getScenicStorageAdapter(scenicId);
|
||||
IStorageAdapter adapter = scenicService.getScenicLocalStorageAdapter(scenicId);
|
||||
String filename = StorageUtil.joinPath(StorageConstant.VIDEO_PIECE_PATH, taskId.toString() + ".mp4");
|
||||
fileObject.setUrl(adapter.getUrl(filename));
|
||||
adapter.setAcl(StorageAcl.PUBLIC_READ, filename);
|
||||
|
@ -1,6 +1,8 @@
|
||||
package com.ycwl.basic.device.operator;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.annotation.JSONField;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.ycwl.basic.device.entity.common.FileObject;
|
||||
import com.ycwl.basic.device.entity.vpt_passive.VptPassiveStorageConfig;
|
||||
import com.ycwl.basic.device.entity.wvp_passive.WvpPassiveStorageConfig;
|
||||
@ -9,6 +11,7 @@ import com.ycwl.basic.storage.utils.StorageUtil;
|
||||
import com.ycwl.basic.utils.SnowFlakeUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.data.redis.core.RedisTemplate;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
@ -16,6 +19,7 @@ import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Slf4j
|
||||
@ -25,12 +29,18 @@ public class VptPassiveStorageOperator extends ADeviceStorageOperator {
|
||||
public Long scenicId;
|
||||
public Long deviceId;
|
||||
public String deviceNo;
|
||||
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
public Date startTime;
|
||||
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
public Date endTime;
|
||||
}
|
||||
|
||||
private static List<Task> taskList = new CopyOnWriteArrayList<>();
|
||||
private static ConcurrentHashMap<Long, FileObject> fileListMap = new ConcurrentHashMap<>();
|
||||
private static RedisTemplate<String, String> redisTemplate = null;
|
||||
private static final String TASK_KEY = "vpt:task:s%s:d%s:";
|
||||
|
||||
private VptPassiveStorageConfig config;
|
||||
|
||||
@ -38,6 +48,10 @@ public class VptPassiveStorageOperator extends ADeviceStorageOperator {
|
||||
loadConfig(configJson);
|
||||
}
|
||||
|
||||
public static void setRedisTemplate(RedisTemplate<String, String> redisTemplate) {
|
||||
VptPassiveStorageOperator.redisTemplate = redisTemplate;
|
||||
}
|
||||
|
||||
public static void onReceiveResult(Long taskId, FileObject fileObject) {
|
||||
if (fileObject == null) {
|
||||
log.info("任务{}获取视频失败!", taskId);
|
||||
@ -77,7 +91,11 @@ public class VptPassiveStorageOperator extends ADeviceStorageOperator {
|
||||
}
|
||||
task.startTime = startDate;
|
||||
task.endTime = endDate;
|
||||
taskList.add(task);
|
||||
if (redisTemplate == null) {
|
||||
taskList.add(task);
|
||||
} else {
|
||||
redisTemplate.opsForValue().set(String.format(TASK_KEY, task.scenicId, task.deviceNo) + task.taskId, JSON.toJSONString(task), 10 * 60L, TimeUnit.SECONDS);
|
||||
}
|
||||
log.info("任务{}获取视频开始!共{}", task.taskId, taskList.size());
|
||||
Date taskStartTime = new Date();
|
||||
while (true) {
|
||||
@ -99,6 +117,7 @@ public class VptPassiveStorageOperator extends ADeviceStorageOperator {
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
//noinspection BusyWait 得等待
|
||||
Thread.sleep(1000L);
|
||||
} catch (InterruptedException e) {
|
||||
return Collections.emptyList();
|
||||
|
@ -1,12 +1,15 @@
|
||||
package com.ycwl.basic.device.operator;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.annotation.JSONField;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.ycwl.basic.device.entity.common.FileObject;
|
||||
import com.ycwl.basic.device.entity.wvp_passive.WvpPassiveStorageConfig;
|
||||
import com.ycwl.basic.storage.utils.StorageUtil;
|
||||
import com.ycwl.basic.utils.SnowFlakeUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.data.redis.core.RedisTemplate;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
@ -14,21 +17,29 @@ import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Slf4j
|
||||
public class WvpPassiveStorageOperator extends ADeviceStorageOperator {
|
||||
|
||||
public static class Task {
|
||||
public Long taskId;
|
||||
public Long scenicId;
|
||||
public Long deviceId;
|
||||
public String deviceNo;
|
||||
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
public Date startTime;
|
||||
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
public Date endTime;
|
||||
}
|
||||
|
||||
private static List<Task> taskList = new CopyOnWriteArrayList<>();
|
||||
private static ConcurrentHashMap<Long, FileObject> fileListMap = new ConcurrentHashMap<>();
|
||||
private static RedisTemplate<String, String> redisTemplate = null;
|
||||
private static final String TASK_KEY = "wvp:task:s%s:d%s:";
|
||||
|
||||
private WvpPassiveStorageConfig config;
|
||||
|
||||
@ -36,6 +47,11 @@ public class WvpPassiveStorageOperator extends ADeviceStorageOperator {
|
||||
loadConfig(configJson);
|
||||
}
|
||||
|
||||
|
||||
public static void setRedisTemplate(RedisTemplate<String, String> redisTemplate) {
|
||||
WvpPassiveStorageOperator.redisTemplate = redisTemplate;
|
||||
}
|
||||
|
||||
public static void onReceiveResult(Long taskId, FileObject fileObject) {
|
||||
if (fileObject == null) {
|
||||
log.info("任务{}获取视频失败!", taskId);
|
||||
@ -72,7 +88,11 @@ public class WvpPassiveStorageOperator extends ADeviceStorageOperator {
|
||||
}
|
||||
task.startTime = startDate;
|
||||
task.endTime = endDate;
|
||||
taskList.add(task);
|
||||
if (redisTemplate == null) {
|
||||
taskList.add(task);
|
||||
} else {
|
||||
redisTemplate.opsForValue().set(String.format(TASK_KEY, task.scenicId, task.deviceNo) + task.taskId, JSON.toJSONString(task), 10 * 60L, TimeUnit.SECONDS);
|
||||
}
|
||||
Date taskStartTime = new Date();
|
||||
while (true) {
|
||||
if (new Date().getTime() - taskStartTime.getTime() > 60000L) {
|
||||
@ -93,6 +113,7 @@ public class WvpPassiveStorageOperator extends ADeviceStorageOperator {
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
//noinspection BusyWait 得等待
|
||||
Thread.sleep(1000L);
|
||||
} catch (InterruptedException e) {
|
||||
return Collections.emptyList();
|
||||
|
@ -0,0 +1,20 @@
|
||||
package com.ycwl.basic.device.starter;
|
||||
|
||||
import com.ycwl.basic.device.operator.VptPassiveStorageOperator;
|
||||
import com.ycwl.basic.device.operator.WvpPassiveStorageOperator;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.data.redis.core.RedisTemplate;
|
||||
|
||||
@Configuration
|
||||
public class DeviceStorageOperatorStarter implements InitializingBean {
|
||||
@Autowired
|
||||
private RedisTemplate<String, String> redisTemplate;
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() {
|
||||
WvpPassiveStorageOperator.setRedisTemplate(redisTemplate);
|
||||
VptPassiveStorageOperator.setRedisTemplate(redisTemplate);
|
||||
}
|
||||
}
|
@ -1,20 +0,0 @@
|
||||
package com.ycwl.basic.enums;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* 是否同意用户协议枚举
|
||||
*
|
||||
* @author songmingsong
|
||||
*/
|
||||
@Getter
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public enum AgreementEnum {
|
||||
AGREE(1, "同意"),
|
||||
NOT_AGREE(0, "未同意");
|
||||
private int type;
|
||||
private String remark;
|
||||
}
|
@ -1,69 +0,0 @@
|
||||
package com.ycwl.basic.enums;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @Author:longbinbin
|
||||
* @Date:2024/12/6 16:46
|
||||
*/
|
||||
public enum GoodsTypeEnum {
|
||||
VIDEO(1,"成片"),
|
||||
SOURCE(2,"源素材")
|
||||
;
|
||||
|
||||
|
||||
public Integer code;
|
||||
|
||||
private String value;
|
||||
public static final Map<Integer, GoodsTypeEnum> cacheMap;
|
||||
|
||||
static {
|
||||
cacheMap = new HashMap<>(GoodsTypeEnum.values().length);
|
||||
for (GoodsTypeEnum value : GoodsTypeEnum.values()) {
|
||||
cacheMap.put(value.code, value);
|
||||
}
|
||||
}
|
||||
public static final java.util.Map<String, GoodsTypeEnum> valueMap;
|
||||
|
||||
static {
|
||||
valueMap = new HashMap<>(GoodsTypeEnum.values().length);
|
||||
for (GoodsTypeEnum value : GoodsTypeEnum.values()) {
|
||||
valueMap.put(value.value, value);
|
||||
}
|
||||
}
|
||||
|
||||
GoodsTypeEnum(Integer code, String value) {
|
||||
this.code = code;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取value值
|
||||
*/
|
||||
public static String getValue(Integer noticeMethod) {
|
||||
if (noticeMethod == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
GoodsTypeEnum GoodsTypeEnum = cacheMap.get(noticeMethod);
|
||||
if (GoodsTypeEnum == null) {
|
||||
return null;
|
||||
}
|
||||
return GoodsTypeEnum.value;
|
||||
}
|
||||
/**
|
||||
* 获取code值
|
||||
*/
|
||||
public static Integer getCode(String noticeMethod) {
|
||||
if (noticeMethod == null) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
GoodsTypeEnum GoodsTypeEnum = valueMap.get(noticeMethod);
|
||||
if (GoodsTypeEnum == null) {
|
||||
return -1;
|
||||
}
|
||||
return GoodsTypeEnum.code;
|
||||
}
|
||||
}
|
@ -2,11 +2,13 @@ package com.ycwl.basic.exception;
|
||||
|
||||
import com.ycwl.basic.enums.BizCodeEnum;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
/**
|
||||
* @author songminsgong
|
||||
* @since 2022-11-23
|
||||
*/
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public class AppException extends RuntimeException {
|
||||
|
||||
|
@ -2,11 +2,13 @@ package com.ycwl.basic.exception;
|
||||
|
||||
import com.ycwl.basic.enums.BizCodeEnum;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
/**
|
||||
* @author wenshijia
|
||||
* @date 2021年05月25日 22:41
|
||||
*/
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public class BizException extends RuntimeException {
|
||||
|
||||
|
@ -1,10 +1,8 @@
|
||||
package com.ycwl.basic.exception;
|
||||
|
||||
import com.ycwl.basic.aspectj.HttpSaver;
|
||||
import com.ycwl.basic.enums.BizCodeEnum;
|
||||
import com.ycwl.basic.notify.NotifyFactory;
|
||||
import com.ycwl.basic.notify.entity.NotifyContent;
|
||||
import com.ycwl.basic.utils.ApiResponse;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import org.apache.tomcat.util.http.fileupload.impl.SizeLimitExceededException;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -12,14 +10,11 @@ import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.converter.HttpMessageNotReadableException;
|
||||
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
||||
import org.springframework.web.context.request.RequestContextHolder;
|
||||
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Enumeration;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @date 2022年09月23日 10:19
|
||||
@ -58,13 +53,21 @@ public class CustomExceptionHandle {
|
||||
* 自定义异常统一处理类
|
||||
*/
|
||||
@ExceptionHandler(value = BizException.class)
|
||||
public ApiResponse<String> handle(BizException bizException) {
|
||||
public ApiResponse<String> handle(HttpServletResponse response, BizException bizException) {
|
||||
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
|
||||
return ApiResponse.buildResponse(bizException.getCode(), bizException.getMsg());
|
||||
}
|
||||
@ExceptionHandler(value = MethodArgumentTypeMismatchException.class)
|
||||
public ApiResponse<String> handle(HttpServletRequest request, HttpServletResponse response, MethodArgumentTypeMismatchException exception) {
|
||||
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
|
||||
LOGGER.error("参数错误 -> 请求地址:{},请求方式:{}", request.getRequestURI(), request.getMethod());
|
||||
return ApiResponse.buildResponse(5000, "参数错误!");
|
||||
}
|
||||
|
||||
@ExceptionHandler(value =IOException.class)
|
||||
public ApiResponse<String> handle(IOException e) {
|
||||
LOGGER.error("系统异常 -> {}", e.getMessage(), e);
|
||||
public ApiResponse<String> handle(HttpServletResponse response, IOException e) {
|
||||
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
|
||||
LOGGER.error("IO异常 -> {}", e.getMessage(), e);
|
||||
return ApiResponse.buildResult(BizCodeEnum.SERVER_UNKONWN_ERROR);
|
||||
}
|
||||
|
||||
@ -72,7 +75,8 @@ public class CustomExceptionHandle {
|
||||
* 异常统一返回处理
|
||||
*/
|
||||
@ExceptionHandler(value = Exception.class)
|
||||
public ApiResponse<String> handle(Exception e) {
|
||||
public ApiResponse<String> handle(HttpServletResponse response, Exception e) {
|
||||
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
|
||||
LOGGER.error("系统异常 -> {}", e.getMessage(), e);
|
||||
return ApiResponse.buildResult(BizCodeEnum.SERVER_UNKONWN_ERROR);
|
||||
}
|
||||
@ -81,7 +85,8 @@ public class CustomExceptionHandle {
|
||||
* 移动端自定义异常统一处理类
|
||||
*/
|
||||
@ExceptionHandler(value = AppException.class)
|
||||
public ApiResponse<String> handle(AppException appException) {
|
||||
public ApiResponse<String> handle(HttpServletResponse response, AppException appException) {
|
||||
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
|
||||
return ApiResponse.buildResponse(appException.getCode(), appException.getMsg());
|
||||
}
|
||||
|
||||
@ -89,7 +94,8 @@ public class CustomExceptionHandle {
|
||||
* 移动端自定义异常统一处理类
|
||||
*/
|
||||
@ExceptionHandler(value = HttpMessageNotReadableException.class)
|
||||
public ApiResponse<String> handle(HttpMessageNotReadableException httpMessageNotReadableException) {
|
||||
public ApiResponse<String> handle(HttpServletResponse response, HttpMessageNotReadableException httpMessageNotReadableException) {
|
||||
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
|
||||
return ApiResponse.buildResponse(500, "请求参数格式错误");
|
||||
}
|
||||
|
||||
|
@ -23,14 +23,11 @@ public class FaceBodyFactory {
|
||||
}
|
||||
|
||||
public static IFaceBodyAdapter getAdapter(FaceBodyAdapterType type) {
|
||||
switch (type) {
|
||||
case ALI:
|
||||
return new AliFaceBodyAdapter();
|
||||
case BCE:
|
||||
return new BceFaceBodyAdapter();
|
||||
default:
|
||||
throw new FaceBodyUnsupportedException("不支持的Adapter类型");
|
||||
}
|
||||
return switch (type) {
|
||||
case ALI -> new AliFaceBodyAdapter();
|
||||
case BCE -> new BceFaceBodyAdapter();
|
||||
default -> throw new FaceBodyUnsupportedException("不支持的Adapter类型");
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
@ -29,6 +29,7 @@ import org.apache.commons.lang3.StringUtils;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.stream.Collectors;
|
||||
@ -62,33 +63,31 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
|
||||
}
|
||||
|
||||
private IRateLimiter getLimiter(LOCK_TYPE type) {
|
||||
switch (type) {
|
||||
case ADD_DB:
|
||||
return addDbLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
|
||||
case ADD_ENTITY:
|
||||
return addEntityLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
|
||||
case ADD_FACE:
|
||||
return addFaceLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
|
||||
case LIST_DB:
|
||||
return listDbLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(500, TimeUnit.MILLISECONDS));
|
||||
case LIST_FACE:
|
||||
return listFaceLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(2));
|
||||
case SEARCH_FACE:
|
||||
return searchFaceLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(200, TimeUnit.MILLISECONDS));
|
||||
case DELETE_DB:
|
||||
return deleteDbLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
|
||||
case DELETE_ENTITY:
|
||||
return deleteEntityLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
|
||||
default:
|
||||
return new FixedRateLimiter(600, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
return switch (type) {
|
||||
case ADD_DB ->
|
||||
addDbLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
|
||||
case ADD_ENTITY ->
|
||||
addEntityLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
|
||||
case ADD_FACE ->
|
||||
addFaceLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
|
||||
case LIST_DB ->
|
||||
listDbLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(500, TimeUnit.MILLISECONDS));
|
||||
case LIST_FACE -> listFaceLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(2));
|
||||
case SEARCH_FACE ->
|
||||
searchFaceLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(200, TimeUnit.MILLISECONDS));
|
||||
case DELETE_DB ->
|
||||
deleteDbLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
|
||||
case DELETE_ENTITY ->
|
||||
deleteEntityLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
|
||||
default -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS);
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addFaceDb(String dbName) {
|
||||
IRateLimiter addDbLimiter = getLimiter(LOCK_TYPE.ADD_DB);
|
||||
try (ClientWrapper clientWrapper = getClient()) {
|
||||
IAcsClient client = clientWrapper.getClient();
|
||||
IAcsClient client = clientWrapper.client();
|
||||
CreateFaceDbRequest request = new CreateFaceDbRequest();
|
||||
request.setName(dbName);
|
||||
try {
|
||||
@ -109,9 +108,10 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
|
||||
IRateLimiter deleteEntityLimiter = getLimiter(LOCK_TYPE.DELETE_ENTITY);
|
||||
IRateLimiter deleteDbLimiter = getLimiter(LOCK_TYPE.DELETE_DB);
|
||||
request.setDbName(dbName);
|
||||
request.setOrder("asc");
|
||||
request.setLimit(200);
|
||||
try (ClientWrapper clientWrapper = getClient()) {
|
||||
IAcsClient client = clientWrapper.getClient();
|
||||
IAcsClient client = clientWrapper.client();
|
||||
while (true) {
|
||||
ListFaceEntitiesResponse response = client.getAcsResponse(request);
|
||||
if (response.getData().getTotalCount() == 0) {
|
||||
@ -150,7 +150,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
|
||||
public List<String> listFaceDb() {
|
||||
ListFaceDbsRequest request = new ListFaceDbsRequest();
|
||||
try (ClientWrapper clientWrapper = getClient()) {
|
||||
IAcsClient client = clientWrapper.getClient();
|
||||
IAcsClient client = clientWrapper.client();
|
||||
ListFaceDbsResponse response = client.getAcsResponse(request);
|
||||
return response.getData().getDbList().stream().map(ListFaceDbsResponse.Data.DbListItem::getName).collect(Collectors.toList());
|
||||
} catch (ClientException e) {
|
||||
@ -167,7 +167,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
|
||||
request.setDbName(dbName);
|
||||
request.setEntityId(entityId);
|
||||
try (ClientWrapper clientWrapper = getClient()) {
|
||||
IAcsClient client = clientWrapper.getClient();
|
||||
IAcsClient client = clientWrapper.client();
|
||||
try {
|
||||
addEntityLimiter.acquire();
|
||||
} catch (InterruptedException ignored) {
|
||||
@ -206,7 +206,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
|
||||
request.setDbName(dbName);
|
||||
request.setEntityId(entityId);
|
||||
try (ClientWrapper clientWrapper = getClient()) {
|
||||
IAcsClient client = clientWrapper.getClient();
|
||||
IAcsClient client = clientWrapper.client();
|
||||
try {
|
||||
deleteEntityLimiter.acquire();
|
||||
} catch (InterruptedException ignored) {
|
||||
@ -230,16 +230,12 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
|
||||
if (offset != null) {
|
||||
listFaceEntitiesRequest.setOffset(offset);
|
||||
}
|
||||
if (size != null) {
|
||||
listFaceEntitiesRequest.setLimit(size);
|
||||
} else {
|
||||
listFaceEntitiesRequest.setLimit(200);
|
||||
}
|
||||
listFaceEntitiesRequest.setLimit(Objects.requireNonNullElse(size, 200));
|
||||
if (StringUtils.isNotEmpty(prefix)) {
|
||||
listFaceEntitiesRequest.setEntityIdPrefix(prefix);
|
||||
}
|
||||
try (ClientWrapper clientWrapper = getClient()) {
|
||||
IAcsClient client = clientWrapper.getClient();
|
||||
IAcsClient client = clientWrapper.client();
|
||||
try {
|
||||
listFaceLimiter.acquire();
|
||||
} catch (InterruptedException ignored) {
|
||||
@ -249,7 +245,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
|
||||
return response.getData().getEntities().stream().map(ListFaceEntitiesResponse.Data.Entity::getEntityId).collect(Collectors.toList());
|
||||
} catch (ClientException e) {
|
||||
log.error("获取人脸数据失败!", e);
|
||||
return null;
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -259,7 +255,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
|
||||
SearchFaceResp resp = new SearchFaceResp();
|
||||
IRateLimiter searchFaceLimiter = getLimiter(LOCK_TYPE.SEARCH_FACE);
|
||||
try (ClientWrapper clientWrapper = getClient()) {
|
||||
IAcsClient client = clientWrapper.getClient();
|
||||
IAcsClient client = clientWrapper.client();
|
||||
SearchFaceRequest request = new SearchFaceRequest();
|
||||
request.setDbName(dbName);
|
||||
request.setImageUrl(faceUrl);
|
||||
@ -275,7 +271,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
|
||||
resp.setOriginalFaceScore(0f);
|
||||
return resp;
|
||||
}
|
||||
SearchFaceResponse.Data.MatchListItem matchItem = matchList.get(0);
|
||||
SearchFaceResponse.Data.MatchListItem matchItem = matchList.getFirst();
|
||||
resp.setOriginalFaceScore(matchItem.getQualitieScore());
|
||||
resp.setResult(matchItem.getFaceItems().stream().map(item -> {
|
||||
SearchFaceResultItem resultItem = new SearchFaceResultItem();
|
||||
@ -286,7 +282,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
|
||||
return resultItem;
|
||||
}).collect(Collectors.toList()));
|
||||
if (!resp.getResult().isEmpty()) {
|
||||
resp.setFirstMatchRate(resp.getResult().get(0).getScore());
|
||||
resp.setFirstMatchRate(resp.getResult().getFirst().getScore());
|
||||
}
|
||||
return resp;
|
||||
} catch (ClientException e) {
|
||||
@ -303,13 +299,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
|
||||
return new ClientWrapper(client);
|
||||
}
|
||||
|
||||
@Getter
|
||||
public static class ClientWrapper implements AutoCloseable {
|
||||
private final IAcsClient client;
|
||||
|
||||
public ClientWrapper(IAcsClient client) {
|
||||
this.client = client;
|
||||
}
|
||||
public record ClientWrapper(IAcsClient client) implements AutoCloseable {
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
@ -318,7 +308,6 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
|
||||
}
|
||||
client.shutdown();
|
||||
}
|
||||
|
||||
}
|
||||
protected enum LOCK_TYPE {
|
||||
ADD_DB,
|
||||
|
@ -2,13 +2,11 @@ package com.ycwl.basic.facebody.adapter;
|
||||
|
||||
import com.baidu.aip.face.AipFace;
|
||||
import com.ycwl.basic.facebody.entity.AddFaceResp;
|
||||
import com.ycwl.basic.facebody.entity.AliFaceBodyConfig;
|
||||
import com.ycwl.basic.facebody.entity.BceFaceBodyConfig;
|
||||
import com.ycwl.basic.facebody.entity.SearchFaceResp;
|
||||
import com.ycwl.basic.facebody.entity.SearchFaceResultItem;
|
||||
import com.ycwl.basic.utils.ratelimiter.FixedRateLimiter;
|
||||
import com.ycwl.basic.utils.ratelimiter.IRateLimiter;
|
||||
import lombok.Getter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONObject;
|
||||
@ -23,7 +21,6 @@ import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Slf4j
|
||||
public class BceFaceBodyAdapter implements IFaceBodyAdapter {
|
||||
@ -172,6 +169,9 @@ public class BceFaceBodyAdapter implements IFaceBodyAdapter {
|
||||
AipFace client = getClient();
|
||||
HashMap<String, String> options = new HashMap<>();
|
||||
List<String> tokenList = listUserFace(dbName, entityId);
|
||||
if (tokenList == null) {
|
||||
return false;
|
||||
}
|
||||
AtomicInteger count = new AtomicInteger(0);
|
||||
tokenList.forEach(faceToken -> {
|
||||
try {
|
||||
@ -232,30 +232,42 @@ public class BceFaceBodyAdapter implements IFaceBodyAdapter {
|
||||
}
|
||||
|
||||
public List<String> listUserFace(String dbName, String entityId) {
|
||||
IRateLimiter listFaceLimiter = getLimiter(LOCK_TYPE.LIST_FACE);
|
||||
try {
|
||||
AipFace client = getClient();
|
||||
HashMap<String, String> options = new HashMap<>();
|
||||
try {
|
||||
listFaceLimiter.acquire();
|
||||
} catch (InterruptedException ignored) {
|
||||
}
|
||||
JSONObject response = client.faceGetlist(entityId, dbName, options);
|
||||
if (response.getInt("error_code") == 0) {
|
||||
JSONObject resultObj = response.getJSONObject("result");
|
||||
if (resultObj != null) {
|
||||
JSONArray faceList = resultObj.getJSONArray("face_list");
|
||||
List<String> result = new ArrayList<>();
|
||||
for (int i = 0; i < faceList.length(); i++) {
|
||||
JSONObject jsonObject = faceList.getJSONObject(i);
|
||||
result.add(jsonObject.getString("face_token"));
|
||||
try {
|
||||
JSONArray faceList = resultObj.getJSONArray("face_list");
|
||||
List<String> result = new ArrayList<>();
|
||||
for (int i = 0; i < faceList.length(); i++) {
|
||||
JSONObject jsonObject = faceList.getJSONObject(i);
|
||||
result.add(jsonObject.getString("face_token"));
|
||||
}
|
||||
return result;
|
||||
} catch (Exception e) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return result;
|
||||
} else {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
} else if (response.getInt("error_code") == 223103) {
|
||||
// 用户不存在
|
||||
return Collections.emptyList();
|
||||
} else {
|
||||
log.warn("获取人脸列表失败!{}", response);
|
||||
return Collections.emptyList();
|
||||
return null;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("获取人脸列表失败!", e);
|
||||
return Collections.emptyList();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@ -293,7 +305,7 @@ public class BceFaceBodyAdapter implements IFaceBodyAdapter {
|
||||
}
|
||||
resp.setResult(result);
|
||||
if (!result.isEmpty()) {
|
||||
resp.setFirstMatchRate(result.get(0).getScore());
|
||||
resp.setFirstMatchRate(result.getFirst().getScore());
|
||||
}
|
||||
return resp;
|
||||
} else {
|
||||
@ -323,26 +335,25 @@ public class BceFaceBodyAdapter implements IFaceBodyAdapter {
|
||||
}
|
||||
|
||||
private IRateLimiter getLimiter(LOCK_TYPE type) {
|
||||
switch (type) {
|
||||
case ADD_DB:
|
||||
return addDbLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(100, TimeUnit.MILLISECONDS));
|
||||
case ADD_FACE:
|
||||
return addFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(config.getAddQps()));
|
||||
case LIST_DB:
|
||||
return listDbLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(100, TimeUnit.MILLISECONDS));
|
||||
case LIST_FACE:
|
||||
return listFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(100, TimeUnit.MILLISECONDS));
|
||||
case SEARCH_FACE:
|
||||
return searchFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(config.getSearchQps()));
|
||||
case DELETE_DB:
|
||||
return deleteDbLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(100, TimeUnit.MILLISECONDS));
|
||||
case DELETE_ENTITY:
|
||||
return deleteEntityLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(100, TimeUnit.MILLISECONDS));
|
||||
case DELETE_FACE:
|
||||
return deleteFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(100, TimeUnit.MILLISECONDS));
|
||||
default:
|
||||
return new FixedRateLimiter(500, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
return switch (type) {
|
||||
case ADD_DB ->
|
||||
addDbLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(105, TimeUnit.MILLISECONDS));
|
||||
case ADD_FACE ->
|
||||
addFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(config.getAddQps()));
|
||||
case LIST_DB ->
|
||||
listDbLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(105, TimeUnit.MILLISECONDS));
|
||||
case LIST_FACE ->
|
||||
listFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(105, TimeUnit.MILLISECONDS));
|
||||
case SEARCH_FACE ->
|
||||
searchFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(config.getSearchQps()));
|
||||
case DELETE_DB ->
|
||||
deleteDbLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(105, TimeUnit.MILLISECONDS));
|
||||
case DELETE_ENTITY ->
|
||||
deleteEntityLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(105, TimeUnit.MILLISECONDS));
|
||||
case DELETE_FACE ->
|
||||
deleteFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(105, TimeUnit.MILLISECONDS));
|
||||
default -> new FixedRateLimiter(500, TimeUnit.MILLISECONDS);
|
||||
};
|
||||
}
|
||||
|
||||
protected enum LOCK_TYPE {
|
||||
|
@ -1,21 +0,0 @@
|
||||
package com.ycwl.basic.filter;
|
||||
|
||||
import com.ycwl.basic.config.CachedBodyHttpServletRequest;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.servlet.*;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletRequestWrapper;
|
||||
import java.io.IOException;
|
||||
|
||||
@Component
|
||||
public class RequestCacheFilter implements Filter {
|
||||
@Override
|
||||
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
|
||||
throws IOException, ServletException {
|
||||
// 包装原始请求
|
||||
HttpServletRequestWrapper wrappedRequest = new CachedBodyHttpServletRequest((HttpServletRequest) request);
|
||||
// 继续处理请求链
|
||||
chain.doFilter(wrappedRequest, response);
|
||||
}
|
||||
}
|
@ -16,15 +16,11 @@ public class ImageWatermarkFactory {
|
||||
return get(type);
|
||||
}
|
||||
public static IOperator get(ImageWatermarkOperatorEnum type) {
|
||||
switch (type) {
|
||||
case WATERMARK:
|
||||
return new DefaultImageWatermarkOperator();
|
||||
case NORMAL:
|
||||
return new NormalWatermarkOperator();
|
||||
case LEICA:
|
||||
return new LeicaWatermarkOperator();
|
||||
default:
|
||||
throw new ImageWatermarkUnsupportedException("不支持的类型"+type.name());
|
||||
}
|
||||
return switch (type) {
|
||||
case WATERMARK -> new DefaultImageWatermarkOperator();
|
||||
case NORMAL -> new NormalWatermarkOperator();
|
||||
case LEICA -> new LeicaWatermarkOperator();
|
||||
default -> throw new ImageWatermarkUnsupportedException("不支持的类型" + type.name());
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -106,13 +106,13 @@ public class LeicaWatermarkOperator implements IOperator {
|
||||
int dtLineHeight = datetimeFontMetrics.getHeight();
|
||||
int scenicLineWidth = scenicFontMetrics.stringWidth(info.getScenicLine());
|
||||
int datetimeLineWidth = scenicFontMetrics.stringWidth(info.getDatetimeLine());
|
||||
g2d.drawImage(qrcodeImage, newImage.getWidth() + EXTRA_BORDER_PX - OFFSET_X - newQrcodeWidth - QRCODE_OFFSET_X - Math.max(scenicLineWidth, datetimeLineWidth), EXTRA_BORDER_PX + baseImage.getHeight() + + OFFSET_Y, newQrcodeWidth, newQrcodeHeight, null);
|
||||
g2d.drawImage(qrcodeImage, newImage.getWidth() + EXTRA_BORDER_PX - OFFSET_X - newQrcodeWidth - QRCODE_OFFSET_X - Math.max(scenicLineWidth, datetimeLineWidth), EXTRA_BORDER_PX + baseImage.getHeight() + OFFSET_Y, newQrcodeWidth, newQrcodeHeight, null);
|
||||
g2d.setFont(scenicFont);
|
||||
g2d.setColor(scenicColor);
|
||||
g2d.drawString(info.getScenicLine(), newImage.getWidth() + EXTRA_BORDER_PX - OFFSET_X - Math.max(scenicLineWidth, datetimeLineWidth), EXTRA_BORDER_PX + baseImage.getHeight() + + OFFSET_Y + scenicLineHeight + scenicLineHeight * FONT_GLOBAL_OFFSET_PERCENT);
|
||||
g2d.drawString(info.getScenicLine(), newImage.getWidth() + EXTRA_BORDER_PX - OFFSET_X - Math.max(scenicLineWidth, datetimeLineWidth), EXTRA_BORDER_PX + baseImage.getHeight() + OFFSET_Y + scenicLineHeight + scenicLineHeight * FONT_GLOBAL_OFFSET_PERCENT);
|
||||
g2d.setFont(datetimeFont);
|
||||
g2d.setColor(datetimeColor);
|
||||
g2d.drawString(info.getDatetimeLine(), newImage.getWidth() + EXTRA_BORDER_PX - OFFSET_X - Math.max(scenicLineWidth, datetimeLineWidth), EXTRA_BORDER_PX + baseImage.getHeight() + + OFFSET_Y + scenicLineHeight + dtLineHeight + dtLineHeight * FONT_GLOBAL_OFFSET_PERCENT);
|
||||
g2d.drawString(info.getDatetimeLine(), newImage.getWidth() + EXTRA_BORDER_PX - OFFSET_X - Math.max(scenicLineWidth, datetimeLineWidth), EXTRA_BORDER_PX + baseImage.getHeight() + OFFSET_Y + scenicLineHeight + dtLineHeight + dtLineHeight * FONT_GLOBAL_OFFSET_PERCENT);
|
||||
String fileName = info.getWatermarkedFile().getName();
|
||||
String formatName = "jpg"; // 默认格式为 jpg
|
||||
if (fileName.endsWith(".png")) {
|
||||
|
@ -8,7 +8,6 @@ import com.ycwl.basic.constant.RequestConstant;
|
||||
import com.ycwl.basic.exception.CheckTokenException;
|
||||
import com.ycwl.basic.exception.MissTokenException;
|
||||
import com.ycwl.basic.exception.PermissionException;
|
||||
import com.ycwl.basic.exception.TokenExpireException;
|
||||
import com.ycwl.basic.model.jwt.JwtInfo;
|
||||
import com.ycwl.basic.utils.JwtTokenUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@ -17,42 +16,36 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.redis.core.RedisTemplate;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.method.HandlerMethod;
|
||||
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
|
||||
import org.springframework.web.servlet.HandlerInterceptor;
|
||||
|
||||
import javax.servlet.http.Cookie;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import jakarta.servlet.http.Cookie;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZoneId;
|
||||
import java.util.List;
|
||||
|
||||
@Slf4j
|
||||
@Component
|
||||
public class AuthInterceptor extends HandlerInterceptorAdapter {
|
||||
|
||||
@Autowired
|
||||
JwtTokenUtil jwtTokenUtil;
|
||||
public class AuthInterceptor implements HandlerInterceptor {
|
||||
|
||||
@Autowired
|
||||
RedisTemplate redisTemplate;
|
||||
|
||||
@Override
|
||||
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
|
||||
if (!(handler instanceof HandlerMethod)) {
|
||||
return super.preHandle(request, response, handler);
|
||||
if (!(handler instanceof HandlerMethod handlerMethod)) {
|
||||
return true;
|
||||
}
|
||||
String requestURI = request.getRequestURI();
|
||||
|
||||
HandlerMethod handlerMethod = (HandlerMethod) handler;
|
||||
// 获取类上面的注解
|
||||
IgnoreToken ignoreClassToken = handlerMethod.getBeanType().getAnnotation(IgnoreToken.class);
|
||||
// 获取方法上的注解
|
||||
IgnoreToken ignoreMethodToken = handlerMethod.getMethodAnnotation(IgnoreToken.class);
|
||||
if (ignoreClassToken != null || ignoreMethodToken != null) {
|
||||
// 放行
|
||||
return super.preHandle(request, response, handler);
|
||||
return true;
|
||||
}
|
||||
|
||||
// 放行白名单
|
||||
@ -120,7 +113,6 @@ public class AuthInterceptor extends HandlerInterceptorAdapter {
|
||||
@Override
|
||||
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
|
||||
BaseContextHandler.remove();
|
||||
super.afterCompletion(request, response, handler, ex);
|
||||
}
|
||||
|
||||
public String getToken(HttpServletRequest request) {
|
||||
|
@ -30,7 +30,7 @@ public interface DeviceMapper {
|
||||
DeviceEntity getByDeviceId(Long deviceId);
|
||||
List<DeviceRespVO> listByScenicIdWithWVP(Long scenicId);
|
||||
|
||||
ScenicDeviceCountVO deviceCountByScenicId(@Param("scenicId") Long scenicId,@Param("userId") Long userId);
|
||||
ScenicDeviceCountVO deviceCountByScenicId(@Param("scenicId") Long scenicId);
|
||||
|
||||
DeviceConfigEntity getConfigByDeviceId(Long deviceId);
|
||||
int addConfig(DeviceConfigEntity deviceConfigEntity);
|
||||
|
@ -23,6 +23,7 @@ public interface FaceMapper {
|
||||
FaceEntity get(Long id);
|
||||
int add(FaceEntity face);
|
||||
int deleteById(Long id);
|
||||
int forceDeleteById(Long id);
|
||||
int deleteByIds(@Param("list") List<Long> ids);
|
||||
int update(FaceEntity face);
|
||||
|
||||
@ -35,5 +36,5 @@ public interface FaceMapper {
|
||||
|
||||
List<FaceRespVO> listByScenicAndUserId(String scenicId, Long userId);
|
||||
|
||||
List<FaceEntity> listEntityBeforeDate(Long scenicId, Date endDate);
|
||||
List<FaceEntity> listUnpaidEntityBeforeDate(Long scenicId, Date endDate);
|
||||
}
|
||||
|
@ -17,4 +17,6 @@ public interface PriceConfigMapper extends BaseMapper<PriceConfigEntity> {
|
||||
List<PriceConfigRespVO> listByCondition(@Param("req") PriceConfigListReq req);
|
||||
|
||||
PriceConfigEntity getPriceByScenicTypeGoods(Long scenicId, Integer type, String goodsId);
|
||||
|
||||
int updateStatus(Integer id);
|
||||
}
|
10
src/main/java/com/ycwl/basic/mapper/PrintTaskMapper.java
Normal file
10
src/main/java/com/ycwl/basic/mapper/PrintTaskMapper.java
Normal file
@ -0,0 +1,10 @@
|
||||
package com.ycwl.basic.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.ycwl.basic.model.pc.printer.entity.PrintTaskEntity;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
@Mapper
|
||||
public interface PrintTaskMapper extends BaseMapper<PrintTaskEntity> {
|
||||
int insertTask(PrintTaskEntity entity);
|
||||
}
|
@ -2,6 +2,8 @@ package com.ycwl.basic.mapper;
|
||||
|
||||
import com.ycwl.basic.model.pc.printer.entity.PrintTaskEntity;
|
||||
import com.ycwl.basic.model.pc.printer.entity.PrinterEntity;
|
||||
import com.ycwl.basic.model.pc.printer.resp.MemberPrintResp;
|
||||
import com.ycwl.basic.model.pc.printer.resp.PrinterResp;
|
||||
import com.ycwl.basic.model.printer.resp.PrintTaskResp;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
@ -26,4 +28,26 @@ public interface PrinterMapper {
|
||||
int updateTaskStatus(@Param("id") Integer id, @Param("status") Integer status);
|
||||
|
||||
PrintTaskEntity getTaskById(Integer id);
|
||||
|
||||
List<PrinterResp> listByScenicId(@Param("scenicId") Long scenicId);
|
||||
|
||||
List<MemberPrintResp> listRelation(@Param("memberId") Long memberId, @Param("scenicId") Long scenicId);
|
||||
|
||||
int deleteUserPhoto(Long memberId, Long scenicId, Long relationId);
|
||||
|
||||
int addUserPhoto(Long memberId, Long scenicId, String url);
|
||||
|
||||
MemberPrintResp getUserPhoto(Long memberId, Long scenicId, Long id);
|
||||
|
||||
int setPhotoCropped(Long memberId, Long scenicId, Long id, String url);
|
||||
|
||||
int setPhotoQuantity(Long memberId, Long scenicId, Long id, Integer quantity);
|
||||
|
||||
List<MemberPrintResp> getUserPhotoByIds(List<Long> ids);
|
||||
|
||||
int setUserIsBuyItem(Long memberId, Long id, Long orderId);
|
||||
|
||||
void updateUserPhotoListToPrinter(Long memberId, Long scenicId, Integer printerId);
|
||||
|
||||
List<MemberPrintResp> listRelationByOrderId(Long orderId);
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package com.ycwl.basic.mapper;
|
||||
|
||||
import com.ycwl.basic.model.pc.scenicDeviceStats.entity.ScenicDeviceStatsEntity;
|
||||
import com.ycwl.basic.model.pc.scenicDeviceStats.resp.ScenicDeviceStatsResp;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 景区设备统计Mapper接口
|
||||
*/
|
||||
public interface ScenicDeviceStatsMapper {
|
||||
/**
|
||||
* 插入景区设备统计记录
|
||||
* @param stats 景区设备统计对象
|
||||
* @return 影响行数
|
||||
*/
|
||||
int insert(@Param("stats") ScenicDeviceStatsEntity stats);
|
||||
|
||||
List<ScenicDeviceStatsEntity> countDeviceStats(Date start, Date end);
|
||||
|
||||
List<ScenicDeviceStatsResp> countCachedStatsByScenicId(Long scenicId, Date start, Date end);
|
||||
List<ScenicDeviceStatsResp> countRealtimeStatsByScenicId(Long scenicId, Date start, Date end);
|
||||
}
|
@ -51,6 +51,7 @@ public interface SourceMapper {
|
||||
int addRelation(MemberSourceEntity source);
|
||||
|
||||
List<SourceRespVO> listUser(SourceReqQuery sourceReqQuery);
|
||||
Integer countUser(SourceReqQuery sourceReqQuery);
|
||||
SourceRespVO listUserOne(Long userId, Long sourceId);
|
||||
|
||||
int addRelations(List<MemberSourceEntity> list);
|
||||
@ -78,4 +79,6 @@ public interface SourceMapper {
|
||||
List<SourceWatermarkEntity> listSourceWatermark(List<Long> sourceIds, Long faceId, String watermarkType);
|
||||
|
||||
void addSourceWatermark(Long sourceId, Long faceId, String type, String url);
|
||||
|
||||
int deleteUselessSource();
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package com.ycwl.basic.mapper;
|
||||
|
||||
import com.ycwl.basic.model.mobile.statistic.req.CommonQueryReq;
|
||||
import com.ycwl.basic.model.mobile.statistic.req.StatisticsRecordAddReq;
|
||||
import com.ycwl.basic.model.mobile.statistic.resp.AppStatisticsFunnelVO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
@ -93,4 +94,7 @@ public interface StatisticsMapper {
|
||||
List<Long> getBrokerIdListForUser(Long memberId, Date startTime, Date endTime);
|
||||
|
||||
Long getUserRecentEnterType(Long memberId, Date endTime);
|
||||
|
||||
List<AppStatisticsFunnelVO> listStatByScenic(Long scenicId, Date startTime, Date endTime);
|
||||
int insertStat(Long scenicId, Date date, AppStatisticsFunnelVO data);
|
||||
}
|
||||
|
@ -54,5 +54,5 @@ public interface TaskMapper {
|
||||
|
||||
List<TaskEntity> listEntity(TaskReqQuery taskReqQuery);
|
||||
|
||||
List<TaskRespVO> selectNotRunningByScenicId(Long scenicOnly);
|
||||
List<TaskRespVO> selectNotRunningByScenicList(String scenicOnly);
|
||||
}
|
||||
|
@ -54,4 +54,6 @@ public interface VideoMapper {
|
||||
int deleteNotBuyRelations(Long scenicId, Date endDate);
|
||||
|
||||
int deleteNotBuyFaceRelations(Long userId, Long faceId);
|
||||
|
||||
int deleteUselessVideo();
|
||||
}
|
||||
|
@ -6,6 +6,7 @@ import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.ToString;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@ -18,6 +19,7 @@ import java.time.LocalDateTime;
|
||||
@ToString
|
||||
public class JwtInfo implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 5452605590172369563L;
|
||||
|
||||
/**
|
||||
|
@ -3,7 +3,9 @@ package com.ycwl.basic.model.mobile.goods;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
@ -21,14 +23,8 @@ public class GoodsDetailVO {
|
||||
private Long scenicId;
|
||||
@ApiModelProperty("景区名称")
|
||||
private String scenicName;
|
||||
@ApiModelProperty("经度")
|
||||
private BigDecimal longitude;
|
||||
@ApiModelProperty("纬度")
|
||||
private BigDecimal latitude;
|
||||
@ApiModelProperty("商品类型 1:成片视频 2:源素材")
|
||||
private Integer goodsType;
|
||||
@ApiModelProperty("源素材类型 1:视频 2:图片")
|
||||
private Integer sourceType;
|
||||
@ApiModelProperty("商品id goodsType=1时为videoId,goodsType=2时为sourceId")
|
||||
private Long goodsId;
|
||||
@ApiModelProperty("模版封面图片")
|
||||
@ -44,4 +40,8 @@ public class GoodsDetailVO {
|
||||
@ApiModelProperty("是否已购买 0否 1是")
|
||||
private Integer isBuy;
|
||||
private Integer isFree;
|
||||
private Integer parts;
|
||||
public Integer getSourceType() {
|
||||
return goodsType;
|
||||
}
|
||||
}
|
||||
|
@ -19,6 +19,12 @@ public class IsBuyBatchRespVO {
|
||||
private BigDecimal slashPrice;
|
||||
|
||||
public BigDecimal getPrice() {
|
||||
if (origPrice == null) {
|
||||
return BigDecimal.ZERO;
|
||||
}
|
||||
if (couponPrice == null) {
|
||||
return origPrice;
|
||||
}
|
||||
return origPrice.subtract(couponPrice);
|
||||
}
|
||||
public BigDecimal getDiscountPrice() {
|
||||
|
@ -18,6 +18,12 @@ public class IsBuyRespVO {
|
||||
private BigDecimal slashPrice;
|
||||
|
||||
public BigDecimal getPrice() {
|
||||
if (origPrice == null) {
|
||||
return BigDecimal.ZERO;
|
||||
}
|
||||
if (couponPrice == null) {
|
||||
return origPrice;
|
||||
}
|
||||
return origPrice.subtract(couponPrice);
|
||||
}
|
||||
public BigDecimal getDiscountPrice() {
|
||||
|
@ -4,6 +4,7 @@ import com.ycwl.basic.model.common.BaseQueryParameterReq;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
@ -12,6 +13,7 @@ import java.util.Date;
|
||||
* @Author:longbinbin
|
||||
* @Date:2024/11/29 16:33
|
||||
*/
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
@ApiModel(value = "移动端订单查询对象")
|
||||
public class OrderAppPageReq extends BaseQueryParameterReq {
|
||||
|
@ -70,7 +70,7 @@ public class ScenicAppVO {
|
||||
/**
|
||||
* 距离
|
||||
*/
|
||||
@ApiModelProperty("距离")
|
||||
@ApiModelProperty("距离米")
|
||||
private BigDecimal distance;
|
||||
|
||||
/**
|
||||
|
@ -18,6 +18,7 @@ public class CommonQueryReq {
|
||||
private Integer standard;
|
||||
@ApiModelProperty(value = "景区id")
|
||||
private Long scenicId;
|
||||
private boolean realtime;
|
||||
private Date startTime;
|
||||
private Date endTime;
|
||||
}
|
||||
|
@ -3,6 +3,8 @@ package com.ycwl.basic.model.mobile.statistic.resp;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
|
||||
/**
|
||||
* @Author:longbinbin
|
||||
@ -13,49 +15,118 @@ import lombok.Data;
|
||||
public class AppStatisticsFunnelVO {
|
||||
|
||||
@ApiModelProperty("镜头检测游客数")
|
||||
// private Integer cameraShotOfMemberNum;
|
||||
private String cameraShotOfMemberNum;
|
||||
@ApiModelProperty("镜头检测游客数_扫码访问人数_转化率")
|
||||
private String csom_scaom;
|
||||
private int cameraShotOfMemberNum; // cs1
|
||||
@ApiModelProperty("扫码访问人数")
|
||||
private Integer scanCodeVisitorOfMemberNum;
|
||||
@ApiModelProperty("扫码访问人数_上传头像人数_转化率")
|
||||
private String scaom_ufom;
|
||||
private int scanCodeVisitorOfMemberNum; // sv1
|
||||
@ApiModelProperty("上传头像(人脸)人数")
|
||||
private Integer uploadFaceOfMemberNum;
|
||||
@ApiModelProperty("上传头像人数_推送订阅人数_转化率")
|
||||
private String ufom_pom;
|
||||
private int uploadFaceOfMemberNum; // u1
|
||||
@ApiModelProperty("推送订阅人数")
|
||||
private Integer pushOfMemberNum;
|
||||
@ApiModelProperty("推送订阅人数_生成视频人数_转化率")
|
||||
private String pom_cvom;
|
||||
private int pushOfMemberNum; // m1
|
||||
@ApiModelProperty("生成视频人数")
|
||||
private Integer completeVideoOfMemberNum;
|
||||
@ApiModelProperty("生成视频人数_预览视频人数_转化率")
|
||||
private String cvom_pvom;
|
||||
private int completeVideoOfMemberNum; // gv1
|
||||
@ApiModelProperty("预览视频人数")
|
||||
private Integer previewVideoOfMemberNum;
|
||||
@ApiModelProperty("预览视频人数_点击购买人数_转化率")
|
||||
private String pvom_cpom;
|
||||
private int previewVideoOfMemberNum; // pv1
|
||||
@ApiModelProperty("点击购买人数")
|
||||
private Integer clickOnPayOfMemberNum;
|
||||
@ApiModelProperty("点击购买人数_支付订单人数_转化率")
|
||||
private String cpom_pom;
|
||||
private int clickOnPayOfMemberNum; // cp1
|
||||
@ApiModelProperty("支付订单人数")
|
||||
private Integer payOfMemberNum;
|
||||
private int payOfMemberNum; // p1
|
||||
|
||||
@ApiModelProperty("总访问人数")
|
||||
private Integer totalVisitorOfMemberNum;
|
||||
private int totalVisitorOfMemberNum; // v1
|
||||
@ApiModelProperty("生成视频条数")
|
||||
private Integer completeOfVideoNum;
|
||||
private int completeOfVideoNum; // gv2
|
||||
@ApiModelProperty("预览视频条数")
|
||||
private Integer previewOfVideoNum;
|
||||
private int previewOfVideoNum; // pv2
|
||||
@ApiModelProperty("支付订单数")
|
||||
private Integer payOfOrderNum;
|
||||
private int payOfOrderNum; // p2
|
||||
@ApiModelProperty("支付订单金额")
|
||||
private String payOfOrderAmount;
|
||||
private BigDecimal payOfOrderAmount; // o3
|
||||
@ApiModelProperty("退款订单数")
|
||||
private Integer refundOfOrderNum;
|
||||
private int refundOfOrderNum; // ro2
|
||||
@ApiModelProperty("退款订单金额")
|
||||
private String refundOfOrderAmount;
|
||||
private BigDecimal refundOfOrderAmount; // ro3
|
||||
|
||||
@ApiModelProperty("镜头检测游客数_扫码访问人数_转化率")
|
||||
public String getCsom_scaom() {
|
||||
return "-"; // TODO: REAL
|
||||
}
|
||||
|
||||
@ApiModelProperty("扫码访问人数_上传头像人数_转化率")
|
||||
public String getScaom_ufom() {
|
||||
if (uploadFaceOfMemberNum == 0 || scanCodeVisitorOfMemberNum == 0) {
|
||||
return "0.00";
|
||||
}
|
||||
return new BigDecimal(uploadFaceOfMemberNum)
|
||||
.multiply(new BigDecimal(100))
|
||||
.divide(new BigDecimal(scanCodeVisitorOfMemberNum), 2, RoundingMode.HALF_UP)
|
||||
.toString();
|
||||
}
|
||||
@ApiModelProperty("上传头像人数_推送订阅人数_转化率")
|
||||
public String getUfom_pom() {
|
||||
if (pushOfMemberNum == 0 || uploadFaceOfMemberNum == 0) {
|
||||
return "0.00";
|
||||
}
|
||||
return new BigDecimal(uploadFaceOfMemberNum)
|
||||
.multiply(new BigDecimal(100))
|
||||
.divide(new BigDecimal(pushOfMemberNum), 2, RoundingMode.HALF_UP)
|
||||
.toString();
|
||||
}
|
||||
@ApiModelProperty("推送订阅人数_生成视频人数_转化率")
|
||||
public String getPom_cvom() {
|
||||
if (completeVideoOfMemberNum == 0 || pushOfMemberNum == 0) {
|
||||
return "0.00";
|
||||
}
|
||||
return new BigDecimal(completeVideoOfMemberNum)
|
||||
.multiply(new BigDecimal(100))
|
||||
.divide(new BigDecimal(pushOfMemberNum), 2, RoundingMode.HALF_UP)
|
||||
.toString();
|
||||
}
|
||||
@ApiModelProperty("生成视频人数_预览视频人数_转化率")
|
||||
public String getCvom_pvom() {
|
||||
if (previewVideoOfMemberNum == 0 || completeVideoOfMemberNum == 0) {
|
||||
return "0.00";
|
||||
}
|
||||
return new BigDecimal(previewVideoOfMemberNum)
|
||||
.multiply(new BigDecimal(100))
|
||||
.divide(new BigDecimal(completeVideoOfMemberNum), 2, RoundingMode.HALF_UP)
|
||||
.toString();
|
||||
}
|
||||
@ApiModelProperty("预览视频人数_点击购买人数_转化率")
|
||||
public String getPvom_cpom() {
|
||||
if (clickOnPayOfMemberNum == 0 || previewVideoOfMemberNum == 0) {
|
||||
return "0.00";
|
||||
}
|
||||
return new BigDecimal(clickOnPayOfMemberNum)
|
||||
.multiply(new BigDecimal(100))
|
||||
.divide(new BigDecimal(previewVideoOfMemberNum), 2, RoundingMode.HALF_UP)
|
||||
.toString();
|
||||
}
|
||||
@ApiModelProperty("点击购买人数_支付订单人数_转化率")
|
||||
public String getCpom_pom() {
|
||||
if (payOfMemberNum == 0 || clickOnPayOfMemberNum == 0) {
|
||||
return "0.00";
|
||||
}
|
||||
return new BigDecimal(payOfMemberNum)
|
||||
.multiply(new BigDecimal(100))
|
||||
.divide(new BigDecimal(clickOnPayOfMemberNum), 2, RoundingMode.HALF_UP)
|
||||
.toString();
|
||||
}
|
||||
public BigDecimal payOfOrderAmount() {
|
||||
return payOfOrderAmount;
|
||||
}
|
||||
public String getPayOfOrderAmount() {
|
||||
if (payOfOrderAmount == null) {
|
||||
return "0.00";
|
||||
}
|
||||
return payOfOrderAmount.toString();
|
||||
}
|
||||
public BigDecimal refundOfOrderAmount() {
|
||||
return refundOfOrderAmount;
|
||||
}
|
||||
public String getRefundOfOrderAmount() {
|
||||
if (refundOfOrderAmount == null) {
|
||||
return "0.00";
|
||||
}
|
||||
return refundOfOrderAmount.toString();
|
||||
}
|
||||
}
|
||||
|
@ -4,7 +4,9 @@ import com.ycwl.basic.model.common.BaseQueryParameterReq;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
@ApiModel(value = "后台管理人员请求VO")
|
||||
public class AdminUserListReqVO extends BaseQueryParameterReq {
|
||||
|
@ -5,7 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@ApiModel(value = "")
|
||||
@ApiModel()
|
||||
public class UpdatePasswordReqVO {
|
||||
@ApiModelProperty(value = "id",hidden = true)
|
||||
private String id;
|
||||
|
@ -6,6 +6,7 @@ import com.ycwl.basic.model.common.BaseQueryParameterReq;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@ -13,6 +14,7 @@ import java.util.Date;
|
||||
* @Author:longbinbin
|
||||
* @Date:2024/12/12 10:00
|
||||
*/
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
@ApiModel("查询推客记录请求参数")
|
||||
public class BrokerRecordReqQuery extends BaseQueryParameterReq {
|
||||
|
@ -5,6 +5,7 @@ import com.ycwl.basic.model.common.BaseQueryParameterReq;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@ -12,6 +13,7 @@ import java.util.Date;
|
||||
* @Author:longbinbin
|
||||
* @Date:2024/11/29 14:29
|
||||
*/
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
@ApiModel("查询推客列表请求参数")
|
||||
public class BrokerReqQuery extends BaseQueryParameterReq {
|
||||
|
@ -61,4 +61,5 @@ public class DeviceConfigEntity {
|
||||
private Integer imageFree;
|
||||
private Integer videoFree;
|
||||
private Long pairDevice;
|
||||
private String videoCrop;
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ import com.ycwl.basic.model.common.BaseQueryParameterReq;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@ -12,6 +13,7 @@ import java.util.Date;
|
||||
* @Author:longbinbin
|
||||
* @Date:2024/11/29 14:53
|
||||
*/
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
@ApiModel("设备查询参数")
|
||||
public class DeviceReqQuery extends BaseQueryParameterReq {
|
||||
|
@ -8,6 +8,6 @@ public class DeviceSortRequest {
|
||||
@ApiModelProperty(value = "被操作模板的ID", required = true)
|
||||
private Long deviceId;
|
||||
|
||||
@ApiModelProperty(value = "排在其后的模板ID", required = false)
|
||||
@ApiModelProperty(value = "排在其后的模板ID")
|
||||
private Long afterDeviceId;
|
||||
}
|
@ -33,8 +33,6 @@ public class DeviceRespVO {
|
||||
private Integer online;
|
||||
private String coverUrl;
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||
private Date coverTime;
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||
private Date createAt;
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||
private Date updateAt;
|
||||
|
@ -5,6 +5,7 @@ import com.ycwl.basic.model.common.BaseQueryParameterReq;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
@ -13,6 +14,7 @@ import java.util.Date;
|
||||
* @Author:longbinbin
|
||||
* @Date:2024/11/29 15:16
|
||||
*/
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
@ApiModel("人脸查询参数")
|
||||
public class FaceReqQuery extends BaseQueryParameterReq {
|
||||
|
@ -7,6 +7,7 @@ import com.ycwl.basic.model.common.BaseQueryParameterReq;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@ -14,6 +15,7 @@ import java.util.Date;
|
||||
* @Author:longbinbin
|
||||
* @Date:2024/11/29 15:40
|
||||
*/
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
@ApiModel("人脸样本查询参数")
|
||||
public class FaceSampleReqQuery extends BaseQueryParameterReq {
|
||||
@ -27,31 +29,6 @@ public class FaceSampleReqQuery extends BaseQueryParameterReq {
|
||||
*/
|
||||
@ApiModelProperty("来源设备")
|
||||
private Long deviceId;
|
||||
/**
|
||||
* 来源ID
|
||||
*/
|
||||
@ApiModelProperty("来源ID")
|
||||
private Long sourceId;
|
||||
/**
|
||||
* 人脸照片
|
||||
*/
|
||||
@ApiModelProperty("人脸照片")
|
||||
private String faceUrl;
|
||||
/**
|
||||
* 与样本匹配的ID,逗号隔开
|
||||
*/
|
||||
@ApiModelProperty("与样本匹配的ID,逗号隔开")
|
||||
private String matchSampleIds;
|
||||
/**
|
||||
* 匹配率
|
||||
*/
|
||||
@ApiModelProperty("匹配率")
|
||||
private String firstMatchRate;
|
||||
/**
|
||||
* 匹配的结果,JSON字符串
|
||||
*/
|
||||
@ApiModelProperty("匹配的结果,JSON字符串")
|
||||
private String matchResult;
|
||||
/**
|
||||
* 是否匹配,0未匹配,1已匹配
|
||||
*/
|
||||
@ -61,4 +38,6 @@ public class FaceSampleReqQuery extends BaseQueryParameterReq {
|
||||
private Date startTime;
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||
private Date endTime;
|
||||
|
||||
private String matchSampleIds;
|
||||
}
|
||||
|
@ -6,6 +6,7 @@ import com.ycwl.basic.model.common.BaseQueryParameterReq;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@ -13,6 +14,7 @@ import java.util.Date;
|
||||
* @Author:longbinbin
|
||||
* @Date:2024/11/29 15:59
|
||||
*/
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
@ApiModel("查询用户列表请求参数")
|
||||
public class MemberReqQuery extends BaseQueryParameterReq {
|
||||
|
@ -7,6 +7,7 @@ import com.ycwl.basic.model.common.BaseQueryParameterReq;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
@ -15,6 +16,7 @@ import java.util.Date;
|
||||
* @Author:longbinbin
|
||||
* @Date:2024/11/29 16:33
|
||||
*/
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
@ApiModel(value = "订单查询对象")
|
||||
public class OrderReqQuery extends BaseQueryParameterReq {
|
||||
|
@ -1,6 +1,7 @@
|
||||
package com.ycwl.basic.model.pc.order.resp;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.ycwl.basic.model.mobile.goods.GoodsDetailVO;
|
||||
import com.ycwl.basic.model.pc.order.entity.OrderItemEntity;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
@ -111,6 +112,7 @@ public class OrderRespVO {
|
||||
private List<OrderItemVO> orderItemList;
|
||||
private Long scenicId;
|
||||
private String scenicName;
|
||||
private List<GoodsDetailVO> goodsList;
|
||||
|
||||
public BigDecimal getDiscountPrice() {
|
||||
if (slashPrice == null) {
|
||||
|
@ -6,12 +6,14 @@ import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
@Data
|
||||
@TableName("permission")
|
||||
public class PermissionEntity implements Serializable {
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@TableId(value = "id", type = IdType.AUTO)
|
||||
|
@ -33,6 +33,7 @@ public class PriceConfigEntity {
|
||||
* 划线价格
|
||||
*/
|
||||
private BigDecimal slashPrice;
|
||||
private Integer status;
|
||||
private Date createTime;
|
||||
private Date updateTime;
|
||||
}
|
@ -30,5 +30,6 @@ public class PriceConfigRespVO {
|
||||
* 划线价格
|
||||
*/
|
||||
private BigDecimal slashPrice;
|
||||
private Integer status;
|
||||
private Date createTime;
|
||||
}
|
||||
|
@ -0,0 +1,25 @@
|
||||
package com.ycwl.basic.model.pc.printer.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@Data
|
||||
@TableName("member_print")
|
||||
public class MemberPrintEntity {
|
||||
@TableId(type = IdType.AUTO)
|
||||
private Integer id;
|
||||
private Long scenicId;
|
||||
private Long memberId;
|
||||
private String origUrl;
|
||||
private String cropUrl;
|
||||
private String printUrl;
|
||||
private Integer printerId;
|
||||
private Long orderId;
|
||||
private Integer status;
|
||||
private Date createTime;
|
||||
private Date updateTime;
|
||||
}
|
@ -3,8 +3,13 @@ package com.ycwl.basic.model.pc.printer.entity;
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@Data
|
||||
@TableName("printer")
|
||||
public class PrinterEntity {
|
||||
@TableId(type = IdType.AUTO)
|
||||
@ -17,24 +22,6 @@ public class PrinterEntity {
|
||||
private Integer status;
|
||||
private Date createTime;
|
||||
private Date updateTime;
|
||||
|
||||
// Getters and Setters
|
||||
public Integer getId() { return id; }
|
||||
public void setId(Integer id) { this.id = id; }
|
||||
public String getAccessKey() { return accessKey; }
|
||||
public void setAccessKey(String accessKey) { this.accessKey = accessKey; }
|
||||
public String getName() { return name; }
|
||||
public void setName(String name) { this.name = name; }
|
||||
public Long getScenicId() { return scenicId; }
|
||||
public void setScenicId(Long scenicId) { this.scenicId = scenicId; }
|
||||
public String getPrinters() { return printers; }
|
||||
public void setPrinters(String printers) { this.printers = printers; }
|
||||
public String getUsePrinter() { return usePrinter; }
|
||||
public void setUsePrinter(String usePrinter) { this.usePrinter = usePrinter; }
|
||||
public Integer getStatus() { return status; }
|
||||
public void setStatus(Integer status) { this.status = status; }
|
||||
public Date getCreateTime() { return createTime; }
|
||||
public void setCreateTime(Date createTime) { this.createTime = createTime; }
|
||||
public Date getUpdateTime() { return updateTime; }
|
||||
public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; }
|
||||
private Integer preferW;
|
||||
private Integer preferH;
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
package com.ycwl.basic.model.pc.printer.resp;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@Data
|
||||
public class MemberPrintResp {
|
||||
private Integer id;
|
||||
private Long scenicId;
|
||||
private String scenicName;
|
||||
private Long memberId;
|
||||
private String origUrl;
|
||||
private String cropUrl;
|
||||
private Integer quantity;
|
||||
private Integer printerId;
|
||||
private Long orderId;
|
||||
private Integer status;
|
||||
private Date createTime;
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
package com.ycwl.basic.model.pc.printer.resp;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@Data
|
||||
public class PrinterResp {
|
||||
private Integer id;
|
||||
private String accessKey;
|
||||
private String name;
|
||||
private Long scenicId;
|
||||
private String scenicName;
|
||||
private Integer status;
|
||||
private Date createTime;
|
||||
private Date updateTime;
|
||||
private Integer preferW;
|
||||
private Integer preferH;
|
||||
}
|
@ -2,6 +2,7 @@ package com.ycwl.basic.model.pc.renderWorker.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.ycwl.basic.storage.enums.StorageType;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
@ -60,7 +61,7 @@ public class RenderWorkerEntity {
|
||||
/**
|
||||
* 是否仅用于指定景区,空或0不适用,否则为景区ID
|
||||
*/
|
||||
private Long scenicOnly;
|
||||
private String scenicOnly;
|
||||
/**
|
||||
* 是否仅用于测试,0不是,1是
|
||||
*/
|
||||
@ -77,4 +78,12 @@ public class RenderWorkerEntity {
|
||||
private Date updateAt;
|
||||
|
||||
|
||||
/**
|
||||
* 存储类型
|
||||
*/
|
||||
private StorageType storeType;
|
||||
/**
|
||||
* 存储配置
|
||||
*/
|
||||
private String storeConfigJson;
|
||||
}
|
||||
|
@ -6,6 +6,7 @@ import com.ycwl.basic.model.common.BaseQueryParameterReq;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
@ -15,6 +16,7 @@ import java.util.Date;
|
||||
* @Date:2024/11/29 17:24
|
||||
* 渲染机管理表
|
||||
*/
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
@ApiModel("渲染机列表查询参数")
|
||||
public class RenderWorkerReqQuery extends BaseQueryParameterReq {
|
||||
|
@ -4,7 +4,9 @@ import com.ycwl.basic.model.common.BaseQueryParameterReq;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
@ApiModel(value = "角色请求列表VO")
|
||||
public class RoleListReqVO extends BaseQueryParameterReq {
|
||||
|
@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.ycwl.basic.facebody.enums.FaceBodyAdapterType;
|
||||
import com.ycwl.basic.pay.enums.PayAdapterType;
|
||||
import com.ycwl.basic.storage.enums.StorageType;
|
||||
import lombok.Data;
|
||||
|
||||
@ -71,6 +72,10 @@ public class ScenicConfigEntity {
|
||||
private Float faceScoreThreshold;
|
||||
private StorageType storeType;
|
||||
private String storeConfigJson;
|
||||
private StorageType tmpStoreType;
|
||||
private String tmpStoreConfigJson;
|
||||
private StorageType localStoreType;
|
||||
private String localStoreConfigJson;
|
||||
private BigDecimal brokerDirectRate;
|
||||
private Integer faceDetectHelperThreshold;
|
||||
|
||||
@ -80,4 +85,12 @@ public class ScenicConfigEntity {
|
||||
|
||||
private FaceBodyAdapterType faceType;
|
||||
private String faceConfigJson;
|
||||
|
||||
private PayAdapterType payType;
|
||||
private String payConfigJson;
|
||||
|
||||
private String imageSourcePackHint;
|
||||
private String videoSourcePackHint;
|
||||
|
||||
private String extraNotificationTime;
|
||||
}
|
||||
|
@ -6,6 +6,7 @@ import com.ycwl.basic.model.common.BaseQueryParameterReq;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
@ -15,6 +16,7 @@ import java.util.Date;
|
||||
* @Date:2024/12/02 10:24
|
||||
* 景区管理表
|
||||
*/
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
@ApiModel("景区列表查询参数")
|
||||
public class ScenicReqQuery extends BaseQueryParameterReq {
|
||||
|
@ -0,0 +1,48 @@
|
||||
package com.ycwl.basic.model.pc.scenic.resp;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.ycwl.basic.facebody.enums.FaceBodyAdapterType;
|
||||
import com.ycwl.basic.pay.enums.PayAdapterType;
|
||||
import com.ycwl.basic.storage.enums.StorageType;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @Author:longbinbin
|
||||
* @Date:2024/12/2 10:53
|
||||
* 景区配置
|
||||
*/
|
||||
@Data
|
||||
public class ScenicConfigResp {
|
||||
|
||||
/**
|
||||
* 预约流程,1-预约,2-在线,3-全部
|
||||
*/
|
||||
private Integer bookRoutine;
|
||||
private Integer forceFinishTime;
|
||||
private Integer tourTime;
|
||||
/**
|
||||
* 样本保存时间
|
||||
*/
|
||||
private Integer sampleStoreDay;
|
||||
private Integer faceStoreDay;
|
||||
/**
|
||||
* 视频保存时间
|
||||
*/
|
||||
private Integer videoStoreDay;
|
||||
private Integer allFree;
|
||||
private Integer disableSourceVideo;
|
||||
private Integer disableSourceImage;
|
||||
private Integer antiScreenRecordType;
|
||||
private Integer videoSourceStoreDay;
|
||||
private Integer imageSourceStoreDay;
|
||||
private Integer userSourceExpireDay;
|
||||
private BigDecimal brokerDirectRate;
|
||||
|
||||
private String imageSourcePackHint = "";
|
||||
private String videoSourcePackHint = "";
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package com.ycwl.basic.model.pc.scenicDeviceStats.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 景区设备统计实体类
|
||||
*/
|
||||
@Data
|
||||
public class ScenicDeviceStatsEntity {
|
||||
private Long scenicId;
|
||||
private Long deviceId;
|
||||
private Date date;
|
||||
private Integer count;
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user