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 * from tz_prod_prop where prop_name = #{propName} and prod_id = #{prodId} and rule = #{rule} + + + \ No newline at end of file diff --git a/tashow-module/tashow-module-product/src/main/resources/mapper/product/ProdPropValueMapper.xml b/tashow-module/tashow-module-product/src/main/resources/mapper/product/ProdPropValueMapper.xml index 0587e77..5eb4f81 100644 --- a/tashow-module/tashow-module-product/src/main/resources/mapper/product/ProdPropValueMapper.xml +++ b/tashow-module/tashow-module-product/src/main/resources/mapper/product/ProdPropValueMapper.xml @@ -47,6 +47,20 @@ + + + + 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 @@ + + + + + + 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,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} + + + + + + + + + + UPDATE tz_sku + SET deleted = 0 + WHERE sku_id = #{skuId} + + + + + UPDATE tz_sku + SET deleted = 0 + WHERE sku_id IN + + #{id} + + + + + \ 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】的配置