Compare commits

...

8 Commits

Author SHA1 Message Date
bce1748768 适配ssl证书 2025-05-26 09:54:44 +08:00
39f397fd70 修改ssl证书配置 2025-05-25 09:00:42 +08:00
e9f6a219c6 添加注解 2025-05-23 20:04:24 +08:00
c5f84d2f05 更新版本 2025-05-14 13:09:50 +08:00
530f0fb620 更新作者和创建时间 2025-05-12 18:42:05 +08:00
30e68a1c6b 更新版本 2025-05-12 15:21:36 +08:00
251e98bb68 校快送2024.12.16.v0.0.7 2024-12-18 14:46:22 +08:00
947b94418b 校快送 2024.12.10 v0.0.6 2024-12-11 14:00:25 +08:00
321 changed files with 6826 additions and 1082 deletions

Binary file not shown.

View File

@ -1,37 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.4</version>
<relativePath/> <!-- lookup parent from repository -->
<version>3.2.5</version>
<relativePath/>
</parent>
<groupId>com.bsz</groupId>
<artifactId>school_send_back_end</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>school_send_back_end</name>
<description>school_send_back_end</description>
<properties>
<java.version>21</java.version>
<java.version>17</java.version>
<spring-ai.version>1.0.0-M2</spring-ai.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
<version>3.5.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
@ -43,99 +51,229 @@
<artifactId>alipay-sdk-java</artifactId>
<version>4.38.0.ALL</version>
</dependency>
<!--hutool-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 阿里云oss依赖 -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
<!--日期工具栏依赖-->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.1</version>
</dependency>
<!-- https://doc.xiaominfo.com/knife4j/documentation/get_start.html-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.3</version>
<version>3.0.3</version> <!-- 推荐稳定版 -->
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.9.21</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.3</version>
</dependency>
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<!-- websocket-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-core</artifactId>
<version>3.5.12</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.109.Final</version>
</dependency>
<dependency>
<groupId>io.projectreactor.netty</groupId>
<artifactId>reactor-netty</artifactId>
<version>1.1.13</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.16</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>sensitive-word</artifactId>
<version>0.23.0</version>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version> <!-- 或使用其他 Jakarta 版本,根据需要 -->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.websocket</groupId>
<artifactId>jakarta.websocket-api</artifactId>
<version>2.1.0</version> <!-- 使用 Jakarta 版本的 WebSocket API -->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.5.0</version> <!-- 或者选择最新的兼容版本 -->
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<dependency>
<groupId>io.swagger.core.v3</groupId>
<artifactId>swagger-core</artifactId>
<version>2.2.20</version>
</dependency>
<!--阿里AI-->
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
<version>1.0.0-M2.1</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring-releases</id>
<url>https://repo.spring.io/release</url>
</repository>
<repository>
<id>knife4j</id>
<url>https://s01.oss.sonatype.org/content/repositories/releases/</url>
</repository>
<repository>
<id>central</id>
<url>https://repo.maven.apache.org/maven2</url>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestone Repository</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.6.4</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>

View File

@ -4,22 +4,22 @@ use school_send;
create table user
(
username varchar(256) null comment '用户昵称',
username varchar(256) null comment '用户昵称',
id bigint auto_increment comment 'id'
primary key,
unionId varchar(256) null comment '支付宝开放平台id',
openId varchar(256) null comment 'openId',
userAccount varchar(256) null comment '账号',
avatarUrl varchar(256) null comment '用户头像',
gender tinyint null comment '性别',
userPassword varchar(512) not null comment '密码',
phone varchar(128) null comment '电话',
email varchar(512) null comment '邮箱',
userStatus int default 0 not null comment '状态 0 -正常',
createTime datetime default CURRENT_TIMESTAMP null comment '创建时间',
updateTime datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP,
isDelete tinyint default 0 not null comment '是否删除',
userRole varchar(256) default 'user' not null comment 'user-普通用户business-商家admin-管理员',
userAccount varchar(256) null comment '账号',
avatarUrl varchar(256) null comment '用户头像',
gender tinyint null comment '性别',
userPassword varchar(512) not null comment '密码',
phone varchar(128) null comment '电话',
email varchar(512) null comment '邮箱',
userStatus int default 0 not null comment '状态 0 -正常',
createTime datetime default CURRENT_TIMESTAMP null comment '创建时间',
updateTime datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP,
isDelete tinyint default 0 not null comment '是否删除',
userRole varchar(256) default 'user' not null comment 'user-普通用户business-商家admin-管理员',
index idx_openId (openId)
) comment '用户' collate = utf8mb4_unicode_ci;
@ -174,12 +174,14 @@ create table if not exists orders
phone varchar(64) not null comment '手机号',
userId bigint not null comment '下单用户id',
businessId bigint not null comment '商家id',
errandId bigint null comment '跑腿id',
location varchar(256) null comment '配送地址',
totalPrice decimal(10, 2) not null comment '订单实际总价',
pickupMethod tinyint not null comment '取餐方式(0堂食 1自提)',
payMethod tinyint not null comment '支付方式0微信支付',
pickupTime datetime null comment '取餐时间',
notes varchar(128) null comment '备注',
state tinyint default 0 not null comment '订单状态:0未支付 1已完成 2已退款 3已取消',
state tinyint default 0 not null comment '订单状态: 0未支付 1已完成 2已退款 3已取消 4已出餐 5已完成',
createTime datetime default CURRENT_TIMESTAMP not null comment '下单时间',
updateTime datetime default CURRENT_TIMESTAMP not null comment '支付时间',
isDelete tinyint default 0 not null comment '是否删除',
@ -221,9 +223,10 @@ create table if not exists cart
) comment '购物车表' collate = utf8mb4_unicode_ci;
create table demo(
id int auto_increment primary key ,
name varchar(30) comment '姓名',
create table demo
(
id int auto_increment primary key,
name varchar(30) comment '姓名',
detail varchar(256) comment '详情'
);
@ -252,23 +255,25 @@ create table private_message
# 收藏表
create table collect
(
id bigint auto_increment comment 'id' primary key ,
userId bigint not null comment '用户id',
id bigint auto_increment comment 'id' primary key,
userId bigint not null comment '用户id',
businessId bigint not null comment '商家id'
) comment '收藏';
# 用户评分表
-- 用户评分表
create table user_rating
(
id bigint auto_increment primary key comment 'id',
businessId bigint not null comment '商家id',
userId bigint not null comment '用户id',
orderId bigint not null comment '订单id',
rating tinyint not null comment '评分',
createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间'
id bigint auto_increment comment 'id' primary key,
ratedEntityId bigint not null comment '评分对象的ID商家 跑腿',
userId bigint not null comment '用户id',
orderId bigint not null comment '订单id',
rating tinyint not null comment '评分',
review varchar(512) null comment '评论',
businessReview varchar(512) null comment '商家回复',
createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间'
) comment '用户评分' collate = utf8mb4_unicode_ci;
# 商家等级表
-- 商家等级表
create table business_level
(
id bigint auto_increment primary key comment 'id',
@ -277,4 +282,110 @@ create table business_level
level tinyint not null comment '等级',
createTime DATETIME default CURRENT_TIMESTAMP comment '创建时间',
updateTime DATETIME default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP comment '更新时间'
)
);
-- 系统信息表
create table if not exists businessInfo
(
id bigint auto_increment comment 'id' primary key,
businessId bigint not null comment '商家id',
content varchar(256) not null comment '功能内容',
createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间'
) comment '系统信息' collate = utf8mb4_unicode_ci;
-- 跑腿表
create table if not exists errand
(
id bigint auto_increment comment 'id' primary key,
userId bigint not null comment '用户id',
errandName varchar(256) not null comment '跑腿姓名',
errandAvatarUrl varchar(256) default 'http://154.8.193.216:9494/system/0/MRiFcIbr-R.jpg' comment '跑腿头像',
gender tinyint not null comment '性别',
phone varchar(128) not null comment '手机号',
distributionScope tinyint not null comment '配送范围',
totalOrders tinyint default 0 not null comment '接单量',
maxOrders tinyint default 15 not null comment '最大接单量',
totalPrice decimal(10, 2) default 0.00 not null comment '总金额',
state tinyint default 0 not null comment '审核状态 0-未审核 1-审核通过',
createTime DATETIME default CURRENT_TIMESTAMP comment '创建时间',
updateTime DATETIME default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP comment '更新时间',
isDelete tinyint default 0 not null comment '是否删除'
) comment '跑腿' collate = utf8mb4_unicode_ci;
-- 跑腿认证表
create table if not exists errand_auth
(
id bigint auto_increment primary key comment 'id',
errandId bigint not null comment '跑腿id',
bankCard varchar(64) not null comment '银行卡号',
frontIdCard varchar(1024) not null comment '身份证正面',
backIdCard varchar(1024) not null comment '身份证反面',
healthCertificate varchar(1024) null comment '健康证',
certificateStartTime datetime null comment '健康证开始时间',
certificateEndTime datetime null comment '健康证结束时间',
createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间',
isDelete tinyint default 0 not null comment '逻辑删除'
) comment '跑腿认证' collate = utf8mb4_unicode_ci;
-- 跑腿等级表
create table if not exists errand_level
(
id bigint auto_increment primary key comment 'id',
errandId bigint not null comment '跑腿Id',
averageScore DECIMAL(3, 2) not null default 0 comment '综合评分',
level tinyint not null comment '等级',
createTime DATETIME default CURRENT_TIMESTAMP comment '创建时间',
updateTime DATETIME default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP comment '更新时间'
) comment '跑腿等级' collate = utf8mb4_unicode_ci;
create table if not exists errand_income
(
id bigint auto_increment primary key comment 'id',
errandId bigint not null comment '跑腿id',
orderId bigint not null comment '订单id',
income decimal(10, 2) default 0 comment '综合评分',
state tinyint default 0 not null comment '0未结算 1已结算 2已提现',
createTime datetime default CURRENT_TIMESTAMP comment '创建时间'
) comment '跑腿收入' collate = utf8mb4_unicode_ci;
create table if not exists errand_order
(
id bigint auto_increment primary key comment 'id',
orderId bigint not null comment '订单ID',
errandState tinyint default 0 null comment '跑腿状态: 0无跑腿 1待抢单 2待取货 3待送达 4已送达 5再次抢单',
startTime datetime null comment '送餐开始时间',
endTime datetime null comment '送餐结束时间',
errandId bigint null comment '跑腿员ID',
createTime datetime default current_timestamp not null comment '任务创建时间',
updateTime datetime default current_timestamp not null on update current_timestamp comment '任务更新时间',
isDelete tinyint default 0 not null comment '是否删除'
) comment '跑腿任务表' collate = utf8mb4_unicode_ci;
create table if not exists order_image
(
orderId bigint auto_increment primary key comment 'id',
imageAddress varchar(256) not null comment '外卖地址'
) comment '外卖图片' collate = utf8mb4_unicode_ci;
create table if not exists errand_bill
(
id bigint auto_increment primary key comment 'id',
orderId bigint not null comment '订单Id',
userPhone varchar(128) not null comment '用户手机号',
income decimal(3, 2) default 0 comment '综合评分',
errandState tinyint default 0 comment '收入状态0-待结算 1-已结算',
orderStartTime Date not null comment '订单创建时间'
) comment '跑腿账单表' collate = utf8mb4_unicode_ci;
create table order_refunds (
id bigint auto_increment primary key comment '退款申请ID',
orderId bigint not null unique comment '订单号,唯一标识',
userId bigint not null comment '用户ID',
reason varchar(255) default null comment '退款原因',
amount decimal(10,2) not null comment '退款金额',
status tinyint not null default 0 comment '退款状态0-待审核, 1-已同意, 2-已拒绝',
createTime timestamp default current_timestamp comment '申请时间',
updateTime timestamp default current_timestamp on update current_timestamp comment '更新时间',
index idx_order_id (orderId),
index idx_user_id (userId)
) comment='退款申请表' collate = utf8mb4_unicode_ci;

View File

@ -1,9 +1,13 @@
package com.bsz.school_send_back_end;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.filter.ForwardedHeaderFilter;
@MapperScan("com.bsz.school_send_back_end.mapper")
@ -14,4 +18,14 @@ public class UserCenterApplication {
public static void main(String[] args) {
SpringApplication.run(UserCenterApplication.class, args);
}
@Bean
public ChatMemory chatMemory(){
return new InMemoryChatMemory();
}
@Bean
public ForwardedHeaderFilter forwardedHeaderFilter() {
return new ForwardedHeaderFilter();
}
}

View File

@ -15,8 +15,9 @@ import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import java.util.Arrays;
/**
* 权限校验 AOP
@ -33,9 +34,15 @@ public class AuthInterceptor {
*/
@Around("@annotation(authCheck)")
public Object doInterceptor(ProceedingJoinPoint joinPoint, AuthCheck authCheck) throws Throwable {
String mustRole = authCheck.mustRole();
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
String uri = request.getRequestURI();
// 如果是 Swagger OpenAPI 相关请求直接放行
if (uri.startsWith("/v3/api-docs") || uri.contains("/swagger") || uri.contains("/swagger-ui")) {
return joinPoint.proceed(); // 直接放行
}
// 当前登录用户
User loginUser = userService.getLoginUser(request);
// 必须有该权限才通过
@ -62,13 +69,23 @@ public class AuthInterceptor {
}
// 必须有商家或管理员权限
if (UserRoleEnum.BUSINESS.equals(mustUserRoleEnum)) {
if (!mustRole.equals(userRole)
&& !UserConstant.ADMIN_ROLE.equals(userRole)
&&!UserConstant.BOSS_ROLE.equals(userRole)) {
if (!Arrays.asList(mustRole, UserConstant.ADMIN_ROLE, UserConstant.BOSS_ROLE).contains(userRole)) {
throw new BusinessException(ErrorCode.NO_AUTH);
}
}
//
if (UserRoleEnum.ERRAND.equals(mustUserRoleEnum)) {
if (!Arrays.asList(mustRole, UserConstant.ADMIN_ROLE, UserConstant.BOSS_ROLE).contains(userRole)) {
throw new BusinessException(ErrorCode.NO_AUTH);
}
}
if (UserRoleEnum.USER.equals(mustUserRoleEnum)) {
if (!Arrays.asList(mustRole, UserConstant.ADMIN_ROLE, UserConstant.BOSS_ROLE).contains(userRole)) {
throw new BusinessException(ErrorCode.NO_AUTH);
}
}
// 通过权限校验放行
return joinPoint.proceed();
}

View File

@ -19,8 +19,8 @@ import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
/**
* 日志AOP
@ -41,12 +41,18 @@ public class SystemLogInterceptor {
*/
@Around("@annotation(systemLog)")
public Object doInterceptor(ProceedingJoinPoint joinPoint, SystemLog systemLog) throws Throwable {
// 获取执行操作
String executeStep = systemLog.executeStep();
ThrowUtils.throwIf(StringUtils.isEmpty(executeStep), ErrorCode.PARAMS_ERROR);
//获取请求
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
HttpServletRequest httpServletRequest = ((ServletRequestAttributes) requestAttributes).getRequest();
String uri = httpServletRequest.getRequestURI();
// 如果是 Swagger OpenAPI 相关请求直接放行
if (uri.startsWith("/v3/api-docs") || uri.contains("/swagger") || uri.contains("/swagger-ui")) {
return joinPoint.proceed(); // 直接放行
}
//获取登录用户
User loginUser = userService.getLoginUser(httpServletRequest);
//写入系统日志

View File

@ -1,31 +1,24 @@
package com.bsz.school_send_back_end.common;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
/**
*通用返回类
*
* @author bsz
*/
@Data
@Schema(description = "通用返回对象")
public class BaseResponse<T> implements Serializable {
/**
* 状态码
*/
@Schema(description = "状态码例如200 表示成功")
private int code;
/**
* 数据
*/
@Schema(description = "返回的数据内容")
private T data;
/**
* 消息
*/
@Schema(description = "提示消息")
private String message;
/**
* 描述
*/
@Schema(description = "错误描述")
private String description;
public BaseResponse(int code, T data, String message, String description) {

View File

@ -0,0 +1,66 @@
package com.bsz.school_send_back_end.config;
import com.bsz.school_send_back_end.model.domain.Dishes;
import com.bsz.school_send_back_end.model.domain.Orders;
import com.bsz.school_send_back_end.model.vo.BusinessVO;
import com.bsz.school_send_back_end.service.BusinessService;
import com.bsz.school_send_back_end.service.DishesService;
import com.bsz.school_send_back_end.service.LoggingService;
import com.bsz.school_send_back_end.service.OrdersService;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.PromptChatMemoryAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Description;
import java.util.List;
import java.util.function.Function;
@Configuration
public class AIConfig {
@Resource
private BusinessService businessService;
@Resource
private DishesService dishesService;
@Resource
private OrdersService ordersService;
@Bean
ChatClient chatClient(ChatClient.Builder builder, ChatMemory chatMemory) {
return builder.defaultSystem(
"""
你是食刻必达校快送小程序的助手情谊轻松切愉快的语气与用户交流
你可以给用户推荐一些商家和菜品
今天的日期是{current_date}
请讲中文
"""
)
.defaultAdvisors(
new PromptChatMemoryAdvisor(chatMemory),
new LoggingService()
)
.defaultFunctions("getBusinessByAI")
.build();
}
@Bean
@Description("推荐商家")
public Function<Void, List<BusinessVO>> getBusinessByAI() {
List<BusinessVO> allBusiness = businessService.findAllBusiness();
return unused -> allBusiness.stream()
.filter(businessVO -> businessVO.getLevel() == 5)
.toList();
}
// @Bean
// @Description("推荐菜品")
// public Function<Void, List<Dishes>> getDishesByAI() {
// new LocalTime
// }
}

View File

@ -3,7 +3,7 @@ package com.bsz.school_send_back_end.config;
import com.alipay.api.internal.util.AlipaySignature;
import org.springframework.context.annotation.Configuration;
import javax.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

View File

@ -0,0 +1,39 @@
package com.bsz.school_send_back_end.config;
import com.alipay.api.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
public class AlipayClients {
//appid
public String appId = "2021004151684053";
//私钥
//沙箱公钥 支付宝公钥
// public String PublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3JKMG3clg/1MqewlIK/koEhiQiSLagckb/2/Dyvg+rJ2snGiAgzNvhvvc1GdVC+Xnn/P+U+2tAytyuvbOuhmGgNZjeObczJXpo/0D6LBdYDrg4PVMDxpStCxLUpaShHbc/l/IquaorBwd94UJxIPAbUQkUBCbo94mGbhDX+yU4FQ6k1yeUtn03jvZ3AY0BEHpenCxWKgr5S/CUAYEitMbi/r7extBy6f4FCR120NM7VaNEK1xpHbGHo6rDpyiAOR1lWFuiqOJ1hv14UL/SfOLlzvUZiiPysIxdNjycZyiyRvFRHP3n8GBAaJDm9vVHwDfgQ5s3Ig2ggBeYXkFHZqWwIDAQAB";
public String PublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1WYUUWEH+kW2pdYoBJa6j5G3iWe3uL/3L1QXPenzrp/NC1M9W/yvniJnAiYR4pdopZmlWfEm7FpHxbLaxxcXe0jTkspq9vv9vDldyXgKr13QZBJu4hD3w4QZNa+85paANXkfcVKXCpIh6sWTaW78lBE5p7Q0M6O26OCj/K3iPD7x4+KagqS5w9YYS8AXlQdsZPBh99bO3+KuQzcK4o4bFGI+ut4HLvd2IxdF5LwfjucloN6SRbU06vsDtpjtA+Oeoet5Y0CNfkpgbh7wvvNIbM6XEqMtfKCzevPaqRxwrFkS8WUQTMOaQbJXATbPQDt7MoWGujFd37lYz7ESQZed2wIDAQAB";
//公钥appPrivateKey
//沙箱私钥 支付宝私钥
// public String appPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCc1rWOaCHl7KnDDMctWIgFJqerq9ZU8QsxSA+wQC4nrTfoQVSVZn8fDNosilCHda7yv910A9aJYqZKx0+NOXY9YvMbKYifWtO8TtzAQ9Q0EQXce85gnVQ3yn9evE1MVwfmMIiXJ2jx/dmGrxuADrLcsNB/U4xsusKcNQaA76vALtAYTnKwOODaDt5Qd2OC25PRcGtKupKIbir/f62tNquBkCX+Z5URBpy0rZY2hCu30v3uPv8I3OlpxegFwNDHpKMIY3+wjQtqsogQTn20E5wzeV3VNabNxbORq6B6nh8mvxlo9q14XvmMJDPUoWiJgyUUpaAPZFWSpRCrLvWQY/klAgMBAAECggEAZJ/Ahig7L2gClriZBXfadOuTAapS7dZkpu6j2iGjOyOATgu0N9I11vcI9zCab/5KC0abzzYzK5vWMv3jBSmLueDFNnUUSaEdXaB/Mv+RowIU75ujEgt+n/jUdTR8p3DjCYWz7L6FL1T9fdLU4vkLOlpauoYg/xVnjI7cqFacq8SWr3jiGj/I31O18y02/eDiyAb5RMlSlNGnzvDuRwJ3h2Sn1u7znbMCi6CydG3hx+I0GE2iJqVPymc1f0T0vm7Jy3l/zL84oNKLTgPCqG9k+eriC7RaMkbvPQFjWCDCuWxgYM2pi1L9ZDG+FkReTFsZw6r/TWc4sl2xtj3GDSrHYQKBgQD1NwFBMQwsUQ/aJP63R0gILWSFR0+yQ314vfRRVKoZTujbQr7RBAzgQff97DirINIxXCBeV0zifpc2IaAPaY29YjDnQU+xGqIO91EWPjMkQ6XUvGGesKnKDYkA5yBMyD3/BH8BwJruidW2DwtC2rGTW1hatkXNtYccEI79/00UOQKBgQCjvKIySZdRolOYUfSPHHipOygWClFy1DlI54XDnj0gRBoOrFkeqrXr+G8dYeXP6UnMqLWX8V3RuEJB8klwKGLkMtUWdqMQUFM5yvjuX2d1Y9R2ESw0ch70B/6aItMVv6aN4GjGwCJWD1XD54IpWxtAKJsUxbDiN+343cVqSQQETQKBgQDq9JBcMa3TTLyerbHuVPt88lmNpr2DNk2kAoZ142S0qTpO1M5XIcVgn3UKNWw69FDSgM529rkxkFA8ys0910q7erkW7Cp6rOU459onMOP5zGO5yeLTlbyqYHu0hMEbMQbOMjWrrSwGgcVnE1Ub8sYRRoYLLPkHWPcjee45C4WEaQKBgHkUUeDb+JD+d9DIsg9uH3ANdcwunyJJ+36E7q7EgjEtCxPUsSZzWIoBsbFJppbDzbYRABA3BYjDOAPqNhJBWzeiu16cJmM28wRmqwQi+q+dPgx9EHJL/cW5b7XtkKihi3mY/AIVLI71UhfHR8JrQ9CC9oM62V2/vDNvU8AP9G91AoGANdvRubukeWgvWryBTaPuUTpjkP1mOuJuHiHEW5/XePsURwS6gGP/qJ9bSbhYhQ6iDaMOQ8vahfYM3Q4jvDxgcKS/N1fxFTohcN4bVdvekq62YdTNqcGhNzaxMNboFZYt2dPeDm8PRRMP+abddrS2NqgVSOC3Ru5Kh9iRIs2LOgE=";
public String appPrivateKey ="MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCOoaURczOevheVDeG9tmdCZ+PSInYwCY+ak3Jcy5CG4wrbHHy30ejMv5jNnyX/iSyC3MYIfHQ2I5uxh7pO3QSiB8GpeM9Oy3bUCOtPVM8o7FJ+/pa6o0s25jmj+Lx6/Q4sAaDxhQPY8vUZdIitQyqNS4IVhDuIWAS1w3ngZWHhcbtCPrCk3wIJPCYbhHi8eTgCXTJ0TbJ/QR+Pj0SAiL46rwSRc9KB1alxL5RoTK4VWvdHlqbfowen6teQ6bo2W5UkUEP8kew6MH9a3QQZ3YdLKFHufSGMWk19Wh26CEsvnf/Mb6dnv6YzbmzZLtCHiKKvFN516peW8Exd9/EtJCu1AgMBAAECggEAPghReVhoL/cu3HXQIylsmXYDoIW6b0QJP8o25+Lk9bVTKF6oY24Y2MvPkkZQSWYIhNWuD0zJYi50bW7BecEoXawP7zwKtZNKGAfVB4i0HHFDo9XoCj4w3SyeDxGEL91VR5Bhxgj61mU8chi7xNc8b31SkzcSiUb2rXLZ091kB58/xtzQk2nZAhKhwms7gbX7qxm8+TWLRK9g4vWmsGVqbgFNj/sutqBURSeU/pHmW9PMqgcWvx6AwWWi+VgBUSoIgMnX7r7s6ZlgeDIgioii3JdCcr1nq39sVYPwFpwIe7a1DOCB58B+v2un1XoThC7ZNEcbwP5oYpUdFhSoxClrNQKBgQDJc/A1nz2yYiLUHUMJn2DhyTrOnCSclmowuzJVkyuo5gQPfZ3dTmjdPkM/fg09J3+zi3UCSwZd6dGMzJVHWooMniSiomZ/rY+o9SVTAJOjxt29N8jFN92b3fB43hbAWyBOuy4NMZMcr+4cADuqRHz2pKAeaALiZdpTbrTCzVXtqwKBgQC1QGS0sv8VU9fyBCyrYU4kQh8Fcvz0g6ObgUnHZi6UIL+Cy0/3JIGeIyvB/n47RF1wLUz4wykwW70e1qlMz7w21HM+DB8fVuzbO7SmQI3gDo024kQkWWGUhe3/w9ztzLF9ezleSN6wnrPeDbeMV+pURbsxIXA9xg7DYpZZ76ksHwKBgHQnF/oi7bTbpo88q/lxXq/wkaqtFuL+Sw378UKsD4Fb1j2ERTBj1Ey0aJvENyfqjVPddcKztWESvtL65pt0laI+0IrBLm4xiWJ2rmWUMIw+zn0aG/Wyh2Emb0+RZfbU0+TxQdUzn0nsGlMkw0IiKRcgxn2hpQAaj+6JJ0omkIPvAoGAZ2eGTKT17Cf6QgNprJiF6R+j7QruD11uoJABFHZSSoXoXGk7hMbZ/+sW0sUrJQrat93QVPeabxFXctmKmtzFBw7rdFGcC9gepvCIHnUju9jxbYdm0sn/ZqmF323RhAVMmUcMsqKmEWNpQFzZA4NAl7V0lxH5o/RzhbqgBk05WYcCgYEAny/umQs7+NYgwL/FztMJVljfQsGY81mhgrQyPhmg/7NiWmLodJtwQgSj3UitDVtUGhZRnuidO8P1XW0sUyDwc8xMLb+0qVxX4gMpM4J1B0UaIp+oPg7hCXeFGxkWQl8bPY0RFa3GOfT2/D63NpXqYw8Fe1lZWoIMz+PBdx0YN90=";
//应用证书
private String appCertPath;
//支付宝证书
private String alipayCertPath;
//支付宝根证书
private String alipayRootCertPath;
//回调地址
private String notify;
//字符集 签名
private String gateway = "https://openapi.alipay.com/gateway.do";
// 公私钥模式
@Bean
public AlipayClient alipayClient() throws AlipayApiException {
AlipayClient client = new DefaultAlipayClient(this.gateway, this.appId, this.appPrivateKey, AlipayConstants.FORMAT_JSON, AlipayConstants.CHARSET_UTF8, PublicKey, AlipayConstants.SIGN_TYPE_RSA2);
return client;
}
}

View File

@ -0,0 +1,25 @@
package com.bsz.school_send_back_end.config;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
/**
* @author xy
* Springdoc OpenAPI 配置
*
* http://localhost:6448/swagger-ui/index.html 接口文档地址
*/
@Configuration
@Profile({"dev", "test"}) // 版本控制访问
public class Knife4jConfig {
@Bean
public GroupedOpenApi defaultApi() {
return GroupedOpenApi.builder()
.group("xiaokuaisong")
.packagesToScan("com.bsz.school_send_back_end.controller") // 指定扫描的包路径
.build();
}
}

View File

@ -0,0 +1,98 @@
package com.bsz.school_send_back_end.config;
import com.bsz.school_send_back_end.contant.RabbitMQConstant;
import org.springframework.amqp.core.*;
import org.springframework.amqp.support.converter.DefaultClassMapper;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class RabbitMQConfig {
@Bean
public Queue topicQueue1() {
return QueueBuilder.durable(RabbitMQConstant.TOPIC_QUEUE1).build();
}
@Bean
public Queue topicQueue2() {
return QueueBuilder.durable(RabbitMQConstant.TOPIC_QUEUE2).build();
}
@Bean
public Queue orderReplyQueue() {
return QueueBuilder.durable(RabbitMQConstant.ORDER_REPLY_QUEUE).build();
}
@Bean
public Exchange topicExchange() {
return ExchangeBuilder.topicExchange(RabbitMQConstant.TOPIC_EXCHANGE).build();
}
@Bean
public Exchange responseExchange() {
return ExchangeBuilder.topicExchange(RabbitMQConstant.RESPONSE_EXCHANGE).build();
}
@Bean
public Binding topicBinding1() {
return BindingBuilder.bind(topicQueue1()).to(topicExchange()).with("topic.key1").noargs();
}
@Bean
public Binding topicBinding2() {
return BindingBuilder.bind(topicQueue2()).to(topicExchange()).with("topic.#").noargs();
}
@Bean
public Binding responseBinding() {
return BindingBuilder.bind(orderReplyQueue()).to(responseExchange()).with("response.#").noargs();
}
// /**
// * 声明一个 **延迟交换机**类型必须为 `x-delayed-message`
// */
// @Bean
// public CustomExchange delayedExchange() {
// Map<String, Object> args = new HashMap<>();
// args.put("x-delayed-type", "direct"); // 交换机类型
// return new CustomExchange(RabbitMQConstant.DELAYED_EXCHANGE, "x-delayed-message", true, false, args);
// }
//
// /**
// * 声明队列
// */
// @Bean
// public Queue delayedQueue() {
// return new Queue(RabbitMQConstant.DELAYED_QUEUE, true);
// }
//
// /**
// * 绑定队列到延迟交换机
// */
// @Bean
// public Binding binding(Queue delayedQueue, CustomExchange delayedExchange) {
// return BindingBuilder.bind(delayedQueue).to(delayedExchange).with(RabbitMQConstant.DELAYED_ROUTING_KEY).noargs();
// }
@Bean
public MessageConverter jsonToMapMessageConverter() {
DefaultClassMapper defaultClassMapper = new DefaultClassMapper();
defaultClassMapper.setTrustedPackages("com.bsz.school_send_back_end.utils.MultiDelayMessage"); // trusted packages
Jackson2JsonMessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter();
jackson2JsonMessageConverter.setClassMapper(defaultClassMapper);
return jackson2JsonMessageConverter;
}
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}

View File

@ -0,0 +1,16 @@
package com.bsz.school_send_back_end.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties(prefix = "spring.rabbitmq")
@Data
public class RabbitMQConfigProperties {
private String host;
private int port;
private String username;
private String password;
private String virtualHost;
}

View File

@ -0,0 +1,30 @@
package com.bsz.school_send_back_end.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisSessionRepositoryConfig {
@Bean("springSessionRedisSerializer")
public RedisSerializer<Object> getRedisSerializer()
{
return new GenericJackson2JsonRedisSerializer();
}
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate redisTemplate = new RedisTemplate<>();
//设置redis的连接工厂对象
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置redis key的序列化器
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
return redisTemplate;
}
}

View File

@ -14,7 +14,7 @@ public interface FileConstant {
/**
* 服务器访问地址
*/
String SERVER_HOST = "154.8.193.216:9494";
String SERVER_HOST = "https://xiaoshitong.xyz";
/**
* 服务器上传路径

View File

@ -0,0 +1,84 @@
package com.bsz.school_send_back_end.contant;
import java.util.List;
public interface RabbitMQConstant {
/**
* 聊天
*/
String TOPIC_QUEUE1 = "topic.chat";
/**
* 商家
*/
String TOPIC_QUEUE2 = "topic.order";
/**
* 跑腿
*/
String TOPIC_QUEUE3 = "topic.errand";
/**
* 交换机
*/
String TOPIC_EXCHANGE = "topicExchage";
/**
* 请求响应交换机用于处理用户和商家之间的异步响应
*/
String RESPONSE_EXCHANGE = "responseExchange";
/**
* 订单响应队列商家处理完成订单后可以发送响应消息到这个队列
*/
String ORDER_REPLY_QUEUE = "orderReplyQueue";
// // 交换机名称
// String DELAYED_EXCHANGE = "delayed.exchange";
// // 队列名称
// String DELAYED_QUEUE = "delayed.queue";
// // 路由键
// String DELAYED_ROUTING_KEY = "delayed.routingKey";
// List<Long> DELAY_MILLIS = List.of(10000L, 10000L, 10000L, 15000L, 15000L, 30000L, 30000L, 60000L, 60000L, 120000L, 300000L, 600000L, 600000L));
// 堂食订单取消3分钟
List<Long> DINE_IN_DELAY_MILLIS = List.of(30000L, 30000L, 30000L, 30000L, 30000L, 30000L);
// 外卖订单退款30分钟多次检查
List<Long> DELIVERY_DELAY_MILLIS = List.of(600000L, 1200000L, 1800000L);
// 取消订单相关常量
String CANCEL_ORDER_EXCHANGE = "cancel_order_exchange"; // 取消订单交换机
String CANCEL_ORDER_QUEUE = "cancel_order_queue"; // 取消订单队列
String CANCEL_ORDER_ROUTING_KEY = "cancel_order_key"; // 取消订单路由键
// 外卖单相关常量
String DELIVERY_DELAY_EXCHANGE = "delivery_exchange"; // 外卖单交换机
String DELIVERY_ORDER_QUEUE = "delivery_queue"; // 外卖单队列
String DELIVERY_ORDER_ROUTING_KEY = "delivery_key"; // 外卖单路由键
// String DELAY_COUPON_QUEUE = "coupon.delay.queue";
//
// String DELAY_COUPON_ROUTING_KEY = "coupon.key";
//
// String DELAY_USER_COUPON_QUEUE = "userCoupon.delay.queue";
//
// String DELAY_USER_COUPON_ROUTING_KEY = "userCoupon.key";
//
// String DELAY_ADVANCE_ORDER_QUEUE = "advanceOrder.delay.queue";
//
// String DELAY_ADVANCE_ROUTING_KEY = "advanceOrder.key";
//
// String DELAY_CLOTHES_RENT_ORDER_QUEUE = "clothesRentOrder.delay.queue";
//
// String DELAY_CLOTHES_RENT_ORDER_ROUTING_KEY = "clothesRentOrder.key";
//
// String DELAY_CLOTHES_RENT_PERIOD_QUEUE = "clothesRentPeriod.delay.queue";
//
// String DELAY_CLOTHES_RENT_PERIOD_ROUTING_KEY = "clothesRentPeriod.key";
//
}

View File

@ -13,4 +13,5 @@ public interface RedisKeyConstant {
String USER_LOGIN_STATE = "xiaokuaisong_user";
String IP = "ip";
String SESSION_ID = "sessionId";
String APPNAME = "appName";
}

View File

@ -0,0 +1,84 @@
package com.bsz.school_send_back_end.contant;
import java.math.BigDecimal;
import java.util.Map;
import java.util.Set;
import static java.util.Map.entry;
/**
* 用户常量
*/
public interface UserConstant {
/**
* 盐值
*/
String USER_SALT = "bsz";
// ------- 权限 --------
/**
* 默认角色
*/
String DEFAULT_ROLE = "user";
/**
* 商家角色
*/
String BUSINESS_ROLE = "business";
/**
* 管理员角色
*/
String ADMIN_ROLE = "admin";
/**
* 跑腿角色
*/
String ERRAND_ROLE = "errand";
/**
* Boss
*/
String BOSS_ROLE = "boss";
/**
* 被封号
*/
String BAN_ROLE = "ban";
/**
* 配送地址
*/
Set<String> VALID_LOCATIONS = Set.of("1公寓", "2公寓", "3公寓","4公寓","5公寓","6公寓",
"7公寓","8公寓","9公寓","10公寓","11公寓","12公寓","育才大厦");
/**
* 公寓配送费
*/
Map<String, BigDecimal> DELIVERY_FEE_MAP = Map.ofEntries(
entry("1公寓", new BigDecimal("1.7")),
entry("2公寓", new BigDecimal("1.7")),
entry("11公寓", new BigDecimal("1.7")),
entry("12公寓", new BigDecimal("1.7")),
entry("5公寓", new BigDecimal("1.2")),
entry("6公寓", new BigDecimal("1.2")),
entry("7公寓", new BigDecimal("1.2")),
entry("3公寓", new BigDecimal("2.3")),
entry("4公寓", new BigDecimal("2.3")),
entry("9公寓", new BigDecimal("2.3")),
entry("10公寓", new BigDecimal("2.3")),
entry("8公寓", new BigDecimal("2.3")),
entry("育才大厦", new BigDecimal("2.5"))
);
/**
* 默认等级
*/
int DEFAULT_LEVEL = 1;
/**
* 默认平均分
*/
double DEFAULT_AVG_SCORE = 1.0;
}

View File

@ -0,0 +1,34 @@
package com.bsz.school_send_back_end.controller;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import java.time.LocalDate;
@Tag(name = "ai接口")
@RestController
@RequestMapping("/ai")
public class AIController {
@Resource
private ChatClient chatClient;
@GetMapping(value = "/chat/generateStreamAsString", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> generateStreamAsString(@RequestParam(value = "message", defaultValue = "介绍自己") String message) {
Flux<String> content = this.chatClient.prompt()
.system(promptSystemSpec -> promptSystemSpec.param("current_date", LocalDate.now().toString()))
.advisors(advisorSpec -> advisorSpec.param(AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY,100))
.user(message)
.stream()
.content();
return content.concatWith(Flux.just("[complete]"));
}
}

View File

@ -0,0 +1,72 @@
package com.bsz.school_send_back_end.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.bsz.school_send_back_end.annotation.AuthCheck;
import com.bsz.school_send_back_end.common.BaseResponse;
import com.bsz.school_send_back_end.common.ResultUtils;
import com.bsz.school_send_back_end.contant.UserConstant;
import com.bsz.school_send_back_end.model.domain.Errand;
import com.bsz.school_send_back_end.model.domain.ErrandBill;
import com.bsz.school_send_back_end.model.domain.OrderRefunds;
import com.bsz.school_send_back_end.model.domain.Orders;
import com.bsz.school_send_back_end.service.ErrandBillService;
import com.bsz.school_send_back_end.service.ErrandService;
import com.bsz.school_send_back_end.service.OrdersService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import java.util.*;
import java.util.stream.Collectors;
@Tag(name = "跑腿流水接口")
@RestController
@RequestMapping("/bill")
@Slf4j
public class BillController {
@Resource
private ErrandService errandService;
@Resource
private ErrandBillService billService;
@Resource
private OrdersService ordersService;
/**
* 跑腿查询自己的账单
* @param request 网路请求
* @return 账单列表
*/
@PostMapping("/list")
@AuthCheck(mustRole = UserConstant.ERRAND_ROLE)
public BaseResponse<List<ErrandBill>> listBillByErrand(HttpServletRequest request) {
Errand loginErrand = errandService.getLoginErrand(request);
LambdaQueryWrapper<Orders> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Orders::getErrandId, loginErrand.getId());
List<Orders> ordersList = ordersService.list(wrapper);
// 如果订单列表为空直接返回空结果
if (ordersList.isEmpty()) {
return ResultUtils.success(Collections.emptyList());
}
List<Long> orderIds = ordersList.stream()
.map(Orders::getId)
.collect(Collectors.toList());
LambdaQueryWrapper<ErrandBill> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(ErrandBill::getOrderId, orderIds);
queryWrapper.orderByDesc(ErrandBill::getOrderStartTime);// orderStartTime 降序排序
List<ErrandBill> bills = billService.list(queryWrapper);
return ResultUtils.success(bills);
}
}

View File

@ -1,7 +1,9 @@
package com.bsz.school_send_back_end.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsz.school_send_back_end.annotation.AuthCheck;
import com.bsz.school_send_back_end.common.BaseResponse;
@ -12,7 +14,7 @@ import com.bsz.school_send_back_end.exception.BusinessException;
import com.bsz.school_send_back_end.exception.ThrowUtils;
import com.bsz.school_send_back_end.model.domain.Business;
import com.bsz.school_send_back_end.model.domain.BusinessAuth;
import com.bsz.school_send_back_end.model.domain.BusinessLevel;
import com.bsz.school_send_back_end.model.domain.Collect;
import com.bsz.school_send_back_end.model.domain.User;
import com.bsz.school_send_back_end.model.dto.business.BusinessAddRequest;
import com.bsz.school_send_back_end.model.dto.business.BusinessQueryRequest;
@ -21,26 +23,29 @@ import com.bsz.school_send_back_end.model.dto.business.BusinessUpdateRequest;
import com.bsz.school_send_back_end.model.vo.BusinessAdminVO;
import com.bsz.school_send_back_end.model.vo.BusinessVO;
import com.bsz.school_send_back_end.service.BusinessAuthService;
import com.bsz.school_send_back_end.service.BusinessLevelService;
import com.bsz.school_send_back_end.service.BusinessService;
import com.bsz.school_send_back_end.service.CollectService;
import com.bsz.school_send_back_end.service.UserService;
import io.swagger.v3.oas.annotations.tags.Tag;
import jdk.jfr.Timestamp;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import static com.bsz.school_send_back_end.contant.UserConstant.DEFAULT_ROLE;
import static com.bsz.school_send_back_end.contant.UserConstant.USER_SALT;
/**
* 商家接口
*/
@Tag(name = "商家接口")
@Slf4j
@RestController
@RequestMapping("/business")
@ -56,7 +61,7 @@ public class BusinessController {
private UserService userService;
@Resource
private BusinessLevelService businessLevelService;
private CollectService collectService;
@PostMapping("/add")
public BaseResponse<Long> addBusiness(@RequestBody BusinessAddRequest businessAddRequest) {
@ -71,7 +76,7 @@ public class BusinessController {
BeanUtils.copyProperties(businessAddRequest, businessAuth);
//对每个应该校验的业务进行校验
businessService.validUser(user, true);
userService.validUser(user, true);
businessService.validBusiness(business, true);
businessService.validBusinessAuth(businessAuth, true);
@ -213,8 +218,6 @@ public class BusinessController {
ThrowUtils.throwIf(size > 20, ErrorCode.PARAMS_ERROR);
QueryWrapper<Business> queryWrapper = businessService.getQueryWrapper(businessQueryRequest);
// 只显示正常营业商家
queryWrapper.eq("state", 1);
Page<Business> businessPage = businessService.page(new Page<>(current, size), queryWrapper);
Page<BusinessVO> businessVOPage = new Page<>(current, size, businessPage.getTotal());
List<BusinessVO> businessVOList = businessService.getBusinessVO(businessPage.getRecords());
@ -222,6 +225,22 @@ public class BusinessController {
return ResultUtils.success(businessVOPage);
}
@GetMapping("/my/getById")
@AuthCheck(mustRole = DEFAULT_ROLE)
public BaseResponse<BusinessVO> getBusinessVO (@RequestParam Long businessId, HttpServletRequest request) {
User loginUser = userService.getLoginUser(request);
LambdaQueryWrapper<Business> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Business::getId, businessId);
long count = businessService.count(queryWrapper);
ThrowUtils.throwIf(count != 1, ErrorCode.PARAMS_ERROR, "商家id不正确");
Business business = businessService.getOne(queryWrapper);
BusinessVO businessVO = businessService.getBusinessVO(business);
long collect = collectService.count(Wrappers.<Collect>lambdaQuery()
.eq(Collect::getUserId, loginUser.getId())
.eq(Collect::getBusinessId, businessId));
businessVO.setIsCollected(collect > 0);
return ResultUtils.success(businessVO);
}
}

View File

@ -0,0 +1,150 @@
package com.bsz.school_send_back_end.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.bsz.school_send_back_end.annotation.AuthCheck;
import com.bsz.school_send_back_end.common.BaseResponse;
import com.bsz.school_send_back_end.common.ErrorCode;
import com.bsz.school_send_back_end.common.ResultUtils;
import com.bsz.school_send_back_end.contant.UserConstant;
import com.bsz.school_send_back_end.exception.BusinessException;
import com.bsz.school_send_back_end.exception.ThrowUtils;
import com.bsz.school_send_back_end.model.domain.Business;
import com.bsz.school_send_back_end.model.domain.Businessinfo;
import com.bsz.school_send_back_end.model.dto.CommonRequest;
import com.bsz.school_send_back_end.model.dto.businessinfo.InfoAddRequest;
import com.bsz.school_send_back_end.model.dto.businessinfo.InfoQueryRequest;
import com.bsz.school_send_back_end.service.BusinessService;
import com.bsz.school_send_back_end.service.BusinessinfoService;
import com.github.houbb.sensitive.word.core.SensitiveWordHelper;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import java.util.List;
@Tag(name = "商家公告接口")
@RestController
@Slf4j
@RequestMapping("/businessInfo")
public class BusinessInfoController {
@Resource
private BusinessinfoService businessinfoService;
@Resource
private BusinessService businessService;
/**
* 添加公告
* @param addRequest 添加请求体
* @param request 网络请求
* @return 是否添加成功
*/
@PostMapping("/add")
@AuthCheck(mustRole = UserConstant.BUSINESS_ROLE)
public BaseResponse<Boolean> addInfo (@RequestBody InfoAddRequest addRequest, HttpServletRequest request) {
if ( addRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Business loginBusiness = businessService.getLoginBusiness(request);
Businessinfo businessinfo = new Businessinfo();
String content = addRequest.getContent();
boolean contains = SensitiveWordHelper.contains(content);
ThrowUtils.throwIf(contains, ErrorCode.PARAMS_ERROR, "公告含有违禁词");
BeanUtils.copyProperties(addRequest, businessinfo);
businessinfo.setBusinessId(loginBusiness.getId());
boolean save = businessinfoService.save(businessinfo);
ThrowUtils.throwIf(!save, ErrorCode.SYSTEM_ERROR, "添加公告失败");
return ResultUtils.success(true);
}
/**
* 删除公告
* @param commonRequest 删除请求体
* @param request 网络请求
* @return 是否成功
*/
@PostMapping("/delete")
@AuthCheck(mustRole = UserConstant.BUSINESS_ROLE)
public BaseResponse<Boolean> deleteInfo (@RequestBody CommonRequest commonRequest, HttpServletRequest request) {
if (commonRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Business loginBusiness = businessService.getLoginBusiness(request);
Long businessId = loginBusiness.getId();
Long id = commonRequest.getId();
LambdaQueryWrapper<Businessinfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Businessinfo::getId, id);
queryWrapper.eq(Businessinfo::getBusinessId, businessId);
long count = businessinfoService.count(queryWrapper);
ThrowUtils.throwIf(count != 1, ErrorCode.SYSTEM_ERROR, "当前公告未找到");
boolean remove = businessinfoService.remove(queryWrapper);
ThrowUtils.throwIf(!remove, ErrorCode.SYSTEM_ERROR, "删除失败");
return ResultUtils.success(true);
}
/**
* 查询公告列表 仅商家
* @param request 网络请求
* @return 查询列表
*/
@PostMapping("/list/my")
@AuthCheck(mustRole = UserConstant.BUSINESS_ROLE)
public BaseResponse<List<Businessinfo>> selectMyInfo (HttpServletRequest request) {
Business loginBusiness = businessService.getLoginBusiness(request);
Long businessId = loginBusiness.getId();
LambdaQueryWrapper<Businessinfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Businessinfo::getBusinessId, businessId);
queryWrapper.orderByDesc(Businessinfo::getCreateTime);
List<Businessinfo> list = businessinfoService.list(queryWrapper);
return ResultUtils.success(list, "查询成功");
}
/**
* 查询公列表仅管理员 分页
* @param infoQueryRequest 查询请求体
* @return 查询列表
*/
@PostMapping("/list/page")
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<Page<Businessinfo>> selectInfoByPage (@RequestBody InfoQueryRequest infoQueryRequest) {
if (infoQueryRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
long current = infoQueryRequest.getCurrent();
long pageSize = infoQueryRequest.getPageSize();
QueryWrapper<Businessinfo> queryWrapper = businessinfoService.getQueryWrapper(infoQueryRequest);
Page<Businessinfo> page = businessinfoService.page(new Page<>(current, pageSize), queryWrapper);
return ResultUtils.success(page, "查询成功");
}
/**
* 用户查询商家最新公告
* @return 查询列表
*/
@PostMapping("/list")
public BaseResponse<Businessinfo> selectInfo (@RequestBody CommonRequest commonRequest) {
if (commonRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long businessId = commonRequest.getId();
LambdaQueryWrapper<Businessinfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Businessinfo::getBusinessId, businessId);
queryWrapper.orderByDesc(Businessinfo::getCreateTime);
queryWrapper.last("LIMIT 1");
Businessinfo businessinfo = businessinfoService.getOne(queryWrapper);
return ResultUtils.success(businessinfo, "查询成功");
}
}

View File

@ -15,21 +15,20 @@ import com.bsz.school_send_back_end.model.dto.cart.CartUpdateRequest;
import com.bsz.school_send_back_end.model.vo.CartVO;
import com.bsz.school_send_back_end.service.CartService;
import com.bsz.school_send_back_end.service.UserService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.stream.Collectors;
@Tag(name = "购物车接口")
@RestController
@Slf4j
@RequestMapping("/cart")
@ -120,7 +119,7 @@ public class CartController {
queryWrapper.eq(Cart::getBusinessId, businessId);
queryWrapper.eq(Cart::getUserId, userId);
List<Cart> cartList = cartService.list(queryWrapper);
List<CartVO> cartVOList = this.getCartVOList(cartList);
List<CartVO> cartVOList = cartService.getCartVOList(cartList);
return ResultUtils.success(cartVOList);
}
@ -137,7 +136,7 @@ public class CartController {
wrapper.eq(Cart::getUserId, userId);
List<Cart> cartList = cartService.list(wrapper);
List<CartVO> cartVOList = this.getCartVOList(cartList);
List<CartVO> cartVOList = cartService.getCartVOList(cartList);
return ResultUtils.success(cartVOList);
}
@ -182,15 +181,4 @@ public class CartController {
return ResultUtils.success(true);
}
private List<CartVO> getCartVOList(List<Cart> cartList) {
if (CollectionUtils.isEmpty(cartList)) {
return new ArrayList<>();
}
return cartList.stream().map(item ->{
CartVO cartVO = new CartVO();
BeanUtils.copyProperties(item, cartVO);
return cartVO;
}).collect(Collectors.toList());
}
}

View File

@ -15,13 +15,15 @@ import com.bsz.school_send_back_end.model.dto.category.CategoryDeleteRequest;
import com.bsz.school_send_back_end.model.dto.category.CategoryUpdateRequest;
import com.bsz.school_send_back_end.service.BusinessService;
import com.bsz.school_send_back_end.service.CategoryService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
import java.util.List;
@Tag(name = "餐厅接口")
@Slf4j
@RestController
@RequestMapping("/category")

View File

@ -10,8 +10,10 @@ import com.bsz.school_send_back_end.model.domain.Collect;
import com.bsz.school_send_back_end.model.domain.User;
import com.bsz.school_send_back_end.model.dto.CommonRequest;
import com.bsz.school_send_back_end.model.dto.collect.CollectAddRequest;
import com.bsz.school_send_back_end.model.vo.CollectVO;
import com.bsz.school_send_back_end.service.CollectService;
import com.bsz.school_send_back_end.service.UserService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.PostMapping;
@ -19,10 +21,12 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
@Tag(name = "收藏接口")
@RestController
@Slf4j
@RequestMapping("/collect")
@ -54,13 +58,16 @@ public class CollectController {
* 删除一条收藏
*/
@PostMapping("/delete")
public BaseResponse<Boolean> deleteCollect(@RequestBody CommonRequest commonRequest) {
public BaseResponse<Boolean> deleteCollect(@RequestBody CommonRequest commonRequest, HttpServletRequest request) {
if (commonRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long id = commonRequest.getId();
User loginUser = userService.getLoginUser(request);
Long userId = loginUser.getId();
LambdaQueryWrapper<Collect> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Collect::getId, id);
wrapper.eq(Collect::getUserId, userId);
wrapper.eq(Collect::getBusinessId, id);
boolean remove = collectService.remove(wrapper);
ThrowUtils.throwIf(!remove, ErrorCode.SYSTEM_ERROR);
return ResultUtils.success(true);
@ -84,12 +91,12 @@ public class CollectController {
* 查询所有收藏
*/
@PostMapping("/list")
public BaseResponse<List<Collect>> listCollect(HttpServletRequest request) {
User loginUser = userService.getLoginUser(request);
Long loginUserId = loginUser.getId();
LambdaQueryWrapper<Collect> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Collect::getUserId, loginUserId);
List<Collect> list = collectService.list(wrapper);
return ResultUtils.success(list);
public BaseResponse<List<CollectVO>> listCollect(HttpServletRequest request) {
List<CollectVO> collectList = collectService.getCollectList(request);
if (collectList == null) {
collectList = new ArrayList<>();
}
return ResultUtils.success(collectList);
}
}

View File

@ -23,16 +23,18 @@ import com.bsz.school_send_back_end.model.vo.DishesVO;
import com.bsz.school_send_back_end.service.BusinessService;
import com.bsz.school_send_back_end.service.DishesService;
import com.bsz.school_send_back_end.service.SpecificationsDishesService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import java.util.List;
@Tag(name = "菜品接口")
@Slf4j
@RestController
@RequestMapping("/dishes")

View File

@ -21,6 +21,7 @@ import com.bsz.school_send_back_end.model.dto.DishesGroup.DishesGroupUpdateReque
import com.bsz.school_send_back_end.service.BusinessService;
import com.bsz.school_send_back_end.service.DishesGroupService;
import com.bsz.school_send_back_end.service.DishesService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.transaction.annotation.Transactional;
@ -29,10 +30,11 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import java.util.List;
@Tag(name = "菜品分组接口")
@Slf4j
@RestController
@RequestMapping("/dishesGroup")

View File

@ -0,0 +1,108 @@
package com.bsz.school_send_back_end.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsz.school_send_back_end.annotation.AuthCheck;
import com.bsz.school_send_back_end.common.BaseResponse;
import com.bsz.school_send_back_end.common.ErrorCode;
import com.bsz.school_send_back_end.common.ResultUtils;
import com.bsz.school_send_back_end.contant.UserConstant;
import com.bsz.school_send_back_end.exception.BusinessException;
import com.bsz.school_send_back_end.exception.ThrowUtils;
import com.bsz.school_send_back_end.model.domain.Errand;
import com.bsz.school_send_back_end.model.domain.ErrandAuth;
import com.bsz.school_send_back_end.model.dto.errandAtuh.ErrandAuthAddRequest;
import com.bsz.school_send_back_end.model.dto.errandAtuh.ErrandAuthQueryRequest;
import com.bsz.school_send_back_end.service.ErrandAuthService;
import com.bsz.school_send_back_end.service.ErrandService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
@Tag(name = "快送员认证接口")
@Slf4j
@RestController
@RequestMapping("/errandAuth")
public class ErrandAuthController {
@Resource
private ErrandAuthService errandAuthService;
@Resource
private ErrandService errandService;
@PostMapping("/add")
public BaseResponse<Boolean> addErrandAuth(@RequestBody ErrandAuthAddRequest addRequest) {
if (addRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long errandId = addRequest.getErrandId();
LambdaQueryWrapper<ErrandAuth> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ErrandAuth::getErrandId, errandId);
long count = errandAuthService.count(queryWrapper);
ThrowUtils.throwIf(count > 0, ErrorCode.PARAMS_ERROR, "当前跑腿已认证");
ErrandAuth errandAuth = new ErrandAuth();
BeanUtils.copyProperties(addRequest, errandAuth);
errandAuthService.validErrandAuth(errandAuth,true);
boolean save = errandAuthService.save(errandAuth);
ThrowUtils.throwIf(!save, ErrorCode.SYSTEM_ERROR, "添加跑腿认证失败");
return ResultUtils.success(true);
}
@PostMapping("/update")
@AuthCheck(mustRole = UserConstant.ERRAND_ROLE)
public BaseResponse<Boolean> updateErrandAuth (@RequestBody ErrandAuthAddRequest updateRequest) {
if (updateRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
ErrandAuth errandAuth = new ErrandAuth();
BeanUtils.copyProperties(updateRequest, errandAuth);
errandAuthService.validErrandAuth(errandAuth, false);
LambdaUpdateWrapper<ErrandAuth> wrapper = errandAuthService.getUpdateWrapper(errandAuth);
boolean update = errandAuthService.update(wrapper);
ThrowUtils.throwIf(!update, ErrorCode.SYSTEM_ERROR, "更新跑腿认证信息失败");
return ResultUtils.success(true);
}
@PostMapping("/list/page")
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<Page<ErrandAuth>> listErrandAuthByPage(@RequestBody ErrandAuthQueryRequest errandAuthQueryRequest) {
if (errandAuthQueryRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
long pageSize = errandAuthQueryRequest.getPageSize();
long current = errandAuthQueryRequest.getCurrent();
QueryWrapper<ErrandAuth> queryWrapper = errandAuthService.getQueryWrapper(errandAuthQueryRequest);
Page<ErrandAuth> page = errandAuthService.page(new Page<>(current, pageSize),queryWrapper);
return ResultUtils.success(page);
}
@GetMapping("/getErrandAuthById")
public BaseResponse<ErrandAuth> getErrandAuthById (String errandId) {
Long errandId1 = Long.valueOf(errandId);
ErrandAuth errandAuth = errandAuthService.getErrandAuth(errandId1);
return ResultUtils.success(errandAuth);
}
@PostMapping("/get/my")
public BaseResponse<ErrandAuth> getMyErrandAuth (HttpServletRequest request) {
Errand loginErrand = errandService.getLoginErrand(request);
Long id = loginErrand.getId();
LambdaQueryWrapper<ErrandAuth> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ErrandAuth::getErrandId, id);
ErrandAuth errandAuth = errandAuthService.getOne(queryWrapper);
ThrowUtils.throwIf(errandAuth == null, ErrorCode.OPERATION_ERROR, "当前跑腿为认证");
return ResultUtils.success(errandAuth);
}
}

View File

@ -0,0 +1,325 @@
package com.bsz.school_send_back_end.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsz.school_send_back_end.annotation.AuthCheck;
import com.bsz.school_send_back_end.common.BaseResponse;
import com.bsz.school_send_back_end.common.ErrorCode;
import com.bsz.school_send_back_end.common.ResultUtils;
import com.bsz.school_send_back_end.contant.UserConstant;
import com.bsz.school_send_back_end.exception.BusinessException;
import com.bsz.school_send_back_end.exception.ThrowUtils;
import com.bsz.school_send_back_end.model.domain.*;
import com.bsz.school_send_back_end.model.dto.CommonRequest;
import com.bsz.school_send_back_end.model.dto.errand.ErrandAddRequest;
import com.bsz.school_send_back_end.model.dto.errand.ErrandQueryRequest;
import com.bsz.school_send_back_end.model.dto.errand.ErrandStateRequest;
import com.bsz.school_send_back_end.model.dto.errand.ErrandUpdateRequest;
import com.bsz.school_send_back_end.model.vo.ErrandVO;
import com.bsz.school_send_back_end.model.vo.OrdersVO;
import com.bsz.school_send_back_end.service.*;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import static com.bsz.school_send_back_end.contant.UserConstant.*;
@Tag(name = "快送员接口")
@Slf4j
@RestController
@RequestMapping("/errand")
public class ErrandController {
@Resource
private ErrandService errandService;
@Resource
private UserService userService;
@Resource
private OrdersService ordersService;
@Resource
private ErrandAuthService errandAuthService;
@Resource
private ErrandOrderService errandOrderService;
/**
* 注册跑腿
* @param addRequest 注册请求体
* @return 是否成功
*/
@PostMapping("/add")
public BaseResponse<Boolean> addErrand(@RequestBody ErrandAddRequest addRequest) {
if (addRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
User user = new User();
Errand errand = new Errand();
BeanUtils.copyProperties(addRequest, user);
System.out.println("User account: " + user.getUserAccount());
BeanUtils.copyProperties(addRequest, errand);
userService.validUser(user, true);
errandService.validErrand(errand, true);
//加密
String encryptPassword = DigestUtils.md5DigestAsHex((USER_SALT + user.getUserPassword()).getBytes());
user.setUserPassword(encryptPassword);
//更改用户权限为跑腿
user.setUserRole("errand");
//往user表中补充跑腿信息
user.setUsername(errand.getErrandName());
user.setPhone(errand.getErrandPhone());
errandService.addErrand(user, errand);
return ResultUtils.success(true);
}
/**
* 删除跑腿信息
* @param request 当前登录用户
* @return 是否成功
*/
@PostMapping("/delete")
@AuthCheck(mustRole = UserConstant.ERRAND_ROLE)
@Transactional(rollbackFor = Exception.class)
public BaseResponse<Boolean> deleteErrand (HttpServletRequest request){
errandService.deleteErrand(request);
return ResultUtils.success(true);
}
/**
* 修改跑腿信息(管理员)
* @param updateRequest 修改请求体
* @return 是否修改成功
*/
@PostMapping("/update")
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<Boolean> updateErrand(@RequestBody ErrandUpdateRequest updateRequest) {
if (updateRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Boolean update = errandService.updateErrand(updateRequest);
ThrowUtils.throwIf(!update, ErrorCode.SYSTEM_ERROR,"更新跑腿失败");
return ResultUtils.success(true);
}
/**
* 修改跑腿信息个人
* @param updateRequest 修改请求体
* @param request 当前登录用户
* @return 是否修改成功
*/
@PostMapping("/update/my")
@AuthCheck(mustRole = UserConstant.ERRAND_ROLE)
public BaseResponse<Boolean> updateErrandByUser (@RequestBody ErrandUpdateRequest updateRequest, HttpServletRequest request ) {
if (updateRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Errand loginErrand = errandService.getLoginErrand(request);
Integer totalOrders = loginErrand.getTotalOrders();
ThrowUtils.throwIf(totalOrders > 0, ErrorCode.OPERATION_ERROR, "当前跑腿还有订单未送");
Boolean update = errandService.updateErrand(updateRequest);
Long errandId = loginErrand.getId();
Long id = updateRequest.getId();
ThrowUtils.throwIf(!id.equals(errandId), ErrorCode.PARAMS_ERROR, "修改的跑腿信息不是当前跑腿");
ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "更新跑腿失败");
return ResultUtils.success(true);
}
/**
* 获取当前跑腿信息列表
* @return 跑腿信息列表
*/
@PostMapping("/list")
@AuthCheck(mustRole = ADMIN_ROLE)
public BaseResponse<List<Errand>> listErrand() {
List<Errand> list = errandService.list();
return ResultUtils.success(list);
}
/**
* 分页获取跑腿信息列表
* @param queryRequest 查询请求体
* @return 跑腿信息分页
*/
@PostMapping("/page")
@AuthCheck(mustRole = ADMIN_ROLE)
public BaseResponse<Page<Errand>> listErrandByPage (@RequestBody ErrandQueryRequest queryRequest) {
if (queryRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
long pageSize = queryRequest.getPageSize();
long current = queryRequest.getCurrent();
QueryWrapper<Errand> queryWrapper = errandService.getQueryWrapper(queryRequest);
Page<Errand> errandPage = errandService.page(new Page<>(current, pageSize), queryWrapper);
return ResultUtils.success(errandPage);
}
/**
* 抢单
* @param commonRequest 订单id
* @param request 当前登录用户
* @return 是否抢单成功
*/
@PostMapping("/get/order")
@AuthCheck(mustRole = UserConstant.ERRAND_ROLE)
@Transactional(rollbackFor = Exception.class)
public BaseResponse<Boolean> getOrder(@RequestBody CommonRequest commonRequest, HttpServletRequest request) {
if (commonRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long ordersId = commonRequest.getId();
Errand loginErrand = errandService.getLoginErrand(request);
Long loginErrandId = loginErrand.getId();
ErrandOrder errandOrder = errandOrderService.getOne(Wrappers.<ErrandOrder>lambdaQuery()
.eq(ErrandOrder::getOrderId, ordersId));
Integer state = loginErrand.getState();
if (state != 1) {
throw new BusinessException(ErrorCode.FORBIDDEN_ERROR, "当前跑腿不可抢单");
}
errandService.updateTotal(loginErrand, true);
// 开始事务
Orders orders = ordersService.getOrderWithPessimisticLock(ordersId);
// 判断订单是否已被抢
if (orders == null || orders.getErrandId() != null) {
return ResultUtils.success(false); // 订单已经被抢或不存在
}
// 更新订单的 errandId 和状态
orders.setErrandId(loginErrandId);
boolean update = ordersService.updateById(orders);
ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "抢单失败");
errandOrder.setErrandId(loginErrandId);
errandOrder.setErrandState(2); // 2待取货
boolean update1 = errandOrderService.updateById(errandOrder);
ThrowUtils.throwIf(!update1, ErrorCode.OPERATION_ERROR, "更新跑腿订单关联失败");
return ResultUtils.success(true);
}
/**
* 修改订单
* @param errandStateRequest 订单id
* @param request 当前登录用户
* @return 是否修改成功
*/
@PostMapping("/update/state")
@AuthCheck(mustRole = ERRAND_ROLE)
public BaseResponse<Boolean> updateOrdersStateByErrand (@RequestBody ErrandStateRequest errandStateRequest, HttpServletRequest request) {
if (errandStateRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
errandService.orderToErrand(errandStateRequest, request);
return ResultUtils.success(true);
}
/**
* 根据当前登录用户获取跑腿信息
*/
@PostMapping("/get/current")
@AuthCheck(mustRole = ERRAND_ROLE)
public BaseResponse<ErrandVO> getByErrand (HttpServletRequest request) {
Errand loginErrand = errandService.getLoginErrand(request);
ErrandVO errandVO = errandService.getErrandVO(loginErrand);
return ResultUtils.success(errandVO);
}
/**
* 当前跑腿获取订单
*/
@PostMapping("/list/order")
@AuthCheck(mustRole = ERRAND_ROLE)
public BaseResponse<List<OrdersVO>> listOrdersByErrand(Integer errandState, HttpServletRequest request) {
Errand loginErrand = errandService.getLoginErrand(request);
String distributionScope = loginErrand.getDistributionScope();
// 创建 errand_order 表的查询条件
LambdaQueryWrapper<ErrandOrder> errandOrderQueryWrapper = new LambdaQueryWrapper<>();
errandOrderQueryWrapper.eq(ErrandOrder::getErrandState, errandState);
// 根据 errandState 的不同情况调整查询
if (errandState != 1) {
errandOrderQueryWrapper.eq(ErrandOrder::getErrandId, loginErrand.getId());
} else {
errandOrderQueryWrapper.isNull(ErrandOrder::getErrandId);
errandOrderQueryWrapper.ge(ErrandOrder::getEndTime, new Date());
}
// 查询符合条件的 errand_order 数据
List<ErrandOrder> errandOrderList = errandOrderService.list(errandOrderQueryWrapper);
// 获取符合条件的 orderId 列表
List<Long> orderIds = errandOrderList.stream().map(ErrandOrder::getOrderId).collect(Collectors.toList());
// 如果没有符合条件的订单则返回空
if (orderIds.isEmpty()) {
return ResultUtils.success(Collections.emptyList());
}
// 查询 orders 获取相关订单信息
LambdaQueryWrapper<Orders> ordersQueryWrapper = new LambdaQueryWrapper<>();
ordersQueryWrapper.in(Orders::getId, orderIds);
ordersQueryWrapper.eq(Orders::getLocation, distributionScope);
// 获取订单数据
List<Orders> ordersList = ordersService.list(ordersQueryWrapper);
List<OrdersVO> ordersVO = ordersService.getOrdersVO(ordersList);
// 如果转换后的订单VO为空也返回空响应
if (CollectionUtils.isEmpty(ordersVO)) {
return ResultUtils.success(Collections.emptyList());
}
return ResultUtils.success(ordersVO);
}
/**
* 根据Id获取跑腿信息
* @return 跑腿信息
*/
@PostMapping("/get/id")
@AuthCheck(mustRole = ADMIN_ROLE)
public BaseResponse<ErrandVO> getErrandById (String errandId1) {
Long errandId = Long.valueOf(errandId1);
Errand errand = errandService.getOne(Wrappers.<Errand>lambdaQuery().eq(Errand::getId, errandId));
ThrowUtils.throwIf(errand == null, ErrorCode.PARAMS_ERROR, "当前跑腿id不正确");
ErrandVO errandVO = errandService.getErrandVO(errand);
ErrandAuth errandAuth = errandAuthService.getErrandAuth(errandId);
errandVO.setBackIdCard(errandAuth.getBackIdCard());
errandVO.setBankCard(errandAuth.getBankCard());
errandVO.setFrontIdCard(errandAuth.getFrontIdCard());
return ResultUtils.success(errandVO);
}
}

View File

@ -0,0 +1,137 @@
package com.bsz.school_send_back_end.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsz.school_send_back_end.annotation.AuthCheck;
import com.bsz.school_send_back_end.common.BaseResponse;
import com.bsz.school_send_back_end.common.ErrorCode;
import com.bsz.school_send_back_end.common.ResultUtils;
import com.bsz.school_send_back_end.contant.UserConstant;
import com.bsz.school_send_back_end.exception.BusinessException;
import com.bsz.school_send_back_end.exception.ThrowUtils;
import com.bsz.school_send_back_end.model.domain.Errand;
import com.bsz.school_send_back_end.model.domain.ErrandIncome;
import com.bsz.school_send_back_end.model.domain.User;
import com.bsz.school_send_back_end.model.dto.CommonRequest;
import com.bsz.school_send_back_end.model.dto.erradnIncome.ErrandIncomeQueryRequest;
import com.bsz.school_send_back_end.service.ErrandIncomeService;
import com.bsz.school_send_back_end.service.ErrandService;
import com.bsz.school_send_back_end.service.UserService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@Tag(name = "快送员收入接口")
@RestController
@Slf4j
@RequestMapping("/errandIncome")
public class ErrandIncomeController {
@Resource
private ErrandService errandService;
@Resource
private ErrandIncomeService errandIncomeService;
@Resource
private UserService userService;
@PostMapping("/count/number")
@AuthCheck(mustRole = UserConstant.ERRAND_ROLE)
public BaseResponse<Long> countIncomeNumber(HttpServletRequest request) {
Errand loginErrand = errandService.getLoginErrand(request);
LambdaQueryWrapper<ErrandIncome> queryWrapper = errandIncomeService.getQueryWrapper(loginErrand.getId());
long count = errandIncomeService.count(queryWrapper);
return ResultUtils.success(count);
}
@PostMapping("/count/money")
@AuthCheck(mustRole = UserConstant.ERRAND_ROLE)
public BaseResponse<BigDecimal> countIncomeMoney(HttpServletRequest request) {
Errand loginErrand = errandService.getLoginErrand(request);
LambdaQueryWrapper<ErrandIncome> queryWrapper = errandIncomeService.getQueryWrapper(loginErrand.getId());
queryWrapper.eq(ErrandIncome::getState, 1);
List<ErrandIncome> list = errandIncomeService.list(queryWrapper);
BigDecimal price = list.stream().map(ErrandIncome::getIncome).reduce(BigDecimal.ZERO, BigDecimal::add);
return ResultUtils.success(price);
}
@PostMapping("/count/total-money")
@AuthCheck(mustRole = UserConstant.ERRAND_ROLE)
public BaseResponse<BigDecimal> countTotalIncome(HttpServletRequest request) {
// 获取登录跑腿信息
Errand loginErrand = errandService.getLoginErrand(request);
// 从跑腿表直接获取总收入字段值
BigDecimal totalIncome = loginErrand.getTotalPrice();
// 返回结果
return ResultUtils.success(totalIncome);
}
@PostMapping("/list")
@AuthCheck(mustRole = UserConstant.ERRAND_ROLE)
public BaseResponse<List<ErrandIncome>> listErrandIncome(@RequestBody CommonRequest commonRequest, HttpServletRequest request) {
if (commonRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long errandId = commonRequest.getId();
User loginUser = userService.getLoginUser(request);
String userRole = loginUser.getUserRole();
if (userRole.equals(UserConstant.ERRAND_ROLE)) {
Errand loginErrand = errandService.getLoginErrand(request);
Long id = loginErrand.getId();
ThrowUtils.throwIf(!id.equals(errandId), ErrorCode.PARAMS_ERROR, "传输的跑腿id不正确");
}
LambdaQueryWrapper<ErrandIncome> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ErrandIncome::getErrandId, errandId);
List<ErrandIncome> list = errandIncomeService.list(queryWrapper);
if (list == null) {
list = new ArrayList<>();
}
return ResultUtils.success(list);
}
@PostMapping("/list/page")
@AuthCheck(mustRole = UserConstant.ERRAND_ROLE)
public BaseResponse<Page<ErrandIncome>> listErrandIncomeByPage(@RequestBody ErrandIncomeQueryRequest queryRequest) {
if (queryRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
long pageSize = queryRequest.getPageSize();
long current = queryRequest.getCurrent();
QueryWrapper<ErrandIncome> queryWrapper = errandIncomeService.getWrapper(queryRequest);
Page<ErrandIncome> page = errandIncomeService.page(new Page<>(current, pageSize), queryWrapper);
if (page == null) {
page = new Page<>();
}
return ResultUtils.success(page);
}
@PostMapping("/count/money/no")
@AuthCheck(mustRole = UserConstant.ERRAND_ROLE)
public BaseResponse<BigDecimal> countIncomeMoneyNo(HttpServletRequest request) {
Errand loginErrand = errandService.getLoginErrand(request);
LambdaQueryWrapper<ErrandIncome> queryWrapper = errandIncomeService.getQueryWrapper(loginErrand.getId());
queryWrapper.eq(ErrandIncome::getState, 0);
List<ErrandIncome> list = errandIncomeService.list(queryWrapper);
BigDecimal price = list.stream().map(ErrandIncome::getIncome).reduce(BigDecimal.ZERO, BigDecimal::add);
return ResultUtils.success(price);
}
}

View File

@ -10,13 +10,14 @@ import com.bsz.school_send_back_end.model.domain.User;
import com.bsz.school_send_back_end.model.dto.file.UploadFileRequest;
import com.bsz.school_send_back_end.model.enums.FileUploadBizEnum;
import com.bsz.school_send_back_end.service.UserService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
@ -24,6 +25,7 @@ import java.util.Arrays;
/**
* 文件上传
*/
@Tag(name = "文件上传接口")
@Slf4j
@RestController
@RequestMapping("/file")

View File

@ -2,7 +2,9 @@ package com.bsz.school_send_back_end.controller;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsz.school_send_back_end.annotation.AuthCheck;
@ -13,36 +15,38 @@ import com.bsz.school_send_back_end.contant.CommonConstant;
import com.bsz.school_send_back_end.contant.UserConstant;
import com.bsz.school_send_back_end.exception.BusinessException;
import com.bsz.school_send_back_end.exception.ThrowUtils;
import com.bsz.school_send_back_end.listener.RabbitMQSender;
import com.bsz.school_send_back_end.model.domain.*;
import com.bsz.school_send_back_end.model.dto.CommonRequest;
import com.bsz.school_send_back_end.model.dto.order.*;
import com.bsz.school_send_back_end.model.vo.OrdersExcelVO;
import com.bsz.school_send_back_end.model.vo.OrdersVO;
import com.bsz.school_send_back_end.model.vo.*;
import com.bsz.school_send_back_end.service.*;
import com.bsz.school_send_back_end.utils.ExcelUtils;
import com.bsz.school_send_back_end.utils.SqlUtils;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
* 订单相关接口
**/
@Tag(name = "订单相关接口")
@Slf4j
@RestController
@Tag(name = "订单接口")
@ -64,6 +68,24 @@ public class OrdersController {
@Resource
private OrderDetailsService orderDetailsService;
@Resource
private WebsocketService websocketService;
@Resource
private ErrandService errandService;
@Resource
private ErrandIncomeService errandIncomeService;
@Resource
private ErrandOrderService errandOrderService;
@Resource
private ErrandBillService billService;
@Resource
private RabbitMQSender rabbitMQSender;
/**
* 创建订单
*
@ -97,6 +119,7 @@ public class OrdersController {
}).toList();
// 创建订单
long orderId = ordersService.addOrder(orders, orderDetailsList);
rabbitMQSender.sendCreateOrderMessage(orderId);
return ResultUtils.success(orderId, "订单创建成功");
}
@ -140,7 +163,7 @@ public class OrdersController {
}
/**
* 根据 id 获取订单信息仅管理员
* 根据 id 获取订单信息
*/
@GetMapping("/get/my")
public BaseResponse<OrdersVO> getOrderVOByMyId(@RequestParam Long id, HttpServletRequest request) {
@ -237,18 +260,18 @@ public class OrdersController {
orderQueryRequest.setStartTime(date.format(startFormatter));
orderQueryRequest.setEndTime(date.format(endFormatter));
QueryWrapper<Orders> queryWrapper = ordersService.getQueryWrapper(orderQueryRequest);
List<Orders> ordertList = ordersService.list(queryWrapper);
List<Orders> orderList = ordersService.list(queryWrapper);
BigDecimal money = new BigDecimal("0");
for (Orders order : ordertList) {
for (Orders order : orderList) {
money = money.add(order.getTotalPrice());
}
moneyCountList.add(money);
}
} else {
QueryWrapper<Orders> queryWrapper = ordersService.getQueryWrapper(orderQueryRequest);
List<Orders> ordertList = ordersService.list(queryWrapper);
List<Orders> orderList = ordersService.list(queryWrapper);
BigDecimal money = new BigDecimal("0");
for (Orders order : ordertList) {
for (Orders order : orderList) {
money = money.add(order.getTotalPrice());
}
moneyCountList.add(money);
@ -351,22 +374,245 @@ public class OrdersController {
}).collect(Collectors.toList());
// 设置导出名称
ExcelUtils.setExcelResponseProp(response, "订单信息");
log.info("响应头 Content-Type: {}", response.getContentType());
// 获取输出流名称
OutputStream outputStream = response.getOutputStream();
// 这里 需要指定写用哪个class去写然后写到第一个sheet名字为模板 然后文件流会自动关闭
EasyExcel.write(outputStream, OrdersExcelVO.class) // 对应实体类
.sheet("订单数据") // sheet页名称
.doWrite(ordersExcelVOList); // 导出的数据集合
try (OutputStream outputStream = response.getOutputStream()) {
EasyExcel.write(outputStream, OrdersExcelVO.class)
.sheet("订单数据")
.doWrite(ordersExcelVOList);
response.flushBuffer();
} catch (Exception e) {
log.error("Excel 导出失败", e);
}
}
@PostMapping("/delete")
@AuthCheck(mustRole = UserConstant.DEFAULT_ROLE)
public BaseResponse<Boolean> deleteOrder (@RequestBody CommonRequest commonRequest, HttpServletRequest request) {
if (commonRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long orderId = commonRequest.getId();
LambdaQueryWrapper<Orders> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Orders::getId, orderId);
Orders orders = ordersService.getOne(wrapper);
User loginUser = userService.getLoginUser(request);
Long loginUserId = loginUser.getId();
ThrowUtils.throwIf(!orders.getUserId().equals(loginUserId), ErrorCode.OPERATION_ERROR,
"当前用户不是该订单所有者");
log.info("oldOrders:" + orders);
LambdaUpdateWrapper<Orders> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(Orders::getIsDelete,1);
updateWrapper.eq(Orders::getId, orderId);
boolean update = ordersService.update(updateWrapper);
log.info("orders:" + orders);
ThrowUtils.throwIf(!update, ErrorCode.SYSTEM_ERROR);
return ResultUtils.success(true);
}
@PostMapping("/update")
@AuthCheck(mustRole = UserConstant.BUSINESS_ROLE)
public BaseResponse<Boolean> updateOrderState(@RequestBody CommonRequest commonRequest,HttpServletRequest request) {
if (commonRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long id = commonRequest.getId();
LambdaQueryWrapper<Orders> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Orders::getId, id);
Orders orders = ordersService.getOne(queryWrapper);
Business loginBusiness = businessService.getLoginBusiness(request);
Long businessId = loginBusiness.getId();
ThrowUtils.throwIf(!businessId.equals(orders.getBusinessId()), ErrorCode.FORBIDDEN_ERROR, "当前订单不属于当前登录用户");
LambdaUpdateWrapper<Orders> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(Orders::getState,4);
updateWrapper.eq(Orders::getId, id);
String location = orders.getLocation();
ErrandOrder errandOrder = errandOrderService.getOne(Wrappers.<ErrandOrder>lambdaQuery()
.eq(ErrandOrder::getOrderId, orders.getId()));
if (errandOrder != null) {
if (StringUtils.isNotBlank(location)) {
websocketService.sendOrderToErrand(orders);
errandOrder.setErrandState(1);//1待抢单
boolean update1 = errandOrderService.updateById(errandOrder);
ThrowUtils.throwIf(!update1, ErrorCode.OPERATION_ERROR, "更新跑腿关联失败");
}
boolean update = ordersService.update(updateWrapper);
ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR,"修改订单状态失败");
}
return ResultUtils.success(true);
}
@PostMapping("/updateOrder")
public BaseResponse<Boolean> updateOrder(@RequestBody OrderUpdateRequest orderUpdateRequest, HttpServletRequest request) {
return ResultUtils.success(ordersService.OrderToUpdate(orderUpdateRequest, request));
}
@PostMapping("/update/state/user")
public BaseResponse<Boolean> updateStateByUser(@RequestBody CommonRequest commonRequest, HttpServletRequest request) {
if (commonRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long orderId = commonRequest.getId();
User loginUser = userService.getLoginUser(request);
Orders orders = ordersService.getById(orderId);
ThrowUtils.throwIf(orders.getState().equals(5), ErrorCode.OPERATION_ERROR, "订单已完成");
ThrowUtils.throwIf(!orders.getUserId().equals(loginUser.getId()), ErrorCode.PARAMS_ERROR,
"当前传送的订单id不正确或不属于当前用户");
Long errandId = orders.getErrandId();
if (errandId != null) {
Errand errand = errandService.getById(errandId);
LambdaQueryWrapper<ErrandIncome> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ErrandIncome::getOrderId, orderId);
ErrandIncome errandIncome = errandIncomeService.getOne(queryWrapper);
errandIncome.setState(1); // 收入已结算
boolean update = errandIncomeService.updateById(errandIncome);
ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR,"修改跑腿收入失败");
BigDecimal totalPrice = errand.getTotalPrice();
BigDecimal income = errandIncome.getIncome();
totalPrice = totalPrice.add(income);
errand.setTotalPrice(totalPrice);
boolean update1 = errandService.updateById(errand);
ThrowUtils.throwIf(!update1, ErrorCode.OPERATION_ERROR, "修改跑腿总金额失败");
ErrandBill errandBill = new ErrandBill();
errandBill.setOrderId(orderId);
errandBill.setErrandState(errandIncome.getState());
errandBill.setIncome(errandIncome.getIncome());
errandBill.setUsername(loginUser.getUsername());
errandBill.setOrderStartTime(orders.getCreateTime());
boolean save = billService.save(errandBill);
ThrowUtils.throwIf(!save, ErrorCode.OPERATION_ERROR, "添加跑腿账单失败");
}
orders.setState(5);
boolean update = ordersService.updateById(orders);
ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "修改订单状态失败");
return ResultUtils.success(true);
}
@PostMapping("/list/errand")
@AuthCheck(mustRole = UserConstant.ERRAND_ROLE)
public BaseResponse<List<OrderErrandVO>> listOrderErrandVO (HttpServletRequest request) {
Errand loginErrand = errandService.getLoginErrand(request);
Long errandId = loginErrand.getId();
List<ErrandOrder> errandOrders = errandOrderService.list(Wrappers.<ErrandOrder>lambdaQuery()
.eq(ErrandOrder::getErrandId, errandId)
.eq(ErrandOrder::getErrandState, 4));
List<Long> orderIds = errandOrders.stream()
.map(ErrandOrder::getOrderId)
.collect(Collectors.toList());
LambdaQueryWrapper<Orders> wrapper = new LambdaQueryWrapper<>();
wrapper.in(Orders::getId, orderIds);
List<Orders> ordersList = ordersService.list(wrapper);
List<OrderErrandVO> listOrderErrandVO = ordersService.getListOrderErrandVO(ordersList);
return ResultUtils.success(listOrderErrandVO);
}
@PostMapping("/list/status")
@AuthCheck(mustRole = UserConstant.DEFAULT_ROLE)
public BaseResponse<List<OrderStatusVO>> listOrderStatus (HttpServletRequest request) {
List<OrderStatusVO> liststatus = ordersService.liststatus(request);
return ResultUtils.success(liststatus);
}
@PostMapping("/list/numnber")
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<List<OrdersPickVO>> getPickUpNum () {
List<OrdersPickVO> ordernumbers = ordersService.getOrdernumber();
ThrowUtils.throwIf(ordernumbers == null, ErrorCode.OPERATION_ERROR, "获取单量失败");
return ResultUtils.success(ordernumbers);
}
@PostMapping("/download/errand")
public void downloadByErrand(@RequestBody OrderQueryRequest orderQueryRequest, HttpServletResponse response) throws IOException {
String startTime = orderQueryRequest.getStartTime();
String endTime = orderQueryRequest.getEndTime();
Long errandId = orderQueryRequest.getErrandId();
String sortOrder = orderQueryRequest.getSortOrder();
String sortField = orderQueryRequest.getSortField();
// 获取数据
QueryWrapper<Orders> wrapper = new QueryWrapper<>();
wrapper.ge(StringUtils.isNotBlank(startTime), "createTime", startTime);
wrapper.le(StringUtils.isNotBlank(endTime), "createTime", endTime);
wrapper.eq("errandId", errandId);
wrapper.orderBy(SqlUtils.validSortField(sortField), sortOrder.equals(CommonConstant.SORT_ORDER_ASC),
sortField);
List<Orders> ordersList = ordersService.list(wrapper);
Collection<Long> orderIds = ordersList.stream()
.map(Orders::getId)
.collect(Collectors.toList());
//获取errandState
LambdaQueryWrapper<ErrandOrder> wrapper1 = new LambdaQueryWrapper<>();
wrapper1.in(ErrandOrder::getOrderId, orderIds);
List<ErrandOrder> errandOrders = errandOrderService.list(wrapper1);
//先将errandOrder数据变成MAP提高查询效率
Map<Long, Integer> map = errandOrders.stream()
.collect(Collectors.toMap(ErrandOrder::getOrderId, ErrandOrder::getErrandState));
//获取跑腿收入
LambdaQueryWrapper<ErrandIncome> wrapper2 = new LambdaQueryWrapper<>();
wrapper2.in(ErrandIncome::getOrderId, orderIds);
List<ErrandIncome> errandIncomes = errandIncomeService.list(wrapper2);
Map<Long, BigDecimal> decimalMap = errandIncomes.stream()
.collect(Collectors.toMap(ErrandIncome::getOrderId, ErrandIncome::getIncome));
Collection<OrdersExcelByErrandVO> excelByErrandVOS = ordersList.stream()
.map(orders -> {
OrdersExcelByErrandVO ordersExcelByErrandVO = new OrdersExcelByErrandVO();
BeanUtils.copyProperties(orders, ordersExcelByErrandVO);
//改变订单支付状态
String stateText = ExcelUtils.getStateText(orders.getState());
ordersExcelByErrandVO.setState(stateText);
//改变跑腿订单状态
String errandStateText = ExcelUtils.getErrandStateText(map.getOrDefault(orders.getId(), 0));
ordersExcelByErrandVO.setErrandState(errandStateText);
ordersExcelByErrandVO.setErrandIncome(decimalMap.getOrDefault(orders.getId(), new BigDecimal("0.00")));
return ordersExcelByErrandVO;
}).collect(Collectors.toList());
// 设置导出名称
ExcelUtils.setExcelResponseProp(response, "跑腿订单信息");
// 获取输出流名称
try (OutputStream outputStream = response.getOutputStream()) {
EasyExcel.write(outputStream, OrdersExcelByErrandVO.class)
.sheet("订单数据")
.doWrite(excelByErrandVOS);
response.flushBuffer();
} catch (Exception e) {
log.error("Excel 导出失败", e);
}
}
@PostMapping("/count/errand")
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<BigDecimal> countErrand (@RequestBody OrdersCountByErrandRequest errandRequest) {
if (errandRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long errandId = errandRequest.getErrandId();
Integer state = errandRequest.getState();
LambdaQueryWrapper<ErrandIncome> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ErrandIncome::getErrandId, errandId);
queryWrapper.eq(ObjectUtils.isNotEmpty(state), ErrandIncome::getState, state);
List<ErrandIncome> errandIncomes = errandIncomeService.list(queryWrapper);
// 计算 income 总和
BigDecimal totalIncome = errandIncomes.stream()
.map(ErrandIncome::getIncome) // 获取 income
.filter(Objects::nonNull) // 过滤掉 null
.reduce(BigDecimal.ZERO, BigDecimal::add); // 求和
return ResultUtils.success(totalIncome);
}
private BaseResponse<String> getStringBaseResponse(String type, String startTime, String endTime, QueryWrapper<Orders> queryWrapper) {
queryWrapper.ge(StringUtils.isNotBlank(startTime), "createTime", startTime);
queryWrapper.le(StringUtils.isNotBlank(endTime), "createTime", endTime);
if (type.equals("money")) {
List<Orders> ordertList = ordersService.list(queryWrapper);
List<Orders> orderList = ordersService.list(queryWrapper);
BigDecimal money = new BigDecimal("0");
for (Orders order : ordertList) {
for (Orders order : orderList) {
money = money.add(order.getTotalPrice());
}
String strMoney = String.valueOf(money);

View File

@ -7,12 +7,13 @@ import com.bsz.school_send_back_end.service.OssService;
import com.bsz.school_send_back_end.common.ResultUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
@Api(tags = "阿里云文件管理")
@Tag(name = "阿里云文件上传接口")
@RestController
@RequestMapping("/fileOss")
public class OssController {

View File

@ -2,11 +2,13 @@ package com.bsz.school_send_back_end.controller;
import com.bsz.school_send_back_end.model.domain.PrivateMessage;
import com.bsz.school_send_back_end.service.WebsocketService;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
@Tag(name = "聊天接口")
@RestController
public class PrivateChatController {

View File

@ -11,13 +11,15 @@ import com.bsz.school_send_back_end.model.domain.PrivateMessage;
import com.bsz.school_send_back_end.model.domain.User;
import com.bsz.school_send_back_end.service.PrivateMessageService;
import com.bsz.school_send_back_end.service.UserService;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
@Tag(name = "私聊")
@RestController
@RequestMapping("/PrivateMessage")
public class PrivateMessageController {

View File

@ -0,0 +1,142 @@
package com.bsz.school_send_back_end.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.bsz.school_send_back_end.annotation.AuthCheck;
import com.bsz.school_send_back_end.common.BaseResponse;
import com.bsz.school_send_back_end.common.ErrorCode;
import com.bsz.school_send_back_end.common.ResultUtils;
import com.bsz.school_send_back_end.contant.UserConstant;
import com.bsz.school_send_back_end.exception.BusinessException;
import com.bsz.school_send_back_end.exception.ThrowUtils;
import com.bsz.school_send_back_end.model.domain.Business;
import com.bsz.school_send_back_end.model.domain.OrderRefunds;
import com.bsz.school_send_back_end.model.domain.Orders;
import com.bsz.school_send_back_end.model.domain.User;
import com.bsz.school_send_back_end.model.dto.refund.RefundAddRequest;
import com.bsz.school_send_back_end.model.dto.refund.RefundUpdateRequest;
import com.bsz.school_send_back_end.service.BusinessService;
import com.bsz.school_send_back_end.service.OrderRefundsService;
import com.bsz.school_send_back_end.service.OrdersService;
import com.bsz.school_send_back_end.service.UserService;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@Tag(name = "退款接口")
@RestController
@RequestMapping("/refund")
public class RefundController {
@Resource
private UserService userService;
@Resource
private OrderRefundsService refundsService;
@Resource
private OrdersService ordersService;
@Resource
private BusinessService businessService;
/**
* 用户申请退款
* @param refundAddRequest 退款请求
* @param request 网络请求
* @return 是否成功
*/
@PostMapping("/add")
public BaseResponse<Boolean> addRefund(@RequestBody RefundAddRequest refundAddRequest, HttpServletRequest request) {
User loginUser = userService.getLoginUser(request);
Long orderId = refundAddRequest.getOrderId();
LambdaQueryWrapper<Orders> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Orders::getId, orderId);
Orders orders = ordersService.getOne(queryWrapper);
ThrowUtils.throwIf(orders == null, ErrorCode.NOT_FOUND_ERROR, "未找到退款申请");
ThrowUtils.throwIf(orders.getState() != 1, ErrorCode.SYSTEM_ERROR, "该订单未支付");
OrderRefunds orderRefunds = new OrderRefunds();
BeanUtils.copyProperties(refundAddRequest, orderRefunds);
orderRefunds.setUserId(loginUser.getId());
boolean save = refundsService.save(orderRefunds);
ThrowUtils.throwIf(!save, ErrorCode.OPERATION_ERROR, "创建退款单失败");
return ResultUtils.success(true, "申请退款成功,等待商家确认");
}
/**
* 商家查询退款单
* @param status 退款单的状态
* @param request 网络请求
* @return 退款列表
*/
@GetMapping("/list/business")
@AuthCheck(mustRole = UserConstant.BUSINESS_ROLE)
public BaseResponse<List<OrderRefunds>> listRefundByBusiness(@RequestParam Integer status, HttpServletRequest request) {
Business loginBusiness = businessService.getLoginBusiness(request);
Long id = loginBusiness.getId();
LambdaQueryWrapper<OrderRefunds> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(OrderRefunds::getStatus, status)
.inSql(OrderRefunds::getOrderId, "SELECT id FROM orders WHERE businessId = " + id); // 根据商家ID过滤订单
List<OrderRefunds> list = refundsService.list(queryWrapper);
return ResultUtils.success(list);
}
@PostMapping("/update")
@AuthCheck(mustRole = UserConstant.BUSINESS_ROLE)
public BaseResponse<Boolean> updateRefundByBusiness (@RequestBody RefundUpdateRequest updateRequest, HttpServletRequest request) {
if (updateRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long orderId = updateRequest.getOrderId();
Integer status = updateRequest.getStatus();
Business loginBusiness = businessService.getLoginBusiness(request);
Long businessId = loginBusiness.getId();
Orders orders = ordersService.getOne(Wrappers.<Orders>lambdaQuery()
.eq(Orders::getId, orderId));
ThrowUtils.throwIf(orders == null, ErrorCode.PARAMS_ERROR, "传入的订单id不正确");
ThrowUtils.throwIf(businessId.equals(orders.getBusinessId()), ErrorCode.PARAMS_ERROR, "当前订单不属于该商家");
LambdaQueryWrapper<OrderRefunds> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(OrderRefunds::getOrderId, orderId);
OrderRefunds refunds = refundsService.getOne(queryWrapper);
refunds.setStatus(status); // 1-已同意 2 - 已拒绝
ThrowUtils.throwIf(status == 2 && updateRequest.getRefuseReason() == null, ErrorCode.PARAMS_ERROR, "请填写退款原因");
boolean updateById = refundsService.updateById(refunds);
ThrowUtils.throwIf(!updateById, ErrorCode.OPERATION_ERROR, "修改退款单状态失败");
return ResultUtils.success(true);
}
@PostMapping("/list/reson")
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<List<String>> getReasonByAdmin() {
// 获取今天的开始和结束时间
LocalDate today = LocalDate.now();
LocalDateTime startOfDay = today.atStartOfDay(); // 今天的00:00:00
LocalDateTime endOfDay = today.atTime(LocalTime.MAX); // 今天的23:59:59.999999999
// LocalDateTime 转换为 Date
Date startOfDayDate = Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant());
Date endOfDayDate = Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());
LambdaQueryWrapper<OrderRefunds> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.ge(OrderRefunds::getCreateTime, startOfDayDate);
queryWrapper.le(OrderRefunds::getCreateTime, endOfDayDate);
List<OrderRefunds> refunds = refundsService.list(queryWrapper);
List<String> collect = refunds.stream()
.map(OrderRefunds::getReason)
.collect(Collectors.toList());
return ResultUtils.success(collect);
}
}

View File

@ -0,0 +1,53 @@
package com.bsz.school_send_back_end.controller;
import com.bsz.school_send_back_end.common.BaseResponse;
import com.bsz.school_send_back_end.common.ResultUtils;
import com.bsz.school_send_back_end.utils.AliyunSmsUtils;
import com.bsz.school_send_back_end.utils.RandomNumberGenerator;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import jakarta.annotation.Resource;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;
@Tag(name = "阿里云短信接口")
@RestController
@Slf4j
@RequestMapping("/sms")
public class SmsController {
@Resource
private RedisTemplate redisTemplate;
@Resource
private RandomNumberGenerator randomNumberGenerator;
@Resource
private AliyunSmsUtils aliyunSmsUtils;
@GetMapping("/send/{phone}")
public BaseResponse<String> sendCode (@PathVariable String phone) {
String code = (String) redisTemplate.opsForValue().get(phone);
log.info("获取验证码:{}", code);
if (code == null) {
String fourBitRandom = randomNumberGenerator.getFourBitRandom();
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("code", fourBitRandom);
log.info("生成的验证码:" + fourBitRandom);
redisTemplate.opsForValue().set(phone, fourBitRandom, 5, TimeUnit.MINUTES);
boolean b = aliyunSmsUtils.sendSms(phone, hashMap);
log.info("短信发送状态,{}", b);
return ResultUtils.success("发送成功");
} else {
return ResultUtils.success("请勿重复发送验证码");
}
}
}

View File

@ -32,8 +32,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import java.util.List;
@Slf4j

View File

@ -7,10 +7,11 @@ import com.bsz.school_send_back_end.common.ResultUtils;
import com.bsz.school_send_back_end.exception.BusinessException;
import com.bsz.school_send_back_end.exception.ThrowUtils;
import com.bsz.school_send_back_end.model.domain.Systeminfo;
import com.bsz.school_send_back_end.model.dto.CommonRequest;
import com.bsz.school_send_back_end.model.dto.system.SystemAddRequest;
import com.bsz.school_send_back_end.model.dto.system.SystemDeleteRequest;
import com.bsz.school_send_back_end.model.dto.system.SystemQueryRequest;
import com.bsz.school_send_back_end.service.SysteminfoService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.PostMapping;
@ -18,9 +19,10 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
import java.util.List;
@Tag(name = "公告与轮播图接口")
@RestController
@Slf4j
@RequestMapping("/system")
@ -49,12 +51,12 @@ public class SystemInfoController {
* 删除功能
*/
@PostMapping("/delete")
public BaseResponse<Boolean> deleteInfo (@RequestBody SystemDeleteRequest deleteRequest) {
if (deleteRequest == null) {
public BaseResponse<Boolean> deleteInfo (@RequestBody CommonRequest commonRequest) {
if (commonRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
boolean remove = systeminfoService.removeById(deleteRequest.getId());
boolean remove = systeminfoService.removeById(commonRequest.getId());
ThrowUtils.throwIf(!remove, ErrorCode.OPERATION_ERROR, "添加失败");
return ResultUtils.success(true,"删除成功");
}

View File

@ -15,6 +15,7 @@ import com.bsz.school_send_back_end.model.dto.log.LogQueryRequest;
import com.bsz.school_send_back_end.model.vo.BusinessLogVO;
import com.bsz.school_send_back_end.service.BusinessService;
import com.bsz.school_send_back_end.service.SystemlogService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
@ -23,10 +24,11 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
@Tag(name = "系统日志接口")
@RestController
@RequestMapping("/log")
@Slf4j

View File

@ -4,14 +4,13 @@ import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayConfig;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeCloseModel;
import com.alipay.api.domain.AlipayTradeQueryModel;
import com.alipay.api.domain.AlipayTradeRefundModel;
import com.alipay.api.domain.*;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.*;
import com.alipay.api.response.*;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.bsz.school_send_back_end.common.BaseResponse;
import com.bsz.school_send_back_end.common.ErrorCode;
import com.bsz.school_send_back_end.common.ResultUtils;
@ -19,15 +18,16 @@ import com.bsz.school_send_back_end.config.AlipayClients;
import com.bsz.school_send_back_end.contant.RedisKeyConstant;
import com.bsz.school_send_back_end.exception.BusinessException;
import com.bsz.school_send_back_end.exception.ThrowUtils;
import com.bsz.school_send_back_end.listener.RabbitMQSender;
import com.bsz.school_send_back_end.mapper.UserMapper;
import com.bsz.school_send_back_end.model.domain.OrderRefunds;
import com.bsz.school_send_back_end.model.domain.Orders;
import com.bsz.school_send_back_end.model.domain.User;
import com.bsz.school_send_back_end.model.vo.UserVO;
import com.bsz.school_send_back_end.service.AliPayService;
import com.bsz.school_send_back_end.service.OrdersService;
import com.bsz.school_send_back_end.service.UserService;
import com.bsz.school_send_back_end.service.WebsocketService;
import com.bsz.school_send_back_end.service.*;
import com.bsz.school_send_back_end.utils.RandomNumberGenerator;
import com.bsz.school_send_back_end.utils.UniqueNumberGenerator;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
@ -35,12 +35,13 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.*;
@Tag(name = "支付宝支付相关接口")
@RestController
@Slf4j
@RequestMapping("/Alipay")
@ -58,6 +59,12 @@ public class TestAlipayController {
@Resource
private WebsocketService websocketService;
@Resource
private OrderRefundsService refundsService;
@Resource
private RabbitMQSender rabbitMQSender;
@ -78,7 +85,7 @@ public class TestAlipayController {
private static String authToken;
public static final String NOURL = "http://39.101.78.35:6448/api/Alipay/notifyUrl";
public static final String NOURL = "https://xiaokuaisong.shop/api/Alipay/notifyUrl";
/**
* 解析code获取open_id和token
@ -86,30 +93,38 @@ public class TestAlipayController {
* @throws AlipayApiException 支付宝api异常
*/
@GetMapping("/parseCode")
public BaseResponse<UserVO> login(String authcode, long severId, HttpServletRequest req) throws AlipayApiException {
AlipayConfig alipayConfig = choiceServer(severId);
public BaseResponse<UserVO> login(String authcode, HttpServletRequest req) throws AlipayApiException {
AlipayConfig alipayConfig = new AlipayConfig();
alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do");
alipayConfig.setAppId(appId);
alipayConfig.setPrivateKey(appPrivateKey);
alipayConfig.setFormat("json");
alipayConfig.setAlipayPublicKey(PublicKey);
alipayConfig.setCharset("UTF-8");
alipayConfig.setSignType("RSA2");
log.info("网关地址:" + alipayConfig.getServerUrl());
AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
request.setCode(authcode);
request.setGrantType("authorization_code");
AlipaySystemOauthTokenResponse response = alipayClient.execute(request);
// System.out.println(response.getBody());打印所有响应
System.out.println( "AlipaySystemOauthTokenResponse返回数据" + response.getBody()); //打印所有响应
authToken = response.getAccessToken();
if (!response.isSuccess()) {
return ResultUtils.error(ErrorCode.PARAMS_ERROR);
}
AlipayUserInfoShareRequest request1 = new AlipayUserInfoShareRequest();
AlipayUserInfoShareResponse response1 = alipayClient.execute(request1, authToken);
System.out.println( "AlipayUserInfoShareResponse返回数据" + response1.getBody());
User oid = userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getOpenId, response.getOpenId()));
UserVO userVO = new UserVO();
if (response1.isSuccess()) {
if (oid == null) {
User user = new User();
user.setOpenId(response.getOpenId());
user.setUsername(StringUtils.isAnyBlank(response1.getNickName()) ? "随机名字" + randomNumberGenerator.generateRandomNumber() : response1.getNickName());
user.setUsername(StringUtils.isAnyBlank(response1.getNickName()) ? "RandomName" + randomNumberGenerator.generateRandomNumber() : response1.getNickName());
user.setUserPassword("123456");
user.setUserAccount("用户" + randomNumberGenerator.generateRandomNumber());
user.setUserAccount("yonghu" + randomNumberGenerator.generateRandomNumber());
user.setAvatarUrl(StringUtils.isAnyBlank(response1.getAvatar()) ? "https://tfs.alipayobjects.com/images/partner/ATuihpR50zu7UAAAAAAAAAAAAADtl2AA" : response1.getAvatar());
userMapper.insert(user);
req.getSession().setAttribute(RedisKeyConstant.USER_LOGIN_STATE,user);
@ -149,27 +164,39 @@ public class TestAlipayController {
}
@GetMapping("/test/close")
public String closeOrder(String orderNo) throws AlipayApiException {
public String closeOrder(String out_trade_no, Long orderId) throws AlipayApiException {
log.info("out_trade_no:" + out_trade_no);
AlipayClients clients = new AlipayClients();
AlipayTradeCloseRequest request = new AlipayTradeCloseRequest();
AlipayTradeCloseModel model = new AlipayTradeCloseModel();
//model.setTradeNo(); 这是订单项
//订单项可能会有多个支付单
model.setTradeNo(orderNo);
model.setTradeNo(out_trade_no);
request.setBizModel(model);
request.setNotifyUrl(NOURL);
// request.setNotifyUrl(NOURL + "/close");
LambdaQueryWrapper<Orders> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Orders::getId, orderId);
Orders orders = ordersService.getOne(queryWrapper);
log.info("orders:" + orders);
ThrowUtils.throwIf(!orders.getState().equals(0),ErrorCode.SYSTEM_ERROR,"当前订单已支付或已退款");
orders.setState(3);
boolean update = ordersService.updateById(orders);
ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "修改订单状态失败");
AlipayTradeCloseResponse response = clients.alipayClient().execute(request);
if (!response.isSuccess()) {
throw new BusinessException(ErrorCode.OPERATION_ERROR, "支付宝修改订单失败");
}
//这里应该写进日志
log.info("订单已取消");
return response.getBody();
}
@GetMapping("/test/refund")
@Transactional(rollbackFor = Exception.class)
public String test_refund(String orderNo) throws AlipayApiException {
AlipayClients clients = new AlipayClients();
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
@ -182,20 +209,27 @@ public class TestAlipayController {
model.setOutTradeNo(orderNo);
model.setRefundAmount(String.valueOf(orders.getTotalPrice()));
//退款请求单号 要求唯一 需改
//model.setOutRequestNo("123");
String number = UniqueNumberGenerator.generateNumber();
model.setOutRequestNo(number);
log.info("outRequestNo:" + number);
request.setBizModel(model);
request.setNotifyUrl(NOURL);
AlipayTradeRefundResponse response = clients.alipayClient().execute(request);
String body = response.getBody();
ThrowUtils.throwIf(!orders.getState().equals(1),ErrorCode.SYSTEM_ERROR,"当前订单未支付");
orders.setState(2);
Date date = new Date();
orders.setUpdateTime(date);
boolean update = ordersService.updateById(orders);
ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "修改订单状态失败");
log.info("orderState:" + orders.getState());
OrderRefunds refunds = refundsService.getOne(Wrappers.<OrderRefunds>lambdaQuery()
.eq(OrderRefunds::getOrderId, orders.getId()));
ThrowUtils.throwIf(refunds == null, ErrorCode.OPERATION_ERROR, "没有退款");
refunds.setStatus(1); // 1-已同意
boolean updateById = refundsService.updateById(refunds);
ThrowUtils.throwIf(!updateById, ErrorCode.OPERATION_ERROR, "修改退款单失败");
AlipayTradeRefundResponse response = clients.alipayClient().execute(request);
String body = response.getBody();
if (!response.isSuccess()) {
throw new BusinessException(ErrorCode.OPERATION_ERROR, "支付宝退款失败");
}
log.info("退款成功");
return body;
}
@ -212,6 +246,9 @@ public class TestAlipayController {
AlipayTradeQueryResponse response = clients.alipayClient().execute(request);
String body = response.getBody();
if (!response.isSuccess()) {
throw new BusinessException(ErrorCode.OPERATION_ERROR, "支付宝查询订单失败");
}
return body;
}
@ -229,12 +266,16 @@ public class TestAlipayController {
QueryWrapper<Orders> ordersQueryWrapper = new QueryWrapper<>();
ordersQueryWrapper.eq("pickupCode", out_trade_no);
Orders orders = ordersService.getOne(ordersQueryWrapper);
if (orders.getPickupMethod() == 2) {
rabbitMQSender.sendCreateDeliveryOrderMessage(orders.getId());
}
orders.setState(1);
Date date = new Date();
orders.setUpdateTime(date);
boolean update = ordersService.updateById(orders);
log.info("orders:" + orders);
log.info("修改前orders:" + orders);
ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "修改订单状态失败");
log.info("修改后orders:" + orders);
//TODO 商家通知
websocketService.sendOrderMessage(orders);
@ -275,34 +316,4 @@ public class TestAlipayController {
}
}
private AlipayConfig choiceServer(long serverId) {
String testPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCc1rWOaCHl7KnDDMctWIgFJqerq9ZU8QsxSA+wQC4nrTfoQVSVZn8fDNosilCHda7yv910A9aJYqZKx0+NOXY9YvMbKYifWtO8TtzAQ9Q0EQXce85gnVQ3yn9evE1MVwfmMIiXJ2jx/dmGrxuADrLcsNB/U4xsusKcNQaA76vALtAYTnKwOODaDt5Qd2OC25PRcGtKupKIbir/f62tNquBkCX+Z5URBpy0rZY2hCu30v3uPv8I3OlpxegFwNDHpKMIY3+wjQtqsogQTn20E5wzeV3VNabNxbORq6B6nh8mvxlo9q14XvmMJDPUoWiJgyUUpaAPZFWSpRCrLvWQY/klAgMBAAECggEAZJ/Ahig7L2gClriZBXfadOuTAapS7dZkpu6j2iGjOyOATgu0N9I11vcI9zCab/5KC0abzzYzK5vWMv3jBSmLueDFNnUUSaEdXaB/Mv+RowIU75ujEgt+n/jUdTR8p3DjCYWz7L6FL1T9fdLU4vkLOlpauoYg/xVnjI7cqFacq8SWr3jiGj/I31O18y02/eDiyAb5RMlSlNGnzvDuRwJ3h2Sn1u7znbMCi6CydG3hx+I0GE2iJqVPymc1f0T0vm7Jy3l/zL84oNKLTgPCqG9k+eriC7RaMkbvPQFjWCDCuWxgYM2pi1L9ZDG+FkReTFsZw6r/TWc4sl2xtj3GDSrHYQKBgQD1NwFBMQwsUQ/aJP63R0gILWSFR0+yQ314vfRRVKoZTujbQr7RBAzgQff97DirINIxXCBeV0zifpc2IaAPaY29YjDnQU+xGqIO91EWPjMkQ6XUvGGesKnKDYkA5yBMyD3/BH8BwJruidW2DwtC2rGTW1hatkXNtYccEI79/00UOQKBgQCjvKIySZdRolOYUfSPHHipOygWClFy1DlI54XDnj0gRBoOrFkeqrXr+G8dYeXP6UnMqLWX8V3RuEJB8klwKGLkMtUWdqMQUFM5yvjuX2d1Y9R2ESw0ch70B/6aItMVv6aN4GjGwCJWD1XD54IpWxtAKJsUxbDiN+343cVqSQQETQKBgQDq9JBcMa3TTLyerbHuVPt88lmNpr2DNk2kAoZ142S0qTpO1M5XIcVgn3UKNWw69FDSgM529rkxkFA8ys0910q7erkW7Cp6rOU459onMOP5zGO5yeLTlbyqYHu0hMEbMQbOMjWrrSwGgcVnE1Ub8sYRRoYLLPkHWPcjee45C4WEaQKBgHkUUeDb+JD+d9DIsg9uH3ANdcwunyJJ+36E7q7EgjEtCxPUsSZzWIoBsbFJppbDzbYRABA3BYjDOAPqNhJBWzeiu16cJmM28wRmqwQi+q+dPgx9EHJL/cW5b7XtkKihi3mY/AIVLI71UhfHR8JrQ9CC9oM62V2/vDNvU8AP9G91AoGANdvRubukeWgvWryBTaPuUTpjkP1mOuJuHiHEW5/XePsURwS6gGP/qJ9bSbhYhQ6iDaMOQ8vahfYM3Q4jvDxgcKS/N1fxFTohcN4bVdvekq62YdTNqcGhNzaxMNboFZYt2dPeDm8PRRMP+abddrS2NqgVSOC3Ru5Kh9iRIs2LOgE=";
String testAlipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3JKMG3clg/1MqewlIK/koEhiQiSLagckb/2/Dyvg+rJ2snGiAgzNvhvvc1GdVC+Xnn/P+U+2tAytyuvbOuhmGgNZjeObczJXpo/0D6LBdYDrg4PVMDxpStCxLUpaShHbc/l/IquaorBwd94UJxIPAbUQkUBCbo94mGbhDX+yU4FQ6k1yeUtn03jvZ3AY0BEHpenCxWKgr5S/CUAYEitMbi/r7extBy6f4FCR120NM7VaNEK1xpHbGHo6rDpyiAOR1lWFuiqOJ1hv14UL/SfOLlzvUZiiPysIxdNjycZyiyRvFRHP3n8GBAaJDm9vVHwDfgQ5s3Ig2ggBeYXkFHZqWwIDAQAB";
String privateKey = appPrivateKey;
String alipayPublicKey = PublicKey;
AlipayConfig alipayConfig = new AlipayConfig();
if (serverId == 0) {
alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do");
alipayConfig.setAppId(appId);
alipayConfig.setPrivateKey(privateKey);
alipayConfig.setFormat("json");
alipayConfig.setAlipayPublicKey(alipayPublicKey);
alipayConfig.setCharset("UTF-8");
alipayConfig.setSignType("RSA2");
}
else if (serverId == 1) {
alipayConfig.setServerUrl("https://openapi-sandbox.dl.alipaydev.com/gateway.do");
alipayConfig.setAppId(appId);
alipayConfig.setPrivateKey(testPrivateKey);
alipayConfig.setFormat("json");
alipayConfig.setAlipayPublicKey(testAlipayPublicKey);
alipayConfig.setCharset("UTF-8");
alipayConfig.setSignType("RSA2");
}
else {
throw new BusinessException(ErrorCode.PARAMS_ERROR,"网关选择错误");
}
return alipayConfig;
}
}

View File

@ -16,13 +16,14 @@ import com.bsz.school_send_back_end.mapper.UserMapper;
import com.bsz.school_send_back_end.model.domain.User;
import com.bsz.school_send_back_end.service.UserService;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@ -32,6 +33,7 @@ import static com.bsz.school_send_back_end.contant.UserConstant.*;
/**
* 用户接口
*/
@Tag(name = "用户接口")
@RestController
@RequestMapping("/user")
public class UserController {
@ -82,12 +84,13 @@ public class UserController {
String userAccount = userLoginRequest.getUserAccount();
String userPassword = userLoginRequest.getUserPassword();
String appName = userLoginRequest.getAppName();
if (StringUtils.isAllBlank(userAccount, userPassword)){
throw new BusinessException(ErrorCode.PARAMS_ERROR, "请求参数为空");
}
String message = userService.userLogin(userAccount, userPassword, request);
String message = userService.userLogin(userAccount, userPassword, appName, request);
return ResultUtils.success(message);
}
@ -285,7 +288,7 @@ public class UserController {
*/
@GetMapping("/getById")
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<User> getUserById(long id, HttpServletRequest request) {
public BaseResponse<User> getUserById(@RequestParam long id) {
if (id <= 0) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}

View File

@ -1,18 +1,23 @@
package com.bsz.school_send_back_end.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.bsz.school_send_back_end.annotation.AuthCheck;
import com.bsz.school_send_back_end.common.BaseResponse;
import com.bsz.school_send_back_end.common.ErrorCode;
import com.bsz.school_send_back_end.common.ResultUtils;
import com.bsz.school_send_back_end.contant.UserConstant;
import com.bsz.school_send_back_end.exception.BusinessException;
import com.bsz.school_send_back_end.exception.ThrowUtils;
import com.bsz.school_send_back_end.model.domain.User;
import com.bsz.school_send_back_end.model.domain.UserRating;
import com.bsz.school_send_back_end.model.dto.CommonRequest;
import com.bsz.school_send_back_end.model.dto.userRating.UserRatingAddRequest;
import com.bsz.school_send_back_end.model.dto.userRating.UserRatingReviewRequest;
import com.bsz.school_send_back_end.service.UserRatingService;
import com.bsz.school_send_back_end.service.UserService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.PostMapping;
@ -20,10 +25,11 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import java.util.List;
@Tag(name = "用户评分接口")
@RestController
@Slf4j
@RequestMapping("/level")
@ -77,10 +83,56 @@ public class UserRatingController {
* @return 评分列表
*/
@PostMapping("/list")
public BaseResponse<List<UserRating>> listUserRating (HttpServletRequest request) {
public BaseResponse<List<UserRating>> listUserRating (@RequestBody CommonRequest commonRequest, HttpServletRequest request) {
if (commonRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long ratedEntityType = commonRequest.getId();
User loginUser = userService.getLoginUser(request);
Long userId = loginUser.getId();
List<UserRating> list = userRatingService.list(Wrappers.<UserRating>lambdaQuery().eq(UserRating::getUserId, userId));
List<UserRating> list = userRatingService.list(Wrappers.<UserRating>lambdaQuery()
.eq(UserRating::getUserId, userId).eq(UserRating::getRatedEntityType, ratedEntityType) );
return ResultUtils.success(list);
}
/**
* 展示当前用户评分
* @param request 当前用户
* @return 评分列表
*/
@PostMapping("/list/user")
public BaseResponse<List<UserRating>> listUserRatingByUser (HttpServletRequest request) {
List<UserRating> userRatings = userRatingService.listUserRatingByUser(request);
return ResultUtils.success(userRatings);
}
@PostMapping("/business/reply")
@AuthCheck(mustRole = UserConstant.BUSINESS_ROLE)
public BaseResponse<Boolean> businessReply (@RequestBody UserRatingReviewRequest userRatingReviewRequest, HttpServletRequest request) {
if (userRatingReviewRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long id = userRatingReviewRequest.getId();
String businessReview = userRatingReviewRequest.getBusinessReview();
userRatingService.validUserRatingByBusiness(id, request);
LambdaQueryWrapper<UserRating> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(UserRating::getId, id);
UserRating userRating = userRatingService.getOne(wrapper);
userRating.setBusinessReview(businessReview);
boolean update = userRatingService.updateById(userRating);
ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR);
return ResultUtils.success(true);
}
@PostMapping("/list/business")
public BaseResponse<List<UserRating>> listUserRatingByBusiness (@RequestBody CommonRequest commonRequest) {
if (commonRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long businessId = commonRequest.getId();
List<UserRating> list = userRatingService.list(Wrappers.<UserRating>lambdaQuery()
.eq(UserRating::getRatedEntityId, businessId));
return ResultUtils.success(list);
}
}

View File

@ -0,0 +1,142 @@
package com.bsz.school_send_back_end.listener;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.bsz.school_send_back_end.common.ErrorCode;
import com.bsz.school_send_back_end.contant.RabbitMQConstant;
import com.bsz.school_send_back_end.exception.ThrowUtils;
import com.bsz.school_send_back_end.model.domain.Orders;
import com.bsz.school_send_back_end.model.domain.PrivateMessage;
import com.bsz.school_send_back_end.service.OrdersService;
import com.bsz.school_send_back_end.utils.MultiDelayMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;
import jakarta.annotation.Resource;
@Component
@Slf4j
public class RabbitMQReceiver {
@Resource
private OrdersService ordersService;
@Resource
private RabbitTemplate rabbitTemplate;
@RabbitListener(queues = RabbitMQConstant.TOPIC_QUEUE2)
public Orders receiveOrder (Orders message) {
log.info("接收数据:" + message);
return message;
}
@RabbitListener(queues = RabbitMQConstant.TOPIC_QUEUE1)
public PrivateMessage receive (PrivateMessage message) {
log.info("接收数据:" + message);
return message;
}
/**
* 过三分钟未支付自动取消
* @param msg
*/
@RabbitListener(bindings = @QueueBinding(
value = @Queue(RabbitMQConstant.CANCEL_ORDER_QUEUE),
exchange = @Exchange(name = RabbitMQConstant.CANCEL_ORDER_EXCHANGE, delayed = "true"),
key = RabbitMQConstant.CANCEL_ORDER_ROUTING_KEY
))
public void handleExpiredOrder(MultiDelayMessage<Long> msg) {
Long orderId = msg.getData();
log.info("订单超时检查订单ID{}", orderId);
// 查询订单
LambdaQueryWrapper<Orders> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Orders::getId, orderId);
Orders orders = ordersService.getOne(queryWrapper);
if (orders == null) {
log.warn("订单不存在订单ID{}", orderId);
return;
}
if (orders.getState() == 0) { // 订单仍未支付
if (msg.hasNextDelay()) {
// 还有下一个检查点继续发送延迟消息
int nextDelay = msg.removeNextDelay().intValue();
rabbitTemplate.convertAndSend(RabbitMQConstant.CANCEL_ORDER_EXCHANGE,
RabbitMQConstant.CANCEL_ORDER_ROUTING_KEY, msg, message -> {
message.getMessageProperties().setDelay(nextDelay);
return message;
});
log.info("订单未支付,下一次检查延迟 {} 毫秒订单ID{}", nextDelay, orderId);
} else {
// **所有检查点都执行完才执行订单取消**
log.info("订单超时未支付自动取消订单ID{}", orderId);
orders.setState(3); // 订单状态修改为已取消假设 3 代表已取消
boolean update = ordersService.updateById(orders);
ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "订单取消失败");
log.info("订单超时已取消订单ID{}", orderId);
}
} else {
log.info("订单已支付无需取消订单ID{}", orderId);
}
}
/**
* 过三十分钟无人接单自动退款
* @param msg
*/
@RabbitListener(bindings = @QueueBinding(
value = @Queue(RabbitMQConstant.DELIVERY_ORDER_QUEUE),
exchange = @Exchange(name = RabbitMQConstant.DELIVERY_DELAY_EXCHANGE, delayed = "true"),
key = RabbitMQConstant.DELIVERY_ORDER_ROUTING_KEY
))
public void handleExpiredDeliveryOrder(MultiDelayMessage<Long> msg) {
Long orderId = msg.getData();
log.info("外卖单超时检查订单ID{}", orderId);
// 查询订单
LambdaQueryWrapper<Orders> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Orders::getId, orderId);
Orders orders = ordersService.getOne(queryWrapper);
if (orders == null) {
log.warn("外卖订单不存在订单ID{}", orderId);
return;
}
if (orders.getState() == 1) { // 外卖单仍未支付
// 外卖单超时退款逻辑
if (msg.hasNextDelay()) {
int nextDelay = msg.removeNextDelay().intValue();
rabbitTemplate.convertAndSend(RabbitMQConstant.DELIVERY_DELAY_EXCHANGE,
RabbitMQConstant.DELIVERY_ORDER_ROUTING_KEY, msg, message -> {
message.getMessageProperties().setDelay(nextDelay);
return message;
});
log.info("外卖单未接单,下一次检查延迟 {} 毫秒订单ID{}", nextDelay, orderId);
} else {
// 超过30分钟未接单自动退款
log.info("外卖单超时未接单自动退款订单ID{}", orderId);
orders.setState(2); // 订单状态修改为已退款
boolean update = ordersService.updateById(orders);
ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "外卖单退款修改失败");
log.info("外卖单超时退款成功订单ID{}", orderId);
}
} else {
log.info("外卖单已支付无需退款订单ID{}", orderId);
}
}
}

View File

@ -0,0 +1,109 @@
package com.bsz.school_send_back_end.listener;
import com.bsz.school_send_back_end.contant.RabbitMQConstant;
import com.bsz.school_send_back_end.model.domain.Orders;
import com.bsz.school_send_back_end.model.domain.PrivateMessage;
import com.bsz.school_send_back_end.utils.MultiDelayMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;
import jakarta.annotation.Resource;
import java.util.*;
@Component
@Slf4j
public class RabbitMQSender {
@Resource
private AmqpTemplate amqpTemplate;
@Resource
private RabbitTemplate rabbitTemplate;
public void sendOrderMessage (Orders message) {
log.info("消息队列 MQSender 业务消息发送 send OrderMessage:" + message);
amqpTemplate.convertAndSend(RabbitMQConstant.TOPIC_QUEUE2,message, msg->{
msg.getMessageProperties().setReplyTo(RabbitMQConstant.ORDER_REPLY_QUEUE);
return msg;
});
}
public void sendPrivateMessage(PrivateMessage message) {
log.info("消息队列 MQSender 业务消息发送 send message:" + message);
amqpTemplate.convertAndSend(RabbitMQConstant.TOPIC_QUEUE1,message, msg->{
msg.getMessageProperties().setReplyTo(RabbitMQConstant.TOPIC_QUEUE1);
return msg;
});
}
// public void sendDelayedOrderMessage(long orderId, long delayMillis) {
// Map<String, Object> headers = new HashMap<>();
// headers.put("x-delay", delayMillis); // 设置延迟时间毫秒
//
// amqpTemplate.convertAndSend(
// RabbitMQConstant.DELAYED_EXCHANGE, // 交换机
// RabbitMQConstant.DELAYED_ROUTING_KEY, // 路由键
// orderId, // 消息内容订单 ID
// message -> {
// message.getMessageProperties().getHeaders().putAll(headers); // 将延迟时间添加到消息头部
// return message;
// });
// log.info("发送延迟订单取消消息订单ID: " + orderId + ",延迟时间: " + delayMillis + "ms");
// }
//
//
// public void sendDelayedMessage() {
// // 设置延迟时间为 5
// MessageProperties messageProperties = new MessageProperties();
// messageProperties.setHeader("x-delay", 5000); // 延迟时间单位毫秒
// Message message = new Message("Hello, delayed world!".getBytes(), messageProperties);
//
// // 发送到延迟交换机
// amqpTemplate.send(RabbitMQConstant.DELAYED_EXCHANGE, RabbitMQConstant.DELAYED_ROUTING_KEY, message);
// log.info("发送延迟成功:" + new Date());
// }
public void sendCreateOrderMessage(Long orderId) {
// 复制 DELAY_MILLIS 到一个新的 ArrayList
List<Long> newDelayMillis = new ArrayList<>(RabbitMQConstant.DINE_IN_DELAY_MILLIS);
// 延迟检查订单状态信息
MultiDelayMessage<Long> msg = new MultiDelayMessage<>(orderId, newDelayMillis);
int delayValue = msg.removeNextDelay().intValue();
rabbitTemplate.convertAndSend(
RabbitMQConstant.CANCEL_ORDER_EXCHANGE,
RabbitMQConstant.CANCEL_ORDER_ROUTING_KEY,
msg,
message -> {
// 新版本设置延迟时间的方式
message.getMessageProperties()
.setHeader("x-delay", delayValue); // 单位毫秒
return message;
}
);
log.info("发送成功orderID{}", orderId);
}
//自动退款30分钟未接单的
public void sendCreateDeliveryOrderMessage (Long orderId) {
List newDelayMillis = new ArrayList<>(RabbitMQConstant.DELIVERY_DELAY_MILLIS); // 假设延迟时间在此列表中
MultiDelayMessage msg = new MultiDelayMessage<>(orderId, newDelayMillis);
int delayValue = msg.removeNextDelay().intValue();
rabbitTemplate.convertAndSend(
RabbitMQConstant.DELIVERY_DELAY_EXCHANGE,
RabbitMQConstant.DELIVERY_ORDER_ROUTING_KEY,
msg,
message -> {
// 新版使用x-delay头设置延迟
message.getMessageProperties()
.setHeader("x-delay", delayValue); // 单位毫秒
return message;
}
);
log.info("外卖单延迟消息发送成功订单ID{}", orderId);
}
}

View File

@ -10,12 +10,12 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.session.data.redis.RedisIndexedSessionRepository;
import org.springframework.session.data.redis.RedisSessionRepository;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import java.util.concurrent.TimeUnit;
@ -29,7 +29,7 @@ public class SessionManager {
private StringRedisTemplate stringRedisTemplate;
@Resource
private RedisIndexedSessionRepository sessionRepository;
private RedisSessionRepository sessionRepository; // 正确类型匹配
@Value("${spring.session.timeout}")
private long sessionTimeout;
@ -41,7 +41,7 @@ public class SessionManager {
/**
* 登录
*/
public String login (User user, HttpServletRequest request) {
public String login (User user, String appName, HttpServletRequest request) {
String message = "登录成功";
String ipAddress = NetUtils.getIpAddress(request);
String oldSessionId = this.checkOtherLogin(user.getId(), ipAddress, request);
@ -54,7 +54,8 @@ public class SessionManager {
UserLoginRedisInfo build = UserLoginRedisInfo.builder()
.user(user)
.ip(ipAddress).
.ip(ipAddress)
.appName(appName).
build();
this.setLoginAttribute(request, USER_LOGIN_STATE, build);
return message;
@ -135,6 +136,7 @@ public class SessionManager {
String userExtraInfoKey = RedisKeyUtils.getUserExtraInfoKey(user.getId());
stringRedisTemplate.opsForHash().put(userExtraInfoKey, SESSION_ID, sessionId);
stringRedisTemplate.opsForHash().put(userExtraInfoKey, IP, userLoginRedisInfo.getIp());
stringRedisTemplate.opsForHash().put(userExtraInfoKey, APPNAME,userLoginRedisInfo.getAppName());
stringRedisTemplate.expire(userExtraInfoKey, sessionTimeout, TimeUnit.SECONDS);
}
else {

View File

@ -4,10 +4,7 @@ import com.bsz.school_send_back_end.model.domain.BusinessAuth;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author Lenovo
* @description 针对表business_auth(商家认证)的数据库操作Mapper
* @createDate 2024-06-24 21:01:17
* @Entity com.bsz.school_send_back_end.model.domain.BusinessAuth
* @author xy
*/
public interface BusinessAuthMapper extends BaseMapper<BusinessAuth> {

View File

@ -7,10 +7,7 @@ import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @author pc
* @description 针对表business_level的数据库操作Mapper
* @createDate 2024-11-22 14:02:11
* @Entity com.bsz.school_send_back_end.model.domain.BusinessLevel
* @author xy
*/
public interface BusinessLevelMapper extends BaseMapper<BusinessLevel> {
}

View File

@ -4,10 +4,7 @@ import com.bsz.school_send_back_end.model.domain.Business;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author Lenovo
* @description 针对表business(商家)的数据库操作Mapper
* @createDate 2024-06-24 21:01:17
* @Entity com.bsz.school_send_back_end.model.domain.Business
* @author xy
*/
public interface BusinessMapper extends BaseMapper<Business> {

View File

@ -0,0 +1,15 @@
package com.bsz.school_send_back_end.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bsz.school_send_back_end.model.domain.Businessinfo;
/**
* @author xy
*/
public interface BusinessinfoMapper extends BaseMapper<Businessinfo> {
}

View File

@ -4,10 +4,7 @@ import com.bsz.school_send_back_end.model.domain.Cart;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author pc
* @description 针对表cart(购物车表)的数据库操作Mapper
* @createDate 2024-08-13 13:59:13
* @Entity com.bsz.school_send_back_end.model.domain.Cart
* @author xy
*/
public interface CartMapper extends BaseMapper<Cart> {

View File

@ -4,10 +4,7 @@ import com.bsz.school_send_back_end.model.domain.Category;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author pc
* @description 针对表category(分类表)的数据库操作Mapper
* @createDate 2024-09-01 18:09:04
* @Entity com.bsz.school_send_back_end.model.domain.Category
* @author xy
*/
public interface CategoryMapper extends BaseMapper<Category> {

View File

@ -4,10 +4,7 @@ import com.bsz.school_send_back_end.model.domain.Collect;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author pc
* @description 针对表collect的数据库操作Mapper
* @createDate 2024-11-12 19:19:50
* @Entity com.bsz.school_send_back_end.model.domain.Collect
* @author xy
*/
public interface CollectMapper extends BaseMapper<Collect> {

View File

@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bsz.school_send_back_end.model.domain.DishesGroup;
/**
* @author bsz
* @author xy
*/
public interface DishesGroupMapper extends BaseMapper<DishesGroup> {

View File

@ -5,10 +5,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bsz.school_send_back_end.model.domain.Dishes;
/**
* @author pc
* @description 针对表dishes(菜品表)的数据库操作Mapper
* @createDate 2024-06-29 17:23:31
* @Entity com.bsz.school_send_back_end.model.domain.Dishes
* @author xy
*/
public interface DishesMapper extends BaseMapper<Dishes> {

View File

@ -0,0 +1,15 @@
package com.bsz.school_send_back_end.mapper;
import com.bsz.school_send_back_end.model.domain.ErrandAuth;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author xy
*/
public interface ErrandAuthMapper extends BaseMapper<ErrandAuth> {
}

View File

@ -0,0 +1,15 @@
package com.bsz.school_send_back_end.mapper;
import com.bsz.school_send_back_end.model.domain.ErrandBill;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author xy
*/
public interface ErrandBillMapper extends BaseMapper<ErrandBill> {
}

View File

@ -0,0 +1,15 @@
package com.bsz.school_send_back_end.mapper;
import com.bsz.school_send_back_end.model.domain.ErrandIncome;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author xy
*/
public interface ErrandIncomeMapper extends BaseMapper<ErrandIncome> {
}

View File

@ -0,0 +1,15 @@
package com.bsz.school_send_back_end.mapper;
import com.bsz.school_send_back_end.model.domain.ErrandLevel;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author xy
*/
public interface ErrandLevelMapper extends BaseMapper<ErrandLevel> {
}

View File

@ -0,0 +1,15 @@
package com.bsz.school_send_back_end.mapper;
import com.bsz.school_send_back_end.model.domain.Errand;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author xy
*/
public interface ErrandMapper extends BaseMapper<Errand> {
}

View File

@ -0,0 +1,15 @@
package com.bsz.school_send_back_end.mapper;
import com.bsz.school_send_back_end.model.domain.ErrandOrder;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author xy
*/
public interface ErrandOrderMapper extends BaseMapper<ErrandOrder> {
}

View File

@ -4,10 +4,7 @@ import com.bsz.school_send_back_end.model.domain.OrderDetails;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author Lenovo
* @description 针对表order_details(订单详情表)的数据库操作Mapper
* @createDate 2024-09-12 12:31:48
* @Entity com.bsz.school_send_back_end.model.domain.OrderDetails
* @author xy
*/
public interface OrderDetailsMapper extends BaseMapper<OrderDetails> {

View File

@ -0,0 +1,15 @@
package com.bsz.school_send_back_end.mapper;
import com.bsz.school_send_back_end.model.domain.OrderImage;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author xy
*/
public interface OrderImageMapper extends BaseMapper<OrderImage> {
}

View File

@ -0,0 +1,15 @@
package com.bsz.school_send_back_end.mapper;
import com.bsz.school_send_back_end.model.domain.OrderRefunds;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author xy
*/
public interface OrderRefundsMapper extends BaseMapper<OrderRefunds> {
}

View File

@ -4,10 +4,7 @@ import com.bsz.school_send_back_end.model.domain.Orders;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author Lenovo
* @description 针对表orders(订单表)的数据库操作Mapper
* @createDate 2024-09-12 12:31:49
* @Entity com.bsz.school_send_back_end.model.domain.Orders
* @author xy
*/
public interface OrdersMapper extends BaseMapper<Orders> {

View File

@ -4,10 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bsz.school_send_back_end.model.domain.PrivateMessage;
/**
* @author pc
* @description 针对表private_message的数据库操作Mapper
* @createDate 2024-11-10 15:16:02
* @Entity com.bsz.school_send_back_end.model.domain.PrivateMessage
* @author xy
*/
public interface PrivateMessageMapper extends BaseMapper<PrivateMessage> {

View File

@ -4,10 +4,7 @@ import com.bsz.school_send_back_end.model.domain.SpecificationsDishes;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author pc
* @description 针对表specifications_dishes(菜品和规格的中间表)的数据库操作Mapper
* @createDate 2024-06-29 21:18:25
* @Entity generator.domain.SpecificationsDishes
* @author xy
*/
public interface SpecificationsDishesMapper extends BaseMapper<SpecificationsDishes> {

View File

@ -4,10 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bsz.school_send_back_end.model.domain.Specifications;
/**
* @author pc
* @description 针对表specifications(规格表)的数据库操作Mapper
* @createDate 2024-06-29 21:10:34
* @Entity com.bsz.school_send_back_end.model.domain.Specifications
* @author xy
*/
public interface SpecificationsMapper extends BaseMapper<Specifications> {

View File

@ -4,10 +4,7 @@ import com.bsz.school_send_back_end.model.domain.Systeminfo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author pc
* @description 针对表systeminfo(系统信息)的数据库操作Mapper
* @createDate 2024-09-23 19:16:42
* @Entity com.bsz.school_send_back_end.model.domain.Systeminfo
* @author xy
*/
public interface SysteminfoMapper extends BaseMapper<Systeminfo> {

View File

@ -4,10 +4,7 @@ import com.bsz.school_send_back_end.model.domain.Systemlog;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author pc
* @description 针对表systemlog(系统信息)的数据库操作Mapper
* @createDate 2024-09-25 15:40:09
* @Entity com.bsz.school_send_back_end.model.domain.Systemlog
* @author xy
*/
public interface SystemlogMapper extends BaseMapper<Systemlog> {

View File

@ -6,10 +6,7 @@ import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
/**
* @author bsz
* @description 针对表user(用户)的数据库操作Mapper
* @createDate 2024-05-09 20:59:59
*
* @author xy
*/
@Mapper
public interface UserMapper extends BaseMapper<User> {

View File

@ -0,0 +1,20 @@
package com.bsz.school_send_back_end.mapper;
import com.bsz.school_send_back_end.model.domain.UserRating;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
/**
* @author xy
*/
public interface UserRatingMapper extends BaseMapper<UserRating> {
@Select("select avg(rating) from school_send.user_rating where ratedEntityId = #{ratedEntityId}")
// @Select("select avg(rating) from xiaokuaisong.user_rating where ratedEntityId = #{ratedEntityId}")
Double findAvgByRatedEntityId(@Param("ratedEntityId") Long ratedEntityId);
}

View File

@ -0,0 +1,41 @@
package com.bsz.school_send_back_end.model.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
* 系统信息
* @TableName businessinfo
*/
@TableName(value ="businessinfo")
@Data
public class Businessinfo implements Serializable {
/**
* id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 商家id
*/
private Long businessId;
/**
* 功能内容
*/
private String content;
/**
* 创建时间
*/
private Date createTime;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

View File

@ -1,9 +1,6 @@
package com.bsz.school_send_back_end.model.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serial;
import java.io.Serializable;
@ -72,6 +69,7 @@ public class Cart implements Serializable {
/**
* 是否删除
*/
@TableLogic
private Integer isDelete;
@Serial

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