diff --git a/.gitignore b/.gitignore
index fc5b4bf..ce7c267 100644
--- a/.gitignore
+++ b/.gitignore
@@ -31,6 +31,8 @@ target/*
/.nb-gradle/
/build/
.idea
+.cursor
+.lingma
diff --git a/pom.xml b/pom.xml
index 14c7e35..58d6d26 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,6 +47,22 @@
+
+
+ prod
+
+
+
+ src/main/resources
+
+ *.yaml
+
+
+
+
+
+
+
diff --git a/sql/db2/README.md b/sql/db2/README.md
deleted file mode 100644
index d9a95a8..0000000
--- a/sql/db2/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-暂未适配 IBM DB2 数据库,如果你有需要,可以微信联系 wangwenbin-server 一起建设。
-
-你需要把表结构与数据导入到 DM 数据库,我a来测试与适配代码。
diff --git a/sql/mysql/ai-manage.sql b/sql/mysql/ai-manage.sql
new file mode 100644
index 0000000..3cc9615
--- /dev/null
+++ b/sql/mysql/ai-manage.sql
@@ -0,0 +1,113 @@
+DROP TABLE IF EXISTS `tz_ai_sample`;
+CREATE TABLE `tz_ai_sample`
+(
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `sample_file_id` bigint NOT NULL COMMENT '样本文件id',
+ `sample_name` varchar(64) NULL DEFAULT '' COMMENT '样本名称',
+ `sample_time` varchar(16) NULL DEFAULT '' COMMENT '样本时长',
+ `sample_mine_type` varchar(16) NULL DEFAULT '' COMMENT '样本格式',
+ `sample_size` varchar(16) NULL DEFAULT '' COMMENT '样本大小',
+ `remark` varchar(255) NULL DEFAULT '' COMMENT '样本注释',
+ `creator` varchar(64) NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `idx_create_time` (`create_time` ASC) USING BTREE
+) ENGINE = InnoDB COMMENT = '样本库';
+
+
+DROP TABLE IF EXISTS `tz_ai_sample_tag_relate`;
+CREATE TABLE `tz_ai_sample_tag_relate`
+(
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `sample_id` bigint NOT NULL COMMENT '样本id',
+ `sample_tag_id` bigint NOT NULL COMMENT '样本标签id',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB COMMENT = '样本-标签关联表';
+
+
+
+DROP TABLE IF EXISTS `tz_ai_sample_tag`;
+CREATE TABLE `tz_ai_sample_tag`
+(
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `tag_name` varchar(64) NULL DEFAULT '' COMMENT '标签名称',
+ `creator` varchar(64) NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `idx_create_time` (`create_time` ASC) USING BTREE
+) ENGINE = InnoDB COMMENT = '样本标签库';
+
+DROP TABLE IF EXISTS `tz_ai_sample_tag_group`;
+CREATE TABLE `tz_ai_sample_tag_group`
+(
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `group_name` varchar(64) NULL DEFAULT '' COMMENT '分组名称',
+ `creator` varchar(64) NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `idx_create_time` (`create_time` ASC) USING BTREE
+) ENGINE = InnoDB COMMENT = '样本标签分组库';
+
+
+
+DROP TABLE IF EXISTS `tz_ai_sample_tag_group_relate`;
+CREATE TABLE `tz_ai_sample_tag_group_relate`
+(
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `sample_tag_id` bigint NOT NULL COMMENT '样本标签id',
+ `sample_tag_group_id` bigint NOT NULL COMMENT '样本标签分组id',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB COMMENT = '样本标签-分组关联表';
+
+
+DROP TABLE IF EXISTS `tz_ai_dialog`;
+CREATE TABLE `tz_ai_dialog`
+(
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `title` varchar(128) DEFAULT '' COMMENT '对话标题',
+ `user_id` bigint NOT NULL COMMENT '用户id',
+ `dialog_status` int DEFAULT NULL COMMENT '对话状态(1active, 2archived, 3deleted)',
+ `creator` varchar(64) DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB COMMENT ='ai-对话表';
+
+DROP TABLE IF EXISTS `tz_ai_dialog_message`;
+CREATE TABLE `tz_ai_dialog_message`
+(
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `dialog_id` bigint NOT NULL COMMENT '对话id',
+ `content_text` text COMMENT '内容',
+ `content_type` int DEFAULT NULL COMMENT '文本类型(1text,2file)',
+ `message_order` int DEFAULT NULL COMMENT '对话中的顺序',
+ `message_status` int DEFAULT NULL COMMENT '消息状态 1正常 0删除',
+ `pet_id` bigint DEFAULT NULL COMMENT '宠物id',
+ `pet_name` varchar(255) DEFAULT NULL COMMENT '宠物名称',
+ `pet_avatar` varchar(255) DEFAULT NULL COMMENT '宠物头像',
+ `pet_type` varchar(64) DEFAULT NULL COMMENT '宠物类型',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `trans_result` text COMMENT '回答结果',
+ `content_duration` bigint DEFAULT NULL COMMENT '文件时长',
+ `trans_status` int DEFAULT NULL COMMENT '翻译状态(1成功 0失败)',
+ `source_result` text COMMENT '原始结果',
+ `file_name` varchar(255) DEFAULT NULL COMMENT '文件名称',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB COMMENT ='ai-对话消息表';
+
+
diff --git a/sql/mysql/ruoyi-vue-pro.sql b/sql/mysql/tashow-base.sql
similarity index 100%
rename from sql/mysql/ruoyi-vue-pro.sql
rename to sql/mysql/tashow-base.sql
diff --git a/sql/mysql/tashow-order.sql b/sql/mysql/tashow-order.sql
new file mode 100644
index 0000000..e69de29
diff --git a/sql/tools/.gitignore b/sql/tools/.gitignore
deleted file mode 100644
index e00c3e7..0000000
--- a/sql/tools/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-# 忽略python虚拟环境
-.env
-.venv
-env/
-venv/
-ENV/
-env.bak/
-venv.bak/
diff --git a/sql/tools/README.md b/sql/tools/README.md
deleted file mode 100644
index 94c5300..0000000
--- a/sql/tools/README.md
+++ /dev/null
@@ -1,130 +0,0 @@
-## 0. 友情提示
-
-在 `sql/tools` 目录下,我们提供一些数据库相关的工具,包括测试数据库的快速启动、MySQL 转换其它数据库等等。
-
-注意!所有的操作,必须在 `sql/tools` 目录下执行。
-
-## 1. 测试数据库的快速启动
-
-基于 Docker Compose,快速启动 MySQL、Oracle、PostgreSQL、SQL Server 等数据库。
-
-注意!使用 Docker Compose 启动完测试数据后,因为会自动导入项目的 SQL 脚本,所以可能需要等待 1-2 分钟。
-
-### 1.1 MySQL
-
-```Bash
-docker compose up -d mysql
-```
-
-#### 1.2 Oracle
-
-```Bash
-## x86 版本
-docker compose up -d oracle
-
-## MacBook Apple Silicon
-docker compose up -d oracle_m1
-```
-
-> 注意:如果使用 MacBook Apple Silicon 版本,它的 ORACLE_SID 不是 XE,而是 FREE!!!
-
-### 1.3 PostgreSQL
-
-```Bash
-docker compose up -d postgres
-```
-
-### 1.4 SQL Server
-
-```Bash
-docker compose up -d sqlserver
-# 注意:启动完 sqlserver 后,需要手动再执行如下命令,因为 SQL Server 不支持初始化脚本
-docker compose exec sqlserver bash /tmp/create_schema.sh
-```
-
-### 1.5 DM 达梦
-
-① 下载达梦 Docker 镜像: 地址,点击“Docker 镜像”选项,进行下载。
-
-② 加载镜像文件,在镜像 tar 文件所在目录运行:
-
-```Bash
-docker load -i dm8_20240715_x86_rh6_rq_single.tar
-```
-
-③ 在项目 `sql/tools` 目录下运行:
-
-```Bash
-docker compose up -d dm8
-# 注意:启动完 dm 后,需要手动再执行如下命令,因为 dm 不支持初始化脚本
-docker compose exec dm8 bash -c '/opt/dmdbms/bin/disql SYSDBA/SYSDBA001 \`/tmp/schema.sql'
-exit
-```
-
-### 1.6 KingbaseES 人大金仓
-
-① 下载人大金仓 Docker 镜像:
-
-* [x86_64 版本](https://kingbase.oss-cn-beijing.aliyuncs.com/KESV8R3/V009R001C001B0025-安装包-docker/x86_64/kdb_x86_64_V009R001C001B0025.tar) 【Windows 选择这个】
-* [aarch64 版本](https://kingbase.oss-cn-beijing.aliyuncs.com/KESV8R3/V009R001C001B0025-安装包-docker/aarch64/kdb_aarch64_V009R001C001B0025.tar) 【MacBook Apple Silicon 选择这个】
-
-② 加载镜像文件,在镜像 tar 文件所在目录运行:
-
-```Bash
-docker load -i kdb_x86_64_V009R001C001B0025.tar
-```
-
-③ 在项目 `sql/tools` 目录下运行:
-
-```Bash
-docker compose up -d kingbase
-# 注意:启动完 kingbase 后,需要手动再执行如下命令
-docker compose exec kingbase bash -c 'ksql -U $DB_USER -d test -f /tmp/schema.sql'
-```
-
-### 1.7 华为 OpenGauss
-
-```Bash
-docker compose up -d opengauss
-# 注意:启动完 opengauss 后,需要手动再执行如下命令
-docker compose exec opengauss bash -c '/usr/local/opengauss/bin/gsql -U $GS_USERNAME -W $GS_PASSWORD -d postgres -f /tmp/schema.sql'
-```
-
-## 1.X 容器的销毁重建
-
-开发测试过程中,有时候需要创建全新干净的数据库。由于测试数据 Docker 容器采用数据卷 Volume 挂载数据库实例的数据目录,因此销毁数据需要停止容器后,删除数据卷,然后再重新创建容器。
-
-以 postgres 为例,操作如下:
-
-```Bash
-docker compose down postgres
-docker volume rm ruoyi-vue-pro_postgres
-```
-
-## 2. MySQL 转换其它数据库
-
-项目提供了 `sql/tools/convertor.py` 脚本,支持将 MySQL 转换为 Oracle、PostgreSQL、SQL Server、达梦、人大金仓、OpenGauss 等数据库的脚本。
-
-### 2.1 实现原理
-
-通过读取 MySQL 的 `sql/mysql/ruoyi-vue-pro.sql` 数据库文件,转换成对应的数据库脚本。
-
-### 2.2 使用方法
-
-① 安装依赖库 `simple-ddl-parser`
-
-```bash
-pip install simple-ddl-parser
-# pip3 install simple-ddl-parser
-```
-
-② 在 `sql/tools/` 目录下,执行如下命令打印生成 postgres 的脚本内容,其他可选参数有:`oracle`、`sqlserver`、`dm8`、`kingbase`、`opengauss`:
-
-```Bash
-python3 convertor.py postgres
-# python3 convertor.py postgres > tmp.sql
-```
-
-程序将 SQL 脚本打印到终端,可以重定向到临时文件 `tmp.sql`。
-
-确认无误后,可以利用 IDEA 进行格式化。当然,也可以直接导入到数据库中。
diff --git a/sql/tools/convertor.py b/sql/tools/convertor.py
deleted file mode 100644
index f672cd7..0000000
--- a/sql/tools/convertor.py
+++ /dev/null
@@ -1,844 +0,0 @@
-# encoding=utf8
-"""芋道系统数据库迁移工具
-
-Author: dhb52 (https://gitee.com/dhb52)
-
-pip install simple-ddl-parser
-"""
-
-import argparse
-import pathlib
-import re
-import time
-from abc import ABC, abstractmethod
-from typing import Dict, Generator, Optional, Tuple, Union
-
-from simple_ddl_parser import DDLParser
-
-PREAMBLE = """/*
- Yudao Database Transfer Tool
-
- Source Server Type : MySQL
-
- Target Server Type : {db_type}
-
- Date: {date}
-*/
-
-"""
-
-
-def load_and_clean(sql_file: str) -> str:
- """加载源 SQL 文件,并清理内容方便下一步 ddl 解析
-
- Args:
- sql_file (str): sql文件路径
-
- Returns:
- str: 清理后的sql文件内容
- """
- REPLACE_PAIR_LIST = (
- (" CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ", " "),
- (" KEY `", " INDEX `"),
- ("UNIQUE INDEX", "UNIQUE KEY"),
- ("b'0'", "'0'"),
- ("b'1'", "'1'"),
- )
-
- content = open(sql_file).read()
- for replace_pair in REPLACE_PAIR_LIST:
- content = content.replace(*replace_pair)
- content = re.sub(r"ENGINE.*COMMENT", "COMMENT", content)
- content = re.sub(r"ENGINE.*;", ";", content)
- return content
-
-
-class Convertor(ABC):
- def __init__(self, src: str, db_type) -> None:
- self.src = src
- self.db_type = db_type
- self.content = load_and_clean(self.src)
- self.table_script_list = re.findall(r"CREATE TABLE [^;]*;", self.content)
-
- @abstractmethod
- def translate_type(self, type: str, size: Optional[Union[int, Tuple[int]]]) -> str:
- """字段类型转换
-
- Args:
- type (str): 字段类型
- size (Optional[Union[int, Tuple[int]]]): 字段长度描述, 如varchar(255), decimal(10,2)
-
- Returns:
- str: 类型定义
- """
- pass
-
- @abstractmethod
- def gen_create(self, table_ddl: Dict) -> str:
- """生成 create 脚本
-
- Args:
- table_ddl (Dict): 表DDL
-
- Returns:
- str: 生成脚本
- """
- pass
-
- @abstractmethod
- def gen_pk(self, table_name: str) -> str:
- """生成主键定义
-
- Args:
- table_name (str): 表名
-
- Returns:
- str: 生成脚本
- """
- pass
-
- @abstractmethod
- def gen_index(self, ddl: Dict) -> str:
- """生成索引定义
-
- Args:
- table_ddl (Dict): 表DDL
-
- Returns:
- str: 生成脚本
- """
- pass
-
- @abstractmethod
- def gen_comment(self, table_sql: str, table_name: str) -> str:
- """生成字段/表注释
-
- Args:
- table_sql (str): 原始表SQL
- table_name (str): 表名
-
- Returns:
- str: 生成脚本
- """
- pass
-
- @abstractmethod
- def gen_insert(self, table_name: str) -> str:
- """生成 insert 语句块
-
- Args:
- table_name (str): 表名
-
- Returns:
- str: 生成脚本
- """
- pass
-
- def gen_dual(self) -> str:
- """生成虚拟 dual 表
-
- Returns:
- str: 生成脚本, 默认返回空脚本, 表示当前数据库无需手工创建
- """
- return ""
-
- @staticmethod
- def inserts(table_name: str, script_content: str) -> Generator:
- PREFIX = f"INSERT INTO `{table_name}`"
-
- # 收集 `table_name` 对应的 insert 语句
- for line in script_content.split("\n"):
- if line.startswith(PREFIX):
- head, tail = line.replace(PREFIX, "").split(" VALUES ", maxsplit=1)
- head = head.strip().replace("`", "").lower()
- tail = tail.strip().replace(r"\"", '"')
- # tail = tail.replace("b'0'", "'0'").replace("b'1'", "'1'")
- yield f"INSERT INTO {table_name.lower()} {head} VALUES {tail}"
-
- @staticmethod
- def index(ddl: Dict) -> Generator:
- """生成索引定义
-
- Args:
- ddl (Dict): 表DDL
-
- Yields:
- Generator[str]: create index 语句
- """
-
- def generate_columns(columns):
- keys = [
- f"{col['name'].lower()}{' ' + col['order'].lower() if col['order'] != 'ASC' else ''}"
- for col in columns[0]
- ]
- return ", ".join(keys)
-
- for no, index in enumerate(ddl["index"], 1):
- columns = generate_columns(index["columns"])
- table_name = ddl["table_name"].lower()
- yield f"CREATE INDEX idx_{table_name}_{no:02d} ON {table_name} ({columns})"
-
- @staticmethod
- def filed_comments(table_sql: str) -> Generator:
- for line in table_sql.split("\n"):
- match = re.match(r"^`([^`]+)`.* COMMENT '([^']+)'", line.strip())
- if match:
- field = match.group(1)
- comment_string = match.group(2).replace("\\n", "\n")
- yield field, comment_string
-
- def table_comment(self, table_sql: str) -> str:
- match = re.search(r"COMMENT \= '([^']+)';", table_sql)
- return match.group(1) if match else None
-
- def print(self):
- """打印转换后的sql脚本到终端"""
- print(
- PREAMBLE.format(
- db_type=self.db_type,
- date=time.strftime("%Y-%m-%d %H:%M:%S"),
- )
- )
-
- dual = self.gen_dual()
- if dual:
- print(
- f"""-- ----------------------------
--- Table structure for dual
--- ----------------------------
-{dual}
-"""
- )
-
- error_scripts = []
- for table_sql in self.table_script_list:
- ddl = DDLParser(table_sql.replace("`", "")).run()
-
- # 如果parse失败, 需要跟进
- if len(ddl) == 0:
- error_scripts.append(table_sql)
- continue
-
- table_ddl = ddl[0]
- table_name = table_ddl["table_name"]
-
- # 忽略 quartz 的内容
- if table_name.lower().startswith("qrtz"):
- continue
-
- # 为每个表生成个5个基本部分
- create = self.gen_create(table_ddl)
- pk = self.gen_pk(table_name)
- index = self.gen_index(table_ddl)
- comment = self.gen_comment(table_sql, table_name)
- inserts = self.gen_insert(table_name)
-
- # 组合当前表的DDL脚本
- script = f"""{create}
-
-{pk}
-
-{index}
-
-{comment}
-
-{inserts}
-"""
-
- # 清理
- script = re.sub("\n{3,}", "\n\n", script).strip() + "\n"
-
- print(script)
-
- # 将parse失败的脚本打印出来
- if error_scripts:
- for script in error_scripts:
- print(script)
-
-
-class PostgreSQLConvertor(Convertor):
- def __init__(self, src):
- super().__init__(src, "PostgreSQL")
-
- def translate_type(self, type: str, size: Optional[Union[int, Tuple[int]]]):
- """类型转换"""
-
- type = type.lower()
-
- if type == "varchar":
- return f"varchar({size})"
- if type == "int":
- return "int4"
- if type == "bigint" or type == "bigint unsigned":
- return "int8"
- if type == "datetime":
- return "timestamp"
- if type == "bit":
- return "bool"
- if type in ("tinyint", "smallint"):
- return "int2"
- if type == "text":
- return "text"
- if type in ("blob", "mediumblob"):
- return "bytea"
- if type == "decimal":
- return (
- f"numeric({','.join(str(s) for s in size)})" if len(size) else "numeric"
- )
-
- def gen_create(self, ddl: Dict) -> str:
- """生成 create"""
-
- def _generate_column(col):
- name = col["name"].lower()
- if name == "deleted":
- return "deleted int2 NOT NULL DEFAULT 0"
-
- type = col["type"].lower()
- full_type = self.translate_type(type, col["size"])
- nullable = "NULL" if col["nullable"] else "NOT NULL"
- default = f"DEFAULT {col['default']}" if col["default"] is not None else ""
- return f"{name} {full_type} {nullable} {default}"
-
- table_name = ddl["table_name"].lower()
- columns = [f"{_generate_column(col).strip()}" for col in ddl["columns"]]
- filed_def_list = ",\n ".join(columns)
- script = f"""-- ----------------------------
--- Table structure for {table_name}
--- ----------------------------
-DROP TABLE IF EXISTS {table_name};
-CREATE TABLE {table_name} (
- {filed_def_list}
-);"""
-
- return script
-
- def gen_index(self, ddl: Dict) -> str:
- return "\n".join(f"{script};" for script in self.index(ddl))
-
- def gen_comment(self, table_sql: str, table_name: str) -> str:
- """生成字段及表的注释"""
-
- script = ""
- for field, comment_string in self.filed_comments(table_sql):
- script += (
- f"COMMENT ON COLUMN {table_name}.{field} IS '{comment_string}';" + "\n"
- )
-
- table_comment = self.table_comment(table_sql)
- if table_comment:
- script += f"COMMENT ON TABLE {table_name} IS '{table_comment}';\n"
-
- return script
-
- def gen_pk(self, table_name) -> str:
- """生成主键定义"""
- return f"ALTER TABLE {table_name} ADD CONSTRAINT pk_{table_name} PRIMARY KEY (id);\n"
-
- def gen_insert(self, table_name: str) -> str:
- """生成 insert 语句,以及根据最后的 insert id+1 生成 Sequence"""
-
- inserts = list(Convertor.inserts(table_name, self.content))
- ## 生成 insert 脚本
- script = ""
- last_id = 0
- if inserts:
- inserts_lines = "\n".join(inserts)
- script += f"""\n\n-- ----------------------------
--- Records of {table_name.lower()}
--- ----------------------------
--- @formatter:off
-BEGIN;
-{inserts_lines}
-COMMIT;
--- @formatter:on"""
- match = re.search(r"VALUES \((\d+),", inserts[-1])
- if match:
- last_id = int(match.group(1))
-
- # 生成 Sequence
- script += (
- "\n\n"
- + f"""DROP SEQUENCE IF EXISTS {table_name}_seq;
-CREATE SEQUENCE {table_name}_seq
- START {last_id + 1};"""
- )
-
- return script
-
- def gen_dual(self) -> str:
- return """DROP TABLE IF EXISTS dual;
-CREATE TABLE dual
-(
- id int2
-);
-
-COMMENT ON TABLE dual IS '数据库连接的表';
-
--- ----------------------------
--- Records of dual
--- ----------------------------
--- @formatter:off
-INSERT INTO dual VALUES (1);
--- @formatter:on"""
-
-
-class OracleConvertor(Convertor):
- def __init__(self, src):
- super().__init__(src, "Oracle")
-
- def translate_type(self, type: str, size: Optional[Union[int, Tuple[int]]]):
- """类型转换"""
- type = type.lower()
-
- if type == "varchar":
- return f"varchar2({size if size < 4000 else 4000})"
- if type == "int":
- return "number"
- if type == "bigint" or type == "bigint unsigned":
- return "number"
- if type == "datetime":
- return "date"
- if type == "bit":
- return "number(1,0)"
- if type in ("tinyint", "smallint"):
- return "smallint"
- if type == "text":
- return "clob"
- if type in ("blob", "mediumblob"):
- return "blob"
- if type == "decimal":
- return (
- f"number({','.join(str(s) for s in size)})" if len(size) else "number"
- )
-
- def gen_create(self, ddl) -> str:
- """生成 CREATE 语句"""
-
- def generate_column(col):
- name = col["name"].lower()
- if name == "deleted":
- return "deleted number(1,0) DEFAULT 0 NOT NULL"
-
- type = col["type"].lower()
- full_type = self.translate_type(type, col["size"])
- nullable = "NULL" if col["nullable"] else "NOT NULL"
- default = f"DEFAULT {col['default']}" if col["default"] is not None else ""
- # Oracle 中 size 不能作为字段名
- field_name = '"size"' if name == "size" else name
- # Oracle DEFAULT 定义在 NULLABLE 之前
- return f"{field_name} {full_type} {default} {nullable}"
-
- table_name = ddl["table_name"].lower()
- columns = [f"{generate_column(col).strip()}" for col in ddl["columns"]]
- field_def_list = ",\n ".join(columns)
- script = f"""-- ----------------------------
--- Table structure for {table_name}
--- ----------------------------
-CREATE TABLE {table_name} (
- {field_def_list}
-);"""
-
- # oracle INSERT '' 不能通过 NOT NULL 校验
- script = script.replace("DEFAULT '' NOT NULL", "DEFAULT '' NULL")
-
- return script
-
- def gen_index(self, ddl: Dict) -> str:
- return "\n".join(f"{script};" for script in self.index(ddl))
-
- def gen_comment(self, table_sql: str, table_name: str) -> str:
- script = ""
- for field, comment_string in self.filed_comments(table_sql):
- script += (
- f"COMMENT ON COLUMN {table_name}.{field} IS '{comment_string}';" + "\n"
- )
-
- table_comment = self.table_comment(table_sql)
- if table_comment:
- script += f"COMMENT ON TABLE {table_name} IS '{table_comment}';\n"
-
- return script
-
- def gen_pk(self, table_name: str) -> str:
- """生成主键定义"""
- return f"ALTER TABLE {table_name} ADD CONSTRAINT pk_{table_name} PRIMARY KEY (id);\n"
-
- def gen_index(self, ddl: Dict) -> str:
- return "\n".join(f"{script};" for script in self.index(ddl))
-
- def gen_insert(self, table_name: str) -> str:
- """拷贝 INSERT 语句"""
- inserts = []
- for insert_script in Convertor.inserts(table_name, self.content):
- # 对日期数据添加 TO_DATE 转换
- insert_script = re.sub(
- r"('\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}')",
- r"to_date(\g<1>, 'SYYYY-MM-DD HH24:MI:SS')",
- insert_script,
- )
- inserts.append(insert_script)
-
- ## 生成 insert 脚本
- script = ""
- last_id = 0
- if inserts:
- inserts_lines = "\n".join(inserts)
- script += f"""\n\n-- ----------------------------
--- Records of {table_name.lower()}
--- ----------------------------
--- @formatter:off
-{inserts_lines}
-COMMIT;
--- @formatter:on"""
- match = re.search(r"VALUES \((\d+),", inserts[-1])
- if match:
- last_id = int(match.group(1))
-
- # 生成 Sequence
- script += f"""
-
-CREATE SEQUENCE {table_name}_seq
- START WITH {last_id + 1};"""
-
- return script
-
-
-class SQLServerConvertor(Convertor):
- """_summary_
-
- Args:
- Convertor (_type_): _description_
- """
-
- def __init__(self, src):
- super().__init__(src, "Microsoft SQL Server")
-
- def translate_type(self, type: str, size: Optional[Union[int, Tuple[int]]]):
- """类型转换"""
-
- type = type.lower()
-
- if type == "varchar":
- return f"nvarchar({size if size < 4000 else 4000})"
- if type == "int":
- return "int"
- if type == "bigint" or type == "bigint unsigned":
- return "bigint"
- if type == "datetime":
- return "datetime2"
- if type == "bit":
- return "varchar(1)"
- if type in ("tinyint", "smallint"):
- return "tinyint"
- if type == "text":
- return "nvarchar(max)"
- if type in ("blob", "mediumblob"):
- return "varbinary(max)"
- if type == "decimal":
- return (
- f"numeric({','.join(str(s) for s in size)})" if len(size) else "numeric"
- )
-
- def gen_create(self, ddl: Dict) -> str:
- """生成 create"""
-
- def _generate_column(col):
- name = col["name"].lower()
- if name == "id":
- return "id bigint NOT NULL PRIMARY KEY IDENTITY"
- if name == "deleted":
- return "deleted bit DEFAULT 0 NOT NULL"
-
- type = col["type"].lower()
- full_type = self.translate_type(type, col["size"])
- nullable = "NULL" if col["nullable"] else "NOT NULL"
- default = f"DEFAULT {col['default']}" if col["default"] is not None else ""
- return f"{name} {full_type} {default} {nullable}"
-
- table_name = ddl["table_name"].lower()
- columns = [f"{_generate_column(col).strip()}" for col in ddl["columns"]]
- filed_def_list = ",\n ".join(columns)
- script = f"""-- ----------------------------
--- Table structure for {table_name}
--- ----------------------------
-DROP TABLE IF EXISTS {table_name}
-GO
-CREATE TABLE {table_name} (
- {filed_def_list}
-)
-GO"""
-
- return script
-
- def gen_comment(self, table_sql: str, table_name: str) -> str:
- """生成字段及表的注释"""
-
- script = ""
-
- for field, comment_string in self.filed_comments(table_sql):
- script += f"""EXEC sp_addextendedproperty
- 'MS_Description', N'{comment_string}',
- 'SCHEMA', N'dbo',
- 'TABLE', N'{table_name}',
- 'COLUMN', N'{field}'
-GO
-
-"""
-
- table_comment = self.table_comment(table_sql)
- if table_comment:
- script += f"""EXEC sp_addextendedproperty
- 'MS_Description', N'{table_comment}',
- 'SCHEMA', N'dbo',
- 'TABLE', N'{table_name}'
-GO
-
-"""
- return script
-
- def gen_pk(self, table_name: str) -> str:
- """生成主键定义"""
- return ""
-
- def gen_index(self, ddl: Dict) -> str:
- """生成 index"""
- return "\n".join(f"{script}\nGO" for script in self.index(ddl))
-
- def gen_insert(self, table_name: str) -> str:
- """生成 insert 语句"""
-
- # 收集 `table_name` 对应的 insert 语句
- inserts = []
- for insert_script in Convertor.inserts(table_name, self.content):
- # SQLServer: 字符串前加N,hack,是否存在替换字符串内容的风险
- insert_script = insert_script.replace(", '", ", N'").replace(
- "VALUES ('", "VALUES (N')"
- )
- # 删除 insert 的结尾分号
- insert_script = re.sub(";$", r"\nGO", insert_script)
- inserts.append(insert_script)
-
- ## 生成 insert 脚本
- script = ""
- if inserts:
- inserts_lines = "\n".join(inserts)
- script += f"""\n\n-- ----------------------------
--- Records of {table_name.lower()}
--- ----------------------------
--- @formatter:off
-BEGIN TRANSACTION
-GO
-SET IDENTITY_INSERT {table_name.lower()} ON
-GO
-{inserts_lines}
-SET IDENTITY_INSERT {table_name.lower()} OFF
-GO
-COMMIT
-GO
--- @formatter:on"""
-
- return script
-
- def gen_dual(self) -> str:
- return """DROP TABLE IF EXISTS dual
-GO
-CREATE TABLE dual
-(
- id int
-)
-GO
-
-EXEC sp_addextendedproperty
- 'MS_Description', N'数据库连接的表',
- 'SCHEMA', N'dbo',
- 'TABLE', N'dual'
-GO
-
--- ----------------------------
--- Records of dual
--- ----------------------------
--- @formatter:off
-INSERT INTO dual VALUES (1)
-GO
--- @formatter:on"""
-
-
-class DM8Convertor(Convertor):
- def __init__(self, src):
- super().__init__(src, "DM8")
-
- def translate_type(self, type: str, size: Optional[Union[int, Tuple[int]]]):
- """类型转换"""
- type = type.lower()
-
- if type == "varchar":
- return f"varchar({size})"
- if type == "int":
- return "int"
- if type == "bigint" or type == "bigint unsigned":
- return "bigint"
- if type == "datetime":
- return "datetime"
- if type == "bit":
- return "bit"
- if type in ("tinyint", "smallint"):
- return "smallint"
- if type == "text":
- return "text"
- if type == "blob":
- return "blob"
- if type == "mediumblob":
- return "varchar(10240)"
- if type == "decimal":
- return (
- f"decimal({','.join(str(s) for s in size)})" if len(size) else "decimal"
- )
-
- def gen_create(self, ddl) -> str:
- """生成 CREATE 语句"""
-
- def generate_column(col):
- name = col["name"].lower()
- if name == "id":
- return "id bigint NOT NULL PRIMARY KEY IDENTITY"
-
- type = col["type"].lower()
- full_type = self.translate_type(type, col["size"])
- nullable = "NULL" if col["nullable"] else "NOT NULL"
- default = f"DEFAULT {col['default']}" if col["default"] is not None else ""
- return f"{name} {full_type} {default} {nullable}"
-
- table_name = ddl["table_name"].lower()
- columns = [f"{generate_column(col).strip()}" for col in ddl["columns"]]
- field_def_list = ",\n ".join(columns)
- script = f"""-- ----------------------------
--- Table structure for {table_name}
--- ----------------------------
-CREATE TABLE {table_name} (
- {field_def_list}
-);"""
-
- # oracle INSERT '' 不能通过 NOT NULL 校验
- script = script.replace("DEFAULT '' NOT NULL", "DEFAULT '' NULL")
-
- return script
-
- def gen_index(self, ddl: Dict) -> str:
- return "\n".join(f"{script};" for script in self.index(ddl))
-
- def gen_comment(self, table_sql: str, table_name: str) -> str:
- script = ""
- for field, comment_string in self.filed_comments(table_sql):
- script += (
- f"COMMENT ON COLUMN {table_name}.{field} IS '{comment_string}';" + "\n"
- )
-
- table_comment = self.table_comment(table_sql)
- if table_comment:
- script += f"COMMENT ON TABLE {table_name} IS '{table_comment}';\n"
-
- return script
-
- def gen_pk(self, table_name: str) -> str:
- """生成主键定义"""
- return ""
-
- def gen_index(self, ddl: Dict) -> str:
- return "\n".join(f"{script};" for script in self.index(ddl))
-
- def gen_insert(self, table_name: str) -> str:
- """拷贝 INSERT 语句"""
- inserts = list(Convertor.inserts(table_name, self.content))
-
- ## 生成 insert 脚本
- script = ""
- if inserts:
- inserts_lines = "\n".join(inserts)
- script += f"""\n\n-- ----------------------------
--- Records of {table_name.lower()}
--- ----------------------------
--- @formatter:off
-SET IDENTITY_INSERT {table_name.lower()} ON;
-{inserts_lines}
-COMMIT;
-SET IDENTITY_INSERT {table_name.lower()} OFF;
--- @formatter:on"""
-
- return script
-
-
-class KingbaseConvertor(PostgreSQLConvertor):
- def __init__(self, src):
- super().__init__(src)
- self.db_type = "Kingbase"
-
- def gen_create(self, ddl: Dict) -> str:
- """生成 create"""
-
- def _generate_column(col):
- name = col["name"].lower()
- if name == "deleted":
- return "deleted int2 NOT NULL DEFAULT 0"
-
- type = col["type"].lower()
- full_type = self.translate_type(type, col["size"])
- nullable = "NULL" if col["nullable"] else "NOT NULL"
- default = f"DEFAULT {col['default']}" if col["default"] is not None else ""
- return f"{name} {full_type} {nullable} {default}"
-
- table_name = ddl["table_name"].lower()
- columns = [f"{_generate_column(col).strip()}" for col in ddl["columns"]]
- filed_def_list = ",\n ".join(columns)
- script = f"""-- ----------------------------
--- Table structure for {table_name}
--- ----------------------------
-DROP TABLE IF EXISTS {table_name};
-CREATE TABLE {table_name} (
- {filed_def_list}
-);"""
-
- # Kingbase INSERT '' 不能通过 NOT NULL 校验
- script = script.replace("NOT NULL DEFAULT ''", "NULL DEFAULT ''")
-
- return script
-
-
-class OpengaussConvertor(KingbaseConvertor):
- def __init__(self, src):
- super().__init__(src)
- self.db_type = "OpenGauss"
-
-
-def main():
- parser = argparse.ArgumentParser(description="芋道系统数据库转换工具")
- parser.add_argument(
- "type",
- type=str,
- help="目标数据库类型",
- choices=["postgres", "oracle", "sqlserver", "dm8", "kingbase", "opengauss"],
- )
- args = parser.parse_args()
-
- sql_file = pathlib.Path("../mysql/ruoyi-vue-pro.sql").resolve().as_posix()
- convertor = None
- if args.type == "postgres":
- convertor = PostgreSQLConvertor(sql_file)
- elif args.type == "oracle":
- convertor = OracleConvertor(sql_file)
- elif args.type == "sqlserver":
- convertor = SQLServerConvertor(sql_file)
- elif args.type == "dm8":
- convertor = DM8Convertor(sql_file)
- elif args.type == "kingbase":
- convertor = KingbaseConvertor(sql_file)
- elif args.type == "opengauss":
- convertor = OpengaussConvertor(sql_file)
- else:
- raise NotImplementedError(f"不支持目标数据库类型: {args.type}")
-
- convertor.print()
-
-
-if __name__ == "__main__":
- main()
diff --git a/sql/tools/docker-compose.yaml b/sql/tools/docker-compose.yaml
deleted file mode 100644
index 0fa9513..0000000
--- a/sql/tools/docker-compose.yaml
+++ /dev/null
@@ -1,134 +0,0 @@
-name: ruoyi-vue-pro
-
-volumes:
- mysql: { }
- postgres: { }
- sqlserver: { }
- dm8: { }
- kingbase: { }
- opengauss: { }
-
-services:
- mysql:
- image: mysql:8.0.33
- restart: unless-stopped
- environment:
- TZ: Asia/Shanghai
- MYSQL_ROOT_PASSWORD: 123456
- MYSQL_DATABASE: ruoyi-vue-pro
- ports:
- - "3306:3306"
- volumes:
- - mysql:/var/lib/mysql/
- # 注入初始化脚本
- - ./mysql/ruoyi-vue-pro.sql:/docker-entrypoint-initdb.d/init.sql:ro
- command:
- --default-authentication-plugin=mysql_native_password
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_general_ci
- --explicit_defaults_for_timestamp=true
- --lower_case_table_names=1
-
- postgres:
- image: postgres:14.2
- restart: unless-stopped
- environment:
- POSTGRES_USER: root
- POSTGRES_PASSWORD: 123456
- POSTGRES_DB: ruoyi-vue-pro
- ports:
- - "5432:5432"
- volumes:
- - postgres:/var/lib/postgresql/data
- # 注入初始化脚本
- - ../postgresql/quartz.sql:/docker-entrypoint-initdb.d/quartz.sql:ro
- - ../postgresql/ruoyi-vue-pro.sql:/docker-entrypoint-initdb.d/ruoyi-vue-pro.sql:ro
-
- oracle:
- image: gvenzl/oracle-xe:18-slim-faststart
- restart: unless-stopped
- environment:
- ## 登录信息 SID: XE user: system password: oracle
- ORACLE_PASSWORD: oracle
- ports:
- - "1521:1521"
- volumes:
- - ../oracle/ruoyi-vue-pro.sql:/tmp/schema.sql:ro
- # 创建app用户: ROOT/123456@//localhost/XEPDB1
- - ./oracle/1_create_user.sql:/docker-entrypoint-initdb.d/1_create_user.sql:ro
- - ./oracle/2_create_schema.sh:/docker-entrypoint-initdb.d/2_create_schema.sh:ro
-
- oracle_m1:
- image: einslib/oracle-19c:19.3.0-ee-slim-faststart
- restart: unless-stopped
- environment:
- ## 登录信息 SID: FREE user: system password: oracle
- ORACLE_PASSWORD: oracle
- ports:
- - "1521:1521"
- volumes:
- - ../oracle/ruoyi-vue-pro.sql:/tmp/schema.sql:ro
- # 创建app用户: ROOT/123456@//localhost/XEPDB1
- - ./oracle/1_create_user.sql:/docker-entrypoint-initdb.d/1_create_user.sql:ro
- - ./oracle/2_create_schema.sh:/docker-entrypoint-initdb.d/2_create_schema.sh:ro
-
- sqlserver:
- image: mcr.microsoft.com/mssql/server:2017-latest
- restart: unless-stopped
- environment:
- TZ: Asia/Shanghai
- ACCEPT_EULA: "Y"
- SA_PASSWORD: "Yudao@2024"
- ports:
- - "1433:1433"
- volumes:
- - sqlserver:/var/opt/mssql
- - ../sqlserver/ruoyi-vue-pro.sql:/tmp/schema.sql:ro
- # docker compose exec sqlserver bash /tmp/create_schema.sh
- - ./sqlserver/create_schema.sh:/tmp/create_schema.sh:ro
-
- dm8:
- # docker load -i dm8_20240715_x86_rh6_rq_single.tar
- image: dm8_single:dm8_20240715_rev232765_x86_rh6_64
- restart: unless-stopped
- environment:
- PAGE_SIZE: 16
- LD_LIBRARY_PATH: /opt/dmdbms/bin
- EXTENT_SIZE: 32
- BLANK_PAD_MODE: 1
- LOG_SIZE: 1024
- UNICODE_FLAG: 1
- LENGTH_IN_CHAR: 1
- INSTANCE_NAME: dm8_test
- ports:
- - "5236:5236"
- volumes:
- - dm8:/opt/dmdbms/data
- - ../dm/ruoyi-vue-pro-dm8.sql:/tmp/schema.sql:ro
-
- kingbase:
- image: kingbase_v009r001c001b0025_single_x86:v1
-# image: kingbase_v009r001c001b0025_single_arm:v1
- restart: unless-stopped
- environment:
- DB_USER: root
- DB_PASSWORD: 123456
- ports:
- - "54321:54321"
- volumes:
- - kingbase:/home/kingbase/userdata
- - ../kingbase/ruoyi-vue-pro.sql:/tmp/schema.sql:ro
-
- opengauss:
- image: opengauss/opengauss:5.0.0
- restart: unless-stopped
- environment:
- GS_USERNAME: root
- GS_PASSWORD: Yudao@2024
- LD_LIBRARY_PATH: /usr/local/opengauss/lib:/usr/lib
- ports:
- - "5432:5432"
- volumes:
- - opengauss:/var/lib/opengauss
- - ../opengauss/ruoyi-vue-pro.sql:/tmp/schema.sql:ro
- # docker compose exec opengauss bash -c '/usr/local/opengauss/bin/gsql -U $GS_USERNAME -W $GS_PASSWORD -d postgres -f /tmp/schema.sql'
\ No newline at end of file
diff --git a/sql/tools/oracle/1_create_user.sql b/sql/tools/oracle/1_create_user.sql
deleted file mode 100644
index 58c9658..0000000
--- a/sql/tools/oracle/1_create_user.sql
+++ /dev/null
@@ -1,3 +0,0 @@
-ALTER SESSION SET CONTAINER=XEPDB1;
-CREATE USER ROOT IDENTIFIED BY 123456 QUOTA UNLIMITED ON USERS;
-GRANT CONNECT, RESOURCE TO ROOT;
diff --git a/sql/tools/oracle/2_create_schema.sh b/sql/tools/oracle/2_create_schema.sh
deleted file mode 100644
index ce7955d..0000000
--- a/sql/tools/oracle/2_create_schema.sh
+++ /dev/null
@@ -1 +0,0 @@
-sqlplus -s ROOT/123456@//localhost/XEPDB1 @/tmp/schema.sql
diff --git a/sql/tools/sqlserver/create_schema.sh b/sql/tools/sqlserver/create_schema.sh
deleted file mode 100644
index 172650b..0000000
--- a/sql/tools/sqlserver/create_schema.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/env bash
-
-/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P ${SA_PASSWORD} -Q "CREATE DATABASE [ruoyi-vue-pro];
-GO"
-/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P ${SA_PASSWORD} -d 'ruoyi-vue-pro' -i /tmp/schema.sql
diff --git a/tashow-dependencies/pom.xml b/tashow-dependencies/pom.xml
index 15408bb..0c12cba 100644
--- a/tashow-dependencies/pom.xml
+++ b/tashow-dependencies/pom.xml
@@ -34,6 +34,8 @@
2.3.1
+ 2.7.0
+ 4.6.0
2.4.0
@@ -150,6 +152,11 @@
tashow-data-permission
${revision}
+
+ com.tashow.cloud
+ tashow-sdk-file
+ ${revision}
+
com.tashow.cloud
@@ -433,6 +440,22 @@
${spring-boot-admin.version}
+
+
+ com.github.xingfudeshi
+ knife4j-openapi3-jakarta-spring-boot-starter
+ ${knife4j.version}
+
+
+ org.springdoc
+ springdoc-openapi-starter-webmvc-api
+ ${springdoc.version}
+
+
+ com.github.xiaoymin
+ knife4j-gateway-spring-boot-starter
+ 4.5.0
+
org.mockito
diff --git a/tashow-feign/tashow-infra-api/src/main/java/com/tashow/cloud/infraapi/api/file/FileApi.java b/tashow-feign/tashow-infra-api/src/main/java/com/tashow/cloud/infraapi/api/file/FileApi.java
index 2ecf928..cbbcd25 100644
--- a/tashow-feign/tashow-infra-api/src/main/java/com/tashow/cloud/infraapi/api/file/FileApi.java
+++ b/tashow-feign/tashow-infra-api/src/main/java/com/tashow/cloud/infraapi/api/file/FileApi.java
@@ -9,50 +9,54 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
+/**
+ * RPC 服务 - 文件
+ */
@FeignClient(name = ApiConstants.NAME) // TODO 芋艿:fallbackFactory =
-/** RPC 服务 - 文件 */
public interface FileApi {
- String PREFIX = ApiConstants.PREFIX + "/file";
+ String PREFIX = ApiConstants.PREFIX + "/file";
- /**
- * 保存文件,并返回文件的访问路径
- *
- * @param content 文件内容
- * @return 文件路径
- */
- default String createFile(byte[] content) {
- return createFile(null, null, content);
- }
+ /**
+ * 保存文件,并返回文件的访问路径
+ *
+ * @param content 文件内容
+ * @return 文件路径
+ */
+ default String createFile(byte[] content) {
+ return createFile(null, null, content);
+ }
- /**
- * 保存文件,并返回文件的访问路径
- *
- * @param path 文件路径
- * @param content 文件内容
- * @return 文件路径
- */
- default String createFile(String path, byte[] content) {
- return createFile(null, path, content);
- }
+ /**
+ * 保存文件,并返回文件的访问路径
+ *
+ * @param path 文件路径
+ * @param content 文件内容
+ * @return 文件路径
+ */
+ default String createFile(String path, byte[] content) {
+ return createFile(null, path, content);
+ }
- /**
- * 保存文件,并返回文件的访问路径
- *
- * @param name 原文件名称
- * @param path 文件路径
- * @param content 文件内容
- * @return 文件路径
- */
- default String createFile(
- @RequestParam("name") String name,
- @RequestParam("path") String path,
- @RequestParam("content") byte[] content) {
- return createFile(new FileCreateReqDTO().setName(name).setPath(path).setContent(content))
- .getCheckedData();
- }
+ /**
+ * 保存文件,并返回文件的访问路径
+ *
+ * @param name 原文件名称
+ * @param path 文件路径
+ * @param content 文件内容
+ * @return 文件路径
+ */
+ default String createFile(
+ @RequestParam("name") String name,
+ @RequestParam("path") String path,
+ @RequestParam("content") byte[] content) {
+ return createFile(new FileCreateReqDTO().setName(name).setPath(path).setContent(content))
+ .getCheckedData();
+ }
- @PostMapping(PREFIX + "/create")
- /** 保存文件,并返回文件的访问路径 */
- CommonResult createFile(@Valid @RequestBody FileCreateReqDTO createReqDTO);
+ /**
+ * 保存文件,并返回文件的访问路径
+ */
+ @PostMapping(PREFIX + "/create")
+ CommonResult createFile(@Valid @RequestBody FileCreateReqDTO createReqDTO);
}
diff --git a/tashow-feign/tashow-product-api/pom.xml b/tashow-feign/tashow-product-api/pom.xml
index 8c5746d..67eb172 100644
--- a/tashow-feign/tashow-product-api/pom.xml
+++ b/tashow-feign/tashow-product-api/pom.xml
@@ -1,85 +1,90 @@
- 4.0.0
-
- com.tashow.cloud
- tashow-feign
- ${revision}
-
- tashow-product-api
- jar
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+
+ com.tashow.cloud
+ tashow-feign
+ ${revision}
+
+ tashow-product-api
+ jar
- ${project.artifactId}
-
- infra 模块 API,暴露给其它模块调用
-
+ ${project.artifactId}
+
+ infra 模块 API,暴露给其它模块调用
+
-
-
- com.tashow.cloud
- tashow-common
-
+
+
+ com.tashow.cloud
+ tashow-common
+
-
-
- org.springframework.boot
- spring-boot-starter-validation
- true
-
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+ true
+
-
-
- org.springframework.cloud
- spring-cloud-starter-openfeign
- true
-
-
- org.mybatis
- mybatis
- 3.5.13
-
-
-
- io.swagger
- swagger-models
- 1.6.2
-
-
-
- io.swagger.core.v3
- swagger-core
- 2.2.20
-
+
+ jakarta.validation
+ jakarta.validation-api
+
-
-
- io.swagger.core.v3
- swagger-models
- 2.2.20
-
-
-
- com.alibaba
- easyexcel
- 4.0.3
-
-
- org.mybatis
- mybatis
- 3.5.9
-
-
- com.baomidou
- mybatis-plus-annotation
- 3.5.9
- compile
-
-
- com.tashow.cloud
- tashow-data-mybatis
-
-
+
+
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
+ true
+
+
+ org.mybatis
+ mybatis
+ 3.5.13
+
+
+
+ io.swagger
+ swagger-models
+ 1.6.2
+
+
+
+ io.swagger.core.v3
+ swagger-core
+ 2.2.20
+
+
+
+
+ io.swagger.core.v3
+ swagger-models
+ 2.2.20
+
+
+
+ com.alibaba
+ easyexcel
+ 4.0.3
+
+
+ org.mybatis
+ mybatis
+ 3.5.9
+
+
+ com.baomidou
+ mybatis-plus-annotation
+ 3.5.9
+ compile
+
+
+ com.tashow.cloud
+ tashow-data-mybatis
+
+
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/dto/ProdAdditionalFeeDatesDO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/dto/ProdAdditionalFeeDatesDO.java
index ae0b33a..a66391c 100644
--- a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/dto/ProdAdditionalFeeDatesDO.java
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/dto/ProdAdditionalFeeDatesDO.java
@@ -43,16 +43,22 @@ public class ProdAdditionalFeeDatesDO extends BaseDO {
* 日期类型0:'自定义日期范围':1:'指定日期':2:'法定节假日',3:'固定休息日'
*/
private Integer dateType;
+
/**
- * 自定义日期时间段
+ * 类型:1:特殊日期 2:可预约时段黑名单日期 3:紧急相应服务黑名单日期
+ */
+ private Integer type;
+
+ /**
+ * 日期
*/
@TableField(typeHandler = StringListTypeHandler.class)
private List customTimeSlots;
- /**
+/* *//**
* 指定日期
- */
+ *//*
@TableField(typeHandler = StringListTypeHandler.class)
- private List specificDates;
+ private List specificDates;*/
/**
* 收费方式0:''固定金额'':1:''基准价上浮
*/
@@ -65,5 +71,7 @@ public class ProdAdditionalFeeDatesDO extends BaseDO {
* 是否启用该规则是否启用该规则0关1开
*/
private Integer isEnabled;
-
+ public boolean isEmpty() {
+ return id == null ;
+ }
}
\ No newline at end of file
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/dto/ProdAdditionalFeePeriodsDO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/dto/ProdAdditionalFeePeriodsDO.java
index a657bd5..0c31709 100644
--- a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/dto/ProdAdditionalFeePeriodsDO.java
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/dto/ProdAdditionalFeePeriodsDO.java
@@ -56,5 +56,7 @@ public class ProdAdditionalFeePeriodsDO extends BaseDO {
* 浮动百分比
*/
private BigDecimal floatingPercentage;
-
+ public boolean isEmpty() {
+ return id == null ;
+ }
}
\ No newline at end of file
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/dto/ProdEmergencyResponseDO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/dto/ProdEmergencyResponseDO.java
index 3259231..36916f4 100644
--- a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/dto/ProdEmergencyResponseDO.java
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/dto/ProdEmergencyResponseDO.java
@@ -39,23 +39,5 @@ public class ProdEmergencyResponseDO extends BaseDO {
*/
@TableField(typeHandler = StringListTypeHandler.class)
private List responseTimeSlots;
- /**
- * 黑名自定义日期
- */
- @TableField(typeHandler = StringListTypeHandler.class)
- private List blacklistedDates;
- /**
- * 黑名单指定日期
- */
- @TableField(typeHandler = StringListTypeHandler.class)
- private List blackAppointDates;
- /**
- * 法定节假日是否开启0:关闭1开启
- */
- private Integer blackHappy;
- /**
- * 固定休息日周末是否开启0关闭1开启
- */
- private Integer blackWeekend;
}
\ No newline at end of file
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/dto/ProdEmergencyResponseIntervalsDO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/dto/ProdEmergencyResponseIntervalsDO.java
index af57496..6e3d970 100644
--- a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/dto/ProdEmergencyResponseIntervalsDO.java
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/dto/ProdEmergencyResponseIntervalsDO.java
@@ -38,9 +38,9 @@ public class ProdEmergencyResponseIntervalsDO extends BaseDO {
private Long prodId;
/**
- * 响应模式名称
+ * 响应模式名称modeName
*/
- private String modeName;
+ private String name;
/**
* 响应时间(小时)
*/
@@ -58,4 +58,8 @@ public class ProdEmergencyResponseIntervalsDO extends BaseDO {
*/
private BigDecimal price;
+
+ public boolean isEmpty() {
+ return id == null;
+ }
}
\ No newline at end of file
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/dto/ProdExtendDO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/dto/ProdExtendDO.java
index d41b785..df8fca3 100644
--- a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/dto/ProdExtendDO.java
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/dto/ProdExtendDO.java
@@ -41,4 +41,9 @@ public class ProdExtendDO {
*/
private Integer isDisable;
+ /**
+ * 体重是否收费0否1是
+ */
+ private Integer isWeightCharge;
+
}
\ No newline at end of file
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/dto/ProdReservationConfigDO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/dto/ProdReservationConfigDO.java
index 43236ab..84c82eb 100644
--- a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/dto/ProdReservationConfigDO.java
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/dto/ProdReservationConfigDO.java
@@ -66,37 +66,6 @@ public class ProdReservationConfigDO extends BaseDO {
* 允许更改预约时间的最大次数
*/
private Integer maxChangeTimes;
- /**
- * 黑名自定义日期
- */
- @TableField(typeHandler = StringListTypeHandler.class)
- private List blacklistedDates;
-
- /**
- * '是否开启黑名单自定义0关1开'
- */
- private Integer isBlacklisted;
-
- /**
- * '是否开启黑名单指定日期0关1开'
- */
- private Integer isBlackAppoint;
-
- /**
- * 黑名单指定日期
- */
- //private String blackAppointDates;
- @TableField(typeHandler = StringListTypeHandler.class)
- private List blackAppointDates;
- /**
- * 法定节假日是否开启0:关闭1开启
- */
- private Integer blackHappy;
- /**
- * 固定休息日周末是否开启0关闭1开启
- */
- private Integer blackWeekend;
-
/**
* 预约时间区间设置
*/
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/CategorySaveReqVO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/CategorySaveReqVO.java
index 366df2d..35dc158 100644
--- a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/CategorySaveReqVO.java
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/CategorySaveReqVO.java
@@ -1,8 +1,6 @@
package com.tashow.cloud.productapi.api.product.vo;
import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.util.List;
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prod/ProdListVO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prod/ProdListVO.java
index 50dced3..d4ae332 100644
--- a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prod/ProdListVO.java
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prod/ProdListVO.java
@@ -63,7 +63,8 @@ public class ProdListVO {
/**
* 服务时段
*/
- private BigDecimal reservationTimeSlots;
+ @TableField(typeHandler = StringListTypeHandler.class)
+ private List reservationTimeSlots;
/**
* 还剩多少天
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prod/ProdRestoreListVO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prod/ProdRestoreListVO.java
index d39739a..59b556f 100644
--- a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prod/ProdRestoreListVO.java
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prod/ProdRestoreListVO.java
@@ -1,7 +1,9 @@
package com.tashow.cloud.productapi.api.product.vo.prod;
+import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
+import com.tashow.cloud.productapi.general.StringListTypeHandler;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -49,7 +51,8 @@ public class ProdRestoreListVO {
/**
* 服务时段
*/
- private BigDecimal reservationTimeSlots;
+ @TableField(typeHandler = StringListTypeHandler.class)
+ private List reservationTimeSlots;
/**
* 还剩多少天
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prod/ProdSaveReqVO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prod/ProdSaveReqVO.java
index 2d271ad..c620f86 100644
--- a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prod/ProdSaveReqVO.java
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prod/ProdSaveReqVO.java
@@ -3,7 +3,6 @@ package com.tashow.cloud.productapi.api.product.vo.prod;
import com.tashow.cloud.productapi.api.product.dto.SkuDO;
import com.tashow.cloud.productapi.api.product.vo.prodprop.ProdPropSaveReqVO;
import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import java.util.List;
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prod/ProdServiceInfoVO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prod/ProdServiceInfoVO.java
new file mode 100644
index 0000000..7639abc
--- /dev/null
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prod/ProdServiceInfoVO.java
@@ -0,0 +1,84 @@
+package com.tashow.cloud.productapi.api.product.vo.prod;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.tashow.cloud.productapi.api.product.dto.ProdAdditionalFeeDatesDO;
+import com.tashow.cloud.productapi.api.product.dto.ProdAdditionalFeePeriodsDO;
+import com.tashow.cloud.productapi.api.product.dto.ProdWeightRangePricesDO;
+import com.tashow.cloud.productapi.api.product.dto.ProductOrderLimitDO;
+import com.tashow.cloud.productapi.api.product.vo.prodemergencyresponse.ProdEmergencyInfoReqVO;
+import com.tashow.cloud.productapi.api.product.vo.prodemergencyresponse.ProdEmergencyInfoVO;
+import com.tashow.cloud.productapi.api.product.vo.prodreservationconfig.ProdReservationInfoReqVO;
+import com.tashow.cloud.productapi.api.product.vo.prodreservationconfig.ProdReservationInfoVO;
+import com.tashow.cloud.productapi.api.product.vo.prodserviceareas.ProdServiceAreasInfoVO;
+import com.tashow.cloud.productapi.api.product.vo.prodweightrangeprices.ProdWeightRangePricesSaveInfoVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Schema(description = "商品服务配置 VO")
+@Data
+public class ProdServiceInfoVO {
+
+ @Schema(description = "产品ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "6943")
+ private Long prodId;
+
+ @Schema(description = "创建时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date createTime;
+
+ @Schema(description = "修改时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date updateTime;
+
+ @Schema(description = "新建人")
+ private String creator;
+
+ @Schema(description = "修改人")
+ private String updater;
+
+ @Schema(description = "分类名称")
+ private String categoryName;
+
+ @Schema(description = "是否开启服务区域配置0关1开")
+ private Integer regionSwitch;
+ @Schema(description = "服务区域配置")
+ public ProdServiceAreasInfoVO prodServiceAreasInfo;
+
+
+ @Schema(description = "是否预约0关1开")
+ private Integer reservationSwitch;
+ @Schema(description = "预约配置")
+ public ProdReservationInfoReqVO prodReservationConfig;
+
+ @Schema(description = "是否紧急响应服务0关1开")
+ private Integer emergencySwitch;
+ @Schema(description = "急响应服务配置")
+ public ProdEmergencyInfoReqVO prodEmergencyInfoVO;
+
+ @Schema(description = "是否接单上线0关1开")
+ private Integer orderLimitSwitch;
+ @Schema(description = "接单上线配置")
+ public ProductOrderLimitDO productOrderLimitVO;
+
+
+ @Schema(description = "是否特殊日期(节假日周末什么的)0关1开 ")
+ private Integer additionalSwitch;
+ @Schema(description = "特殊日期规则配置")
+ public List prodAdditionalFeeDatesList;
+
+ @Schema(description = "是否特殊时段0关1开")
+ private Integer additionalFeeSwitch;
+ @Schema(description = "特殊时段规则配置 ")
+ public List prodAdditionalFeePeriodsList;
+
+
+ @Schema(description = "是否开启体重配置0关1开")
+ private Integer weightSwitch;
+ @Schema(description = "体重配置")
+ public ProdWeightRangePricesSaveInfoVO prodWeightConfig;
+
+
+}
\ No newline at end of file
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prod/ProdServiceVO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prod/ProdServiceVO.java
index 06a1454..03cab05 100644
--- a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prod/ProdServiceVO.java
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prod/ProdServiceVO.java
@@ -1,14 +1,20 @@
package com.tashow.cloud.productapi.api.product.vo.prod;
import com.fasterxml.jackson.annotation.JsonFormat;
+import com.tashow.cloud.productapi.api.product.vo.prodadditionalfeedates.ProdAdditionalFeeBlackVO;
import com.tashow.cloud.productapi.api.product.vo.prodemergencyresponse.ProdEmergencyInfoVO;
+import com.tashow.cloud.productapi.api.product.vo.prodreservationconfig.ProdReservationInfoVO;
import com.tashow.cloud.productapi.api.product.vo.prodserviceareas.ProdServiceAreasInfoVO;
import com.tashow.cloud.productapi.api.product.dto.*;
+import com.tashow.cloud.productapi.api.product.vo.prodweightrangeprices.ProdWeightRangePricesSaveInfoVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
+import java.util.ArrayList;
import java.util.Date;
import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
@Schema(description = "商品服务配置 VO")
@Data
@@ -43,7 +49,23 @@ public class ProdServiceVO {
@Schema(description = "是否预约0关1开")
private Integer reservationSwitch;
@Schema(description = "预约配置")
- public ProdReservationConfigDO prodReservationConfig;
+ public ProdReservationInfoVO prodReservationConfig;
+
+ /* public List getProdReservationBlackList() {
+ if (prodReservationBlackList == null || prodReservationBlackList.isEmpty()) {
+ return prodReservationBlackList;
+ }
+ return prodReservationBlackList.stream()
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
+ }
+
+ public void setProdReservationBlackList(List prodReservationBlackList) {
+ this.prodReservationBlackList = prodReservationBlackList;
+ }*/
+
+
+
@Schema(description = "是否紧急响应服务0关1开")
private Integer emergencySwitch;
@@ -56,20 +78,42 @@ public class ProdServiceVO {
public ProductOrderLimitDO productOrderLimitVO;
- @Schema(description = "是否特殊时段0关1开")
+ @Schema(description = "是否特殊日期(节假日周末什么的)0关1开")
private Integer additionalSwitch;
- @Schema(description = "特殊时段规则配置")
+ @Schema(description = "特殊日期规则配置")
public List prodAdditionalFeeDatesList;
- @Schema(description = "是否特殊日期(节假日周末什么的)0关1开")
+ @Schema(description = "是否特殊时段0关1开 ")
private Integer additionalFeeSwitch;
- @Schema(description = "特殊日期规则配置")
+ @Schema(description = "特殊时段规则配置 ")
public List prodAdditionalFeePeriodsList;
@Schema(description = "是否开启体重配置0关1开")
private Integer weightSwitch;
@Schema(description = "体重配置")
- public ProdWeightRangePricesDO prodWeightConfig;
+ public ProdWeightRangePricesSaveInfoVO prodWeightConfig;
+
+ public ProdReservationInfoVO getProdReservationConfig() {
+
+ if (this.prodReservationConfig == null) {
+ return null;
+ }
+ // 判断是否“逻辑上为空”
+ if (isProdReservationInfoEmpty(this.prodReservationConfig)) {
+ return null;
+ }
+ return this.prodReservationConfig;
+ }
+
+ public void setProdReservationConfig(ProdReservationInfoVO prodReservationConfig) {
+ this.prodReservationConfig = prodReservationConfig;
+ }
+
+ private boolean isProdReservationInfoEmpty(ProdReservationInfoVO config) {
+ if (config == null) return true;
+ // 判断所有字段是否都为 null 或空
+ return config.getId() == null;
+ }
}
\ No newline at end of file
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodadditionalfeedates/ProdAdditionalFeeBlackVO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodadditionalfeedates/ProdAdditionalFeeBlackVO.java
new file mode 100644
index 0000000..e693bc9
--- /dev/null
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodadditionalfeedates/ProdAdditionalFeeBlackVO.java
@@ -0,0 +1,42 @@
+package com.tashow.cloud.productapi.api.product.vo.prodadditionalfeedates;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.tashow.cloud.productapi.general.StringListTypeHandler;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Schema(description = "管理后台 - 特殊日期附加费用规则 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class ProdAdditionalFeeBlackVO {
+
+ @Schema(description = "特殊日期规则的唯一标识符")
+ @ExcelProperty("特殊日期规则的唯一标识符")
+ private Long id;
+
+ @Schema(description = "日期类型0:'自定义日期范围':1:'指定日期':2:'法定节假日',3:'固定休息日'")
+ @ExcelProperty("日期类型0:'自定义日期范围':1:'指定日期':2:'法定节假日',3:'固定休息日'")
+ private Integer dateType;
+
+ @Schema(description = "黑名单日期设置")
+ @ExcelProperty("黑名单日期设置")
+ @TableField(typeHandler = StringListTypeHandler.class)
+ private List customTimeSlots;
+
+
+ @Schema(description = "类型:1:特殊日期 2:可预约时段黑名单日期 3:紧急相应服务黑名单日期")
+ @ExcelProperty("类型:1:特殊日期 2:可预约时段黑名单日期 3:紧急相应服务黑名单日期")
+ private Integer type;
+
+ @Schema(description = "是否启用该规则是否启用该规则0关1开", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("是否启用该规则是否启用该规则0关1开")
+ private Integer isEnabled;
+ public boolean isEmpty() {
+ return id == null ;
+ }
+}
\ No newline at end of file
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodemergencyresponse/ProdEmergencyInfoReqVO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodemergencyresponse/ProdEmergencyInfoReqVO.java
new file mode 100644
index 0000000..c6103fd
--- /dev/null
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodemergencyresponse/ProdEmergencyInfoReqVO.java
@@ -0,0 +1,40 @@
+package com.tashow.cloud.productapi.api.product.vo.prodemergencyresponse;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.tashow.cloud.productapi.api.product.dto.ProdEmergencyResponseIntervalsDO;
+import com.tashow.cloud.productapi.api.product.vo.prodadditionalfeedates.ProdAdditionalFeeBlackVO;
+import com.tashow.cloud.productapi.general.StringListTypeHandler;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Schema(description = "管理后台 - 商品紧急响应服务设置 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class ProdEmergencyInfoReqVO {
+
+
+ /**
+ * 紧急响应服务配置的唯一标识符
+ */
+ private Long id;
+ /**
+ * 关联的商品ID
+ */
+ private Long prodId;
+ /**
+ * 可响应时间段
+ */
+ @TableField(typeHandler = StringListTypeHandler.class)
+ private List responseTimeSlots;
+
+ @Schema(description = "紧急响应时间区间设置")
+ public List prodEmergencyResponseIntervalsList;
+
+ @Schema(description = "紧急响应黑名单日期设置")
+ public List prodEmergencyResponseBlackList;
+
+}
\ No newline at end of file
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodemergencyresponse/ProdEmergencyInfoVO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodemergencyresponse/ProdEmergencyInfoVO.java
index 91f0c0c..bdf4c6d 100644
--- a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodemergencyresponse/ProdEmergencyInfoVO.java
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodemergencyresponse/ProdEmergencyInfoVO.java
@@ -1,11 +1,15 @@
package com.tashow.cloud.productapi.api.product.vo.prodemergencyresponse;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.baomidou.mybatisplus.annotation.TableField;
import com.tashow.cloud.productapi.api.product.dto.ProdEmergencyResponseIntervalsDO;
+import com.tashow.cloud.productapi.api.product.vo.prodadditionalfeedates.ProdAdditionalFeeBlackVO;
+import com.tashow.cloud.productapi.general.StringListTypeHandler;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
+import java.util.stream.Collectors;
@Schema(description = "管理后台 - 商品紧急响应服务设置 Response VO")
@Data
@@ -24,27 +28,12 @@ public class ProdEmergencyInfoVO {
/**
* 可响应时间段
*/
+ @TableField(typeHandler = StringListTypeHandler.class)
private List responseTimeSlots;
- /**
- * 黑名自定义日期
- */
- private List blacklistedDates;
- /**
- * 黑名单指定日期
- */
- private List blackAppointDates;
- /**
- * 法定节假日是否开启0:关闭1开启
- */
- private Integer blackHappy;
- /**
- * 固定休息日周末是否开启0关闭1开启
- */
- private Integer blackWeekend;
-
-
@Schema(description = "紧急响应时间区间设置")
public List prodEmergencyResponseIntervalsList;
+ @Schema(description = "紧急响应黑名单日期设置")
+ public List prodEmergencyResponseBlackList;
}
\ No newline at end of file
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodemergencyresponseintervals/ProdEmergencyResponseIntervalsPageReqVO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodemergencyresponseintervals/ProdEmergencyResponseIntervalsPageReqVO.java
index 946a61a..765754e 100644
--- a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodemergencyresponseintervals/ProdEmergencyResponseIntervalsPageReqVO.java
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodemergencyresponseintervals/ProdEmergencyResponseIntervalsPageReqVO.java
@@ -19,7 +19,7 @@ public class ProdEmergencyResponseIntervalsPageReqVO extends PageParam {
private Long configId;
@Schema(description = "响应模式名称", example = "王五")
- private String modeName;
+ private String name;
@Schema(description = "响应时间(小时)")
private BigDecimal responseHours;
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodemergencyresponseintervals/ProdEmergencyResponseIntervalsRespVO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodemergencyresponseintervals/ProdEmergencyResponseIntervalsRespVO.java
index 378a209..d2b89b9 100644
--- a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodemergencyresponseintervals/ProdEmergencyResponseIntervalsRespVO.java
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodemergencyresponseintervals/ProdEmergencyResponseIntervalsRespVO.java
@@ -23,7 +23,7 @@ public class ProdEmergencyResponseIntervalsRespVO {
@Schema(description = "响应模式名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
@ExcelProperty("响应模式名称")
- private String modeName;
+ private String name;
@Schema(description = "响应时间(小时)", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("响应时间(小时)")
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodemergencyresponseintervals/ProdEmergencyResponseIntervalsSaveReqVO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodemergencyresponseintervals/ProdEmergencyResponseIntervalsSaveReqVO.java
index aff94bb..28d9290 100644
--- a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodemergencyresponseintervals/ProdEmergencyResponseIntervalsSaveReqVO.java
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodemergencyresponseintervals/ProdEmergencyResponseIntervalsSaveReqVO.java
@@ -21,7 +21,7 @@ public class ProdEmergencyResponseIntervalsSaveReqVO {
@Schema(description = "响应模式名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
@NotEmpty(message = "响应模式名称不能为空")
- private String modeName;
+ private String name;
@Schema(description = "响应时间(小时)", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "响应时间(小时)不能为空")
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodpropvalue/ProPageReqVO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodpropvalue/ProPageReqVO.java
new file mode 100644
index 0000000..bdf0406
--- /dev/null
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodpropvalue/ProPageReqVO.java
@@ -0,0 +1,25 @@
+package com.tashow.cloud.productapi.api.product.vo.prodpropvalue;
+
+import com.tashow.cloud.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@Schema(description = "")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class ProPageReqVO extends PageParam {
+
+ /**
+ * 属性规格名称
+ */
+ private String propValue;
+
+ /**
+ * 商品id
+ */
+ private Long prodId;
+
+}
\ No newline at end of file
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodpropvalue/ProPropRecycleBinVO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodpropvalue/ProPropRecycleBinVO.java
new file mode 100644
index 0000000..8ed8587
--- /dev/null
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodpropvalue/ProPropRecycleBinVO.java
@@ -0,0 +1,32 @@
+package com.tashow.cloud.productapi.api.product.vo.prodpropvalue;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class ProPropRecycleBinVO {
+ @Schema(description = "规格值id")
+ private Long id;
+
+ /**
+ * 属性规格名称
+ */
+ private String propValue;
+ /**
+ * 关联规格属性id
+ */
+ private Long propId;
+
+ /**
+ * 还剩多少天
+ */
+ private Long remainingDays;
+ /**
+ * 删除时间
+ */
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date deleteTime;
+}
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodreservationconfig/ProdReservationInfoReqVO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodreservationconfig/ProdReservationInfoReqVO.java
new file mode 100644
index 0000000..e8b1088
--- /dev/null
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodreservationconfig/ProdReservationInfoReqVO.java
@@ -0,0 +1,84 @@
+package com.tashow.cloud.productapi.api.product.vo.prodreservationconfig;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.tashow.cloud.productapi.api.product.vo.prodadditionalfeedates.ProdAdditionalFeeBlackVO;
+import com.tashow.cloud.productapi.general.StringListTypeHandler;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Schema(description = "管理后台 - 商品紧急响应服务设置 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class ProdReservationInfoReqVO {
+
+ /**
+ * 预约配置的唯一标识符
+ */
+ @TableId
+ private Long id;
+ /**
+ * 关联的商品ID
+ */
+ private Long prodId;
+ /**
+ * 预约时段设置
+ */
+ @TableField(typeHandler = StringListTypeHandler.class)
+ private List reservationTimeSlots;
+ /**
+ * 需提前多少小时预约
+ */
+ private Integer advanceHours;
+ /**
+ * 预约日期范围 7天 10天 15天 30天
+ */
+ private Integer reservationDateRange;
+ /**
+ * 是否允许更改预约时间 1可以 0不可以
+ */
+ private Integer allowChange;
+
+ /**
+ * 时间段
+ */
+ private Integer timeSlot;
+
+ /**
+ * 更改预约时间的时间规则(如服务开始前1小时可更改)
+ */
+ private Integer changeTimeRule;
+ /**
+ * 允许更改预约时间的最大次数
+ */
+ private Integer maxChangeTimes;
+
+ /**
+ * 预约时间区间设置
+ */
+ @TableField(exist=false)
+ private TimeBookVO timeBook;
+
+ public TimeBookVO getTimeBook() {
+ if (this.timeBook == null) {
+ this.timeBook = new TimeBookVO();
+ this.timeBook.setTimeSlot(this.timeSlot);
+ this.timeBook.setReservationTimeSlots(this.reservationTimeSlots);
+ }
+ return this.timeBook;
+ }
+
+ public void setTimeBook(TimeBookVO timeBook) {
+ this.timeBook = timeBook;
+ }
+
+ @Schema(description = "预约黑名单日期设置")
+ public List prodReservationBlackList = new ArrayList<>();
+
+}
\ No newline at end of file
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodreservationconfig/ProdReservationInfoVO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodreservationconfig/ProdReservationInfoVO.java
new file mode 100644
index 0000000..de8fd53
--- /dev/null
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodreservationconfig/ProdReservationInfoVO.java
@@ -0,0 +1,103 @@
+package com.tashow.cloud.productapi.api.product.vo.prodreservationconfig;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.tashow.cloud.productapi.api.product.dto.ProdEmergencyResponseIntervalsDO;
+import com.tashow.cloud.productapi.api.product.vo.prodadditionalfeedates.ProdAdditionalFeeBlackVO;
+import com.tashow.cloud.productapi.general.StringListTypeHandler;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Schema(description = "管理后台 - 商品紧急响应服务设置 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class ProdReservationInfoVO {
+
+ /**
+ * 预约配置的唯一标识符
+ */
+ @TableId
+ private Long id;
+ /**
+ * 关联的商品ID
+ */
+ private Long prodId;
+ /**
+ * 预约时段设置
+ */
+ @TableField(typeHandler = StringListTypeHandler.class)
+ private List reservationTimeSlots;
+ /**
+ * 需提前多少小时预约
+ */
+ private Integer advanceHours;
+ /**
+ * 预约日期范围 7天 10天 15天 30天
+ */
+ private Integer reservationDateRange;
+ /**
+ * 是否允许更改预约时间 1可以 0不可以
+ */
+ private Integer allowChange;
+
+ /**
+ * 时间段
+ */
+ private Integer timeSlot;
+
+ /**
+ * 更改预约时间的时间规则(如服务开始前1小时可更改)
+ */
+ private Integer changeTimeRule;
+ /**
+ * 允许更改预约时间的最大次数
+ */
+ private Integer maxChangeTimes;
+
+ /**
+ * 预约时间区间设置
+ */
+ @TableField(exist=false)
+ private TimeBookVO timeBook;
+
+ public TimeBookVO getTimeBook() {
+ if (this.timeBook == null) {
+ this.timeBook = new TimeBookVO();
+ this.timeBook.setTimeSlot(this.timeSlot);
+ this.timeBook.setReservationTimeSlots(this.reservationTimeSlots);
+ }
+ return this.timeBook;
+ }
+
+ public void setTimeBook(TimeBookVO timeBook) {
+ this.timeBook = timeBook;
+ }
+
+ @Schema(description = "预约黑名单日期设置")
+ public List prodReservationBlackList;
+
+
+/* public List getProdReservationBlackList() {
+ if (prodReservationBlackList == null || prodReservationBlackList.isEmpty()) {
+ return prodReservationBlackList;
+ }
+ return prodReservationBlackList.stream()
+ .filter(black -> black != null && !black.isEmpty())
+ .collect(Collectors.toList());
+ }
+
+ public void setProdReservationBlackList(List prodReservationBlackList) {
+ this.prodReservationBlackList = prodReservationBlackList;
+ }*/
+
+
+
+
+
+}
\ No newline at end of file
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodweightrangeprices/ProdWeightRangePricesSaveInfoVO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodweightrangeprices/ProdWeightRangePricesSaveInfoVO.java
new file mode 100644
index 0000000..5c6766e
--- /dev/null
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/prodweightrangeprices/ProdWeightRangePricesSaveInfoVO.java
@@ -0,0 +1,23 @@
+package com.tashow.cloud.productapi.api.product.vo.prodweightrangeprices;
+
+import com.tashow.cloud.productapi.api.product.dto.ProdWeightRangePricesDO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Schema(description = "管理后台 - 体重区间价格新增/修改 Request VO")
+@Data
+public class ProdWeightRangePricesSaveInfoVO {
+
+ @Schema(description = "体重是否收费0否1是")
+ private Integer isWeightCharge;
+
+ @Schema(description = "体重配置")
+ public List prodWeightConfigList;
+
+
+}
\ No newline at end of file
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/sku/SkuRecycleBinVO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/sku/SkuRecycleBinVO.java
index f1c14fb..32ba1bc 100644
--- a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/sku/SkuRecycleBinVO.java
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/sku/SkuRecycleBinVO.java
@@ -1,9 +1,12 @@
package com.tashow.cloud.productapi.api.product.vo.sku;
+import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
import java.util.Date;
@Data
@@ -12,9 +15,13 @@ public class SkuRecycleBinVO {
private Long skuId;
/**
- * 是否显示失效规格值 0否1是
+ * 属性规格名称
*/
private String properties;
+ /**
+ * 是否显示失效规格值 0否1是
+ */
+ private String skuName;
/**
* 还剩多少天
@@ -25,4 +32,140 @@ public class SkuRecycleBinVO {
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date deleteTime;
+
+
+
+
+ @Schema(description = "商品ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "18784")
+ @ExcelProperty("商品ID")
+ private Long prodId;
+
+ @Schema(description = "别名")
+ @ExcelProperty("别名")
+ private String alias;
+
+ @Schema(description = "当前价格", example = "32405")
+ @ExcelProperty("价格")
+ private BigDecimal price;
+
+ /**
+ * 基准价
+ */
+ private BigDecimal basePrice;
+
+ @Schema(description = "最低价格", example = "5040")
+ @ExcelProperty("最低价格")
+ private BigDecimal minPrice;
+
+ @Schema(description = "最高价格", example = "11547")
+ @ExcelProperty("最高价格")
+ private BigDecimal maxPrice;
+
+ @Schema(description = "成本价", example = "28062")
+ @ExcelProperty("成本价")
+ private BigDecimal originalPrice;
+
+ @Schema(description = "市场价", example = "11547")
+ @ExcelProperty("市场价")
+ private BigDecimal marketPrice;
+
+ @Schema(description = "单位")
+ @ExcelProperty("单位")
+ private String unit;
+
+ @Schema(description = "0:主服务1:待定", example = "1")
+ @ExcelProperty("0:主服务1:待定")
+ private Integer type;
+
+ @Schema(description = "概述")
+ @ExcelProperty("概述")
+ private String overview;
+
+ @Schema(description = "库存")
+ @ExcelProperty("库存")
+ private Integer stocks;
+
+
+ @Schema(description = "总库存是0 无线库存是1")
+ @ExcelProperty("总库存是0 无线库存是1")
+ private Integer stocksFlg;
+
+ /**
+ * 锁定库存数
+ */
+ @Schema(description = "锁定库存数")
+ @ExcelProperty("锁定库存数")
+ private Integer stocksLockNum;
+
+ @Schema(description = "预警库存")
+ @ExcelProperty("预警库存")
+ private Integer warnStocks;
+
+ @Schema(description = "库存扣款时机0:付款扣1:下单扣", example = "1")
+ @ExcelProperty("库存扣款时机0:付款扣1:下单扣")
+ private Boolean stocksType;
+
+ @Schema(description = "sku编码")
+ @ExcelProperty("sku编码")
+ private String skuCode;
+
+ @Schema(description = "商品条形码", example = "14390")
+ @ExcelProperty("商品条形码")
+ private String modelId;
+
+ @Schema(description = "sku图片")
+ @ExcelProperty("sku图片")
+ private String pic;
+
+
+ @Schema(description = "商品名称", example = "芋艿")
+ @ExcelProperty("商品名称")
+ private String prodName;
+
+ @Schema(description = "版本号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("版本号")
+ private Integer version;
+
+ @Schema(description = "商品重量")
+ @ExcelProperty("商品重量")
+ private Double weight;
+
+ @Schema(description = "商品体积")
+ @ExcelProperty("商品体积")
+ private Double volume;
+
+ @Schema(description = "0 禁用 1 启用", example = "1")
+ @ExcelProperty("0 禁用 1 启用")
+ private Integer status;
+
+ @Schema(description = "0 正常 1 已被删除")
+ @ExcelProperty("0 正常 1 已被删除")
+ private Integer isDelete;
+
+ @Schema(description = "最小购买数量")
+ @ExcelProperty("最小购买数量")
+ private Integer moq;
+
+ @Schema(description = "创建时间")
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+ /**
+ * 是否上下架0下架1上架
+ */
+ private Integer isShelf;
+
+ /**
+ * 是否默认规则0否1是
+ */
+ private Integer isSpecs;
+
+ /**
+ * 服务内容
+ */
+ private String serviceContent;
+ /**
+ * 规格id 多个用逗号分隔(1,2,3)
+ */
+ private String propIds;
+
}
diff --git a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/sku/SkuSaveReqVO.java b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/sku/SkuSaveReqVO.java
index 4f2b605..9c33d7c 100644
--- a/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/sku/SkuSaveReqVO.java
+++ b/tashow-feign/tashow-product-api/src/main/java/com/tashow/cloud/productapi/api/product/vo/sku/SkuSaveReqVO.java
@@ -15,7 +15,6 @@ public class SkuSaveReqVO {
private Long skuId;
@Schema(description = "商品ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "18784")
- @NotNull(message = "商品ID不能为空")
private Long prodId;
@Schema(description = "销售属性组合字符串 格式是p1:v1;p2:v2")
@@ -86,7 +85,6 @@ public class SkuSaveReqVO {
private String prodName;
@Schema(description = "版本号", requiredMode = Schema.RequiredMode.REQUIRED)
- @NotNull(message = "版本号不能为空")
private Integer version;
@Schema(description = "商品重量")
@@ -103,6 +101,11 @@ public class SkuSaveReqVO {
@Schema(description = "最小购买数量")
private Integer moq;
+ /**
+ * 是否默认规则0否1是
+ */
+ private Integer isSpecs;
+
/**
* 扩展服务表单id
*/
diff --git a/tashow-framework/tashow-common/src/main/java/com/tashow/cloud/common/pojo/PageParam.java b/tashow-framework/tashow-common/src/main/java/com/tashow/cloud/common/pojo/PageParam.java
index 0476b67..99ffe39 100644
--- a/tashow-framework/tashow-common/src/main/java/com/tashow/cloud/common/pojo/PageParam.java
+++ b/tashow-framework/tashow-common/src/main/java/com/tashow/cloud/common/pojo/PageParam.java
@@ -14,8 +14,7 @@ import java.io.Serializable;
@Data
public class PageParam implements Serializable {
- private static final Integer PAGE_NO = 1;
- private static final Integer PAGE_SIZE = 10;
+
/**
* 每页条数 - 不分页
@@ -29,7 +28,7 @@ public class PageParam implements Serializable {
*/
@NotNull(message = "页码不能为空")
@Min(value = 1, message = "页码最小值为 1")
- private Integer pageNo = PAGE_NO;
+ private Integer pageNo = 1;
/**
* 每页条数,最大值为 100"
@@ -37,6 +36,6 @@ public class PageParam implements Serializable {
@NotNull(message = "每页条数不能为空")
@Min(value = 1, message = "每页条数最小值为 1")
@Max(value = 100, message = "每页条数最大值为 100")
- private Integer pageSize = PAGE_SIZE;
+ private Integer pageSize = 10;
}
diff --git a/tashow-framework/tashow-framework-web/pom.xml b/tashow-framework/tashow-framework-web/pom.xml
index cbe0fa2..0c14595 100644
--- a/tashow-framework/tashow-framework-web/pom.xml
+++ b/tashow-framework/tashow-framework-web/pom.xml
@@ -27,6 +27,15 @@
true
+
+ com.github.xingfudeshi
+ knife4j-openapi3-jakarta-spring-boot-starter
+
+
+ org.springdoc
+ springdoc-openapi-starter-webmvc-api
+
+
org.springframework.boot
diff --git a/tashow-gateway/pom.xml b/tashow-gateway/pom.xml
index b7206a0..791f339 100644
--- a/tashow-gateway/pom.xml
+++ b/tashow-gateway/pom.xml
@@ -61,7 +61,6 @@
-
${project.artifactId}
diff --git a/tashow-gateway/src/main/java/com/tashow/cloud/gateway/GatewayServerApplication.java b/tashow-gateway/src/main/java/com/tashow/cloud/gateway/GatewayServerApplication.java
index 252c5fa..2e1e588 100644
--- a/tashow-gateway/src/main/java/com/tashow/cloud/gateway/GatewayServerApplication.java
+++ b/tashow-gateway/src/main/java/com/tashow/cloud/gateway/GatewayServerApplication.java
@@ -8,6 +8,7 @@ public class GatewayServerApplication {
public static void main(String[] args) {
// 启动 Spring Boot 应用
SpringApplication.run(GatewayServerApplication.class, args);
+ System.out.println("网关启动成功");
}
}
diff --git a/tashow-module/pom.xml b/tashow-module/pom.xml
index 4f2213d..a55637b 100644
--- a/tashow-module/pom.xml
+++ b/tashow-module/pom.xml
@@ -15,6 +15,7 @@
tashow-module-infra
tashow-module-app
tashow-module-product
+ tashow-module-ai
tashow-module-pay
tashow-module-trade
tashow-module-member
diff --git a/tashow-module/tashow-module-ai/pom.xml b/tashow-module/tashow-module-ai/pom.xml
new file mode 100644
index 0000000..685147e
--- /dev/null
+++ b/tashow-module/tashow-module-ai/pom.xml
@@ -0,0 +1,96 @@
+
+ 4.0.0
+
+ com.tashow.cloud
+ tashow-module
+ ${revision}
+
+
+ tashow-module-ai
+ jar
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+
+
+ com.tashow.cloud
+ tashow-infra-api
+
+
+
+ com.tashow.cloud
+ tashow-framework-rpc
+
+
+ com.tashow.cloud
+ tashow-data-mybatis
+
+
+ com.tashow.cloud
+ tashow-framework-web
+
+
+ com.tashow.cloud
+ tashow-framework-env
+
+
+ com.tashow.cloud
+ tashow-framework-websocket
+
+
+ com.tashow.cloud
+ tashow-data-redis
+
+
+ com.tashow.cloud
+ tashow-data-excel
+
+
+ com.tashow.cloud
+ tashow-framework-security
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
+ com.tashow.cloud
+ tashow-framework-monitor
+
+
+
+
+
+
+
+ ${project.artifactId}
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring.boot.version}
+
+
+
+ repackage
+
+
+
+
+
+
+
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/AiServerApplication.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/AiServerApplication.java
new file mode 100644
index 0000000..c69a90e
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/AiServerApplication.java
@@ -0,0 +1,15 @@
+package com.tashow.cloud.ai;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * 应用服务启动类
+ */
+@SpringBootApplication
+public class AiServerApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(AiServerApplication.class, args);
+ }
+}
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/AiSampleController.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/AiSampleController.java
new file mode 100644
index 0000000..467e677
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/AiSampleController.java
@@ -0,0 +1,94 @@
+package com.tashow.cloud.ai.controller.admin.aisample;
+
+import com.tashow.cloud.ai.controller.admin.aisample.vo.*;
+import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleDO;
+import com.tashow.cloud.ai.service.aisample.AiSampleService;
+import com.tashow.cloud.common.pojo.CommonResult;
+import com.tashow.cloud.common.pojo.PageResult;
+import com.tashow.cloud.common.util.object.BeanUtils;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.annotation.security.PermitAll;
+import jakarta.validation.Valid;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+import static com.tashow.cloud.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 样本库")
+@RestController
+@RequestMapping("/ai/sample")
+@Validated
+public class AiSampleController {
+
+ @Resource
+ private AiSampleService aiSampleService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建样本库-上传文件")
+ @PermitAll
+// @PreAuthorize("@ss.hasPermission('ai:sample:create')")
+ public CommonResult> createAiSample(FileUploadReqVO uploadReqVO) {
+ return success(aiSampleService.createAiSample(uploadReqVO));
+ }
+
+ @PutMapping("/updates")
+ @Operation(summary = "更新样本库")
+// @PreAuthorize("@ss.hasPermission('ai:sample:update')")
+ @PermitAll
+ public CommonResult updateAiSample(@Valid @RequestBody List updateReqVO) {
+ aiSampleService.updateAiSamples(updateReqVO);
+ return success(true);
+ }
+
+ @PutMapping("/relate")
+ @Operation(summary = "添加关联标签")
+// @PreAuthorize("@ss.hasPermission('ai:sample:update')")
+ @PermitAll
+ public CommonResult relate(@Valid @RequestBody AiSampleRelateTagVO relateTagVO) {
+ aiSampleService.relate(relateTagVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/deleteRelate")
+ @Operation(summary = "删除关联标签")
+// @PreAuthorize("@ss.hasPermission('ai:sample:delete')")
+ @PermitAll
+ public CommonResult deleteRelate(@Valid @RequestBody AiSampleRelateTagVO relateTagVO) {
+ aiSampleService.deleteRelate(relateTagVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除样本库")
+ @Parameter(name = "id", description = "编号", required = true)
+// @PreAuthorize("@ss.hasPermission('ai:sample:delete')")
+ @PermitAll
+ public CommonResult deleteAiSample(@RequestParam("id") String ids) {
+ aiSampleService.deleteAiSample(ids);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得样本库")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+// @PreAuthorize("@ss.hasPermission('ai:sample:query')")
+ @PermitAll
+ public CommonResult getAiSample(@RequestParam("id") Long id) {
+ AiSampleDO aiSample = aiSampleService.getAiSample(id);
+ return success(BeanUtils.toBean(aiSample, AiSampleRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得样本库分页")
+// @PreAuthorize("@ss.hasPermission('ai:sample:query')")
+ @PermitAll
+ public CommonResult> getAiSamplePage(@Valid AiSamplePageReqVO pageReqVO) {
+ PageResult pageResult = aiSampleService.getAiSamplePage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, AiSampleRespVO.class));
+ }
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/AiSampleTagController.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/AiSampleTagController.java
new file mode 100644
index 0000000..0fe0bbf
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/AiSampleTagController.java
@@ -0,0 +1,78 @@
+package com.tashow.cloud.ai.controller.admin.aisample;
+
+import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagListRespVO;
+import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagPageReqVO;
+import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagSaveReqVO;
+import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagDO;
+import com.tashow.cloud.ai.service.aisample.AiSampleTagService;
+import com.tashow.cloud.common.pojo.CommonResult;
+import com.tashow.cloud.common.pojo.PageResult;
+import com.tashow.cloud.common.util.object.BeanUtils;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.annotation.security.PermitAll;
+import jakarta.validation.Valid;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+import static com.tashow.cloud.common.pojo.CommonResult.success;
+
+
+@Tag(name = "管理后台 - 样本标签库")
+@RestController
+@RequestMapping("/ai/sampleTag")
+@Validated
+public class AiSampleTagController {
+
+ @Resource
+ private AiSampleTagService aiSampleTagService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建样本标签库")
+// @PreAuthorize("@ss.hasPermission('ai:sampleTag:create')")
+ @PermitAll
+ public CommonResult createAiSampleTag(@Valid @RequestBody AiSampleTagSaveReqVO createReqVO) {
+ return success(aiSampleTagService.createAiSampleTag(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新样本标签库")
+// @PreAuthorize("@ss.hasPermission('ai:sampleTag:update')")
+ @PermitAll
+ public CommonResult updateAiSampleTag(@Valid @RequestBody AiSampleTagSaveReqVO updateReqVO) {
+ aiSampleTagService.updateAiSampleTag(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除样本标签库")
+ @Parameter(name = "id", description = "编号", required = true)
+// @PreAuthorize("@ss.hasPermission('ai:sampleTag:delete')")
+ @PermitAll
+ public CommonResult deleteAiSampleTag(@RequestParam("id") Long id) {
+ aiSampleTagService.deleteAiSampleTag(id);
+ return success(true);
+ }
+
+ @GetMapping("/list")
+ @Operation(summary = "获得样本标签库列表")
+// @PreAuthorize("@ss.hasPermission('ai:sampleTag:query')")
+ @PermitAll
+ public CommonResult> getAiSampleTagList() {
+ return success(BeanUtils.toBean(aiSampleTagService.getAiSampleTagList(), AiSampleTagListRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得样本标签库分页")
+// @PreAuthorize("@ss.hasPermission('ai:sampleTag:query')")
+ @PermitAll
+ public CommonResult> getAiSampleTagPage(@Valid AiSampleTagPageReqVO pageReqVO) {
+ PageResult pageResult = aiSampleTagService.getAiSampleTagPage(pageReqVO);
+ return success(pageResult);
+ }
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/AiSampleTagGroupController.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/AiSampleTagGroupController.java
new file mode 100644
index 0000000..54acc5d
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/AiSampleTagGroupController.java
@@ -0,0 +1,68 @@
+package com.tashow.cloud.ai.controller.admin.aisample;
+
+import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagGroupRespVO;
+import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagGroupSaveReqVO;
+import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagGroupDO;
+import com.tashow.cloud.ai.service.aisample.AiSampleTagGroupService;
+import com.tashow.cloud.common.pojo.CommonResult;
+import com.tashow.cloud.common.util.object.BeanUtils;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.annotation.security.PermitAll;
+import jakarta.validation.Valid;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+import static com.tashow.cloud.common.pojo.CommonResult.success;
+
+
+@Tag(name = "管理后台 - 样本标签分组库")
+@RestController
+@RequestMapping("/ai/sampleTagGroup")
+@Validated
+public class AiSampleTagGroupController {
+
+ @Resource
+ private AiSampleTagGroupService aiSampleTagGroupService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建样本标签分组库")
+// @PreAuthorize("@ss.hasPermission('ai:sampleTagGroup:create')")
+ @PermitAll
+ public CommonResult createAiSampleTagGroup(@Valid @RequestBody AiSampleTagGroupSaveReqVO createReqVO) {
+ return success(aiSampleTagGroupService.createAiSampleTagGroup(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新样本标签分组库")
+// @PreAuthorize("@ss.hasPermission('ai:sampleTagGroup:update')")
+ @PermitAll
+ public CommonResult updateAiSampleTagGroup(@Valid @RequestBody AiSampleTagGroupSaveReqVO updateReqVO) {
+ aiSampleTagGroupService.updateAiSampleTagGroup(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除样本标签分组库")
+ @Parameter(name = "id", description = "编号", required = true)
+// @PreAuthorize("@ss.hasPermission('ai:sampleTagGroup:delete')")
+ @PermitAll
+ public CommonResult deleteAiSampleTagGroup(@RequestParam("id") Long id) {
+ aiSampleTagGroupService.deleteAiSampleTagGroup(id);
+ return success(true);
+ }
+
+ @GetMapping("/list")
+ @Operation(summary = "获得样本标签分组库列表")
+// @PreAuthorize("@ss.hasPermission('ai:sampleTagGroup:query')")
+ @PermitAll
+ public CommonResult> getAiSampleTagGroupPage() {
+ List aiSampleTagGroupList = aiSampleTagGroupService.getAiSampleTagGroupList();
+ return success(BeanUtils.toBean(aiSampleTagGroupList, AiSampleTagGroupRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleFileRespVO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleFileRespVO.java
new file mode 100644
index 0000000..4158115
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleFileRespVO.java
@@ -0,0 +1,17 @@
+package com.tashow.cloud.ai.controller.admin.aisample.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 样本库 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class AiSampleFileRespVO {
+
+ @Schema(description = "文件地址")
+ private String fileUrl;
+
+ @Schema(description = "文件名称")
+ private String fileName;
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSamplePageReqVO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSamplePageReqVO.java
new file mode 100644
index 0000000..15295e2
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSamplePageReqVO.java
@@ -0,0 +1,28 @@
+package com.tashow.cloud.ai.controller.admin.aisample.vo;
+
+import com.tashow.cloud.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@Schema(description = "管理后台 - 样本库分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class AiSamplePageReqVO extends PageParam {
+
+ @Schema(description = "标签ids", example = "25839")
+ private String tagIds;
+
+ @Schema(description = "样本名称", example = "张三")
+ private String sampleName;
+
+ @Schema(description = "样本格式", example = "1")
+ private String sampleMineType;
+
+ @Schema(description = "排序", example = "正序:asc,倒序:desc")
+ private String sort;
+
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleRelateTagVO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleRelateTagVO.java
new file mode 100644
index 0000000..1902063
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleRelateTagVO.java
@@ -0,0 +1,17 @@
+package com.tashow.cloud.ai.controller.admin.aisample.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Schema(description = "管理后台 - 关联 Request VO")
+@Data
+public class AiSampleRelateTagVO {
+
+ @Schema(description = "标签id")
+ private List tagId;
+
+ @Schema(description = "样本ids")
+ private List sampleIds;
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleRespVO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleRespVO.java
new file mode 100644
index 0000000..54bf4aa
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleRespVO.java
@@ -0,0 +1,48 @@
+package com.tashow.cloud.ai.controller.admin.aisample.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagDO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Schema(description = "管理后台 - 样本库 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class AiSampleRespVO {
+
+ @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "7701")
+ private Long id;
+
+ @Schema(description = "标签列表")
+ private List tags;
+
+ @Schema(description = "样本文件地址")
+ private String sampleFilePath;
+
+ @Schema(description = "样本名称", example = "张三")
+ private String sampleName;
+
+ @Schema(description = "样本时长")
+ private String sampleTime;
+
+ @Schema(description = "样本格式", example = "1")
+ private String sampleMineType;
+
+ @Schema(description = "样本大小")
+ private String sampleSize;
+
+ @Schema(description = "样本注释", example = "随便")
+ private String remark;
+
+ @Schema(description = "创建时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private LocalDateTime createTime;
+ @Schema(description = "修改时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private LocalDateTime updateTime;
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleSaveReqVO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleSaveReqVO.java
new file mode 100644
index 0000000..e764e90
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleSaveReqVO.java
@@ -0,0 +1,19 @@
+package com.tashow.cloud.ai.controller.admin.aisample.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 样本库新增/修改 Request VO")
+@Data
+public class AiSampleSaveReqVO {
+
+ @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "7701")
+ private Long id;
+
+ @Schema(description = "样本名称", example = "张三")
+ private String sampleName;
+
+ @Schema(description = "样本注释", example = "随便")
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleTagGroupPageReqVO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleTagGroupPageReqVO.java
new file mode 100644
index 0000000..bc14d11
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleTagGroupPageReqVO.java
@@ -0,0 +1,27 @@
+package com.tashow.cloud.ai.controller.admin.aisample.vo;
+
+import com.tashow.cloud.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static com.tashow.cloud.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 样本标签分组库分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class AiSampleTagGroupPageReqVO extends PageParam {
+
+ @Schema(description = "分组名称", example = "张三")
+ private String groupName;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleTagGroupRespVO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleTagGroupRespVO.java
new file mode 100644
index 0000000..5b332fe
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleTagGroupRespVO.java
@@ -0,0 +1,26 @@
+package com.tashow.cloud.ai.controller.admin.aisample.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 样本标签分组库 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class AiSampleTagGroupRespVO {
+
+ @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "18784")
+ @ExcelProperty("主键")
+ private Long id;
+
+ @Schema(description = "分组名称", example = "张三")
+ @ExcelProperty("分组名称")
+ private String groupName;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleTagGroupSaveReqVO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleTagGroupSaveReqVO.java
new file mode 100644
index 0000000..ef4da7a
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleTagGroupSaveReqVO.java
@@ -0,0 +1,16 @@
+package com.tashow.cloud.ai.controller.admin.aisample.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+@Schema(description = "管理后台 - 样本标签分组库新增/修改 Request VO")
+@Data
+public class AiSampleTagGroupSaveReqVO {
+
+ @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "18784")
+ private Long id;
+
+ @Schema(description = "分组名称", example = "张三")
+ private String groupName;
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleTagListRespVO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleTagListRespVO.java
new file mode 100644
index 0000000..47c452a
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleTagListRespVO.java
@@ -0,0 +1,16 @@
+package com.tashow.cloud.ai.controller.admin.aisample.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 样本标签库 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class AiSampleTagListRespVO {
+
+ @Schema(description = "标签id")
+ private Long id;
+ @Schema(description = "标签名称")
+ private String tagName;
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleTagPageReqVO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleTagPageReqVO.java
new file mode 100644
index 0000000..b1adf18
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleTagPageReqVO.java
@@ -0,0 +1,20 @@
+package com.tashow.cloud.ai.controller.admin.aisample.vo;
+
+import com.tashow.cloud.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@Schema(description = "管理后台 - 样本标签库分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class AiSampleTagPageReqVO extends PageParam {
+
+ @Schema(description = "分组id")
+ private Long groupId;
+ @Schema(description = "标签名称", example = "张三")
+ private String tagName;
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleTagRespVO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleTagRespVO.java
new file mode 100644
index 0000000..db35832
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleTagRespVO.java
@@ -0,0 +1,20 @@
+package com.tashow.cloud.ai.controller.admin.aisample.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagDO;
+import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagGroupDO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Schema(description = "管理后台 - 样本标签库 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class AiSampleTagRespVO {
+
+ @Schema(description = "标签列表")
+ List tags;
+ @Schema(description = "分组列表")
+ List tagGroupDOS;
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleTagSaveReqVO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleTagSaveReqVO.java
new file mode 100644
index 0000000..4fba8a1
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/AiSampleTagSaveReqVO.java
@@ -0,0 +1,21 @@
+package com.tashow.cloud.ai.controller.admin.aisample.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Schema(description = "管理后台 - 样本标签库新增/修改 Request VO")
+@Data
+public class AiSampleTagSaveReqVO {
+
+ @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "32538")
+ private Long id;
+
+ @Schema(description = "分组ids")
+ private List groupIds;
+
+ @Schema(description = "标签名称", example = "张三")
+ private String tagName;
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/FileUploadReqVO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/FileUploadReqVO.java
new file mode 100644
index 0000000..233bfca
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/aisample/vo/FileUploadReqVO.java
@@ -0,0 +1,15 @@
+package com.tashow.cloud.ai.controller.admin.aisample.vo;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
+/** 管理后台 - 上传文件 Request VO */
+@Data
+public class FileUploadReqVO {
+
+ /** 文件附件 */
+ @NotNull(message = "文件附件不能为空")
+ private MultipartFile[] files;
+
+}
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/package-info.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/package-info.java
new file mode 100644
index 0000000..15f00f8
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/admin/package-info.java
@@ -0,0 +1 @@
+package com.tashow.cloud.ai.controller.admin;
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/DialogController.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/DialogController.java
new file mode 100644
index 0000000..70ee840
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/DialogController.java
@@ -0,0 +1,57 @@
+package com.tashow.cloud.ai.controller.app.dialog;
+
+
+import com.tashow.cloud.ai.controller.app.dialog.vo.DialogResp;
+import com.tashow.cloud.ai.controller.app.dialog.vo.TranslateReqVo;
+import com.tashow.cloud.ai.controller.app.dialog.vo.TranslateRespVo;
+import com.tashow.cloud.ai.service.dialog.AiDialogService;
+import com.tashow.cloud.common.pojo.CommonResult;
+import jakarta.annotation.Resource;
+import jakarta.annotation.security.PermitAll;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+import static com.tashow.cloud.common.pojo.CommonResult.success;
+
+/**
+ * 翻译
+ */
+@RestController
+@RequestMapping("/ai/dialog")
+@Validated
+@Slf4j
+public class DialogController {
+
+ List message = List.of("渴了", "饿了", "想睡觉", "想出去玩", "想溜达", "情绪低落", "很开心", "很伤心", "想哭");
+
+ @Resource
+ private AiDialogService aiDialogService;
+
+
+ /**
+ * 获取对话消息列表
+ */
+ @GetMapping("/getDialog")
+ @PermitAll
+ public CommonResult msList() {
+ //获取当前登录用户
+ Long userId = 1L;
+ return success(aiDialogService.getDialog(userId));
+ }
+
+
+ /**
+ * 翻译
+ */
+ @PostMapping("/translate")
+ @PermitAll
+ public CommonResult translate(@Validated TranslateReqVo fileReqVo) {
+ return success(aiDialogService.translate(fileReqVo));
+ }
+}
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/AiDialogMessageRespVo.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/AiDialogMessageRespVo.java
new file mode 100644
index 0000000..18bf676
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/AiDialogMessageRespVo.java
@@ -0,0 +1,76 @@
+package com.tashow.cloud.ai.controller.app.dialog.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+
+import static com.tashow.cloud.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+/**
+ * ai-对话消息 DO
+ *
+ * @author 芋道源码
+ */
+@Schema(description = "api - 对话 Response VO")
+@Data
+public class AiDialogMessageRespVo {
+
+ private Long id;
+ /**
+ * 对话id
+ */
+ private Long dialogId;
+ /**
+ * 内容
+ */
+ private String contentText;
+ /**
+ * 文件时长
+ */
+ private Long contentDuration;
+
+ /**
+ * 文本类型(1text,2image,3file,4audio)
+ */
+ private Integer contentType;
+ /**
+ * 对话中的顺序
+ */
+ private Integer messageOrder;
+ /**
+ * 消息状态 1正常 0删除
+ */
+ private Integer messageStatus;
+ /**
+ * 宠物id
+ */
+ private Long petId;
+ /**
+ * 宠物名称
+ */
+ private String petName;
+ /**
+ * 宠物头像
+ */
+ private String petAvatar;
+ /**
+ * 宠物类型
+ */
+ private String petType;
+ /**
+ * 翻译结果
+ */
+ private String transResult;
+ /**
+ * 翻译结果
+ */
+ private Integer transStatus;
+ /**
+ * 创建时间
+ */
+ @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private Date createTime;
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/DialogResp.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/DialogResp.java
new file mode 100644
index 0000000..ff5c266
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/DialogResp.java
@@ -0,0 +1,21 @@
+package com.tashow.cloud.ai.controller.app.dialog.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+
+@Schema(description = "api - 对话 Response VO")
+@Data
+public class DialogResp {
+
+ @Schema(description = "对话id")
+ private Long dialogId;
+ @Schema(description = "对话标题")
+ private String title;
+ @Schema(description = "对话状态")
+ private String dialogStatus;
+ @Schema(description = "对话消息内容")
+ private List messages;
+}
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/TranslateReqVo.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/TranslateReqVo.java
new file mode 100644
index 0000000..5032589
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/TranslateReqVo.java
@@ -0,0 +1,24 @@
+package com.tashow.cloud.ai.controller.app.dialog.vo;
+
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 翻译接口请求vo
+ */
+@Data
+public class TranslateReqVo {
+
+ //对话id
+ private Long dialogId;
+ //消息id
+ private Long msgId;
+
+ /** 文件附件 */
+ private MultipartFile file;
+
+ //文件时长
+ private String contentDuration;
+
+
+}
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/TranslateRespVo.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/TranslateRespVo.java
new file mode 100644
index 0000000..0da9dfc
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/dialog/vo/TranslateRespVo.java
@@ -0,0 +1,47 @@
+package com.tashow.cloud.ai.controller.app.dialog.vo;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import static com.tashow.cloud.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+/**
+ * 翻译接口结果vo
+ */
+@Data
+public class TranslateRespVo {
+
+ //消息id
+ private Long id;
+ //对话id
+ private Long dialogId;
+ //消息顺序
+ private Integer messageOrder;
+ //消息类型(1text,2file)
+ private Integer contentType;
+ //消息内容 若消息类型是file 则为文件地址
+ private String contentText;
+ //消息内容 若消息类型是file 则为文件地址
+ private String fileType;
+ //宠物类型
+ private String petType;
+ //宠物名称
+ private String petName;
+ //宠物头像
+ private String petAvatar;
+ //宠物id
+ private Long petId;
+ //翻译状态
+ private Integer transStatus;
+ //翻译结果
+ private String transResult;
+ //文件时长
+ private Long contentDuration;
+ //发送时间
+ @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private String createTime;
+
+}
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/package-info.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/package-info.java
new file mode 100644
index 0000000..80d118b
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/app/package-info.java
@@ -0,0 +1 @@
+package com.tashow.cloud.ai.controller.app;
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/package-info.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/package-info.java
new file mode 100644
index 0000000..4a424d2
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/controller/package-info.java
@@ -0,0 +1 @@
+package com.tashow.cloud.ai.controller;
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/aisample/AiSampleDO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/aisample/AiSampleDO.java
new file mode 100644
index 0000000..ae22fe3
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/aisample/AiSampleDO.java
@@ -0,0 +1,61 @@
+package com.tashow.cloud.ai.dal.dataobject.aisample;
+
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.tashow.cloud.mybatis.mybatis.core.dataobject.BaseDO;
+import lombok.*;
+
+import java.util.List;
+
+/**
+ * 样本库 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("tz_ai_sample")
+@KeySequence("tz_ai_sample_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AiSampleDO extends BaseDO {
+
+ /**
+ * 主键
+ */
+ @TableId
+ private Long id;
+
+ @TableField(exist = false)
+ private List tags;
+
+ /**
+ * 样本文件id
+ */
+ private String sampleFilePath;
+ /**
+ * 样本名称
+ */
+ private String sampleName;
+ /**
+ * 样本时长
+ */
+ private String sampleTime;
+ /**
+ * 样本格式
+ */
+ private String sampleMineType;
+ /**
+ * 样本大小
+ */
+ private Long sampleSize;
+ /**
+ * 样本注释
+ */
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/aisample/AiSampleTagDO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/aisample/AiSampleTagDO.java
new file mode 100644
index 0000000..721a716
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/aisample/AiSampleTagDO.java
@@ -0,0 +1,34 @@
+package com.tashow.cloud.ai.dal.dataobject.aisample;
+
+import lombok.*;
+import com.baomidou.mybatisplus.annotation.*;
+import com.tashow.cloud.mybatis.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 样本标签库 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("tz_ai_sample_tag")
+@KeySequence("tz_ai_sample_tag_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AiSampleTagDO extends BaseDO {
+
+ /**
+ * 主键
+ */
+ @TableId
+ private Long id;
+
+ /**
+ * 标签名称
+ */
+ private String tagName;
+
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/aisample/AiSampleTagGroupDO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/aisample/AiSampleTagGroupDO.java
new file mode 100644
index 0000000..ecf0b47
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/aisample/AiSampleTagGroupDO.java
@@ -0,0 +1,34 @@
+package com.tashow.cloud.ai.dal.dataobject.aisample;
+
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.tashow.cloud.mybatis.mybatis.core.dataobject.BaseDO;
+import lombok.*;
+
+/**
+ * 样本标签分组库 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("tz_ai_sample_tag_group")
+@KeySequence("tz_ai_sample_tag_group_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AiSampleTagGroupDO extends BaseDO {
+
+ /**
+ * 主键
+ */
+ @TableId
+ private Long id;
+ /**
+ * 分组名称
+ */
+ private String groupName;
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/aisample/AiSampleTagGroupRelateDO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/aisample/AiSampleTagGroupRelateDO.java
new file mode 100644
index 0000000..a2bcfc1
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/aisample/AiSampleTagGroupRelateDO.java
@@ -0,0 +1,36 @@
+package com.tashow.cloud.ai.dal.dataobject.aisample;
+
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * 样本标签-分组关联 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("tz_ai_sample_tag_group_relate")
+@KeySequence("tz_ai_sample_tag_group_relate_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AiSampleTagGroupRelateDO {
+
+ /**
+ * 主键
+ */
+ @TableId
+ private Long id;
+ /**
+ * 样本标签id
+ */
+ private Long sampleTagId;
+ /**
+ * 样本标签分组id
+ */
+ private Long sampleTagGroupId;
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/aisample/AiSampleTagRelateDO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/aisample/AiSampleTagRelateDO.java
new file mode 100644
index 0000000..ef5bcf0
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/aisample/AiSampleTagRelateDO.java
@@ -0,0 +1,36 @@
+package com.tashow.cloud.ai.dal.dataobject.aisample;
+
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * 样本-标签关联 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("tz_ai_sample_tag_relate")
+@KeySequence("tz_ai_sample_tag_relate_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AiSampleTagRelateDO {
+
+ /**
+ * 主键
+ */
+ @TableId
+ private Long id;
+ /**
+ * 样本id
+ */
+ private Long sampleId;
+ /**
+ * 样本标签id
+ */
+ private Long sampleTagId;
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/dialog/AiDialogDO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/dialog/AiDialogDO.java
new file mode 100644
index 0000000..e923fef
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/dialog/AiDialogDO.java
@@ -0,0 +1,40 @@
+package com.tashow.cloud.ai.dal.dataobject.dialog;
+
+import lombok.*;
+import com.baomidou.mybatisplus.annotation.*;
+import com.tashow.cloud.mybatis.mybatis.core.dataobject.BaseDO;
+
+/**
+ * ai-对话 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("tz_ai_dialog")
+@KeySequence("tz_ai_dialog_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AiDialogDO extends BaseDO {
+
+ /**
+ * 主键
+ */
+ @TableId
+ private Long id;
+ /**
+ * 对话标题
+ */
+ private String title;
+ /**
+ * 用户id
+ */
+ private Long userId;
+ /**
+ * 对话状态(1active, 2archived, 3deleted)
+ */
+ private Integer dialogStatus;
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/dialog/AiDialogMessageDO.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/dialog/AiDialogMessageDO.java
new file mode 100644
index 0000000..cc26722
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/dialog/AiDialogMessageDO.java
@@ -0,0 +1,94 @@
+package com.tashow.cloud.ai.dal.dataobject.dialog;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.*;
+
+import java.time.LocalDateTime;
+
+/**
+ * ai-对话消息 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("tz_ai_dialog_message")
+@KeySequence("tz_ai_dialog_message_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AiDialogMessageDO {
+
+ /**
+ * 主键
+ */
+ @TableId
+ private Long id;
+ /**
+ * 对话id
+ */
+ private Long dialogId;
+ /**
+ * 内容
+ */
+ private String contentText;
+ /**
+ * 文件名
+ */
+ private String fileName;
+ /**
+ * 文件类型
+ */
+ private String fileType;
+ /**
+ * 文件时长
+ */
+ private Long contentDuration;
+
+ /**
+ * 文本类型(1text,2image,3file,4audio)
+ */
+ private Integer contentType;
+ /**
+ * 对话中的顺序
+ */
+ private Integer messageOrder;
+ /**
+ * 消息状态 1正常 0删除
+ */
+ private Integer messageStatus;
+ /**
+ * 宠物id
+ */
+ private Long petId;
+ /**
+ * 宠物名称
+ */
+ private String petName;
+ /**
+ * 宠物头像
+ */
+ private String petAvatar;
+ /**
+ * 宠物类型
+ */
+ private String petType;
+ /**
+ * 原始结果
+ */
+ private String sourceResult;
+ /**
+ * 翻译结果
+ */
+ private String transResult;
+ /**
+ * 翻译结果
+ */
+ private Integer transStatus;
+ /**
+ * 创建时间
+ */
+ @TableField(fill = FieldFill.INSERT)
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/package-info.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/package-info.java
new file mode 100644
index 0000000..0a55678
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/dataobject/package-info.java
@@ -0,0 +1,2 @@
+package com.tashow.cloud.ai.dal.dataobject;
+// 数据库对象
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/aisample/AiSampleMapper.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/aisample/AiSampleMapper.java
new file mode 100644
index 0000000..cfed0f5
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/aisample/AiSampleMapper.java
@@ -0,0 +1,43 @@
+package com.tashow.cloud.ai.dal.mysql.aisample;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSamplePageReqVO;
+import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleDO;
+import com.tashow.cloud.common.pojo.PageResult;
+import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
+import com.tashow.cloud.mybatis.mybatis.core.query.LambdaQueryWrapperX;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+/**
+ * 样本库 Mapper
+ */
+@Mapper
+public interface AiSampleMapper extends BaseMapperX {
+
+ default PageResult selectPage(AiSamplePageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .likeIfPresent(AiSampleDO::getSampleName, reqVO.getSampleName())
+ .orderByDesc(AiSampleDO::getId));
+ }
+
+
+ @Select("")
+ IPage getAiSamplePage(Page objectPage, AiSamplePageReqVO pageReqVO);
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/aisample/AiSampleTagGroupMapper.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/aisample/AiSampleTagGroupMapper.java
new file mode 100644
index 0000000..9f0404a
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/aisample/AiSampleTagGroupMapper.java
@@ -0,0 +1,25 @@
+package com.tashow.cloud.ai.dal.mysql.aisample;
+
+import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagGroupPageReqVO;
+import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagGroupDO;
+import com.tashow.cloud.common.pojo.PageResult;
+import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
+import com.tashow.cloud.mybatis.mybatis.core.query.LambdaQueryWrapperX;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 样本标签分组库 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface AiSampleTagGroupMapper extends BaseMapperX {
+
+ default PageResult selectPage(AiSampleTagGroupPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .likeIfPresent(AiSampleTagGroupDO::getGroupName, reqVO.getGroupName())
+ .betweenIfPresent(AiSampleTagGroupDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(AiSampleTagGroupDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/aisample/AiSampleTagGroupRelateMapper.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/aisample/AiSampleTagGroupRelateMapper.java
new file mode 100644
index 0000000..cdf2216
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/aisample/AiSampleTagGroupRelateMapper.java
@@ -0,0 +1,15 @@
+package com.tashow.cloud.ai.dal.mysql.aisample;
+
+import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagGroupRelateDO;
+import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 样本标签-分组关联 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface AiSampleTagGroupRelateMapper extends BaseMapperX {
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/aisample/AiSampleTagMapper.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/aisample/AiSampleTagMapper.java
new file mode 100644
index 0000000..9056d3d
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/aisample/AiSampleTagMapper.java
@@ -0,0 +1,42 @@
+package com.tashow.cloud.ai.dal.mysql.aisample;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagPageReqVO;
+import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagDO;
+import com.tashow.cloud.common.pojo.PageResult;
+import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
+import com.tashow.cloud.mybatis.mybatis.core.query.LambdaQueryWrapperX;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+/**
+ * 样本标签库 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface AiSampleTagMapper extends BaseMapperX {
+
+ default PageResult selectPage(AiSampleTagPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .orderByDesc(AiSampleTagDO::getId));
+ }
+
+ @Select("")
+ IPage getAiSampleTagPage(Page page, AiSampleTagPageReqVO pageReqVO);
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/aisample/AiSampleTagRelateMapper.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/aisample/AiSampleTagRelateMapper.java
new file mode 100644
index 0000000..90e0336
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/aisample/AiSampleTagRelateMapper.java
@@ -0,0 +1,16 @@
+package com.tashow.cloud.ai.dal.mysql.aisample;
+
+import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagRelateDO;
+import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 样本-标签关联 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface AiSampleTagRelateMapper extends BaseMapperX {
+
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/dialog/AiDialogMapper.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/dialog/AiDialogMapper.java
new file mode 100644
index 0000000..22c0cc2
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/dialog/AiDialogMapper.java
@@ -0,0 +1,15 @@
+package com.tashow.cloud.ai.dal.mysql.dialog;
+
+import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogDO;
+import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * ai-对话 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface AiDialogMapper extends BaseMapperX {
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/dialog/AiDialogMessageMapper.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/dialog/AiDialogMessageMapper.java
new file mode 100644
index 0000000..590ec3c
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/dialog/AiDialogMessageMapper.java
@@ -0,0 +1,16 @@
+package com.tashow.cloud.ai.dal.mysql.dialog;
+
+import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogMessageDO;
+import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * ai-对话消息 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface AiDialogMessageMapper extends BaseMapperX {
+
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/package-info.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/package-info.java
new file mode 100644
index 0000000..dc66f15
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/mysql/package-info.java
@@ -0,0 +1 @@
+package com.tashow.cloud.ai.dal.mysql;
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/package-info.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/package-info.java
new file mode 100644
index 0000000..91dc35a
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/dal/package-info.java
@@ -0,0 +1 @@
+package com.tashow.cloud.ai.dal;
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/framework/package-info.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/framework/package-info.java
new file mode 100644
index 0000000..c73734f
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/framework/package-info.java
@@ -0,0 +1 @@
+package com.tashow.cloud.ai.framework;
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/framework/rpc/config/RpcConfiguration.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/framework/rpc/config/RpcConfiguration.java
new file mode 100644
index 0000000..4706ae2
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/framework/rpc/config/RpcConfiguration.java
@@ -0,0 +1,10 @@
+package com.tashow.cloud.ai.framework.rpc.config;
+
+import com.tashow.cloud.infraapi.api.file.FileApi;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration(proxyBeanMethods = false)
+@EnableFeignClients(clients = {FileApi.class})
+public class RpcConfiguration {
+}
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/framework/rpc/package-info.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/framework/rpc/package-info.java
new file mode 100644
index 0000000..a7f5d31
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/framework/rpc/package-info.java
@@ -0,0 +1 @@
+package com.tashow.cloud.ai.framework.rpc;
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/framework/security/config/SecurityConfiguration.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/framework/security/config/SecurityConfiguration.java
new file mode 100644
index 0000000..1fb9c69
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/framework/security/config/SecurityConfiguration.java
@@ -0,0 +1,44 @@
+package com.tashow.cloud.ai.framework.security.config;
+
+import com.tashow.cloud.infraapi.enums.ApiConstants;
+import com.tashow.cloud.security.security.config.AuthorizeRequestsCustomizer;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configurers.AuthorizeHttpRequestsConfigurer;
+
+/**
+ * Infra 模块的 Security 配置
+ */
+@Configuration(proxyBeanMethods = false, value = "infraSecurityConfiguration")
+public class SecurityConfiguration {
+
+ @Value("${spring.boot.admin.context-path:''}")
+ private String adminSeverContextPath;
+
+ @Bean("infraAuthorizeRequestsCustomizer")
+ public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() {
+ return new AuthorizeRequestsCustomizer() {
+ @Override
+ public void customize(AuthorizeHttpRequestsConfigurer.AuthorizationManagerRequestMatcherRegistry registry) {
+ // Spring Boot Actuator 的安全配置
+ registry.requestMatchers("/actuator").permitAll()
+ .requestMatchers("/actuator/**").permitAll();
+ // Druid 监控
+ registry.requestMatchers("/druid/**").permitAll();
+ // Spring Boot Admin Server 的安全配置
+ registry.requestMatchers(adminSeverContextPath).permitAll()
+ .requestMatchers(adminSeverContextPath + "/**").permitAll();
+ // 文件读取
+ registry.requestMatchers(buildAdminApi("/infra/file/*/get/**")).permitAll();
+
+ // TODO 芋艿:这个每个项目都需要重复配置,得捉摸有没通用的方案
+ // RPC 服务的安全配置
+ registry.requestMatchers(ApiConstants.PREFIX + "/**").permitAll();
+ }
+
+ };
+ }
+
+}
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/framework/security/core/package-info.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/framework/security/core/package-info.java
new file mode 100644
index 0000000..c1774ae
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/framework/security/core/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * 占位
+ */
+package com.tashow.cloud.ai.framework.security.core;
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleService.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleService.java
new file mode 100644
index 0000000..8e9d3c3
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleService.java
@@ -0,0 +1,73 @@
+package com.tashow.cloud.ai.service.aisample;
+
+import com.tashow.cloud.ai.controller.admin.aisample.vo.*;
+import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleDO;
+import com.tashow.cloud.common.pojo.PageResult;
+import jakarta.validation.Valid;
+
+import java.util.List;
+
+/**
+ * 样本库 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface AiSampleService {
+
+ /**
+ * 创建样本库
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ List createAiSample(@Valid FileUploadReqVO createReqVO);
+
+ /**
+ * 更新样本库
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateAiSample(@Valid AiSampleSaveReqVO updateReqVO);
+
+ /**
+ * 批量更新
+ * @param updateReqVO
+ */
+ void updateAiSamples(@Valid List updateReqVO);
+
+ /**
+ * 关联标签
+ * @param relateTagVO
+ */
+ void relate(@Valid AiSampleRelateTagVO relateTagVO);
+ /**
+ * 删除样本库
+ *
+ * @param id 编号
+ */
+ void deleteAiSample(String id);
+
+ /**
+ * 删除样本库
+ * @param relateTagVO 编号
+ */
+ void deleteRelate(AiSampleRelateTagVO relateTagVO);
+
+ /**
+ * 获得样本库
+ *
+ * @param id 编号
+ * @return 样本库
+ */
+ AiSampleDO getAiSample(Long id);
+
+ /**
+ * 获得样本库分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 样本库分页
+ */
+ PageResult getAiSamplePage(AiSamplePageReqVO pageReqVO);
+
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleServiceImpl.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleServiceImpl.java
new file mode 100644
index 0000000..2c11b88
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleServiceImpl.java
@@ -0,0 +1,180 @@
+package com.tashow.cloud.ai.service.aisample;
+
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.tashow.cloud.ai.controller.admin.aisample.vo.*;
+import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleDO;
+import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagDO;
+import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagRelateDO;
+import com.tashow.cloud.ai.dal.mysql.aisample.AiSampleMapper;
+import com.tashow.cloud.ai.dal.mysql.aisample.AiSampleTagMapper;
+import com.tashow.cloud.ai.dal.mysql.aisample.AiSampleTagRelateMapper;
+import com.tashow.cloud.common.pojo.PageResult;
+import com.tashow.cloud.common.util.object.BeanUtils;
+import com.tashow.cloud.infraapi.api.file.FileApi;
+import com.tashow.cloud.mybatis.mybatis.core.util.MyBatisUtils;
+import jakarta.annotation.Resource;
+import lombok.SneakyThrows;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 样本库 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class AiSampleServiceImpl implements AiSampleService {
+
+ @Resource
+ private AiSampleMapper aiSampleMapper;
+ @Resource
+ private AiSampleTagMapper aiSampleTagMapper;
+ @Resource
+ private AiSampleTagRelateMapper aiSampleTagRelateMapper;
+ @Resource
+ private FileApi fileApi;
+ @Value("file-server")
+ private String fileServer;
+
+ @Override
+ @SneakyThrows
+ public List createAiSample(FileUploadReqVO uploadReqVO) {
+ //返回图片路径
+ List urls = new ArrayList<>();
+ /* 调用文件上传服务*/
+ for (MultipartFile file : uploadReqVO.getFiles()) {
+ //返回上传结果
+ String file1 = fileServer + fileApi.createFile(file.getBytes());
+ //保存样本信息
+ AiSampleDO aiSampleDO = new AiSampleDO();
+ aiSampleDO.setSampleFilePath(file1);
+ aiSampleDO.setSampleName(file.getOriginalFilename());
+ aiSampleDO.setSampleMineType(file.getContentType());
+ aiSampleDO.setSampleSize(file.getSize());
+ aiSampleMapper.insert(aiSampleDO);
+ urls.add(new AiSampleFileRespVO().setFileUrl(file1).setFileName(file.getOriginalFilename()));
+ }
+ // 返回
+ return urls;
+ }
+
+ @Override
+ public void updateAiSample(AiSampleSaveReqVO updateReqVO) {
+ // 校验存在
+ validateAiSampleExists(updateReqVO.getId());
+ // 更新
+ AiSampleDO updateObj = BeanUtils.toBean(updateReqVO, AiSampleDO.class);
+ aiSampleMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void updateAiSamples(List updateReqVO) {
+ aiSampleMapper.updateBatch(BeanUtils.toBean(updateReqVO, AiSampleDO.class));
+ }
+
+ @Override
+ public void relate(AiSampleRelateTagVO relateTagVO) {
+ List tagRelateDOS = new ArrayList<>();
+ for (Long sampleId : relateTagVO.getSampleIds()) {
+ for (Long tagId : relateTagVO.getTagId()) {
+ AiSampleTagRelateDO relateDO = aiSampleTagRelateMapper.selectOne(
+ new LambdaQueryWrapper()
+ .eq(AiSampleTagRelateDO::getSampleId, sampleId)
+ .eq(AiSampleTagRelateDO::getSampleTagId, tagId) );
+ if (relateDO== null){
+ relateDO = new AiSampleTagRelateDO();
+ relateDO.setSampleId(sampleId);
+ relateDO.setSampleTagId(tagId);
+ tagRelateDOS.add(relateDO);
+ }
+ }
+ }
+ if (!tagRelateDOS.isEmpty()){
+ aiSampleTagRelateMapper.insertBatch(tagRelateDOS);
+ }
+ }
+
+ @Override
+ public void deleteRelate(AiSampleRelateTagVO relateTagVO) {
+ List tagRelateIds = new ArrayList<>();
+ for (Long sampleId : relateTagVO.getSampleIds()) {
+ for (Long tagId : relateTagVO.getTagId()) {
+ AiSampleTagRelateDO relateDO = aiSampleTagRelateMapper.selectOne(
+ new LambdaQueryWrapper()
+ .eq(AiSampleTagRelateDO::getSampleId, sampleId)
+ .eq(AiSampleTagRelateDO::getSampleTagId, tagId)
+ );
+ if (relateDO != null) {
+ tagRelateIds.add(relateDO.getId());
+ }
+ }
+
+ }
+ if (!tagRelateIds.isEmpty()) {
+ aiSampleTagRelateMapper.deleteBatchIds(tagRelateIds);
+ }
+ }
+
+ @Override
+ public void deleteAiSample(String ids) {
+ // 删除
+ aiSampleMapper.deleteByIds(Arrays.asList(ids.split(StrUtil.COMMA)));
+ }
+
+ private void validateAiSampleExists(Long id) {
+ if (aiSampleMapper.selectById(id) == null) {
+// throw exception(AI_SAMPLE_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public AiSampleDO getAiSample(Long id) {
+ AiSampleDO aiSampleDO = aiSampleMapper.selectById(id);
+ aiSampleDO.setSampleFilePath(aiSampleDO.getSampleFilePath());
+ //先获取关联的标签id
+ List tagRelateDOS = aiSampleTagRelateMapper.selectList(new LambdaQueryWrapper().eq(AiSampleTagRelateDO::getSampleId, id));
+ List tagIds = tagRelateDOS.stream().map(AiSampleTagRelateDO::getSampleTagId).toList();
+ aiSampleDO.setTags(aiSampleTagMapper.selectList(new LambdaQueryWrapper().in(AiSampleTagDO::getId, tagIds)));
+ return aiSampleDO;
+ }
+
+ @Override
+ public PageResult getAiSamplePage(AiSamplePageReqVO pageReqVO) {
+// PageResult aiSampleDOPageResult = aiSampleMapper.selectPage(pageReqVO);
+ IPage aiSampleDOPageResult = aiSampleMapper.getAiSamplePage(MyBatisUtils.buildPage(pageReqVO),pageReqVO);
+ //根据样本id获取关联的标签id
+ List sampleIds = aiSampleDOPageResult.getRecords().stream().map(AiSampleDO::getId).toList();
+ List tagRelateDOS = aiSampleTagRelateMapper.selectList(
+ new LambdaQueryWrapper()
+ .in(!sampleIds.isEmpty(), AiSampleTagRelateDO::getSampleId, sampleIds));
+ List tagIds = tagRelateDOS.stream().map(AiSampleTagRelateDO::getSampleTagId).toList();
+ //获取标签信息
+ List aiSampleTagDOS = aiSampleTagMapper.selectList(
+ new LambdaQueryWrapper()
+ .in(!tagIds.isEmpty(), AiSampleTagDO::getId, tagIds));
+
+ //封装标签信息
+ for (AiSampleDO aiSampleDO : aiSampleDOPageResult.getRecords()) {
+ List list = tagRelateDOS.stream()
+ .filter(a -> ObjectUtil.equals(aiSampleDO.getId(), a.getSampleId()))
+ .toList();
+ Object[] tagsId = list.stream().map(AiSampleTagRelateDO::getSampleTagId).toArray();
+ List list1 = aiSampleTagDOS.stream().filter(a -> ArrayUtil.containsAny(tagsId, a.getId())).toList();
+ aiSampleDO.setTags(list1);
+ aiSampleDO.setSampleFilePath(aiSampleDO.getSampleFilePath());
+ }
+ return new PageResult<>(aiSampleDOPageResult.getRecords(), aiSampleDOPageResult.getTotal());
+ }
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleTagGroupRelateService.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleTagGroupRelateService.java
new file mode 100644
index 0000000..82081a0
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleTagGroupRelateService.java
@@ -0,0 +1,11 @@
+package com.tashow.cloud.ai.service.aisample;
+
+/**
+ * 样本标签-分组关联 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface AiSampleTagGroupRelateService {
+
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleTagGroupRelateServiceImpl.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleTagGroupRelateServiceImpl.java
new file mode 100644
index 0000000..4b88f1e
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleTagGroupRelateServiceImpl.java
@@ -0,0 +1,16 @@
+package com.tashow.cloud.ai.service.aisample;
+
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+/**
+ * 样本标签-分组关联 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class AiSampleTagGroupRelateServiceImpl implements AiSampleTagGroupRelateService {
+
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleTagGroupService.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleTagGroupService.java
new file mode 100644
index 0000000..fa37ae6
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleTagGroupService.java
@@ -0,0 +1,62 @@
+package com.tashow.cloud.ai.service.aisample;
+
+import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagGroupPageReqVO;
+import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagGroupRespVO;
+import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagGroupSaveReqVO;
+import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagGroupDO;
+import com.tashow.cloud.common.pojo.PageResult;
+import jakarta.validation.Valid;
+
+import java.util.List;
+
+/**
+ * 样本标签分组库 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface AiSampleTagGroupService {
+
+ /**
+ * 创建样本标签分组库
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createAiSampleTagGroup(@Valid AiSampleTagGroupSaveReqVO createReqVO);
+
+ /**
+ * 更新样本标签分组库
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateAiSampleTagGroup(@Valid AiSampleTagGroupSaveReqVO updateReqVO);
+
+ /**
+ * 删除样本标签分组库
+ *
+ * @param id 编号
+ */
+ void deleteAiSampleTagGroup(Long id);
+
+ /**
+ * 获得样本标签分组库
+ *
+ * @param id 编号
+ * @return 样本标签分组库
+ */
+ AiSampleTagGroupDO getAiSampleTagGroup(Long id);
+
+ /**
+ * 获得样本标签分组库分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 样本标签分组库分页
+ */
+ PageResult getAiSampleTagGroupPage(AiSampleTagGroupPageReqVO pageReqVO);
+
+ /**
+ * 获取标签分组列表
+ * @return
+ */
+ List getAiSampleTagGroupList();
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleTagGroupServiceImpl.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleTagGroupServiceImpl.java
new file mode 100644
index 0000000..b80e71a
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleTagGroupServiceImpl.java
@@ -0,0 +1,74 @@
+package com.tashow.cloud.ai.service.aisample;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagGroupPageReqVO;
+import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagGroupSaveReqVO;
+import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagGroupDO;
+import com.tashow.cloud.ai.dal.mysql.aisample.AiSampleTagGroupMapper;
+import com.tashow.cloud.common.pojo.PageResult;
+import com.tashow.cloud.common.util.object.BeanUtils;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.List;
+
+/**
+ * 样本标签分组库 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class AiSampleTagGroupServiceImpl implements AiSampleTagGroupService {
+
+ @Resource
+ private AiSampleTagGroupMapper aiSampleTagGroupMapper;
+
+ @Override
+ public Long createAiSampleTagGroup(AiSampleTagGroupSaveReqVO createReqVO) {
+ // 插入
+ AiSampleTagGroupDO aiSampleTagGroup = BeanUtils.toBean(createReqVO, AiSampleTagGroupDO.class);
+ aiSampleTagGroupMapper.insert(aiSampleTagGroup);
+ // 返回
+ return aiSampleTagGroup.getId();
+ }
+
+ @Override
+ public void updateAiSampleTagGroup(AiSampleTagGroupSaveReqVO updateReqVO) {
+ // 校验存在
+ validateAiSampleTagGroupExists(updateReqVO.getId());
+ // 更新
+ AiSampleTagGroupDO updateObj = BeanUtils.toBean(updateReqVO, AiSampleTagGroupDO.class);
+ aiSampleTagGroupMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteAiSampleTagGroup(Long id) {
+ // 校验存在
+ validateAiSampleTagGroupExists(id);
+ // 删除
+ aiSampleTagGroupMapper.deleteById(id);
+ }
+
+ private void validateAiSampleTagGroupExists(Long id) {
+ if (aiSampleTagGroupMapper.selectById(id) == null) {
+// throw exception(AI_SAMPLE_TAG_GROUP_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public AiSampleTagGroupDO getAiSampleTagGroup(Long id) {
+ return aiSampleTagGroupMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getAiSampleTagGroupPage(AiSampleTagGroupPageReqVO pageReqVO) {
+ return aiSampleTagGroupMapper.selectPage(pageReqVO);
+ }
+
+ @Override
+ public List getAiSampleTagGroupList() {
+ return aiSampleTagGroupMapper.selectList(new LambdaQueryWrapper().orderByDesc(AiSampleTagGroupDO::getId));
+ }
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleTagRelateService.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleTagRelateService.java
new file mode 100644
index 0000000..d0432d0
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleTagRelateService.java
@@ -0,0 +1,11 @@
+package com.tashow.cloud.ai.service.aisample;
+
+/**
+ * 样本-标签关联 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface AiSampleTagRelateService {
+
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleTagRelateServiceImpl.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleTagRelateServiceImpl.java
new file mode 100644
index 0000000..29f7360
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleTagRelateServiceImpl.java
@@ -0,0 +1,16 @@
+package com.tashow.cloud.ai.service.aisample;
+
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+/**
+ * 样本-标签关联 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class AiSampleTagRelateServiceImpl implements AiSampleTagRelateService {
+
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleTagService.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleTagService.java
new file mode 100644
index 0000000..2e2a48c
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleTagService.java
@@ -0,0 +1,61 @@
+package com.tashow.cloud.ai.service.aisample;
+
+import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagPageReqVO;
+import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagSaveReqVO;
+import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagDO;
+import com.tashow.cloud.common.pojo.PageResult;
+import jakarta.validation.Valid;
+
+import java.util.List;
+
+/**
+ * 样本标签库 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface AiSampleTagService {
+
+ /**
+ * 创建样本标签库
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createAiSampleTag(@Valid AiSampleTagSaveReqVO createReqVO);
+
+ /**
+ * 更新样本标签库
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateAiSampleTag(@Valid AiSampleTagSaveReqVO updateReqVO);
+
+ /**
+ * 删除样本标签库
+ *
+ * @param id 编号
+ */
+ void deleteAiSampleTag(Long id);
+
+ /**
+ * 获得样本标签库
+ *
+ * @param id 编号
+ * @return 样本标签库
+ */
+ AiSampleTagDO getAiSampleTag(Long id);
+
+ /**
+ * 获得样本标签库分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 样本标签库分页
+ */
+ PageResult getAiSampleTagPage(AiSampleTagPageReqVO pageReqVO);
+
+ /**
+ * 获取样本标签列表
+ * @return
+ */
+ List getAiSampleTagList();
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleTagServiceImpl.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleTagServiceImpl.java
new file mode 100644
index 0000000..51c2369
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/aisample/AiSampleTagServiceImpl.java
@@ -0,0 +1,103 @@
+package com.tashow.cloud.ai.service.aisample;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagPageReqVO;
+import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagSaveReqVO;
+import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagDO;
+import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagGroupRelateDO;
+import com.tashow.cloud.ai.dal.mysql.aisample.AiSampleTagGroupRelateMapper;
+import com.tashow.cloud.ai.dal.mysql.aisample.AiSampleTagMapper;
+import com.tashow.cloud.common.pojo.PageResult;
+import com.tashow.cloud.common.util.object.BeanUtils;
+import com.tashow.cloud.mybatis.mybatis.core.util.MyBatisUtils;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 样本标签库 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class AiSampleTagServiceImpl implements AiSampleTagService {
+
+ @Resource
+ private AiSampleTagMapper aiSampleTagMapper;
+ @Resource
+ private AiSampleTagGroupRelateMapper tagGroupRelateMapper;
+
+ @Override
+ public Long createAiSampleTag(AiSampleTagSaveReqVO createReqVO) {
+ // 插入
+ AiSampleTagDO aiSampleTag = BeanUtils.toBean(createReqVO, AiSampleTagDO.class);
+ aiSampleTagMapper.insert(aiSampleTag);
+ //插入关联
+ List tagGroupRelateDOS = new ArrayList<>();
+ for (Long groupId : createReqVO.getGroupIds()) {
+ AiSampleTagGroupRelateDO tagGroupRelateDO = new AiSampleTagGroupRelateDO();
+ tagGroupRelateDO.setSampleTagId(createReqVO.getId());
+ tagGroupRelateDO.setSampleTagGroupId(groupId);
+ tagGroupRelateDO.setSampleTagId(aiSampleTag.getId());
+ tagGroupRelateDOS.add(tagGroupRelateDO);
+ }
+ tagGroupRelateMapper.insertBatch(tagGroupRelateDOS);
+ // 返回
+ return aiSampleTag.getId();
+ }
+
+ @Override
+ public void updateAiSampleTag(AiSampleTagSaveReqVO updateReqVO) {
+ // 校验存在
+ validateAiSampleTagExists(updateReqVO.getId());
+ // 更新
+ AiSampleTagDO updateObj = BeanUtils.toBean(updateReqVO, AiSampleTagDO.class);
+ aiSampleTagMapper.updateById(updateObj);
+ //删除所有关联
+ tagGroupRelateMapper.delete(new LambdaQueryWrapper().eq(AiSampleTagGroupRelateDO::getSampleTagId, updateReqVO.getId()));
+ //插入关联
+ List tagGroupRelateDOS = new ArrayList<>();
+ for (Long groupId : updateReqVO.getGroupIds()) {
+ AiSampleTagGroupRelateDO tagGroupRelateDO = new AiSampleTagGroupRelateDO();
+ tagGroupRelateDO.setSampleTagId(updateReqVO.getId());
+ tagGroupRelateDO.setSampleTagGroupId(groupId);
+ tagGroupRelateDOS.add(tagGroupRelateDO);
+ }
+ tagGroupRelateMapper.insertBatch(tagGroupRelateDOS);
+ }
+
+ @Override
+ public void deleteAiSampleTag(Long id) {
+ // 校验存在
+ validateAiSampleTagExists(id);
+ // 删除
+ aiSampleTagMapper.deleteById(id);
+ }
+
+ private void validateAiSampleTagExists(Long id) {
+ if (aiSampleTagMapper.selectById(id) == null) {
+// throw exception(AI_SAMPLE_TAG_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public AiSampleTagDO getAiSampleTag(Long id) {
+ return aiSampleTagMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getAiSampleTagPage(AiSampleTagPageReqVO pageReqVO) {
+ IPage prodPageList = aiSampleTagMapper.getAiSampleTagPage(MyBatisUtils.buildPage(pageReqVO),pageReqVO);
+ return new PageResult<>(prodPageList.getRecords(), prodPageList.getTotal());
+ }
+
+ @Override
+ public List getAiSampleTagList() {
+ return aiSampleTagMapper.selectList(new LambdaQueryWrapper().orderByDesc(AiSampleTagDO::getId));
+ }
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogMessageService.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogMessageService.java
new file mode 100644
index 0000000..d190880
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogMessageService.java
@@ -0,0 +1,14 @@
+package com.tashow.cloud.ai.service.dialog;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogMessageDO;
+
+/**
+ * ai-对话消息 Service 接口
+ *
+ * @author lwq
+ */
+public interface AiDialogMessageService extends IService {
+
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogMessageServiceImpl.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogMessageServiceImpl.java
new file mode 100644
index 0000000..77d9a95
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogMessageServiceImpl.java
@@ -0,0 +1,20 @@
+package com.tashow.cloud.ai.service.dialog;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogMessageDO;
+import com.tashow.cloud.ai.dal.mysql.dialog.AiDialogMessageMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+
+/**
+ * ai-对话消息 Service 实现类
+ *
+ * @author lwq
+ */
+@Service
+@Validated
+public class AiDialogMessageServiceImpl extends ServiceImpl implements AiDialogMessageService {
+
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogService.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogService.java
new file mode 100644
index 0000000..05b2a9b
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogService.java
@@ -0,0 +1,20 @@
+package com.tashow.cloud.ai.service.dialog;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.tashow.cloud.ai.controller.app.dialog.vo.DialogResp;
+import com.tashow.cloud.ai.controller.app.dialog.vo.TranslateReqVo;
+import com.tashow.cloud.ai.controller.app.dialog.vo.TranslateRespVo;
+import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogDO;
+
+/**
+ * ai-对话 Service 接口
+ *
+ * @author lwq
+ */
+public interface AiDialogService extends IService {
+
+
+ DialogResp getDialog(Long userId);
+
+ TranslateRespVo translate(TranslateReqVo fileReqVo);
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogServiceImpl.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogServiceImpl.java
new file mode 100644
index 0000000..ef4fb19
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/dialog/AiDialogServiceImpl.java
@@ -0,0 +1,195 @@
+package com.tashow.cloud.ai.service.dialog;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.tashow.cloud.ai.controller.app.dialog.vo.AiDialogMessageRespVo;
+import com.tashow.cloud.ai.controller.app.dialog.vo.DialogResp;
+import com.tashow.cloud.ai.controller.app.dialog.vo.TranslateReqVo;
+import com.tashow.cloud.ai.controller.app.dialog.vo.TranslateRespVo;
+import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogDO;
+import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogMessageDO;
+import com.tashow.cloud.ai.dal.mysql.dialog.AiDialogMapper;
+import com.tashow.cloud.ai.dal.mysql.dialog.AiDialogMessageMapper;
+import com.tashow.cloud.common.util.object.BeanUtils;
+import com.tashow.cloud.infraapi.api.file.FileApi;
+import jakarta.annotation.Resource;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.sound.sampled.AudioInputStream;
+import javax.sound.sampled.AudioSystem;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.time.LocalDateTime;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * ai-对话 Service 实现类
+ *
+ * @author lwq
+ */
+@Service
+@Validated
+@Slf4j
+public class AiDialogServiceImpl extends ServiceImpl implements AiDialogService {
+
+ @Resource
+ private AiDialogMessageMapper aiDialogMessageMapper;
+ @Value("${translate-server}")
+ private String translateServer;
+ @Value("${file-server}")
+ private String fileServer;
+ @Resource
+ private FileApi fileApi;
+
+
+ @Override
+ public DialogResp getDialog(Long userId) {
+ AiDialogDO aiDialogDO = this.getOne(new LambdaQueryWrapper().eq(AiDialogDO::getUserId, userId));
+ if (aiDialogDO == null) {
+ aiDialogDO = new AiDialogDO();
+ aiDialogDO.setDialogStatus(1);
+ aiDialogDO.setTitle("xxx");
+ aiDialogDO.setUserId(userId);
+ this.save(aiDialogDO);
+ }
+ List messageDOS = aiDialogMessageMapper.selectList(new LambdaQueryWrapper().eq(AiDialogMessageDO::getDialogId, aiDialogDO.getId()));
+ DialogResp resp = new DialogResp();
+ resp.setDialogId(aiDialogDO.getId());
+ resp.setTitle(aiDialogDO.getTitle());
+ resp.setMessages(BeanUtils.toBean(messageDOS, AiDialogMessageRespVo.class));
+ return resp;
+ }
+
+
+ @Override
+ @SneakyThrows
+ public TranslateRespVo translate(TranslateReqVo fileReqVo) {
+ AiDialogMessageDO messageDO = aiDialogMessageMapper.selectById(fileReqVo.getMsgId());
+ if (messageDO == null) {
+ messageDO = new AiDialogMessageDO();
+ }
+ String fileName = StrUtil.isBlank(messageDO.getFileName()) ? fileReqVo.getFile().getOriginalFilename() : messageDO.getFileName();
+ //上传文件获取文件地址
+ String fileUrl = StrUtil.isBlank(messageDO.getContentText()) ? fileServer + fileApi.createFile(fileName, "", fileReqVo.getFile().getBytes()) : messageDO.getContentText();
+ //翻译结果
+ translate(messageDO, fileUrl, fileName);
+
+ //创建消息 持久化消息
+ if (messageDO.getId() == null) {
+ messageDO.setFileName(fileName);
+ messageDO.setFileType(fileReqVo.getFile().getContentType());
+ messageDO.setDialogId(fileReqVo.getDialogId());
+ //前端无法转换时 后端进行转
+ messageDO.setContentDuration(
+ StrUtil.isBlank(fileReqVo.getContentDuration()) || "Infinity".equals(fileReqVo.getContentDuration())
+ ? 0 : Long.parseLong(fileReqVo.getContentDuration())
+ );
+
+ messageDO.setContentText(fileUrl);
+ messageDO.setContentType(2);
+ //宠物档案 todo
+ messageDO.setPetId(1l);
+ messageDO.setPetName("猫猫翻译");
+ messageDO.setPetAvatar("https://img1.baidu.com/it/u=1224902049,3440357835&fm=253&app=138&f=JPEG?w=801&h=800");
+ //获取当前最后的排序
+ AiDialogMessageDO aiDialogMessageDO = aiDialogMessageMapper.selectOne(new LambdaQueryWrapper()
+ .eq(AiDialogMessageDO::getDialogId, fileReqVo.getDialogId())
+ .orderByDesc(AiDialogMessageDO::getMessageOrder)
+ .last("limit 1")
+ );
+ messageDO.setMessageOrder(aiDialogMessageDO == null ? 1 : aiDialogMessageDO.getMessageOrder() + 1);
+ messageDO.setCreateTime(LocalDateTime.now());
+ }
+ int i = messageDO.getId() == null ? aiDialogMessageMapper.insert(messageDO) : aiDialogMessageMapper.updateById(messageDO);
+ TranslateRespVo bean = BeanUtils.toBean(messageDO, TranslateRespVo.class);
+ bean.setId(messageDO.getId());
+ return bean;
+ }
+
+ @SneakyThrows
+ private Long getFileDuration(MultipartFile file) {
+ AudioInputStream audioStream = AudioSystem.getAudioInputStream(file.getInputStream());
+ return (long) (audioStream.getFrameLength() / audioStream.getFormat().getFrameRate());
+ }
+
+
+ private AiDialogMessageDO translate(AiDialogMessageDO messageDO, String file, String fileName) {
+ //调用大模型接口
+ String result = "";
+ try {
+ result = HttpRequest.post(translateServer).form("audio_data", HttpUtil.downloadBytes(file), fileName).timeout(20000) //20秒超时时间
+ .execute().body();
+ } catch (Exception e) {
+ log.error("调用大模型翻译出错", e);
+ }
+ messageDO.setSourceResult(result);
+ //数据解析
+ JSONObject translateResult = JSON.parseObject(result);
+
+ if (translateResult.isEmpty() || !translateResult.containsKey("intent_result") || !translateResult.getBoolean("is_species_sound")) {
+ messageDO.setTransStatus(0);
+ messageDO.setTransResult("");
+ return messageDO;
+ }
+ //标签 如 cat dog
+ String speciesLabels = translateResult.getString("species_labels");
+ //解析翻译结果
+ JSONObject probabilities = translateResult.getJSONObject("intent_result")
+ .getJSONObject("probabilities");
+
+ String resultKey = probabilities.entrySet().stream()
+ .filter(entry -> entry.getValue() instanceof Number)
+ .max(Comparator.comparingDouble(entry -> ((Number) entry.getValue()).doubleValue()))
+ .map(Map.Entry::getKey)
+ .orElse(null);
+
+ //返回结果
+ messageDO.setPetType(speciesLabels);
+ messageDO.setTransStatus(1);
+ messageDO.setTransResult(StrUtil.isBlank(resultKey) ? "" : resultKey.split(StrUtil.UNDERLINE)[1]);
+ return messageDO;
+ }
+
+
+ public static void main(String[] args) throws Exception {
+ InputStream inputStream = getInputStreamFromUrl("https://petshy.tashowz.com/admin-api/infra/file/29/get/857def513547ec33a105f71108c8ece329cb64dacc3a4779c94b0fcc3398cc32.webm");
+ AudioInputStream audioStream = AudioSystem.getAudioInputStream(inputStream);
+ System.out.println((long) (audioStream.getFrameLength() / audioStream.getFormat().getFrameRate()));
+// byte[] bytes = HttpUtil.downloadBytes("http://192.168.1.231:48080/admin-api/infra/file/29/get/c7351abf780f18600c104ec5662d843783ed8c309c01fb427046565217f51102.wav");
+//
+//// File file = new File("http://192.168.1.231:48080/admin-api/infra/file/29/get/c7351abf780f18600c104ec5662d843783ed8c309c01fb427046565217f51102.wav");
+// String result = HttpRequest.post("http://43.139.42.137:8000/analyze/audio").form("audio_data", bytes, "aaa").timeout(20000) //20秒超时时间
+// .execute().body();
+// System.out.println(result);
+ }
+
+
+ public static InputStream getInputStreamFromUrl(String urlString) throws Exception {
+ URL url = new URL(urlString);
+ HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+ connection.setRequestMethod("GET"); // 可以是GET, POST等
+ connection.setConnectTimeout(5000); // 设置连接超时时间
+ connection.setReadTimeout(5000); // 设置读取超时时间
+ int responseCode = connection.getResponseCode(); // 获取响应码
+ if (responseCode == HttpURLConnection.HTTP_OK) { // 状态码200表示成功
+ return connection.getInputStream();
+ } else {
+ // 处理错误情况,例如抛出异常或返回null等
+ throw new RuntimeException("Failed : HTTP error code : " + responseCode);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/package-info.java b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/package-info.java
new file mode 100644
index 0000000..72ec8fd
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/java/com/tashow/cloud/ai/service/package-info.java
@@ -0,0 +1 @@
+package com.tashow.cloud.ai.service;
\ No newline at end of file
diff --git a/tashow-module/tashow-module-ai/src/main/resources/application-local.yaml b/tashow-module/tashow-module-ai/src/main/resources/application-local.yaml
new file mode 100644
index 0000000..fa98814
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/resources/application-local.yaml
@@ -0,0 +1,18 @@
+--- #################### 注册中心 + 配置中心相关配置 ####################
+
+spring:
+ cloud:
+ nacos:
+ server-addr: 43.139.42.137:8848 # Nacos 服务器地址
+ username: nacos # Nacos 账号
+ password: nacos # Nacos 密码
+ discovery: # 【配置中心】配置项
+ namespace: dev # 命名空间。这里使用 dev 开发环境
+ group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
+ metadata:
+ version: 1.0.0 # 服务实例的版本号,可用于灰度发布
+ config: # 【注册中心】配置项
+ namespace: dev # 命名空间。这里使用 dev 开发环境
+ group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
+ # 添加字符编码配置,解决YAML解析时的字符编码问题
+ encode: UTF-8
diff --git a/tashow-module/tashow-module-ai/src/main/resources/application.yaml b/tashow-module/tashow-module-ai/src/main/resources/application.yaml
new file mode 100644
index 0000000..83088c9
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/resources/application.yaml
@@ -0,0 +1,12 @@
+server:
+ port: 48086
+spring:
+ application:
+ name: ai-server
+ profiles:
+ active: local
+ config:
+ import:
+ - optional:classpath:application-${spring.profiles.active}.yaml # 加载【本地】配置
+ - optional:nacos:application.yaml # 加载【Nacos】的配置
+ - optional:nacos:${spring.application.name}-${spring.profiles.active}.yaml # 加载【Nacos】的配置
diff --git a/tashow-module/tashow-module-ai/src/main/resources/logback-spring.xml b/tashow-module/tashow-module-ai/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000..df31ed4
--- /dev/null
+++ b/tashow-module/tashow-module-ai/src/main/resources/logback-spring.xml
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ ${PATTERN_DEFAULT}
+
+
+
+
+
+
+
+
+
+ ${PATTERN_DEFAULT}
+
+
+
+ ${LOG_FILE}
+
+
+ ${LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN:-${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}
+
+ ${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}
+
+ ${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}
+
+ ${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}
+
+ ${LOGBACK_ROLLINGPOLICY_MAX_HISTORY:-30}
+
+
+
+
+
+ 0
+
+ 256
+
+
+
+
+
+
+
+ ${PATTERN_DEFAULT}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tashow-module/tashow-module-infra/src/main/java/com/tashow/cloud/infra/controller/admin/file/FileController.java b/tashow-module/tashow-module-infra/src/main/java/com/tashow/cloud/infra/controller/admin/file/FileController.java
index c1a432d..19e9f02 100644
--- a/tashow-module/tashow-module-infra/src/main/java/com/tashow/cloud/infra/controller/admin/file/FileController.java
+++ b/tashow-module/tashow-module-infra/src/main/java/com/tashow/cloud/infra/controller/admin/file/FileController.java
@@ -1,8 +1,5 @@
package com.tashow.cloud.infra.controller.admin.file;
-import static com.tashow.cloud.common.pojo.CommonResult.success;
-import static com.tashow.cloud.infra.framework.file.core.utils.FileTypeUtils.writeAttachment;
-
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
@@ -24,11 +21,15 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
+import static com.tashow.cloud.common.pojo.CommonResult.success;
+import static com.tashow.cloud.infra.framework.file.core.utils.FileTypeUtils.writeAttachment;
+
/** 管理后台 - 文件存储 */
@RestController
@RequestMapping("/infra/file")
@Validated
@Slf4j
+@PermitAll
public class FileController {
@Resource private FileService fileService;
@@ -87,6 +88,7 @@ public class FileController {
response.setStatus(HttpStatus.NOT_FOUND.value());
return;
}
+ response.setContentLength(content.length);
writeAttachment(response, path, content);
}
diff --git a/tashow-module/tashow-module-infra/src/main/java/com/tashow/cloud/infra/framework/file/core/client/local/LocalFileClient.java b/tashow-module/tashow-module-infra/src/main/java/com/tashow/cloud/infra/framework/file/core/client/local/LocalFileClient.java
index aa99e0a..422e27a 100644
--- a/tashow-module/tashow-module-infra/src/main/java/com/tashow/cloud/infra/framework/file/core/client/local/LocalFileClient.java
+++ b/tashow-module/tashow-module-infra/src/main/java/com/tashow/cloud/infra/framework/file/core/client/local/LocalFileClient.java
@@ -30,7 +30,7 @@ public class LocalFileClient extends AbstractFileClient {
String filePath = getFilePath(path);
FileUtil.writeBytes(content, filePath);
// 拼接返回路径
- return super.formatFileUrl(config.getDomain(), path);
+ return super.formatFileUrl("", path);
}
@Override
diff --git a/tashow-module/tashow-module-infra/src/main/resources/application-local.yaml b/tashow-module/tashow-module-infra/src/main/resources/application-local.yaml
index da745cc..a781954 100644
--- a/tashow-module/tashow-module-infra/src/main/resources/application-local.yaml
+++ b/tashow-module/tashow-module-infra/src/main/resources/application-local.yaml
@@ -7,11 +7,11 @@ spring:
username: nacos # Nacos 账号
password: nacos # Nacos 密码
discovery: # 【配置中心】配置项
- namespace: liwq # 命名空间。这里使用 dev 开发环境
+ namespace: dev # 命名空间。这里使用 dev 开发环境
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
metadata:
version: 1.0.0 # 服务实例的版本号,可用于灰度发布
config: # 【注册中心】配置项
- namespace: liwq # 命名空间。这里使用 dev 开发环境
+ namespace: dev # 命名空间。这里使用 dev 开发环境
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
diff --git a/tashow-module/tashow-module-product/pom.xml b/tashow-module/tashow-module-product/pom.xml
index e825af5..0639aa0 100644
--- a/tashow-module/tashow-module-product/pom.xml
+++ b/tashow-module/tashow-module-product/pom.xml
@@ -96,9 +96,26 @@
org.springframework.boot
spring-boot-starter-actuator
-
- com.tashow.cloud
- tashow-data-redis
-
+
+
+ ${project.artifactId}
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring.boot.version}
+
+ com.tashow.cloud.product.ProductServerApplication
+
+
+
+
+ repackage
+
+
+
+
+
+
diff --git a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/ProductServerApplication.java b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/ProductServerApplication.java
index d74f92c..2bdf20a 100644
--- a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/ProductServerApplication.java
+++ b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/ProductServerApplication.java
@@ -14,5 +14,6 @@ public class ProductServerApplication {
public static void main(String[] args) {
SpringApplication.run(ProductServerApplication.class, args);
+ System.out.println("产品启动成功");
}
}
diff --git a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/controller/admin/ProdController.java b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/controller/admin/ProdController.java
index 0dc1f66..93a7716 100644
--- a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/controller/admin/ProdController.java
+++ b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/controller/admin/ProdController.java
@@ -54,8 +54,8 @@ public class ProdController {
@PostMapping("/uptateProdService")
@Operation(summary = "修改商品服务配置")
@PermitAll
- public CommonResult uptateProdService(@Valid @RequestBody ProdServiceVO prodServiceVO) {
- prodService.uptateProdService(prodServiceVO);
+ public CommonResult uptateProdService(@Valid @RequestBody ProdServiceInfoVO prodServiceInfoVO) {
+ prodService.uptateProdService(prodServiceInfoVO);
return success(true);
}
@@ -114,7 +114,7 @@ public class ProdController {
ProdDO prod = new ProdDO();
prod.setProdId(id);
prod.setStatus(status);
- prodMapper.updateBatch(prod);
+ prodMapper.updateById(prod);
}
return success(true);
}
diff --git a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/controller/admin/SkuController.java b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/controller/admin/SkuController.java
index 101f470..9f8194f 100644
--- a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/controller/admin/SkuController.java
+++ b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/controller/admin/SkuController.java
@@ -3,12 +3,16 @@ package com.tashow.cloud.product.controller.admin;
import com.tashow.cloud.common.pojo.CommonResult;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.common.util.object.BeanUtils;
+import com.tashow.cloud.product.mapper.ProdPropMapper;
+import com.tashow.cloud.product.mapper.ProdPropValueMapper;
import com.tashow.cloud.productapi.api.product.dto.*;
import com.tashow.cloud.product.mapper.SkuMapper;
import com.tashow.cloud.product.service.ProdExtendService;
import com.tashow.cloud.product.service.ProdPropService;
import com.tashow.cloud.product.service.ProdPropValueService;
import com.tashow.cloud.product.service.SkuService;
+import com.tashow.cloud.productapi.api.product.vo.prodpropvalue.ProPageReqVO;
+import com.tashow.cloud.productapi.api.product.vo.prodpropvalue.ProPropRecycleBinVO;
import com.tashow.cloud.productapi.api.product.vo.sku.*;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@@ -41,6 +45,12 @@ public class SkuController {
@Resource
private ProdExtendService prodExtendService;
+
+ @Resource
+ private ProdPropValueMapper prodPropValueMapper;
+ @Resource
+ private ProdPropMapper prodPropMapper;
+
@Resource
private SkuMapper skuMapper;
@@ -54,20 +64,40 @@ public class SkuController {
@PutMapping("/update")
@Operation(summary = "更新单品SKU")
@PermitAll
- public CommonResult updateSku(@Valid @RequestBody SkuSaveReqVO updateReqVO) {
+ public CommonResult updateSku(@RequestBody SkuSaveReqVO updateReqVO) {
skuService.updateSku(updateReqVO);
return success(true);
}
@PutMapping("/updateProp")
- @Operation(summary = "更新sku规格")
+ @Operation(summary = "新增统一保存sku规格")
@PermitAll
public CommonResult updateProp(@Valid @RequestBody SkuPropVO skuPropVO) {
skuService.updateProp(skuPropVO);
return success(true);
}
+ @PutMapping("/updatePropValue")
+ @Operation(summary = "修改属性下面规格值")
+ @PermitAll
+ public CommonResult updatePropValue(@RequestParam("id") Long id,@RequestParam("propValue") String propValue) {
+ skuService.updatePropVal(id,propValue);
+ return success(true);
+ }
+
+ @PutMapping("/updateProdProp")
+ @Operation(summary = "修改属性规格值")
+ @PermitAll
+ public CommonResult updateProdProp(@RequestParam("id") Long id,@RequestParam("propName") String propName) {
+ ProdPropDO prodPropDO = new ProdPropDO();
+ prodPropDO.setId( id);
+ prodPropDO.setPropName(propName);
+ prodPropMapper.updateById(prodPropDO);
+ return success(true);
+ }
+
+
@GetMapping("/getSKuPropList")
@Operation(summary = "获取sku规格")
@PermitAll
@@ -76,6 +106,25 @@ public class SkuController {
return success(skuService.getSKuPropList(prodId));
}
+
+ @PermitAll
+ @GetMapping("/getPropRecycleBinList")
+ @Operation(summary = "获取规格回收站")
+ public CommonResult> getSKuPropRecycleBinList(ProPageReqVO proPageReqVO) {
+ PageResult pageResult = skuService.getSKuPropRecycleBinList(proPageReqVO);
+ return success(pageResult);
+ }
+
+ @PostMapping("/restorePropList")
+ @Operation(summary = "恢复规格")
+ @Parameter(name = "ids", description = "规格id集合", required = true)
+ @PermitAll
+ public CommonResult restorePropList(@RequestParam("ids") List ids) {
+ skuService.restorePropList(ids);
+ return success(true);
+ }
+
+
@PutMapping("/deleteProp")
@Operation(summary = "删除规格值")
@PermitAll
@@ -86,10 +135,12 @@ public class SkuController {
@PutMapping("/disableProp")
- @Operation(summary = "禁用规格值")
+ @Operation(summary = "禁用或者启用规格值")
+ @Parameter(name = "id", description = "规格id")
+ @Parameter(name = "state", description = "状态0禁用1启用")
@PermitAll
- public CommonResult disableProp(@RequestParam("id") Long id) {
- skuService.disableProp(id);
+ public CommonResult disableProp(@RequestParam("id") Long id,@RequestParam("state") Integer state) {
+ skuService.disableProp(id,state);
return success(true);
}
@@ -108,19 +159,12 @@ public class SkuController {
@Parameter(name = "ids", description = "编号", required = true)
@PermitAll
public CommonResult deleteSkuList(@RequestParam("ids") List ids) {
- /*for(Long id:ids){
- SkuDO sku = new SkuDO();
- sku.setSkuId(id);
- sku.setDeleteTime(new Date());
- // 删除
- skuMapper.deleteById(sku);
- }*/
skuService.deleteSkus(ids);
return success(true);
}
- @PostMapping("/updateSkuShelf")
+ @PutMapping("/updateSkuShelf")
@Operation(summary = "修改单品上下架")
@Parameter(name = "id", description = "编号", required = true)
@Parameter(name = "isShelf", description = "是否上下架(0下架 1上架)", required = true)
@@ -130,7 +174,7 @@ public class SkuController {
return success(true);
}
- @PostMapping("/updateSkuShelfList")
+ @PutMapping("/updateSkuShelfList")
@Operation(summary = "批量上下架")
@Parameter(name = "ids", description = "编号", required = true)
@Parameter(name = "isShelf", description = "是否上下架(0下架 1上架)", required = true)
@@ -140,7 +184,7 @@ public class SkuController {
SkuDO sku = new SkuDO();
sku.setSkuId(id);
sku.setIsShelf(isShelf);
- skuMapper.updateBatch(sku);
+ skuMapper.updateById(sku);
}
skuService.updatSkuIsShelfs(ids,isShelf);
return success(true);
diff --git a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/mapper/ProdAdditionalFeeDatesMapper.java b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/mapper/ProdAdditionalFeeDatesMapper.java
index 64af0b7..f039577 100644
--- a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/mapper/ProdAdditionalFeeDatesMapper.java
+++ b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/mapper/ProdAdditionalFeeDatesMapper.java
@@ -7,6 +7,7 @@ import com.tashow.cloud.mybatis.mybatis.core.query.LambdaQueryWrapperX;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
import com.tashow.cloud.productapi.api.product.dto.ProdAdditionalFeeDatesDO;
import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
/**
* 特殊日期附加费用规则 Mapper
@@ -16,5 +17,9 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ProdAdditionalFeeDatesMapper extends BaseMapperX {
+ /**
+ * 删除关联
+ */
+ public int deleteAdditionalFeeDates(@Param("prodId")Long prodId,@Param("type")Integer type);
}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/mapper/ProdMapper.java b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/mapper/ProdMapper.java
index 47ddd20..1c68e82 100644
--- a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/mapper/ProdMapper.java
+++ b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/mapper/ProdMapper.java
@@ -30,24 +30,9 @@ public interface ProdMapper extends BaseMapperX {
, @Param("status") Integer status
, @Param("categoryId") Long categoryId);
- ProdServiceVO selectProdService(@Param("prodId") Long prodId
- , @Param("regionSwitch") Integer regionSwitch
- , @Param("reservationSwitch") Integer reservationSwitch
- , @Param("emergencySwitch") Integer emergencySwitch
- , @Param("orderLimitSwitch") Integer orderLimitSwitch
- , @Param("additionalSwitch") Integer additionalSwitch
- , @Param("additionalFeeSwitch") Integer additionalFeeSwitch
- , @Param("weightSwitch") Integer weightSwitch
- );
+ ProdServiceVO selectProdService(@Param("prodId") Long prodId);
- ProdServiceVO selectProdServiceInfo(@Param("prodId") Long prodId
- , @Param("reservationSwitch") Integer reservationSwitch
- , @Param("emergencySwitch") Integer emergencySwitch
- , @Param("orderLimitSwitch") Integer orderLimitSwitch
- , @Param("additionalSwitch") Integer additionalSwitch
- , @Param("additionalFeeSwitch") Integer additionalFeeSwitch
- , @Param("weightSwitch") Integer weightSwitch
- );
+ ProdServiceVO selectProdServiceInfo(@Param("prodId") Long prodId);
IPage getProdRecycleBinPageList(Page> page, @Param("deleteTime") String[] deleteTime
, @Param("prodName") String prodName);
diff --git a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/mapper/ProdPropValueMapper.java b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/mapper/ProdPropValueMapper.java
index 3c06500..1e22404 100644
--- a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/mapper/ProdPropValueMapper.java
+++ b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/mapper/ProdPropValueMapper.java
@@ -2,10 +2,15 @@ package com.tashow.cloud.product.mapper;
import java.util.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.mybatis.mybatis.core.query.LambdaQueryWrapperX;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
import com.tashow.cloud.productapi.api.product.dto.ProdPropValueDO;
+import com.tashow.cloud.productapi.api.product.dto.SkuDO;
+import com.tashow.cloud.productapi.api.product.vo.prodpropvalue.ProPropRecycleBinVO;
+import com.tashow.cloud.productapi.api.product.vo.sku.SkuRecycleBinVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -34,4 +39,14 @@ public interface ProdPropValueMapper extends BaseMapperX {
List selectRestoreProp(@Param("prodId") Long prodId);
+ IPage getSKuPropRecycleBinList(Page> page, @Param("prodId") Long prodId,@Param("propValue")String propValue);
+
+ List getskuListByPropValueIds(@Param("ids")List ids);
+
+ void restorePropValue(@Param("ids") List ids);
+
+ int getMaxPropValue(@Param("propId")Long propId);
+
+ // 根据商品 ID 更新销售属性值的 state(仅 rule=1 的)
+ void updateStateByProdId(@Param("prodId") Long prodId, @Param("state") Integer state);
}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/mapper/ProdReservationConfigMapper.java b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/mapper/ProdReservationConfigMapper.java
index a7bbe67..a5647e1 100644
--- a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/mapper/ProdReservationConfigMapper.java
+++ b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/mapper/ProdReservationConfigMapper.java
@@ -7,6 +7,7 @@ import com.tashow.cloud.mybatis.mybatis.core.query.LambdaQueryWrapperX;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
import com.tashow.cloud.productapi.api.product.dto.ProdReservationConfigDO;
import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
/**
* 商品预约配置 Mapper
@@ -17,4 +18,8 @@ import org.apache.ibatis.annotations.Mapper;
public interface ProdReservationConfigMapper extends BaseMapperX {
+ /**
+ * 删除关联
+ */
+ public int deleteReservationConfig(@Param("prodId")Long prodId);
}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/mapper/ProdWeightRangePricesMapper.java b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/mapper/ProdWeightRangePricesMapper.java
index a941bf3..efec471 100644
--- a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/mapper/ProdWeightRangePricesMapper.java
+++ b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/mapper/ProdWeightRangePricesMapper.java
@@ -7,6 +7,7 @@ import com.tashow.cloud.mybatis.mybatis.core.query.LambdaQueryWrapperX;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
import com.tashow.cloud.productapi.api.product.dto.ProdWeightRangePricesDO;
import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
/**
* 体重区间价格 Mapper
@@ -17,4 +18,8 @@ import org.apache.ibatis.annotations.Mapper;
public interface ProdWeightRangePricesMapper extends BaseMapperX {
+ /**
+ * 删除关联
+ */
+ public int deleteWeightRangePrices(@Param("prodId")Long prodId);
}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/mapper/SkuMapper.java b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/mapper/SkuMapper.java
index f999bfd..c5f8c97 100644
--- a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/mapper/SkuMapper.java
+++ b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/mapper/SkuMapper.java
@@ -23,7 +23,8 @@ public interface SkuMapper extends BaseMapperX {
IPage getSkuPageList(Page> page, @Param("prodId") Long prodId,@Param("skuId") Long skuId, @Param("properties")String properties);
- List getSkuListByName( @Param("propertiesName")String propertiesName);
+ List getSkuListByName( @Param("prodId")Long prodId , @Param("propertiesName")String propertiesName);
+
List selectPropertiesByProdIdAndNotDeleted( @Param("prodId")Long prodId);
List selectPropertiesByProdIdShelf( @Param("prodId")Long prodId);
@@ -31,4 +32,16 @@ public interface SkuMapper extends BaseMapperX {
int deleteBySkuId( @Param("skuId")Long skuId);
void batchSkuDeleted(@Param("ids") List ids);
+
+ void updateSkuDeleted(@Param("skuId") Long skuId);
+
+
+ List getskuListBySkuIds( @Param("ids")List ids);
+
+ List getskuListByDeleted( @Param("prodId")Long prodId,@Param("ids")List ids);
+
+ void batchSkuRecover(@Param("ids") List ids);
+
+ // 查询商品下所有 SKU 的 is_shelf 状态(未删除)
+ List selectShelfStatusByProdId(@Param("prodId") Long prodId);
}
\ No newline at end of file
diff --git a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/service/ProdService.java b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/service/ProdService.java
index 13f3d45..c543068 100644
--- a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/service/ProdService.java
+++ b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/service/ProdService.java
@@ -36,10 +36,10 @@ public interface ProdService {
/**
* 修改商品服务配置
*
- * @param prodServiceVO 创建信息
+ * @param prodServiceInfoVO 创建信息
* @return 编号
*/
- void uptateProdService(@Valid ProdServiceVO prodServiceVO);
+ void uptateProdService(@Valid ProdServiceInfoVO prodServiceInfoVO);
diff --git a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/service/SkuService.java b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/service/SkuService.java
index 05ff1bc..ce7375f 100644
--- a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/service/SkuService.java
+++ b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/service/SkuService.java
@@ -3,6 +3,8 @@ package com.tashow.cloud.product.service;
import java.util.*;
import com.tashow.cloud.productapi.api.product.dto.*;
+import com.tashow.cloud.productapi.api.product.vo.prodpropvalue.ProPageReqVO;
+import com.tashow.cloud.productapi.api.product.vo.prodpropvalue.ProPropRecycleBinVO;
import com.tashow.cloud.productapi.api.product.vo.sku.*;
import jakarta.validation.*;
import com.tashow.cloud.common.pojo.PageResult;
@@ -56,6 +58,9 @@ public interface SkuService {
*/
void updateProp(SkuPropVO skuPropVO);
+
+ void updatePropVal(Long id, String propValue);
+
/**
* 删除规格值
*
@@ -68,12 +73,13 @@ public interface SkuService {
*
* @param id 删除规格值
*/
- void disableProp(Long id);
+ void disableProp(Long id,Integer state);
SkuPropInfoVO getSKuPropList(Long prodId);
+ PageResult getSKuPropRecycleBinList(ProPageReqVO proPageReqVO);
/**
* 删除单品SKU
*
@@ -94,6 +100,12 @@ public interface SkuService {
* @param ids
*/
void restoreSkuList(List ids);
+ /**
+ * 恢复规格
+ *
+ * @param ids
+ */
+ void restorePropList(List ids);
/**
diff --git a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/service/impl/ProdServiceImpl.java b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/service/impl/ProdServiceImpl.java
index c064ebf..2fa6345 100644
--- a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/service/impl/ProdServiceImpl.java
+++ b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/service/impl/ProdServiceImpl.java
@@ -12,6 +12,10 @@ import com.tashow.cloud.product.service.ProdPropService;
import com.tashow.cloud.product.service.ProdService;
import com.tashow.cloud.productapi.api.product.vo.prod.*;
+import com.tashow.cloud.productapi.api.product.vo.prodadditionalfeedates.ProdAdditionalFeeBlackVO;
+import com.tashow.cloud.productapi.api.product.vo.prodemergencyresponse.ProdEmergencyInfoVO;
+import com.tashow.cloud.productapi.api.product.vo.prodreservationconfig.ProdReservationInfoReqVO;
+import com.tashow.cloud.productapi.api.product.vo.prodreservationconfig.ProdReservationInfoVO;
import com.tashow.cloud.productapi.api.product.vo.sku.SkuPageReqVO;
import com.tashow.cloud.productapi.api.product.vo.sku.SkuRecycleBinVO;
import com.tashow.cloud.productapi.enums.BaseEnum;
@@ -123,12 +127,12 @@ public class ProdServiceImpl implements ProdService {
}
}
//预约设置设置
- if (Objects.equals(prodServiceVO.getReservationSwitch(), BaseEnum.YES_ONE.getKey())) {
+ /*if (Objects.equals(prodServiceVO.getReservationSwitch(), BaseEnum.YES_ONE.getKey())) {
prodDO.setReservationSwitch(BaseEnum.YES_ONE.getKey());
- ProdReservationConfigDO prodReservationConfigDO = prodServiceVO.prodReservationConfig;
+ ProdReservationInfoVO prodReservationConfigDO = prodServiceVO.getProdReservationConfig();
prodReservationConfigDO.setProdId(prodDO.getProdId());
prodReservationConfigMapper.insert(prodReservationConfigDO);
- }
+ }*/
//紧急响应设置
if (Objects.equals(prodServiceVO.getEmergencySwitch(), BaseEnum.YES_ONE.getKey())) {
prodDO.setEmergencySwitch(BaseEnum.YES_ONE.getKey());
@@ -165,18 +169,18 @@ public class ProdServiceImpl implements ProdService {
}
}
//体重设置
- if (Objects.equals(prodServiceVO.getWeightSwitch(), BaseEnum.YES_ONE.getKey())) {
+ /* if (Objects.equals(prodServiceVO.getWeightSwitch(), BaseEnum.YES_ONE.getKey())) {
prodDO.setWeightSwitch(BaseEnum.YES_ONE.getKey());
ProdWeightRangePricesDO prodWeightRangePrices = prodServiceVO.prodWeightConfig;
prodWeightRangePrices.setProdId(prodDO.getProdId());
prodWeightRangePricesMapper.insert(prodWeightRangePrices);
- }
+ }*/
prodMapper.updateById(prodDO);
}
@Override
@Transactional
- public void uptateProdService(ProdServiceVO prodServiceVO) {
+ public void uptateProdService(ProdServiceInfoVO prodServiceVO) {
ProdDO prod = BeanUtils.toBean(prodServiceVO, ProdDO.class);
//服务区域设置
@@ -233,17 +237,39 @@ public class ProdServiceImpl implements ProdService {
if (Objects.equals(prodServiceVO.getReservationSwitch(), BaseEnum.YES_ONE.getKey())) {
ProdReservationConfigDO reservationConfig = prodReservationConfigMapper.selectOne(new LambdaQueryWrapper()
.eq(ProdReservationConfigDO::getProdId, prodServiceVO.getProdId()));
+ ProdReservationInfoReqVO prodReservationInfoVO = prodServiceVO.getProdReservationConfig();
if (reservationConfig == null) {
prod.setReservationSwitch(BaseEnum.YES_ONE.getKey());
- ProdReservationConfigDO prodReservationConfigDO = prodServiceVO.getProdReservationConfig();
+ ProdReservationConfigDO prodReservationConfigDO = BeanUtils.toBean(prodReservationInfoVO, ProdReservationConfigDO.class);
prodReservationConfigDO.setProdId(prod.getProdId());
- prodReservationConfigDO.setTimeBook(prodServiceVO.getProdReservationConfig().getTimeBook());
- prodReservationConfigDO.setReservationTimeSlots(prodServiceVO.getProdReservationConfig().getReservationTimeSlots());
+ prodReservationConfigDO.setTimeSlot(prodReservationInfoVO.getTimeBook().getTimeSlot());
+ prodReservationConfigDO.setReservationTimeSlots(prodReservationInfoVO.getTimeBook().getReservationTimeSlots());
prodReservationConfigMapper.insert(prodReservationConfigDO);
+ //先删除在新增
+ prodAdditionalFeeDatesMapper.deleteAdditionalFeeDates(prod.getProdId(), 2);
+ if (prodServiceVO.getProdReservationConfig().getProdReservationBlackList() != null) {
+ for (ProdAdditionalFeeBlackVO prodAdditionalFeeBlackVO : prodServiceVO.getProdReservationConfig().getProdReservationBlackList()) {
+ ProdAdditionalFeeDatesDO prodAdditionalFeeDatesDO = BeanUtils.toBean(prodAdditionalFeeBlackVO, ProdAdditionalFeeDatesDO.class);
+ prodAdditionalFeeDatesDO.setProdId(prod.getProdId());
+ prodAdditionalFeeDatesDO.setType(2);
+ prodAdditionalFeeDatesMapper.insert(prodAdditionalFeeDatesDO);
+ }
+ }
} else {
- prodServiceVO.getProdReservationConfig().setTimeBook(prodServiceVO.getProdReservationConfig().getTimeBook());
- prodServiceVO.getProdReservationConfig().setReservationTimeSlots(prodServiceVO.getProdReservationConfig().getReservationTimeSlots());
- prodReservationConfigMapper.updateById(prodServiceVO.getProdReservationConfig());
+ ProdReservationConfigDO prodReservationConfigDO = BeanUtils.toBean(prodServiceVO.getProdReservationConfig(), ProdReservationConfigDO.class);
+ prodReservationConfigDO.setTimeSlot(prodReservationInfoVO.getTimeBook().getTimeSlot());
+ prodReservationConfigDO.setReservationTimeSlots(prodReservationInfoVO.getTimeBook().getReservationTimeSlots());
+ prodReservationConfigMapper.updateById(prodReservationConfigDO);
+ //先删除在新增
+ prodAdditionalFeeDatesMapper.deleteAdditionalFeeDates(prod.getProdId(), 2);
+ if (prodServiceVO.getProdReservationConfig().getProdReservationBlackList() != null) {
+ for (ProdAdditionalFeeBlackVO prodAdditionalFeeBlackVO : prodServiceVO.getProdReservationConfig().getProdReservationBlackList()) {
+ ProdAdditionalFeeDatesDO prodAdditionalFeeDatesDO = BeanUtils.toBean(prodAdditionalFeeBlackVO, ProdAdditionalFeeDatesDO.class);
+ prodAdditionalFeeDatesDO.setProdId(prod.getProdId());
+ prodAdditionalFeeDatesDO.setType(2);
+ prodAdditionalFeeDatesMapper.insert(prodAdditionalFeeDatesDO);
+ }
+ }
}
}
//紧急响应设置
@@ -256,26 +282,47 @@ public class ProdServiceImpl implements ProdService {
ProdEmergencyResponseDO prodEmergencyResponse = BeanUtils.toBean(prodServiceVO.getProdEmergencyInfoVO(), ProdEmergencyResponseDO.class);
prodEmergencyResponse.setProdId(prod.getProdId());
prodEmergencyResponseMapper.insert(prodEmergencyResponse);
- if(prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseIntervalsList()!=null){
+ if (prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseIntervalsList() != null) {
for (ProdEmergencyResponseIntervalsDO prodEmergencyResponseIntervals : prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseIntervalsList()) {
+ prodEmergencyResponseIntervals.setId(null);
prodEmergencyResponseIntervals.setConfigId(prodEmergencyResponse.getId());
prodEmergencyResponseIntervals.setProdId(prod.getProdId());
prodEmergencyResponseIntervalsMapper.insert(prodEmergencyResponseIntervals);
}
}
-
+ if (prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseBlackList() != null) {
+ for (ProdAdditionalFeeBlackVO prodAdditionalFeeBlackVO : prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseBlackList()) {
+ ProdAdditionalFeeDatesDO prodAdditionalFeeDatesDO = BeanUtils.toBean(prodAdditionalFeeBlackVO, ProdAdditionalFeeDatesDO.class);
+ prodAdditionalFeeDatesDO.setId(null);
+ prodAdditionalFeeDatesDO.setProdId(prod.getProdId());
+ prodAdditionalFeeDatesDO.setType(3);
+ prodAdditionalFeeDatesMapper.insert(prodAdditionalFeeDatesDO);
+ }
+ }
} else {
ProdEmergencyResponseDO prodEmergencyResponse = BeanUtils.toBean(prodServiceVO.getProdEmergencyInfoVO(), ProdEmergencyResponseDO.class);
if (prodEmergencyResponse != null) {
prodEmergencyResponseMapper.updateById(prodEmergencyResponse);
prodEmergencyResponseIntervalsMapper.deleteIntervals(prodEmergencyResponse.getId());
- if(prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseIntervalsList()!=null) {
+ if (prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseIntervalsList() != null) {
for (ProdEmergencyResponseIntervalsDO prodEmergencyResponseIntervals : prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseIntervalsList()) {
+ prodEmergencyResponseIntervals.setId(null);
prodEmergencyResponseIntervals.setConfigId(prodEmergencyResponse.getId());
prodEmergencyResponseIntervals.setProdId(prod.getProdId());
prodEmergencyResponseIntervalsMapper.insert(prodEmergencyResponseIntervals);
}
}
+ //先删除在新增
+ prodAdditionalFeeDatesMapper.deleteAdditionalFeeDates(prod.getProdId(), 3);
+ if (prodServiceVO.getProdReservationConfig().getProdReservationBlackList() != null) {
+ for (ProdAdditionalFeeBlackVO prodAdditionalFeeBlackVO : prodServiceVO.getProdReservationConfig().getProdReservationBlackList()) {
+ ProdAdditionalFeeDatesDO prodAdditionalFeeDatesDO = BeanUtils.toBean(prodAdditionalFeeBlackVO, ProdAdditionalFeeDatesDO.class);
+ prodAdditionalFeeDatesDO.setId(null);
+ prodAdditionalFeeDatesDO.setProdId(prod.getProdId());
+ prodAdditionalFeeDatesDO.setType(3);
+ prodAdditionalFeeDatesMapper.insert(prodAdditionalFeeDatesDO);
+ }
+ }
}
}
}
@@ -298,6 +345,7 @@ public class ProdServiceImpl implements ProdService {
for (ProdAdditionalFeeDatesDO prodAdditionalFeeDates : prodServiceVO.getProdAdditionalFeeDatesList()) {
if (prodAdditionalFeeDates.getId() == null) {
prodAdditionalFeeDates.setProdId(prodServiceVO.getProdId());
+ prodAdditionalFeeDates.setType(1);
prodAdditionalFeeDatesMapper.insert(prodAdditionalFeeDates);
} else {
prodAdditionalFeeDatesMapper.updateById(prodAdditionalFeeDates);
@@ -317,13 +365,23 @@ public class ProdServiceImpl implements ProdService {
}
//体重设置
if (Objects.equals(prodServiceVO.getWeightSwitch(), BaseEnum.YES_ONE.getKey())) {
- if (prodServiceVO.getProdWeightConfig().getId() == null) {
- prod.setWeightSwitch(BaseEnum.YES_ONE.getKey());
- ProdWeightRangePricesDO prodWeightRangePrices = prodServiceVO.getProdWeightConfig();
- prodWeightRangePrices.setProdId(prod.getProdId());
- prodWeightRangePricesMapper.insert(prodWeightRangePrices);
+ prod.setWeightSwitch(prodServiceVO.getWeightSwitch());
+ ProdExtendDO prodExtendDO = prodExtendMapper.selectOne(ProdExtendDO::getProdId, prod.getProdId());
+ if (prodExtendDO != null) {
+ prodExtendDO.setIsWeightCharge(prodServiceVO.getProdWeightConfig().getIsWeightCharge());
+ prodExtendMapper.updateById(prodExtendDO);
} else {
- prodWeightRangePricesMapper.updateById(prodServiceVO.getProdWeightConfig());
+ prodExtendDO = new ProdExtendDO();
+ prodExtendDO.setProdId(prod.getProdId());
+ prodExtendDO.setIsWeightCharge(prodServiceVO.getProdWeightConfig().getIsWeightCharge());
+ prodExtendMapper.insert(prodExtendDO);
+ }
+ prodWeightRangePricesMapper.deleteWeightRangePrices(prod.getProdId());
+ if (prodServiceVO.getProdWeightConfig().getProdWeightConfigList() != null) {
+ for (ProdWeightRangePricesDO prodWeightRangePricesDO : prodServiceVO.getProdWeightConfig().getProdWeightConfigList()) {
+ prodWeightRangePricesDO.setProdId(prod.getProdId());
+ prodWeightRangePricesMapper.insert(prodWeightRangePricesDO);
+ }
}
}
prodMapper.updateById(prod);
@@ -332,15 +390,66 @@ public class ProdServiceImpl implements ProdService {
@Override
public ProdServiceVO getProdService(Long prodId) {
ProdDO prodDO = prodMapper.selectById(prodId);
- if (prodDO != null && prodDO.getRegionSwitch() == BaseEnum.YES_ONE.getKey()) {
- return prodMapper.selectProdService(prodDO.getProdId(), prodDO.getRegionSwitch(),
- prodDO.getReservationSwitch(), prodDO.getEmergencySwitch(), prodDO.getOrderLimitSwitch(),
- prodDO.getAdditionalSwitch(), prodDO.getAdditionalFeeSwitch(), prodDO.getWeightSwitch());
- } else {
- return prodMapper.selectProdServiceInfo(prodDO.getProdId(),
- prodDO.getReservationSwitch(), prodDO.getEmergencySwitch(), prodDO.getOrderLimitSwitch(),
- prodDO.getAdditionalSwitch(), prodDO.getAdditionalFeeSwitch(), prodDO.getWeightSwitch());
+ ProdServiceVO prodServiceVO = prodMapper.selectProdService(prodDO.getProdId());
+
+ if (prodServiceVO.getProdEmergencyInfoVO().getId()== null) {
+ prodServiceVO.setProdEmergencyInfoVO(null);
+ }else {
+ if (prodServiceVO.getProdEmergencyInfoVO().getId()!= null&&prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseIntervalsList().size()== 0) {
+ ProdEmergencyInfoVO prodEmergencyInfoVO = prodServiceVO.getProdEmergencyInfoVO();
+ prodEmergencyInfoVO.setProdEmergencyResponseIntervalsList(new ArrayList<>());
+ }
+ if (prodServiceVO.getProdEmergencyInfoVO().getId()!= null&&prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseBlackList().get(0).isEmpty()) {
+ ProdEmergencyInfoVO prodEmergencyInfoVO = prodServiceVO.getProdEmergencyInfoVO();
+ prodEmergencyInfoVO.setProdEmergencyResponseBlackList(new ArrayList<>());
+ }
}
+ if (prodServiceVO.getProdAdditionalFeeDatesList().get(0).getId()==null) {
+ prodServiceVO.setProdAdditionalFeeDatesList(new ArrayList<>());
+ }
+ if (prodServiceVO.getProdAdditionalFeePeriodsList().get(0).getId()==null) {
+ prodServiceVO.setProdAdditionalFeePeriodsList(new ArrayList<>());
+ }
+ return prodServiceVO;
+ /* if (prodDO != null && prodDO.getRegionSwitch() == BaseEnum.YES_ONE.getKey()) {
+ ProdServiceVO prodServiceVO = prodMapper.selectProdService(prodDO.getProdId());
+ if (Objects.equals(prodDO.getReservationSwitch(), BaseEnum.YES_ONE.getKey())&&prodServiceVO.getProdReservationConfig().getProdReservationBlackList().get(0).isEmpty()) {
+ ProdReservationInfoVO prodReservationInfoVO = prodServiceVO.getProdReservationConfig();
+ prodReservationInfoVO.setProdReservationBlackList(new ArrayList<>());
+ }
+ if (Objects.equals(prodDO.getEmergencySwitch(), BaseEnum.YES_ONE.getKey())&&prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseIntervalsList().get(0).isEmpty()) {
+ ProdEmergencyInfoVO prodEmergencyInfoVO = prodServiceVO.getProdEmergencyInfoVO();
+ prodEmergencyInfoVO.setProdEmergencyResponseIntervalsList(new ArrayList<>());
+ }
+ if (Objects.equals(prodDO.getAdditionalSwitch(), BaseEnum.YES_ONE.getKey())&&prodServiceVO.getProdAdditionalFeeDatesList().get(0).isEmpty()) {
+ prodServiceVO.setProdAdditionalFeeDatesList(new ArrayList<>());
+ }
+ if (Objects.equals(prodDO.getAdditionalFeeSwitch(), BaseEnum.YES_ONE.getKey())&&prodServiceVO.getProdAdditionalFeePeriodsList().get(0).isEmpty()) {
+ prodServiceVO.setProdAdditionalFeePeriodsList(new ArrayList<>());
+ }
+ return prodServiceVO;
+ } else {
+ ProdServiceVO prodServiceVO = prodMapper.selectProdServiceInfo(prodDO.getProdId());
+ if (Objects.equals(prodDO.getReservationSwitch(), BaseEnum.YES_ONE.getKey())&&prodServiceVO.getProdReservationConfig()!=null&&prodServiceVO.getProdReservationConfig().getProdReservationBlackList().get(0).isEmpty()) {
+ ProdReservationInfoVO prodReservationInfoVO = prodServiceVO.getProdReservationConfig();
+ prodReservationInfoVO.setProdReservationBlackList(new ArrayList<>());
+ }
+ if (Objects.equals(prodDO.getEmergencySwitch(), BaseEnum.YES_ONE.getKey())&&prodServiceVO.getProdEmergencyInfoVO()!=null&&prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseIntervalsList().get(0).isEmpty()) {
+ ProdEmergencyInfoVO prodEmergencyInfoVO = prodServiceVO.getProdEmergencyInfoVO();
+ prodEmergencyInfoVO.setProdEmergencyResponseIntervalsList(new ArrayList<>());
+ }
+ if (Objects.equals(prodDO.getEmergencySwitch(), BaseEnum.YES_ONE.getKey())&&prodServiceVO.getProdEmergencyInfoVO()!=null&&prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseBlackList().get(0).isEmpty()) {
+ ProdEmergencyInfoVO prodEmergencyInfoVO = prodServiceVO.getProdEmergencyInfoVO();
+ prodEmergencyInfoVO.setProdEmergencyResponseBlackList(new ArrayList<>());
+ }
+ if (Objects.equals(prodDO.getAdditionalSwitch(), BaseEnum.YES_ONE.getKey())&&prodServiceVO.getProdAdditionalFeeDatesList()!=null&&prodServiceVO.getProdAdditionalFeeDatesList().get(0).isEmpty()) {
+ prodServiceVO.setProdAdditionalFeeDatesList(new ArrayList<>());
+ }
+ if (Objects.equals(prodDO.getAdditionalFeeSwitch(), BaseEnum.YES_ONE.getKey())&&prodServiceVO.getProdAdditionalFeePeriodsList()!=null&&prodServiceVO.getProdAdditionalFeePeriodsList().get(0).isEmpty()) {
+ prodServiceVO.setProdAdditionalFeePeriodsList(new ArrayList<>());
+ }
+ return prodServiceVO;
+ }*/
}
diff --git a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/service/impl/SkuServiceImpl.java b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/service/impl/SkuServiceImpl.java
index 03af5c2..29dc99d 100644
--- a/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/service/impl/SkuServiceImpl.java
+++ b/tashow-module/tashow-module-product/src/main/java/com/tashow/cloud/product/service/impl/SkuServiceImpl.java
@@ -12,6 +12,8 @@ import com.tashow.cloud.product.service.ProdExtendService;
import com.tashow.cloud.product.service.ProdPropService;
import com.tashow.cloud.product.service.ProdPropValueService;
import com.tashow.cloud.product.service.SkuService;
+import com.tashow.cloud.productapi.api.product.vo.prodpropvalue.ProPageReqVO;
+import com.tashow.cloud.productapi.api.product.vo.prodpropvalue.ProPropRecycleBinVO;
import com.tashow.cloud.productapi.api.product.vo.sku.*;
import com.tashow.cloud.productapi.enums.BaseEnum;
import com.tashow.cloud.productapi.enums.ErrorCodeConstants;
@@ -63,7 +65,8 @@ public class SkuServiceImpl implements SkuService {
private ProdExtendService prodExtendService;
@Resource
private ProdPropValueMapper prodPropValueMapper;
-
+ @Resource
+ private ProdPropMapper prodPropMapper;
@Override
public Long createSku(SkuSaveReqVO createReqVO) {
@@ -393,32 +396,50 @@ public class SkuServiceImpl implements SkuService {
if (CollectionUtil.isNotEmpty(skuPropVO.getSkuList())) {
List skuList = skuPropVO.getSkuList();
List skuListNew = new ArrayList<>();
- List skuListUpdate = new ArrayList<>();
for (SkuDO sku : skuList) {
if (Objects.equals(BaseEnum.YES_ONE.getKey(), sku.getIsExist())) {
sku.setProdId(skuPropVO.getProdId());
skuListNew.add(sku);
- } else {
- skuListUpdate.add(sku);
}
}
if (CollUtil.isNotEmpty(skuListNew)) {
skuMapper.insertBatch(skuListNew);
}
- if (CollUtil.isNotEmpty(skuListUpdate)) {
- skuMapper.updateBatch(skuListUpdate);
- }
}
prodExtendMapper.updateByProdId(skuPropVO.getProdId(), skuPropVO.getIsDisable(), skuPropVO.getIsExpire());
//保存规格
prodPropService.updateProdPropAndValues(skuPropVO);
}
+
+ @Override
+ public void updatePropVal(Long id, String propValue) {
+ ProdPropValueDO prodPropValueDO = prodPropValueMapper.selectById(id);
+ ProdPropDO prodPropDO =prodPropMapper.selectById(prodPropValueDO.getPropId());
+ List skuDOList = skuMapper.getSkuListByName(prodPropDO.getProdId(),prodPropValueDO.getPropValue());
+ for (SkuDO skuDO : skuDOList) {
+ if (skuDO.getProperties() != null) {
+ String[] split = skuDO.getProperties().split(",");
+ for (String s : split) {
+ if (s.equals(prodPropValueDO.getPropValue())) {
+ skuDO.setProperties(propValue);
+ skuDO.setSkuName(propValue);
+ skuMapper.updateById(skuDO);
+ }
+ }
+ }
+ }
+ prodPropValueDO.setPropValue(propValue);
+ prodPropValueMapper.updateById(prodPropValueDO);
+ }
+
+
@Override
public void deleteProp(Long id) {
ProdPropValueDO prodPropValueDO = prodPropValueService.getById(id);
+ ProdPropDO prodPropDO =prodPropMapper.selectById(prodPropValueDO.getPropId());
prodPropValueService.deleteProdPropValue(id);
- List skuDOList = skuMapper.getSkuListByName(prodPropValueDO.getPropValue());
+ List skuDOList = skuMapper.getSkuListByName(prodPropDO.getProdId(),prodPropValueDO.getPropValue());
List skuids = new ArrayList<>();
for (SkuDO skuDO : skuDOList) {
if (skuDO.getProperties() != null) {
@@ -436,25 +457,28 @@ public class SkuServiceImpl implements SkuService {
}
@Override
- public void disableProp(Long id) {
+ public void disableProp(Long id, Integer state) {
ProdPropValueDO prodPropValueDO = prodPropValueService.getById(id);
- prodPropValueDO.setState(BaseEnum.YES_ONE.getKey());
+ prodPropValueDO.setState(state);
prodPropValueService.updateById(prodPropValueDO);
- List skuDOList = skuMapper.getSkuListByName(prodPropValueDO.getPropValue());
- List skuDOList1 = new ArrayList<>();
- for (SkuDO skuDO : skuDOList) {
- if (skuDO.getProperties() != null) {
- String[] split = skuDO.getProperties().split(",");
- for (String s : split) {
- if (s.equals(prodPropValueDO.getPropValue())) {
- skuDO.setIsShelf(BaseEnum.NO_ZERO.getKey());
- skuDOList1.add(skuDO);
+ ProdPropDO prodPropDO =prodPropMapper.selectById(prodPropValueDO.getPropId());
+ if (Objects.equals(BaseEnum.NO_ZERO.getKey(), state)) {
+ List skuDOList = skuMapper.getSkuListByName(prodPropDO.getProdId(),prodPropValueDO.getPropValue());
+ List skuDOList1 = new ArrayList<>();
+ for (SkuDO skuDO : skuDOList) {
+ if (skuDO.getProperties() != null) {
+ String[] split = skuDO.getProperties().split(",");
+ for (String s : split) {
+ if (s.equals(prodPropValueDO.getPropValue())) {
+ skuDO.setIsShelf(BaseEnum.NO_ZERO.getKey());
+ skuDOList1.add(skuDO);
+ }
}
}
}
- }
- if (CollUtil.isNotEmpty(skuDOList1)) {
- skuMapper.updateBatch(skuDOList1);
+ if (CollUtil.isNotEmpty(skuDOList1)) {
+ skuMapper.updateBatch(skuDOList1);
+ }
}
}
@@ -470,6 +494,7 @@ public class SkuServiceImpl implements SkuService {
List values = prodPropValueService.list(
new LambdaQueryWrapper()
.eq(ProdPropValueDO::getPropId, prop.getId())
+ .eq(ProdPropValueDO::getDeleted, BaseEnum.NO_ZERO.getKey())
.orderByAsc(ProdPropValueDO::getSort)
);
prop.setProdPropValues(values);
@@ -483,6 +508,17 @@ public class SkuServiceImpl implements SkuService {
return skuPropInfoVO;
}
+ @Override
+ public PageResult getSKuPropRecycleBinList(ProPageReqVO proPageReqVO) {
+ IPage prodPageList = prodPropValueMapper.getSKuPropRecycleBinList(MyBatisUtils.buildPage(proPageReqVO), proPageReqVO.getProdId(), proPageReqVO.getPropValue());
+ for (ProPropRecycleBinVO prodPage : prodPageList.getRecords()) {
+ if (prodPage.getDeleteTime() != null) {
+ prodPage.setRemainingDays(DateUtils.getRemainingDays(prodPage.getDeleteTime()));
+ }
+ }
+ return new PageResult<>(prodPageList.getRecords(), prodPageList.getTotal());
+ }
+
/* @Override
public SkuPropInfoVO getSKuPropList(Long prodId, Integer isExpire, Integer state) {
if (prodId == null) {
@@ -710,14 +746,27 @@ public class SkuServiceImpl implements SkuService {
@Override
@Transactional(rollbackFor = Exception.class)
public void restoreSkuList(List ids) {
- List skuList = skuMapper.selectByIds(ids);
+ List skuList = skuMapper.getskuListBySkuIds(ids);
if (skuList.isEmpty()) {
return;
}
+
+ // 获取商品下所有被删除的SKU(除了当前要恢复的 ids)
+ List skuAllDeletedList = skuMapper.getskuListByDeleted(skuList.get(0).getProdId(), ids);
+
+ Set allDeletedValues = new HashSet<>();
+ for (SkuDO sku : skuAllDeletedList) {
+ if (sku.getProperties() != null && !sku.getProperties().trim().isEmpty()) {
+ String[] values = sku.getProperties().split(",");
+ for (String v : values) {
+ allDeletedValues.add(v.trim());
+ }
+ }
+ }
+
Set currentlyUsedValues = new HashSet<>();
for (SkuDO sku : skuList) {
- sku.setDeleted(BaseEnum.NO_ZERO.getKey());
- skuMapper.updateById(sku);
+ skuMapper.updateSkuDeleted(sku.getSkuId());
if (sku.getProperties() != null && !sku.getProperties().trim().isEmpty()) {
String[] values = sku.getProperties().split(",");
for (String v : values) {
@@ -725,21 +774,42 @@ public class SkuServiceImpl implements SkuService {
}
}
}
- //恢复被删除的属性值
- if(!currentlyUsedValues.isEmpty()){
- Long prodId = skuList.get(0).getProdId();
- List allPropValues =prodPropValueMapper.selectRestoreProp(prodId);
- if(!allPropValues.isEmpty()){
- for (ProdPropValueDO pv : allPropValues){
- if (currentlyUsedValues.contains(pv.getPropValue())) {
- pv.setIsExpire(BaseEnum.NO_ZERO.getKey());
- prodPropValueMapper.updateById(pv);
- }
+
+ // === 核心修改点:提取 currentlyUsedValues 中不在 allDeletedValues 的值(即新增启用的规格值)===
+ Set valuesToRestore = new HashSet<>(currentlyUsedValues);
+ valuesToRestore.removeAll(allDeletedValues); // 只保留“之前被删掉过”的规格值
+
+ // 如果没有需要恢复的规格值,直接返回
+ if (valuesToRestore.isEmpty()) {
+ return;
+ }
+
+ // 查询商品下所有属性值
+ Long prodId = skuList.get(0).getProdId();
+ List allPropValues = prodPropValueMapper.selectRestoreProp(prodId);
+
+ if (!allPropValues.isEmpty()) {
+ for (ProdPropValueDO pv : allPropValues) {
+ // 仅当该属性值是“当前使用”且“之前被删除”的(即在 valuesToRestore 中),才恢复
+ if (valuesToRestore.contains(pv.getPropValue())) {
+ pv.setIsExpire(BaseEnum.NO_ZERO.getKey()); // 标记为未过期
+ prodPropValueMapper.updateById(pv);
}
}
}
}
+ @Override
+ public void restorePropList(List ids) {
+ prodPropValueMapper.restorePropValue(ids);
+ List prodPropValueDOList = prodPropValueMapper.getskuListByPropValueIds(ids);
+ for (ProdPropValueDO prodPropValueDO : prodPropValueDOList) {
+ int maxPropValue =prodPropValueMapper.getMaxPropValue(prodPropValueDO.getPropId());
+ prodPropValueDO.setSort(maxPropValue+1);
+ prodPropValueService.updateById(prodPropValueDO);
+ }
+ }
+
@Override
public void updatSkuIsShelf(Long id, Integer isShelf) {
@@ -749,10 +819,8 @@ public class SkuServiceImpl implements SkuService {
SkuDO prodSku = skuMapper.selectById(id);
// Step 1: 获取该商品下所有未禁用的 SKU 的 properties
List activeProperties = skuMapper.selectPropertiesByProdIdShelf(prodSku.getProdId());
- SkuDO sku = new SkuDO();
- sku.setSkuId(id);
- sku.setIsShelf(isShelf);
- skuMapper.updateById(sku);
+ prodSku.setIsShelf(isShelf);
+ skuMapper.updateById(prodSku);
// Step 2: 提取所有正在被使用的属性值(去重)
Set currentlyUsedValues = new HashSet<>();
for (String props : activeProperties) {
@@ -797,42 +865,35 @@ public class SkuServiceImpl implements SkuService {
if (!allSameProd) {
throw new IllegalArgumentException("批量删除的 SKU 必须属于同一个商品");
}
-
-
- // Step 3: 获取该商品下【当前仍然未禁用】的 SKU 的 properties
- List activeProperties = skuMapper.selectPropertiesByProdIdShelf(prodId);
-
for (Long id : ids) {
SkuDO sku = new SkuDO();
sku.setSkuId(id);
sku.setIsShelf(isShelf);
- skuMapper.updateBatch(sku);
+ skuMapper.updateById(sku);
}
- // Step 4: 提取所有仍在使用的属性值(去重 + trim)
- Set currentlyUsedValues = new HashSet<>();
- for (String props : activeProperties) {
- if (props != null && !props.trim().isEmpty()) {
- String[] values = props.split(",");
- for (String v : values) {
- currentlyUsedValues.add(v.trim());
- }
- }
+ // ================================
+ //新增逻辑:判断商品整体上下架状态,并更新 tz_prod_prop_value.state
+ // ================================
+ // 查询该商品下所有未删除的 SKU 的 is_shelf 状态
+ List allSkuShelfStatus = skuMapper.selectShelfStatusByProdId(prodId);
+
+ if (allSkuShelfStatus.isEmpty()) {
+ return; // 没有 SKU,无需处理
}
- // Step 5: 查询该商品下所有 rule=1 的销售属性值(未删除的)
- List allPropValues = prodPropValueMapper.selectSalesValuesByState(prodId);
+ boolean allShelf = allSkuShelfStatus.stream().allMatch(status -> status == 1); // 全部上架
+ boolean allOffShelf = allSkuShelfStatus.stream().allMatch(status -> status == 0); // 全部下架
- // Step 6: 收集需要删除的属性值 ID
- List valueIdsToDelete = new ArrayList<>();
- for (ProdPropValueDO pv : allPropValues) {
- String value = pv.getPropValue().trim();
- if (!currentlyUsedValues.contains(value)) {
- valueIdsToDelete.add(pv.getId());
- }
+ Integer targetState = null;
+ if (allShelf) {
+ targetState = 1; // 启用
+ } else if (allOffShelf) {
+ targetState = 0; // 禁用
}
- // Step 7: 批量删除无用的属性值
- if (!valueIdsToDelete.isEmpty()) {
- prodPropValueMapper.batchMarkDeleted(valueIdsToDelete);
+ // 混合状态:不修改 state
+ // 如果需要更新状态,则批量更新 tz_prod_prop_value 的 state 字段
+ if (targetState != null) {
+ prodPropValueMapper.updateStateByProdId(prodId, targetState);
}
}
diff --git a/tashow-module/tashow-module-product/src/main/resources/application-local.yaml b/tashow-module/tashow-module-product/src/main/resources/application-local.yaml
index c2316fd..e56317a 100644
--- a/tashow-module/tashow-module-product/src/main/resources/application-local.yaml
+++ b/tashow-module/tashow-module-product/src/main/resources/application-local.yaml
@@ -7,10 +7,10 @@ spring:
username: nacos # Nacos 账号
password: nacos # Nacos 密码
discovery: # 【配置中心】配置项
- namespace: 76667956-2ac2-4e05-906b-4bca4ebcc5f0 # 命名空间。这里使用 dev 开发环境
+ namespace: 16bd40df-7cc7-4c2c-82c2-6186ade7bb08 # 命名空间。这里使用 dev 开发环境
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
metadata:
version: 1.0.0 # 服务实例的版本号,可用于灰度发布
config: # 【注册中心】配置项
- namespace: 76667956-2ac2-4e05-906b-4bca4ebcc5f0 # 命名空间。这里使用 dev 开发环境
+ namespace: 16bd40df-7cc7-4c2c-82c2-6186ade7bb08 # 命名空间。这里使用 dev 开发环境
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
diff --git a/tashow-module/tashow-module-product/src/main/resources/mapper/product/ProdAdditionalFeeDatesMapper.xml b/tashow-module/tashow-module-product/src/main/resources/mapper/product/ProdAdditionalFeeDatesMapper.xml
index 49e31a2..595494e 100644
--- a/tashow-module/tashow-module-product/src/main/resources/mapper/product/ProdAdditionalFeeDatesMapper.xml
+++ b/tashow-module/tashow-module-product/src/main/resources/mapper/product/ProdAdditionalFeeDatesMapper.xml
@@ -9,4 +9,7 @@
文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
-->
+
+ delete from tz_prod_additional_fee_dates where prod_id = #{prodId} AND type = #{type}
+
\ No newline at end of file
diff --git a/tashow-module/tashow-module-product/src/main/resources/mapper/product/ProdMapper.xml b/tashow-module/tashow-module-product/src/main/resources/mapper/product/ProdMapper.xml
index 3134a78..1d744e7 100644
--- a/tashow-module/tashow-module-product/src/main/resources/mapper/product/ProdMapper.xml
+++ b/tashow-module/tashow-module-product/src/main/resources/mapper/product/ProdMapper.xml
@@ -25,16 +25,20 @@
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
+
@@ -42,7 +46,7 @@
-
+
@@ -52,12 +56,15 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -83,17 +90,22 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -113,21 +125,15 @@
-
+
-
-
-
-
-
-
@@ -149,16 +155,20 @@
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
+
@@ -166,7 +176,7 @@
-
+
@@ -176,12 +186,14 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -192,19 +204,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
@@ -224,7 +240,7 @@
-
+
@@ -241,145 +257,135 @@
@@ -389,6 +395,7 @@
+
+ SELECT max(sort) FROM `tz_prod_prop_value` WHERE prop_id = #{propId} AND deleted = 0
+
+
+
+ UPDATE tz_prod_prop_value
+ SET state = #{state}
+ WHERE prop_id IN (
+ SELECT id FROM tz_prod_prop
+ WHERE prod_id = #{prodId}
+ AND deleted = 0
+ )
+ AND deleted = 0
+
@@ -62,7 +76,7 @@
UPDATE tz_prod_prop_value
SET
- is_expire = 1, delete_time = NOW()
+ deleted = 1, delete_time = NOW()
WHERE id = #{id}
@@ -78,6 +92,39 @@
+
+ SELECT
+ ppv.id,
+ ppv.prop_value,
+ ppv.prop_id,
+ ppv.delete_time
+ FROM tz_prod_prop pp
+ JOIN tz_prod_prop_value ppv ON pp.id = ppv.prop_id
+ WHERE pp.prod_id = #{prodId}
+ AND (ppv.is_expire = 1 or ppv.deleted = 1)
+
+ and prop_value like concat('%', #{propValue}, '%')
+
+
+
+ SELECT *
+ FROM tz_prod_prop_value
+ WHERE id IN
+
+ #{id}
+
+
+
+
+
+ UPDATE tz_prod_prop_value
+ SET is_expire = 1, deleted = 0
+ WHERE id IN
+
+ #{id}
+
+
+
\ No newline at end of file
diff --git a/tashow-module/tashow-module-product/src/main/resources/mapper/product/ProdReservationConfigMapper.xml b/tashow-module/tashow-module-product/src/main/resources/mapper/product/ProdReservationConfigMapper.xml
index e63b0dd..0ca09cf 100644
--- a/tashow-module/tashow-module-product/src/main/resources/mapper/product/ProdReservationConfigMapper.xml
+++ b/tashow-module/tashow-module-product/src/main/resources/mapper/product/ProdReservationConfigMapper.xml
@@ -8,5 +8,7 @@
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
-->
-
+
+ delete from tz_prod_reservation_config where prod_id = #{prodId}
+
\ No newline at end of file
diff --git a/tashow-module/tashow-module-product/src/main/resources/mapper/product/ProdWeightRangePricesMapper.xml b/tashow-module/tashow-module-product/src/main/resources/mapper/product/ProdWeightRangePricesMapper.xml
index 497aa0f..645da2c 100644
--- a/tashow-module/tashow-module-product/src/main/resources/mapper/product/ProdWeightRangePricesMapper.xml
+++ b/tashow-module/tashow-module-product/src/main/resources/mapper/product/ProdWeightRangePricesMapper.xml
@@ -8,5 +8,7 @@
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
-->
-
+
+ delete from tz_prod_weight_range_prices where prod_id = #{prodId}
+
\ No newline at end of file
diff --git a/tashow-module/tashow-module-product/src/main/resources/mapper/product/SkuMapper.xml b/tashow-module/tashow-module-product/src/main/resources/mapper/product/SkuMapper.xml
index 4d34704..d1aed74 100644
--- a/tashow-module/tashow-module-product/src/main/resources/mapper/product/SkuMapper.xml
+++ b/tashow-module/tashow-module-product/src/main/resources/mapper/product/SkuMapper.xml
@@ -10,7 +10,7 @@
-->
- select sku_id, properties, delete_time from tz_sku where prod_id = #{prodId} and deleted = 1
+ select * from tz_sku where prod_id = #{prodId} and deleted = 1
and properties like concat('%', #{properties}, '%')
@@ -32,7 +32,7 @@
- select sku_id, properties, delete_time,deleted from tz_sku where deleted = 0
+ select sku_id, properties, delete_time,deleted from tz_sku where deleted = 0 and prod_id = #{prodId}
and properties like concat('%', #{propertiesName}, '%')
@@ -73,4 +73,49 @@
#{id}
+
+
+
+ SELECT *
+ FROM tz_sku
+ WHERE sku_id IN
+
+ #{id}
+
+
+
+
+ SELECT *
+ FROM tz_sku
+ WHERE prod_id = #{prodId} AND deleted = 1 and sku_id not IN
+
+ #{id}
+
+
+
+
+
+
+ UPDATE tz_sku
+ SET deleted = 0
+ WHERE sku_id = #{skuId}
+
+
+
+
+ UPDATE tz_sku
+ SET deleted = 0
+ WHERE sku_id IN
+
+ #{id}
+
+
+
+
+ SELECT is_shelf
+ FROM tz_sku
+ WHERE prod_id = #{prodId}
+ AND deleted = 0
+
+
\ No newline at end of file
diff --git a/tashow-module/tashow-module-system/src/main/java/com/tashow/cloud/system/SystemServerApplication.java b/tashow-module/tashow-module-system/src/main/java/com/tashow/cloud/system/SystemServerApplication.java
index 02aafca..e24bfed 100644
--- a/tashow-module/tashow-module-system/src/main/java/com/tashow/cloud/system/SystemServerApplication.java
+++ b/tashow-module/tashow-module-system/src/main/java/com/tashow/cloud/system/SystemServerApplication.java
@@ -11,6 +11,7 @@ public class SystemServerApplication {
public static void main(String[] args) {
SpringApplication.run(SystemServerApplication.class, args);
+ System.out.println("系统启动成功");
}
}
diff --git a/tashow-module/tashow-module-system/src/main/java/com/tashow/cloud/system/controller/admin/sms/vo/log/SmsLogPageReqVO.java b/tashow-module/tashow-module-system/src/main/java/com/tashow/cloud/system/controller/admin/sms/vo/log/SmsLogPageReqVO.java
index cc71677..8c10333 100644
--- a/tashow-module/tashow-module-system/src/main/java/com/tashow/cloud/system/controller/admin/sms/vo/log/SmsLogPageReqVO.java
+++ b/tashow-module/tashow-module-system/src/main/java/com/tashow/cloud/system/controller/admin/sms/vo/log/SmsLogPageReqVO.java
@@ -1,14 +1,15 @@
package com.tashow.cloud.system.controller.admin.sms.vo.log;
-import static com.tashow.cloud.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
-
import com.tashow.cloud.common.pojo.PageParam;
-import java.time.LocalDateTime;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static com.tashow.cloud.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
/** 管理后台 - 短信日志分页 Request VO */
@Data
@EqualsAndHashCode(callSuper = true)
@@ -27,8 +28,8 @@ public class SmsLogPageReqVO extends PageParam {
/** 发送状态,参见 SmsSendStatusEnum 枚举类 */
private Integer sendStatus;
- @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
/** 发送时间 */
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] sendTime;
/** 接收状态,参见 SmsReceiveStatusEnum 枚举类 */
diff --git a/tashow-module/tashow-module-system/src/main/java/com/tashow/cloud/system/service/permission/PermissionServiceImpl.java b/tashow-module/tashow-module-system/src/main/java/com/tashow/cloud/system/service/permission/PermissionServiceImpl.java
index 6a48c1d..0ac1494 100644
--- a/tashow-module/tashow-module-system/src/main/java/com/tashow/cloud/system/service/permission/PermissionServiceImpl.java
+++ b/tashow-module/tashow-module-system/src/main/java/com/tashow/cloud/system/service/permission/PermissionServiceImpl.java
@@ -240,7 +240,7 @@ public class PermissionServiceImpl implements PermissionService {
}
@Override
- @Cacheable(value = RedisKeyConstants.USER_ROLE_ID_LIST, key = "#userId")
+// @Cacheable(value = RedisKeyConstants.USER_ROLE_ID_LIST, key = "#userId")
public Set getUserRoleIdListByUserIdFromCache(Long userId) {
return getUserRoleIdListByUserId(userId);
}
diff --git a/tashow-module/tashow-module-system/src/main/resources/application.yaml b/tashow-module/tashow-module-system/src/main/resources/application.yaml
index 7634367..ab25c7d 100644
--- a/tashow-module/tashow-module-system/src/main/resources/application.yaml
+++ b/tashow-module/tashow-module-system/src/main/resources/application.yaml
@@ -10,7 +10,6 @@ spring:
- optional:classpath:application-${spring.profiles.active}.yaml # 加载【本地】配置
- optional:nacos:application.yaml # 加载【Nacos】通用的配置
- optional:nacos:tenant.yaml # 加载【Nacos】通用的配置
- - optional:nacos:application-login.yaml # 加载登录配置
- optional:nacos:${spring.application.name}-${spring.profiles.active}.yaml # 加载【Nacos】的配置