Compare commits

...

68 Commits

Author SHA1 Message Date
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
201 changed files with 3335 additions and 2398 deletions

25
pom.xml
View File

@ -5,38 +5,43 @@
<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.1.4</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>
<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>
@ -85,7 +90,7 @@
<dependency> <dependency>
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId> <artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatisplus.boot.starter.version}</version> <version>3.5.5</version>
</dependency> </dependency>
<!-- 引入lombok工具 --> <!-- 引入lombok工具 -->
@ -179,7 +184,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>

View File

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

View File

@ -53,7 +53,7 @@ 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); 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 +77,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 +95,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 +141,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) {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -14,6 +14,7 @@ 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.resp.OrderAppRespVO; import com.ycwl.basic.model.pc.order.resp.OrderAppRespVO;
import com.ycwl.basic.pay.entity.PayResponse;
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;
@ -63,6 +64,11 @@ public class AppOrderController {
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")
@ -97,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);

View File

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

View File

@ -2,9 +2,11 @@ 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;
@ -12,6 +14,7 @@ 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;
@ -21,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;
/** /**
@ -28,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
@ -83,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);
}
} }

View File

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

View File

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

View File

@ -5,10 +5,12 @@ import com.ycwl.basic.annotation.IgnoreToken;
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.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
@ -16,7 +18,8 @@ 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;
@ -41,10 +44,17 @@ public class AppWxPayController {
wxPayService.payNotify(request); wxPayService.payNotify(request);
return ApiResponse.success(BizCodeEnum.REQUEST_OK); return ApiResponse.success(BizCodeEnum.REQUEST_OK);
} }
@PostMapping("/{scenicId}/payNotify")
@RequestMapping("/{scenicId}/payNotify")
@IgnoreToken @IgnoreToken
public ApiResponse<?> payNotifyByScenicId(@PathVariable Long scenicId, HttpServletRequest request) { public Object payNotifyByScenicId(@PathVariable Long scenicId, HttpServletRequest request) {
wxPayService.payNotify(scenicId, request); PayResponse payResponse = wxPayService.payNotify(scenicId, request);
if (payResponse == null) {
return ApiResponse.buildResult(BizCodeEnum.ADVANCE_PAYMENT_CALLBACK_FAILED);
}
if (StringUtils.isNotBlank(payResponse.getCustomResponse())) {
return payResponse.getCustomResponse();
}
return ApiResponse.success(BizCodeEnum.REQUEST_OK); return ApiResponse.success(BizCodeEnum.REQUEST_OK);
} }

View File

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

View File

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

View File

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

View File

@ -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 = "人脸样本管理")

View File

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

View File

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

View File

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

View File

@ -7,8 +7,8 @@ import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
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 javax.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
@ -18,6 +18,7 @@ import java.util.Enumeration;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@Deprecated
@RestController @RestController
public class ProxyController { public class ProxyController {
@IgnoreToken @IgnoreToken

View File

@ -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,6 +12,7 @@ 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;
@ -35,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));
@ -43,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);
} }

View File

@ -52,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,6 +69,7 @@ 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.constant.StorageConstant.VIID_FACE;
@IgnoreToken @IgnoreToken
@RestController @RestController
@ -97,8 +98,8 @@ public class ViidController {
.setNamePrefix("VIID-" + scenicId + "-t") .setNamePrefix("VIID-" + scenicId + "-t")
.build(); .build();
return new ThreadPoolExecutor( return new ThreadPoolExecutor(
4, 4096, 0L, TimeUnit.MILLISECONDS, 4, 1024, 0L, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<>(4096), new ArrayBlockingQueue<>(1024),
threadFactory); threadFactory);
}); });
} }
@ -266,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();
@ -304,7 +305,7 @@ 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(scenicId); ThreadPoolExecutor executor = getExecutor(scenicId);
@ -365,7 +366,7 @@ 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());
@ -379,7 +380,7 @@ public class ViidController {
faceSampleMapper.update(faceSample); faceSampleMapper.update(faceSample);
} }
} }
if (deviceConfig != null && Integer.valueOf(1).equals(deviceConfig.getEnablePreBook())) { if (Integer.valueOf(1).equals(deviceConfig.getEnablePreBook())) {
DynamicTaskGenerator.addTask(faceSample.getId()); DynamicTaskGenerator.addTask(faceSample.getId());
} }
}); });

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,6 +2,7 @@ package com.ycwl.basic.exception;
import com.ycwl.basic.enums.BizCodeEnum; import com.ycwl.basic.enums.BizCodeEnum;
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;
@ -10,7 +11,9 @@ 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 javax.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import java.io.IOException; import java.io.IOException;
/** /**
@ -50,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);
} }
@ -64,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);
} }
@ -73,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());
} }
@ -81,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, "请求参数格式错误");
} }

View File

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

View File

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

View File

@ -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 {
@ -247,6 +244,7 @@ public class BceFaceBodyAdapter implements IFaceBodyAdapter {
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++) {
@ -254,6 +252,9 @@ public class BceFaceBodyAdapter implements IFaceBodyAdapter {
result.add(jsonObject.getString("face_token")); result.add(jsonObject.getString("face_token"));
} }
return result; return result;
} catch (Exception e) {
return Collections.emptyList();
}
} else { } else {
return Collections.emptyList(); return Collections.emptyList();
} }
@ -304,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 {
@ -334,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(105, 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(105, 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(105, 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(105, 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(105, 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(105, 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 {

View File

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

View File

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

View File

@ -7,6 +7,7 @@ import com.ycwl.basic.constant.PermissionConstant;
import com.ycwl.basic.constant.RequestConstant; 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.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;
@ -15,37 +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.util.List; import java.util.List;
@Slf4j @Slf4j
@Component @Component
public class AuthInterceptor extends HandlerInterceptorAdapter { public class AuthInterceptor implements HandlerInterceptor {
@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;
} }
// 放行白名单 // 放行白名单
@ -113,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) {

View File

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

View File

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

View File

@ -0,0 +1,10 @@
package com.ycwl.basic.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ycwl.basic.model.pc.printer.entity.PrintTaskEntity;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface PrintTaskMapper extends BaseMapper<PrintTaskEntity> {
int insertTask(PrintTaskEntity entity);
}

View File

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

View File

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

View File

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

View File

@ -2,6 +2,7 @@ package com.ycwl.basic.mapper;
import com.ycwl.basic.model.mobile.statistic.req.CommonQueryReq; import com.ycwl.basic.model.mobile.statistic.req.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;
@ -93,4 +94,7 @@ 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);
} }

View File

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

View File

@ -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;
/** /**

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -6,12 +6,14 @@ 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)

View File

@ -0,0 +1,25 @@
package com.ycwl.basic.model.pc.printer.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
@Data
@TableName("member_print")
public class MemberPrintEntity {
@TableId(type = IdType.AUTO)
private Integer id;
private Long scenicId;
private Long memberId;
private String origUrl;
private String cropUrl;
private String printUrl;
private Integer printerId;
private Long orderId;
private Integer status;
private Date createTime;
private Date updateTime;
}

View File

@ -3,8 +3,13 @@ package com.ycwl.basic.model.pc.printer.entity;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import java.util.Date; import java.util.Date;
@Data
@TableName("printer") @TableName("printer")
public class PrinterEntity { public class PrinterEntity {
@TableId(type = IdType.AUTO) @TableId(type = IdType.AUTO)
@ -17,24 +22,6 @@ public class PrinterEntity {
private Integer status; private Integer status;
private Date createTime; private Date createTime;
private Date updateTime; private Date updateTime;
private Integer preferW;
// Getters and Setters private Integer preferH;
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
public String getAccessKey() { return accessKey; }
public void setAccessKey(String accessKey) { this.accessKey = accessKey; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Long getScenicId() { return scenicId; }
public void setScenicId(Long scenicId) { this.scenicId = scenicId; }
public String getPrinters() { return printers; }
public void setPrinters(String printers) { this.printers = printers; }
public String getUsePrinter() { return usePrinter; }
public void setUsePrinter(String usePrinter) { this.usePrinter = usePrinter; }
public Integer getStatus() { return status; }
public void setStatus(Integer status) { this.status = status; }
public Date getCreateTime() { return createTime; }
public void setCreateTime(Date createTime) { this.createTime = createTime; }
public Date getUpdateTime() { return updateTime; }
public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; }
} }

View File

@ -0,0 +1,20 @@
package com.ycwl.basic.model.pc.printer.resp;
import lombok.Data;
import java.util.Date;
@Data
public class MemberPrintResp {
private Integer id;
private Long scenicId;
private String scenicName;
private Long memberId;
private String origUrl;
private String cropUrl;
private Integer quantity;
private Integer printerId;
private Long orderId;
private Integer status;
private Date createTime;
}

View File

@ -0,0 +1,19 @@
package com.ycwl.basic.model.pc.printer.resp;
import lombok.Data;
import java.util.Date;
@Data
public class PrinterResp {
private Integer id;
private String accessKey;
private String name;
private Long scenicId;
private String scenicName;
private Integer status;
private Date createTime;
private Date updateTime;
private Integer preferW;
private Integer preferH;
}

View File

@ -2,6 +2,7 @@ package com.ycwl.basic.model.pc.renderWorker.entity;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.ycwl.basic.storage.enums.StorageType;
import lombok.Data; import lombok.Data;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -77,4 +78,12 @@ public class RenderWorkerEntity {
private Date updateAt; private Date updateAt;
/**
* 存储类型
*/
private StorageType storeType;
/**
* 存储配置
*/
private String storeConfigJson;
} }

View File

@ -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.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
@ -15,6 +16,7 @@ import java.util.Date;
* @Date:2024/11/29 17:24 * @Date:2024/11/29 17:24
* 渲染机管理表 * 渲染机管理表
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@ApiModel("渲染机列表查询参数") @ApiModel("渲染机列表查询参数")
public class RenderWorkerReqQuery extends BaseQueryParameterReq { public class RenderWorkerReqQuery extends BaseQueryParameterReq {

View File

@ -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 RoleListReqVO extends BaseQueryParameterReq { public class RoleListReqVO extends BaseQueryParameterReq {

View File

@ -91,4 +91,6 @@ public class ScenicConfigEntity {
private String imageSourcePackHint; private String imageSourcePackHint;
private String videoSourcePackHint; private String videoSourcePackHint;
private String extraNotificationTime;
} }

View File

@ -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.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
@ -15,6 +16,7 @@ import java.util.Date;
* @Date:2024/12/02 10:24 * @Date:2024/12/02 10:24
* 景区管理表 * 景区管理表
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@ApiModel("景区列表查询参数") @ApiModel("景区列表查询参数")
public class ScenicReqQuery extends BaseQueryParameterReq { public class ScenicReqQuery extends BaseQueryParameterReq {

View File

@ -43,6 +43,6 @@ public class ScenicConfigResp {
private Integer userSourceExpireDay; private Integer userSourceExpireDay;
private BigDecimal brokerDirectRate; private BigDecimal brokerDirectRate;
private String imageSourcePackHint; private String imageSourcePackHint = "";
private String videoSourcePackHint; private String videoSourcePackHint = "";
} }

View File

@ -0,0 +1,16 @@
package com.ycwl.basic.model.pc.scenicDeviceStats.entity;
import lombok.Data;
import java.util.Date;
/**
* 景区设备统计实体类
*/
@Data
public class ScenicDeviceStatsEntity {
private Long scenicId;
private Long deviceId;
private Date date;
private Integer count;
}

View File

@ -0,0 +1,11 @@
package com.ycwl.basic.model.pc.scenicDeviceStats.req;
import lombok.Data;
import java.util.Date;
@Data
public class DeviceStatsReq {
private Date startTime;
private Date endTime;
}

View File

@ -0,0 +1,11 @@
package com.ycwl.basic.model.pc.scenicDeviceStats.resp;
import lombok.Data;
import java.util.List;
@Data
public class ScenicDeviceStatsListResp {
private List<ScenicDeviceStatsResp> data;
private boolean realtime;
}

View File

@ -0,0 +1,17 @@
package com.ycwl.basic.model.pc.scenicDeviceStats.resp;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class ScenicDeviceStatsResp {
private Long scenicId;
private String scenicName;
private Long deviceId;
private String deviceName;
private Integer count;
private BigDecimal rate;
}

View File

@ -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.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
@ -15,6 +16,7 @@ import java.util.Date;
* @Date:2024/12/02 11:29 * @Date:2024/12/02 11:29
* 视频源 * 视频源
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@ApiModel(value = "视频源查询对象") @ApiModel(value = "视频源查询对象")
public class SourceReqQuery extends BaseQueryParameterReq { public class SourceReqQuery extends BaseQueryParameterReq {

View File

@ -26,10 +26,6 @@ public class SourceRespVO {
private Long scenicId; private Long scenicId;
@ApiModelProperty("景区名称") @ApiModelProperty("景区名称")
private String scenicName; private String scenicName;
@ApiModelProperty("经度")
private BigDecimal longitude;
@ApiModelProperty("纬度")
private BigDecimal latitude;
/** /**
* 来源设备id * 来源设备id
*/ */
@ -49,6 +45,6 @@ public class SourceRespVO {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime; private Date createTime;
@ApiModelProperty("是否购买:0未购买,1已购买") @ApiModelProperty("是否购买:0未购买,1已购买")
private Integer isBuy; private int isBuy;
private Integer isFree; private int isFree;
} }

View File

@ -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;
@ -14,6 +15,7 @@ import java.util.Date;
* @Date:2024/12/02 14:10 * @Date:2024/12/02 14:10
* 任务列表 * 任务列表
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@ApiModel("任务列表查询参数") @ApiModel("任务列表查询参数")
public class TaskReqQuery extends BaseQueryParameterReq { public class TaskReqQuery extends BaseQueryParameterReq {

View File

@ -7,6 +7,7 @@ import io.swagger.annotations.Api;
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;
@ -16,6 +17,7 @@ import java.util.Date;
* @Date:2024/12/02 14:10 * @Date:2024/12/02 14:10
* 模版 * 模版
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@ApiModel("模版查询请求类") @ApiModel("模版查询请求类")
public class TemplateReqQuery extends BaseQueryParameterReq { public class TemplateReqQuery extends BaseQueryParameterReq {

View File

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

View File

@ -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;
@ -14,6 +15,7 @@ import java.util.Date;
* @Date:2024/12/2 15:28 * @Date:2024/12/2 15:28
* 视频成片 * 视频成片
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@ApiModel("成片查询请求类") @ApiModel("成片查询请求类")
public class VideoReqQuery extends BaseQueryParameterReq { public class VideoReqQuery extends BaseQueryParameterReq {

View File

@ -0,0 +1,10 @@
package com.ycwl.basic.model.printer.req;
import lombok.Data;
import java.util.List;
@Data
public class FromSourceReq {
List<Long> ids;
}

View File

@ -4,6 +4,7 @@ import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
/** /**
@ -20,6 +21,7 @@ public class UniqueId implements Serializable {
* 固定 + 时间戳 + 工作机器ID + 数据中心ID + 序列号 * 固定 + 时间戳 + 工作机器ID + 数据中心ID + 序列号
*/ */
@Serial
private static final long serialVersionUID = 8632670752020316524L; private static final long serialVersionUID = 8632670752020316524L;
/** /**

View File

@ -1,24 +0,0 @@
package com.ycwl.basic.model.wx;
import lombok.Data;
/**
* 微信获取token对象
* @author: chenxi
* @date: 2021/8/5 20:50
*/
@Data
public class WechatAccessTokenVO extends WechatBaseVO{
/**
* 微信access_token,由于微信接口返回数据,此处无法保证驼峰命名
*/
private String access_token;
/**
* 过期时间,单位秒
*/
private Integer expires_in;
}

View File

@ -1,7 +1,6 @@
package com.ycwl.basic.model.wx; package com.ycwl.basic.model.wx;
import cn.hutool.core.date.DateUtil;
import lombok.Data; import lombok.Data;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -16,7 +15,7 @@ import java.util.Date;
*/ */
@Data @Data
@Slf4j @Slf4j
public class WxchatCallbackSuccessData { public class WechatCallbackSuccessData {
/** /**
* 商户订单号 * 商户订单号
@ -58,12 +57,4 @@ public class WxchatCallbackSuccessData {
private BigDecimal totalMoney; private BigDecimal totalMoney;
public Date getSuccessTime() {
return successTime;
}
public void setSuccessTime(String successTime) {
// Hutool工具包的方法自动识别一些常用格式的日期字符串
this.successTime = DateUtil.parse(successTime);
}
} }

View File

@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
/** /**
@ -17,6 +18,7 @@ import java.io.Serializable;
@Accessors(chain = true) @Accessors(chain = true)
public class WxPayRespVO implements Serializable { public class WxPayRespVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private boolean needPay = true; private boolean needPay = true;
/** /**

View File

@ -10,14 +10,11 @@ import java.util.Map;
public class NotifyFactory { public class NotifyFactory {
public static INotifyAdapter get(NotifyType type) { public static INotifyAdapter get(NotifyType type) {
switch (type) { return switch (type) {
case SERVER_CHAN: case SERVER_CHAN -> new ServerChanNotifyAdapter();
return new ServerChanNotifyAdapter(); case WX_MP_SRV -> new WxMpSrvNotifyAdapter();
case WX_MP_SRV: default -> throw new RuntimeException("不支持的通知类型");
return new WxMpSrvNotifyAdapter(); };
default:
throw new RuntimeException("不支持的通知类型");
}
} }
public static INotifyAdapter get(NotifyType type, Map<String, String> config) { public static INotifyAdapter get(NotifyType type, Map<String, String> config) {

View File

@ -1,5 +1,6 @@
package com.ycwl.basic.pay; package com.ycwl.basic.pay;
import com.ycwl.basic.pay.adapter.CongMingPayAdapter;
import com.ycwl.basic.pay.adapter.IPayAdapter; import com.ycwl.basic.pay.adapter.IPayAdapter;
import com.ycwl.basic.pay.adapter.WxMpPayAdapter; import com.ycwl.basic.pay.adapter.WxMpPayAdapter;
import com.ycwl.basic.pay.enums.PayAdapterType; import com.ycwl.basic.pay.enums.PayAdapterType;
@ -8,6 +9,7 @@ import com.ycwl.basic.pay.exceptions.PayUnsupportedException;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Objects;
public class PayFactory { public class PayFactory {
@ -22,12 +24,11 @@ public class PayFactory {
} }
public static IPayAdapter getAdapter(PayAdapterType type) { public static IPayAdapter getAdapter(PayAdapterType type) {
switch (type) { return switch (type) {
case WX_MP_PAY: case WX_MP_PAY -> new WxMpPayAdapter();
return new WxMpPayAdapter(); case CONG_MING_PAY -> new CongMingPayAdapter();
default: default -> throw new PayUnsupportedException("不支持的Adapter类型");
throw new PayUnsupportedException("不支持的Adapter类型"); };
}
} }
protected static Map<String, IPayAdapter> namedAdapter = new HashMap<>(); protected static Map<String, IPayAdapter> namedAdapter = new HashMap<>();

View File

@ -0,0 +1,240 @@
package com.ycwl.basic.pay.adapter;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ycwl.basic.pay.entity.CancelOrderRequest;
import com.ycwl.basic.pay.entity.CongMingPayConfig;
import com.ycwl.basic.pay.entity.CreateOrderRequest;
import com.ycwl.basic.pay.entity.CreateOrderResponse;
import com.ycwl.basic.pay.entity.PayResponse;
import com.ycwl.basic.pay.entity.RefundOrderRequest;
import com.ycwl.basic.pay.entity.RefundOrderResponse;
import com.ycwl.basic.pay.entity.RefundResponse;
import com.ycwl.basic.pay.exceptions.PayException;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class CongMingPayAdapter implements IPayAdapter {
private CongMingPayConfig config;
private static final String MP_PAY_URI = "/api/hFivePay.do";
private static final String QUERY_ORDER_URI = "/api/query.do";
private static final String REFUND_ORDER_URI = "/api/refund.do";
private static final String CANCEL_ORDER_URI = "/api/userCancelOrder.do";
public CongMingPayAdapter() {
}
public CongMingPayAdapter(CongMingPayConfig config) {
this.config = config;
}
@Override
public void loadConfig(Map<String, String> config) {
this.config = new CongMingPayConfig();
this.config.setProgramId(config.get("programId"));
this.config.setShopId(config.get("shopId"));
this.config.setApiKey(config.get("apiKey"));
this.config.setApiHost(config.get("apiHost"));
}
@Override
public CreateOrderResponse createOrder(CreateOrderRequest request) {
CreateOrderResponse resp = new CreateOrderResponse();
if (request.getPrice() <= 0) {
resp.setSkipPay(true);
return resp;
}
String url = config.getApiHost() + MP_PAY_URI;
Map<String, Object> params = new HashMap<>();
params.put("program_id", config.getProgramId());
params.put("shop_id", config.getShopId());
params.put("money", request.getPriceInYuan().toString());
params.put("order_id", request.getOrderNo());
if (StringUtils.isNotBlank(request.getGoodsName())) {
params.put("goods_msg", request.getGoodsName());
}
params.put("device", "AI旅拍");
params.put("notify_url", request.getNotifyUrl());
params.put("s_source", "mini_app");
params.put("sign", parseSign(params, config.getApiKey()));
System.out.println(url);
System.out.println(JSON.toJSONString(params));
String response = HttpUtil.post(url, JSON.toJSONString(params));
JSONObject json = JSONObject.parseObject(response);
System.out.println(json);
if (StringUtils.equals(json.getString("result_code"), "fail")) {
throw new PayException("查询异常!异常提示:" + json.getString("error_msg"));
}
resp.setSkipPay(false);
resp.setSuccess(true);
resp.setOrderNo(json.getString("order_id"));
resp.setExtData(json.toJavaObject(Map.class));
return resp;
}
@Override
public Map<String, Object> getPaymentParams(CreateOrderResponse response) {
Map<String, Object> result = new HashMap<>();
if (response.isSkipPay()) {
result.put("skipPay", true);
return result;
}
if (response.getExtData() == null) {
throw new PayException("查询异常!异常提示:" + "订单信息异常");
}
result.put("payWay", "embeddedApp");
result.put("appId", response.getExtData().get("appid"));
result.put("path", response.getExtData().get("path"));
return result;
}
@Override
public PayResponse handleCallback(HttpServletRequest request) throws IOException {
String moneyStr = request.getParameter("money");
String orderId = request.getParameter("orderId");
String resultCode = request.getParameter("result_code");
PayResponse resp = new PayResponse();
resp.setPayPriceInYuan(new BigDecimal(moneyStr));
resp.setOrderNo(orderId);
if (StringUtils.equalsIgnoreCase("success", resultCode)) {
resp.setState(PayResponse.PAY_STATE.SUCCESS);
} else {
resp.setState(PayResponse.PAY_STATE.FAIL);
}
resp.setCustomResponse("success");
return resp;
}
@Override
public PayResponse queryOrder(String orderNo) {
PayResponse resp = new PayResponse();
String url = config.getApiHost() + QUERY_ORDER_URI;
Map<String, Object> params = new HashMap<>();
params.put("program_id", config.getProgramId());
params.put("shop_id", config.getShopId());
params.put("order_id", orderNo);
params.put("sign", parseSign(params, config.getApiKey()));
String response = HttpUtil.post(url, JSON.toJSONString(params));
JSONObject json = JSONObject.parseObject(response);
System.out.println(json);
if (StringUtils.equals(json.getString("result_code"), "fail")) {
throw new PayException("查询异常!异常提示:" + json.getString("error_msg"));
}
resp.setOriginalResponse(json);
resp.setValid(true);
resp.setOrderPriceInYuan(json.getBigDecimal("pay_ble"));
resp.setPayPriceInYuan(json.getBigDecimal("paid_out"));
resp.setOrderNo(json.getString("order_id"));
switch (json.getString("order_status")) {
case "2":
resp.setState(PayResponse.PAY_STATE.NOT_PAY);
break;
case "1":
resp.setState(PayResponse.PAY_STATE.SUCCESS);
resp.setPayTime(json.getString("time_end"));
break;
case "0":
resp.setState(PayResponse.PAY_STATE.FAIL);
break;
default:
resp.setState(PayResponse.PAY_STATE.CANCEL);
break;
}
return resp;
}
@Override
public RefundOrderResponse refund(RefundOrderRequest request) {
RefundOrderResponse resp = new RefundOrderResponse();
if (request.getPrice() <= 0) {
resp.setSuccess(true);
return resp;
}
String url = config.getApiHost() + REFUND_ORDER_URI;
Map<String, Object> params = new HashMap<>();
params.put("program_id", config.getProgramId());
params.put("shop_id", config.getShopId());
params.put("shop_order_id", request.getOrderNo());
params.put("money", request.getRefundPriceInYuan().toString());
params.put("refund_order_id", request.getRefundNo());
params.put("sign", parseSign(params, config.getApiKey()));
String response = HttpUtil.post(url, JSON.toJSONString(params));
JSONObject json = JSONObject.parseObject(response);
System.out.println(json);
if (StringUtils.equalsIgnoreCase(json.getString("result_code"), "fail")) {
throw new PayException("退款异常!异常提示:" + json.getString("error_msg"));
}
return resp;
}
@Override
public RefundResponse handleRefundCallback(HttpServletRequest request) throws IOException {
String moneyStr = request.getParameter("money");
String orderId = request.getParameter("orderId");
String resultCode = request.getParameter("result_code");
RefundResponse resp = new RefundResponse();
resp.setValid(true);
resp.setRefundPriceInYuan(new BigDecimal(moneyStr));
resp.setOrderNo(orderId);
if (StringUtils.equals("success", resultCode)) {
resp.setSuccess();
} else {
resp.setFail();
}
resp.setCustomResponse("success");
return resp;
}
@Override
public RefundResponse checkRefundStatus(String refundNo) {
return null;
}
@Override
public void cancelOrder(CancelOrderRequest request) {
String url = config.getApiHost() + CANCEL_ORDER_URI;
Map<String, Object> params = new HashMap<>();
params.put("program_id", config.getProgramId());
params.put("shop_id", config.getShopId());
params.put("order_id", request.getOrderNo());
params.put("error_msg", request.getReason());
params.put("sign", parseSign(params, config.getApiKey()));
String response = HttpUtil.post(url, JSON.toJSONString(params));
JSONObject json = JSONObject.parseObject(response);
if (StringUtils.equals(json.getString("result_code"), "fail")) {
throw new PayException("取消订单异常!异常提示:" + json.getString("error_msg"));
}
}
public static String parseSign(Map<String, Object> map, String key) {
Collection<String> keyset = map.keySet();
List<String> list = new ArrayList<>(keyset);
Collections.sort(list);
StringBuilder signStr = new StringBuilder();
for (String key1 : list) {
signStr.append(key1).append("=").append(map.get(key1)).append("&");
}
signStr.append("key=").append(key);
return SecureUtil.md5(signStr.toString()).toUpperCase();
}
}

View File

@ -9,7 +9,7 @@ import com.ycwl.basic.pay.entity.RefundResponse;
import com.ycwl.basic.pay.entity.RefundOrderRequest; import com.ycwl.basic.pay.entity.RefundOrderRequest;
import com.ycwl.basic.pay.entity.RefundOrderResponse; import com.ycwl.basic.pay.entity.RefundOrderResponse;
import javax.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import java.io.IOException; import java.io.IOException;
import java.util.Map; import java.util.Map;

View File

@ -1,7 +1,9 @@
package com.ycwl.basic.pay.adapter; package com.ycwl.basic.pay.adapter;
import cn.hutool.core.codec.Base64;
import com.wechat.pay.java.core.Config; import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig; import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.core.RSAPublicKeyConfig;
import com.wechat.pay.java.core.notification.NotificationConfig; import com.wechat.pay.java.core.notification.NotificationConfig;
import com.wechat.pay.java.core.notification.NotificationParser; import com.wechat.pay.java.core.notification.NotificationParser;
import com.wechat.pay.java.core.notification.RequestParam; import com.wechat.pay.java.core.notification.RequestParam;
@ -30,10 +32,10 @@ import com.ycwl.basic.pay.entity.RefundOrderRequest;
import com.ycwl.basic.pay.entity.RefundOrderResponse; import com.ycwl.basic.pay.entity.RefundOrderResponse;
import com.ycwl.basic.pay.entity.WxMpPayConfig; import com.ycwl.basic.pay.entity.WxMpPayConfig;
import com.ycwl.basic.pay.exceptions.PayWrongConfigException; import com.ycwl.basic.pay.exceptions.PayWrongConfigException;
import org.springframework.util.Base64Utils; import org.apache.commons.lang3.StringUtils;
import javax.servlet.ServletInputStream; import jakarta.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
@ -72,6 +74,8 @@ public class WxMpPayAdapter implements IPayAdapter {
this.config.setAppId(_config.get("appId")); this.config.setAppId(_config.get("appId"));
this.config.setPrivateKey(_config.get("privateKey")); this.config.setPrivateKey(_config.get("privateKey"));
this.config.setSerialNumber(_config.get("serialNumber")); this.config.setSerialNumber(_config.get("serialNumber"));
this.config.setWxPublicKey(_config.get("wxPublicKey"));
this.config.setWxPublicKeyId(_config.get("wxPublicKeyId"));
this.config.setApiV3Key(_config.get("apiV3Key")); this.config.setApiV3Key(_config.get("apiV3Key"));
} }
} }
@ -80,6 +84,16 @@ public class WxMpPayAdapter implements IPayAdapter {
private Config getConfig() { private Config getConfig() {
if (clientConfig == null) { if (clientConfig == null) {
if (StringUtils.isNotBlank(config.getWxPublicKeyId())) {
clientConfig = new RSAPublicKeyConfig.Builder()
.merchantId(config.getMerchantId())
.privateKey(config.getPrivateKey())
.merchantSerialNumber(config.getSerialNumber())
.publicKey(config.getWxPublicKey())
.publicKeyId(config.getWxPublicKeyId())
.apiV3Key(config.getApiV3Key())
.build();
} else {
clientConfig = new RSAAutoCertificateConfig.Builder() clientConfig = new RSAAutoCertificateConfig.Builder()
.merchantId(config.getMerchantId()) .merchantId(config.getMerchantId())
.privateKey(config.getPrivateKey()) .privateKey(config.getPrivateKey())
@ -87,6 +101,7 @@ public class WxMpPayAdapter implements IPayAdapter {
.apiV3Key(config.getApiV3Key()) .apiV3Key(config.getApiV3Key())
.build(); .build();
} }
}
return clientConfig; return clientConfig;
} }
@ -146,7 +161,7 @@ public class WxMpPayAdapter implements IPayAdapter {
@Override @Override
public PayResponse handleCallback(HttpServletRequest request) throws IOException { public PayResponse handleCallback(HttpServletRequest request) throws IOException {
ServletInputStream inputStream = request.getInputStream(); ServletInputStream inputStream = request.getInputStream();
StringBuffer body = new StringBuffer(); StringBuilder body = new StringBuilder();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String s; String s;
// 读取回调请求体 // 读取回调请求体
@ -262,7 +277,7 @@ public class WxMpPayAdapter implements IPayAdapter {
@Override @Override
public RefundResponse handleRefundCallback(HttpServletRequest request) throws IOException { public RefundResponse handleRefundCallback(HttpServletRequest request) throws IOException {
ServletInputStream inputStream = request.getInputStream(); ServletInputStream inputStream = request.getInputStream();
StringBuffer body = new StringBuffer(); StringBuilder body = new StringBuilder();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String s; String s;
// 读取回调请求体 // 读取回调请求体
@ -348,6 +363,6 @@ public class WxMpPayAdapter implements IPayAdapter {
Signature sign = Signature.getInstance("SHA256withRSA"); Signature sign = Signature.getInstance("SHA256withRSA");
sign.initSign(merchantPrivateKey); sign.initSign(merchantPrivateKey);
sign.update(signatureStr.getBytes(StandardCharsets.UTF_8)); sign.update(signatureStr.getBytes(StandardCharsets.UTF_8));
return Base64Utils.encodeToString(sign.sign()); return Base64.encode(sign.sign());
} }
} }

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