Compare commits
8 Commits
校快送2024.12
...
main
Author | SHA1 | Date | |
---|---|---|---|
bce1748768 | |||
39f397fd70 | |||
e9f6a219c6 | |||
c5f84d2f05 | |||
530f0fb620 | |||
30e68a1c6b | |||
251e98bb68 | |||
947b94418b |
BIN
school_lend_back_end/school_lend_back_end/deps.txt
Normal file
BIN
school_lend_back_end/school_lend_back_end/deps.txt
Normal file
Binary file not shown.
|
@ -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>
|
|
@ -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;
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
|
@ -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);
|
||||
//写入系统日志
|
|
@ -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) {
|
|
@ -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
|
||||
// }
|
||||
}
|
|
@ -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;
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -14,7 +14,7 @@ public interface FileConstant {
|
|||
/**
|
||||
* 服务器访问地址
|
||||
*/
|
||||
String SERVER_HOST = "154.8.193.216:9494";
|
||||
String SERVER_HOST = "https://xiaoshitong.xyz";
|
||||
|
||||
/**
|
||||
* 服务器上传路径
|
|
@ -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";
|
||||
//
|
||||
|
||||
|
||||
}
|
|
@ -13,4 +13,5 @@ public interface RedisKeyConstant {
|
|||
String USER_LOGIN_STATE = "xiaokuaisong_user";
|
||||
String IP = "ip";
|
||||
String SESSION_ID = "sessionId";
|
||||
String APPNAME = "appName";
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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]"));
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -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, "查询成功");
|
||||
}
|
||||
}
|
|
@ -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());
|
||||
}
|
||||
}
|
|
@ -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")
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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")
|
|
@ -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")
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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")
|
|
@ -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);
|
|
@ -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 {
|
|
@ -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 {
|
||||
|
|
@ -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 {
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -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("请勿重复发送验证码");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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
|
|
@ -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,"删除成功");
|
||||
}
|
|
@ -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
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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 {
|
|
@ -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> {
|
||||
|
|
@ -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> {
|
||||
}
|
|
@ -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> {
|
||||
|
|
@ -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> {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -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> {
|
||||
|
|
@ -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> {
|
||||
|
|
@ -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> {
|
||||
|
|
@ -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> {
|
||||
|
|
@ -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> {
|
||||
|
|
@ -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> {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -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> {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -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> {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -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> {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -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> {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -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> {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -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> {
|
||||
|
|
@ -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> {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -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> {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -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> {
|
||||
|
|
@ -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> {
|
||||
|
|
@ -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> {
|
||||
|
|
@ -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> {
|
||||
|
|
@ -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> {
|
||||
|
|
@ -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> {
|
||||
|
|
@ -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> {
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
|
@ -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
Loading…
Reference in New Issue
Block a user