From 2941cd23c4771a06809f65c03b1d83796d3720cd Mon Sep 17 00:00:00 2001
From: FAD Dev <823267011@qq.com>
Date: Fri, 22 May 2026 09:36:01 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E7=A6=8F=E5=AE=89=E5=BE=B7=E6=99=BA?=
=?UTF-8?q?=E6=85=A7=E6=8A=A5=E4=BB=B7=E5=B9=B3=E5=8F=B0=20-=20=E5=AE=8C?=
=?UTF-8?q?=E6=95=B4=E4=B8=9A=E5=8A=A1=E6=A8=A1=E5=9D=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
基于RuoYi-Vue2构建的智慧采购报价平台,包含:
后端(Spring Boot + MyBatis):
- 物料管理 (BizMaterial)
- 供应商管理 (BizSupplier)
- 报价请求RFQ (BizRfq)
- 供应商报价单 (BizQuotation)
- 智慧比价分析 (BizComparison)
- 采购单 (BizPurchaseOrder)
- 供应商评价 (BizSupplierEvaluation)
- 订单异议 (BizOrderObjection)
- 交易记录 (BizTransaction)
- 租户管理-SaaS数据隔离 (BizTenant)
前端(Vue2 + Element UI):
- 10个业务模块完整页面
- ERPNext风格主题(蓝色系)
- 福安德品牌logo
部署:
- Docker Compose一键部署
- MySQL 8.0 + Redis 7 + Nginx
- 前端端口 10031
---
.gitignore | 75 +-
deploy/Dockerfile | 19 +
deploy/deploy.sh | 38 +
deploy/docker-compose.yml | 75 ++
deploy/init-sql/01-init.sh | 7 +
deploy/init-sql/02-ry-vue.sql | 723 ++++++++++++++++++
deploy/init-sql/03-bid-tables.sql | 279 +++++++
deploy/nginx.conf | 35 +
.../bid/BizComparisonController.java | 20 +
.../controller/bid/BizMaterialController.java | 57 ++
.../bid/BizOrderObjectionController.java | 52 ++
.../bid/BizPurchaseOrderController.java | 61 ++
.../bid/BizQuotationController.java | 73 ++
.../web/controller/bid/BizRfqController.java | 69 ++
.../controller/bid/BizSupplierController.java | 57 ++
.../bid/BizSupplierEvaluationController.java | 44 ++
.../controller/bid/BizTenantController.java | 57 ++
.../bid/BizTransactionController.java | 29 +
.../src/main/resources/application-prod.yml | 50 ++
.../system/domain/bid/BizComparisonVO.java | 54 ++
.../ruoyi/system/domain/bid/BizMaterial.java | 41 +
.../system/domain/bid/BizOrderObjection.java | 49 ++
.../system/domain/bid/BizPurchaseOrder.java | 51 ++
.../domain/bid/BizPurchaseOrderItem.java | 37 +
.../ruoyi/system/domain/bid/BizQuotation.java | 61 ++
.../system/domain/bid/BizQuotationItem.java | 40 +
.../com/ruoyi/system/domain/bid/BizRfq.java | 38 +
.../ruoyi/system/domain/bid/BizRfqItem.java | 34 +
.../ruoyi/system/domain/bid/BizSupplier.java | 34 +
.../domain/bid/BizSupplierEvaluation.java | 52 ++
.../ruoyi/system/domain/bid/BizTenant.java | 35 +
.../system/domain/bid/BizTransaction.java | 60 ++
.../mapper/bid/BizComparisonMapper.java | 10 +
.../system/mapper/bid/BizMaterialMapper.java | 13 +
.../mapper/bid/BizOrderObjectionMapper.java | 13 +
.../bid/BizPurchaseOrderItemMapper.java | 10 +
.../mapper/bid/BizPurchaseOrderMapper.java | 13 +
.../mapper/bid/BizQuotationItemMapper.java | 10 +
.../system/mapper/bid/BizQuotationMapper.java | 13 +
.../system/mapper/bid/BizRfqItemMapper.java | 10 +
.../ruoyi/system/mapper/bid/BizRfqMapper.java | 13 +
.../bid/BizSupplierEvaluationMapper.java | 13 +
.../system/mapper/bid/BizSupplierMapper.java | 13 +
.../system/mapper/bid/BizTenantMapper.java | 13 +
.../mapper/bid/BizTransactionMapper.java | 13 +
.../service/bid/IBizComparisonService.java | 8 +
.../service/bid/IBizMaterialService.java | 13 +
.../bid/IBizOrderObjectionService.java | 13 +
.../service/bid/IBizPurchaseOrderService.java | 14 +
.../service/bid/IBizQuotationService.java | 18 +
.../system/service/bid/IBizRfqService.java | 16 +
.../bid/IBizSupplierEvaluationService.java | 13 +
.../service/bid/IBizSupplierService.java | 13 +
.../system/service/bid/IBizTenantService.java | 13 +
.../service/bid/IBizTransactionService.java | 13 +
.../bid/impl/BizComparisonServiceImpl.java | 64 ++
.../bid/impl/BizMaterialServiceImpl.java | 44 ++
.../impl/BizOrderObjectionServiceImpl.java | 44 ++
.../bid/impl/BizPurchaseOrderServiceImpl.java | 101 +++
.../bid/impl/BizQuotationServiceImpl.java | 98 +++
.../service/bid/impl/BizRfqServiceImpl.java | 74 ++
.../BizSupplierEvaluationServiceImpl.java | 44 ++
.../bid/impl/BizSupplierServiceImpl.java | 44 ++
.../bid/impl/BizTenantServiceImpl.java | 44 ++
.../bid/impl/BizTransactionServiceImpl.java | 44 ++
.../mapper/bid/BizComparisonMapper.xml | 25 +
.../mapper/bid/BizMaterialMapper.xml | 63 ++
.../mapper/bid/BizOrderObjectionMapper.xml | 59 ++
.../mapper/bid/BizPurchaseOrderItemMapper.xml | 27 +
.../mapper/bid/BizPurchaseOrderMapper.xml | 70 ++
.../mapper/bid/BizQuotationItemMapper.xml | 28 +
.../mapper/bid/BizQuotationMapper.xml | 72 ++
.../resources/mapper/bid/BizRfqItemMapper.xml | 26 +
.../resources/mapper/bid/BizRfqMapper.xml | 56 ++
.../bid/BizSupplierEvaluationMapper.xml | 63 ++
.../mapper/bid/BizSupplierMapper.xml | 57 ++
.../resources/mapper/bid/BizTenantMapper.xml | 58 ++
.../mapper/bid/BizTransactionMapper.xml | 54 ++
ruoyi-ui/.env.development | 2 +-
ruoyi-ui/.env.production | 2 +-
ruoyi-ui/.env.staging | 2 +-
ruoyi-ui/src/api/bid/comparison.js | 2 +
ruoyi-ui/src/api/bid/evaluation.js | 7 +
ruoyi-ui/src/api/bid/material.js | 7 +
ruoyi-ui/src/api/bid/objection.js | 7 +
ruoyi-ui/src/api/bid/purchaseorder.js | 8 +
ruoyi-ui/src/api/bid/quotation.js | 10 +
ruoyi-ui/src/api/bid/rfq.js | 9 +
ruoyi-ui/src/api/bid/supplier.js | 7 +
ruoyi-ui/src/api/bid/tenant.js | 7 +
ruoyi-ui/src/api/bid/transaction.js | 7 +
ruoyi-ui/src/assets/logo/logo.png | Bin 5663 -> 1716 bytes
ruoyi-ui/src/assets/styles/variables.scss | 76 +-
ruoyi-ui/src/settings.js | 4 +-
ruoyi-ui/src/store/modules/settings.js | 2 +-
ruoyi-ui/src/views/bid/comparison/index.vue | 77 ++
ruoyi-ui/src/views/bid/evaluation/index.vue | 75 ++
ruoyi-ui/src/views/bid/material/index.vue | 132 ++++
ruoyi-ui/src/views/bid/objection/index.vue | 106 +++
.../src/views/bid/purchaseorder/index.vue | 177 +++++
ruoyi-ui/src/views/bid/quotation/index.vue | 210 +++++
ruoyi-ui/src/views/bid/rfq/index.vue | 185 +++++
ruoyi-ui/src/views/bid/supplier/index.vue | 103 +++
ruoyi-ui/src/views/bid/tenant/index.vue | 78 ++
ruoyi-ui/src/views/bid/transaction/index.vue | 66 ++
sql/bid_tables.sql | 279 +++++++
106 files changed, 5511 insertions(+), 92 deletions(-)
create mode 100644 deploy/Dockerfile
create mode 100755 deploy/deploy.sh
create mode 100644 deploy/docker-compose.yml
create mode 100755 deploy/init-sql/01-init.sh
create mode 100644 deploy/init-sql/02-ry-vue.sql
create mode 100644 deploy/init-sql/03-bid-tables.sql
create mode 100644 deploy/nginx.conf
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizComparisonController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizMaterialController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizOrderObjectionController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizPurchaseOrderController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizQuotationController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizRfqController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizSupplierController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizSupplierEvaluationController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizTenantController.java
create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizTransactionController.java
create mode 100644 ruoyi-admin/src/main/resources/application-prod.yml
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizComparisonVO.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizMaterial.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizOrderObjection.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizPurchaseOrder.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizPurchaseOrderItem.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizQuotation.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizQuotationItem.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizRfq.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizRfqItem.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizSupplier.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizSupplierEvaluation.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizTenant.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizTransaction.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizComparisonMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizMaterialMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizOrderObjectionMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizPurchaseOrderItemMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizPurchaseOrderMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizQuotationItemMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizQuotationMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizRfqItemMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizRfqMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizSupplierEvaluationMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizSupplierMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizTenantMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizTransactionMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizComparisonService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizMaterialService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizOrderObjectionService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizPurchaseOrderService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizQuotationService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizRfqService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizSupplierEvaluationService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizSupplierService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizTenantService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizTransactionService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizComparisonServiceImpl.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizMaterialServiceImpl.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizOrderObjectionServiceImpl.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizPurchaseOrderServiceImpl.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizQuotationServiceImpl.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizRfqServiceImpl.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizSupplierEvaluationServiceImpl.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizSupplierServiceImpl.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizTenantServiceImpl.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizTransactionServiceImpl.java
create mode 100644 ruoyi-system/src/main/resources/mapper/bid/BizComparisonMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/bid/BizMaterialMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/bid/BizOrderObjectionMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/bid/BizPurchaseOrderItemMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/bid/BizPurchaseOrderMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/bid/BizQuotationItemMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/bid/BizQuotationMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/bid/BizRfqItemMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/bid/BizRfqMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/bid/BizSupplierEvaluationMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/bid/BizSupplierMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/bid/BizTenantMapper.xml
create mode 100644 ruoyi-system/src/main/resources/mapper/bid/BizTransactionMapper.xml
create mode 100644 ruoyi-ui/src/api/bid/comparison.js
create mode 100644 ruoyi-ui/src/api/bid/evaluation.js
create mode 100644 ruoyi-ui/src/api/bid/material.js
create mode 100644 ruoyi-ui/src/api/bid/objection.js
create mode 100644 ruoyi-ui/src/api/bid/purchaseorder.js
create mode 100644 ruoyi-ui/src/api/bid/quotation.js
create mode 100644 ruoyi-ui/src/api/bid/rfq.js
create mode 100644 ruoyi-ui/src/api/bid/supplier.js
create mode 100644 ruoyi-ui/src/api/bid/tenant.js
create mode 100644 ruoyi-ui/src/api/bid/transaction.js
create mode 100644 ruoyi-ui/src/views/bid/comparison/index.vue
create mode 100644 ruoyi-ui/src/views/bid/evaluation/index.vue
create mode 100644 ruoyi-ui/src/views/bid/material/index.vue
create mode 100644 ruoyi-ui/src/views/bid/objection/index.vue
create mode 100644 ruoyi-ui/src/views/bid/purchaseorder/index.vue
create mode 100644 ruoyi-ui/src/views/bid/quotation/index.vue
create mode 100644 ruoyi-ui/src/views/bid/rfq/index.vue
create mode 100644 ruoyi-ui/src/views/bid/supplier/index.vue
create mode 100644 ruoyi-ui/src/views/bid/tenant/index.vue
create mode 100644 ruoyi-ui/src/views/bid/transaction/index.vue
create mode 100644 sql/bid_tables.sql
diff --git a/.gitignore b/.gitignore
index 0c0da3e0..43585f01 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,47 +1,28 @@
-######################################################################
-# Build Tools
-
-.gradle
-/build/
-!gradle/wrapper/gradle-wrapper.jar
-
-target/
-!.mvn/wrapper/maven-wrapper.jar
-
-######################################################################
-# IDE
-
-### STS ###
-.apt_generated
-.classpath
-.factorypath
-.project
-.settings
-.springBeans
-
-### IntelliJ IDEA ###
-.idea
-*.iws
-*.iml
-*.ipr
-
-### JRebel ###
-rebel.xml
-
-### NetBeans ###
-nbproject/private/
-build/*
-nbbuild/
-dist/
-nbdist/
-.nb-gradle/
-
-######################################################################
-# Others
-*.log
-*.xml.versionsBackup
-*.swp
-
-!*/build/*.java
-!*/build/*.html
-!*/build/*.xml
+# Maven
+target/
+*.jar
+*.war
+*.ear
+!deploy/*.jar
+
+# Node
+node_modules/
+npm-debug.log*
+dist/
+
+# IDE
+.idea/
+*.iml
+.vscode/
+.DS_Store
+
+# Logs
+*.log
+logs/
+
+# Spring Boot
+*.pid
+
+# Docker local build artifacts
+deploy/dist-ui/
+deploy/ruoyi-admin.jar
diff --git a/deploy/Dockerfile b/deploy/Dockerfile
new file mode 100644
index 00000000..51233499
--- /dev/null
+++ b/deploy/Dockerfile
@@ -0,0 +1,19 @@
+# Multi-stage: build backend JAR
+FROM maven:3.8.6-openjdk-8 AS backend-builder
+WORKDIR /build
+COPY ruoyi-bid/ .
+RUN mvn clean package -DskipTests -pl ruoyi-admin -am -q
+
+# Build frontend
+FROM node:20-alpine AS frontend-builder
+WORKDIR /ui
+COPY ruoyi-bid/ruoyi-ui/ .
+RUN npm config set registry https://registry.npmmirror.com && npm install --legacy-peer-deps && npm run build:prod
+
+# Final runtime image
+FROM openjdk:8-jre-slim
+WORKDIR /app
+COPY --from=backend-builder /build/ruoyi-admin/target/ruoyi-admin.jar app.jar
+COPY --from=frontend-builder /ui/dist /app/dist-ui
+EXPOSE 8080
+ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar", "--spring.profiles.active=druid,prod"]
diff --git a/deploy/deploy.sh b/deploy/deploy.sh
new file mode 100755
index 00000000..584a066d
--- /dev/null
+++ b/deploy/deploy.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+set -e
+cd /home/userroot/bid-deploy
+
+echo '=== 福安德智慧报价平台 - Docker部署 ==='
+
+# Build frontend first (outside Docker for speed, using local node)
+echo '[1/4] 构建前端...'
+cd /home/userroot/ruoyi-bid/ruoyi-ui
+npm config set registry https://registry.npmmirror.com
+npm install --legacy-peer-deps
+npm run build:prod
+echo '前端构建完成'
+
+# Copy dist to deploy dir (for nginx volume mount approach)
+cp -r dist /home/userroot/bid-deploy/dist-ui
+cd /home/userroot/bid-deploy
+
+echo '[2/4] 构建后端JAR...'
+cd /home/userroot/ruoyi-bid
+mvn clean package -DskipTests -pl ruoyi-admin -am -q
+cp ruoyi-admin/target/ruoyi-admin.jar /home/userroot/bid-deploy/
+cd /home/userroot/bid-deploy
+
+echo '[3/4] 构建Docker镜像并启动...'
+docker compose down --remove-orphans 2>/dev/null || true
+docker compose up -d --build
+
+echo '[4/4] 等待服务启动...'
+sleep 15
+docker compose ps
+
+echo ''
+echo '======================================'
+echo '✓ 部署完成!'
+echo '访问地址: http://49.232.154.205:10031'
+echo '默认账号: admin / admin123'
+echo '======================================'
diff --git a/deploy/docker-compose.yml b/deploy/docker-compose.yml
new file mode 100644
index 00000000..a8d766ff
--- /dev/null
+++ b/deploy/docker-compose.yml
@@ -0,0 +1,75 @@
+version: '3.8'
+
+services:
+ mysql:
+ image: mysql:8.0
+ container_name: bid-mysql
+ environment:
+ MYSQL_ROOT_PASSWORD: bid123456@
+ MYSQL_DATABASE: ry-vue
+ MYSQL_CHARACTER_SET_SERVER: utf8mb4
+ MYSQL_COLLATION_SERVER: utf8mb4_unicode_ci
+ volumes:
+ - bid-mysql-data:/var/lib/mysql
+ - ./init-sql/02-ry-vue.sql:/docker-entrypoint-initdb.d/02-ry-vue.sql:ro
+ - ./init-sql/03-bid-tables.sql:/docker-entrypoint-initdb.d/03-bid-tables.sql:ro
+ networks:
+ - bid-net
+ restart: unless-stopped
+ healthcheck:
+ test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-pbid123456@"]
+ interval: 10s
+ timeout: 5s
+ retries: 15
+
+ redis:
+ image: redis:7-alpine
+ container_name: bid-redis
+ command: redis-server --requirepass bid123456@
+ networks:
+ - bid-net
+ restart: unless-stopped
+
+ backend:
+ image: openjdk:8-jre-slim
+ container_name: bid-backend
+ working_dir: /app
+ command: java -Djava.security.egd=file:/dev/./urandom -jar app.jar --spring.profiles.active=druid,prod
+ volumes:
+ - ./ruoyi-admin.jar:/app/app.jar:ro
+ depends_on:
+ mysql:
+ condition: service_healthy
+ redis:
+ condition: service_started
+ environment:
+ - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
+ - SPRING_DATASOURCE_USERNAME=root
+ - SPRING_DATASOURCE_PASSWORD=bid123456@
+ - SPRING_REDIS_HOST=redis
+ - SPRING_REDIS_PASSWORD=bid123456@
+ - SPRING_REDIS_PORT=6379
+ networks:
+ - bid-net
+ restart: unless-stopped
+
+ nginx:
+ image: nginx:alpine
+ container_name: bid-nginx
+ ports:
+ - '10031:80'
+ volumes:
+ - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
+ - ./dist-ui:/usr/share/nginx/html:ro
+ depends_on:
+ - backend
+ networks:
+ - bid-net
+ restart: unless-stopped
+
+volumes:
+ bid-mysql-data:
+
+networks:
+ bid-net:
+ driver: bridge
diff --git a/deploy/init-sql/01-init.sh b/deploy/init-sql/01-init.sh
new file mode 100755
index 00000000..34dbe883
--- /dev/null
+++ b/deploy/init-sql/01-init.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+# Wait for MySQL to be ready - handled by healthcheck
+echo 'Running RuoYi system SQL...'
+mysql -u root -p"$MYSQL_ROOT_PASSWORD" "$MYSQL_DATABASE" < /docker-entrypoint-initdb.d/02-ry-vue.sql
+echo 'Running bid tables SQL...'
+mysql -u root -p"$MYSQL_ROOT_PASSWORD" "$MYSQL_DATABASE" < /docker-entrypoint-initdb.d/03-bid-tables.sql
+echo 'Init complete.'
diff --git a/deploy/init-sql/02-ry-vue.sql b/deploy/init-sql/02-ry-vue.sql
new file mode 100644
index 00000000..bf2c1a76
--- /dev/null
+++ b/deploy/init-sql/02-ry-vue.sql
@@ -0,0 +1,723 @@
+-- ----------------------------
+-- 1、部门表
+-- ----------------------------
+drop table if exists sys_dept;
+create table sys_dept (
+ dept_id bigint(20) not null auto_increment comment '部门id',
+ parent_id bigint(20) default 0 comment '父部门id',
+ ancestors varchar(50) default '' comment '祖级列表',
+ dept_name varchar(30) default '' comment '部门名称',
+ order_num int(4) default 0 comment '显示顺序',
+ leader varchar(20) default null comment '负责人',
+ phone varchar(11) default null comment '联系电话',
+ email varchar(50) default null comment '邮箱',
+ status char(1) default '0' comment '部门状态(0正常 1停用)',
+ del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
+ create_by varchar(64) default '' comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by varchar(64) default '' comment '更新者',
+ update_time datetime comment '更新时间',
+ primary key (dept_id)
+) engine=innodb auto_increment=200 comment = '部门表';
+
+-- ----------------------------
+-- 初始化-部门表数据
+-- ----------------------------
+insert into sys_dept values(100, 0, '0', '若依科技', 0, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
+insert into sys_dept values(101, 100, '0,100', '深圳总公司', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
+insert into sys_dept values(102, 100, '0,100', '长沙分公司', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
+insert into sys_dept values(103, 101, '0,100,101', '研发部门', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
+insert into sys_dept values(104, 101, '0,100,101', '市场部门', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
+insert into sys_dept values(105, 101, '0,100,101', '测试部门', 3, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
+insert into sys_dept values(106, 101, '0,100,101', '财务部门', 4, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
+insert into sys_dept values(107, 101, '0,100,101', '运维部门', 5, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
+insert into sys_dept values(108, 102, '0,100,102', '市场部门', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
+insert into sys_dept values(109, 102, '0,100,102', '财务部门', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
+
+
+-- ----------------------------
+-- 2、用户信息表
+-- ----------------------------
+drop table if exists sys_user;
+create table sys_user (
+ user_id bigint(20) not null auto_increment comment '用户ID',
+ dept_id bigint(20) default null comment '部门ID',
+ user_name varchar(30) not null comment '用户账号',
+ nick_name varchar(30) not null comment '用户昵称',
+ user_type varchar(2) default '00' comment '用户类型(00系统用户)',
+ email varchar(50) default '' comment '用户邮箱',
+ phonenumber varchar(11) default '' comment '手机号码',
+ sex char(1) default '0' comment '用户性别(0男 1女 2未知)',
+ avatar varchar(100) default '' comment '头像地址',
+ password varchar(100) default '' comment '密码',
+ status char(1) default '0' comment '账号状态(0正常 1停用)',
+ del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
+ login_ip varchar(128) default '' comment '最后登录IP',
+ login_date datetime comment '最后登录时间',
+ pwd_update_date datetime comment '密码最后更新时间',
+ create_by varchar(64) default '' comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by varchar(64) default '' comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default null comment '备注',
+ primary key (user_id)
+) engine=innodb auto_increment=100 comment = '用户信息表';
+
+-- ----------------------------
+-- 初始化-用户信息表数据
+-- ----------------------------
+insert into sys_user values(1, 103, 'admin', '若依', '00', 'ry@163.com', '15888888888', '1', '', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), sysdate(), 'admin', sysdate(), '', null, '管理员');
+insert into sys_user values(2, 105, 'ry', '若依', '00', 'ry@qq.com', '15666666666', '1', '', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), sysdate(), 'admin', sysdate(), '', null, '测试员');
+
+
+-- ----------------------------
+-- 3、岗位信息表
+-- ----------------------------
+drop table if exists sys_post;
+create table sys_post
+(
+ post_id bigint(20) not null auto_increment comment '岗位ID',
+ post_code varchar(64) not null comment '岗位编码',
+ post_name varchar(50) not null comment '岗位名称',
+ post_sort int(4) not null comment '显示顺序',
+ status char(1) not null comment '状态(0正常 1停用)',
+ create_by varchar(64) default '' comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by varchar(64) default '' comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default null comment '备注',
+ primary key (post_id)
+) engine=innodb comment = '岗位信息表';
+
+-- ----------------------------
+-- 初始化-岗位信息表数据
+-- ----------------------------
+insert into sys_post values(1, 'ceo', '董事长', 1, '0', 'admin', sysdate(), '', null, '');
+insert into sys_post values(2, 'se', '项目经理', 2, '0', 'admin', sysdate(), '', null, '');
+insert into sys_post values(3, 'hr', '人力资源', 3, '0', 'admin', sysdate(), '', null, '');
+insert into sys_post values(4, 'user', '普通员工', 4, '0', 'admin', sysdate(), '', null, '');
+
+
+-- ----------------------------
+-- 4、角色信息表
+-- ----------------------------
+drop table if exists sys_role;
+create table sys_role (
+ role_id bigint(20) not null auto_increment comment '角色ID',
+ role_name varchar(30) not null comment '角色名称',
+ role_key varchar(100) not null comment '角色权限字符串',
+ role_sort int(4) not null comment '显示顺序',
+ data_scope char(1) default '1' comment '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)',
+ menu_check_strictly tinyint(1) default 1 comment '菜单树选择项是否关联显示',
+ dept_check_strictly tinyint(1) default 1 comment '部门树选择项是否关联显示',
+ status char(1) not null comment '角色状态(0正常 1停用)',
+ del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
+ create_by varchar(64) default '' comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by varchar(64) default '' comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default null comment '备注',
+ primary key (role_id)
+) engine=innodb auto_increment=100 comment = '角色信息表';
+
+-- ----------------------------
+-- 初始化-角色信息表数据
+-- ----------------------------
+insert into sys_role values('1', '超级管理员', 'admin', 1, 1, 1, 1, '0', '0', 'admin', sysdate(), '', null, '超级管理员');
+insert into sys_role values('2', '普通角色', 'common', 2, 2, 1, 1, '0', '0', 'admin', sysdate(), '', null, '普通角色');
+
+
+-- ----------------------------
+-- 5、菜单权限表
+-- ----------------------------
+drop table if exists sys_menu;
+create table sys_menu (
+ menu_id bigint(20) not null auto_increment comment '菜单ID',
+ menu_name varchar(50) not null comment '菜单名称',
+ parent_id bigint(20) default 0 comment '父菜单ID',
+ order_num int(4) default 0 comment '显示顺序',
+ path varchar(200) default '' comment '路由地址',
+ component varchar(255) default null comment '组件路径',
+ query varchar(255) default null comment '路由参数',
+ route_name varchar(50) default '' comment '路由名称',
+ is_frame int(1) default 1 comment '是否为外链(0是 1否)',
+ is_cache int(1) default 0 comment '是否缓存(0缓存 1不缓存)',
+ menu_type char(1) default '' comment '菜单类型(M目录 C菜单 F按钮)',
+ visible char(1) default 0 comment '菜单状态(0显示 1隐藏)',
+ status char(1) default 0 comment '菜单状态(0正常 1停用)',
+ perms varchar(100) default null comment '权限标识',
+ icon varchar(100) default '#' comment '菜单图标',
+ create_by varchar(64) default '' comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by varchar(64) default '' comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default '' comment '备注',
+ primary key (menu_id)
+) engine=innodb auto_increment=2000 comment = '菜单权限表';
+
+-- ----------------------------
+-- 初始化-菜单信息表数据
+-- ----------------------------
+-- 一级菜单
+insert into sys_menu values('1', '系统管理', '0', '1', 'system', null, '', '', 1, 0, 'M', '0', '0', '', 'system', 'admin', sysdate(), '', null, '系统管理目录');
+insert into sys_menu values('2', '系统监控', '0', '2', 'monitor', null, '', '', 1, 0, 'M', '0', '0', '', 'monitor', 'admin', sysdate(), '', null, '系统监控目录');
+insert into sys_menu values('3', '系统工具', '0', '3', 'tool', null, '', '', 1, 0, 'M', '0', '0', '', 'tool', 'admin', sysdate(), '', null, '系统工具目录');
+insert into sys_menu values('4', '若依官网', '0', '4', 'http://ruoyi.vip', null, '', '', 0, 0, 'M', '0', '0', '', 'guide', 'admin', sysdate(), '', null, '若依官网地址');
+-- 二级菜单
+insert into sys_menu values('100', '用户管理', '1', '1', 'user', 'system/user/index', '', '', 1, 0, 'C', '0', '0', 'system:user:list', 'user', 'admin', sysdate(), '', null, '用户管理菜单');
+insert into sys_menu values('101', '角色管理', '1', '2', 'role', 'system/role/index', '', '', 1, 0, 'C', '0', '0', 'system:role:list', 'peoples', 'admin', sysdate(), '', null, '角色管理菜单');
+insert into sys_menu values('102', '菜单管理', '1', '3', 'menu', 'system/menu/index', '', '', 1, 0, 'C', '0', '0', 'system:menu:list', 'tree-table', 'admin', sysdate(), '', null, '菜单管理菜单');
+insert into sys_menu values('103', '部门管理', '1', '4', 'dept', 'system/dept/index', '', '', 1, 0, 'C', '0', '0', 'system:dept:list', 'tree', 'admin', sysdate(), '', null, '部门管理菜单');
+insert into sys_menu values('104', '岗位管理', '1', '5', 'post', 'system/post/index', '', '', 1, 0, 'C', '0', '0', 'system:post:list', 'post', 'admin', sysdate(), '', null, '岗位管理菜单');
+insert into sys_menu values('105', '字典管理', '1', '6', 'dict', 'system/dict/index', '', '', 1, 0, 'C', '0', '0', 'system:dict:list', 'dict', 'admin', sysdate(), '', null, '字典管理菜单');
+insert into sys_menu values('106', '参数设置', '1', '7', 'config', 'system/config/index', '', '', 1, 0, 'C', '0', '0', 'system:config:list', 'edit', 'admin', sysdate(), '', null, '参数设置菜单');
+insert into sys_menu values('107', '通知公告', '1', '8', 'notice', 'system/notice/index', '', '', 1, 0, 'C', '0', '0', 'system:notice:list', 'message', 'admin', sysdate(), '', null, '通知公告菜单');
+insert into sys_menu values('108', '日志管理', '1', '9', 'log', '', '', '', 1, 0, 'M', '0', '0', '', 'log', 'admin', sysdate(), '', null, '日志管理菜单');
+insert into sys_menu values('109', '在线用户', '2', '1', 'online', 'monitor/online/index', '', '', 1, 0, 'C', '0', '0', 'monitor:online:list', 'online', 'admin', sysdate(), '', null, '在线用户菜单');
+insert into sys_menu values('110', '定时任务', '2', '2', 'job', 'monitor/job/index', '', '', 1, 0, 'C', '0', '0', 'monitor:job:list', 'job', 'admin', sysdate(), '', null, '定时任务菜单');
+insert into sys_menu values('111', '数据监控', '2', '3', 'druid', 'monitor/druid/index', '', '', 1, 0, 'C', '0', '0', 'monitor:druid:list', 'druid', 'admin', sysdate(), '', null, '数据监控菜单');
+insert into sys_menu values('112', '服务监控', '2', '4', 'server', 'monitor/server/index', '', '', 1, 0, 'C', '0', '0', 'monitor:server:list', 'server', 'admin', sysdate(), '', null, '服务监控菜单');
+insert into sys_menu values('113', '缓存监控', '2', '5', 'cache', 'monitor/cache/index', '', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis', 'admin', sysdate(), '', null, '缓存监控菜单');
+insert into sys_menu values('114', '缓存列表', '2', '6', 'cacheList', 'monitor/cache/list', '', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis-list', 'admin', sysdate(), '', null, '缓存列表菜单');
+insert into sys_menu values('115', '表单构建', '3', '1', 'build', 'tool/build/index', '', '', 1, 0, 'C', '0', '0', 'tool:build:list', 'build', 'admin', sysdate(), '', null, '表单构建菜单');
+insert into sys_menu values('116', '代码生成', '3', '2', 'gen', 'tool/gen/index', '', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 'admin', sysdate(), '', null, '代码生成菜单');
+insert into sys_menu values('117', '系统接口', '3', '3', 'swagger', 'tool/swagger/index', '', '', 1, 0, 'C', '0', '0', 'tool:swagger:list', 'swagger', 'admin', sysdate(), '', null, '系统接口菜单');
+-- 三级菜单
+insert into sys_menu values('500', '操作日志', '108', '1', 'operlog', 'monitor/operlog/index', '', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', 'admin', sysdate(), '', null, '操作日志菜单');
+insert into sys_menu values('501', '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', '', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor', 'admin', sysdate(), '', null, '登录日志菜单');
+-- 用户管理按钮
+insert into sys_menu values('1000', '用户查询', '100', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1001', '用户新增', '100', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1002', '用户修改', '100', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1003', '用户删除', '100', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1004', '用户导出', '100', '5', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:export', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1005', '用户导入', '100', '6', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:import', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1006', '重置密码', '100', '7', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', '#', 'admin', sysdate(), '', null, '');
+-- 角色管理按钮
+insert into sys_menu values('1007', '角色查询', '101', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:query', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1008', '角色新增', '101', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:add', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1009', '角色修改', '101', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1010', '角色删除', '101', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1011', '角色导出', '101', '5', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:export', '#', 'admin', sysdate(), '', null, '');
+-- 菜单管理按钮
+insert into sys_menu values('1012', '菜单查询', '102', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1013', '菜单新增', '102', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1014', '菜单修改', '102', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1015', '菜单删除', '102', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', '#', 'admin', sysdate(), '', null, '');
+-- 部门管理按钮
+insert into sys_menu values('1016', '部门查询', '103', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:query', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1017', '部门新增', '103', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:add', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1018', '部门修改', '103', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1019', '部门删除', '103', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove', '#', 'admin', sysdate(), '', null, '');
+-- 岗位管理按钮
+insert into sys_menu values('1020', '岗位查询', '104', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:query', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1021', '岗位新增', '104', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:add', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1022', '岗位修改', '104', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1023', '岗位删除', '104', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1024', '岗位导出', '104', '5', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:export', '#', 'admin', sysdate(), '', null, '');
+-- 字典管理按钮
+insert into sys_menu values('1025', '字典查询', '105', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:query', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1026', '字典新增', '105', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:add', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1027', '字典修改', '105', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1028', '字典删除', '105', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1029', '字典导出', '105', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:export', '#', 'admin', sysdate(), '', null, '');
+-- 参数设置按钮
+insert into sys_menu values('1030', '参数查询', '106', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:query', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1031', '参数新增', '106', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:add', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1032', '参数修改', '106', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:edit', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1033', '参数删除', '106', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:remove', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1034', '参数导出', '106', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:export', '#', 'admin', sysdate(), '', null, '');
+-- 通知公告按钮
+insert into sys_menu values('1035', '公告查询', '107', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:query', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1036', '公告新增', '107', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:add', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1037', '公告修改', '107', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1038', '公告删除', '107', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove', '#', 'admin', sysdate(), '', null, '');
+-- 操作日志按钮
+insert into sys_menu values('1039', '操作查询', '500', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1040', '操作删除', '500', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1041', '日志导出', '500', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export', '#', 'admin', sysdate(), '', null, '');
+-- 登录日志按钮
+insert into sys_menu values('1042', '登录查询', '501', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1043', '登录删除', '501', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1044', '日志导出', '501', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1045', '账户解锁', '501', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock', '#', 'admin', sysdate(), '', null, '');
+-- 在线用户按钮
+insert into sys_menu values('1046', '在线查询', '109', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1047', '批量强退', '109', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1048', '单条强退', '109', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 'admin', sysdate(), '', null, '');
+-- 定时任务按钮
+insert into sys_menu values('1049', '任务查询', '110', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:query', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1050', '任务新增', '110', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:add', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1051', '任务修改', '110', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:edit', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1052', '任务删除', '110', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:remove', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1053', '状态修改', '110', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:changeStatus', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1054', '任务导出', '110', '6', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:export', '#', 'admin', sysdate(), '', null, '');
+-- 代码生成按钮
+insert into sys_menu values('1055', '生成查询', '116', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1056', '生成修改', '116', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1057', '生成删除', '116', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1058', '导入代码', '116', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1059', '预览代码', '116', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview', '#', 'admin', sysdate(), '', null, '');
+insert into sys_menu values('1060', '生成代码', '116', '6', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code', '#', 'admin', sysdate(), '', null, '');
+
+
+-- ----------------------------
+-- 6、用户和角色关联表 用户N-1角色
+-- ----------------------------
+drop table if exists sys_user_role;
+create table sys_user_role (
+ user_id bigint(20) not null comment '用户ID',
+ role_id bigint(20) not null comment '角色ID',
+ primary key(user_id, role_id)
+) engine=innodb comment = '用户和角色关联表';
+
+-- ----------------------------
+-- 初始化-用户和角色关联表数据
+-- ----------------------------
+insert into sys_user_role values ('1', '1');
+insert into sys_user_role values ('2', '2');
+
+
+-- ----------------------------
+-- 7、角色和菜单关联表 角色1-N菜单
+-- ----------------------------
+drop table if exists sys_role_menu;
+create table sys_role_menu (
+ role_id bigint(20) not null comment '角色ID',
+ menu_id bigint(20) not null comment '菜单ID',
+ primary key(role_id, menu_id)
+) engine=innodb comment = '角色和菜单关联表';
+
+-- ----------------------------
+-- 初始化-角色和菜单关联表数据
+-- ----------------------------
+insert into sys_role_menu values ('2', '1');
+insert into sys_role_menu values ('2', '2');
+insert into sys_role_menu values ('2', '3');
+insert into sys_role_menu values ('2', '4');
+insert into sys_role_menu values ('2', '100');
+insert into sys_role_menu values ('2', '101');
+insert into sys_role_menu values ('2', '102');
+insert into sys_role_menu values ('2', '103');
+insert into sys_role_menu values ('2', '104');
+insert into sys_role_menu values ('2', '105');
+insert into sys_role_menu values ('2', '106');
+insert into sys_role_menu values ('2', '107');
+insert into sys_role_menu values ('2', '108');
+insert into sys_role_menu values ('2', '109');
+insert into sys_role_menu values ('2', '110');
+insert into sys_role_menu values ('2', '111');
+insert into sys_role_menu values ('2', '112');
+insert into sys_role_menu values ('2', '113');
+insert into sys_role_menu values ('2', '114');
+insert into sys_role_menu values ('2', '115');
+insert into sys_role_menu values ('2', '116');
+insert into sys_role_menu values ('2', '117');
+insert into sys_role_menu values ('2', '500');
+insert into sys_role_menu values ('2', '501');
+insert into sys_role_menu values ('2', '1000');
+insert into sys_role_menu values ('2', '1001');
+insert into sys_role_menu values ('2', '1002');
+insert into sys_role_menu values ('2', '1003');
+insert into sys_role_menu values ('2', '1004');
+insert into sys_role_menu values ('2', '1005');
+insert into sys_role_menu values ('2', '1006');
+insert into sys_role_menu values ('2', '1007');
+insert into sys_role_menu values ('2', '1008');
+insert into sys_role_menu values ('2', '1009');
+insert into sys_role_menu values ('2', '1010');
+insert into sys_role_menu values ('2', '1011');
+insert into sys_role_menu values ('2', '1012');
+insert into sys_role_menu values ('2', '1013');
+insert into sys_role_menu values ('2', '1014');
+insert into sys_role_menu values ('2', '1015');
+insert into sys_role_menu values ('2', '1016');
+insert into sys_role_menu values ('2', '1017');
+insert into sys_role_menu values ('2', '1018');
+insert into sys_role_menu values ('2', '1019');
+insert into sys_role_menu values ('2', '1020');
+insert into sys_role_menu values ('2', '1021');
+insert into sys_role_menu values ('2', '1022');
+insert into sys_role_menu values ('2', '1023');
+insert into sys_role_menu values ('2', '1024');
+insert into sys_role_menu values ('2', '1025');
+insert into sys_role_menu values ('2', '1026');
+insert into sys_role_menu values ('2', '1027');
+insert into sys_role_menu values ('2', '1028');
+insert into sys_role_menu values ('2', '1029');
+insert into sys_role_menu values ('2', '1030');
+insert into sys_role_menu values ('2', '1031');
+insert into sys_role_menu values ('2', '1032');
+insert into sys_role_menu values ('2', '1033');
+insert into sys_role_menu values ('2', '1034');
+insert into sys_role_menu values ('2', '1035');
+insert into sys_role_menu values ('2', '1036');
+insert into sys_role_menu values ('2', '1037');
+insert into sys_role_menu values ('2', '1038');
+insert into sys_role_menu values ('2', '1039');
+insert into sys_role_menu values ('2', '1040');
+insert into sys_role_menu values ('2', '1041');
+insert into sys_role_menu values ('2', '1042');
+insert into sys_role_menu values ('2', '1043');
+insert into sys_role_menu values ('2', '1044');
+insert into sys_role_menu values ('2', '1045');
+insert into sys_role_menu values ('2', '1046');
+insert into sys_role_menu values ('2', '1047');
+insert into sys_role_menu values ('2', '1048');
+insert into sys_role_menu values ('2', '1049');
+insert into sys_role_menu values ('2', '1050');
+insert into sys_role_menu values ('2', '1051');
+insert into sys_role_menu values ('2', '1052');
+insert into sys_role_menu values ('2', '1053');
+insert into sys_role_menu values ('2', '1054');
+insert into sys_role_menu values ('2', '1055');
+insert into sys_role_menu values ('2', '1056');
+insert into sys_role_menu values ('2', '1057');
+insert into sys_role_menu values ('2', '1058');
+insert into sys_role_menu values ('2', '1059');
+insert into sys_role_menu values ('2', '1060');
+
+-- ----------------------------
+-- 8、角色和部门关联表 角色1-N部门
+-- ----------------------------
+drop table if exists sys_role_dept;
+create table sys_role_dept (
+ role_id bigint(20) not null comment '角色ID',
+ dept_id bigint(20) not null comment '部门ID',
+ primary key(role_id, dept_id)
+) engine=innodb comment = '角色和部门关联表';
+
+-- ----------------------------
+-- 初始化-角色和部门关联表数据
+-- ----------------------------
+insert into sys_role_dept values ('2', '100');
+insert into sys_role_dept values ('2', '101');
+insert into sys_role_dept values ('2', '105');
+
+
+-- ----------------------------
+-- 9、用户与岗位关联表 用户1-N岗位
+-- ----------------------------
+drop table if exists sys_user_post;
+create table sys_user_post
+(
+ user_id bigint(20) not null comment '用户ID',
+ post_id bigint(20) not null comment '岗位ID',
+ primary key (user_id, post_id)
+) engine=innodb comment = '用户与岗位关联表';
+
+-- ----------------------------
+-- 初始化-用户与岗位关联表数据
+-- ----------------------------
+insert into sys_user_post values ('1', '1');
+insert into sys_user_post values ('2', '2');
+
+
+-- ----------------------------
+-- 10、操作日志记录
+-- ----------------------------
+drop table if exists sys_oper_log;
+create table sys_oper_log (
+ oper_id bigint(20) not null auto_increment comment '日志主键',
+ title varchar(50) default '' comment '模块标题',
+ business_type int(2) default 0 comment '业务类型(0其它 1新增 2修改 3删除)',
+ method varchar(200) default '' comment '方法名称',
+ request_method varchar(10) default '' comment '请求方式',
+ operator_type int(1) default 0 comment '操作类别(0其它 1后台用户 2手机端用户)',
+ oper_name varchar(50) default '' comment '操作人员',
+ dept_name varchar(50) default '' comment '部门名称',
+ oper_url varchar(255) default '' comment '请求URL',
+ oper_ip varchar(128) default '' comment '主机地址',
+ oper_location varchar(255) default '' comment '操作地点',
+ oper_param varchar(2000) default '' comment '请求参数',
+ json_result varchar(2000) default '' comment '返回参数',
+ status int(1) default 0 comment '操作状态(0正常 1异常)',
+ error_msg varchar(2000) default '' comment '错误消息',
+ oper_time datetime comment '操作时间',
+ cost_time bigint(20) default 0 comment '消耗时间',
+ primary key (oper_id),
+ key idx_sys_oper_log_bt (business_type),
+ key idx_sys_oper_log_s (status),
+ key idx_sys_oper_log_ot (oper_time)
+) engine=innodb auto_increment=100 comment = '操作日志记录';
+
+
+-- ----------------------------
+-- 11、字典类型表
+-- ----------------------------
+drop table if exists sys_dict_type;
+create table sys_dict_type
+(
+ dict_id bigint(20) not null auto_increment comment '字典主键',
+ dict_name varchar(100) default '' comment '字典名称',
+ dict_type varchar(100) default '' comment '字典类型',
+ status char(1) default '0' comment '状态(0正常 1停用)',
+ create_by varchar(64) default '' comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by varchar(64) default '' comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default null comment '备注',
+ primary key (dict_id),
+ unique (dict_type)
+) engine=innodb auto_increment=100 comment = '字典类型表';
+
+insert into sys_dict_type values(1, '用户性别', 'sys_user_sex', '0', 'admin', sysdate(), '', null, '用户性别列表');
+insert into sys_dict_type values(2, '菜单状态', 'sys_show_hide', '0', 'admin', sysdate(), '', null, '菜单状态列表');
+insert into sys_dict_type values(3, '系统开关', 'sys_normal_disable', '0', 'admin', sysdate(), '', null, '系统开关列表');
+insert into sys_dict_type values(4, '任务状态', 'sys_job_status', '0', 'admin', sysdate(), '', null, '任务状态列表');
+insert into sys_dict_type values(5, '任务分组', 'sys_job_group', '0', 'admin', sysdate(), '', null, '任务分组列表');
+insert into sys_dict_type values(6, '系统是否', 'sys_yes_no', '0', 'admin', sysdate(), '', null, '系统是否列表');
+insert into sys_dict_type values(7, '通知类型', 'sys_notice_type', '0', 'admin', sysdate(), '', null, '通知类型列表');
+insert into sys_dict_type values(8, '通知状态', 'sys_notice_status', '0', 'admin', sysdate(), '', null, '通知状态列表');
+insert into sys_dict_type values(9, '操作类型', 'sys_oper_type', '0', 'admin', sysdate(), '', null, '操作类型列表');
+insert into sys_dict_type values(10, '系统状态', 'sys_common_status', '0', 'admin', sysdate(), '', null, '登录状态列表');
+
+
+-- ----------------------------
+-- 12、字典数据表
+-- ----------------------------
+drop table if exists sys_dict_data;
+create table sys_dict_data
+(
+ dict_code bigint(20) not null auto_increment comment '字典编码',
+ dict_sort int(4) default 0 comment '字典排序',
+ dict_label varchar(100) default '' comment '字典标签',
+ dict_value varchar(100) default '' comment '字典键值',
+ dict_type varchar(100) default '' comment '字典类型',
+ css_class varchar(100) default null comment '样式属性(其他样式扩展)',
+ list_class varchar(100) default null comment '表格回显样式',
+ is_default char(1) default 'N' comment '是否默认(Y是 N否)',
+ status char(1) default '0' comment '状态(0正常 1停用)',
+ create_by varchar(64) default '' comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by varchar(64) default '' comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default null comment '备注',
+ primary key (dict_code)
+) engine=innodb auto_increment=100 comment = '字典数据表';
+
+insert into sys_dict_data values(1, 1, '男', '0', 'sys_user_sex', '', '', 'Y', '0', 'admin', sysdate(), '', null, '性别男');
+insert into sys_dict_data values(2, 2, '女', '1', 'sys_user_sex', '', '', 'N', '0', 'admin', sysdate(), '', null, '性别女');
+insert into sys_dict_data values(3, 3, '未知', '2', 'sys_user_sex', '', '', 'N', '0', 'admin', sysdate(), '', null, '性别未知');
+insert into sys_dict_data values(4, 1, '显示', '0', 'sys_show_hide', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '显示菜单');
+insert into sys_dict_data values(5, 2, '隐藏', '1', 'sys_show_hide', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '隐藏菜单');
+insert into sys_dict_data values(6, 1, '正常', '0', 'sys_normal_disable', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '正常状态');
+insert into sys_dict_data values(7, 2, '停用', '1', 'sys_normal_disable', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态');
+insert into sys_dict_data values(8, 1, '正常', '0', 'sys_job_status', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '正常状态');
+insert into sys_dict_data values(9, 2, '暂停', '1', 'sys_job_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态');
+insert into sys_dict_data values(10, 1, '默认', 'DEFAULT', 'sys_job_group', '', '', 'Y', '0', 'admin', sysdate(), '', null, '默认分组');
+insert into sys_dict_data values(11, 2, '系统', 'SYSTEM', 'sys_job_group', '', '', 'N', '0', 'admin', sysdate(), '', null, '系统分组');
+insert into sys_dict_data values(12, 1, '是', 'Y', 'sys_yes_no', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '系统默认是');
+insert into sys_dict_data values(13, 2, '否', 'N', 'sys_yes_no', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '系统默认否');
+insert into sys_dict_data values(14, 1, '通知', '1', 'sys_notice_type', '', 'warning', 'Y', '0', 'admin', sysdate(), '', null, '通知');
+insert into sys_dict_data values(15, 2, '公告', '2', 'sys_notice_type', '', 'success', 'N', '0', 'admin', sysdate(), '', null, '公告');
+insert into sys_dict_data values(16, 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '正常状态');
+insert into sys_dict_data values(17, 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '关闭状态');
+insert into sys_dict_data values(18, 99, '其他', '0', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '其他操作');
+insert into sys_dict_data values(19, 1, '新增', '1', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '新增操作');
+insert into sys_dict_data values(20, 2, '修改', '2', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '修改操作');
+insert into sys_dict_data values(21, 3, '删除', '3', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '删除操作');
+insert into sys_dict_data values(22, 4, '授权', '4', 'sys_oper_type', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, '授权操作');
+insert into sys_dict_data values(23, 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '导出操作');
+insert into sys_dict_data values(24, 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '导入操作');
+insert into sys_dict_data values(25, 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '强退操作');
+insert into sys_dict_data values(26, 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '生成操作');
+insert into sys_dict_data values(27, 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '清空操作');
+insert into sys_dict_data values(28, 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, '正常状态');
+insert into sys_dict_data values(29, 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态');
+
+
+-- ----------------------------
+-- 13、参数配置表
+-- ----------------------------
+drop table if exists sys_config;
+create table sys_config (
+ config_id int(5) not null auto_increment comment '参数主键',
+ config_name varchar(100) default '' comment '参数名称',
+ config_key varchar(100) default '' comment '参数键名',
+ config_value varchar(500) default '' comment '参数键值',
+ config_type char(1) default 'N' comment '系统内置(Y是 N否)',
+ create_by varchar(64) default '' comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by varchar(64) default '' comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default null comment '备注',
+ primary key (config_id)
+) engine=innodb auto_increment=100 comment = '参数配置表';
+
+insert into sys_config values(1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 'admin', sysdate(), '', null, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow' );
+insert into sys_config values(2, '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 'admin', sysdate(), '', null, '初始化密码 123456' );
+insert into sys_config values(3, '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 'admin', sysdate(), '', null, '深色主题theme-dark,浅色主题theme-light' );
+insert into sys_config values(4, '账号自助-验证码开关', 'sys.account.captchaEnabled', 'true', 'Y', 'admin', sysdate(), '', null, '是否开启验证码功能(true开启,false关闭)');
+insert into sys_config values(5, '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'false', 'Y', 'admin', sysdate(), '', null, '是否开启注册用户功能(true开启,false关闭)');
+insert into sys_config values(6, '用户登录-黑名单列表', 'sys.login.blackIPList', '', 'Y', 'admin', sysdate(), '', null, '设置登录IP黑名单限制,多个匹配项以;分隔,支持匹配(*通配、网段)');
+insert into sys_config values(7, '用户管理-初始密码修改策略', 'sys.account.initPasswordModify', '1', 'Y', 'admin', sysdate(), '', null, '0:初始密码修改策略关闭,没有任何提示,1:提醒用户,如果未修改初始密码,则在登录时就会提醒修改密码对话框');
+insert into sys_config values(8, '用户管理-账号密码更新周期', 'sys.account.passwordValidateDays', '0', 'Y', 'admin', sysdate(), '', null, '密码更新周期(填写数字,数据初始化值为0不限制,若修改必须为大于0小于365的正整数),如果超过这个周期登录系统时,则在登录时就会提醒修改密码对话框');
+insert into sys_config values(9, '用户管理-密码字符范围', 'sys.account.chrtype', '0', 'Y', 'admin', sysdate(), '', null, '默认任意字符范围,0任意(密码可以输入任意字符),1数字(密码只能为0-9数字),2英文字母(密码只能为a-z和A-Z字母),3字母和数字(密码必须包含字母,数字),4字母数字和特殊字符(目前支持的特殊字符包括:~!@#$%^&*()-=_+)');
+
+
+-- ----------------------------
+-- 14、系统访问记录
+-- ----------------------------
+drop table if exists sys_logininfor;
+create table sys_logininfor (
+ info_id bigint(20) not null auto_increment comment '访问ID',
+ user_name varchar(50) default '' comment '用户账号',
+ ipaddr varchar(128) default '' comment '登录IP地址',
+ login_location varchar(255) default '' comment '登录地点',
+ browser varchar(50) default '' comment '浏览器类型',
+ os varchar(50) default '' comment '操作系统',
+ status char(1) default '0' comment '登录状态(0成功 1失败)',
+ msg varchar(255) default '' comment '提示消息',
+ login_time datetime comment '访问时间',
+ primary key (info_id),
+ key idx_sys_logininfor_s (status),
+ key idx_sys_logininfor_lt (login_time)
+) engine=innodb auto_increment=100 comment = '系统访问记录';
+
+
+-- ----------------------------
+-- 15、定时任务调度表
+-- ----------------------------
+drop table if exists sys_job;
+create table sys_job (
+ job_id bigint(20) not null auto_increment comment '任务ID',
+ job_name varchar(64) default '' comment '任务名称',
+ job_group varchar(64) default 'DEFAULT' comment '任务组名',
+ invoke_target varchar(500) not null comment '调用目标字符串',
+ cron_expression varchar(255) default '' comment 'cron执行表达式',
+ misfire_policy varchar(20) default '3' comment '计划执行错误策略(1立即执行 2执行一次 3放弃执行)',
+ concurrent char(1) default '1' comment '是否并发执行(0允许 1禁止)',
+ status char(1) default '0' comment '状态(0正常 1暂停)',
+ create_by varchar(64) default '' comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by varchar(64) default '' comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default '' comment '备注信息',
+ primary key (job_id, job_name, job_group)
+) engine=innodb auto_increment=100 comment = '定时任务调度表';
+
+insert into sys_job values(1, '系统默认(无参)', 'DEFAULT', 'ryTask.ryNoParams', '0/10 * * * * ?', '3', '1', '1', 'admin', sysdate(), '', null, '');
+insert into sys_job values(2, '系统默认(有参)', 'DEFAULT', 'ryTask.ryParams(\'ry\')', '0/15 * * * * ?', '3', '1', '1', 'admin', sysdate(), '', null, '');
+insert into sys_job values(3, '系统默认(多参)', 'DEFAULT', 'ryTask.ryMultipleParams(\'ry\', true, 2000L, 316.50D, 100)', '0/20 * * * * ?', '3', '1', '1', 'admin', sysdate(), '', null, '');
+
+
+-- ----------------------------
+-- 16、定时任务调度日志表
+-- ----------------------------
+drop table if exists sys_job_log;
+create table sys_job_log (
+ job_log_id bigint(20) not null auto_increment comment '任务日志ID',
+ job_name varchar(64) not null comment '任务名称',
+ job_group varchar(64) not null comment '任务组名',
+ invoke_target varchar(500) not null comment '调用目标字符串',
+ job_message varchar(500) comment '日志信息',
+ status char(1) default '0' comment '执行状态(0正常 1失败)',
+ exception_info varchar(2000) default '' comment '异常信息',
+ start_time datetime comment '执行开始时间',
+ end_time datetime comment '执行结束时间',
+ create_time datetime comment '创建时间',
+ primary key (job_log_id)
+) engine=innodb comment = '定时任务调度日志表';
+
+
+-- ----------------------------
+-- 17、通知公告表
+-- ----------------------------
+drop table if exists sys_notice;
+create table sys_notice (
+ notice_id int(4) not null auto_increment comment '公告ID',
+ notice_title varchar(50) not null comment '公告标题',
+ notice_type char(1) not null comment '公告类型(1通知 2公告)',
+ notice_content longblob default null comment '公告内容',
+ status char(1) default '0' comment '公告状态(0正常 1关闭)',
+ create_by varchar(64) default '' comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by varchar(64) default '' comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(255) default null comment '备注',
+ primary key (notice_id)
+) engine=innodb auto_increment=10 comment = '通知公告表';
+
+-- ----------------------------
+-- 初始化-公告信息表数据
+-- ----------------------------
+insert into sys_notice values('1', '温馨提醒:2018-07-01 若依新版本发布啦', '2', '新版本内容', '0', 'admin', sysdate(), '', null, '管理员');
+insert into sys_notice values('2', '维护通知:2018-07-01 若依系统凌晨维护', '1', '维护内容', '0', 'admin', sysdate(), '', null, '管理员');
+insert into sys_notice values('3', '若依开源框架介绍', '1', '
项目介绍
RuoYi开源项目是为企业用户定制的后台脚手架框架,为企业打造的一站式解决方案,降低企业开发成本,提升开发效率。主要包括用户管理、角色管理、部门管理、菜单管理、参数管理、字典管理、岗位管理、定时任务、服务监控、登录日志、操作日志、代码生成等功能。其中,还支持多数据源、数据权限、国际化、Redis缓存、Docker部署、滑动验证码、第三方认证登录、分布式事务、分布式文件存储、分库分表处理等技术特点。

官网及演示
若依官网地址: http://ruoyi.vip
若依文档地址: http://doc.ruoyi.vip
演示地址【不分离版】: http://demo.ruoyi.vip
演示地址【分离版本】: http://vue.ruoyi.vip
演示地址【微服务版】: http://cloud.ruoyi.vip
演示地址【移动端版】: http://h5.ruoyi.vip
', '0', 'admin', sysdate(), '', null, '管理员');
+
+
+-- ----------------------------
+-- 18、公告已读记录表
+-- ----------------------------
+drop table if exists sys_notice_read;
+create table sys_notice_read (
+ read_id bigint(20) not null auto_increment comment '已读主键',
+ notice_id int(4) not null comment '公告id',
+ user_id bigint(20) not null comment '用户id',
+ read_time datetime not null comment '阅读时间',
+ primary key (read_id),
+ unique key uk_user_notice (user_id, notice_id) comment '同一用户同一公告只记录一次'
+) engine=innodb auto_increment=1 comment='公告已读记录表';
+
+
+-- ----------------------------
+-- 19、代码生成业务表
+-- ----------------------------
+drop table if exists gen_table;
+create table gen_table (
+ table_id bigint(20) not null auto_increment comment '编号',
+ table_name varchar(200) default '' comment '表名称',
+ table_comment varchar(500) default '' comment '表描述',
+ sub_table_name varchar(64) default null comment '关联子表的表名',
+ sub_table_fk_name varchar(64) default null comment '子表关联的外键名',
+ class_name varchar(100) default '' comment '实体类名称',
+ tpl_category varchar(200) default 'crud' comment '使用的模板(crud单表操作 tree树表操作)',
+ tpl_web_type varchar(30) default '' comment '前端模板类型(element-ui模版 element-plus模版)',
+ package_name varchar(100) comment '生成包路径',
+ module_name varchar(30) comment '生成模块名',
+ business_name varchar(30) comment '生成业务名',
+ function_name varchar(50) comment '生成功能名',
+ function_author varchar(50) comment '生成功能作者',
+ form_col_num int(1) default 1 comment '表单布局(单列 双列 三列)',
+ gen_type char(1) default '0' comment '生成代码方式(0zip压缩包 1自定义路径)',
+ gen_path varchar(200) default '/' comment '生成路径(不填默认项目路径)',
+ options varchar(1000) comment '其它生成选项',
+ create_by varchar(64) default '' comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by varchar(64) default '' comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default null comment '备注',
+ primary key (table_id)
+) engine=innodb auto_increment=1 comment = '代码生成业务表';
+
+
+-- ----------------------------
+-- 20、代码生成业务表字段
+-- ----------------------------
+drop table if exists gen_table_column;
+create table gen_table_column (
+ column_id bigint(20) not null auto_increment comment '编号',
+ table_id bigint(20) comment '归属表编号',
+ column_name varchar(200) comment '列名称',
+ column_comment varchar(500) comment '列描述',
+ column_type varchar(100) comment '列类型',
+ java_type varchar(500) comment 'JAVA类型',
+ java_field varchar(200) comment 'JAVA字段名',
+ is_pk char(1) comment '是否主键(1是)',
+ is_increment char(1) comment '是否自增(1是)',
+ is_required char(1) comment '是否必填(1是)',
+ is_insert char(1) comment '是否为插入字段(1是)',
+ is_edit char(1) comment '是否编辑字段(1是)',
+ is_list char(1) comment '是否列表字段(1是)',
+ is_query char(1) comment '是否查询字段(1是)',
+ query_type varchar(200) default 'EQ' comment '查询方式(等于、不等于、大于、小于、范围)',
+ html_type varchar(200) comment '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)',
+ dict_type varchar(200) default '' comment '字典类型',
+ sort int comment '排序',
+ create_by varchar(64) default '' comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by varchar(64) default '' comment '更新者',
+ update_time datetime comment '更新时间',
+ primary key (column_id)
+) engine=innodb auto_increment=1 comment = '代码生成业务表字段';
\ No newline at end of file
diff --git a/deploy/init-sql/03-bid-tables.sql b/deploy/init-sql/03-bid-tables.sql
new file mode 100644
index 00000000..ae038138
--- /dev/null
+++ b/deploy/init-sql/03-bid-tables.sql
@@ -0,0 +1,279 @@
+-- 智慧报价平台业务表
+-- 租户表(SaaS买方隔离)
+CREATE TABLE IF NOT EXISTS biz_tenant (
+ tenant_id BIGINT NOT NULL AUTO_INCREMENT,
+ tenant_name VARCHAR(100) NOT NULL COMMENT '租户名称',
+ contact VARCHAR(50) COMMENT '联系人',
+ phone VARCHAR(20) COMMENT '联系电话',
+ email VARCHAR(100) COMMENT '邮箱',
+ status CHAR(1) DEFAULT '0' COMMENT '0正常 1停用',
+ create_by VARCHAR(64) DEFAULT '',
+ create_time DATETIME,
+ update_by VARCHAR(64) DEFAULT '',
+ update_time DATETIME,
+ remark VARCHAR(500) DEFAULT NULL,
+ PRIMARY KEY (tenant_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租户表';
+
+INSERT IGNORE INTO biz_tenant(tenant_id,tenant_name,contact,phone,email,status,create_by,create_time)
+VALUES(1,'默认租户','管理员','','admin@example.com','0','admin',NOW());
+
+-- 给 sys_user 增加 tenant_id 字段(用于SaaS隔离)
+ALTER TABLE sys_user ADD COLUMN IF NOT EXISTS tenant_id BIGINT DEFAULT 1 COMMENT '所属租户';
+
+-- 物料分类
+CREATE TABLE IF NOT EXISTS biz_material_category (
+ category_id BIGINT NOT NULL AUTO_INCREMENT,
+ tenant_id BIGINT NOT NULL DEFAULT 1,
+ category_name VARCHAR(100) NOT NULL,
+ parent_id BIGINT DEFAULT 0,
+ ancestors VARCHAR(500) DEFAULT '',
+ sort INT DEFAULT 0,
+ status CHAR(1) DEFAULT '0',
+ create_by VARCHAR(64) DEFAULT '',
+ create_time DATETIME,
+ PRIMARY KEY (category_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='物料分类';
+
+-- 物料
+CREATE TABLE IF NOT EXISTS biz_material (
+ material_id BIGINT NOT NULL AUTO_INCREMENT,
+ tenant_id BIGINT NOT NULL DEFAULT 1,
+ category_id BIGINT DEFAULT 0,
+ material_code VARCHAR(50) NOT NULL COMMENT '物料编码',
+ material_name VARCHAR(200) NOT NULL COMMENT '物料名称',
+ spec VARCHAR(500) DEFAULT '' COMMENT '规格型号',
+ unit VARCHAR(50) DEFAULT '' COMMENT '单位',
+ brand VARCHAR(100) DEFAULT '' COMMENT '品牌',
+ description TEXT COMMENT '描述',
+ status CHAR(1) DEFAULT '0',
+ create_by VARCHAR(64) DEFAULT '',
+ create_time DATETIME,
+ update_by VARCHAR(64) DEFAULT '',
+ update_time DATETIME,
+ remark VARCHAR(500) DEFAULT NULL,
+ PRIMARY KEY (material_id),
+ UNIQUE KEY uk_code_tenant (tenant_id, material_code)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='物料';
+
+-- 供应商
+CREATE TABLE IF NOT EXISTS biz_supplier (
+ supplier_id BIGINT NOT NULL AUTO_INCREMENT,
+ tenant_id BIGINT NOT NULL DEFAULT 1,
+ supplier_name VARCHAR(200) NOT NULL,
+ contact VARCHAR(50) DEFAULT '',
+ phone VARCHAR(20) DEFAULT '',
+ email VARCHAR(100) DEFAULT '',
+ address VARCHAR(500) DEFAULT '',
+ user_id BIGINT DEFAULT NULL COMMENT '关联系统用户',
+ status CHAR(1) DEFAULT '0',
+ create_by VARCHAR(64) DEFAULT '',
+ create_time DATETIME,
+ update_by VARCHAR(64) DEFAULT '',
+ update_time DATETIME,
+ remark VARCHAR(500) DEFAULT NULL,
+ PRIMARY KEY (supplier_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='供应商';
+
+-- 报价请求(RFQ)
+CREATE TABLE IF NOT EXISTS biz_rfq (
+ rfq_id BIGINT NOT NULL AUTO_INCREMENT,
+ tenant_id BIGINT NOT NULL DEFAULT 1,
+ rfq_no VARCHAR(50) NOT NULL COMMENT 'RFQ编号',
+ rfq_title VARCHAR(200) NOT NULL COMMENT 'RFQ标题',
+ deadline DATETIME DEFAULT NULL COMMENT '截止日期',
+ delivery_addr VARCHAR(500) DEFAULT '' COMMENT '交货地址',
+ status VARCHAR(20) DEFAULT 'draft' COMMENT 'draft/published/closed/completed',
+ remark TEXT,
+ create_by VARCHAR(64) DEFAULT '',
+ create_time DATETIME,
+ update_by VARCHAR(64) DEFAULT '',
+ update_time DATETIME,
+ PRIMARY KEY (rfq_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='报价请求';
+
+-- RFQ物料明细
+CREATE TABLE IF NOT EXISTS biz_rfq_item (
+ item_id BIGINT NOT NULL AUTO_INCREMENT,
+ rfq_id BIGINT NOT NULL,
+ material_id BIGINT DEFAULT 0,
+ material_name VARCHAR(200) NOT NULL,
+ spec VARCHAR(500) DEFAULT '',
+ unit VARCHAR(50) DEFAULT '',
+ quantity DECIMAL(15,4) NOT NULL,
+ expected_price DECIMAL(15,4) DEFAULT NULL COMMENT '预期单价',
+ remark VARCHAR(500) DEFAULT '',
+ PRIMARY KEY (item_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='RFQ物料明细';
+
+-- RFQ邀请供应商
+CREATE TABLE IF NOT EXISTS biz_rfq_supplier (
+ id BIGINT NOT NULL AUTO_INCREMENT,
+ rfq_id BIGINT NOT NULL,
+ supplier_id BIGINT NOT NULL,
+ invited_time DATETIME DEFAULT NULL,
+ quoted_time DATETIME DEFAULT NULL,
+ status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending/quoted/declined',
+ PRIMARY KEY (id),
+ UNIQUE KEY uk_rfq_supplier (rfq_id, supplier_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='RFQ邀请供应商';
+
+-- 供应商报价单
+CREATE TABLE IF NOT EXISTS biz_quotation (
+ quotation_id BIGINT NOT NULL AUTO_INCREMENT,
+ tenant_id BIGINT NOT NULL DEFAULT 1,
+ rfq_id BIGINT NOT NULL,
+ supplier_id BIGINT NOT NULL,
+ quote_no VARCHAR(50) DEFAULT '' COMMENT '报价单编号',
+ valid_days INT DEFAULT 30 COMMENT '报价有效天数',
+ delivery_days INT DEFAULT 0 COMMENT '交货天数',
+ total_amount DECIMAL(15,4) DEFAULT 0 COMMENT '总金额',
+ currency VARCHAR(10) DEFAULT 'CNY',
+ status VARCHAR(20) DEFAULT 'draft' COMMENT 'draft/submitted/accepted/rejected',
+ note TEXT,
+ submit_time DATETIME DEFAULT NULL,
+ create_by VARCHAR(64) DEFAULT '',
+ create_time DATETIME,
+ update_time DATETIME,
+ PRIMARY KEY (quotation_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='供应商报价单';
+
+-- 报价明细
+CREATE TABLE IF NOT EXISTS biz_quotation_item (
+ item_id BIGINT NOT NULL AUTO_INCREMENT,
+ quotation_id BIGINT NOT NULL,
+ rfq_item_id BIGINT NOT NULL,
+ material_name VARCHAR(200) DEFAULT '',
+ spec VARCHAR(500) DEFAULT '',
+ unit VARCHAR(50) DEFAULT '',
+ quantity DECIMAL(15,4) DEFAULT 0,
+ unit_price DECIMAL(15,4) NOT NULL,
+ total_price DECIMAL(15,4) DEFAULT 0,
+ delivery_days INT DEFAULT 0,
+ remark VARCHAR(500) DEFAULT '',
+ PRIMARY KEY (item_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='报价明细';
+
+-- 采购单
+CREATE TABLE IF NOT EXISTS biz_purchase_order (
+ po_id BIGINT NOT NULL AUTO_INCREMENT,
+ tenant_id BIGINT NOT NULL DEFAULT 1,
+ po_no VARCHAR(50) NOT NULL COMMENT '采购单编号',
+ rfq_id BIGINT DEFAULT NULL,
+ supplier_id BIGINT NOT NULL,
+ total_amount DECIMAL(15,4) DEFAULT 0,
+ currency VARCHAR(10) DEFAULT 'CNY',
+ delivery_addr VARCHAR(500) DEFAULT '',
+ delivery_date DATE DEFAULT NULL,
+ status VARCHAR(20) DEFAULT 'draft' COMMENT 'draft/confirmed/delivered/closed/disputed',
+ remark TEXT,
+ create_by VARCHAR(64) DEFAULT '',
+ create_time DATETIME,
+ update_by VARCHAR(64) DEFAULT '',
+ update_time DATETIME,
+ PRIMARY KEY (po_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='采购单';
+
+-- 采购单明细
+CREATE TABLE IF NOT EXISTS biz_purchase_order_item (
+ item_id BIGINT NOT NULL AUTO_INCREMENT,
+ po_id BIGINT NOT NULL,
+ material_id BIGINT DEFAULT 0,
+ material_name VARCHAR(200) NOT NULL,
+ spec VARCHAR(500) DEFAULT '',
+ unit VARCHAR(50) DEFAULT '',
+ quantity DECIMAL(15,4) NOT NULL,
+ unit_price DECIMAL(15,4) NOT NULL,
+ total_price DECIMAL(15,4) DEFAULT 0,
+ remark VARCHAR(500) DEFAULT '',
+ PRIMARY KEY (item_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='采购单明细';
+
+-- 供应商评价
+CREATE TABLE IF NOT EXISTS biz_supplier_evaluation (
+ eval_id BIGINT NOT NULL AUTO_INCREMENT,
+ tenant_id BIGINT NOT NULL DEFAULT 1,
+ po_id BIGINT NOT NULL,
+ supplier_id BIGINT NOT NULL,
+ quality_score INT DEFAULT 5 COMMENT '质量评分1-5',
+ delivery_score INT DEFAULT 5 COMMENT '交期评分1-5',
+ service_score INT DEFAULT 5 COMMENT '服务评分1-5',
+ price_score INT DEFAULT 5 COMMENT '价格评分1-5',
+ total_score DECIMAL(3,1) DEFAULT 5.0,
+ comment TEXT,
+ evaluator VARCHAR(64) DEFAULT '',
+ eval_time DATETIME,
+ PRIMARY KEY (eval_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='供应商评价';
+
+-- 订单异议
+CREATE TABLE IF NOT EXISTS biz_order_objection (
+ objection_id BIGINT NOT NULL AUTO_INCREMENT,
+ tenant_id BIGINT NOT NULL DEFAULT 1,
+ po_id BIGINT NOT NULL,
+ supplier_id BIGINT NOT NULL,
+ reason TEXT NOT NULL COMMENT '异议原因',
+ attachment VARCHAR(500) DEFAULT '' COMMENT '附件',
+ status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending/processing/resolved/rejected',
+ resolution TEXT COMMENT '处理结果',
+ create_by VARCHAR(64) DEFAULT '',
+ create_time DATETIME,
+ resolve_time DATETIME DEFAULT NULL,
+ PRIMARY KEY (objection_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单异议';
+
+-- 交易记录
+CREATE TABLE IF NOT EXISTS biz_transaction (
+ tx_id BIGINT NOT NULL AUTO_INCREMENT,
+ tenant_id BIGINT NOT NULL DEFAULT 1,
+ po_id BIGINT DEFAULT NULL,
+ supplier_id BIGINT DEFAULT NULL,
+ tx_type VARCHAR(50) DEFAULT '' COMMENT '类型:RFQ/QUOTE/PO/EVAL',
+ tx_no VARCHAR(50) DEFAULT '',
+ amount DECIMAL(15,4) DEFAULT NULL,
+ currency VARCHAR(10) DEFAULT 'CNY',
+ description TEXT,
+ operator VARCHAR(64) DEFAULT '',
+ tx_time DATETIME,
+ create_time DATETIME,
+ PRIMARY KEY (tx_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='交易记录';
+
+-- 系统菜单(智慧报价平台业务菜单)
+INSERT IGNORE INTO sys_menu(menu_id,menu_name,parent_id,order_num,path,component,query,is_frame,is_cache,menu_type,visible,status,perms,icon,create_by,create_time,update_by,update_time,remark)
+VALUES
+(2000,'智慧报价',0,5,'bid',NULL,NULL,'1','0','M','0','0','','#','admin',NOW(),'','',''),
+(2001,'物料管理',2000,1,'material','bid/material/index',NULL,'1','0','C','0','0','bid:material:list','component','admin',NOW(),'','',''),
+(2002,'供应商管理',2000,2,'supplier','bid/supplier/index',NULL,'1','0','C','0','0','bid:supplier:list','user','admin',NOW(),'','',''),
+(2003,'报价请求',2000,3,'rfq','bid/rfq/index',NULL,'1','0','C','0','0','bid:rfq:list','form','admin',NOW(),'','',''),
+(2004,'供应商报价',2000,4,'quotation','bid/quotation/index',NULL,'1','0','C','0','0','bid:quotation:list','money','admin',NOW(),'','',''),
+(2005,'智慧比价',2000,5,'comparison','bid/comparison/index',NULL,'1','0','C','0','0','bid:comparison:list','chart','admin',NOW(),'','',''),
+(2006,'采购单',2000,6,'purchaseorder','bid/purchaseorder/index',NULL,'1','0','C','0','0','bid:purchaseorder:list','shopping','admin',NOW(),'','',''),
+(2007,'供应商评价',2000,7,'evaluation','bid/evaluation/index',NULL,'1','0','C','0','0','bid:evaluation:list','star','admin',NOW(),'','',''),
+(2008,'订单异议',2000,8,'objection','bid/objection/index',NULL,'1','0','C','0','0','bid:objection:list','warning','admin',NOW(),'','',''),
+(2009,'交易记录',2000,9,'transaction','bid/transaction/index',NULL,'1','0','C','0','0','bid:transaction:list','list','admin',NOW(),'','',''),
+(2010,'租户管理',2000,10,'tenant','bid/tenant/index',NULL,'1','0','C','0','0','bid:tenant:list','peoples','admin',NOW(),'','','');
+
+-- 菜单按钮权限
+INSERT IGNORE INTO sys_menu(menu_id,menu_name,parent_id,order_num,path,component,query,is_frame,is_cache,menu_type,visible,status,perms,icon,create_by,create_time)
+VALUES
+(2101,'物料查询',2001,1,'','','','1','0','F','0','0','bid:material:query','#','admin',NOW()),
+(2102,'物料新增',2001,2,'','','','1','0','F','0','0','bid:material:add','#','admin',NOW()),
+(2103,'物料修改',2001,3,'','','','1','0','F','0','0','bid:material:edit','#','admin',NOW()),
+(2104,'物料删除',2001,4,'','','','1','0','F','0','0','bid:material:remove','#','admin',NOW()),
+(2201,'供应商查询',2002,1,'','','','1','0','F','0','0','bid:supplier:query','#','admin',NOW()),
+(2202,'供应商新增',2002,2,'','','','1','0','F','0','0','bid:supplier:add','#','admin',NOW()),
+(2203,'供应商修改',2002,3,'','','','1','0','F','0','0','bid:supplier:edit','#','admin',NOW()),
+(2204,'供应商删除',2002,4,'','','','1','0','F','0','0','bid:supplier:remove','#','admin',NOW()),
+(2301,'RFQ查询',2003,1,'','','','1','0','F','0','0','bid:rfq:query','#','admin',NOW()),
+(2302,'RFQ新增',2003,2,'','','','1','0','F','0','0','bid:rfq:add','#','admin',NOW()),
+(2303,'RFQ修改',2003,3,'','','','1','0','F','0','0','bid:rfq:edit','#','admin',NOW()),
+(2304,'RFQ删除',2003,4,'','','','1','0','F','0','0','bid:rfq:remove','#','admin',NOW()),
+(2305,'发布RFQ',2003,5,'','','','1','0','F','0','0','bid:rfq:publish','#','admin',NOW()),
+(2401,'报价查询',2004,1,'','','','1','0','F','0','0','bid:quotation:query','#','admin',NOW()),
+(2402,'报价新增',2004,2,'','','','1','0','F','0','0','bid:quotation:add','#','admin',NOW()),
+(2403,'报价修改',2004,3,'','','','1','0','F','0','0','bid:quotation:edit','#','admin',NOW()),
+(2601,'采购单查询',2006,1,'','','','1','0','F','0','0','bid:purchaseorder:query','#','admin',NOW()),
+(2602,'采购单新增',2006,2,'','','','1','0','F','0','0','bid:purchaseorder:add','#','admin',NOW()),
+(2603,'采购单修改',2006,3,'','','','1','0','F','0','0','bid:purchaseorder:edit','#','admin',NOW()),
+(2604,'采购单删除',2006,4,'','','','1','0','F','0','0','bid:purchaseorder:remove','#','admin',NOW());
diff --git a/deploy/nginx.conf b/deploy/nginx.conf
new file mode 100644
index 00000000..95b85799
--- /dev/null
+++ b/deploy/nginx.conf
@@ -0,0 +1,35 @@
+server {
+ listen 80;
+ server_name _;
+ charset utf-8;
+
+ root /usr/share/nginx/html;
+ index index.html;
+
+ # Frontend - Vue history mode
+ location / {
+ try_files $uri $uri/ /index.html;
+ expires 1h;
+ }
+
+ # Backend API proxy
+ location /prod-api/ {
+ proxy_pass http://backend:8080/;
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_connect_timeout 30s;
+ proxy_read_timeout 120s;
+ }
+
+ # Static assets caching
+ location ~* \.(js|css|png|jpg|gif|ico|woff|woff2|ttf|svg)$ {
+ expires 30d;
+ add_header Cache-Control "public, immutable";
+ }
+
+ # Gzip
+ gzip on;
+ gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
+ gzip_min_length 1000;
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizComparisonController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizComparisonController.java
new file mode 100644
index 00000000..04fa9435
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizComparisonController.java
@@ -0,0 +1,20 @@
+package com.ruoyi.web.controller.bid;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.system.service.bid.IBizComparisonService;
+
+@RestController
+@RequestMapping("/bid/comparison")
+public class BizComparisonController extends BaseController {
+ @Autowired private IBizComparisonService service;
+
+ @PreAuthorize("@ss.hasPermi('bid:comparison:list')")
+ @GetMapping("/rfq/{rfqId}")
+ public AjaxResult compareRfq(@PathVariable Long rfqId) {
+ return success(service.compareRfq(rfqId, 1L));
+ }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizMaterialController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizMaterialController.java
new file mode 100644
index 00000000..14ebc917
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizMaterialController.java
@@ -0,0 +1,57 @@
+package com.ruoyi.web.controller.bid;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.bid.BizMaterial;
+import com.ruoyi.system.service.bid.IBizMaterialService;
+
+@RestController
+@RequestMapping("/bid/material")
+public class BizMaterialController extends BaseController {
+ @Autowired
+ private IBizMaterialService service;
+
+ @PreAuthorize("@ss.hasPermi('bid:material:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(BizMaterial query) {
+ startPage();
+ List list = service.selectBizMaterialList(query);
+ return getDataTable(list);
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:material:query')")
+ @GetMapping("/{id}")
+ public AjaxResult getInfo(@PathVariable Long id) {
+ return success(service.selectBizMaterialById(id));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:material:add')")
+ @Log(title = "物料管理", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody BizMaterial record) {
+ record.setCreateBy(getUsername());
+ return toAjax(service.insertBizMaterial(record));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:material:edit')")
+ @Log(title = "物料管理", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody BizMaterial record) {
+ record.setUpdateBy(getUsername());
+ return toAjax(service.updateBizMaterial(record));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:material:remove')")
+ @Log(title = "物料管理", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{materialIds}")
+ public AjaxResult remove(@PathVariable Long[] materialIds) {
+ return toAjax(service.deleteBizMaterialByIds(materialIds));
+ }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizOrderObjectionController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizOrderObjectionController.java
new file mode 100644
index 00000000..dc8f01f7
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizOrderObjectionController.java
@@ -0,0 +1,52 @@
+package com.ruoyi.web.controller.bid;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.bid.BizOrderObjection;
+import com.ruoyi.system.service.bid.IBizOrderObjectionService;
+
+@RestController
+@RequestMapping("/bid/objection")
+public class BizOrderObjectionController extends BaseController {
+ @Autowired private IBizOrderObjectionService service;
+
+ @PreAuthorize("@ss.hasPermi('bid:objection:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(BizOrderObjection q) {
+ startPage();
+ return getDataTable(service.selectBizOrderObjectionList(q));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:objection:query')")
+ @GetMapping("/{objectionId}")
+ public AjaxResult getInfo(@PathVariable Long objectionId) {
+ return success(service.selectBizOrderObjectionById(objectionId));
+ }
+
+ @Log(title = "订单异议", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody BizOrderObjection record) {
+ record.setCreateBy(getUsername());
+ return toAjax(service.insertBizOrderObjection(record));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:objection:edit')")
+ @Log(title = "处理异议", businessType = BusinessType.UPDATE)
+ @PutMapping("/resolve")
+ public AjaxResult resolve(@RequestBody BizOrderObjection record) {
+ record.setStatus("resolved");
+ return toAjax(service.updateBizOrderObjection(record));
+ }
+
+ @Log(title = "订单异议", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{objectionIds}")
+ public AjaxResult remove(@PathVariable Long[] objectionIds) {
+ return toAjax(service.deleteBizOrderObjectionByIds(objectionIds));
+ }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizPurchaseOrderController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizPurchaseOrderController.java
new file mode 100644
index 00000000..8ad47712
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizPurchaseOrderController.java
@@ -0,0 +1,61 @@
+package com.ruoyi.web.controller.bid;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.bid.BizPurchaseOrder;
+import com.ruoyi.system.service.bid.IBizPurchaseOrderService;
+
+@RestController
+@RequestMapping("/bid/purchaseorder")
+public class BizPurchaseOrderController extends BaseController {
+ @Autowired private IBizPurchaseOrderService service;
+
+ @PreAuthorize("@ss.hasPermi('bid:purchaseorder:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(BizPurchaseOrder q) {
+ startPage();
+ return getDataTable(service.selectBizPurchaseOrderList(q));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:purchaseorder:query')")
+ @GetMapping("/{poId}")
+ public AjaxResult getInfo(@PathVariable Long poId) {
+ return success(service.selectBizPurchaseOrderById(poId));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:purchaseorder:add')")
+ @Log(title = "采购单", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody BizPurchaseOrder po) {
+ po.setCreateBy(getUsername());
+ return toAjax(service.insertBizPurchaseOrder(po));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:purchaseorder:edit')")
+ @Log(title = "采购单", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody BizPurchaseOrder po) {
+ po.setUpdateBy(getUsername());
+ return toAjax(service.updateBizPurchaseOrder(po));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:purchaseorder:edit')")
+ @Log(title = "确认采购单", businessType = BusinessType.UPDATE)
+ @PutMapping("/confirm/{poId}")
+ public AjaxResult confirm(@PathVariable Long poId) {
+ return toAjax(service.confirmOrder(poId));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:purchaseorder:remove')")
+ @Log(title = "采购单", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{poIds}")
+ public AjaxResult remove(@PathVariable Long[] poIds) {
+ return toAjax(service.deleteBizPurchaseOrderByIds(poIds));
+ }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizQuotationController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizQuotationController.java
new file mode 100644
index 00000000..07421023
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizQuotationController.java
@@ -0,0 +1,73 @@
+package com.ruoyi.web.controller.bid;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.bid.BizQuotation;
+import com.ruoyi.system.service.bid.IBizQuotationService;
+
+@RestController
+@RequestMapping("/bid/quotation")
+public class BizQuotationController extends BaseController {
+ @Autowired private IBizQuotationService service;
+
+ @PreAuthorize("@ss.hasPermi('bid:quotation:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(BizQuotation q) {
+ startPage();
+ return getDataTable(service.selectBizQuotationList(q));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:quotation:query')")
+ @GetMapping("/{quotationId}")
+ public AjaxResult getInfo(@PathVariable Long quotationId) {
+ return success(service.selectBizQuotationById(quotationId));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:quotation:add')")
+ @Log(title = "报价单", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody BizQuotation q) {
+ q.setCreateBy(getUsername());
+ return toAjax(service.insertBizQuotation(q));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:quotation:edit')")
+ @Log(title = "报价单", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody BizQuotation q) {
+ return toAjax(service.updateBizQuotation(q));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:quotation:edit')")
+ @Log(title = "提交报价", businessType = BusinessType.UPDATE)
+ @PutMapping("/submit/{quotationId}")
+ public AjaxResult submit(@PathVariable Long quotationId) {
+ return toAjax(service.submitQuotation(quotationId));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:quotation:edit')")
+ @PutMapping("/accept/{quotationId}")
+ public AjaxResult accept(@PathVariable Long quotationId) {
+ return toAjax(service.acceptQuotation(quotationId));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:quotation:edit')")
+ @PutMapping("/reject/{quotationId}")
+ public AjaxResult reject(@PathVariable Long quotationId) {
+ return toAjax(service.rejectQuotation(quotationId));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:quotation:remove')")
+ @Log(title = "报价单", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{quotationIds}")
+ public AjaxResult remove(@PathVariable Long[] quotationIds) {
+ return toAjax(service.deleteBizQuotationByIds(quotationIds));
+ }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizRfqController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizRfqController.java
new file mode 100644
index 00000000..5546cd52
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizRfqController.java
@@ -0,0 +1,69 @@
+package com.ruoyi.web.controller.bid;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.bid.BizRfq;
+import com.ruoyi.system.domain.bid.BizRfqItem;
+import com.ruoyi.system.service.bid.IBizRfqService;
+
+@RestController
+@RequestMapping("/bid/rfq")
+public class BizRfqController extends BaseController {
+ @Autowired private IBizRfqService service;
+
+ @PreAuthorize("@ss.hasPermi('bid:rfq:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(BizRfq query) {
+ startPage();
+ return getDataTable(service.selectBizRfqList(query));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:rfq:query')")
+ @GetMapping("/{rfqId}")
+ public AjaxResult getInfo(@PathVariable Long rfqId) {
+ return success(service.selectBizRfqById(rfqId));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:rfq:query')")
+ @GetMapping("/{rfqId}/items")
+ public AjaxResult getItems(@PathVariable Long rfqId) {
+ return success(service.selectItemsByRfqId(rfqId));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:rfq:add')")
+ @Log(title = "报价请求", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody BizRfq rfq) {
+ rfq.setCreateBy(getUsername());
+ return toAjax(service.insertBizRfq(rfq));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:rfq:edit')")
+ @Log(title = "报价请求", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody BizRfq rfq) {
+ rfq.setUpdateBy(getUsername());
+ return toAjax(service.updateBizRfq(rfq));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:rfq:publish')")
+ @Log(title = "发布RFQ", businessType = BusinessType.UPDATE)
+ @PutMapping("/publish/{rfqId}")
+ public AjaxResult publish(@PathVariable Long rfqId, @RequestBody Long[] supplierIds) {
+ return toAjax(service.publishRfq(rfqId, supplierIds));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:rfq:remove')")
+ @Log(title = "报价请求", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{rfqIds}")
+ public AjaxResult remove(@PathVariable Long[] rfqIds) {
+ return toAjax(service.deleteBizRfqByIds(rfqIds));
+ }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizSupplierController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizSupplierController.java
new file mode 100644
index 00000000..597d9f8e
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizSupplierController.java
@@ -0,0 +1,57 @@
+package com.ruoyi.web.controller.bid;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.bid.BizSupplier;
+import com.ruoyi.system.service.bid.IBizSupplierService;
+
+@RestController
+@RequestMapping("/bid/supplier")
+public class BizSupplierController extends BaseController {
+ @Autowired
+ private IBizSupplierService service;
+
+ @PreAuthorize("@ss.hasPermi('bid:supplier:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(BizSupplier query) {
+ startPage();
+ List list = service.selectBizSupplierList(query);
+ return getDataTable(list);
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:supplier:query')")
+ @GetMapping("/{id}")
+ public AjaxResult getInfo(@PathVariable Long id) {
+ return success(service.selectBizSupplierById(id));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:supplier:add')")
+ @Log(title = "供应商管理", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody BizSupplier record) {
+ record.setCreateBy(getUsername());
+ return toAjax(service.insertBizSupplier(record));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:supplier:edit')")
+ @Log(title = "供应商管理", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody BizSupplier record) {
+ record.setUpdateBy(getUsername());
+ return toAjax(service.updateBizSupplier(record));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:supplier:remove')")
+ @Log(title = "供应商管理", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{supplierIds}")
+ public AjaxResult remove(@PathVariable Long[] supplierIds) {
+ return toAjax(service.deleteBizSupplierByIds(supplierIds));
+ }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizSupplierEvaluationController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizSupplierEvaluationController.java
new file mode 100644
index 00000000..6450bac9
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizSupplierEvaluationController.java
@@ -0,0 +1,44 @@
+package com.ruoyi.web.controller.bid;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.bid.BizSupplierEvaluation;
+import com.ruoyi.system.service.bid.IBizSupplierEvaluationService;
+
+@RestController
+@RequestMapping("/bid/evaluation")
+public class BizSupplierEvaluationController extends BaseController {
+ @Autowired private IBizSupplierEvaluationService service;
+
+ @PreAuthorize("@ss.hasPermi('bid:evaluation:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(BizSupplierEvaluation q) {
+ startPage();
+ return getDataTable(service.selectBizSupplierEvaluationList(q));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:evaluation:query')")
+ @GetMapping("/{evalId}")
+ public AjaxResult getInfo(@PathVariable Long evalId) {
+ return success(service.selectBizSupplierEvaluationById(evalId));
+ }
+
+ @Log(title = "供应商评价", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody BizSupplierEvaluation record) {
+ record.setEvaluator(getUsername());
+ return toAjax(service.insertBizSupplierEvaluation(record));
+ }
+
+ @Log(title = "供应商评价", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{evalIds}")
+ public AjaxResult remove(@PathVariable Long[] evalIds) {
+ return toAjax(service.deleteBizSupplierEvaluationByIds(evalIds));
+ }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizTenantController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizTenantController.java
new file mode 100644
index 00000000..f35c4224
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizTenantController.java
@@ -0,0 +1,57 @@
+package com.ruoyi.web.controller.bid;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.bid.BizTenant;
+import com.ruoyi.system.service.bid.IBizTenantService;
+
+@RestController
+@RequestMapping("/bid/tenant")
+public class BizTenantController extends BaseController {
+ @Autowired
+ private IBizTenantService service;
+
+ @PreAuthorize("@ss.hasPermi('bid:tenant:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(BizTenant query) {
+ startPage();
+ List list = service.selectBizTenantList(query);
+ return getDataTable(list);
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:tenant:query')")
+ @GetMapping("/{id}")
+ public AjaxResult getInfo(@PathVariable Long id) {
+ return success(service.selectBizTenantById(id));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:tenant:add')")
+ @Log(title = "租户管理", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody BizTenant record) {
+ record.setCreateBy(getUsername());
+ return toAjax(service.insertBizTenant(record));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:tenant:edit')")
+ @Log(title = "租户管理", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody BizTenant record) {
+ record.setUpdateBy(getUsername());
+ return toAjax(service.updateBizTenant(record));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:tenant:remove')")
+ @Log(title = "租户管理", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{tenantIds}")
+ public AjaxResult remove(@PathVariable Long[] tenantIds) {
+ return toAjax(service.deleteBizTenantByIds(tenantIds));
+ }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizTransactionController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizTransactionController.java
new file mode 100644
index 00000000..304a776c
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/bid/BizTransactionController.java
@@ -0,0 +1,29 @@
+package com.ruoyi.web.controller.bid;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.system.domain.bid.BizTransaction;
+import com.ruoyi.system.service.bid.IBizTransactionService;
+
+@RestController
+@RequestMapping("/bid/transaction")
+public class BizTransactionController extends BaseController {
+ @Autowired private IBizTransactionService service;
+
+ @PreAuthorize("@ss.hasPermi('bid:transaction:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(BizTransaction q) {
+ startPage();
+ return getDataTable(service.selectBizTransactionList(q));
+ }
+
+ @PreAuthorize("@ss.hasPermi('bid:transaction:query')")
+ @GetMapping("/{txId}")
+ public AjaxResult getInfo(@PathVariable Long txId) {
+ return success(service.selectBizTransactionById(txId));
+ }
+}
diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml
new file mode 100644
index 00000000..22b3891e
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/application-prod.yml
@@ -0,0 +1,50 @@
+spring:
+ datasource:
+ type: com.alibaba.druid.pool.DruidDataSource
+ driverClassName: com.mysql.cj.jdbc.Driver
+ druid:
+ master:
+ url: ${SPRING_DATASOURCE_URL:jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8}
+ username: ${SPRING_DATASOURCE_USERNAME:root}
+ password: ${SPRING_DATASOURCE_PASSWORD:password}
+ slave:
+ enabled: false
+ initialSize: 5
+ minIdle: 5
+ maxActive: 20
+ maxWait: 60000
+ connectTimeout: 30000
+ socketTimeout: 60000
+ timeBetweenEvictionRunsMillis: 60000
+ minEvictableIdleTimeMillis: 300000
+ maxEvictableIdleTimeMillis: 900000
+ validationQuery: SELECT 1
+ testWhileIdle: true
+ testOnBorrow: false
+ testOnReturn: false
+ webStatFilter:
+ enabled: true
+ statViewServlet:
+ enabled: false
+ filter:
+ stat:
+ enabled: true
+ log-slow-sql: true
+ slow-sql-millis: 1000
+ merge-sql: true
+ wall:
+ config:
+ multi-statement-allow: true
+
+ redis:
+ host: ${SPRING_REDIS_HOST:localhost}
+ port: ${SPRING_REDIS_PORT:6379}
+ password: ${SPRING_REDIS_PASSWORD:}
+ database: 0
+ timeout: 10s
+ lettuce:
+ pool:
+ min-idle: 0
+ max-idle: 8
+ max-active: 8
+ max-wait: -1ms
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizComparisonVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizComparisonVO.java
new file mode 100644
index 00000000..f433bf90
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizComparisonVO.java
@@ -0,0 +1,54 @@
+package com.ruoyi.system.domain.bid;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+public class BizComparisonVO {
+ private Long rfqItemId;
+ private String materialName;
+ private String spec;
+ private String unit;
+ private BigDecimal quantity;
+ private List prices;
+
+ public static class SupplierPrice {
+ private Long supplierId;
+ private String supplierName;
+ private Long quotationId;
+ private String quoteNo;
+ private BigDecimal unitPrice;
+ private BigDecimal totalPrice;
+ private Integer deliveryDays;
+ private boolean lowestPrice;
+
+ public Long getSupplierId() { return supplierId; }
+ public void setSupplierId(Long supplierId) { this.supplierId = supplierId; }
+ public String getSupplierName() { return supplierName; }
+ public void setSupplierName(String supplierName) { this.supplierName = supplierName; }
+ public Long getQuotationId() { return quotationId; }
+ public void setQuotationId(Long quotationId) { this.quotationId = quotationId; }
+ public String getQuoteNo() { return quoteNo; }
+ public void setQuoteNo(String quoteNo) { this.quoteNo = quoteNo; }
+ public BigDecimal getUnitPrice() { return unitPrice; }
+ public void setUnitPrice(BigDecimal unitPrice) { this.unitPrice = unitPrice; }
+ public BigDecimal getTotalPrice() { return totalPrice; }
+ public void setTotalPrice(BigDecimal totalPrice) { this.totalPrice = totalPrice; }
+ public Integer getDeliveryDays() { return deliveryDays; }
+ public void setDeliveryDays(Integer deliveryDays) { this.deliveryDays = deliveryDays; }
+ public boolean isLowestPrice() { return lowestPrice; }
+ public void setLowestPrice(boolean lowestPrice) { this.lowestPrice = lowestPrice; }
+ }
+
+ public Long getRfqItemId() { return rfqItemId; }
+ public void setRfqItemId(Long rfqItemId) { this.rfqItemId = rfqItemId; }
+ public String getMaterialName() { return materialName; }
+ public void setMaterialName(String materialName) { this.materialName = materialName; }
+ public String getSpec() { return spec; }
+ public void setSpec(String spec) { this.spec = spec; }
+ public String getUnit() { return unit; }
+ public void setUnit(String unit) { this.unit = unit; }
+ public BigDecimal getQuantity() { return quantity; }
+ public void setQuantity(BigDecimal quantity) { this.quantity = quantity; }
+ public List getPrices() { return prices; }
+ public void setPrices(List prices) { this.prices = prices; }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizMaterial.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizMaterial.java
new file mode 100644
index 00000000..599d09d1
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizMaterial.java
@@ -0,0 +1,41 @@
+package com.ruoyi.system.domain.bid;
+
+import com.ruoyi.common.core.domain.BaseEntity;
+
+public class BizMaterial extends BaseEntity {
+ private Long materialId;
+ private Long tenantId;
+ private Long categoryId;
+ private String materialCode;
+ private String materialName;
+ private String spec;
+ private String unit;
+ private String brand;
+ private String description;
+ private String status;
+ // search helper
+ private String categoryName;
+
+ public Long getMaterialId() { return materialId; }
+ public void setMaterialId(Long materialId) { this.materialId = materialId; }
+ public Long getTenantId() { return tenantId; }
+ public void setTenantId(Long tenantId) { this.tenantId = tenantId; }
+ public Long getCategoryId() { return categoryId; }
+ public void setCategoryId(Long categoryId) { this.categoryId = categoryId; }
+ public String getMaterialCode() { return materialCode; }
+ public void setMaterialCode(String materialCode) { this.materialCode = materialCode; }
+ public String getMaterialName() { return materialName; }
+ public void setMaterialName(String materialName) { this.materialName = materialName; }
+ public String getSpec() { return spec; }
+ public void setSpec(String spec) { this.spec = spec; }
+ public String getUnit() { return unit; }
+ public void setUnit(String unit) { this.unit = unit; }
+ public String getBrand() { return brand; }
+ public void setBrand(String brand) { this.brand = brand; }
+ public String getDescription() { return description; }
+ public void setDescription(String description) { this.description = description; }
+ public String getStatus() { return status; }
+ public void setStatus(String status) { this.status = status; }
+ public String getCategoryName() { return categoryName; }
+ public void setCategoryName(String categoryName) { this.categoryName = categoryName; }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizOrderObjection.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizOrderObjection.java
new file mode 100644
index 00000000..8c57cdee
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizOrderObjection.java
@@ -0,0 +1,49 @@
+package com.ruoyi.system.domain.bid;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+
+public class BizOrderObjection {
+ private Long objectionId;
+ private Long tenantId;
+ private Long poId;
+ private Long supplierId;
+ private String reason;
+ private String attachment;
+ private String status;
+ private String resolution;
+ private String createBy;
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date createTime;
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date resolveTime;
+ private String supplierName;
+ private String poNo;
+
+ public Long getObjectionId() { return objectionId; }
+ public void setObjectionId(Long objectionId) { this.objectionId = objectionId; }
+ public Long getTenantId() { return tenantId; }
+ public void setTenantId(Long tenantId) { this.tenantId = tenantId; }
+ public Long getPoId() { return poId; }
+ public void setPoId(Long poId) { this.poId = poId; }
+ public Long getSupplierId() { return supplierId; }
+ public void setSupplierId(Long supplierId) { this.supplierId = supplierId; }
+ public String getReason() { return reason; }
+ public void setReason(String reason) { this.reason = reason; }
+ public String getAttachment() { return attachment; }
+ public void setAttachment(String attachment) { this.attachment = attachment; }
+ public String getStatus() { return status; }
+ public void setStatus(String status) { this.status = status; }
+ public String getResolution() { return resolution; }
+ public void setResolution(String resolution) { this.resolution = resolution; }
+ public String getCreateBy() { return createBy; }
+ public void setCreateBy(String createBy) { this.createBy = createBy; }
+ public Date getCreateTime() { return createTime; }
+ public void setCreateTime(Date createTime) { this.createTime = createTime; }
+ public Date getResolveTime() { return resolveTime; }
+ public void setResolveTime(Date resolveTime) { this.resolveTime = resolveTime; }
+ public String getSupplierName() { return supplierName; }
+ public void setSupplierName(String supplierName) { this.supplierName = supplierName; }
+ public String getPoNo() { return poNo; }
+ public void setPoNo(String poNo) { this.poNo = poNo; }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizPurchaseOrder.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizPurchaseOrder.java
new file mode 100644
index 00000000..13444610
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizPurchaseOrder.java
@@ -0,0 +1,51 @@
+package com.ruoyi.system.domain.bid;
+
+import com.ruoyi.common.core.domain.BaseEntity;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+public class BizPurchaseOrder extends BaseEntity {
+ private Long poId;
+ private Long tenantId;
+ private String poNo;
+ private Long rfqId;
+ private Long supplierId;
+ private BigDecimal totalAmount;
+ private String currency;
+ private String deliveryAddr;
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ private Date deliveryDate;
+ private String status;
+ private List items;
+ private String supplierName;
+ private String rfqTitle;
+
+ public Long getPoId() { return poId; }
+ public void setPoId(Long poId) { this.poId = poId; }
+ public Long getTenantId() { return tenantId; }
+ public void setTenantId(Long tenantId) { this.tenantId = tenantId; }
+ public String getPoNo() { return poNo; }
+ public void setPoNo(String poNo) { this.poNo = poNo; }
+ public Long getRfqId() { return rfqId; }
+ public void setRfqId(Long rfqId) { this.rfqId = rfqId; }
+ public Long getSupplierId() { return supplierId; }
+ public void setSupplierId(Long supplierId) { this.supplierId = supplierId; }
+ public BigDecimal getTotalAmount() { return totalAmount; }
+ public void setTotalAmount(BigDecimal totalAmount) { this.totalAmount = totalAmount; }
+ public String getCurrency() { return currency; }
+ public void setCurrency(String currency) { this.currency = currency; }
+ public String getDeliveryAddr() { return deliveryAddr; }
+ public void setDeliveryAddr(String deliveryAddr) { this.deliveryAddr = deliveryAddr; }
+ public Date getDeliveryDate() { return deliveryDate; }
+ public void setDeliveryDate(Date deliveryDate) { this.deliveryDate = deliveryDate; }
+ public String getStatus() { return status; }
+ public void setStatus(String status) { this.status = status; }
+ public List getItems() { return items; }
+ public void setItems(List items) { this.items = items; }
+ public String getSupplierName() { return supplierName; }
+ public void setSupplierName(String supplierName) { this.supplierName = supplierName; }
+ public String getRfqTitle() { return rfqTitle; }
+ public void setRfqTitle(String rfqTitle) { this.rfqTitle = rfqTitle; }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizPurchaseOrderItem.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizPurchaseOrderItem.java
new file mode 100644
index 00000000..f9ff2a91
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizPurchaseOrderItem.java
@@ -0,0 +1,37 @@
+package com.ruoyi.system.domain.bid;
+
+import java.math.BigDecimal;
+
+public class BizPurchaseOrderItem {
+ private Long itemId;
+ private Long poId;
+ private Long materialId;
+ private String materialName;
+ private String spec;
+ private String unit;
+ private BigDecimal quantity;
+ private BigDecimal unitPrice;
+ private BigDecimal totalPrice;
+ private String remark;
+
+ public Long getItemId() { return itemId; }
+ public void setItemId(Long itemId) { this.itemId = itemId; }
+ public Long getPoId() { return poId; }
+ public void setPoId(Long poId) { this.poId = poId; }
+ public Long getMaterialId() { return materialId; }
+ public void setMaterialId(Long materialId) { this.materialId = materialId; }
+ public String getMaterialName() { return materialName; }
+ public void setMaterialName(String materialName) { this.materialName = materialName; }
+ public String getSpec() { return spec; }
+ public void setSpec(String spec) { this.spec = spec; }
+ public String getUnit() { return unit; }
+ public void setUnit(String unit) { this.unit = unit; }
+ public BigDecimal getQuantity() { return quantity; }
+ public void setQuantity(BigDecimal quantity) { this.quantity = quantity; }
+ public BigDecimal getUnitPrice() { return unitPrice; }
+ public void setUnitPrice(BigDecimal unitPrice) { this.unitPrice = unitPrice; }
+ public BigDecimal getTotalPrice() { return totalPrice; }
+ public void setTotalPrice(BigDecimal totalPrice) { this.totalPrice = totalPrice; }
+ public String getRemark() { return remark; }
+ public void setRemark(String remark) { this.remark = remark; }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizQuotation.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizQuotation.java
new file mode 100644
index 00000000..e64d17f4
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizQuotation.java
@@ -0,0 +1,61 @@
+package com.ruoyi.system.domain.bid;
+
+import com.ruoyi.common.core.domain.BaseEntity;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+public class BizQuotation extends BaseEntity {
+ private Long quotationId;
+ private Long tenantId;
+ private Long rfqId;
+ private Long supplierId;
+ private String quoteNo;
+ private Integer validDays;
+ private Integer deliveryDays;
+ private BigDecimal totalAmount;
+ private String currency;
+ private String status;
+ private String note;
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date submitTime;
+ private List items;
+ // joins
+ private String supplierName;
+ private String rfqTitle;
+ private String rfqNo;
+
+ public Long getQuotationId() { return quotationId; }
+ public void setQuotationId(Long quotationId) { this.quotationId = quotationId; }
+ public Long getTenantId() { return tenantId; }
+ public void setTenantId(Long tenantId) { this.tenantId = tenantId; }
+ public Long getRfqId() { return rfqId; }
+ public void setRfqId(Long rfqId) { this.rfqId = rfqId; }
+ public Long getSupplierId() { return supplierId; }
+ public void setSupplierId(Long supplierId) { this.supplierId = supplierId; }
+ public String getQuoteNo() { return quoteNo; }
+ public void setQuoteNo(String quoteNo) { this.quoteNo = quoteNo; }
+ public Integer getValidDays() { return validDays; }
+ public void setValidDays(Integer validDays) { this.validDays = validDays; }
+ public Integer getDeliveryDays() { return deliveryDays; }
+ public void setDeliveryDays(Integer deliveryDays) { this.deliveryDays = deliveryDays; }
+ public BigDecimal getTotalAmount() { return totalAmount; }
+ public void setTotalAmount(BigDecimal totalAmount) { this.totalAmount = totalAmount; }
+ public String getCurrency() { return currency; }
+ public void setCurrency(String currency) { this.currency = currency; }
+ public String getStatus() { return status; }
+ public void setStatus(String status) { this.status = status; }
+ public String getNote() { return note; }
+ public void setNote(String note) { this.note = note; }
+ public Date getSubmitTime() { return submitTime; }
+ public void setSubmitTime(Date submitTime) { this.submitTime = submitTime; }
+ public List getItems() { return items; }
+ public void setItems(List items) { this.items = items; }
+ public String getSupplierName() { return supplierName; }
+ public void setSupplierName(String supplierName) { this.supplierName = supplierName; }
+ public String getRfqTitle() { return rfqTitle; }
+ public void setRfqTitle(String rfqTitle) { this.rfqTitle = rfqTitle; }
+ public String getRfqNo() { return rfqNo; }
+ public void setRfqNo(String rfqNo) { this.rfqNo = rfqNo; }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizQuotationItem.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizQuotationItem.java
new file mode 100644
index 00000000..4c118b02
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizQuotationItem.java
@@ -0,0 +1,40 @@
+package com.ruoyi.system.domain.bid;
+
+import java.math.BigDecimal;
+
+public class BizQuotationItem {
+ private Long itemId;
+ private Long quotationId;
+ private Long rfqItemId;
+ private String materialName;
+ private String spec;
+ private String unit;
+ private BigDecimal quantity;
+ private BigDecimal unitPrice;
+ private BigDecimal totalPrice;
+ private Integer deliveryDays;
+ private String remark;
+
+ public Long getItemId() { return itemId; }
+ public void setItemId(Long itemId) { this.itemId = itemId; }
+ public Long getQuotationId() { return quotationId; }
+ public void setQuotationId(Long quotationId) { this.quotationId = quotationId; }
+ public Long getRfqItemId() { return rfqItemId; }
+ public void setRfqItemId(Long rfqItemId) { this.rfqItemId = rfqItemId; }
+ public String getMaterialName() { return materialName; }
+ public void setMaterialName(String materialName) { this.materialName = materialName; }
+ public String getSpec() { return spec; }
+ public void setSpec(String spec) { this.spec = spec; }
+ public String getUnit() { return unit; }
+ public void setUnit(String unit) { this.unit = unit; }
+ public BigDecimal getQuantity() { return quantity; }
+ public void setQuantity(BigDecimal quantity) { this.quantity = quantity; }
+ public BigDecimal getUnitPrice() { return unitPrice; }
+ public void setUnitPrice(BigDecimal unitPrice) { this.unitPrice = unitPrice; }
+ public BigDecimal getTotalPrice() { return totalPrice; }
+ public void setTotalPrice(BigDecimal totalPrice) { this.totalPrice = totalPrice; }
+ public Integer getDeliveryDays() { return deliveryDays; }
+ public void setDeliveryDays(Integer deliveryDays) { this.deliveryDays = deliveryDays; }
+ public String getRemark() { return remark; }
+ public void setRemark(String remark) { this.remark = remark; }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizRfq.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizRfq.java
new file mode 100644
index 00000000..4bb6d8f2
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizRfq.java
@@ -0,0 +1,38 @@
+package com.ruoyi.system.domain.bid;
+
+import com.ruoyi.common.core.domain.BaseEntity;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+import java.util.List;
+
+public class BizRfq extends BaseEntity {
+ private Long rfqId;
+ private Long tenantId;
+ private String rfqNo;
+ private String rfqTitle;
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date deadline;
+ private String deliveryAddr;
+ private String status;
+ private List items;
+ private List supplierIds;
+
+ public Long getRfqId() { return rfqId; }
+ public void setRfqId(Long rfqId) { this.rfqId = rfqId; }
+ public Long getTenantId() { return tenantId; }
+ public void setTenantId(Long tenantId) { this.tenantId = tenantId; }
+ public String getRfqNo() { return rfqNo; }
+ public void setRfqNo(String rfqNo) { this.rfqNo = rfqNo; }
+ public String getRfqTitle() { return rfqTitle; }
+ public void setRfqTitle(String rfqTitle) { this.rfqTitle = rfqTitle; }
+ public Date getDeadline() { return deadline; }
+ public void setDeadline(Date deadline) { this.deadline = deadline; }
+ public String getDeliveryAddr() { return deliveryAddr; }
+ public void setDeliveryAddr(String deliveryAddr) { this.deliveryAddr = deliveryAddr; }
+ public String getStatus() { return status; }
+ public void setStatus(String status) { this.status = status; }
+ public List getItems() { return items; }
+ public void setItems(List items) { this.items = items; }
+ public List getSupplierIds() { return supplierIds; }
+ public void setSupplierIds(List supplierIds) { this.supplierIds = supplierIds; }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizRfqItem.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizRfqItem.java
new file mode 100644
index 00000000..7af83d31
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizRfqItem.java
@@ -0,0 +1,34 @@
+package com.ruoyi.system.domain.bid;
+
+import java.math.BigDecimal;
+
+public class BizRfqItem {
+ private Long itemId;
+ private Long rfqId;
+ private Long materialId;
+ private String materialName;
+ private String spec;
+ private String unit;
+ private BigDecimal quantity;
+ private BigDecimal expectedPrice;
+ private String remark;
+
+ public Long getItemId() { return itemId; }
+ public void setItemId(Long itemId) { this.itemId = itemId; }
+ public Long getRfqId() { return rfqId; }
+ public void setRfqId(Long rfqId) { this.rfqId = rfqId; }
+ public Long getMaterialId() { return materialId; }
+ public void setMaterialId(Long materialId) { this.materialId = materialId; }
+ public String getMaterialName() { return materialName; }
+ public void setMaterialName(String materialName) { this.materialName = materialName; }
+ public String getSpec() { return spec; }
+ public void setSpec(String spec) { this.spec = spec; }
+ public String getUnit() { return unit; }
+ public void setUnit(String unit) { this.unit = unit; }
+ public BigDecimal getQuantity() { return quantity; }
+ public void setQuantity(BigDecimal quantity) { this.quantity = quantity; }
+ public BigDecimal getExpectedPrice() { return expectedPrice; }
+ public void setExpectedPrice(BigDecimal expectedPrice) { this.expectedPrice = expectedPrice; }
+ public String getRemark() { return remark; }
+ public void setRemark(String remark) { this.remark = remark; }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizSupplier.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizSupplier.java
new file mode 100644
index 00000000..920488aa
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizSupplier.java
@@ -0,0 +1,34 @@
+package com.ruoyi.system.domain.bid;
+
+import com.ruoyi.common.core.domain.BaseEntity;
+
+public class BizSupplier extends BaseEntity {
+ private Long supplierId;
+ private Long tenantId;
+ private String supplierName;
+ private String contact;
+ private String phone;
+ private String email;
+ private String address;
+ private Long userId;
+ private String status;
+
+ public Long getSupplierId() { return supplierId; }
+ public void setSupplierId(Long supplierId) { this.supplierId = supplierId; }
+ public Long getTenantId() { return tenantId; }
+ public void setTenantId(Long tenantId) { this.tenantId = tenantId; }
+ public String getSupplierName() { return supplierName; }
+ public void setSupplierName(String supplierName) { this.supplierName = supplierName; }
+ public String getContact() { return contact; }
+ public void setContact(String contact) { this.contact = contact; }
+ public String getPhone() { return phone; }
+ public void setPhone(String phone) { this.phone = phone; }
+ public String getEmail() { return email; }
+ public void setEmail(String email) { this.email = email; }
+ public String getAddress() { return address; }
+ public void setAddress(String address) { this.address = address; }
+ public Long getUserId() { return userId; }
+ public void setUserId(Long userId) { this.userId = userId; }
+ public String getStatus() { return status; }
+ public void setStatus(String status) { this.status = status; }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizSupplierEvaluation.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizSupplierEvaluation.java
new file mode 100644
index 00000000..289dbc9b
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizSupplierEvaluation.java
@@ -0,0 +1,52 @@
+package com.ruoyi.system.domain.bid;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class BizSupplierEvaluation {
+ private Long evalId;
+ private Long tenantId;
+ private Long poId;
+ private Long supplierId;
+ private Integer qualityScore;
+ private Integer deliveryScore;
+ private Integer serviceScore;
+ private Integer priceScore;
+ private BigDecimal totalScore;
+ private String comment;
+ private String evaluator;
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date evalTime;
+ private String supplierName;
+ private String poNo;
+
+ public Long getEvalId() { return evalId; }
+ public void setEvalId(Long evalId) { this.evalId = evalId; }
+ public Long getTenantId() { return tenantId; }
+ public void setTenantId(Long tenantId) { this.tenantId = tenantId; }
+ public Long getPoId() { return poId; }
+ public void setPoId(Long poId) { this.poId = poId; }
+ public Long getSupplierId() { return supplierId; }
+ public void setSupplierId(Long supplierId) { this.supplierId = supplierId; }
+ public Integer getQualityScore() { return qualityScore; }
+ public void setQualityScore(Integer qualityScore) { this.qualityScore = qualityScore; }
+ public Integer getDeliveryScore() { return deliveryScore; }
+ public void setDeliveryScore(Integer deliveryScore) { this.deliveryScore = deliveryScore; }
+ public Integer getServiceScore() { return serviceScore; }
+ public void setServiceScore(Integer serviceScore) { this.serviceScore = serviceScore; }
+ public Integer getPriceScore() { return priceScore; }
+ public void setPriceScore(Integer priceScore) { this.priceScore = priceScore; }
+ public BigDecimal getTotalScore() { return totalScore; }
+ public void setTotalScore(BigDecimal totalScore) { this.totalScore = totalScore; }
+ public String getComment() { return comment; }
+ public void setComment(String comment) { this.comment = comment; }
+ public String getEvaluator() { return evaluator; }
+ public void setEvaluator(String evaluator) { this.evaluator = evaluator; }
+ public Date getEvalTime() { return evalTime; }
+ public void setEvalTime(Date evalTime) { this.evalTime = evalTime; }
+ public String getSupplierName() { return supplierName; }
+ public void setSupplierName(String supplierName) { this.supplierName = supplierName; }
+ public String getPoNo() { return poNo; }
+ public void setPoNo(String poNo) { this.poNo = poNo; }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizTenant.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizTenant.java
new file mode 100644
index 00000000..24eb512d
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizTenant.java
@@ -0,0 +1,35 @@
+package com.ruoyi.system.domain.bid;
+
+import com.ruoyi.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class BizTenant extends BaseEntity {
+ private Long tenantId;
+ private String tenantName;
+ private String contact;
+ private String phone;
+ private String email;
+ private String status;
+
+ public Long getTenantId() { return tenantId; }
+ public void setTenantId(Long tenantId) { this.tenantId = tenantId; }
+ public String getTenantName() { return tenantName; }
+ public void setTenantName(String tenantName) { this.tenantName = tenantName; }
+ public String getContact() { return contact; }
+ public void setContact(String contact) { this.contact = contact; }
+ public String getPhone() { return phone; }
+ public void setPhone(String phone) { this.phone = phone; }
+ public String getEmail() { return email; }
+ public void setEmail(String email) { this.email = email; }
+ public String getStatus() { return status; }
+ public void setStatus(String status) { this.status = status; }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+ .append("tenantId", getTenantId())
+ .append("tenantName", getTenantName())
+ .toString();
+ }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizTransaction.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizTransaction.java
new file mode 100644
index 00000000..a24c980e
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bid/BizTransaction.java
@@ -0,0 +1,60 @@
+package com.ruoyi.system.domain.bid;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class BizTransaction {
+ private Long txId;
+ private Long tenantId;
+ private Long poId;
+ private Long supplierId;
+ private String txType;
+ private String txNo;
+ private BigDecimal amount;
+ private String currency;
+ private String description;
+ private String operator;
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date txTime;
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date createTime;
+ private String supplierName;
+ private String poNo;
+ // search params
+ private String beginTime;
+ private String endTime;
+
+ public Long getTxId() { return txId; }
+ public void setTxId(Long txId) { this.txId = txId; }
+ public Long getTenantId() { return tenantId; }
+ public void setTenantId(Long tenantId) { this.tenantId = tenantId; }
+ public Long getPoId() { return poId; }
+ public void setPoId(Long poId) { this.poId = poId; }
+ public Long getSupplierId() { return supplierId; }
+ public void setSupplierId(Long supplierId) { this.supplierId = supplierId; }
+ public String getTxType() { return txType; }
+ public void setTxType(String txType) { this.txType = txType; }
+ public String getTxNo() { return txNo; }
+ public void setTxNo(String txNo) { this.txNo = txNo; }
+ public BigDecimal getAmount() { return amount; }
+ public void setAmount(BigDecimal amount) { this.amount = amount; }
+ public String getCurrency() { return currency; }
+ public void setCurrency(String currency) { this.currency = currency; }
+ public String getDescription() { return description; }
+ public void setDescription(String description) { this.description = description; }
+ public String getOperator() { return operator; }
+ public void setOperator(String operator) { this.operator = operator; }
+ public Date getTxTime() { return txTime; }
+ public void setTxTime(Date txTime) { this.txTime = txTime; }
+ public Date getCreateTime() { return createTime; }
+ public void setCreateTime(Date createTime) { this.createTime = createTime; }
+ public String getSupplierName() { return supplierName; }
+ public void setSupplierName(String supplierName) { this.supplierName = supplierName; }
+ public String getPoNo() { return poNo; }
+ public void setPoNo(String poNo) { this.poNo = poNo; }
+ public String getBeginTime() { return beginTime; }
+ public void setBeginTime(String beginTime) { this.beginTime = beginTime; }
+ public String getEndTime() { return endTime; }
+ public void setEndTime(String endTime) { this.endTime = endTime; }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizComparisonMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizComparisonMapper.java
new file mode 100644
index 00000000..a023c877
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizComparisonMapper.java
@@ -0,0 +1,10 @@
+package com.ruoyi.system.mapper.bid;
+
+import com.ruoyi.system.domain.bid.BizComparisonVO;
+import org.apache.ibatis.annotations.Param;
+import java.util.List;
+import java.util.Map;
+
+public interface BizComparisonMapper {
+ List