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> selectComparisonData(@Param("rfqId") Long rfqId, @Param("tenantId") Long tenantId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizMaterialMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizMaterialMapper.java new file mode 100644 index 00000000..4e4906b0 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizMaterialMapper.java @@ -0,0 +1,13 @@ +package com.ruoyi.system.mapper.bid; + +import com.ruoyi.system.domain.bid.BizMaterial; +import java.util.List; + +public interface BizMaterialMapper { + List selectBizMaterialList(BizMaterial query); + BizMaterial selectBizMaterialById(Long id); + int insertBizMaterial(BizMaterial record); + int updateBizMaterial(BizMaterial record); + int deleteBizMaterialById(Long id); + int deleteBizMaterialByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizOrderObjectionMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizOrderObjectionMapper.java new file mode 100644 index 00000000..2a19dbb7 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizOrderObjectionMapper.java @@ -0,0 +1,13 @@ +package com.ruoyi.system.mapper.bid; + +import com.ruoyi.system.domain.bid.BizOrderObjection; +import java.util.List; + +public interface BizOrderObjectionMapper { + List selectBizOrderObjectionList(BizOrderObjection query); + BizOrderObjection selectBizOrderObjectionById(Long id); + int insertBizOrderObjection(BizOrderObjection record); + int updateBizOrderObjection(BizOrderObjection record); + int deleteBizOrderObjectionById(Long id); + int deleteBizOrderObjectionByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizPurchaseOrderItemMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizPurchaseOrderItemMapper.java new file mode 100644 index 00000000..fb383959 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizPurchaseOrderItemMapper.java @@ -0,0 +1,10 @@ +package com.ruoyi.system.mapper.bid; + +import com.ruoyi.system.domain.bid.BizPurchaseOrderItem; +import java.util.List; + +public interface BizPurchaseOrderItemMapper { + List selectItemsByPoId(Long poId); + int insertBizPurchaseOrderItem(BizPurchaseOrderItem item); + int deleteByPoId(Long poId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizPurchaseOrderMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizPurchaseOrderMapper.java new file mode 100644 index 00000000..34972c04 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizPurchaseOrderMapper.java @@ -0,0 +1,13 @@ +package com.ruoyi.system.mapper.bid; + +import com.ruoyi.system.domain.bid.BizPurchaseOrder; +import java.util.List; + +public interface BizPurchaseOrderMapper { + List selectBizPurchaseOrderList(BizPurchaseOrder query); + BizPurchaseOrder selectBizPurchaseOrderById(Long id); + int insertBizPurchaseOrder(BizPurchaseOrder record); + int updateBizPurchaseOrder(BizPurchaseOrder record); + int deleteBizPurchaseOrderById(Long id); + int deleteBizPurchaseOrderByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizQuotationItemMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizQuotationItemMapper.java new file mode 100644 index 00000000..5787d8a9 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizQuotationItemMapper.java @@ -0,0 +1,10 @@ +package com.ruoyi.system.mapper.bid; + +import com.ruoyi.system.domain.bid.BizQuotationItem; +import java.util.List; + +public interface BizQuotationItemMapper { + List selectItemsByQuotationId(Long quotationId); + int insertBizQuotationItem(BizQuotationItem item); + int deleteByQuotationId(Long quotationId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizQuotationMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizQuotationMapper.java new file mode 100644 index 00000000..be8342d0 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizQuotationMapper.java @@ -0,0 +1,13 @@ +package com.ruoyi.system.mapper.bid; + +import com.ruoyi.system.domain.bid.BizQuotation; +import java.util.List; + +public interface BizQuotationMapper { + List selectBizQuotationList(BizQuotation query); + BizQuotation selectBizQuotationById(Long id); + int insertBizQuotation(BizQuotation record); + int updateBizQuotation(BizQuotation record); + int deleteBizQuotationById(Long id); + int deleteBizQuotationByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizRfqItemMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizRfqItemMapper.java new file mode 100644 index 00000000..1d65bd0d --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizRfqItemMapper.java @@ -0,0 +1,10 @@ +package com.ruoyi.system.mapper.bid; + +import com.ruoyi.system.domain.bid.BizRfqItem; +import java.util.List; + +public interface BizRfqItemMapper { + List selectItemsByRfqId(Long rfqId); + int insertBizRfqItem(BizRfqItem item); + int deleteByRfqId(Long rfqId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizRfqMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizRfqMapper.java new file mode 100644 index 00000000..4d648faf --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizRfqMapper.java @@ -0,0 +1,13 @@ +package com.ruoyi.system.mapper.bid; + +import com.ruoyi.system.domain.bid.BizRfq; +import java.util.List; + +public interface BizRfqMapper { + List selectBizRfqList(BizRfq query); + BizRfq selectBizRfqById(Long id); + int insertBizRfq(BizRfq record); + int updateBizRfq(BizRfq record); + int deleteBizRfqById(Long id); + int deleteBizRfqByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizSupplierEvaluationMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizSupplierEvaluationMapper.java new file mode 100644 index 00000000..144eed43 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizSupplierEvaluationMapper.java @@ -0,0 +1,13 @@ +package com.ruoyi.system.mapper.bid; + +import com.ruoyi.system.domain.bid.BizSupplierEvaluation; +import java.util.List; + +public interface BizSupplierEvaluationMapper { + List selectBizSupplierEvaluationList(BizSupplierEvaluation query); + BizSupplierEvaluation selectBizSupplierEvaluationById(Long id); + int insertBizSupplierEvaluation(BizSupplierEvaluation record); + int updateBizSupplierEvaluation(BizSupplierEvaluation record); + int deleteBizSupplierEvaluationById(Long id); + int deleteBizSupplierEvaluationByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizSupplierMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizSupplierMapper.java new file mode 100644 index 00000000..d13d16a7 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizSupplierMapper.java @@ -0,0 +1,13 @@ +package com.ruoyi.system.mapper.bid; + +import com.ruoyi.system.domain.bid.BizSupplier; +import java.util.List; + +public interface BizSupplierMapper { + List selectBizSupplierList(BizSupplier query); + BizSupplier selectBizSupplierById(Long id); + int insertBizSupplier(BizSupplier record); + int updateBizSupplier(BizSupplier record); + int deleteBizSupplierById(Long id); + int deleteBizSupplierByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizTenantMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizTenantMapper.java new file mode 100644 index 00000000..55513b26 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizTenantMapper.java @@ -0,0 +1,13 @@ +package com.ruoyi.system.mapper.bid; + +import com.ruoyi.system.domain.bid.BizTenant; +import java.util.List; + +public interface BizTenantMapper { + List selectBizTenantList(BizTenant query); + BizTenant selectBizTenantById(Long id); + int insertBizTenant(BizTenant record); + int updateBizTenant(BizTenant record); + int deleteBizTenantById(Long id); + int deleteBizTenantByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizTransactionMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizTransactionMapper.java new file mode 100644 index 00000000..5bda7673 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/bid/BizTransactionMapper.java @@ -0,0 +1,13 @@ +package com.ruoyi.system.mapper.bid; + +import com.ruoyi.system.domain.bid.BizTransaction; +import java.util.List; + +public interface BizTransactionMapper { + List selectBizTransactionList(BizTransaction query); + BizTransaction selectBizTransactionById(Long id); + int insertBizTransaction(BizTransaction record); + int updateBizTransaction(BizTransaction record); + int deleteBizTransactionById(Long id); + int deleteBizTransactionByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizComparisonService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizComparisonService.java new file mode 100644 index 00000000..f85881dd --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizComparisonService.java @@ -0,0 +1,8 @@ +package com.ruoyi.system.service.bid; + +import com.ruoyi.system.domain.bid.BizComparisonVO; +import java.util.List; + +public interface IBizComparisonService { + List compareRfq(Long rfqId, Long tenantId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizMaterialService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizMaterialService.java new file mode 100644 index 00000000..f80ba5dc --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizMaterialService.java @@ -0,0 +1,13 @@ +package com.ruoyi.system.service.bid; + +import com.ruoyi.system.domain.bid.BizMaterial; +import java.util.List; + +public interface IBizMaterialService { + List selectBizMaterialList(BizMaterial query); + BizMaterial selectBizMaterialById(Long id); + int insertBizMaterial(BizMaterial record); + int updateBizMaterial(BizMaterial record); + int deleteBizMaterialById(Long id); + int deleteBizMaterialByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizOrderObjectionService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizOrderObjectionService.java new file mode 100644 index 00000000..d8de2ca1 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizOrderObjectionService.java @@ -0,0 +1,13 @@ +package com.ruoyi.system.service.bid; + +import com.ruoyi.system.domain.bid.BizOrderObjection; +import java.util.List; + +public interface IBizOrderObjectionService { + List selectBizOrderObjectionList(BizOrderObjection query); + BizOrderObjection selectBizOrderObjectionById(Long id); + int insertBizOrderObjection(BizOrderObjection record); + int updateBizOrderObjection(BizOrderObjection record); + int deleteBizOrderObjectionById(Long id); + int deleteBizOrderObjectionByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizPurchaseOrderService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizPurchaseOrderService.java new file mode 100644 index 00000000..bb2e71bb --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizPurchaseOrderService.java @@ -0,0 +1,14 @@ +package com.ruoyi.system.service.bid; + +import com.ruoyi.system.domain.bid.BizPurchaseOrder; +import java.util.List; + +public interface IBizPurchaseOrderService { + List selectBizPurchaseOrderList(BizPurchaseOrder query); + BizPurchaseOrder selectBizPurchaseOrderById(Long id); + int insertBizPurchaseOrder(BizPurchaseOrder po); + int updateBizPurchaseOrder(BizPurchaseOrder po); + int confirmOrder(Long poId); + int deleteBizPurchaseOrderById(Long id); + int deleteBizPurchaseOrderByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizQuotationService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizQuotationService.java new file mode 100644 index 00000000..31012e39 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizQuotationService.java @@ -0,0 +1,18 @@ +package com.ruoyi.system.service.bid; + +import com.ruoyi.system.domain.bid.BizQuotation; +import com.ruoyi.system.domain.bid.BizQuotationItem; +import java.util.List; + +public interface IBizQuotationService { + List selectBizQuotationList(BizQuotation query); + BizQuotation selectBizQuotationById(Long id); + int insertBizQuotation(BizQuotation q); + int updateBizQuotation(BizQuotation q); + int submitQuotation(Long quotationId); + int acceptQuotation(Long quotationId); + int rejectQuotation(Long quotationId); + int deleteBizQuotationById(Long id); + int deleteBizQuotationByIds(Long[] ids); + List selectItemsByQuotationId(Long quotationId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizRfqService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizRfqService.java new file mode 100644 index 00000000..59c7a134 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizRfqService.java @@ -0,0 +1,16 @@ +package com.ruoyi.system.service.bid; + +import com.ruoyi.system.domain.bid.BizRfq; +import com.ruoyi.system.domain.bid.BizRfqItem; +import java.util.List; + +public interface IBizRfqService { + List selectBizRfqList(BizRfq query); + BizRfq selectBizRfqById(Long id); + int insertBizRfq(BizRfq rfq); + int updateBizRfq(BizRfq rfq); + int deleteBizRfqById(Long id); + int deleteBizRfqByIds(Long[] ids); + int publishRfq(Long rfqId, Long[] supplierIds); + List selectItemsByRfqId(Long rfqId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizSupplierEvaluationService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizSupplierEvaluationService.java new file mode 100644 index 00000000..11c1c03e --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizSupplierEvaluationService.java @@ -0,0 +1,13 @@ +package com.ruoyi.system.service.bid; + +import com.ruoyi.system.domain.bid.BizSupplierEvaluation; +import java.util.List; + +public interface IBizSupplierEvaluationService { + List selectBizSupplierEvaluationList(BizSupplierEvaluation query); + BizSupplierEvaluation selectBizSupplierEvaluationById(Long id); + int insertBizSupplierEvaluation(BizSupplierEvaluation record); + int updateBizSupplierEvaluation(BizSupplierEvaluation record); + int deleteBizSupplierEvaluationById(Long id); + int deleteBizSupplierEvaluationByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizSupplierService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizSupplierService.java new file mode 100644 index 00000000..efc73bc5 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizSupplierService.java @@ -0,0 +1,13 @@ +package com.ruoyi.system.service.bid; + +import com.ruoyi.system.domain.bid.BizSupplier; +import java.util.List; + +public interface IBizSupplierService { + List selectBizSupplierList(BizSupplier query); + BizSupplier selectBizSupplierById(Long id); + int insertBizSupplier(BizSupplier record); + int updateBizSupplier(BizSupplier record); + int deleteBizSupplierById(Long id); + int deleteBizSupplierByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizTenantService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizTenantService.java new file mode 100644 index 00000000..388135e8 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizTenantService.java @@ -0,0 +1,13 @@ +package com.ruoyi.system.service.bid; + +import com.ruoyi.system.domain.bid.BizTenant; +import java.util.List; + +public interface IBizTenantService { + List selectBizTenantList(BizTenant query); + BizTenant selectBizTenantById(Long id); + int insertBizTenant(BizTenant record); + int updateBizTenant(BizTenant record); + int deleteBizTenantById(Long id); + int deleteBizTenantByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizTransactionService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizTransactionService.java new file mode 100644 index 00000000..a5d83641 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/IBizTransactionService.java @@ -0,0 +1,13 @@ +package com.ruoyi.system.service.bid; + +import com.ruoyi.system.domain.bid.BizTransaction; +import java.util.List; + +public interface IBizTransactionService { + List selectBizTransactionList(BizTransaction query); + BizTransaction selectBizTransactionById(Long id); + int insertBizTransaction(BizTransaction record); + int updateBizTransaction(BizTransaction record); + int deleteBizTransactionById(Long id); + int deleteBizTransactionByIds(Long[] ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizComparisonServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizComparisonServiceImpl.java new file mode 100644 index 00000000..1791e589 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizComparisonServiceImpl.java @@ -0,0 +1,64 @@ +package com.ruoyi.system.service.bid.impl; + +import com.ruoyi.system.domain.bid.BizComparisonVO; +import com.ruoyi.system.mapper.bid.BizComparisonMapper; +import com.ruoyi.system.service.bid.IBizComparisonService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.util.*; + +@Service +public class BizComparisonServiceImpl implements IBizComparisonService { + @Autowired private BizComparisonMapper mapper; + + @Override + public List compareRfq(Long rfqId, Long tenantId) { + List> rows = mapper.selectComparisonData(rfqId, tenantId); + Map itemMap = new LinkedHashMap<>(); + + for (Map row : rows) { + Long rfqItemId = toLong(row.get("rfqItemId")); + BizComparisonVO vo = itemMap.computeIfAbsent(rfqItemId, k -> { + BizComparisonVO v = new BizComparisonVO(); + v.setRfqItemId(rfqItemId); + v.setMaterialName(str(row.get("materialName"))); + v.setSpec(str(row.get("spec"))); + v.setUnit(str(row.get("unit"))); + v.setQuantity(toBD(row.get("quantity"))); + v.setPrices(new ArrayList<>()); + return v; + }); + + if (row.get("quotationId") != null) { + BizComparisonVO.SupplierPrice sp = new BizComparisonVO.SupplierPrice(); + sp.setSupplierId(toLong(row.get("supplierId"))); + sp.setSupplierName(str(row.get("supplierName"))); + sp.setQuotationId(toLong(row.get("quotationId"))); + sp.setQuoteNo(str(row.get("quoteNo"))); + sp.setUnitPrice(toBD(row.get("unitPrice"))); + sp.setTotalPrice(toBD(row.get("totalPrice"))); + sp.setDeliveryDays(row.get("deliveryDays") == null ? 0 : ((Number) row.get("deliveryDays")).intValue()); + vo.getPrices().add(sp); + } + } + + // mark lowest price per item + for (BizComparisonVO vo : itemMap.values()) { + BigDecimal min = vo.getPrices().stream() + .filter(p -> p.getUnitPrice() != null) + .map(BizComparisonVO.SupplierPrice::getUnitPrice) + .min(BigDecimal::compareTo).orElse(null); + if (min != null) { + for (BizComparisonVO.SupplierPrice p : vo.getPrices()) { + p.setLowestPrice(min.compareTo(p.getUnitPrice()) == 0); + } + } + } + return new ArrayList<>(itemMap.values()); + } + + private Long toLong(Object v) { return v == null ? null : ((Number)v).longValue(); } + private BigDecimal toBD(Object v) { return v == null ? null : new BigDecimal(v.toString()); } + private String str(Object v) { return v == null ? "" : v.toString(); } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizMaterialServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizMaterialServiceImpl.java new file mode 100644 index 00000000..6a88457c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizMaterialServiceImpl.java @@ -0,0 +1,44 @@ +package com.ruoyi.system.service.bid.impl; + +import com.ruoyi.system.domain.bid.BizMaterial; +import com.ruoyi.system.mapper.bid.BizMaterialMapper; +import com.ruoyi.system.service.bid.IBizMaterialService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.util.List; + +@Service +public class BizMaterialServiceImpl implements IBizMaterialService { + @Autowired + private BizMaterialMapper mapper; + + @Override + public List selectBizMaterialList(BizMaterial query) { + return mapper.selectBizMaterialList(query); + } + + @Override + public BizMaterial selectBizMaterialById(Long id) { + return mapper.selectBizMaterialById(id); + } + + @Override + public int insertBizMaterial(BizMaterial record) { + return mapper.insertBizMaterial(record); + } + + @Override + public int updateBizMaterial(BizMaterial record) { + return mapper.updateBizMaterial(record); + } + + @Override + public int deleteBizMaterialById(Long id) { + return mapper.deleteBizMaterialById(id); + } + + @Override + public int deleteBizMaterialByIds(Long[] ids) { + return mapper.deleteBizMaterialByIds(ids); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizOrderObjectionServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizOrderObjectionServiceImpl.java new file mode 100644 index 00000000..14d6a589 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizOrderObjectionServiceImpl.java @@ -0,0 +1,44 @@ +package com.ruoyi.system.service.bid.impl; + +import com.ruoyi.system.domain.bid.BizOrderObjection; +import com.ruoyi.system.mapper.bid.BizOrderObjectionMapper; +import com.ruoyi.system.service.bid.IBizOrderObjectionService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.util.List; + +@Service +public class BizOrderObjectionServiceImpl implements IBizOrderObjectionService { + @Autowired + private BizOrderObjectionMapper mapper; + + @Override + public List selectBizOrderObjectionList(BizOrderObjection query) { + return mapper.selectBizOrderObjectionList(query); + } + + @Override + public BizOrderObjection selectBizOrderObjectionById(Long id) { + return mapper.selectBizOrderObjectionById(id); + } + + @Override + public int insertBizOrderObjection(BizOrderObjection record) { + return mapper.insertBizOrderObjection(record); + } + + @Override + public int updateBizOrderObjection(BizOrderObjection record) { + return mapper.updateBizOrderObjection(record); + } + + @Override + public int deleteBizOrderObjectionById(Long id) { + return mapper.deleteBizOrderObjectionById(id); + } + + @Override + public int deleteBizOrderObjectionByIds(Long[] ids) { + return mapper.deleteBizOrderObjectionByIds(ids); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizPurchaseOrderServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizPurchaseOrderServiceImpl.java new file mode 100644 index 00000000..4f949fab --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizPurchaseOrderServiceImpl.java @@ -0,0 +1,101 @@ +package com.ruoyi.system.service.bid.impl; + +import com.ruoyi.system.domain.bid.BizPurchaseOrder; +import com.ruoyi.system.domain.bid.BizPurchaseOrderItem; +import com.ruoyi.system.domain.bid.BizTransaction; +import com.ruoyi.system.mapper.bid.BizPurchaseOrderItemMapper; +import com.ruoyi.system.mapper.bid.BizPurchaseOrderMapper; +import com.ruoyi.system.mapper.bid.BizTransactionMapper; +import com.ruoyi.system.service.bid.IBizPurchaseOrderService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +@Service +public class BizPurchaseOrderServiceImpl implements IBizPurchaseOrderService { + @Autowired private BizPurchaseOrderMapper poMapper; + @Autowired private BizPurchaseOrderItemMapper itemMapper; + @Autowired private BizTransactionMapper txMapper; + + @Override + public List selectBizPurchaseOrderList(BizPurchaseOrder q) { return poMapper.selectBizPurchaseOrderList(q); } + + @Override + public BizPurchaseOrder selectBizPurchaseOrderById(Long id) { + BizPurchaseOrder po = poMapper.selectBizPurchaseOrderById(id); + if (po != null) po.setItems(itemMapper.selectItemsByPoId(id)); + return po; + } + + @Override + @Transactional + public int insertBizPurchaseOrder(BizPurchaseOrder po) { + if (po.getPoNo() == null || po.getPoNo().isEmpty()) { + po.setPoNo("PO" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())); + } + int rows = poMapper.insertBizPurchaseOrder(po); + if (po.getItems() != null) { + BigDecimal total = BigDecimal.ZERO; + for (BizPurchaseOrderItem item : po.getItems()) { + item.setPoId(po.getPoId()); + if (item.getUnitPrice() != null && item.getQuantity() != null) { + item.setTotalPrice(item.getUnitPrice().multiply(item.getQuantity())); + total = total.add(item.getTotalPrice()); + } + itemMapper.insertBizPurchaseOrderItem(item); + } + po.setTotalAmount(total); + poMapper.updateBizPurchaseOrder(po); + } + // record transaction + BizTransaction tx = new BizTransaction(); + tx.setTenantId(po.getTenantId()); + tx.setPoId(po.getPoId()); + tx.setSupplierId(po.getSupplierId()); + tx.setTxType("PO"); + tx.setTxNo(po.getPoNo()); + tx.setAmount(po.getTotalAmount()); + tx.setCurrency(po.getCurrency()); + tx.setDescription("创建采购单 " + po.getPoNo()); + tx.setOperator(po.getCreateBy()); + txMapper.insertBizTransaction(tx); + return rows; + } + + @Override + @Transactional + public int updateBizPurchaseOrder(BizPurchaseOrder po) { + itemMapper.deleteByPoId(po.getPoId()); + if (po.getItems() != null) { + BigDecimal total = BigDecimal.ZERO; + for (BizPurchaseOrderItem item : po.getItems()) { + item.setPoId(po.getPoId()); + if (item.getUnitPrice() != null && item.getQuantity() != null) { + item.setTotalPrice(item.getUnitPrice().multiply(item.getQuantity())); + total = total.add(item.getTotalPrice()); + } + itemMapper.insertBizPurchaseOrderItem(item); + } + po.setTotalAmount(total); + } + return poMapper.updateBizPurchaseOrder(po); + } + + @Override + public int confirmOrder(Long poId) { + BizPurchaseOrder po = new BizPurchaseOrder(); + po.setPoId(poId); + po.setStatus("confirmed"); + return poMapper.updateBizPurchaseOrder(po); + } + + @Override + public int deleteBizPurchaseOrderById(Long id) { return poMapper.deleteBizPurchaseOrderById(id); } + + @Override + public int deleteBizPurchaseOrderByIds(Long[] ids) { return poMapper.deleteBizPurchaseOrderByIds(ids); } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizQuotationServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizQuotationServiceImpl.java new file mode 100644 index 00000000..e4d3c2a4 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizQuotationServiceImpl.java @@ -0,0 +1,98 @@ +package com.ruoyi.system.service.bid.impl; + +import com.ruoyi.system.domain.bid.BizQuotation; +import com.ruoyi.system.domain.bid.BizQuotationItem; +import com.ruoyi.system.mapper.bid.BizQuotationItemMapper; +import com.ruoyi.system.mapper.bid.BizQuotationMapper; +import com.ruoyi.system.service.bid.IBizQuotationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +@Service +public class BizQuotationServiceImpl implements IBizQuotationService { + @Autowired private BizQuotationMapper mapper; + @Autowired private BizQuotationItemMapper itemMapper; + + @Override + public List selectBizQuotationList(BizQuotation query) { return mapper.selectBizQuotationList(query); } + + @Override + public BizQuotation selectBizQuotationById(Long id) { + BizQuotation q = mapper.selectBizQuotationById(id); + if (q != null) q.setItems(itemMapper.selectItemsByQuotationId(id)); + return q; + } + + @Override + @Transactional + public int insertBizQuotation(BizQuotation q) { + int rows = mapper.insertBizQuotation(q); + saveItems(q); + return rows; + } + + @Override + @Transactional + public int updateBizQuotation(BizQuotation q) { + itemMapper.deleteByQuotationId(q.getQuotationId()); + saveItems(q); + return mapper.updateBizQuotation(q); + } + + private void saveItems(BizQuotation q) { + if (q.getItems() == null) return; + BigDecimal total = BigDecimal.ZERO; + for (BizQuotationItem item : q.getItems()) { + item.setQuotationId(q.getQuotationId()); + if (item.getUnitPrice() != null && item.getQuantity() != null) { + item.setTotalPrice(item.getUnitPrice().multiply(item.getQuantity())); + total = total.add(item.getTotalPrice()); + } + itemMapper.insertBizQuotationItem(item); + } + BizQuotation upd = new BizQuotation(); + upd.setQuotationId(q.getQuotationId()); + upd.setTotalAmount(total); + mapper.updateBizQuotation(upd); + } + + @Override + public int submitQuotation(Long id) { + BizQuotation q = new BizQuotation(); + q.setQuotationId(id); + q.setStatus("submitted"); + q.setSubmitTime(new Date()); + return mapper.updateBizQuotation(q); + } + + @Override + public int acceptQuotation(Long id) { + BizQuotation q = new BizQuotation(); + q.setQuotationId(id); + q.setStatus("accepted"); + return mapper.updateBizQuotation(q); + } + + @Override + public int rejectQuotation(Long id) { + BizQuotation q = new BizQuotation(); + q.setQuotationId(id); + q.setStatus("rejected"); + return mapper.updateBizQuotation(q); + } + + @Override + public int deleteBizQuotationById(Long id) { return mapper.deleteBizQuotationById(id); } + + @Override + public int deleteBizQuotationByIds(Long[] ids) { return mapper.deleteBizQuotationByIds(ids); } + + @Override + public List selectItemsByQuotationId(Long quotationId) { + return itemMapper.selectItemsByQuotationId(quotationId); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizRfqServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizRfqServiceImpl.java new file mode 100644 index 00000000..cf5b4d9b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizRfqServiceImpl.java @@ -0,0 +1,74 @@ +package com.ruoyi.system.service.bid.impl; + +import com.ruoyi.system.domain.bid.BizRfq; +import com.ruoyi.system.domain.bid.BizRfqItem; +import com.ruoyi.system.mapper.bid.BizRfqItemMapper; +import com.ruoyi.system.mapper.bid.BizRfqMapper; +import com.ruoyi.system.service.bid.IBizRfqService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.Date; +import java.util.List; + +@Service +public class BizRfqServiceImpl implements IBizRfqService { + @Autowired private BizRfqMapper rfqMapper; + @Autowired private BizRfqItemMapper itemMapper; + + @Override + public List selectBizRfqList(BizRfq query) { return rfqMapper.selectBizRfqList(query); } + + @Override + public BizRfq selectBizRfqById(Long id) { + BizRfq rfq = rfqMapper.selectBizRfqById(id); + if (rfq != null) rfq.setItems(itemMapper.selectItemsByRfqId(id)); + return rfq; + } + + @Override + @Transactional + public int insertBizRfq(BizRfq rfq) { + rfq.setStatus("draft"); + int rows = rfqMapper.insertBizRfq(rfq); + if (rfq.getItems() != null) { + for (BizRfqItem item : rfq.getItems()) { + item.setRfqId(rfq.getRfqId()); + itemMapper.insertBizRfqItem(item); + } + } + return rows; + } + + @Override + @Transactional + public int updateBizRfq(BizRfq rfq) { + itemMapper.deleteByRfqId(rfq.getRfqId()); + if (rfq.getItems() != null) { + for (BizRfqItem item : rfq.getItems()) { + item.setRfqId(rfq.getRfqId()); + itemMapper.insertBizRfqItem(item); + } + } + return rfqMapper.updateBizRfq(rfq); + } + + @Override + public int deleteBizRfqById(Long id) { return rfqMapper.deleteBizRfqById(id); } + + @Override + public int deleteBizRfqByIds(Long[] ids) { return rfqMapper.deleteBizRfqByIds(ids); } + + @Override + public int publishRfq(Long rfqId, Long[] supplierIds) { + BizRfq rfq = new BizRfq(); + rfq.setRfqId(rfqId); + rfq.setStatus("published"); + return rfqMapper.updateBizRfq(rfq); + } + + @Override + public List selectItemsByRfqId(Long rfqId) { + return itemMapper.selectItemsByRfqId(rfqId); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizSupplierEvaluationServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizSupplierEvaluationServiceImpl.java new file mode 100644 index 00000000..780ccd26 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizSupplierEvaluationServiceImpl.java @@ -0,0 +1,44 @@ +package com.ruoyi.system.service.bid.impl; + +import com.ruoyi.system.domain.bid.BizSupplierEvaluation; +import com.ruoyi.system.mapper.bid.BizSupplierEvaluationMapper; +import com.ruoyi.system.service.bid.IBizSupplierEvaluationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.util.List; + +@Service +public class BizSupplierEvaluationServiceImpl implements IBizSupplierEvaluationService { + @Autowired + private BizSupplierEvaluationMapper mapper; + + @Override + public List selectBizSupplierEvaluationList(BizSupplierEvaluation query) { + return mapper.selectBizSupplierEvaluationList(query); + } + + @Override + public BizSupplierEvaluation selectBizSupplierEvaluationById(Long id) { + return mapper.selectBizSupplierEvaluationById(id); + } + + @Override + public int insertBizSupplierEvaluation(BizSupplierEvaluation record) { + return mapper.insertBizSupplierEvaluation(record); + } + + @Override + public int updateBizSupplierEvaluation(BizSupplierEvaluation record) { + return mapper.updateBizSupplierEvaluation(record); + } + + @Override + public int deleteBizSupplierEvaluationById(Long id) { + return mapper.deleteBizSupplierEvaluationById(id); + } + + @Override + public int deleteBizSupplierEvaluationByIds(Long[] ids) { + return mapper.deleteBizSupplierEvaluationByIds(ids); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizSupplierServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizSupplierServiceImpl.java new file mode 100644 index 00000000..17107aed --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizSupplierServiceImpl.java @@ -0,0 +1,44 @@ +package com.ruoyi.system.service.bid.impl; + +import com.ruoyi.system.domain.bid.BizSupplier; +import com.ruoyi.system.mapper.bid.BizSupplierMapper; +import com.ruoyi.system.service.bid.IBizSupplierService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.util.List; + +@Service +public class BizSupplierServiceImpl implements IBizSupplierService { + @Autowired + private BizSupplierMapper mapper; + + @Override + public List selectBizSupplierList(BizSupplier query) { + return mapper.selectBizSupplierList(query); + } + + @Override + public BizSupplier selectBizSupplierById(Long id) { + return mapper.selectBizSupplierById(id); + } + + @Override + public int insertBizSupplier(BizSupplier record) { + return mapper.insertBizSupplier(record); + } + + @Override + public int updateBizSupplier(BizSupplier record) { + return mapper.updateBizSupplier(record); + } + + @Override + public int deleteBizSupplierById(Long id) { + return mapper.deleteBizSupplierById(id); + } + + @Override + public int deleteBizSupplierByIds(Long[] ids) { + return mapper.deleteBizSupplierByIds(ids); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizTenantServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizTenantServiceImpl.java new file mode 100644 index 00000000..a4bdac2f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizTenantServiceImpl.java @@ -0,0 +1,44 @@ +package com.ruoyi.system.service.bid.impl; + +import com.ruoyi.system.domain.bid.BizTenant; +import com.ruoyi.system.mapper.bid.BizTenantMapper; +import com.ruoyi.system.service.bid.IBizTenantService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.util.List; + +@Service +public class BizTenantServiceImpl implements IBizTenantService { + @Autowired + private BizTenantMapper mapper; + + @Override + public List selectBizTenantList(BizTenant query) { + return mapper.selectBizTenantList(query); + } + + @Override + public BizTenant selectBizTenantById(Long id) { + return mapper.selectBizTenantById(id); + } + + @Override + public int insertBizTenant(BizTenant record) { + return mapper.insertBizTenant(record); + } + + @Override + public int updateBizTenant(BizTenant record) { + return mapper.updateBizTenant(record); + } + + @Override + public int deleteBizTenantById(Long id) { + return mapper.deleteBizTenantById(id); + } + + @Override + public int deleteBizTenantByIds(Long[] ids) { + return mapper.deleteBizTenantByIds(ids); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizTransactionServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizTransactionServiceImpl.java new file mode 100644 index 00000000..a9ac4a57 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/bid/impl/BizTransactionServiceImpl.java @@ -0,0 +1,44 @@ +package com.ruoyi.system.service.bid.impl; + +import com.ruoyi.system.domain.bid.BizTransaction; +import com.ruoyi.system.mapper.bid.BizTransactionMapper; +import com.ruoyi.system.service.bid.IBizTransactionService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.util.List; + +@Service +public class BizTransactionServiceImpl implements IBizTransactionService { + @Autowired + private BizTransactionMapper mapper; + + @Override + public List selectBizTransactionList(BizTransaction query) { + return mapper.selectBizTransactionList(query); + } + + @Override + public BizTransaction selectBizTransactionById(Long id) { + return mapper.selectBizTransactionById(id); + } + + @Override + public int insertBizTransaction(BizTransaction record) { + return mapper.insertBizTransaction(record); + } + + @Override + public int updateBizTransaction(BizTransaction record) { + return mapper.updateBizTransaction(record); + } + + @Override + public int deleteBizTransactionById(Long id) { + return mapper.deleteBizTransactionById(id); + } + + @Override + public int deleteBizTransactionByIds(Long[] ids) { + return mapper.deleteBizTransactionByIds(ids); + } +} diff --git a/ruoyi-system/src/main/resources/mapper/bid/BizComparisonMapper.xml b/ruoyi-system/src/main/resources/mapper/bid/BizComparisonMapper.xml new file mode 100644 index 00000000..c778ff36 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bid/BizComparisonMapper.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/ruoyi-system/src/main/resources/mapper/bid/BizMaterialMapper.xml b/ruoyi-system/src/main/resources/mapper/bid/BizMaterialMapper.xml new file mode 100644 index 00000000..6ca54002 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bid/BizMaterialMapper.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO biz_material(tenant_id,category_id,material_code,material_name,spec,unit,brand,description,status,create_by,create_time) + VALUES(#{tenantId},#{categoryId},#{materialCode},#{materialName},#{spec},#{unit},#{brand},#{description},#{status},#{createBy},NOW()) + + + + UPDATE biz_material + + material_name=#{materialName}, + material_code=#{materialCode}, + spec=#{spec}, + unit=#{unit}, + brand=#{brand}, + description=#{description}, + category_id=#{categoryId}, + status=#{status}, + update_by=#{updateBy}, update_time=NOW() + + WHERE material_id=#{materialId} + + + DELETE FROM biz_material WHERE material_id=#{id} + + DELETE FROM biz_material WHERE material_id IN + #{id} + + diff --git a/ruoyi-system/src/main/resources/mapper/bid/BizOrderObjectionMapper.xml b/ruoyi-system/src/main/resources/mapper/bid/BizOrderObjectionMapper.xml new file mode 100644 index 00000000..44103e05 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bid/BizOrderObjectionMapper.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO biz_order_objection(tenant_id,po_id,supplier_id,reason,attachment,status,create_by,create_time) + VALUES(#{tenantId},#{poId},#{supplierId},#{reason},#{attachment},'pending',#{createBy},NOW()) + + + + UPDATE biz_order_objection + + status=#{status}, + resolution=#{resolution}, + resolve_time=#{resolveTime}, + + WHERE objection_id=#{objectionId} + + + DELETE FROM biz_order_objection WHERE objection_id=#{id} + + DELETE FROM biz_order_objection WHERE objection_id IN + #{id} + + diff --git a/ruoyi-system/src/main/resources/mapper/bid/BizPurchaseOrderItemMapper.xml b/ruoyi-system/src/main/resources/mapper/bid/BizPurchaseOrderItemMapper.xml new file mode 100644 index 00000000..8966d0f5 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bid/BizPurchaseOrderItemMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + INSERT INTO biz_purchase_order_item(po_id,material_id,material_name,spec,unit,quantity,unit_price,total_price,remark) + VALUES(#{poId},#{materialId},#{materialName},#{spec},#{unit},#{quantity},#{unitPrice},#{totalPrice},#{remark}) + + + DELETE FROM biz_purchase_order_item WHERE po_id=#{poId} + diff --git a/ruoyi-system/src/main/resources/mapper/bid/BizPurchaseOrderMapper.xml b/ruoyi-system/src/main/resources/mapper/bid/BizPurchaseOrderMapper.xml new file mode 100644 index 00000000..05b32917 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bid/BizPurchaseOrderMapper.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO biz_purchase_order(tenant_id,po_no,rfq_id,supplier_id,total_amount,currency,delivery_addr,delivery_date,status,remark,create_by,create_time) + VALUES(#{tenantId},#{poNo},#{rfqId},#{supplierId},#{totalAmount},#{currency},#{deliveryAddr},#{deliveryDate},#{status},#{remark},#{createBy},NOW()) + + + + UPDATE biz_purchase_order + + total_amount=#{totalAmount}, + delivery_addr=#{deliveryAddr}, + delivery_date=#{deliveryDate}, + status=#{status}, + remark=#{remark}, + update_by=#{updateBy}, update_time=NOW() + + WHERE po_id=#{poId} + + + DELETE FROM biz_purchase_order WHERE po_id=#{id} + + DELETE FROM biz_purchase_order WHERE po_id IN + #{id} + + diff --git a/ruoyi-system/src/main/resources/mapper/bid/BizQuotationItemMapper.xml b/ruoyi-system/src/main/resources/mapper/bid/BizQuotationItemMapper.xml new file mode 100644 index 00000000..4d76e511 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bid/BizQuotationItemMapper.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + INSERT INTO biz_quotation_item(quotation_id,rfq_item_id,material_name,spec,unit,quantity,unit_price,total_price,delivery_days,remark) + VALUES(#{quotationId},#{rfqItemId},#{materialName},#{spec},#{unit},#{quantity},#{unitPrice},#{totalPrice},#{deliveryDays},#{remark}) + + + DELETE FROM biz_quotation_item WHERE quotation_id=#{quotationId} + diff --git a/ruoyi-system/src/main/resources/mapper/bid/BizQuotationMapper.xml b/ruoyi-system/src/main/resources/mapper/bid/BizQuotationMapper.xml new file mode 100644 index 00000000..09744e34 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bid/BizQuotationMapper.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO biz_quotation(tenant_id,rfq_id,supplier_id,quote_no,valid_days,delivery_days,total_amount,currency,status,note,create_by,create_time) + VALUES(#{tenantId},#{rfqId},#{supplierId},#{quoteNo},#{validDays},#{deliveryDays},#{totalAmount},#{currency},#{status},#{note},#{createBy},NOW()) + + + + UPDATE biz_quotation + + valid_days=#{validDays}, + delivery_days=#{deliveryDays}, + total_amount=#{totalAmount}, + status=#{status}, + note=#{note}, + submit_time=#{submitTime}, + update_time=NOW() + + WHERE quotation_id=#{quotationId} + + + DELETE FROM biz_quotation WHERE quotation_id=#{id} + + DELETE FROM biz_quotation WHERE quotation_id IN + #{id} + + diff --git a/ruoyi-system/src/main/resources/mapper/bid/BizRfqItemMapper.xml b/ruoyi-system/src/main/resources/mapper/bid/BizRfqItemMapper.xml new file mode 100644 index 00000000..d56ad8d4 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bid/BizRfqItemMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + INSERT INTO biz_rfq_item(rfq_id,material_id,material_name,spec,unit,quantity,expected_price,remark) + VALUES(#{rfqId},#{materialId},#{materialName},#{spec},#{unit},#{quantity},#{expectedPrice},#{remark}) + + + DELETE FROM biz_rfq_item WHERE rfq_id=#{rfqId} + diff --git a/ruoyi-system/src/main/resources/mapper/bid/BizRfqMapper.xml b/ruoyi-system/src/main/resources/mapper/bid/BizRfqMapper.xml new file mode 100644 index 00000000..c55f8ee8 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bid/BizRfqMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO biz_rfq(tenant_id,rfq_no,rfq_title,deadline,delivery_addr,status,remark,create_by,create_time) + VALUES(#{tenantId},#{rfqNo},#{rfqTitle},#{deadline},#{deliveryAddr},#{status},#{remark},#{createBy},NOW()) + + + + UPDATE biz_rfq + + rfq_title=#{rfqTitle}, + deadline=#{deadline}, + delivery_addr=#{deliveryAddr}, + status=#{status}, + remark=#{remark}, + update_by=#{updateBy}, update_time=NOW() + + WHERE rfq_id=#{rfqId} + + + DELETE FROM biz_rfq WHERE rfq_id=#{id} + + DELETE FROM biz_rfq WHERE rfq_id IN + #{id} + + diff --git a/ruoyi-system/src/main/resources/mapper/bid/BizSupplierEvaluationMapper.xml b/ruoyi-system/src/main/resources/mapper/bid/BizSupplierEvaluationMapper.xml new file mode 100644 index 00000000..b4843640 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bid/BizSupplierEvaluationMapper.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO biz_supplier_evaluation(tenant_id,po_id,supplier_id,quality_score,delivery_score,service_score,price_score,total_score,comment,evaluator,eval_time) + VALUES(#{tenantId},#{poId},#{supplierId},#{qualityScore},#{deliveryScore},#{serviceScore},#{priceScore},#{totalScore},#{comment},#{evaluator},NOW()) + + + + UPDATE biz_supplier_evaluation + + quality_score=#{qualityScore}, + delivery_score=#{deliveryScore}, + service_score=#{serviceScore}, + price_score=#{priceScore}, + total_score=#{totalScore}, + comment=#{comment}, + + WHERE eval_id=#{evalId} + + + DELETE FROM biz_supplier_evaluation WHERE eval_id=#{id} + + DELETE FROM biz_supplier_evaluation WHERE eval_id IN + #{id} + + diff --git a/ruoyi-system/src/main/resources/mapper/bid/BizSupplierMapper.xml b/ruoyi-system/src/main/resources/mapper/bid/BizSupplierMapper.xml new file mode 100644 index 00000000..3f61c6b0 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bid/BizSupplierMapper.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO biz_supplier(tenant_id,supplier_name,contact,phone,email,address,user_id,status,create_by,create_time) + VALUES(#{tenantId},#{supplierName},#{contact},#{phone},#{email},#{address},#{userId},#{status},#{createBy},NOW()) + + + + UPDATE biz_supplier + + supplier_name=#{supplierName}, + contact=#{contact}, + phone=#{phone}, + email=#{email}, + address=#{address}, + status=#{status}, + update_by=#{updateBy}, update_time=NOW() + + WHERE supplier_id=#{supplierId} + + + DELETE FROM biz_supplier WHERE supplier_id=#{id} + + DELETE FROM biz_supplier WHERE supplier_id IN + #{id} + + diff --git a/ruoyi-system/src/main/resources/mapper/bid/BizTenantMapper.xml b/ruoyi-system/src/main/resources/mapper/bid/BizTenantMapper.xml new file mode 100644 index 00000000..0c67c4fc --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bid/BizTenantMapper.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + tenant_id,tenant_name,contact,phone,email,status,create_by,create_time,update_by,update_time,remark + + + + + + + INSERT INTO biz_tenant(tenant_name,contact,phone,email,status,create_by,create_time,remark) + VALUES(#{tenantName},#{contact},#{phone},#{email},#{status},#{createBy},NOW(),#{remark}) + + + + UPDATE biz_tenant + + tenant_name=#{tenantName}, + contact=#{contact}, + phone=#{phone}, + email=#{email}, + status=#{status}, + remark=#{remark}, + update_by=#{updateBy}, update_time=NOW() + + WHERE tenant_id=#{tenantId} + + + DELETE FROM biz_tenant WHERE tenant_id=#{id} + + DELETE FROM biz_tenant WHERE tenant_id IN + #{id} + + diff --git a/ruoyi-system/src/main/resources/mapper/bid/BizTransactionMapper.xml b/ruoyi-system/src/main/resources/mapper/bid/BizTransactionMapper.xml new file mode 100644 index 00000000..8ee4ac0b --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/bid/BizTransactionMapper.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO biz_transaction(tenant_id,po_id,supplier_id,tx_type,tx_no,amount,currency,description,operator,tx_time,create_time) + VALUES(#{tenantId},#{poId},#{supplierId},#{txType},#{txNo},#{amount},#{currency},#{description},#{operator},NOW(),NOW()) + + + UPDATE biz_transaction SET description=#{description} WHERE tx_id=#{txId} + DELETE FROM biz_transaction WHERE tx_id=#{id} + + DELETE FROM biz_transaction WHERE tx_id IN + #{id} + + diff --git a/ruoyi-ui/.env.development b/ruoyi-ui/.env.development index 18b2a3ed..2d86da9e 100644 --- a/ruoyi-ui/.env.development +++ b/ruoyi-ui/.env.development @@ -1,5 +1,5 @@ # 页面标题 -VUE_APP_TITLE = 若依管理系统 +VUE_APP_TITLE = 福安德智慧报价平台 # 开发环境配置 ENV = 'development' diff --git a/ruoyi-ui/.env.production b/ruoyi-ui/.env.production index cb064ec8..30649a6c 100644 --- a/ruoyi-ui/.env.production +++ b/ruoyi-ui/.env.production @@ -1,5 +1,5 @@ # 页面标题 -VUE_APP_TITLE = 若依管理系统 +VUE_APP_TITLE = 福安德智慧报价平台 # 生产环境配置 ENV = 'production' diff --git a/ruoyi-ui/.env.staging b/ruoyi-ui/.env.staging index 730af342..0c539a4f 100644 --- a/ruoyi-ui/.env.staging +++ b/ruoyi-ui/.env.staging @@ -1,5 +1,5 @@ # 页面标题 -VUE_APP_TITLE = 若依管理系统 +VUE_APP_TITLE = 福安德智慧报价平台 BABEL_ENV = production diff --git a/ruoyi-ui/src/api/bid/comparison.js b/ruoyi-ui/src/api/bid/comparison.js new file mode 100644 index 00000000..22ee0975 --- /dev/null +++ b/ruoyi-ui/src/api/bid/comparison.js @@ -0,0 +1,2 @@ +import request from '@/utils/request' +export const compareRfq = (rfqId) => request({ url: '/bid/comparison/rfq/' + rfqId, method: 'get' }) diff --git a/ruoyi-ui/src/api/bid/evaluation.js b/ruoyi-ui/src/api/bid/evaluation.js new file mode 100644 index 00000000..3bc78606 --- /dev/null +++ b/ruoyi-ui/src/api/bid/evaluation.js @@ -0,0 +1,7 @@ +import request from '@/utils/request' +const baseUrl = '/bid/evaluation' +export const listEvaluation = (params) => request({ url: baseUrl + '/list', method: 'get', params }) +export const getEvaluation = (id) => request({ url: baseUrl + '/' + id, method: 'get' }) +export const addEvaluation = (data) => request({ url: baseUrl, method: 'post', data }) +export const updateEvaluation = (data) => request({ url: baseUrl, method: 'put', data }) +export const delEvaluation = (ids) => request({ url: baseUrl + '/' + ids, method: 'delete' }) diff --git a/ruoyi-ui/src/api/bid/material.js b/ruoyi-ui/src/api/bid/material.js new file mode 100644 index 00000000..24bad0b0 --- /dev/null +++ b/ruoyi-ui/src/api/bid/material.js @@ -0,0 +1,7 @@ +import request from '@/utils/request' +const baseUrl = '/bid/material' +export const listMaterial = (params) => request({ url: baseUrl + '/list', method: 'get', params }) +export const getMaterial = (id) => request({ url: baseUrl + '/' + id, method: 'get' }) +export const addMaterial = (data) => request({ url: baseUrl, method: 'post', data }) +export const updateMaterial = (data) => request({ url: baseUrl, method: 'put', data }) +export const delMaterial = (ids) => request({ url: baseUrl + '/' + ids, method: 'delete' }) diff --git a/ruoyi-ui/src/api/bid/objection.js b/ruoyi-ui/src/api/bid/objection.js new file mode 100644 index 00000000..19195aee --- /dev/null +++ b/ruoyi-ui/src/api/bid/objection.js @@ -0,0 +1,7 @@ +import request from '@/utils/request' +const baseUrl = '/bid/objection' +export const listObjection = (params) => request({ url: baseUrl + '/list', method: 'get', params }) +export const getObjection = (id) => request({ url: baseUrl + '/' + id, method: 'get' }) +export const addObjection = (data) => request({ url: baseUrl, method: 'post', data }) +export const updateObjection = (data) => request({ url: baseUrl, method: 'put', data }) +export const delObjection = (ids) => request({ url: baseUrl + '/' + ids, method: 'delete' }) diff --git a/ruoyi-ui/src/api/bid/purchaseorder.js b/ruoyi-ui/src/api/bid/purchaseorder.js new file mode 100644 index 00000000..03a539ef --- /dev/null +++ b/ruoyi-ui/src/api/bid/purchaseorder.js @@ -0,0 +1,8 @@ +import request from '@/utils/request' +const baseUrl = '/bid/purchaseorder' +export const listPurchaseorder = (params) => request({ url: baseUrl + '/list', method: 'get', params }) +export const getPurchaseorder = (id) => request({ url: baseUrl + '/' + id, method: 'get' }) +export const addPurchaseorder = (data) => request({ url: baseUrl, method: 'post', data }) +export const updatePurchaseorder = (data) => request({ url: baseUrl, method: 'put', data }) +export const confirmPurchaseorder = (id) => request({ url: baseUrl + '/confirm/' + id, method: 'put' }) +export const delPurchaseorder = (ids) => request({ url: baseUrl + '/' + ids, method: 'delete' }) diff --git a/ruoyi-ui/src/api/bid/quotation.js b/ruoyi-ui/src/api/bid/quotation.js new file mode 100644 index 00000000..907dc7d3 --- /dev/null +++ b/ruoyi-ui/src/api/bid/quotation.js @@ -0,0 +1,10 @@ +import request from '@/utils/request' +const baseUrl = '/bid/quotation' +export const listQuotation = (params) => request({ url: baseUrl + '/list', method: 'get', params }) +export const getQuotation = (id) => request({ url: baseUrl + '/' + id, method: 'get' }) +export const addQuotation = (data) => request({ url: baseUrl, method: 'post', data }) +export const updateQuotation = (data) => request({ url: baseUrl, method: 'put', data }) +export const submitQuotation = (id) => request({ url: baseUrl + '/submit/' + id, method: 'put' }) +export const acceptQuotation = (id) => request({ url: baseUrl + '/accept/' + id, method: 'put' }) +export const rejectQuotation = (id) => request({ url: baseUrl + '/reject/' + id, method: 'put' }) +export const delQuotation = (ids) => request({ url: baseUrl + '/' + ids, method: 'delete' }) diff --git a/ruoyi-ui/src/api/bid/rfq.js b/ruoyi-ui/src/api/bid/rfq.js new file mode 100644 index 00000000..53cf170a --- /dev/null +++ b/ruoyi-ui/src/api/bid/rfq.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' +const baseUrl = '/bid/rfq' +export const listRfq = (params) => request({ url: baseUrl + '/list', method: 'get', params }) +export const getRfq = (id) => request({ url: baseUrl + '/' + id, method: 'get' }) +export const getRfqItems = (id) => request({ url: baseUrl + '/' + id + '/items', method: 'get' }) +export const addRfq = (data) => request({ url: baseUrl, method: 'post', data }) +export const updateRfq = (data) => request({ url: baseUrl, method: 'put', data }) +export const publishRfq = (rfqId, supplierIds) => request({ url: baseUrl + '/publish/' + rfqId, method: 'put', data: supplierIds }) +export const delRfq = (ids) => request({ url: baseUrl + '/' + ids, method: 'delete' }) diff --git a/ruoyi-ui/src/api/bid/supplier.js b/ruoyi-ui/src/api/bid/supplier.js new file mode 100644 index 00000000..4ab824b1 --- /dev/null +++ b/ruoyi-ui/src/api/bid/supplier.js @@ -0,0 +1,7 @@ +import request from '@/utils/request' +const baseUrl = '/bid/supplier' +export const listSupplier = (params) => request({ url: baseUrl + '/list', method: 'get', params }) +export const getSupplier = (id) => request({ url: baseUrl + '/' + id, method: 'get' }) +export const addSupplier = (data) => request({ url: baseUrl, method: 'post', data }) +export const updateSupplier = (data) => request({ url: baseUrl, method: 'put', data }) +export const delSupplier = (ids) => request({ url: baseUrl + '/' + ids, method: 'delete' }) diff --git a/ruoyi-ui/src/api/bid/tenant.js b/ruoyi-ui/src/api/bid/tenant.js new file mode 100644 index 00000000..e985291a --- /dev/null +++ b/ruoyi-ui/src/api/bid/tenant.js @@ -0,0 +1,7 @@ +import request from '@/utils/request' +const baseUrl = '/bid/tenant' +export const listTenant = (params) => request({ url: baseUrl + '/list', method: 'get', params }) +export const getTenant = (id) => request({ url: baseUrl + '/' + id, method: 'get' }) +export const addTenant = (data) => request({ url: baseUrl, method: 'post', data }) +export const updateTenant = (data) => request({ url: baseUrl, method: 'put', data }) +export const delTenant = (ids) => request({ url: baseUrl + '/' + ids, method: 'delete' }) diff --git a/ruoyi-ui/src/api/bid/transaction.js b/ruoyi-ui/src/api/bid/transaction.js new file mode 100644 index 00000000..91822c3a --- /dev/null +++ b/ruoyi-ui/src/api/bid/transaction.js @@ -0,0 +1,7 @@ +import request from '@/utils/request' +const baseUrl = '/bid/transaction' +export const listTransaction = (params) => request({ url: baseUrl + '/list', method: 'get', params }) +export const getTransaction = (id) => request({ url: baseUrl + '/' + id, method: 'get' }) +export const addTransaction = (data) => request({ url: baseUrl, method: 'post', data }) +export const updateTransaction = (data) => request({ url: baseUrl, method: 'put', data }) +export const delTransaction = (ids) => request({ url: baseUrl + '/' + ids, method: 'delete' }) diff --git a/ruoyi-ui/src/assets/logo/logo.png b/ruoyi-ui/src/assets/logo/logo.png index e2637602..62d6ec6a 100644 Binary files a/ruoyi-ui/src/assets/logo/logo.png and b/ruoyi-ui/src/assets/logo/logo.png differ diff --git a/ruoyi-ui/src/assets/styles/variables.scss b/ruoyi-ui/src/assets/styles/variables.scss index 62920065..d34e6bc4 100644 --- a/ruoyi-ui/src/assets/styles/variables.scss +++ b/ruoyi-ui/src/assets/styles/variables.scss @@ -1,39 +1,37 @@ -// base color -$blue:#324157; -$light-blue:#3A71A8; -$red:#C03639; -$pink: #E65D6E; -$green: #30B08F; -$tiffany: #4AB7BD; -$yellow:#FEC171; -$panGreen: #30B08F; - -// 默认菜单主题风格 -$base-menu-color: #bfcbd9; -$base-menu-color-active: #ffffff; -$base-menu-background: #1a1f2e; -$base-logo-title-color: #ffffff; - -$base-menu-light-color:rgba(0,0,0,.70); -$base-menu-light-background:#ffffff; -$base-logo-light-title-color: #001529; - -$base-sub-menu-background: #141824; -$base-sub-menu-hover: rgba(255,255,255,.06); - -$base-sidebar-width: 200px; - -// the :export directive is the magic sauce for webpack -// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass -:export { - menuColor: $base-menu-color; - menuLightColor: $base-menu-light-color; - menuColorActive: $base-menu-color-active; - menuBackground: $base-menu-background; - menuLightBackground: $base-menu-light-background; - subMenuBackground: $base-sub-menu-background; - subMenuHover: $base-sub-menu-hover; - sideBarWidth: $base-sidebar-width; - logoTitleColor: $base-logo-title-color; - logoLightTitleColor: $base-logo-light-title-color -} +// base color - ERPNext inspired palette +$blue:#1171c4; +$light-blue:#409EFF; +$red:#C03639; +$pink: #E65D6E; +$green: #30B08F; +$tiffany: #4AB7BD; +$yellow:#FEC171; +$panGreen: #30B08F; + +// 默认菜单主题风格(ERPNext风格:白色边栏,蓝色主色) +$base-menu-color: #555c70; +$base-menu-color-active: #1171c4; +$base-menu-background: #1a2332; +$base-logo-title-color: #ffffff; + +$base-menu-light-color: rgba(0,0,0,.65); +$base-menu-light-background: #ffffff; +$base-logo-light-title-color: #1171c4; + +$base-sub-menu-background: #111a27; +$base-sub-menu-hover: rgba(17,113,196,.08); + +$base-sidebar-width: 210px; + +:export { + menuColor: $base-menu-color; + menuLightColor: $base-menu-light-color; + menuColorActive: $base-menu-color-active; + menuBackground: $base-menu-background; + menuLightBackground: $base-menu-light-background; + subMenuBackground: $base-sub-menu-background; + subMenuHover: $base-sub-menu-hover; + sideBarWidth: $base-sidebar-width; + logoTitleColor: $base-logo-title-color; + logoLightTitleColor: $base-logo-light-title-color +} diff --git a/ruoyi-ui/src/settings.js b/ruoyi-ui/src/settings.js index edfabf7a..d6bccfa7 100644 --- a/ruoyi-ui/src/settings.js +++ b/ruoyi-ui/src/settings.js @@ -7,7 +7,7 @@ module.exports = { /** * 侧边栏主题 深色主题theme-dark,浅色主题theme-light */ - sideTheme: 'theme-dark', + sideTheme: 'theme-light', /** * 系统布局配置 @@ -62,5 +62,5 @@ module.exports = { /** * 底部版权文本内容 */ - footerContent: 'Copyright © 2018-2026 RuoYi. All Rights Reserved.' + footerContent: 'Copyright © 2024-2026 福安德. 版权所有' } diff --git a/ruoyi-ui/src/store/modules/settings.js b/ruoyi-ui/src/store/modules/settings.js index 873003fa..98064944 100644 --- a/ruoyi-ui/src/store/modules/settings.js +++ b/ruoyi-ui/src/store/modules/settings.js @@ -6,7 +6,7 @@ const { sideTheme, showSettings, navType, tagsView, tagsViewPersist, tagsIcon, t const storageSetting = JSON.parse(localStorage.getItem('layout-setting')) || '' const state = { title: '', - theme: storageSetting.theme || '#409EFF', + theme: storageSetting.theme || '#1171c4', sideTheme: storageSetting.sideTheme || sideTheme, showSettings: showSettings, navType: storageSetting.navType === undefined ? navType : storageSetting.navType, diff --git a/ruoyi-ui/src/views/bid/comparison/index.vue b/ruoyi-ui/src/views/bid/comparison/index.vue new file mode 100644 index 00000000..35af0cff --- /dev/null +++ b/ruoyi-ui/src/views/bid/comparison/index.vue @@ -0,0 +1,77 @@ + + + diff --git a/ruoyi-ui/src/views/bid/evaluation/index.vue b/ruoyi-ui/src/views/bid/evaluation/index.vue new file mode 100644 index 00000000..b4a34798 --- /dev/null +++ b/ruoyi-ui/src/views/bid/evaluation/index.vue @@ -0,0 +1,75 @@ + + diff --git a/ruoyi-ui/src/views/bid/material/index.vue b/ruoyi-ui/src/views/bid/material/index.vue new file mode 100644 index 00000000..bd9431f0 --- /dev/null +++ b/ruoyi-ui/src/views/bid/material/index.vue @@ -0,0 +1,132 @@ + + + diff --git a/ruoyi-ui/src/views/bid/objection/index.vue b/ruoyi-ui/src/views/bid/objection/index.vue new file mode 100644 index 00000000..94165ef4 --- /dev/null +++ b/ruoyi-ui/src/views/bid/objection/index.vue @@ -0,0 +1,106 @@ + + diff --git a/ruoyi-ui/src/views/bid/purchaseorder/index.vue b/ruoyi-ui/src/views/bid/purchaseorder/index.vue new file mode 100644 index 00000000..2fc39d20 --- /dev/null +++ b/ruoyi-ui/src/views/bid/purchaseorder/index.vue @@ -0,0 +1,177 @@ + + diff --git a/ruoyi-ui/src/views/bid/quotation/index.vue b/ruoyi-ui/src/views/bid/quotation/index.vue new file mode 100644 index 00000000..8e8a781e --- /dev/null +++ b/ruoyi-ui/src/views/bid/quotation/index.vue @@ -0,0 +1,210 @@ + + diff --git a/ruoyi-ui/src/views/bid/rfq/index.vue b/ruoyi-ui/src/views/bid/rfq/index.vue new file mode 100644 index 00000000..25899ea4 --- /dev/null +++ b/ruoyi-ui/src/views/bid/rfq/index.vue @@ -0,0 +1,185 @@ + + + diff --git a/ruoyi-ui/src/views/bid/supplier/index.vue b/ruoyi-ui/src/views/bid/supplier/index.vue new file mode 100644 index 00000000..10d46193 --- /dev/null +++ b/ruoyi-ui/src/views/bid/supplier/index.vue @@ -0,0 +1,103 @@ + + diff --git a/ruoyi-ui/src/views/bid/tenant/index.vue b/ruoyi-ui/src/views/bid/tenant/index.vue new file mode 100644 index 00000000..2ac01312 --- /dev/null +++ b/ruoyi-ui/src/views/bid/tenant/index.vue @@ -0,0 +1,78 @@ + + diff --git a/ruoyi-ui/src/views/bid/transaction/index.vue b/ruoyi-ui/src/views/bid/transaction/index.vue new file mode 100644 index 00000000..232ac2c4 --- /dev/null +++ b/ruoyi-ui/src/views/bid/transaction/index.vue @@ -0,0 +1,66 @@ + + diff --git a/sql/bid_tables.sql b/sql/bid_tables.sql new file mode 100644 index 00000000..ae038138 --- /dev/null +++ b/sql/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());