Compare commits

...

108 Commits

Author SHA1 Message Date
b0adf414d0 Jenkinsfile 2025-06-30 18:08:36 +08:00
529b52f19c 出现问题清除缓存 2025-06-30 15:26:27 +08:00
7a21fb01d0 添加筛选条件 2025-06-30 11:10:43 +08:00
f40837cd05 menu 2025-06-28 14:41:13 +08:00
66334b8963 1 2025-06-28 13:47:35 +08:00
206696deb8 支持用户切换景区账号,单账号多景区权限 2025-06-28 13:44:44 +08:00
e8488d081f 仅在正式服上运行 2025-06-20 16:50:55 +08:00
245387f280 后台景区端趋势图 2025-06-20 16:47:23 +08:00
6d8261ff25 自动任务稍微等一等 2025-06-17 18:04:43 +08:00
7d6c87cc74 VirtualThread 2025-06-17 17:39:53 +08:00
5f8c4fd6e6 订单查询 2025-06-17 17:09:03 +08:00
53a09c1cab 修复bug 2025-06-17 16:05:24 +08:00
b0c8643e92 调整一下切片逻辑 2025-06-17 16:05:24 +08:00
fae62ab7c2 各种sql、缓存优化 2025-06-17 16:05:23 +08:00
5895d9c56f OTEL 2025-06-17 16:05:23 +08:00
207fcb6414 测试 2025-06-13 16:55:33 +08:00
c2ce6f91ed 日志调整 2025-06-13 16:55:11 +08:00
da3de2cc89 缓存时间调整 2025-06-13 15:36:29 +08:00
d245d09837 支持跳过景区文件删除,跳过重复adapter 2025-06-13 15:36:29 +08:00
4d8236afa1 通过identity定义是否相同 2025-06-13 15:35:11 +08:00
04e2ade669 添加锁避免高并发冲突 2025-06-13 15:35:11 +08:00
cd4678120d 修复删除逻辑 2025-06-13 15:35:11 +08:00
cf9802f9ec 添加后台订单筛选 2025-06-10 16:46:18 +08:00
a84b38dab5 推客统计 2025-06-10 16:46:18 +08:00
e32f231a8f 设备支持自定义标定区域 2025-06-10 16:46:18 +08:00
f9fcb06355 根据经纬度查询景区,并添加查询所有景区的功能 2025-06-10 16:46:18 +08:00
2ae0b3c4b3 参数错误打印错误请求地址方便排查 2025-06-05 14:24:47 +08:00
3bd8face68 缓存统计信息 2025-06-04 13:46:10 +08:00
1841e43b85 1 2025-06-03 15:02:45 +08:00
a9655814ae 测试 2025-06-03 09:51:04 +08:00
c1b4bc8952 congmingPay:添加device参数 2025-06-03 09:50:43 +08:00
4bacdbe39a 返回null 2025-06-02 09:46:01 +08:00
4273cda7cd 调整 2025-06-02 09:46:01 +08:00
ceba1e1b01 没有vlog也切片 2025-06-02 09:46:01 +08:00
34dbc7d036 聪明付 2025-06-02 09:46:01 +08:00
89e112e13a 返回null 2025-06-02 09:42:31 +08:00
26a9be80f6 不要删除人脸样本还有的素材 2025-06-02 09:42:15 +08:00
a4a6e9b5af 使用urI 2025-05-30 17:25:28 +08:00
0d5aabe317 1 2025-05-30 17:25:28 +08:00
5d2cf4fd31 test~ 2025-05-30 17:25:28 +08:00
80f4491836 Java21 2025-05-30 17:25:28 +08:00
115edc19fa Deprecated 2025-05-30 09:37:13 +08:00
bfd37fc764 逻辑修正 2025-05-30 09:35:24 +08:00
ef0ba3ddb4 sb aws 2025-05-29 14:35:47 +08:00
88cce9357d 删除无用代码 2025-05-29 14:33:35 +08:00
c50cd84af0 jvm21! 2025-05-29 14:26:42 +08:00
0c40cdad4e 1 2025-05-29 09:55:18 +08:00
a41b87713f 清理删除逻辑优化 2025-05-29 01:03:57 +08:00
06a07514cc 对景区摄像头进行统计 2025-05-27 16:23:47 +08:00
0292b754fe 统计 2025-05-26 17:29:13 +08:00
460b4ea42a broker 2025-05-26 15:46:42 +08:00
7fd62e9aba 微信获取手机号 2025-05-25 16:31:13 +08:00
3b3c768bbe 打印 2025-05-25 16:31:04 +08:00
1e993c6fd4 避免返回videoId未null 2025-05-25 13:56:47 +08:00
937c2b33d3 照片打印 2025-05-22 14:05:40 +08:00
9b00b34a68 不要删除已经购买了的人脸 2025-05-21 17:01:56 +08:00
c01ff160c3 水印,使用设备名称 2025-05-21 16:47:25 +08:00
aaddbab2ab 照片打印,基础 2025-05-21 15:35:44 +08:00
570267fd83 调整 2025-05-19 15:45:05 +08:00
44e0f4933b 打印 2025-05-19 15:03:36 +08:00
ab2be3d56b 兼容 2025-05-16 15:31:25 +08:00
077698cdaa 文件夹名称 2025-05-12 18:39:44 +08:00
b141b39e50 删除无用内容 2025-05-12 18:38:20 +08:00
c366495805 调整下清理时机 2025-05-12 18:17:44 +08:00
870e79cde5 统计方法 2025-05-10 17:32:42 +08:00
2bf8bb4df5 更新,sourceId传入无需传url 2025-05-09 10:30:55 +08:00
164e76495e 删除无用字段 2025-05-08 17:32:47 +08:00
d9360acb5f bug 2025-05-08 17:32:47 +08:00
2e92cf5c91 人脸真实删除、清理逻辑优化 2025-05-08 17:32:47 +08:00
ef978529ac 1 2025-05-04 10:51:27 +08:00
6197f13e8e 统计不统计 2025-04-30 18:29:24 +08:00
00f38c949c 模板支持相同机位 2025-04-30 18:29:14 +08:00
c45dffa0a0 统计修一修 2025-04-30 18:28:36 +08:00
f8f49891a5 删除无用内容 2025-04-30 18:28:24 +08:00
7771f85618 2 2025-04-27 14:17:20 +08:00
7583c9e22e 统计调整 2025-04-27 04:36:12 +08:00
bb26fa43bf 当价格配置未命中缓存时,不返回空 2025-04-27 04:36:12 +08:00
46a8b254b5 添加支付异常提示 2025-04-27 04:36:12 +08:00
2e41f72e0e 限制主动下载的速度 2025-04-27 04:36:12 +08:00
e9d80cecc7 支付,支持微信新的公钥支付模式 2025-04-27 04:36:12 +08:00
5a4f6a5af3 几个高频/轮询接口迁走了 2025-04-27 04:36:12 +08:00
8ef2ef4b15 避免空指针、水印并发加,让前端更好展示大锁页面 2025-04-22 10:28:45 +08:00
3863c0d963 渲染机支持配置存储地址 2025-04-20 15:06:02 +08:00
b36da6ff35 删除无用字段,后台添加更多商品信息 2025-04-17 17:59:13 +08:00
da20a44049 景区设置添加一个,返回status状态 2025-04-17 10:49:31 +08:00
877f37b6f9 系统支付对接、避免返回过多数据 2025-04-17 10:49:31 +08:00
f6f847e41c 支付 2025-04-17 10:49:11 +08:00
8ac386242d 多给一天 2025-04-15 03:17:32 +08:00
3f11aadd75 1 2025-04-15 03:17:20 +08:00
d620bde5fa 补救措施没结果时,不使用补救措施结果 2025-04-15 03:17:14 +08:00
5a7c39429e bug 2025-04-15 03:13:13 +08:00
7234e08616 定时任务时支持补救措施 2025-04-12 19:08:23 +08:00
45409ba1ab 渲染机支持仅渲染几个景区的工作 2025-04-12 14:35:26 +08:00
b5b9064f30 区分临时和本地存储 2025-04-12 14:34:59 +08:00
d0d4e37526 修改 2025-04-11 16:58:52 +08:00
73d393b436 entityId格式 2025-04-09 10:05:39 +08:00
2835346447 多个wxMpConfig兼容 2025-04-08 16:24:33 +08:00
75eb3732fc 价格配置加个状态 2025-04-08 16:24:33 +08:00
692df3a1a2 避免null 2025-04-08 14:40:57 +08:00
fe0397af8e 统计:基础 2025-04-08 14:40:57 +08:00
f17e2364b6 entityId重入一致性 2025-04-08 14:40:57 +08:00
59978b6be5 修整代码 2025-04-08 14:40:57 +08:00
20d78cb487 不存request了 2025-04-08 14:32:45 +08:00
4e9d6807d6 再改改 2025-04-08 01:28:12 +08:00
8af8bd6bcf pc后台统计 2025-04-08 01:28:04 +08:00
248c06a30c 速率限制 2025-04-08 01:27:40 +08:00
dabdde33a6 空! 2025-04-07 16:36:45 +08:00
c9a4116ed6 捯饬捯饬代码 2025-04-07 16:36:45 +08:00
281 changed files with 5858 additions and 4246 deletions
Jenkinsfilepom.xml
src
main
java
com
ycwl
basic
annotation
aspectj
biz
config
constant
controller
device
enums
exception
facebody
filter
image
interceptor
mapper
model
notify
pay
printer
profitsharing
repository
service
stats
storage
task
utils
xss
resources
test

20
Jenkinsfile vendored Normal file

@ -0,0 +1,20 @@
pipeline {
agent any
tools {
jdk 'openjdk21'
maven 'Default'
}
stages {
stage('Build') {
steps {
sh 'mvn clean package -DskipTests=true'
}
}
}
post {
always {
archiveArtifacts artifacts: 'target/*.jar', allowEmptyArchive: true, onlyIfSuccessful: true
publishGiteaAssets assets: 'target/*.jar', followSymlinks: false, onlyIfSuccessful: true
}
}
}

45
pom.xml

@ -5,38 +5,54 @@
<parent> <parent>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version> <version>3.3.5</version>
<relativePath/> <!-- lookup parent from repository --> <relativePath/> <!-- lookup parent from repository -->
</parent> </parent>
<groupId>com.ycwl</groupId> <groupId>com.ycwl</groupId>
<artifactId>basic</artifactId> <artifactId>basic21</artifactId>
<version>0.0.1-SNAPSHOT</version> <version>0.0.1-SNAPSHOT</version>
<name>liuying</name> <name>liuying</name>
<description>流影</description> <description>流影</description>
<properties> <properties>
<java.version>8</java.version> <java.version>21</java.version>
<maven.compiler.source>8</maven.compiler.source> <maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target> <maven.compiler.target>21</maven.compiler.target>
<mybatisplus.boot.starter.version>3.4.0</mybatisplus.boot.starter.version>
<hutool-all.version>5.8.24</hutool-all.version> <hutool-all.version>5.8.24</hutool-all.version>
<mysql-connector.version>8.0.33</mysql-connector.version> <mysql-connector.version>8.0.33</mysql-connector.version>
<fastjson.version>1.2.83</fastjson.version> <fastjson.version>1.2.83</fastjson.version>
<knife4j-spring-boot-starter.version>2.0.7</knife4j-spring-boot-starter.version> <knife4j-spring-boot-starter.version>2.0.7</knife4j-spring-boot-starter.version>
<pagehelper.version>5.3.1</pagehelper.version> <pagehelper.version>5.3.1</pagehelper.version>
<tomcat.version>9.0.102</tomcat.version>
<!--跳过单元测试--> <!--跳过单元测试-->
<skipTests>true</skipTests> <skipTests>true</skipTests>
</properties> </properties>
<!-- OpenTelemetry -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.opentelemetry.instrumentation</groupId>
<artifactId>opentelemetry-instrumentation-bom</artifactId>
<version>2.16.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies> <dependencies>
<!-- 添加 jakarta.servlet-api 依赖 -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>
<!-- 微信支付 --> <!-- 微信支付 -->
<dependency> <dependency>
<groupId>com.github.wechatpay-apiv3</groupId> <groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-java</artifactId> <artifactId>wechatpay-java</artifactId>
<version>0.2.12</version> <version>0.2.14</version>
</dependency> </dependency>
<!-- 引入aop相关 --> <!-- 引入aop相关 -->
<dependency> <dependency>
@ -84,8 +100,8 @@
<!--mybatis plus和springboot整合--> <!--mybatis plus和springboot整合-->
<dependency> <dependency>
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId> <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>${mybatisplus.boot.starter.version}</version> <version>3.5.5</version>
</dependency> </dependency>
<!-- 引入lombok工具 --> <!-- 引入lombok工具 -->
@ -179,7 +195,7 @@
<dependency> <dependency>
<groupId>com.aliyun</groupId> <groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId> <artifactId>aliyun-java-sdk-core</artifactId>
<version>4.6.1</version> <version>4.6.4</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.aliyun</groupId> <groupId>com.aliyun</groupId>
@ -193,6 +209,11 @@
<artifactId>java-sdk</artifactId> <artifactId>java-sdk</artifactId>
<version>4.16.19</version> <version>4.16.19</version>
</dependency> </dependency>
<dependency>
<groupId>io.opentelemetry.instrumentation</groupId>
<artifactId>opentelemetry-spring-boot-starter</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>

@ -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.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.HashMap; import java.util.HashMap;

@ -53,7 +53,11 @@ public class BrokerBiz {
expireDay = scenicConfig.getSampleStoreDay(); expireDay = scenicConfig.getSampleStoreDay();
} }
List<Long> brokerIdList = statisticsMapper.getBrokerIdListForUser(order.getMemberId(), DateUtil.offsetDay(DateUtil.beginOfDay(order.getCreateAt()), -expireDay), order.getCreateAt()); List<Long> brokerIdList = statisticsMapper.getBrokerIdListForUser(order.getMemberId(), DateUtil.offsetDay(DateUtil.beginOfDay(order.getCreateAt()), -expireDay), order.getCreateAt());
Long directBrokerId = brokerIdList.get(0); if (brokerIdList == null || brokerIdList.isEmpty()) {
log.info("用户与推客无关,订单ID:{}", orderId);
return;
}
Long directBrokerId = brokerIdList.getFirst();
List<BrokerRespVO> brokerInfoList = brokerIdList.stream().map(brokerId -> { List<BrokerRespVO> brokerInfoList = brokerIdList.stream().map(brokerId -> {
BrokerRespVO broker = brokerMapper.getById(brokerId); BrokerRespVO broker = brokerMapper.getById(brokerId);
if (broker == null) { if (broker == null) {
@ -77,7 +81,7 @@ public class BrokerBiz {
if (brokerInfoList.size() == 1) { if (brokerInfoList.size() == 1) {
// 直接算佣金 // 直接算佣金
String reason = "单人提成:"; String reason = "单人提成:";
BrokerRespVO broker = brokerInfoList.get(0); BrokerRespVO broker = brokerInfoList.getFirst();
BrokerRecord brokerRecord = new BrokerRecord(); BrokerRecord brokerRecord = new BrokerRecord();
brokerRecord.setBrokerId(broker.getId()); brokerRecord.setBrokerId(broker.getId());
brokerRecord.setOrderId(orderId); brokerRecord.setOrderId(orderId);
@ -95,7 +99,7 @@ public class BrokerBiz {
brokerRecord.setReason(reason); brokerRecord.setReason(reason);
brokerRecordList.add(brokerRecord); brokerRecordList.add(brokerRecord);
} else { } else {
BrokerRespVO broker = brokerInfoList.get(0); BrokerRespVO broker = brokerInfoList.getFirst();
BigDecimal realRate = broker.getBrokerRate(); BigDecimal realRate = broker.getBrokerRate();
BigDecimal brokerPrice = order.getPayPrice().multiply(realRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN); BigDecimal brokerPrice = order.getPayPrice().multiply(realRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN);
// todo 需要计算实际提成比例 // todo 需要计算实际提成比例
@ -141,9 +145,7 @@ public class BrokerBiz {
brokerRecordList.add(brokerRecord); brokerRecordList.add(brokerRecord);
} }
revokeOrder(orderId); revokeOrder(orderId);
brokerRecordList.forEach(brokerRecord -> { brokerRecordList.forEach(brokerRecordMapper::add);
brokerRecordMapper.add(brokerRecord);
});
} }
public void revokeOrder(Long orderId) { 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.TemplateRepository;
import com.ycwl.basic.repository.VideoRepository; import com.ycwl.basic.repository.VideoRepository;
import com.ycwl.basic.repository.VideoTaskRepository; import com.ycwl.basic.repository.VideoTaskRepository;
import com.ycwl.basic.service.printer.PrinterService;
import com.ycwl.basic.utils.ApiResponse; import com.ycwl.basic.utils.ApiResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -74,6 +76,9 @@ public class OrderBiz {
private BrokerBiz brokerBiz; private BrokerBiz brokerBiz;
@Autowired @Autowired
private CouponBiz couponBiz; private CouponBiz couponBiz;
@Autowired
@Lazy
private PrinterService printerService;
public PriceObj queryPrice(Long scenicId, int goodsType, Long goodsId) { public PriceObj queryPrice(Long scenicId, int goodsType, Long goodsId) {
PriceObj priceObj = new PriceObj(); PriceObj priceObj = new PriceObj();
@ -161,15 +166,11 @@ public class OrderBiz {
} }
// 免费送逻辑,之前已经赠送了的 // 免费送逻辑,之前已经赠送了的
if (!isBuy) { if (!isBuy) {
switch (goodsType) { isBuy = switch (goodsType) {
case 0: case 0 -> videoRepository.getUserIsBuy(userId, goodsId);
isBuy = videoRepository.getUserIsBuy(userId, goodsId); case 1, 2 -> sourceRepository.getUserIsBuy(userId, goodsType, goodsId);
break; default -> false;
case 1: };
case 2:
isBuy = sourceRepository.getUserIsBuy(userId, goodsType, goodsId);
break;
}
} else { } else {
OrderEntity orderEntity = orderRepository.getUserBuyItem(userId, goodsType, goodsId); OrderEntity orderEntity = orderRepository.getUserBuyItem(userId, goodsType, goodsId);
if (orderEntity != null) { if (orderEntity != null) {
@ -237,6 +238,8 @@ public class OrderBiz {
case 1: // 视频原素材 case 1: // 视频原素材
case 2: // 照片原素材 case 2: // 照片原素材
sourceRepository.setUserIsBuyItem(order.getMemberId(), item.getGoodsType(), item.getGoodsId(), order.getId()); sourceRepository.setUserIsBuyItem(order.getMemberId(), item.getGoodsType(), item.getGoodsId(), order.getId());
case 3:
printerService.setUserIsBuyItem(order.getMemberId(), item.getGoodsId(), order.getId());
} }
}); });
orderRepository.clearOrderCache(orderId); // 更新完了,清理下 orderRepository.clearOrderCache(orderId); // 更新完了,清理下
@ -250,7 +253,7 @@ public class OrderBiz {
//商品创建时间 //商品创建时间
Date goodsCreateTime = new Date(); Date goodsCreateTime = new Date();
if (!orderDetail.getOrderItemList().isEmpty()) { if (!orderDetail.getOrderItemList().isEmpty()) {
OrderItemVO orderItemVO = orderDetail.getOrderItemList().get(0); OrderItemVO orderItemVO = orderDetail.getOrderItemList().getFirst();
switch (orderItemVO.getGoodsType()) { switch (orderItemVO.getGoodsType()) {
case 0: case 0:
VideoEntity video = videoRepository.getVideo(orderItemVO.getGoodsId()); VideoEntity video = videoRepository.getVideo(orderItemVO.getGoodsId());

@ -112,7 +112,7 @@ public class TaskStatusBiz {
int faceCutStatus = getFaceCutStatus(faceId); int faceCutStatus = getFaceCutStatus(faceId);
if (faceCutStatus != 1) { if (faceCutStatus != 1) {
// 正在切片 // 正在切片
if (templateBiz.determineTemplateCanGenerate(templateList.get(0).getId(), faceId, false)) { if (templateBiz.determineTemplateCanGenerate(templateList.getFirst().getId(), faceId, false)) {
response.setStatus(2); response.setStatus(2);
} else { } else {
response.setStatus(0); response.setStatus(0);

@ -107,7 +107,7 @@ public class TemplateBiz {
List<SourceEntity> sourceEntities = sourceMapper.listVideoByScenicFaceRelation(face.getScenicId(), faceId); List<SourceEntity> sourceEntities = sourceMapper.listVideoByScenicFaceRelation(face.getScenicId(), faceId);
count = sourceEntities.stream() count = sourceEntities.stream()
.map(SourceEntity::getDeviceId) .map(SourceEntity::getDeviceId)
.filter(deviceId -> deviceId != null) // 添加对 null 的检查 .filter(Objects::nonNull) // 添加对 null 的检查
.distinct() .distinct()
.filter(deviceId -> placeholderList.contains(deviceId.toString())) .filter(deviceId -> placeholderList.contains(deviceId.toString()))
.count(); .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.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.module.SimpleModule;
import com.ycwl.basic.interceptor.AuthInterceptor; import com.ycwl.basic.interceptor.AuthInterceptor;
import com.ycwl.basic.xss.XssJacksonDeserializer; import com.ycwl.basic.stats.interceptor.StatsInterceptor;
import com.ycwl.basic.xss.XssJacksonSerializer;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
@ -29,13 +28,17 @@ public class WebMvcConfig implements WebMvcConfigurer {
@Autowired @Autowired
private AuthInterceptor authInterceptor; private AuthInterceptor authInterceptor;
@Autowired
private StatsInterceptor statsInterceptor;
@Override @Override
public void addInterceptors(InterceptorRegistry registry) { public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptor) registry.addInterceptor(authInterceptor)
// 拦截除指定接口外的所有请求,通过判断 注解 来决定是否需要做登录验证 // 拦截除指定接口外的所有请求,通过判断 注解 来决定是否需要做登录验证
.addPathPatterns("/**") .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 @Autowired
private StringHttpMessageConverter stringHttpMessageConverter; private StringHttpMessageConverter stringHttpMessageConverter;
@Autowired @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; package com.ycwl.basic.constant;
import com.ycwl.basic.utils.StringUtil;
import lombok.Data; import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.HashMap; import java.util.HashMap;
@ -10,29 +10,29 @@ import java.util.Map;
@Data @Data
public class BaseContextHandler { public class BaseContextHandler {
public static ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal(); public static ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal<>();
public BaseContextHandler() { public BaseContextHandler() {
} }
public static void set(String key, Object value) { public static void set(String key, Object value) {
Object map; Map<String, Object> map;
if ((map = (Map) threadLocal.get()) == null) { if ((map = threadLocal.get()) == null) {
map = new HashMap(); map = new HashMap<>();
threadLocal.set((Map<String, Object>) map); threadLocal.set(map);
} }
((Map) map).put(key, value); map.put(key, value);
} }
public static Object get(String key) { public static Object get(String key) {
Object map; Map<String, Object> map;
if ((map = (Map) threadLocal.get()) == null) { if ((map = threadLocal.get()) == null) {
map = new HashMap(); map = new HashMap<>();
threadLocal.set((Map<String, Object>) map); threadLocal.set(map);
} }
return ((Map) map).get(key); return (map).get(key);
} }
public static void setToken(String token) { public static void setToken(String token) {
@ -40,7 +40,13 @@ public class BaseContextHandler {
} }
public static String getToken() { 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() { public static String getAccount() {

@ -0,0 +1,13 @@
package com.ycwl.basic.constant;
public enum JwtRoleConstant {
MERCHANT("merchant"),
ADMIN("admin"),
APP_USER("app_user");
public final String type;
JwtRoleConstant(String type) {
this.type = type;
}
}

@ -5,4 +5,6 @@ public class StorageConstant {
public static final String VIDEO_PIECE_PATH = "source_video"; public static final String VIDEO_PIECE_PATH = "source_video";
public static final String PHOTO_PATH = "source_photo"; public static final String PHOTO_PATH = "source_photo";
public static final String PHOTO_WATERMARKED_PATH = "photo_w"; 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.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import java.util.Collections; import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.Enumeration; import java.util.Enumeration;
@ -55,8 +55,6 @@ public class LyCompatibleController {
@Autowired @Autowired
private FaceMapper faceMapper; private FaceMapper faceMapper;
@Autowired @Autowired
private AppScenicService appScenicService;
@Autowired
private VideoRepository videoRepository; private VideoRepository videoRepository;
@Autowired @Autowired
private VideoMapper videoMapper; private VideoMapper videoMapper;
@ -68,7 +66,7 @@ public class LyCompatibleController {
@PostMapping("sendPhoto") @PostMapping("sendPhoto")
@IgnoreToken @IgnoreToken
public R sendPhoto(@RequestParam(value = "file", required = false) MultipartFile file, HttpServletRequest request) { 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(); Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) { while (headerNames.hasMoreElements()) {
String key = (String) headerNames.nextElement(); String key = (String) headerNames.nextElement();
@ -125,7 +123,7 @@ public class LyCompatibleController {
@RequestMapping("getIsVideo") @RequestMapping("getIsVideo")
@IgnoreToken @IgnoreToken
public R getIsVideo(HttpServletRequest request) { public R getIsVideo(HttpServletRequest request) {
Map<String, String> headersMap = new HashMap<String, String>(); Map<String, String> headersMap = new HashMap<>();
Enumeration<String> headerNames = request.getHeaderNames(); Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) { while (headerNames.hasMoreElements()) {
String key = (String) headerNames.nextElement(); String key = (String) headerNames.nextElement();
@ -167,7 +165,7 @@ public class LyCompatibleController {
@RequestMapping("getNewVideo") @RequestMapping("getNewVideo")
@IgnoreToken @IgnoreToken
public R getNewVideo(HttpServletRequest request) { public R getNewVideo(HttpServletRequest request) {
Map<String, String> headersMap = new HashMap<String, String>(); Map<String, String> headersMap = new HashMap<>();
Enumeration<String> headerNames = request.getHeaderNames(); Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) { while (headerNames.hasMoreElements()) {
String key = (String) headerNames.nextElement(); String key = (String) headerNames.nextElement();
@ -193,7 +191,7 @@ public class LyCompatibleController {
return R.error("用户没有上传过照片!"); return R.error("用户没有上传过照片!");
} }
VideoTaskStatusVO taskStatusVO = goodsService.getTaskStatusByScenicId(member.getId(), member.getScenicId()); 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() Map<Integer, List<ContentPageVO>> collect = listApiResponse.stream()
.filter(contentPageVO -> contentPageVO.getLockType() < 0) .filter(contentPageVO -> contentPageVO.getLockType() < 0)
.collect(Collectors.groupingBy(ContentPageVO::getGoodsType)); .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)) List<Map<String, Object>> videoList = collect.get(0).stream().collect(Collectors.groupingBy(ContentPageVO::getTemplateId))
.values().stream().map(contentPageVOs -> { .values().stream().map(contentPageVOs -> {
ContentPageVO contentPageVO = contentPageVOs.get(0); ContentPageVO contentPageVO = contentPageVOs.getFirst();
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
VideoEntity videoRespVO = videoRepository.getVideo(contentPageVO.getContentId()); VideoEntity videoRespVO = videoRepository.getVideo(contentPageVO.getContentId());
map.put("id", videoRespVO.getId().toString()); map.put("id", videoRespVO.getId().toString());

@ -1,5 +1,6 @@
package com.ycwl.basic.controller.extern; package com.ycwl.basic.controller.extern;
import java.io.Serial;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -11,6 +12,7 @@ import java.util.Map;
* @date 2016年10月27日 下午9:59:27 * @date 2016年10月27日 下午9:59:27
*/ */
public class R extends HashMap<String, Object> { public class R extends HashMap<String, Object> {
@Serial
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
public R() { public R() {

@ -2,6 +2,7 @@ package com.ycwl.basic.controller.mobile;
import com.ycwl.basic.model.jwt.JwtInfo; import com.ycwl.basic.model.jwt.JwtInfo;
import com.ycwl.basic.model.mobile.face.FaceRecognizeResp; 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.model.pc.face.resp.FaceRespVO;
import com.ycwl.basic.service.pc.FaceService; import com.ycwl.basic.service.pc.FaceService;
import com.ycwl.basic.utils.ApiResponse; import com.ycwl.basic.utils.ApiResponse;
@ -38,7 +39,7 @@ AppFaceController {
*/ */
@ApiOperation("人脸照片上传") @ApiOperation("人脸照片上传")
@PostMapping("/faceUPload") @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 //获取用户id
JwtInfo worker = JwtTokenUtil.getWorker(); JwtInfo worker = JwtTokenUtil.getWorker();
Long userId = worker.getUserId(); Long userId = worker.getUserId();
@ -60,13 +61,21 @@ AppFaceController {
} }
@DeleteMapping("/{faceId}") @DeleteMapping("/{faceId}")
public ApiResponse deleteFace(@PathVariable("faceId") Long faceId) { public ApiResponse<String> deleteFace(@PathVariable("faceId") Long faceId) {
return faceService.deleteFace(faceId); return faceService.deleteFace(faceId);
} }
@PostMapping("/{faceId}/match") @PostMapping("/{faceId}/match")
public ApiResponse match(@PathVariable("faceId") Long faceId) { public ApiResponse<String> match(@PathVariable("faceId") Long faceId) {
faceService.matchFaceId(faceId); faceService.matchFaceId(faceId);
return ApiResponse.success(""); 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); 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") @PostMapping("/sourceGoodsList/preview")
public ApiResponse<List<GoodsUrlVO>> sourceGoodsListPreview(@RequestBody GoodsReqQuery query) { public ApiResponse<List<GoodsUrlVO>> sourceGoodsListPreview(@RequestBody GoodsReqQuery query) {
List<GoodsUrlVO> goodsUrlList = goodsService.sourceGoodsListPreview(query); List<GoodsUrlVO> goodsUrlList = goodsService.sourceGoodsListPreview(query);

@ -64,7 +64,7 @@ public class AppMemberController {
@ApiOperation("新增或修改景区服务通知状态") @ApiOperation("新增或修改景区服务通知状态")
@GetMapping("/updateScenicServiceNoticeStatus") @GetMapping("/updateScenicServiceNoticeStatus")
public ApiResponse updateScenicServiceNoticeStatus(Long scenicId) { public ApiResponse<String> updateScenicServiceNoticeStatus(Long scenicId) {
return memberService.updateScenicServiceNoticeStatus(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.constant.BaseContextHandler;
import com.ycwl.basic.mapper.FaceMapper; import com.ycwl.basic.mapper.FaceMapper;
import com.ycwl.basic.model.jwt.JwtInfo; 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.IsBuyBatchRespVO;
import com.ycwl.basic.model.mobile.order.IsBuyRespVO; import com.ycwl.basic.model.mobile.order.IsBuyRespVO;
import com.ycwl.basic.model.mobile.order.OrderAppPageReq; 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.face.resp.FaceRespVO;
import com.ycwl.basic.model.pc.order.req.CreateBatchOrderReqVO; 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.CreateOrderReqVO;
import com.ycwl.basic.model.pc.order.req.OrderAddReq;
import com.ycwl.basic.model.pc.order.resp.OrderAppRespVO; import com.ycwl.basic.model.pc.order.resp.OrderAppRespVO;
import com.ycwl.basic.model.wx.WxPayRespVO; import com.ycwl.basic.pay.entity.PayResponse;
import com.ycwl.basic.repository.OrderRepository;
import com.ycwl.basic.repository.PriceRepository;
import com.ycwl.basic.service.mobile.GoodsService;
import com.ycwl.basic.service.pc.OrderService; import com.ycwl.basic.service.pc.OrderService;
import com.ycwl.basic.utils.ApiResponse; import com.ycwl.basic.utils.ApiResponse;
import com.ycwl.basic.utils.JwtTokenUtil; 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.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.Map;
/** /**
* @Author:longbinbin * @Author:longbinbin
* @Date:2024/12/4 17:16 * @Date:2024/12/4 17:16
@ -62,15 +59,20 @@ public class AppOrderController {
@ApiOperation("用户端订单新增") @ApiOperation("用户端订单新增")
@PostMapping("/addOrder") @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(); JwtInfo worker = JwtTokenUtil.getWorker();
return orderService.createOrder(worker.getUserId(), orderAddReq); return orderService.createOrder(worker.getUserId(), orderAddReq);
} }
@ApiOperation("查询订单")
@GetMapping("/queryOrder")
public ApiResponse<PayResponse> queryOrder(@RequestParam("orderId") Long orderId) {
return ApiResponse.success(orderService.queryOrder(orderId));
}
@ApiOperation("用户端打包订单新增") @ApiOperation("用户端打包订单新增")
@PostMapping("/addBatchOrder") @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(); JwtInfo worker = JwtTokenUtil.getWorker();
return orderService.createBatchOrder(worker.getUserId(), batchOrderReqVO); return orderService.createBatchOrder(worker.getUserId(), batchOrderReqVO);
} }
@ -101,6 +103,9 @@ public class AppOrderController {
Long userId = Long.parseLong(BaseContextHandler.getUserId()); Long userId = Long.parseLong(BaseContextHandler.getUserId());
if (faceId == null) { if (faceId == null) {
FaceRespVO lastFaceByUserId = faceMapper.findLastFaceByUserId(BaseContextHandler.getUserId()); FaceRespVO lastFaceByUserId = faceMapper.findLastFaceByUserId(BaseContextHandler.getUserId());
if (lastFaceByUserId == null) {
return ApiResponse.fail("您还未上传人脸");
}
faceId = lastFaceByUserId.getId(); faceId = lastFaceByUserId.getId();
} }
IsBuyBatchRespVO buy = priceBiz.isBuy(userId, faceId, scenicId, type, goodsIds); 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.github.pagehelper.PageInfo;
import com.ycwl.basic.annotation.IgnoreToken; import com.ycwl.basic.annotation.IgnoreToken;
import com.ycwl.basic.constant.BaseContextHandler;
import com.ycwl.basic.model.jwt.JwtInfo; import com.ycwl.basic.model.jwt.JwtInfo;
import com.ycwl.basic.model.mobile.scenic.ScenicAppVO; import com.ycwl.basic.model.mobile.scenic.ScenicAppVO;
import com.ycwl.basic.model.mobile.scenic.ScenicDeviceCountVO; 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.mobile.scenic.content.ContentPageVO;
import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; 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.req.ScenicReqQuery;
import com.ycwl.basic.model.pc.scenic.resp.ScenicConfigResp;
import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO; import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO;
import com.ycwl.basic.repository.ScenicRepository; import com.ycwl.basic.repository.ScenicRepository;
import com.ycwl.basic.service.mobile.AppScenicService; 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.ApiResponse;
import com.ycwl.basic.utils.JwtTokenUtil; import com.ycwl.basic.utils.JwtTokenUtil;
import io.swagger.annotations.Api; 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.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
@ -27,20 +32,33 @@ import java.util.List;
* @Date:2024/12/5 10:22 * @Date:2024/12/5 10:22
*/ */
@Slf4j @Slf4j
@Deprecated
@RestController @RestController
@RequestMapping("/api/mobile/scenic/v1") @RequestMapping("/api/mobile/scenic/v1")
@Api(tags = "景区相关接口") @Api(tags = "景区相关接口")
public class AppScenicController { public class AppScenicController {
@Autowired
private FaceService faceService;
@Autowired @Autowired
private AppScenicService appScenicService; private AppScenicService appScenicService;
@Autowired @Autowired
private ScenicRepository scenicRepository; private ScenicRepository scenicRepository;
private static final List<String> ENABLED_USER_IDs = new ArrayList<>(){{
add("3932535453961555968");
add("3936121342868459520");
add("3936940597855784960");
}};
@ApiOperation("分页查询景区列表") @ApiOperation("分页查询景区列表")
@PostMapping("/page") @PostMapping("/page")
public ApiResponse<PageInfo<ScenicAppVO>> pageQuery(@RequestBody ScenicReqQuery scenicReqQuery){ public ApiResponse<PageInfo<ScenicAppVO>> pageQuery(@RequestBody ScenicReqQuery scenicReqQuery){
String userId = BaseContextHandler.getUserId();
if (ENABLED_USER_IDs.contains(userId)) {
return appScenicService.pageQuery(scenicReqQuery); return appScenicService.pageQuery(scenicReqQuery);
} else {
return ApiResponse.success(new PageInfo<>(new ArrayList<>()));
}
} }
@ApiOperation("根据id查询景区详情") @ApiOperation("根据id查询景区详情")
@IgnoreToken @IgnoreToken
@ -51,9 +69,26 @@ public class AppScenicController {
@GetMapping("/{id}/config") @GetMapping("/{id}/config")
@IgnoreToken @IgnoreToken
public ApiResponse<ScenicConfigEntity> getConfig(@PathVariable Long id){ public ApiResponse<ScenicConfigResp> getConfig(@PathVariable Long id){
ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(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("查询景区设备总数和拍到用户的机位数量") @ApiOperation("查询景区设备总数和拍到用户的机位数量")
@ -65,13 +100,19 @@ public class AppScenicController {
@ApiOperation("景区视频源素材列表") @ApiOperation("景区视频源素材列表")
@GetMapping("/contentList/") @GetMapping("/contentList/")
public ApiResponse<List<ContentPageVO>> contentList() { public ApiResponse<List<ContentPageVO>> contentList() {
return appScenicService.contentListUseDefaultFace(); return faceService.contentListUseDefaultFace();
} }
@ApiOperation("景区视频源素材列表") @ApiOperation("景区视频源素材列表")
@GetMapping("/face/{faceId}/contentList") @GetMapping("/face/{faceId}/contentList")
public ApiResponse<List<ContentPageVO>> contentList(@PathVariable Long faceId) { public ApiResponse<List<ContentPageVO>> contentList(@PathVariable Long faceId) {
List<ContentPageVO> contentPageVOS = appScenicService.faceContentList(faceId); List<ContentPageVO> contentPageVOS = faceService.faceContentList(faceId);
return ApiResponse.success(contentPageVOS); 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.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@Deprecated
@RestController @RestController
@RequestMapping("/api/mobile/video/v1") @RequestMapping("/api/mobile/video/v1")
public class AppVideoController { public class AppVideoController {

@ -39,7 +39,7 @@ public class AppWxNotifyController {
@GetMapping({"/getIds", "/"}) @GetMapping({"/getIds", "/"})
@IgnoreToken @IgnoreToken
public ApiResponse<List<String>> getIds() { public ApiResponse<List<String>> getIds() {
return ApiResponse.success(new ArrayList<String>() {{ return ApiResponse.success(new ArrayList<>() {{
add("5b8vTm7kvwYubqDxb3dxBs0BqxMsgVgGw573aahTEd8"); add("5b8vTm7kvwYubqDxb3dxBs0BqxMsgVgGw573aahTEd8");
add("vPIzbkA0x4mMj-vdbWx6_45e8juWXzs3FGYnDsIPv3A"); add("vPIzbkA0x4mMj-vdbWx6_45e8juWXzs3FGYnDsIPv3A");
add("HB1vp-0BXc2WyYeoYN3a3GuZV9HtPLXUTT7blCBq9eY"); add("HB1vp-0BXc2WyYeoYN3a3GuZV9HtPLXUTT7blCBq9eY");
@ -49,7 +49,7 @@ public class AppWxNotifyController {
@GetMapping("/{scenicId}") @GetMapping("/{scenicId}")
@IgnoreToken @IgnoreToken
public ApiResponse<List<String>> getIds(@PathVariable("scenicId") Long scenicId) { 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); String videoGeneratedTemplateId = scenicRepository.getVideoGeneratedTemplateId(scenicId);
if (StringUtils.isNotBlank(videoGeneratedTemplateId)) { if (StringUtils.isNotBlank(videoGeneratedTemplateId)) {
add(videoGeneratedTemplateId); add(videoGeneratedTemplateId);

@ -2,22 +2,24 @@ package com.ycwl.basic.controller.mobile;
import com.ycwl.basic.annotation.IgnoreToken; 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.enums.BizCodeEnum;
import com.ycwl.basic.model.wx.WXPayOrderReqVO; import com.ycwl.basic.model.wx.WXPayOrderReqVO;
import com.ycwl.basic.model.wx.WxPayRespVO; import com.ycwl.basic.model.wx.WxPayRespVO;
import com.ycwl.basic.pay.entity.PayResponse;
import com.ycwl.basic.service.mobile.WxPayService; import com.ycwl.basic.service.mobile.WxPayService;
import com.ycwl.basic.utils.ApiResponse; import com.ycwl.basic.utils.ApiResponse;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; 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.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import java.io.IOException; import java.io.IOException;
import java.security.GeneralSecurityException; import java.security.GeneralSecurityException;
@ -35,12 +37,6 @@ public class AppWxPayController {
@Autowired @Autowired
private WxPayService wxPayService; 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 = "微信支付回调") @ApiOperation(value = "微信支付回调", notes = "微信支付回调")
@PostMapping("/payNotify") @PostMapping("/payNotify")
@IgnoreToken @IgnoreToken
@ -49,28 +45,25 @@ public class AppWxPayController {
return ApiResponse.success(BizCodeEnum.REQUEST_OK); return ApiResponse.success(BizCodeEnum.REQUEST_OK);
} }
@ApiOperation(value = "微信退款", notes = "微信退款") @RequestMapping("/{scenicId}/payNotify")
@PostMapping("/refundOrder") @IgnoreToken
public ApiResponse<?> refundOrder(@RequestBody String orderId) throws Exception { public Object payNotifyByScenicId(@PathVariable Long scenicId, HttpServletRequest request) {
return ApiResponse.buildResult(wxPayService.refundOrder(orderId) ? PayResponse payResponse = wxPayService.payNotify(scenicId, request);
BizCodeEnum.SUCCESS : if (payResponse == null) {
BizCodeEnum.ADVANCE_PAYMENT_REFUND_FAILED); 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 = "微信支付退款回调") @ApiOperation(value = "微信支付退款回调", notes = "微信支付退款回调")
@PostMapping("/refundNotify") @PostMapping("/{scenicId}/refundNotify")
@IgnoreToken @IgnoreToken
public ApiResponse<?> refundNotify(@RequestBody String refundResult) throws GeneralSecurityException, IOException { public ApiResponse<?> refundNotify(@PathVariable Long scenicId, HttpServletRequest request) throws GeneralSecurityException, IOException {
return ApiResponse.buildResult(wxPayService.refundNotify(refundResult) ? return ApiResponse.buildResult(wxPayService.refundNotify(scenicId, request) ?
BizCodeEnum.SUCCESS : BizCodeEnum.SUCCESS :
BizCodeEnum.ADVANCE_PAYMENT_CALLBACK_REFUND_FAILED); 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);
}
} }

@ -1,25 +1,36 @@
package com.ycwl.basic.controller.mobile.manage; package com.ycwl.basic.controller.mobile.manage;
import com.ycwl.basic.annotation.IgnoreToken; import com.ycwl.basic.annotation.IgnoreToken;
import com.ycwl.basic.constant.BaseContextHandler;
import com.ycwl.basic.model.mobile.scenic.account.ScenicLoginReq; import com.ycwl.basic.model.mobile.scenic.account.ScenicLoginReq;
import com.ycwl.basic.model.mobile.scenic.account.ScenicLoginRespVO; import com.ycwl.basic.model.mobile.scenic.account.ScenicLoginRespVO;
import com.ycwl.basic.model.mobile.weChat.DTO.WeChatUserInfoDTO; import com.ycwl.basic.model.mobile.weChat.DTO.WeChatUserInfoDTO;
import com.ycwl.basic.model.pc.device.resp.DeviceRespVO; import com.ycwl.basic.model.pc.device.resp.DeviceRespVO;
import com.ycwl.basic.model.pc.scenic.entity.ScenicAccountEntity;
import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery;
import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO; import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO;
import com.ycwl.basic.service.mobile.AppScenicService; import com.ycwl.basic.service.mobile.AppScenicService;
import com.ycwl.basic.service.pc.ScenicAccountService;
import com.ycwl.basic.service.pc.ScenicService;
import com.ycwl.basic.utils.ApiResponse; import com.ycwl.basic.utils.ApiResponse;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; 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.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import static com.ycwl.basic.constant.JwtRoleConstant.MERCHANT;
/** /**
* @Author:longbinbin * @Author:longbinbin
* @Date:2024/12/12 18:28 * @Date:2024/12/12 18:28
@ -28,9 +39,12 @@ import java.util.List;
@RequestMapping("/api/mobile/scenicAccount/v1") @RequestMapping("/api/mobile/scenicAccount/v1")
@Api(tags = "景区账号相关接口") @Api(tags = "景区账号相关接口")
public class AppScenicAccountController { public class AppScenicAccountController {
@Autowired
private ScenicAccountService accountService;
@Autowired @Autowired
private AppScenicService scenicService; private AppScenicService scenicService;
@Autowired
private ScenicService adminScenicService;
@ApiOperation("登录") @ApiOperation("登录")
@PostMapping("/login") @PostMapping("/login")
@ -39,13 +53,68 @@ public class AppScenicAccountController {
return scenicService.login(scenicLoginReq); return scenicService.login(scenicLoginReq);
} }
@GetMapping("/myScenicList")
public ApiResponse<List<ScenicRespVO>> myScenicList() {
List<ScenicRespVO> list = Collections.emptyList();
if (StringUtils.equals(BaseContextHandler.getRoleId(), MERCHANT.type)) {
String userId = BaseContextHandler.getUserId();
ScenicAccountEntity account = accountService.getScenicAccountById(Long.valueOf(userId));
if (account == null || account.getScenicId().isEmpty()) {
return ApiResponse.fail("景区账号未绑定景区");
}
list = account.getScenicId().stream().map(id -> {
return scenicService.getDetails(id).getData();
}).toList();
} else {
list = adminScenicService.list(new ScenicReqQuery()).getData();
}
return ApiResponse.success(list);
}
@GetMapping("/getScenic") @GetMapping("/getScenic")
public ApiResponse<ScenicRespVO> getMyScenic() { public ApiResponse<ScenicRespVO> getMyScenic() {
return scenicService.getMyScenic(); String userId = BaseContextHandler.getUserId();
ScenicAccountEntity account = accountService.getScenicAccountById(Long.valueOf(userId));
if (account == null || account.getScenicId().isEmpty()) {
return ApiResponse.fail("景区账号未绑定景区");
}
return scenicService.getDetails(account.getScenicId().getFirst());
}
@GetMapping("/{scenicId}")
public ApiResponse<ScenicRespVO> getScenic(@PathVariable Long scenicId) {
String userId = BaseContextHandler.getUserId();
ScenicAccountEntity account = accountService.getScenicAccountById(Long.valueOf(userId));
if (account == null || account.getScenicId().isEmpty()) {
return ApiResponse.fail("景区账号未绑定景区");
}
if (!account.getScenicId().contains(scenicId)) {
return ApiResponse.fail("无权限");
}
return scenicService.getDetails(scenicId);
} }
@GetMapping("/devices") @GetMapping("/devices")
public ApiResponse<List<DeviceRespVO>> getDeviceList() { public ApiResponse<List<DeviceRespVO>> getDeviceList() {
return scenicService.getMyDevices(); String userId = BaseContextHandler.getUserId();
ScenicAccountEntity account = accountService.getScenicAccountById(Long.valueOf(userId));
if (account == null || account.getScenicId().isEmpty()) {
return ApiResponse.fail("景区账号未绑定景区");
} }
return scenicService.getDevices(account.getScenicId().getFirst());
}
@GetMapping("/{scenicId}/devices")
public ApiResponse<List<DeviceRespVO>> getDeviceList(@PathVariable Long scenicId) {
String userId = BaseContextHandler.getUserId();
ScenicAccountEntity account = accountService.getScenicAccountById(Long.valueOf(userId));
if (account == null || account.getScenicId().isEmpty()) {
return ApiResponse.fail("景区账号未绑定景区");
}
if (!account.getScenicId().contains(scenicId)) {
return ApiResponse.fail("无权限");
}
return scenicService.getDevices(scenicId);
}
} }

@ -7,9 +7,11 @@ import com.ycwl.basic.model.pc.order.req.OrderReqQuery;
import com.ycwl.basic.model.pc.order.resp.OrderRespVO; import com.ycwl.basic.model.pc.order.resp.OrderRespVO;
import com.ycwl.basic.model.pc.scenic.entity.ScenicAccountEntity; import com.ycwl.basic.model.pc.scenic.entity.ScenicAccountEntity;
import com.ycwl.basic.service.pc.OrderService; import com.ycwl.basic.service.pc.OrderService;
import com.ycwl.basic.service.pc.ScenicAccountService;
import com.ycwl.basic.utils.ApiResponse; import com.ycwl.basic.utils.ApiResponse;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired; 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.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
@ -24,27 +26,57 @@ public class AppScenicOrderController {
@Autowired @Autowired
private OrderService orderService; private OrderService orderService;
@Autowired @Autowired
private ScenicAccountMapper scenicAccountMapper; private ScenicAccountService service;
@PostMapping("/list") @PostMapping("/list")
@Deprecated
public ApiResponse<List<OrderRespVO>> list(@RequestBody OrderReqQuery query) { public ApiResponse<List<OrderRespVO>> list(@RequestBody OrderReqQuery query) {
String userId = BaseContextHandler.getUserId(); String userId = BaseContextHandler.getUserId();
ScenicAccountEntity account = scenicAccountMapper.findAccountById(userId); ScenicAccountEntity account = service.getScenicAccountById(Long.valueOf(userId));
if (account == null) { if (account == null || account.getScenicId().isEmpty()) {
return ApiResponse.fail("用户未绑定景区"); return ApiResponse.fail("景区账号未绑定景区");
} }
query.setScenicId(account.getScenicId()); query.setScenicId(account.getScenicId().getFirst());
return orderService.list(query);
}
@PostMapping("/{scenicId}/list")
public ApiResponse<List<OrderRespVO>> list(@PathVariable Long scenicId, @RequestBody OrderReqQuery query) {
String userId = BaseContextHandler.getUserId();
ScenicAccountEntity account = service.getScenicAccountById(Long.valueOf(userId));
if (account == null || account.getScenicId().isEmpty()) {
return ApiResponse.fail("景区账号未绑定景区");
}
if (!account.getScenicId().contains(scenicId)) {
return ApiResponse.fail("无权限查看该景区订单");
}
query.setScenicId(scenicId);
return orderService.list(query); return orderService.list(query);
} }
@PostMapping("/page") @PostMapping("/page")
@Deprecated
public ApiResponse<PageInfo<OrderRespVO>> page(@RequestBody OrderReqQuery query) { public ApiResponse<PageInfo<OrderRespVO>> page(@RequestBody OrderReqQuery query) {
String userId = BaseContextHandler.getUserId(); String userId = BaseContextHandler.getUserId();
ScenicAccountEntity account = scenicAccountMapper.findAccountById(userId); ScenicAccountEntity account = service.getScenicAccountById(Long.valueOf(userId));
if (account == null) { if (account == null || account.getScenicId().isEmpty()) {
return ApiResponse.fail("用户未绑定景区"); return ApiResponse.fail("景区账号未绑定景区");
} }
query.setScenicId(account.getScenicId()); query.setScenicId(account.getScenicId().getFirst());
return orderService.pageQueryDetail(query);
}
@PostMapping("/{scenicId}/page")
public ApiResponse<PageInfo<OrderRespVO>> page(@PathVariable Long scenicId, @RequestBody OrderReqQuery query) {
String userId = BaseContextHandler.getUserId();
ScenicAccountEntity account = service.getScenicAccountById(Long.valueOf(userId));
if (account == null || account.getScenicId().isEmpty()) {
return ApiResponse.fail("景区账号未绑定景区");
}
if (!account.getScenicId().contains(scenicId)) {
return ApiResponse.fail("无权限查看该景区订单");
}
query.setScenicId(scenicId);
return orderService.pageQueryDetail(query); return orderService.pageQueryDetail(query);
} }
} }

@ -61,7 +61,7 @@ public class AppStatisticsController {
@ApiOperation("统计数据记录") @ApiOperation("统计数据记录")
@PostMapping("/addStatistics") @PostMapping("/addStatistics")
@IgnoreToken @IgnoreToken
public ApiResponse addStatistics(@RequestBody StatisticsRecordAddReq req) { public ApiResponse<String> addStatistics(@RequestBody StatisticsRecordAddReq req) {
return statisticsService.addStatistics(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.entity.BrokerEntity;
import com.ycwl.basic.model.pc.broker.req.BrokerRecordReqQuery; 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.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.BrokerRespVO;
import com.ycwl.basic.model.pc.broker.resp.DailySummaryRespVO; import com.ycwl.basic.model.pc.broker.resp.DailySummaryRespVO;
import com.ycwl.basic.service.pc.BrokerRecordService; import com.ycwl.basic.service.pc.BrokerRecordService;
@ -131,7 +130,7 @@ public class BrokerController {
try { try {
WxMpUtil.generateWXAQRCode(appId, appSecret, appState, path, filePath); WxMpUtil.generateWXAQRCode(appId, appSecret, appState, path, filePath);
File file = new File(filePath); File file = new File(filePath);
String s = adapter.uploadFile(file, filePath); String s = adapter.uploadFile(null, file, filePath);
file.delete(); file.delete();
adapter.setAcl(StorageAcl.PUBLIC_READ, filePath); adapter.setAcl(StorageAcl.PUBLIC_READ, filePath);
return ApiResponse.success(s); 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; import java.util.List;
@Deprecated
@RestController @RestController
@RequestMapping("/api/face/detect_log/v1") @RequestMapping("/api/face/detect_log/v1")
public class FaceDetectLogController { public class FaceDetectLogController {

@ -17,6 +17,7 @@ import java.util.List;
* @Author:longbinbin * @Author:longbinbin
* @Date:2024/12/2 16:33 * @Date:2024/12/2 16:33
*/ */
@Deprecated
@RestController @RestController
@RequestMapping("/api/faceSample/v1") @RequestMapping("/api/faceSample/v1")
@Api(tags = "人脸样本管理") @Api(tags = "人脸样本管理")
@ -39,28 +40,5 @@ public class FaceSampleController {
public ApiResponse<FaceSampleRespVO> getDetail(@PathVariable("id") Long id) { public ApiResponse<FaceSampleRespVO> getDetail(@PathVariable("id") Long id) {
return FaceSampleService.getById(id); return FaceSampleService.getById(id);
} }
@ApiOperation("添加人脸样本")
@PostMapping("/add")
public ApiResponse<Integer> add(@RequestBody FaceSampleEntity FaceSample) {
return FaceSampleService.add(FaceSample);
}
@ApiOperation("删除人脸样本")
@PostMapping("/deleteById/{id}")
public ApiResponse<Integer> deleteById(@PathVariable Long id) {
return FaceSampleService.deleteById(id);
}
@ApiOperation("批量删除人脸样本")
@PostMapping("/deleteByIds")
public ApiResponse<Integer> deleteByIds(@RequestBody List<Long> ids) {
return FaceSampleService.deleteByIds(ids);
}
@ApiOperation("修改人脸样本信息")
@PostMapping("/update")
public ApiResponse<Integer> update(@RequestBody FaceSampleEntity FaceSample) {
return FaceSampleService.update(FaceSample);
}
} }

@ -20,6 +20,8 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import static com.ycwl.basic.constant.JwtRoleConstant.MERCHANT;
@RestController @RestController
@RequestMapping("/api/permission/v1") @RequestMapping("/api/permission/v1")
@Api(tags = "权限管理接口") @Api(tags = "权限管理接口")
@ -32,9 +34,9 @@ public class PermissionController {
String userId = BaseContextHandler.getUserId(); String userId = BaseContextHandler.getUserId();
PermissionEntity permission = permissionService.getPermissionByUserId(Long.parseLong(userId)); PermissionEntity permission = permissionService.getPermissionByUserId(Long.parseLong(userId));
if (permission == null || StringUtils.isEmpty(permission.getPermString())) { if (permission == null || StringUtils.isEmpty(permission.getPermString())) {
return ApiResponse.success(new PermissionResp(new ArrayList<>())); return ApiResponse.success(new PermissionResp(new ArrayList<>(), new ArrayList<>()));
} }
return ApiResponse.success(new PermissionResp(Arrays.asList(StringUtils.split(permission.getPermString(), ",")))); return ApiResponse.success(new PermissionResp(Arrays.asList(StringUtils.split(permission.getPermString(), ",")), Arrays.asList(StringUtils.split(permission.getMenuString(), ","))));
} }
@ApiOperation("根据用户ID查询权限信息") @ApiOperation("根据用户ID查询权限信息")
@ -42,15 +44,15 @@ public class PermissionController {
public ApiResponse<PermissionResp> getPermissionByUser(@PathVariable Long userId) { public ApiResponse<PermissionResp> getPermissionByUser(@PathVariable Long userId) {
PermissionEntity permission = permissionService.getPermissionByUserId(userId); PermissionEntity permission = permissionService.getPermissionByUserId(userId);
if (permission == null || StringUtils.isEmpty(permission.getPermString())) { if (permission == null || StringUtils.isEmpty(permission.getPermString())) {
return ApiResponse.success(new PermissionResp(new ArrayList<>())); return ApiResponse.success(new PermissionResp(new ArrayList<>(), new ArrayList<>()));
} }
return ApiResponse.success(new PermissionResp(Arrays.asList(StringUtils.split(permission.getPermString(), ",")))); return ApiResponse.success(new PermissionResp(Arrays.asList(StringUtils.split(permission.getPermString(), ",")), Arrays.asList(StringUtils.split(permission.getMenuString(), ","))));
} }
@ApiOperation("保存或更新权限信息") @ApiOperation("保存或更新权限信息")
@PostMapping("/save/{userId}") @PostMapping("/save/{userId}")
public ApiResponse saveOrUpdate(@PathVariable Long userId, @RequestBody PermissionSaveReq req) { public ApiResponse saveOrUpdate(@PathVariable Long userId, @RequestBody PermissionSaveReq req) {
permissionService.saveOrUpdate(userId, StringUtils.join(req.getPermissions(), ",")); permissionService.saveOrUpdate(userId, StringUtils.join(req.getPermissions(), ","), StringUtils.join(req.getMenus(), ","));
return ApiResponse.success(true); return ApiResponse.success(true);
} }
} }

@ -47,6 +47,15 @@ public class PriceConfigController {
public ApiResponse<Boolean> deletePriceConfig(@PathVariable Integer id) { public ApiResponse<Boolean> deletePriceConfig(@PathVariable Integer id) {
priceRepository.clearPriceCache(id); priceRepository.clearPriceCache(id);
priceConfigService.removeById(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); return ApiResponse.success(true);
} }

@ -2,6 +2,7 @@ package com.ycwl.basic.controller.pc;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.ycwl.basic.mapper.ScenicAccountMapper;
import com.ycwl.basic.model.pc.scenic.entity.ScenicAccountEntity; import com.ycwl.basic.model.pc.scenic.entity.ScenicAccountEntity;
import com.ycwl.basic.model.pc.scenic.req.ScenicAccountReqQuery; import com.ycwl.basic.model.pc.scenic.req.ScenicAccountReqQuery;
import com.ycwl.basic.service.pc.ScenicAccountService; import com.ycwl.basic.service.pc.ScenicAccountService;
@ -16,6 +17,8 @@ import java.util.List;
public class ScenicAccountController { public class ScenicAccountController {
@Autowired @Autowired
private ScenicAccountService service; private ScenicAccountService service;
@Autowired
private ScenicAccountMapper scenicAccountMapper;
// 添加景区账号 // 添加景区账号
@PostMapping("/add") @PostMapping("/add")
@ -62,6 +65,10 @@ public class ScenicAccountController {
public ApiResponse<PageInfo<ScenicAccountEntity>> pageQuery(@RequestBody ScenicAccountReqQuery req) { public ApiResponse<PageInfo<ScenicAccountEntity>> pageQuery(@RequestBody ScenicAccountReqQuery req) {
PageHelper.startPage(req.getPageNum(), req.getPageSize()); PageHelper.startPage(req.getPageNum(), req.getPageSize());
List<ScenicAccountEntity> list = service.pageQuery(req); List<ScenicAccountEntity> list = service.pageQuery(req);
list.forEach(entity -> {
entity.setPassword("");
entity.setScenicId(scenicAccountMapper.getAccountRelations(entity.getId()));
});
PageInfo<ScenicAccountEntity> pageInfo = new PageInfo<>(list); PageInfo<ScenicAccountEntity> pageInfo = new PageInfo<>(list);
return ApiResponse.success(pageInfo); return ApiResponse.success(pageInfo);
} }

@ -1,10 +1,16 @@
package com.ycwl.basic.controller.pc; package com.ycwl.basic.controller.pc;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.ycwl.basic.constant.BaseContextHandler;
import com.ycwl.basic.model.mobile.statistic.req.CommonQueryReq;
import com.ycwl.basic.model.pc.scenic.entity.ScenicAccountEntity;
import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; 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.ScenicAddOrUpdateReq;
import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery; import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery;
import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO; import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO;
import com.ycwl.basic.service.mobile.AppScenicService;
import com.ycwl.basic.service.mobile.AppStatisticsService;
import com.ycwl.basic.service.pc.ScenicAccountService;
import com.ycwl.basic.service.pc.ScenicService; import com.ycwl.basic.service.pc.ScenicService;
import com.ycwl.basic.storage.StorageFactory; import com.ycwl.basic.storage.StorageFactory;
import com.ycwl.basic.storage.adapters.IStorageAdapter; import com.ycwl.basic.storage.adapters.IStorageAdapter;
@ -15,12 +21,16 @@ import com.ycwl.basic.repository.ScenicRepository;
import com.ycwl.basic.model.pc.mp.MpConfigEntity; import com.ycwl.basic.model.pc.mp.MpConfigEntity;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.io.File; import java.io.File;
import java.util.Collections;
import java.util.List; import java.util.List;
import static com.ycwl.basic.constant.JwtRoleConstant.MERCHANT;
/** /**
* @Author:longbinbin * @Author:longbinbin
* @Date:2024/12/3 15:20 * @Date:2024/12/3 15:20
@ -32,9 +42,15 @@ public class ScenicController {
@Autowired @Autowired
private ScenicService scenicService; private ScenicService scenicService;
@Autowired
private AppScenicService appScenicService;
@Autowired @Autowired
private ScenicRepository scenicRepository; private ScenicRepository scenicRepository;
@Autowired
private AppStatisticsService appStatisticsService;
@Autowired
private ScenicAccountService accountService;
@ApiOperation("分页查询景区") @ApiOperation("分页查询景区")
@PostMapping("/page") @PostMapping("/page")
@ -117,7 +133,7 @@ public class ScenicController {
try { try {
WxMpUtil.generateWXAQRCode(appId, appSecret, appState, path, filePath); WxMpUtil.generateWXAQRCode(appId, appSecret, appState, path, filePath);
File file = new File(filePath); File file = new File(filePath);
String s = adapter.uploadFile(file, filePath); String s = adapter.uploadFile(null, file, filePath);
file.delete(); file.delete();
adapter.setAcl(StorageAcl.PUBLIC_READ, filePath); adapter.setAcl(StorageAcl.PUBLIC_READ, filePath);
return ApiResponse.success(s); return ApiResponse.success(s);
@ -125,4 +141,48 @@ public class ScenicController {
return ApiResponse.fail("生成二维码失败"); 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);
}
@PostMapping("/{scenicId}/orderChart")
public ApiResponse getOrderChart(@PathVariable("scenicId") Long scenicId, @RequestBody CommonQueryReq query) {
query.setScenicId(scenicId);
return appStatisticsService.orderChart(query);
}
@GetMapping("/myScenicList")
public ApiResponse<List<ScenicRespVO>> myScenicList() {
List<ScenicRespVO> list = Collections.emptyList();
if (StringUtils.equals(BaseContextHandler.getRoleId(), MERCHANT.type)) {
String userId = BaseContextHandler.getUserId();
ScenicAccountEntity account = accountService.getScenicAccountById(Long.valueOf(userId));
if (account == null || account.getScenicId().isEmpty()) {
return ApiResponse.fail("景区账号未绑定景区");
}
list = account.getScenicId().stream().map(id -> {
return appScenicService.getDetails(id).getData();
}).toList();
} else {
list = scenicService.list(new ScenicReqQuery()).getData();
}
return ApiResponse.success(list);
}
} }

@ -1,5 +1,6 @@
package com.ycwl.basic.controller.pc; package com.ycwl.basic.controller.pc;
import com.ycwl.basic.annotation.IgnoreToken;
import com.ycwl.basic.model.jwt.JwtInfo; import com.ycwl.basic.model.jwt.JwtInfo;
import com.ycwl.basic.model.pc.source.entity.SourceEntity; import com.ycwl.basic.model.pc.source.entity.SourceEntity;
import com.ycwl.basic.model.pc.source.req.SourceReqQuery; import com.ycwl.basic.model.pc.source.req.SourceReqQuery;
@ -23,41 +24,29 @@ public class SourceController {
@Autowired @Autowired
private SourceService sourceService; private SourceService sourceService;
@Deprecated
@ApiOperation("分页查询视频源") @ApiOperation("分页查询视频源")
@PostMapping("/page") @PostMapping("/page")
public ApiResponse pageQuery(@RequestBody SourceReqQuery sourceReqQuery) { public ApiResponse pageQuery(@RequestBody SourceReqQuery sourceReqQuery) {
return sourceService.pageQuery(sourceReqQuery); return sourceService.pageQuery(sourceReqQuery);
} }
@Deprecated
@ApiOperation("查询视频源列表") @ApiOperation("查询视频源列表")
@PostMapping("/list") @PostMapping("/list")
public ApiResponse list(@RequestBody SourceReqQuery sourceReqQuery) { public ApiResponse list(@RequestBody SourceReqQuery sourceReqQuery) {
return sourceService.list(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") @PostMapping("/{id}/cutVideo")
@IgnoreToken
public ApiResponse cutVideo(@PathVariable("id") Long id) { public ApiResponse cutVideo(@PathVariable("id") Long id) {
return sourceService.cutVideo(id); return sourceService.cutVideo(id);
} }
@ApiOperation("添加视频源") @Deprecated
@PostMapping("/add")
public ApiResponse add(@RequestBody SourceEntity source) {
return sourceService.add(source);
}
@ApiOperation("删除视频源") @ApiOperation("删除视频源")
@DeleteMapping("/delete/{id}") @DeleteMapping("/delete/{id}")
public ApiResponse deleteById(@PathVariable Long id) { public ApiResponse deleteById(@PathVariable Long id) {
return sourceService.deleteById(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 @RestController
@RequestMapping("/api/task/v1") @RequestMapping("/api/task/v1")
@Deprecated
@Api(tags = "任务列表管理") @Api(tags = "任务列表管理")
public class TaskController { public class TaskController {

@ -20,6 +20,7 @@ import java.util.List;
@RestController @RestController
@RequestMapping("/api/video/v1") @RequestMapping("/api/video/v1")
@Deprecated
@Api(tags = "视频成片管理") @Api(tags = "视频成片管理")
public class VideoController { 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.IgnoreLogReq;
import com.ycwl.basic.annotation.IgnoreToken; 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.pc.template.resp.TemplateRespVO;
import com.ycwl.basic.model.task.req.TaskReqVo; import com.ycwl.basic.model.task.req.TaskReqVo;
import com.ycwl.basic.model.task.req.TaskSuccessReqVo; 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 com.ycwl.basic.utils.ApiResponse;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired; 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.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
@IgnoreToken @IgnoreToken
@RestController @RestController
@Api(tags = "渲染端对接接口") @Api(tags = "渲染端对接接口")
@ -37,6 +37,11 @@ public class TaskTaskController {
return ApiResponse.success(respVo); return ApiResponse.success(respVo);
} }
@GetMapping("/{taskId}/info")
public ApiResponse<TaskRespVO> taskInfo(@PathVariable Long taskId) {
return ApiResponse.success(taskService.taskInfo(taskId));
}
@PostMapping("/template/{templateId}") @PostMapping("/template/{templateId}")
public ApiResponse<TemplateRespVO> getTemplateById(@PathVariable Long templateId, @RequestBody WorkerAuthReqVo req) { public ApiResponse<TemplateRespVO> getTemplateById(@PathVariable Long templateId, @RequestBody WorkerAuthReqVo req) {
return ApiResponse.success(taskService.workerGetTemplate(templateId, req)); return ApiResponse.success(taskService.workerGetTemplate(templateId, req));
@ -45,7 +50,6 @@ public class TaskTaskController {
@PostMapping("/{taskId}/uploadUrl") @PostMapping("/{taskId}/uploadUrl")
public ApiResponse<String> getUploadUrl(@PathVariable Long taskId, @RequestBody WorkerAuthReqVo req) { public ApiResponse<String> getUploadUrl(@PathVariable Long taskId, @RequestBody WorkerAuthReqVo req) {
String urlForUpload = taskService.getUploadUrl(taskId, req); String urlForUpload = taskService.getUploadUrl(taskId, req);
urlForUpload = urlForUpload.replace("-internal.aliyuncs.com", ".aliyuncs.com");
return ApiResponse.success(urlForUpload); return ApiResponse.success(urlForUpload);
} }

@ -1,14 +1,11 @@
package com.ycwl.basic.controller.viid; package com.ycwl.basic.controller.viid;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.thread.ThreadFactoryBuilder;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ycwl.basic.annotation.IgnoreLogReq; import com.ycwl.basic.annotation.IgnoreLogReq;
import com.ycwl.basic.annotation.IgnoreToken; 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.adapter.IFaceBodyAdapter;
import com.ycwl.basic.facebody.entity.AddFaceResp; import com.ycwl.basic.facebody.entity.AddFaceResp;
import com.ycwl.basic.mapper.DeviceMapper; 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.DeviceConfigEntity;
import com.ycwl.basic.model.pc.device.entity.DeviceEntity; import com.ycwl.basic.model.pc.device.entity.DeviceEntity;
import com.ycwl.basic.model.pc.faceSample.entity.FaceSampleEntity; 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.pc.source.entity.SourceEntity;
import com.ycwl.basic.model.viid.entity.DeviceIdObject; import com.ycwl.basic.model.viid.entity.DeviceIdObject;
import com.ycwl.basic.model.viid.entity.FaceListObject; import com.ycwl.basic.model.viid.entity.FaceListObject;
import com.ycwl.basic.model.viid.entity.FaceObject; import com.ycwl.basic.model.viid.entity.FaceObject;
import com.ycwl.basic.model.viid.entity.FacePositionObject; 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.ResponseStatusObject;
import com.ycwl.basic.model.viid.entity.SubImageInfoObject; import com.ycwl.basic.model.viid.entity.SubImageInfoObject;
import com.ycwl.basic.model.viid.entity.SubImageList; 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.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import java.io.IOException; import java.io.IOException;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@ -69,12 +63,13 @@ import java.util.TimeZone;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.ycwl.basic.constant.StorageConstant.PHOTO_PATH; 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 @IgnoreToken
@RestController @RestController
@ -93,17 +88,20 @@ public class ViidController {
private ScenicRepository scenicRepository; private ScenicRepository scenicRepository;
@Autowired @Autowired
private TaskFaceService taskFaceService; private TaskFaceService taskFaceService;
private final Map<String, ThreadPoolExecutor> executors = new ConcurrentHashMap<>(); private final Map<Long, ThreadPoolExecutor> executors = new ConcurrentHashMap<>();
@Autowired @Autowired
private ScenicService scenicService; private ScenicService scenicService;
private ThreadPoolExecutor getExecutor(String deviceId) { private ThreadPoolExecutor getExecutor(Long scenicId) {
ThreadPoolExecutor executor = executors.get(deviceId); return executors.computeIfAbsent(scenicId, k -> {
if (executor == null) { ThreadFactory threadFactory = new ThreadFactoryBuilder()
executor = new ThreadPoolExecutor(4, 4096, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(4096)); .setNamePrefix("VIID-" + scenicId + "-t")
executors.put(deviceId, executor); .build();
} return new ThreadPoolExecutor(
return executor; 4, 1024, 0L, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<>(1024),
threadFactory);
});
} }
// region 注册注销基础接口 // region 注册注销基础接口
@ -269,7 +267,7 @@ public class ViidController {
} }
if (shotTime == null) { if (shotTime == null) {
shotTime = new Date(); 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(); shotTime = new Date();
} }
Long scenicId = device.getScenicId(); Long scenicId = device.getScenicId();
@ -307,17 +305,17 @@ public class ViidController {
faceSample.setDeviceId(device.getId()); faceSample.setDeviceId(device.getId());
faceSample.setStatus(0); faceSample.setStatus(0);
faceSample.setCreateAt(shotTime); 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); faceSample.setFaceUrl(url);
faceSampleMapper.add(faceSample); faceSampleMapper.add(faceSample);
ThreadPoolExecutor executor = getExecutor(device.getId().toString()); ThreadPoolExecutor executor = getExecutor(scenicId);
executor.execute(() -> { executor.execute(() -> {
if (faceBodyAdapter != null) { if (faceBodyAdapter != null) {
taskFaceService.assureFaceDb(faceBodyAdapter, scenicId.toString()); 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) { if (addFaceResp != null) {
faceSample.setScore(addFaceResp.getScore()); faceSample.setScore(addFaceResp.getScore());
faceSampleMapper.update(faceSample); faceSampleMapper.updateScore(faceSample.getId(), addFaceResp.getScore());
} }
} }
if (deviceConfig != null && Integer.valueOf(1).equals(deviceConfig.getEnablePreBook())) { if (deviceConfig != null && Integer.valueOf(1).equals(deviceConfig.getEnablePreBook())) {
@ -368,21 +366,21 @@ public class ViidController {
faceSample.setDeviceId(device.getId()); faceSample.setDeviceId(device.getId());
faceSample.setStatus(0); faceSample.setStatus(0);
faceSample.setCreateAt(shotTime); 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); faceSample.setFaceUrl(url);
faceSampleMapper.add(faceSample); faceSampleMapper.add(faceSample);
DynamicTaskGenerator.addTask(faceSample.getId()); DynamicTaskGenerator.addTask(faceSample.getId());
ThreadPoolExecutor executor = getExecutor(device.getId().toString()); ThreadPoolExecutor executor = getExecutor(scenicId);
executor.execute(() -> { executor.execute(() -> {
if (faceBodyAdapter != null) { if (faceBodyAdapter != null) {
taskFaceService.assureFaceDb(faceBodyAdapter, scenicId.toString()); 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) { if (addFaceResp != null) {
faceSample.setScore(addFaceResp.getScore()); faceSample.setScore(addFaceResp.getScore());
faceSampleMapper.update(faceSample); faceSampleMapper.updateScore(faceSample.getId(), addFaceResp.getScore());
} }
} }
if (deviceConfig != null && Integer.valueOf(1).equals(deviceConfig.getEnablePreBook())) { if (Integer.valueOf(1).equals(deviceConfig.getEnablePreBook())) {
DynamicTaskGenerator.addTask(faceSample.getId()); DynamicTaskGenerator.addTask(faceSample.getId());
} }
}); });
@ -402,8 +400,6 @@ public class ViidController {
@RequestMapping(value = "/Images", method = RequestMethod.POST) @RequestMapping(value = "/Images", method = RequestMethod.POST)
@IgnoreLogReq @IgnoreLogReq
public VIIDBaseResp images(HttpServletRequest request, @RequestBody ImageUploadReq req) throws IOException { public VIIDBaseResp images(HttpServletRequest request, @RequestBody ImageUploadReq req) throws IOException {
// log.info("Images:{}", req);
HttpSaver.saveRequestToFile(request);
return new VIIDBaseResp( return new VIIDBaseResp(
new ResponseStatusObject("1", "/VIID/Images", "0", "OK", sdfTime.format(new Date())) new ResponseStatusObject("1", "/VIID/Images", "0", "OK", sdfTime.format(new Date()))
); );

@ -1,25 +1,18 @@
package com.ycwl.basic.controller.vpt; package com.ycwl.basic.controller.vpt;
import com.alibaba.fastjson.JSONObject;
import com.ycwl.basic.annotation.IgnoreLogReq; import com.ycwl.basic.annotation.IgnoreLogReq;
import com.ycwl.basic.annotation.IgnoreToken; import com.ycwl.basic.annotation.IgnoreToken;
import com.ycwl.basic.constant.StorageConstant; import com.ycwl.basic.constant.StorageConstant;
import com.ycwl.basic.device.entity.common.FileObject; 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.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.model.wvp.WvpSyncReqVo;
import com.ycwl.basic.repository.ScenicRepository;
import com.ycwl.basic.service.pc.ScenicService; 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.adapters.IStorageAdapter;
import com.ycwl.basic.storage.enums.StorageAcl; import com.ycwl.basic.storage.enums.StorageAcl;
import com.ycwl.basic.storage.utils.StorageUtil; import com.ycwl.basic.storage.utils.StorageUtil;
import com.ycwl.basic.utils.ApiResponse; import com.ycwl.basic.utils.ApiResponse;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; 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.Date;
import java.util.List; import java.util.List;
import java.util.Map;
@Slf4j @Slf4j
@IgnoreToken @IgnoreToken
@ -48,7 +40,7 @@ public class VptController {
} }
@PostMapping("/scenic/{scenicId}/{taskId}/uploadUrl") @PostMapping("/scenic/{scenicId}/{taskId}/uploadUrl")
public String uploadUrl(@PathVariable("scenicId") Long scenicId, @PathVariable("taskId") Long taskId) { 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 filename = StorageUtil.joinPath(StorageConstant.VIDEO_PIECE_PATH, taskId.toString() + ".mp4");
String urlForUpload = adapter.getUrlForUpload(new Date(System.currentTimeMillis() + 1000 * 60 * 60), "video/mp4", filename); String urlForUpload = adapter.getUrlForUpload(new Date(System.currentTimeMillis() + 1000 * 60 * 60), "video/mp4", filename);
urlForUpload = urlForUpload.replace("-internal.aliyuncs.com", ".aliyuncs.com"); urlForUpload = urlForUpload.replace("-internal.aliyuncs.com", ".aliyuncs.com");
@ -56,7 +48,7 @@ public class VptController {
} }
@PostMapping("/scenic/{scenicId}/{taskId}/success") @PostMapping("/scenic/{scenicId}/{taskId}/success")
public ApiResponse<String> success(@PathVariable("scenicId") Long scenicId, @PathVariable("taskId") Long taskId, @RequestBody FileObject fileObject) { 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"); String filename = StorageUtil.joinPath(StorageConstant.VIDEO_PIECE_PATH, taskId.toString() + ".mp4");
fileObject.setUrl(adapter.getUrl(filename)); fileObject.setUrl(adapter.getUrl(filename));
adapter.setAcl(StorageAcl.PUBLIC_READ, filename); adapter.setAcl(StorageAcl.PUBLIC_READ, filename);

@ -1,24 +1,19 @@
package com.ycwl.basic.controller.wvp; package com.ycwl.basic.controller.wvp;
import com.alibaba.fastjson.JSONObject;
import com.ycwl.basic.annotation.IgnoreLogReq; import com.ycwl.basic.annotation.IgnoreLogReq;
import com.ycwl.basic.annotation.IgnoreToken; import com.ycwl.basic.annotation.IgnoreToken;
import com.ycwl.basic.constant.StorageConstant; import com.ycwl.basic.constant.StorageConstant;
import com.ycwl.basic.device.entity.common.FileObject; import com.ycwl.basic.device.entity.common.FileObject;
import com.ycwl.basic.device.operator.WvpPassiveStorageOperator; 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.model.wvp.WvpSyncReqVo;
import com.ycwl.basic.repository.ScenicRepository;
import com.ycwl.basic.service.pc.DeviceService; import com.ycwl.basic.service.pc.DeviceService;
import com.ycwl.basic.service.pc.ScenicService; 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.adapters.IStorageAdapter;
import com.ycwl.basic.storage.enums.StorageAcl; import com.ycwl.basic.storage.enums.StorageAcl;
import com.ycwl.basic.storage.utils.StorageUtil; import com.ycwl.basic.storage.utils.StorageUtil;
import com.ycwl.basic.utils.ApiResponse; import com.ycwl.basic.utils.ApiResponse;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; 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.Date;
import java.util.List; import java.util.List;
import java.util.Map;
@Slf4j @Slf4j
@IgnoreToken @IgnoreToken
@ -51,7 +45,7 @@ public class WvpController {
@PostMapping("/scenic/{scenicId}/{taskId}/uploadUrl") @PostMapping("/scenic/{scenicId}/{taskId}/uploadUrl")
public String uploadUrl(@PathVariable("scenicId") Long scenicId, @PathVariable("taskId") Long taskId) { 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 filename = StorageUtil.joinPath(StorageConstant.VIDEO_PIECE_PATH, taskId.toString() + ".mp4");
String urlForUpload = adapter.getUrlForUpload(new Date(System.currentTimeMillis() + 1000 * 60 * 60), "video/mp4", filename); String urlForUpload = adapter.getUrlForUpload(new Date(System.currentTimeMillis() + 1000 * 60 * 60), "video/mp4", filename);
urlForUpload = urlForUpload.replace("-internal.aliyuncs.com", ".aliyuncs.com"); urlForUpload = urlForUpload.replace("-internal.aliyuncs.com", ".aliyuncs.com");
@ -59,7 +53,7 @@ public class WvpController {
} }
@PostMapping("/scenic/{scenicId}/{taskId}/success") @PostMapping("/scenic/{scenicId}/{taskId}/success")
public ApiResponse<String> success(@PathVariable("scenicId") Long scenicId, @PathVariable("taskId") Long taskId, @RequestBody FileObject fileObject) { 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"); String filename = StorageUtil.joinPath(StorageConstant.VIDEO_PIECE_PATH, taskId.toString() + ".mp4");
fileObject.setUrl(adapter.getUrl(filename)); fileObject.setUrl(adapter.getUrl(filename));
adapter.setAcl(StorageAcl.PUBLIC_READ, filename); adapter.setAcl(StorageAcl.PUBLIC_READ, filename);

@ -1,6 +1,8 @@
package com.ycwl.basic.device.operator; package com.ycwl.basic.device.operator;
import com.alibaba.fastjson.JSON; 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.common.FileObject;
import com.ycwl.basic.device.entity.vpt_passive.VptPassiveStorageConfig; import com.ycwl.basic.device.entity.vpt_passive.VptPassiveStorageConfig;
import com.ycwl.basic.device.entity.wvp_passive.WvpPassiveStorageConfig; 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 com.ycwl.basic.utils.SnowFlakeUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -16,6 +19,7 @@ import java.util.Date;
import java.util.List; import java.util.List;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Slf4j @Slf4j
@ -25,12 +29,18 @@ public class VptPassiveStorageOperator extends ADeviceStorageOperator {
public Long scenicId; public Long scenicId;
public Long deviceId; public Long deviceId;
public String deviceNo; public String deviceNo;
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
public Date startTime; public Date startTime;
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
public Date endTime; public Date endTime;
} }
private static List<Task> taskList = new CopyOnWriteArrayList<>(); private static List<Task> taskList = new CopyOnWriteArrayList<>();
private static ConcurrentHashMap<Long, FileObject> fileListMap = new ConcurrentHashMap<>(); 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; private VptPassiveStorageConfig config;
@ -38,6 +48,10 @@ public class VptPassiveStorageOperator extends ADeviceStorageOperator {
loadConfig(configJson); loadConfig(configJson);
} }
public static void setRedisTemplate(RedisTemplate<String, String> redisTemplate) {
VptPassiveStorageOperator.redisTemplate = redisTemplate;
}
public static void onReceiveResult(Long taskId, FileObject fileObject) { public static void onReceiveResult(Long taskId, FileObject fileObject) {
if (fileObject == null) { if (fileObject == null) {
log.info("任务{}获取视频失败!", taskId); log.info("任务{}获取视频失败!", taskId);
@ -77,7 +91,11 @@ public class VptPassiveStorageOperator extends ADeviceStorageOperator {
} }
task.startTime = startDate; task.startTime = startDate;
task.endTime = endDate; task.endTime = endDate;
if (redisTemplate == null) {
taskList.add(task); 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()); log.info("任务{}获取视频开始!共{}", task.taskId, taskList.size());
Date taskStartTime = new Date(); Date taskStartTime = new Date();
while (true) { while (true) {
@ -99,6 +117,7 @@ public class VptPassiveStorageOperator extends ADeviceStorageOperator {
} }
} else { } else {
try { try {
//noinspection BusyWait 得等待
Thread.sleep(1000L); Thread.sleep(1000L);
} catch (InterruptedException e) { } catch (InterruptedException e) {
return Collections.emptyList(); return Collections.emptyList();

@ -1,12 +1,15 @@
package com.ycwl.basic.device.operator; package com.ycwl.basic.device.operator;
import com.alibaba.fastjson.JSON; 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.common.FileObject;
import com.ycwl.basic.device.entity.wvp_passive.WvpPassiveStorageConfig; import com.ycwl.basic.device.entity.wvp_passive.WvpPassiveStorageConfig;
import com.ycwl.basic.storage.utils.StorageUtil; import com.ycwl.basic.storage.utils.StorageUtil;
import com.ycwl.basic.utils.SnowFlakeUtil; import com.ycwl.basic.utils.SnowFlakeUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -14,21 +17,29 @@ import java.util.Date;
import java.util.List; import java.util.List;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Slf4j @Slf4j
public class WvpPassiveStorageOperator extends ADeviceStorageOperator { public class WvpPassiveStorageOperator extends ADeviceStorageOperator {
public static class Task { public static class Task {
public Long taskId; public Long taskId;
public Long scenicId; public Long scenicId;
public Long deviceId; public Long deviceId;
public String deviceNo; public String deviceNo;
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
public Date startTime; public Date startTime;
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
public Date endTime; public Date endTime;
} }
private static List<Task> taskList = new CopyOnWriteArrayList<>(); private static List<Task> taskList = new CopyOnWriteArrayList<>();
private static ConcurrentHashMap<Long, FileObject> fileListMap = new ConcurrentHashMap<>(); 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; private WvpPassiveStorageConfig config;
@ -36,6 +47,11 @@ public class WvpPassiveStorageOperator extends ADeviceStorageOperator {
loadConfig(configJson); loadConfig(configJson);
} }
public static void setRedisTemplate(RedisTemplate<String, String> redisTemplate) {
WvpPassiveStorageOperator.redisTemplate = redisTemplate;
}
public static void onReceiveResult(Long taskId, FileObject fileObject) { public static void onReceiveResult(Long taskId, FileObject fileObject) {
if (fileObject == null) { if (fileObject == null) {
log.info("任务{}获取视频失败!", taskId); log.info("任务{}获取视频失败!", taskId);
@ -72,7 +88,11 @@ public class WvpPassiveStorageOperator extends ADeviceStorageOperator {
} }
task.startTime = startDate; task.startTime = startDate;
task.endTime = endDate; task.endTime = endDate;
if (redisTemplate == null) {
taskList.add(task); 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(); Date taskStartTime = new Date();
while (true) { while (true) {
if (new Date().getTime() - taskStartTime.getTime() > 60000L) { if (new Date().getTime() - taskStartTime.getTime() > 60000L) {
@ -93,6 +113,7 @@ public class WvpPassiveStorageOperator extends ADeviceStorageOperator {
} }
} else { } else {
try { try {
//noinspection BusyWait 得等待
Thread.sleep(1000L); Thread.sleep(1000L);
} catch (InterruptedException e) { } catch (InterruptedException e) {
return Collections.emptyList(); 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 com.ycwl.basic.enums.BizCodeEnum;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
/** /**
* @author songminsgong * @author songminsgong
* @since 2022-11-23 * @since 2022-11-23
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
public class AppException extends RuntimeException { public class AppException extends RuntimeException {

@ -2,11 +2,13 @@ package com.ycwl.basic.exception;
import com.ycwl.basic.enums.BizCodeEnum; import com.ycwl.basic.enums.BizCodeEnum;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
/** /**
* @author wenshijia * @author wenshijia
* @date 2021年05月25日 22:41 * @date 2021年05月25日 22:41
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
public class BizException extends RuntimeException { public class BizException extends RuntimeException {

@ -1,10 +1,8 @@
package com.ycwl.basic.exception; package com.ycwl.basic.exception;
import com.ycwl.basic.aspectj.HttpSaver;
import com.ycwl.basic.enums.BizCodeEnum; 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 com.ycwl.basic.utils.ApiResponse;
import jakarta.servlet.http.HttpServletRequest;
import org.apache.tomcat.util.http.fileupload.impl.SizeLimitExceededException; import org.apache.tomcat.util.http.fileupload.impl.SizeLimitExceededException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -12,14 +10,11 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice; 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 jakarta.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponse; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import java.io.IOException; import java.io.IOException;
import java.util.Enumeration;
import java.util.stream.Collectors;
/** /**
* @date 2022年09月23日 10:19 * @date 2022年09月23日 10:19
@ -58,13 +53,21 @@ public class CustomExceptionHandle {
* 自定义异常统一处理类 * 自定义异常统一处理类
*/ */
@ExceptionHandler(value = BizException.class) @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()); 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) @ExceptionHandler(value =IOException.class)
public ApiResponse<String> handle(IOException e) { public ApiResponse<String> handle(HttpServletResponse response, IOException e) {
LOGGER.error("系统异常 -> {}", e.getMessage(), e); response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
LOGGER.error("IO异常 -> {}", e.getMessage(), e);
return ApiResponse.buildResult(BizCodeEnum.SERVER_UNKONWN_ERROR); return ApiResponse.buildResult(BizCodeEnum.SERVER_UNKONWN_ERROR);
} }
@ -72,7 +75,8 @@ public class CustomExceptionHandle {
* 异常统一返回处理 * 异常统一返回处理
*/ */
@ExceptionHandler(value = Exception.class) @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); LOGGER.error("系统异常 -> {}", e.getMessage(), e);
return ApiResponse.buildResult(BizCodeEnum.SERVER_UNKONWN_ERROR); return ApiResponse.buildResult(BizCodeEnum.SERVER_UNKONWN_ERROR);
} }
@ -81,7 +85,8 @@ public class CustomExceptionHandle {
* 移动端自定义异常统一处理类 * 移动端自定义异常统一处理类
*/ */
@ExceptionHandler(value = AppException.class) @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()); return ApiResponse.buildResponse(appException.getCode(), appException.getMsg());
} }
@ -89,7 +94,8 @@ public class CustomExceptionHandle {
* 移动端自定义异常统一处理类 * 移动端自定义异常统一处理类
*/ */
@ExceptionHandler(value = HttpMessageNotReadableException.class) @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, "请求参数格式错误"); return ApiResponse.buildResponse(500, "请求参数格式错误");
} }

@ -23,14 +23,11 @@ public class FaceBodyFactory {
} }
public static IFaceBodyAdapter getAdapter(FaceBodyAdapterType type) { public static IFaceBodyAdapter getAdapter(FaceBodyAdapterType type) {
switch (type) { return switch (type) {
case ALI: case ALI -> new AliFaceBodyAdapter();
return new AliFaceBodyAdapter(); case BCE -> new BceFaceBodyAdapter();
case BCE: default -> throw new FaceBodyUnsupportedException("不支持的Adapter类型");
return new BceFaceBodyAdapter(); };
default:
throw new FaceBodyUnsupportedException("不支持的Adapter类型");
}
} }

@ -29,6 +29,7 @@ import org.apache.commons.lang3.StringUtils;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -62,33 +63,31 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
} }
private IRateLimiter getLimiter(LOCK_TYPE type) { private IRateLimiter getLimiter(LOCK_TYPE type) {
switch (type) { return switch (type) {
case ADD_DB: case ADD_DB ->
return addDbLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS)); addDbLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
case ADD_ENTITY: case ADD_ENTITY ->
return addEntityLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS)); addEntityLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
case ADD_FACE: case ADD_FACE ->
return addFaceLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS)); addFaceLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
case LIST_DB: case LIST_DB ->
return listDbLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(500, TimeUnit.MILLISECONDS)); listDbLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(500, TimeUnit.MILLISECONDS));
case LIST_FACE: case LIST_FACE -> listFaceLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(2));
return listFaceLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(2)); case SEARCH_FACE ->
case SEARCH_FACE: searchFaceLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(200, TimeUnit.MILLISECONDS));
return searchFaceLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(200, TimeUnit.MILLISECONDS)); case DELETE_DB ->
case DELETE_DB: deleteDbLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
return deleteDbLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS)); case DELETE_ENTITY ->
case DELETE_ENTITY: deleteEntityLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS));
return deleteEntityLimiters.computeIfAbsent(config.getAccessKeyId(), k -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS)); default -> new FixedRateLimiter(600, TimeUnit.MILLISECONDS);
default: };
return new FixedRateLimiter(600, TimeUnit.MILLISECONDS);
}
} }
@Override @Override
public boolean addFaceDb(String dbName) { public boolean addFaceDb(String dbName) {
IRateLimiter addDbLimiter = getLimiter(LOCK_TYPE.ADD_DB); IRateLimiter addDbLimiter = getLimiter(LOCK_TYPE.ADD_DB);
try (ClientWrapper clientWrapper = getClient()) { try (ClientWrapper clientWrapper = getClient()) {
IAcsClient client = clientWrapper.getClient(); IAcsClient client = clientWrapper.client();
CreateFaceDbRequest request = new CreateFaceDbRequest(); CreateFaceDbRequest request = new CreateFaceDbRequest();
request.setName(dbName); request.setName(dbName);
try { try {
@ -109,9 +108,10 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
IRateLimiter deleteEntityLimiter = getLimiter(LOCK_TYPE.DELETE_ENTITY); IRateLimiter deleteEntityLimiter = getLimiter(LOCK_TYPE.DELETE_ENTITY);
IRateLimiter deleteDbLimiter = getLimiter(LOCK_TYPE.DELETE_DB); IRateLimiter deleteDbLimiter = getLimiter(LOCK_TYPE.DELETE_DB);
request.setDbName(dbName); request.setDbName(dbName);
request.setOrder("asc");
request.setLimit(200); request.setLimit(200);
try (ClientWrapper clientWrapper = getClient()) { try (ClientWrapper clientWrapper = getClient()) {
IAcsClient client = clientWrapper.getClient(); IAcsClient client = clientWrapper.client();
while (true) { while (true) {
ListFaceEntitiesResponse response = client.getAcsResponse(request); ListFaceEntitiesResponse response = client.getAcsResponse(request);
if (response.getData().getTotalCount() == 0) { if (response.getData().getTotalCount() == 0) {
@ -150,7 +150,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
public List<String> listFaceDb() { public List<String> listFaceDb() {
ListFaceDbsRequest request = new ListFaceDbsRequest(); ListFaceDbsRequest request = new ListFaceDbsRequest();
try (ClientWrapper clientWrapper = getClient()) { try (ClientWrapper clientWrapper = getClient()) {
IAcsClient client = clientWrapper.getClient(); IAcsClient client = clientWrapper.client();
ListFaceDbsResponse response = client.getAcsResponse(request); ListFaceDbsResponse response = client.getAcsResponse(request);
return response.getData().getDbList().stream().map(ListFaceDbsResponse.Data.DbListItem::getName).collect(Collectors.toList()); return response.getData().getDbList().stream().map(ListFaceDbsResponse.Data.DbListItem::getName).collect(Collectors.toList());
} catch (ClientException e) { } catch (ClientException e) {
@ -167,7 +167,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
request.setDbName(dbName); request.setDbName(dbName);
request.setEntityId(entityId); request.setEntityId(entityId);
try (ClientWrapper clientWrapper = getClient()) { try (ClientWrapper clientWrapper = getClient()) {
IAcsClient client = clientWrapper.getClient(); IAcsClient client = clientWrapper.client();
try { try {
addEntityLimiter.acquire(); addEntityLimiter.acquire();
} catch (InterruptedException ignored) { } catch (InterruptedException ignored) {
@ -206,7 +206,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
request.setDbName(dbName); request.setDbName(dbName);
request.setEntityId(entityId); request.setEntityId(entityId);
try (ClientWrapper clientWrapper = getClient()) { try (ClientWrapper clientWrapper = getClient()) {
IAcsClient client = clientWrapper.getClient(); IAcsClient client = clientWrapper.client();
try { try {
deleteEntityLimiter.acquire(); deleteEntityLimiter.acquire();
} catch (InterruptedException ignored) { } catch (InterruptedException ignored) {
@ -230,16 +230,12 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
if (offset != null) { if (offset != null) {
listFaceEntitiesRequest.setOffset(offset); listFaceEntitiesRequest.setOffset(offset);
} }
if (size != null) { listFaceEntitiesRequest.setLimit(Objects.requireNonNullElse(size, 200));
listFaceEntitiesRequest.setLimit(size);
} else {
listFaceEntitiesRequest.setLimit(200);
}
if (StringUtils.isNotEmpty(prefix)) { if (StringUtils.isNotEmpty(prefix)) {
listFaceEntitiesRequest.setEntityIdPrefix(prefix); listFaceEntitiesRequest.setEntityIdPrefix(prefix);
} }
try (ClientWrapper clientWrapper = getClient()) { try (ClientWrapper clientWrapper = getClient()) {
IAcsClient client = clientWrapper.getClient(); IAcsClient client = clientWrapper.client();
try { try {
listFaceLimiter.acquire(); listFaceLimiter.acquire();
} catch (InterruptedException ignored) { } 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()); return response.getData().getEntities().stream().map(ListFaceEntitiesResponse.Data.Entity::getEntityId).collect(Collectors.toList());
} catch (ClientException e) { } catch (ClientException e) {
log.error("获取人脸数据失败!", e); log.error("获取人脸数据失败!", e);
return null; return Collections.emptyList();
} }
} }
} }
@ -259,7 +255,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
SearchFaceResp resp = new SearchFaceResp(); SearchFaceResp resp = new SearchFaceResp();
IRateLimiter searchFaceLimiter = getLimiter(LOCK_TYPE.SEARCH_FACE); IRateLimiter searchFaceLimiter = getLimiter(LOCK_TYPE.SEARCH_FACE);
try (ClientWrapper clientWrapper = getClient()) { try (ClientWrapper clientWrapper = getClient()) {
IAcsClient client = clientWrapper.getClient(); IAcsClient client = clientWrapper.client();
SearchFaceRequest request = new SearchFaceRequest(); SearchFaceRequest request = new SearchFaceRequest();
request.setDbName(dbName); request.setDbName(dbName);
request.setImageUrl(faceUrl); request.setImageUrl(faceUrl);
@ -275,7 +271,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
resp.setOriginalFaceScore(0f); resp.setOriginalFaceScore(0f);
return resp; return resp;
} }
SearchFaceResponse.Data.MatchListItem matchItem = matchList.get(0); SearchFaceResponse.Data.MatchListItem matchItem = matchList.getFirst();
resp.setOriginalFaceScore(matchItem.getQualitieScore()); resp.setOriginalFaceScore(matchItem.getQualitieScore());
resp.setResult(matchItem.getFaceItems().stream().map(item -> { resp.setResult(matchItem.getFaceItems().stream().map(item -> {
SearchFaceResultItem resultItem = new SearchFaceResultItem(); SearchFaceResultItem resultItem = new SearchFaceResultItem();
@ -286,7 +282,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
return resultItem; return resultItem;
}).collect(Collectors.toList())); }).collect(Collectors.toList()));
if (!resp.getResult().isEmpty()) { if (!resp.getResult().isEmpty()) {
resp.setFirstMatchRate(resp.getResult().get(0).getScore()); resp.setFirstMatchRate(resp.getResult().getFirst().getScore());
} }
return resp; return resp;
} catch (ClientException e) { } catch (ClientException e) {
@ -303,13 +299,7 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
return new ClientWrapper(client); return new ClientWrapper(client);
} }
@Getter public record ClientWrapper(IAcsClient client) implements AutoCloseable {
public static class ClientWrapper implements AutoCloseable {
private final IAcsClient client;
public ClientWrapper(IAcsClient client) {
this.client = client;
}
@Override @Override
public void close() { public void close() {
@ -318,7 +308,6 @@ public class AliFaceBodyAdapter implements IFaceBodyAdapter {
} }
client.shutdown(); client.shutdown();
} }
} }
protected enum LOCK_TYPE { protected enum LOCK_TYPE {
ADD_DB, ADD_DB,

@ -2,13 +2,11 @@ package com.ycwl.basic.facebody.adapter;
import com.baidu.aip.face.AipFace; import com.baidu.aip.face.AipFace;
import com.ycwl.basic.facebody.entity.AddFaceResp; 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.BceFaceBodyConfig;
import com.ycwl.basic.facebody.entity.SearchFaceResp; import com.ycwl.basic.facebody.entity.SearchFaceResp;
import com.ycwl.basic.facebody.entity.SearchFaceResultItem; import com.ycwl.basic.facebody.entity.SearchFaceResultItem;
import com.ycwl.basic.utils.ratelimiter.FixedRateLimiter; import com.ycwl.basic.utils.ratelimiter.FixedRateLimiter;
import com.ycwl.basic.utils.ratelimiter.IRateLimiter; import com.ycwl.basic.utils.ratelimiter.IRateLimiter;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONObject; import org.json.JSONObject;
@ -23,7 +21,6 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
@Slf4j @Slf4j
public class BceFaceBodyAdapter implements IFaceBodyAdapter { public class BceFaceBodyAdapter implements IFaceBodyAdapter {
@ -172,6 +169,9 @@ public class BceFaceBodyAdapter implements IFaceBodyAdapter {
AipFace client = getClient(); AipFace client = getClient();
HashMap<String, String> options = new HashMap<>(); HashMap<String, String> options = new HashMap<>();
List<String> tokenList = listUserFace(dbName, entityId); List<String> tokenList = listUserFace(dbName, entityId);
if (tokenList == null) {
return false;
}
AtomicInteger count = new AtomicInteger(0); AtomicInteger count = new AtomicInteger(0);
tokenList.forEach(faceToken -> { tokenList.forEach(faceToken -> {
try { try {
@ -232,13 +232,19 @@ public class BceFaceBodyAdapter implements IFaceBodyAdapter {
} }
public List<String> listUserFace(String dbName, String entityId) { public List<String> listUserFace(String dbName, String entityId) {
IRateLimiter listFaceLimiter = getLimiter(LOCK_TYPE.LIST_FACE);
try { try {
AipFace client = getClient(); AipFace client = getClient();
HashMap<String, String> options = new HashMap<>(); HashMap<String, String> options = new HashMap<>();
try {
listFaceLimiter.acquire();
} catch (InterruptedException ignored) {
}
JSONObject response = client.faceGetlist(entityId, dbName, options); JSONObject response = client.faceGetlist(entityId, dbName, options);
if (response.getInt("error_code") == 0) { if (response.getInt("error_code") == 0) {
JSONObject resultObj = response.getJSONObject("result"); JSONObject resultObj = response.getJSONObject("result");
if (resultObj != null) { if (resultObj != null) {
try {
JSONArray faceList = resultObj.getJSONArray("face_list"); JSONArray faceList = resultObj.getJSONArray("face_list");
List<String> result = new ArrayList<>(); List<String> result = new ArrayList<>();
for (int i = 0; i < faceList.length(); i++) { for (int i = 0; i < faceList.length(); i++) {
@ -246,16 +252,22 @@ public class BceFaceBodyAdapter implements IFaceBodyAdapter {
result.add(jsonObject.getString("face_token")); result.add(jsonObject.getString("face_token"));
} }
return result; return result;
} else { } catch (Exception e) {
return Collections.emptyList(); return Collections.emptyList();
} }
} else { } else {
log.warn("获取人脸列表失败!{}", response);
return Collections.emptyList(); return Collections.emptyList();
} }
} else if (response.getInt("error_code") == 223103) {
// 用户不存在
return Collections.emptyList();
} else {
log.warn("获取人脸列表失败!{}", response);
return null;
}
} catch (Exception e) { } catch (Exception e) {
log.error("获取人脸列表失败!", e); log.error("获取人脸列表失败!", e);
return Collections.emptyList(); return null;
} }
} }
@ -293,7 +305,7 @@ public class BceFaceBodyAdapter implements IFaceBodyAdapter {
} }
resp.setResult(result); resp.setResult(result);
if (!result.isEmpty()) { if (!result.isEmpty()) {
resp.setFirstMatchRate(result.get(0).getScore()); resp.setFirstMatchRate(result.getFirst().getScore());
} }
return resp; return resp;
} else { } else {
@ -323,26 +335,25 @@ public class BceFaceBodyAdapter implements IFaceBodyAdapter {
} }
private IRateLimiter getLimiter(LOCK_TYPE type) { private IRateLimiter getLimiter(LOCK_TYPE type) {
switch (type) { return switch (type) {
case ADD_DB: case ADD_DB ->
return addDbLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(100, TimeUnit.MILLISECONDS)); addDbLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(105, TimeUnit.MILLISECONDS));
case ADD_FACE: case ADD_FACE ->
return addFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(config.getAddQps())); addFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(config.getAddQps()));
case LIST_DB: case LIST_DB ->
return listDbLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(100, TimeUnit.MILLISECONDS)); listDbLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(105, TimeUnit.MILLISECONDS));
case LIST_FACE: case LIST_FACE ->
return listFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(100, TimeUnit.MILLISECONDS)); listFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(105, TimeUnit.MILLISECONDS));
case SEARCH_FACE: case SEARCH_FACE ->
return searchFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(config.getSearchQps())); searchFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(config.getSearchQps()));
case DELETE_DB: case DELETE_DB ->
return deleteDbLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(100, TimeUnit.MILLISECONDS)); deleteDbLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(105, TimeUnit.MILLISECONDS));
case DELETE_ENTITY: case DELETE_ENTITY ->
return deleteEntityLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(100, TimeUnit.MILLISECONDS)); deleteEntityLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(105, TimeUnit.MILLISECONDS));
case DELETE_FACE: case DELETE_FACE ->
return deleteFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(100, TimeUnit.MILLISECONDS)); deleteFaceLimiters.computeIfAbsent(config.getAppId(), k -> new FixedRateLimiter(105, TimeUnit.MILLISECONDS));
default: default -> new FixedRateLimiter(500, TimeUnit.MILLISECONDS);
return new FixedRateLimiter(500, TimeUnit.MILLISECONDS); };
}
} }
protected enum LOCK_TYPE { 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); return get(type);
} }
public static IOperator get(ImageWatermarkOperatorEnum type) { public static IOperator get(ImageWatermarkOperatorEnum type) {
switch (type) { return switch (type) {
case WATERMARK: case WATERMARK -> new DefaultImageWatermarkOperator();
return new DefaultImageWatermarkOperator(); case NORMAL -> new NormalWatermarkOperator();
case NORMAL: case LEICA -> new LeicaWatermarkOperator();
return new NormalWatermarkOperator(); default -> throw new ImageWatermarkUnsupportedException("不支持的类型" + type.name());
case LEICA: };
return new LeicaWatermarkOperator();
default:
throw new ImageWatermarkUnsupportedException("不支持的类型"+type.name());
}
} }
} }

@ -106,13 +106,13 @@ public class LeicaWatermarkOperator implements IOperator {
int dtLineHeight = datetimeFontMetrics.getHeight(); int dtLineHeight = datetimeFontMetrics.getHeight();
int scenicLineWidth = scenicFontMetrics.stringWidth(info.getScenicLine()); int scenicLineWidth = scenicFontMetrics.stringWidth(info.getScenicLine());
int datetimeLineWidth = scenicFontMetrics.stringWidth(info.getDatetimeLine()); 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.setFont(scenicFont);
g2d.setColor(scenicColor); 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.setFont(datetimeFont);
g2d.setColor(datetimeColor); 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 fileName = info.getWatermarkedFile().getName();
String formatName = "jpg"; // 默认格式为 jpg String formatName = "jpg"; // 默认格式为 jpg
if (fileName.endsWith(".png")) { 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.CheckTokenException;
import com.ycwl.basic.exception.MissTokenException; import com.ycwl.basic.exception.MissTokenException;
import com.ycwl.basic.exception.PermissionException; import com.ycwl.basic.exception.PermissionException;
import com.ycwl.basic.exception.TokenExpireException;
import com.ycwl.basic.model.jwt.JwtInfo; import com.ycwl.basic.model.jwt.JwtInfo;
import com.ycwl.basic.utils.JwtTokenUtil; import com.ycwl.basic.utils.JwtTokenUtil;
import lombok.extern.slf4j.Slf4j; 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.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod; 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 jakarta.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.List; import java.util.List;
@Slf4j @Slf4j
@Component @Component
public class AuthInterceptor extends HandlerInterceptorAdapter { public class AuthInterceptor implements HandlerInterceptor {
@Autowired
JwtTokenUtil jwtTokenUtil;
@Autowired @Autowired
RedisTemplate redisTemplate; RedisTemplate redisTemplate;
@Override @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (!(handler instanceof HandlerMethod)) { if (!(handler instanceof HandlerMethod handlerMethod)) {
return super.preHandle(request, response, handler); return true;
} }
String requestURI = request.getRequestURI(); String requestURI = request.getRequestURI();
HandlerMethod handlerMethod = (HandlerMethod) handler;
// 获取类上面的注解 // 获取类上面的注解
IgnoreToken ignoreClassToken = handlerMethod.getBeanType().getAnnotation(IgnoreToken.class); IgnoreToken ignoreClassToken = handlerMethod.getBeanType().getAnnotation(IgnoreToken.class);
// 获取方法上的注解 // 获取方法上的注解
IgnoreToken ignoreMethodToken = handlerMethod.getMethodAnnotation(IgnoreToken.class); IgnoreToken ignoreMethodToken = handlerMethod.getMethodAnnotation(IgnoreToken.class);
if (ignoreClassToken != null || ignoreMethodToken != null) { if (ignoreClassToken != null || ignoreMethodToken != null) {
// 放行 // 放行
return super.preHandle(request, response, handler); return true;
} }
// 放行白名单 // 放行白名单
@ -120,7 +113,6 @@ public class AuthInterceptor extends HandlerInterceptorAdapter {
@Override @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
BaseContextHandler.remove(); BaseContextHandler.remove();
super.afterCompletion(request, response, handler, ex);
} }
public String getToken(HttpServletRequest request) { public String getToken(HttpServletRequest request) {

@ -30,7 +30,7 @@ public interface DeviceMapper {
DeviceEntity getByDeviceId(Long deviceId); DeviceEntity getByDeviceId(Long deviceId);
List<DeviceRespVO> listByScenicIdWithWVP(Long scenicId); 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); DeviceConfigEntity getConfigByDeviceId(Long deviceId);
int addConfig(DeviceConfigEntity deviceConfigEntity); int addConfig(DeviceConfigEntity deviceConfigEntity);

@ -23,6 +23,7 @@ public interface FaceMapper {
FaceEntity get(Long id); FaceEntity get(Long id);
int add(FaceEntity face); int add(FaceEntity face);
int deleteById(Long id); int deleteById(Long id);
int forceDeleteById(Long id);
int deleteByIds(@Param("list") List<Long> ids); int deleteByIds(@Param("list") List<Long> ids);
int update(FaceEntity face); int update(FaceEntity face);
@ -35,5 +36,5 @@ public interface FaceMapper {
List<FaceRespVO> listByScenicAndUserId(String scenicId, Long userId); List<FaceRespVO> listByScenicAndUserId(String scenicId, Long userId);
List<FaceEntity> listEntityBeforeDate(Long scenicId, Date endDate); List<FaceEntity> listUnpaidEntityBeforeDate(Long scenicId, Date endDate);
} }

@ -27,4 +27,6 @@ public interface FaceSampleMapper {
FaceSampleEntity getEntity(Long faceSampleId); FaceSampleEntity getEntity(Long faceSampleId);
List<FaceSampleEntity> listEntityBeforeDate(Long scenicId, Date endDate); List<FaceSampleEntity> listEntityBeforeDate(Long scenicId, Date endDate);
void updateScore(Long id, Float score);
} }

@ -17,4 +17,6 @@ public interface PriceConfigMapper extends BaseMapper<PriceConfigEntity> {
List<PriceConfigRespVO> listByCondition(@Param("req") PriceConfigListReq req); List<PriceConfigRespVO> listByCondition(@Param("req") PriceConfigListReq req);
PriceConfigEntity getPriceByScenicTypeGoods(Long scenicId, Integer type, String goodsId); PriceConfigEntity getPriceByScenicTypeGoods(Long scenicId, Integer type, String goodsId);
int updateStatus(Integer id);
} }

@ -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.PrintTaskEntity;
import com.ycwl.basic.model.pc.printer.entity.PrinterEntity; 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 com.ycwl.basic.model.printer.resp.PrintTaskResp;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
@ -26,4 +28,26 @@ public interface PrinterMapper {
int updateTaskStatus(@Param("id") Integer id, @Param("status") Integer status); int updateTaskStatus(@Param("id") Integer id, @Param("status") Integer status);
PrintTaskEntity getTaskById(Integer id); 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);
} }

@ -19,4 +19,11 @@ public interface ScenicAccountMapper {
ScenicAccountEntity findAccountById(String id); ScenicAccountEntity findAccountById(String id);
List<ScenicAccountEntity> pageQuery(ScenicAccountReqQuery req); List<ScenicAccountEntity> pageQuery(ScenicAccountReqQuery req);
int addAccountScenicRelation(Long accountId, Long scenicId, int isAdmin);
int deleteRelationByScenicId(Long scenicId);
List<Long> getAccountRelations(Long accountId);
int deleteRelationById(Long accountId);
} }

@ -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); int addRelation(MemberSourceEntity source);
List<SourceRespVO> listUser(SourceReqQuery sourceReqQuery); List<SourceRespVO> listUser(SourceReqQuery sourceReqQuery);
Integer countUser(SourceReqQuery sourceReqQuery);
SourceRespVO listUserOne(Long userId, Long sourceId); SourceRespVO listUserOne(Long userId, Long sourceId);
int addRelations(List<MemberSourceEntity> list); int addRelations(List<MemberSourceEntity> list);
@ -78,4 +79,6 @@ public interface SourceMapper {
List<SourceWatermarkEntity> listSourceWatermark(List<Long> sourceIds, Long faceId, String watermarkType); List<SourceWatermarkEntity> listSourceWatermark(List<Long> sourceIds, Long faceId, String watermarkType);
void addSourceWatermark(Long sourceId, Long faceId, String type, String url); void addSourceWatermark(Long sourceId, Long faceId, String type, String url);
int deleteUselessSource();
} }

@ -2,10 +2,12 @@ package com.ycwl.basic.mapper;
import com.ycwl.basic.model.mobile.statistic.req.CommonQueryReq; 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.req.StatisticsRecordAddReq;
import com.ycwl.basic.model.mobile.statistic.resp.AppStatisticsFunnelVO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
/** /**
@ -93,4 +95,11 @@ public interface StatisticsMapper {
List<Long> getBrokerIdListForUser(Long memberId, Date startTime, Date endTime); List<Long> getBrokerIdListForUser(Long memberId, Date startTime, Date endTime);
Long getUserRecentEnterType(Long memberId, 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);
List<HashMap<String, String>> orderChartByDate(CommonQueryReq query);
List<HashMap<String, String>> orderChartByHour(CommonQueryReq query);
} }

@ -54,5 +54,5 @@ public interface TaskMapper {
List<TaskEntity> listEntity(TaskReqQuery taskReqQuery); 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 deleteNotBuyRelations(Long scenicId, Date endDate);
int deleteNotBuyFaceRelations(Long userId, Long faceId); int deleteNotBuyFaceRelations(Long userId, Long faceId);
int deleteUselessVideo();
} }

@ -6,6 +6,7 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.ToString; import lombok.ToString;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -18,6 +19,7 @@ import java.time.LocalDateTime;
@ToString @ToString
public class JwtInfo implements Serializable { public class JwtInfo implements Serializable {
@Serial
private static final long serialVersionUID = 5452605590172369563L; private static final long serialVersionUID = 5452605590172369563L;
/** /**
@ -42,11 +44,6 @@ public class JwtInfo implements Serializable {
private String phone; private String phone;
/**
* 景区id
*/
private Long scenicId;
/** /**
* 生成 token 的时间 * 生成 token 的时间

@ -3,7 +3,9 @@ package com.ycwl.basic.model.mobile.goods;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
@ -21,14 +23,8 @@ public class GoodsDetailVO {
private Long scenicId; private Long scenicId;
@ApiModelProperty("景区名称") @ApiModelProperty("景区名称")
private String scenicName; private String scenicName;
@ApiModelProperty("经度")
private BigDecimal longitude;
@ApiModelProperty("纬度")
private BigDecimal latitude;
@ApiModelProperty("商品类型 1:成片视频 2:源素材") @ApiModelProperty("商品类型 1:成片视频 2:源素材")
private Integer goodsType; private Integer goodsType;
@ApiModelProperty("源素材类型 1:视频 2:图片")
private Integer sourceType;
@ApiModelProperty("商品id goodsType=1时为videoId,goodsType=2时为sourceId") @ApiModelProperty("商品id goodsType=1时为videoId,goodsType=2时为sourceId")
private Long goodsId; private Long goodsId;
@ApiModelProperty("模版封面图片") @ApiModelProperty("模版封面图片")
@ -44,4 +40,8 @@ public class GoodsDetailVO {
@ApiModelProperty("是否已购买 0否 1是") @ApiModelProperty("是否已购买 0否 1是")
private Integer isBuy; private Integer isBuy;
private Integer isFree; private Integer isFree;
private Integer parts;
public Integer getSourceType() {
return goodsType;
}
} }

@ -19,6 +19,12 @@ public class IsBuyBatchRespVO {
private BigDecimal slashPrice; private BigDecimal slashPrice;
public BigDecimal getPrice() { public BigDecimal getPrice() {
if (origPrice == null) {
return BigDecimal.ZERO;
}
if (couponPrice == null) {
return origPrice;
}
return origPrice.subtract(couponPrice); return origPrice.subtract(couponPrice);
} }
public BigDecimal getDiscountPrice() { public BigDecimal getDiscountPrice() {

@ -18,6 +18,12 @@ public class IsBuyRespVO {
private BigDecimal slashPrice; private BigDecimal slashPrice;
public BigDecimal getPrice() { public BigDecimal getPrice() {
if (origPrice == null) {
return BigDecimal.ZERO;
}
if (couponPrice == null) {
return origPrice;
}
return origPrice.subtract(couponPrice); return origPrice.subtract(couponPrice);
} }
public BigDecimal getDiscountPrice() { public BigDecimal getDiscountPrice() {

@ -4,6 +4,7 @@ import com.ycwl.basic.model.common.BaseQueryParameterReq;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
@ -12,6 +13,7 @@ import java.util.Date;
* @Author:longbinbin * @Author:longbinbin
* @Date:2024/11/29 16:33 * @Date:2024/11/29 16:33
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@ApiModel(value = "移动端订单查询对象") @ApiModel(value = "移动端订单查询对象")
public class OrderAppPageReq extends BaseQueryParameterReq { public class OrderAppPageReq extends BaseQueryParameterReq {

@ -70,7 +70,7 @@ public class ScenicAppVO {
/** /**
* 距离 * 距离
*/ */
@ApiModelProperty("距离") @ApiModelProperty("距离")
private BigDecimal distance; private BigDecimal distance;
/** /**

@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.util.List;
/** /**
* @Author:longbinbin * @Author:longbinbin
* @Date:2024/12/13 9:44 * @Date:2024/12/13 9:44
@ -13,7 +15,7 @@ import lombok.Data;
public class ScenicLoginRespVO { public class ScenicLoginRespVO {
private Long id; private Long id;
@ApiModelProperty("景区id") @ApiModelProperty("景区id")
private Long scenicId; private List<Long> scenicId;
@ApiModelProperty("是否是超级管理员") @ApiModelProperty("是否是超级管理员")
private Integer isSuper; private Integer isSuper;
@ApiModelProperty("账号名称") @ApiModelProperty("账号名称")

@ -18,6 +18,7 @@ public class CommonQueryReq {
private Integer standard; private Integer standard;
@ApiModelProperty(value = "景区id") @ApiModelProperty(value = "景区id")
private Long scenicId; private Long scenicId;
private boolean realtime;
private Date startTime; private Date startTime;
private Date endTime; private Date endTime;
} }

@ -3,6 +3,8 @@ package com.ycwl.basic.model.mobile.statistic.resp;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.math.BigDecimal;
import java.math.RoundingMode;
/** /**
* @Author:longbinbin * @Author:longbinbin
@ -13,49 +15,118 @@ import lombok.Data;
public class AppStatisticsFunnelVO { public class AppStatisticsFunnelVO {
@ApiModelProperty("镜头检测游客数") @ApiModelProperty("镜头检测游客数")
// private Integer cameraShotOfMemberNum; private int cameraShotOfMemberNum; // cs1
private String cameraShotOfMemberNum;
@ApiModelProperty("镜头检测游客数_扫码访问人数_转化率")
private String csom_scaom;
@ApiModelProperty("扫码访问人数") @ApiModelProperty("扫码访问人数")
private Integer scanCodeVisitorOfMemberNum; private int scanCodeVisitorOfMemberNum; // sv1
@ApiModelProperty("扫码访问人数_上传头像人数_转化率")
private String scaom_ufom;
@ApiModelProperty("上传头像(人脸)人数") @ApiModelProperty("上传头像(人脸)人数")
private Integer uploadFaceOfMemberNum; private int uploadFaceOfMemberNum; // u1
@ApiModelProperty("上传头像人数_推送订阅人数_转化率")
private String ufom_pom;
@ApiModelProperty("推送订阅人数") @ApiModelProperty("推送订阅人数")
private Integer pushOfMemberNum; private int pushOfMemberNum; // m1
@ApiModelProperty("推送订阅人数_生成视频人数_转化率")
private String pom_cvom;
@ApiModelProperty("生成视频人数") @ApiModelProperty("生成视频人数")
private Integer completeVideoOfMemberNum; private int completeVideoOfMemberNum; // gv1
@ApiModelProperty("生成视频人数_预览视频人数_转化率")
private String cvom_pvom;
@ApiModelProperty("预览视频人数") @ApiModelProperty("预览视频人数")
private Integer previewVideoOfMemberNum; private int previewVideoOfMemberNum; // pv1
@ApiModelProperty("预览视频人数_点击购买人数_转化率")
private String pvom_cpom;
@ApiModelProperty("点击购买人数") @ApiModelProperty("点击购买人数")
private Integer clickOnPayOfMemberNum; private int clickOnPayOfMemberNum; // cp1
@ApiModelProperty("点击购买人数_支付订单人数_转化率")
private String cpom_pom;
@ApiModelProperty("支付订单人数") @ApiModelProperty("支付订单人数")
private Integer payOfMemberNum; private int payOfMemberNum; // p1
@ApiModelProperty("总访问人数") @ApiModelProperty("总访问人数")
private Integer totalVisitorOfMemberNum; private int totalVisitorOfMemberNum; // v1
@ApiModelProperty("生成视频条数") @ApiModelProperty("生成视频条数")
private Integer completeOfVideoNum; private int completeOfVideoNum; // gv2
@ApiModelProperty("预览视频条数") @ApiModelProperty("预览视频条数")
private Integer previewOfVideoNum; private int previewOfVideoNum; // pv2
@ApiModelProperty("支付订单数") @ApiModelProperty("支付订单数")
private Integer payOfOrderNum; private int payOfOrderNum; // p2
@ApiModelProperty("支付订单金额") @ApiModelProperty("支付订单金额")
private String payOfOrderAmount; private BigDecimal payOfOrderAmount; // o3
@ApiModelProperty("退款订单数") @ApiModelProperty("退款订单数")
private Integer refundOfOrderNum; private int refundOfOrderNum; // ro2
@ApiModelProperty("退款订单金额") @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.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data @Data
@ApiModel(value = "后台管理人员请求VO") @ApiModel(value = "后台管理人员请求VO")
public class AdminUserListReqVO extends BaseQueryParameterReq { public class AdminUserListReqVO extends BaseQueryParameterReq {

@ -5,7 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
@Data @Data
@ApiModel(value = "") @ApiModel()
public class UpdatePasswordReqVO { public class UpdatePasswordReqVO {
@ApiModelProperty(value = "id",hidden = true) @ApiModelProperty(value = "id",hidden = true)
private String id; private String id;

@ -6,6 +6,7 @@ import com.ycwl.basic.model.common.BaseQueryParameterReq;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date; import java.util.Date;
@ -13,6 +14,7 @@ import java.util.Date;
* @Author:longbinbin * @Author:longbinbin
* @Date:2024/12/12 10:00 * @Date:2024/12/12 10:00
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@ApiModel("查询推客记录请求参数") @ApiModel("查询推客记录请求参数")
public class BrokerRecordReqQuery extends BaseQueryParameterReq { 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.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date; import java.util.Date;
@ -12,6 +13,7 @@ import java.util.Date;
* @Author:longbinbin * @Author:longbinbin
* @Date:2024/11/29 14:29 * @Date:2024/11/29 14:29
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@ApiModel("查询推客列表请求参数") @ApiModel("查询推客列表请求参数")
public class BrokerReqQuery extends BaseQueryParameterReq { public class BrokerReqQuery extends BaseQueryParameterReq {

@ -61,4 +61,5 @@ public class DeviceConfigEntity {
private Integer imageFree; private Integer imageFree;
private Integer videoFree; private Integer videoFree;
private Long pairDevice; 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.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date; import java.util.Date;
@ -12,6 +13,7 @@ import java.util.Date;
* @Author:longbinbin * @Author:longbinbin
* @Date:2024/11/29 14:53 * @Date:2024/11/29 14:53
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@ApiModel("设备查询参数") @ApiModel("设备查询参数")
public class DeviceReqQuery extends BaseQueryParameterReq { public class DeviceReqQuery extends BaseQueryParameterReq {

@ -8,6 +8,6 @@ public class DeviceSortRequest {
@ApiModelProperty(value = "被操作模板的ID", required = true) @ApiModelProperty(value = "被操作模板的ID", required = true)
private Long deviceId; private Long deviceId;
@ApiModelProperty(value = "排在其后的模板ID", required = false) @ApiModelProperty(value = "排在其后的模板ID")
private Long afterDeviceId; private Long afterDeviceId;
} }

@ -33,8 +33,6 @@ public class DeviceRespVO {
private Integer online; private Integer online;
private String coverUrl; private String coverUrl;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @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; private Date createAt;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateAt; private Date updateAt;

@ -5,6 +5,7 @@ import com.ycwl.basic.model.common.BaseQueryParameterReq;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
@ -13,6 +14,7 @@ import java.util.Date;
* @Author:longbinbin * @Author:longbinbin
* @Date:2024/11/29 15:16 * @Date:2024/11/29 15:16
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@ApiModel("人脸查询参数") @ApiModel("人脸查询参数")
public class FaceReqQuery extends BaseQueryParameterReq { 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.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date; import java.util.Date;
@ -14,6 +15,7 @@ import java.util.Date;
* @Author:longbinbin * @Author:longbinbin
* @Date:2024/11/29 15:40 * @Date:2024/11/29 15:40
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@ApiModel("人脸样本查询参数") @ApiModel("人脸样本查询参数")
public class FaceSampleReqQuery extends BaseQueryParameterReq { public class FaceSampleReqQuery extends BaseQueryParameterReq {
@ -27,31 +29,6 @@ public class FaceSampleReqQuery extends BaseQueryParameterReq {
*/ */
@ApiModelProperty("来源设备") @ApiModelProperty("来源设备")
private Long deviceId; 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已匹配 * 是否匹配,0未匹配,1已匹配
*/ */
@ -61,4 +38,6 @@ public class FaceSampleReqQuery extends BaseQueryParameterReq {
private Date startTime; private Date startTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date endTime; 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.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date; import java.util.Date;
@ -13,6 +14,7 @@ import java.util.Date;
* @Author:longbinbin * @Author:longbinbin
* @Date:2024/11/29 15:59 * @Date:2024/11/29 15:59
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@ApiModel("查询用户列表请求参数") @ApiModel("查询用户列表请求参数")
public class MemberReqQuery extends BaseQueryParameterReq { 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.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
@ -15,6 +16,7 @@ import java.util.Date;
* @Author:longbinbin * @Author:longbinbin
* @Date:2024/11/29 16:33 * @Date:2024/11/29 16:33
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@ApiModel(value = "订单查询对象") @ApiModel(value = "订单查询对象")
public class OrderReqQuery extends BaseQueryParameterReq { public class OrderReqQuery extends BaseQueryParameterReq {
@ -31,16 +33,6 @@ public class OrderReqQuery extends BaseQueryParameterReq {
*/ */
@ApiModelProperty("微信openId") @ApiModelProperty("微信openId")
private Long openId; private Long openId;
/**
* 价格
*/
@ApiModelProperty("价格")
private BigDecimal price;
/**
* 实际支付价格
*/
@ApiModelProperty("实际支付价格")
private BigDecimal payPrice;
/** /**
* 备注 * 备注
*/ */

@ -1,6 +1,7 @@
package com.ycwl.basic.model.pc.order.resp; package com.ycwl.basic.model.pc.order.resp;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.ycwl.basic.model.mobile.goods.GoodsDetailVO;
import com.ycwl.basic.model.pc.order.entity.OrderItemEntity; import com.ycwl.basic.model.pc.order.entity.OrderItemEntity;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
@ -111,6 +112,7 @@ public class OrderRespVO {
private List<OrderItemVO> orderItemList; private List<OrderItemVO> orderItemList;
private Long scenicId; private Long scenicId;
private String scenicName; private String scenicName;
private List<GoodsDetailVO> goodsList;
public BigDecimal getDiscountPrice() { public BigDecimal getDiscountPrice() {
if (slashPrice == null) { if (slashPrice == null) {

@ -6,22 +6,26 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data; import lombok.Data;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
@Data @Data
@TableName("permission") @TableName("permission")
public class PermissionEntity implements Serializable { public class PermissionEntity implements Serializable {
@Serial
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO) @TableId(value = "id", type = IdType.AUTO)
private Integer id; private Integer id;
@TableField("user_id") @TableField("user_id")
private Long userId; // 确保字段映射 private Long userId;
@TableField("perm_str") @TableField("perm_str")
private String permString; private String permString;
@TableField("menu_str")
private String menuString;
@TableField("create_time") @TableField("create_time")
private Date createTime; private Date createTime;

@ -7,4 +7,5 @@ import java.util.List;
@Data @Data
public class PermissionSaveReq { public class PermissionSaveReq {
private List<String> permissions; private List<String> permissions;
private List<String> menus;
} }

@ -9,4 +9,5 @@ import java.util.List;
@AllArgsConstructor @AllArgsConstructor
public class PermissionResp { public class PermissionResp {
private List<String> permissions; private List<String> permissions;
private List<String> menus;
} }

@ -33,6 +33,7 @@ public class PriceConfigEntity {
* 划线价格 * 划线价格
*/ */
private BigDecimal slashPrice; private BigDecimal slashPrice;
private Integer status;
private Date createTime; private Date createTime;
private Date updateTime; private Date updateTime;
} }

@ -7,4 +7,5 @@ public class PriceConfigListReq {
private Long scenicId; private Long scenicId;
private Integer type; private Integer type;
private Long goodsId; private Long goodsId;
private Integer status;
} }

Some files were not shown because too many files have changed in this diff Show More