# Conflicts:
#	pom.xml
#	yudao-dependencies/pom.xml
This commit is contained in:
YunaiV 2025-11-24 17:03:53 +08:00
commit ec0c4eebdb
50 changed files with 349 additions and 159 deletions

View File

@ -18,7 +18,7 @@
<!-- <module>yudao-module-member</module>--> <!-- <module>yudao-module-member</module>-->
<!-- <module>yudao-module-bpm</module>--> <!-- <module>yudao-module-bpm</module>-->
<!-- <module>yudao-module-report</module>--> <!-- <module>yudao-module-report</module>-->
<!-- <module>yudao-module-mp</module>--> <module>yudao-module-mp</module>
<!-- <module>yudao-module-pay</module>--> <!-- <module>yudao-module-pay</module>-->
<!-- <module>yudao-module-mall</module>--> <!-- <module>yudao-module-mall</module>-->
<!-- <module>yudao-module-crm</module>--> <!-- <module>yudao-module-crm</module>-->
@ -42,7 +42,7 @@
<maven-compiler-plugin.version>3.14.0</maven-compiler-plugin.version> <maven-compiler-plugin.version>3.14.0</maven-compiler-plugin.version>
<flatten-maven-plugin.version>1.7.2</flatten-maven-plugin.version> <flatten-maven-plugin.version>1.7.2</flatten-maven-plugin.version>
<!-- maven-surefire-plugin 暂时无法通过 bom 的依赖读取(兼容老版本 IDEA 2024 及以前版本) --> <!-- maven-surefire-plugin 暂时无法通过 bom 的依赖读取(兼容老版本 IDEA 2024 及以前版本) -->
<lombok.version>1.18.38</lombok.version> <lombok.version>1.18.42</lombok.version>
<spring.boot.version>2.7.18</spring.boot.version> <spring.boot.version>2.7.18</spring.boot.version>
<mapstruct.version>1.6.3</mapstruct.version> <mapstruct.version>1.6.3</mapstruct.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

View File

@ -1063,7 +1063,7 @@ INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_t
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1690, 5, '向量', '5', 'ai_model_type', 0, '', '', '', '1', '2025-03-03 12:28:15', '1', '2025-03-03 12:28:15', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1690, 5, '向量', '5', 'ai_model_type', 0, '', '', '', '1', '2025-03-03 12:28:15', '1', '2025-03-03 12:28:15', '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1691, 6, '重排', '6', 'ai_model_type', 0, '', '', '', '1', '2025-03-03 12:28:26', '1', '2025-03-03 12:28:26', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1691, 6, '重排', '6', 'ai_model_type', 0, '', '', '', '1', '2025-03-03 12:28:26', '1', '2025-03-03 12:28:26', '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1692, 14, 'MiniMax', 'MiniMax', 'ai_platform', 0, '', '', '', '1', '2025-03-11 20:04:51', '1', '2025-03-11 20:04:51', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1692, 14, 'MiniMax', 'MiniMax', 'ai_platform', 0, '', '', '', '1', '2025-03-11 20:04:51', '1', '2025-03-11 20:04:51', '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1693, 15, '月之暗', 'Moonshot', 'ai_platform', 0, '', '', '', '1', '2025-03-11 20:05:08', '1', '2025-03-11 20:05:08', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1693, 15, '月之暗', 'Moonshot', 'ai_platform', 0, '', '', '', '1', '2025-03-11 20:05:08', '1', '2025-03-11 20:05:08', '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2000, 0, '标准数据格式JSON', '0', 'iot_data_format', 0, 'default', '', '', '1', '2024-08-10 11:53:26', '1', '2025-03-17 09:28:16', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2000, 0, '标准数据格式JSON', '0', 'iot_data_format', 0, 'default', '', '', '1', '2024-08-10 11:53:26', '1', '2025-03-17 09:28:16', '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2001, 1, '透传/自定义', '1', 'iot_data_format', 0, 'default', '', '', '1', '2024-08-10 11:53:37', '1', '2025-03-17 09:28:19', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2001, 1, '透传/自定义', '1', 'iot_data_format', 0, 'default', '', '', '1', '2024-08-10 11:53:37', '1', '2025-03-17 09:28:19', '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2002, 0, '直连设备', '0', 'iot_product_device_type', 0, 'default', '', '', '1', '2024-08-10 11:54:58', '1', '2025-03-17 09:28:22', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2002, 0, '直连设备', '0', 'iot_product_device_type', 0, 'default', '', '', '1', '2024-08-10 11:54:58', '1', '2025-03-17 09:28:22', '0');

View File

@ -1177,7 +1177,7 @@ INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_t
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1690, 5, '向量', '5', 'ai_model_type', 0, '', '', '', '1', '2025-03-03 12:28:15', '1', '2025-03-03 12:28:15', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1690, 5, '向量', '5', 'ai_model_type', 0, '', '', '', '1', '2025-03-03 12:28:15', '1', '2025-03-03 12:28:15', '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1691, 6, '重排', '6', 'ai_model_type', 0, '', '', '', '1', '2025-03-03 12:28:26', '1', '2025-03-03 12:28:26', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1691, 6, '重排', '6', 'ai_model_type', 0, '', '', '', '1', '2025-03-03 12:28:26', '1', '2025-03-03 12:28:26', '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1692, 14, 'MiniMax', 'MiniMax', 'ai_platform', 0, '', '', '', '1', '2025-03-11 20:04:51', '1', '2025-03-11 20:04:51', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1692, 14, 'MiniMax', 'MiniMax', 'ai_platform', 0, '', '', '', '1', '2025-03-11 20:04:51', '1', '2025-03-11 20:04:51', '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1693, 15, '月之暗', 'Moonshot', 'ai_platform', 0, '', '', '', '1', '2025-03-11 20:05:08', '1', '2025-03-11 20:05:08', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1693, 15, '月之暗', 'Moonshot', 'ai_platform', 0, '', '', '', '1', '2025-03-11 20:05:08', '1', '2025-03-11 20:05:08', '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2000, 0, '标准数据格式JSON', '0', 'iot_data_format', 0, 'default', '', '', '1', '2024-08-10 11:53:26', '1', '2025-03-17 09:28:16', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2000, 0, '标准数据格式JSON', '0', 'iot_data_format', 0, 'default', '', '', '1', '2024-08-10 11:53:26', '1', '2025-03-17 09:28:16', '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2001, 1, '透传/自定义', '1', 'iot_data_format', 0, 'default', '', '', '1', '2024-08-10 11:53:37', '1', '2025-03-17 09:28:19', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2001, 1, '透传/自定义', '1', 'iot_data_format', 0, 'default', '', '', '1', '2024-08-10 11:53:37', '1', '2025-03-17 09:28:19', '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2002, 0, '直连设备', '0', 'iot_product_device_type', 0, 'default', '', '', '1', '2024-08-10 11:54:58', '1', '2025-03-17 09:28:22', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2002, 0, '直连设备', '0', 'iot_product_device_type', 0, 'default', '', '', '1', '2024-08-10 11:54:58', '1', '2025-03-17 09:28:22', '0');

View File

@ -883,7 +883,7 @@ INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `st
INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1690, 5, '向量', '5', 'ai_model_type', 0, '', '', '', '1', '2025-03-03 12:28:15', '1', '2025-03-03 12:28:15', b'0'); INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1690, 5, '向量', '5', 'ai_model_type', 0, '', '', '', '1', '2025-03-03 12:28:15', '1', '2025-03-03 12:28:15', b'0');
INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1691, 6, '重排', '6', 'ai_model_type', 0, '', '', '', '1', '2025-03-03 12:28:26', '1', '2025-03-03 12:28:26', b'0'); INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1691, 6, '重排', '6', 'ai_model_type', 0, '', '', '', '1', '2025-03-03 12:28:26', '1', '2025-03-03 12:28:26', b'0');
INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1692, 14, 'MiniMax', 'MiniMax', 'ai_platform', 0, '', '', '', '1', '2025-03-11 20:04:51', '1', '2025-03-11 20:04:51', b'0'); INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1692, 14, 'MiniMax', 'MiniMax', 'ai_platform', 0, '', '', '', '1', '2025-03-11 20:04:51', '1', '2025-03-11 20:04:51', b'0');
INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1693, 15, '月之暗', 'Moonshot', 'ai_platform', 0, '', '', '', '1', '2025-03-11 20:05:08', '1', '2025-03-11 20:05:08', b'0'); INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1693, 15, '月之暗', 'Moonshot', 'ai_platform', 0, '', '', '', '1', '2025-03-11 20:05:08', '1', '2025-03-11 20:05:08', b'0');
INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2002, 0, '直连设备', '0', 'iot_product_device_type', 0, 'default', '', '', '1', '2024-08-10 11:54:58', '1', '2025-03-17 09:28:22', b'0'); INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2002, 0, '直连设备', '0', 'iot_product_device_type', 0, 'default', '', '', '1', '2024-08-10 11:54:58', '1', '2025-03-17 09:28:22', b'0');
INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2003, 2, '网关设备', '2', 'iot_product_device_type', 0, 'default', '', '', '1', '2024-08-10 11:55:08', '1', '2025-03-17 09:28:28', b'0'); INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2003, 2, '网关设备', '2', 'iot_product_device_type', 0, 'default', '', '', '1', '2024-08-10 11:55:08', '1', '2025-03-17 09:28:28', b'0');
INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2004, 1, '网关子设备', '1', 'iot_product_device_type', 0, 'default', '', '', '1', '2024-08-10 11:55:20', '1', '2025-03-17 09:28:31', b'0'); INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2004, 1, '网关子设备', '1', 'iot_product_device_type', 0, 'default', '', '', '1', '2024-08-10 11:55:20', '1', '2025-03-17 09:28:31', b'0');

View File

@ -1177,7 +1177,7 @@ INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_t
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1690, 5, '向量', '5', 'ai_model_type', 0, '', '', '', '1', '2025-03-03 12:28:15', '1', '2025-03-03 12:28:15', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1690, 5, '向量', '5', 'ai_model_type', 0, '', '', '', '1', '2025-03-03 12:28:15', '1', '2025-03-03 12:28:15', '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1691, 6, '重排', '6', 'ai_model_type', 0, '', '', '', '1', '2025-03-03 12:28:26', '1', '2025-03-03 12:28:26', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1691, 6, '重排', '6', 'ai_model_type', 0, '', '', '', '1', '2025-03-03 12:28:26', '1', '2025-03-03 12:28:26', '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1692, 14, 'MiniMax', 'MiniMax', 'ai_platform', 0, '', '', '', '1', '2025-03-11 20:04:51', '1', '2025-03-11 20:04:51', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1692, 14, 'MiniMax', 'MiniMax', 'ai_platform', 0, '', '', '', '1', '2025-03-11 20:04:51', '1', '2025-03-11 20:04:51', '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1693, 15, '月之暗', 'Moonshot', 'ai_platform', 0, '', '', '', '1', '2025-03-11 20:05:08', '1', '2025-03-11 20:05:08', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1693, 15, '月之暗', 'Moonshot', 'ai_platform', 0, '', '', '', '1', '2025-03-11 20:05:08', '1', '2025-03-11 20:05:08', '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2000, 0, '标准数据格式JSON', '0', 'iot_data_format', 0, 'default', '', '', '1', '2024-08-10 11:53:26', '1', '2025-03-17 09:28:16', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2000, 0, '标准数据格式JSON', '0', 'iot_data_format', 0, 'default', '', '', '1', '2024-08-10 11:53:26', '1', '2025-03-17 09:28:16', '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2001, 1, '透传/自定义', '1', 'iot_data_format', 0, 'default', '', '', '1', '2024-08-10 11:53:37', '1', '2025-03-17 09:28:19', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2001, 1, '透传/自定义', '1', 'iot_data_format', 0, 'default', '', '', '1', '2024-08-10 11:53:37', '1', '2025-03-17 09:28:19', '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2002, 0, '直连设备', '0', 'iot_product_device_type', 0, 'default', '', '', '1', '2024-08-10 11:54:58', '1', '2025-03-17 09:28:22', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2002, 0, '直连设备', '0', 'iot_product_device_type', 0, 'default', '', '', '1', '2024-08-10 11:54:58', '1', '2025-03-17 09:28:22', '0');

View File

@ -1129,7 +1129,7 @@ INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_t
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1690, 5, '向量', '5', 'ai_model_type', 0, '', '', '', '1', to_date('2025-03-03 12:28:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2025-03-03 12:28:15', 'SYYYY-MM-DD HH24:MI:SS'), '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1690, 5, '向量', '5', 'ai_model_type', 0, '', '', '', '1', to_date('2025-03-03 12:28:15', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2025-03-03 12:28:15', 'SYYYY-MM-DD HH24:MI:SS'), '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1691, 6, '重排', '6', 'ai_model_type', 0, '', '', '', '1', to_date('2025-03-03 12:28:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2025-03-03 12:28:26', 'SYYYY-MM-DD HH24:MI:SS'), '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1691, 6, '重排', '6', 'ai_model_type', 0, '', '', '', '1', to_date('2025-03-03 12:28:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2025-03-03 12:28:26', 'SYYYY-MM-DD HH24:MI:SS'), '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1692, 14, 'MiniMax', 'MiniMax', 'ai_platform', 0, '', '', '', '1', to_date('2025-03-11 20:04:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2025-03-11 20:04:51', 'SYYYY-MM-DD HH24:MI:SS'), '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1692, 14, 'MiniMax', 'MiniMax', 'ai_platform', 0, '', '', '', '1', to_date('2025-03-11 20:04:51', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2025-03-11 20:04:51', 'SYYYY-MM-DD HH24:MI:SS'), '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1693, 15, '月之暗', 'Moonshot', 'ai_platform', 0, '', '', '', '1', to_date('2025-03-11 20:05:08', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2025-03-11 20:05:08', 'SYYYY-MM-DD HH24:MI:SS'), '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1693, 15, '月之暗', 'Moonshot', 'ai_platform', 0, '', '', '', '1', to_date('2025-03-11 20:05:08', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2025-03-11 20:05:08', 'SYYYY-MM-DD HH24:MI:SS'), '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2000, 0, '标准数据格式JSON', '0', 'iot_data_format', 0, 'default', '', '', '1', to_date('2024-08-10 11:53:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2025-03-17 09:28:16', 'SYYYY-MM-DD HH24:MI:SS'), '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2000, 0, '标准数据格式JSON', '0', 'iot_data_format', 0, 'default', '', '', '1', to_date('2024-08-10 11:53:26', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2025-03-17 09:28:16', 'SYYYY-MM-DD HH24:MI:SS'), '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2001, 1, '透传/自定义', '1', 'iot_data_format', 0, 'default', '', '', '1', to_date('2024-08-10 11:53:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2025-03-17 09:28:19', 'SYYYY-MM-DD HH24:MI:SS'), '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2001, 1, '透传/自定义', '1', 'iot_data_format', 0, 'default', '', '', '1', to_date('2024-08-10 11:53:37', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2025-03-17 09:28:19', 'SYYYY-MM-DD HH24:MI:SS'), '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2002, 0, '直连设备', '0', 'iot_product_device_type', 0, 'default', '', '', '1', to_date('2024-08-10 11:54:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2025-03-17 09:28:22', 'SYYYY-MM-DD HH24:MI:SS'), '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2002, 0, '直连设备', '0', 'iot_product_device_type', 0, 'default', '', '', '1', to_date('2024-08-10 11:54:58', 'SYYYY-MM-DD HH24:MI:SS'), '1', to_date('2025-03-17 09:28:22', 'SYYYY-MM-DD HH24:MI:SS'), '0');

View File

@ -33,7 +33,7 @@ INSERT INTO dual VALUES (1);
DROP TABLE IF EXISTS infra_api_access_log; DROP TABLE IF EXISTS infra_api_access_log;
CREATE TABLE infra_api_access_log CREATE TABLE infra_api_access_log
( (
id int8 NOT NULL, id int8 NOT NULL DEFAULT NEXTVAL('infra_api_access_log_seq'),
trace_id varchar(64) NOT NULL DEFAULT '', trace_id varchar(64) NOT NULL DEFAULT '',
user_id int8 NOT NULL DEFAULT 0, user_id int8 NOT NULL DEFAULT 0,
user_type int2 NOT NULL DEFAULT 0, user_type int2 NOT NULL DEFAULT 0,
@ -102,7 +102,7 @@ CREATE SEQUENCE infra_api_access_log_seq
DROP TABLE IF EXISTS infra_api_error_log; DROP TABLE IF EXISTS infra_api_error_log;
CREATE TABLE infra_api_error_log CREATE TABLE infra_api_error_log
( (
id int8 NOT NULL, id int8 NOT NULL DEFAULT NEXTVAL('infra_api_error_log_seq'),
trace_id varchar(64) NOT NULL, trace_id varchar(64) NOT NULL,
user_id int8 NOT NULL DEFAULT 0, user_id int8 NOT NULL DEFAULT 0,
user_type int2 NOT NULL DEFAULT 0, user_type int2 NOT NULL DEFAULT 0,
@ -175,7 +175,7 @@ CREATE SEQUENCE infra_api_error_log_seq
DROP TABLE IF EXISTS infra_codegen_column; DROP TABLE IF EXISTS infra_codegen_column;
CREATE TABLE infra_codegen_column CREATE TABLE infra_codegen_column
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('infra_codegen_column_seq'),
table_id int8 NOT NULL, table_id int8 NOT NULL,
column_name varchar(200) NOT NULL, column_name varchar(200) NOT NULL,
data_type varchar(100) NOT NULL, data_type varchar(100) NOT NULL,
@ -238,7 +238,7 @@ CREATE SEQUENCE infra_codegen_column_seq
DROP TABLE IF EXISTS infra_codegen_table; DROP TABLE IF EXISTS infra_codegen_table;
CREATE TABLE infra_codegen_table CREATE TABLE infra_codegen_table
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('infra_codegen_table_seq'),
data_source_config_id int8 NOT NULL, data_source_config_id int8 NOT NULL,
scene int2 NOT NULL DEFAULT 1, scene int2 NOT NULL DEFAULT 1,
table_name varchar(200) NOT NULL DEFAULT '', table_name varchar(200) NOT NULL DEFAULT '',
@ -303,7 +303,7 @@ CREATE SEQUENCE infra_codegen_table_seq
DROP TABLE IF EXISTS infra_config; DROP TABLE IF EXISTS infra_config;
CREATE TABLE infra_config CREATE TABLE infra_config
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('infra_config_seq'),
category varchar(50) NOT NULL, category varchar(50) NOT NULL,
type int2 NOT NULL, type int2 NOT NULL,
name varchar(100) NOT NULL DEFAULT '', name varchar(100) NOT NULL DEFAULT '',
@ -362,7 +362,7 @@ CREATE SEQUENCE infra_config_seq
DROP TABLE IF EXISTS infra_data_source_config; DROP TABLE IF EXISTS infra_data_source_config;
CREATE TABLE infra_data_source_config CREATE TABLE infra_data_source_config
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('infra_data_source_config_seq'),
name varchar(100) NOT NULL DEFAULT '', name varchar(100) NOT NULL DEFAULT '',
url varchar(1024) NOT NULL, url varchar(1024) NOT NULL,
username varchar(255) NOT NULL, username varchar(255) NOT NULL,
@ -399,7 +399,7 @@ CREATE SEQUENCE infra_data_source_config_seq
DROP TABLE IF EXISTS infra_file; DROP TABLE IF EXISTS infra_file;
CREATE TABLE infra_file CREATE TABLE infra_file
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('infra_file_seq'),
config_id int8 NULL DEFAULT NULL, config_id int8 NULL DEFAULT NULL,
name varchar(256) NULL DEFAULT NULL, name varchar(256) NULL DEFAULT NULL,
path varchar(512) NOT NULL, path varchar(512) NOT NULL,
@ -440,7 +440,7 @@ CREATE SEQUENCE infra_file_seq
DROP TABLE IF EXISTS infra_file_config; DROP TABLE IF EXISTS infra_file_config;
CREATE TABLE infra_file_config CREATE TABLE infra_file_config
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('infra_file_config_seq'),
name varchar(63) NOT NULL, name varchar(63) NOT NULL,
storage int2 NOT NULL, storage int2 NOT NULL,
remark varchar(255) NULL DEFAULT NULL, remark varchar(255) NULL DEFAULT NULL,
@ -496,7 +496,7 @@ CREATE SEQUENCE infra_file_config_seq
DROP TABLE IF EXISTS infra_file_content; DROP TABLE IF EXISTS infra_file_content;
CREATE TABLE infra_file_content CREATE TABLE infra_file_content
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('infra_file_content_seq'),
config_id int8 NOT NULL, config_id int8 NOT NULL,
path varchar(512) NOT NULL, path varchar(512) NOT NULL,
content bytea NOT NULL, content bytea NOT NULL,
@ -531,7 +531,7 @@ CREATE SEQUENCE infra_file_content_seq
DROP TABLE IF EXISTS infra_job; DROP TABLE IF EXISTS infra_job;
CREATE TABLE infra_job CREATE TABLE infra_job
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('infra_job_seq'),
name varchar(32) NOT NULL, name varchar(32) NOT NULL,
status int2 NOT NULL, status int2 NOT NULL,
handler_name varchar(64) NOT NULL, handler_name varchar(64) NOT NULL,
@ -597,7 +597,7 @@ CREATE SEQUENCE infra_job_seq
DROP TABLE IF EXISTS infra_job_log; DROP TABLE IF EXISTS infra_job_log;
CREATE TABLE infra_job_log CREATE TABLE infra_job_log
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('infra_job_log_seq'),
job_id int8 NOT NULL, job_id int8 NOT NULL,
handler_name varchar(64) NOT NULL, handler_name varchar(64) NOT NULL,
handler_param varchar(255) NULL DEFAULT NULL, handler_param varchar(255) NULL DEFAULT NULL,
@ -644,7 +644,7 @@ CREATE SEQUENCE infra_job_log_seq
DROP TABLE IF EXISTS system_dept; DROP TABLE IF EXISTS system_dept;
CREATE TABLE system_dept CREATE TABLE system_dept
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_dept_seq'),
name varchar(30) NOT NULL DEFAULT '', name varchar(30) NOT NULL DEFAULT '',
parent_id int8 NOT NULL DEFAULT 0, parent_id int8 NOT NULL DEFAULT 0,
sort int4 NOT NULL DEFAULT 0, sort int4 NOT NULL DEFAULT 0,
@ -711,7 +711,7 @@ CREATE SEQUENCE system_dept_seq
DROP TABLE IF EXISTS system_dict_data; DROP TABLE IF EXISTS system_dict_data;
CREATE TABLE system_dict_data CREATE TABLE system_dict_data
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_dict_data_seq'),
sort int4 NOT NULL DEFAULT 0, sort int4 NOT NULL DEFAULT 0,
label varchar(100) NOT NULL DEFAULT '', label varchar(100) NOT NULL DEFAULT '',
value varchar(100) NOT NULL DEFAULT '', value varchar(100) NOT NULL DEFAULT '',
@ -1177,7 +1177,7 @@ INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_t
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1690, 5, '向量', '5', 'ai_model_type', 0, '', '', '', '1', '2025-03-03 12:28:15', '1', '2025-03-03 12:28:15', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1690, 5, '向量', '5', 'ai_model_type', 0, '', '', '', '1', '2025-03-03 12:28:15', '1', '2025-03-03 12:28:15', '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1691, 6, '重排', '6', 'ai_model_type', 0, '', '', '', '1', '2025-03-03 12:28:26', '1', '2025-03-03 12:28:26', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1691, 6, '重排', '6', 'ai_model_type', 0, '', '', '', '1', '2025-03-03 12:28:26', '1', '2025-03-03 12:28:26', '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1692, 14, 'MiniMax', 'MiniMax', 'ai_platform', 0, '', '', '', '1', '2025-03-11 20:04:51', '1', '2025-03-11 20:04:51', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1692, 14, 'MiniMax', 'MiniMax', 'ai_platform', 0, '', '', '', '1', '2025-03-11 20:04:51', '1', '2025-03-11 20:04:51', '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1693, 15, '月之暗', 'Moonshot', 'ai_platform', 0, '', '', '', '1', '2025-03-11 20:05:08', '1', '2025-03-11 20:05:08', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1693, 15, '月之暗', 'Moonshot', 'ai_platform', 0, '', '', '', '1', '2025-03-11 20:05:08', '1', '2025-03-11 20:05:08', '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2000, 0, '标准数据格式JSON', '0', 'iot_data_format', 0, 'default', '', '', '1', '2024-08-10 11:53:26', '1', '2025-03-17 09:28:16', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2000, 0, '标准数据格式JSON', '0', 'iot_data_format', 0, 'default', '', '', '1', '2024-08-10 11:53:26', '1', '2025-03-17 09:28:16', '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2001, 1, '透传/自定义', '1', 'iot_data_format', 0, 'default', '', '', '1', '2024-08-10 11:53:37', '1', '2025-03-17 09:28:19', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2001, 1, '透传/自定义', '1', 'iot_data_format', 0, 'default', '', '', '1', '2024-08-10 11:53:37', '1', '2025-03-17 09:28:19', '0');
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2002, 0, '直连设备', '0', 'iot_product_device_type', 0, 'default', '', '', '1', '2024-08-10 11:54:58', '1', '2025-03-17 09:28:22', '0'); INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2002, 0, '直连设备', '0', 'iot_product_device_type', 0, 'default', '', '', '1', '2024-08-10 11:54:58', '1', '2025-03-17 09:28:22', '0');
@ -1367,7 +1367,7 @@ CREATE SEQUENCE system_dict_data_seq
DROP TABLE IF EXISTS system_dict_type; DROP TABLE IF EXISTS system_dict_type;
CREATE TABLE system_dict_type CREATE TABLE system_dict_type
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_dict_type_seq'),
name varchar(100) NOT NULL DEFAULT '', name varchar(100) NOT NULL DEFAULT '',
type varchar(100) NOT NULL DEFAULT '', type varchar(100) NOT NULL DEFAULT '',
status int2 NOT NULL DEFAULT 0, status int2 NOT NULL DEFAULT 0,
@ -1521,7 +1521,7 @@ CREATE SEQUENCE system_dict_type_seq
DROP TABLE IF EXISTS system_login_log; DROP TABLE IF EXISTS system_login_log;
CREATE TABLE system_login_log CREATE TABLE system_login_log
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_login_log_seq'),
log_type int8 NOT NULL, log_type int8 NOT NULL,
trace_id varchar(64) NOT NULL DEFAULT '', trace_id varchar(64) NOT NULL DEFAULT '',
user_id int8 NOT NULL DEFAULT 0, user_id int8 NOT NULL DEFAULT 0,
@ -1568,7 +1568,7 @@ CREATE SEQUENCE system_login_log_seq
DROP TABLE IF EXISTS system_mail_account; DROP TABLE IF EXISTS system_mail_account;
CREATE TABLE system_mail_account CREATE TABLE system_mail_account
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_mail_account_seq'),
mail varchar(255) NOT NULL, mail varchar(255) NOT NULL,
username varchar(255) NOT NULL, username varchar(255) NOT NULL,
password varchar(255) NOT NULL, password varchar(255) NOT NULL,
@ -1623,7 +1623,7 @@ CREATE SEQUENCE system_mail_account_seq
DROP TABLE IF EXISTS system_mail_log; DROP TABLE IF EXISTS system_mail_log;
CREATE TABLE system_mail_log CREATE TABLE system_mail_log
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_mail_log_seq'),
user_id int8 NULL DEFAULT NULL, user_id int8 NULL DEFAULT NULL,
user_type int2 NULL DEFAULT NULL, user_type int2 NULL DEFAULT NULL,
to_mail varchar(255) NOT NULL, to_mail varchar(255) NOT NULL,
@ -1682,7 +1682,7 @@ CREATE SEQUENCE system_mail_log_seq
DROP TABLE IF EXISTS system_mail_template; DROP TABLE IF EXISTS system_mail_template;
CREATE TABLE system_mail_template CREATE TABLE system_mail_template
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_mail_template_seq'),
name varchar(63) NOT NULL, name varchar(63) NOT NULL,
code varchar(63) NOT NULL, code varchar(63) NOT NULL,
account_id int8 NOT NULL, account_id int8 NOT NULL,
@ -1740,7 +1740,7 @@ CREATE SEQUENCE system_mail_template_seq
DROP TABLE IF EXISTS system_menu; DROP TABLE IF EXISTS system_menu;
CREATE TABLE system_menu CREATE TABLE system_menu
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_menu_seq'),
name varchar(50) NOT NULL, name varchar(50) NOT NULL,
permission varchar(100) NOT NULL DEFAULT '', permission varchar(100) NOT NULL DEFAULT '',
type int2 NOT NULL, type int2 NOT NULL,
@ -2714,7 +2714,7 @@ CREATE SEQUENCE system_menu_seq
DROP TABLE IF EXISTS system_notice; DROP TABLE IF EXISTS system_notice;
CREATE TABLE system_notice CREATE TABLE system_notice
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_notice_seq'),
title varchar(50) NOT NULL, title varchar(50) NOT NULL,
content text NOT NULL, content text NOT NULL,
type int2 NOT NULL, type int2 NOT NULL,
@ -2764,7 +2764,7 @@ CREATE SEQUENCE system_notice_seq
DROP TABLE IF EXISTS system_notify_message; DROP TABLE IF EXISTS system_notify_message;
CREATE TABLE system_notify_message CREATE TABLE system_notify_message
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_notify_message_seq'),
user_id int8 NOT NULL, user_id int8 NOT NULL,
user_type int2 NOT NULL, user_type int2 NOT NULL,
template_id int8 NOT NULL, template_id int8 NOT NULL,
@ -2832,7 +2832,7 @@ CREATE SEQUENCE system_notify_message_seq
DROP TABLE IF EXISTS system_notify_template; DROP TABLE IF EXISTS system_notify_template;
CREATE TABLE system_notify_template CREATE TABLE system_notify_template
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_notify_template_seq'),
name varchar(63) NOT NULL, name varchar(63) NOT NULL,
code varchar(64) NOT NULL, code varchar(64) NOT NULL,
nickname varchar(255) NOT NULL, nickname varchar(255) NOT NULL,
@ -2877,7 +2877,7 @@ CREATE SEQUENCE system_notify_template_seq
DROP TABLE IF EXISTS system_oauth2_access_token; DROP TABLE IF EXISTS system_oauth2_access_token;
CREATE TABLE system_oauth2_access_token CREATE TABLE system_oauth2_access_token
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_oauth2_access_token_seq'),
user_id int8 NOT NULL, user_id int8 NOT NULL,
user_type int2 NOT NULL, user_type int2 NOT NULL,
user_info varchar(512) NOT NULL, user_info varchar(512) NOT NULL,
@ -2927,7 +2927,7 @@ CREATE SEQUENCE system_oauth2_access_token_seq
DROP TABLE IF EXISTS system_oauth2_approve; DROP TABLE IF EXISTS system_oauth2_approve;
CREATE TABLE system_oauth2_approve CREATE TABLE system_oauth2_approve
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_oauth2_approve_seq'),
user_id int8 NOT NULL, user_id int8 NOT NULL,
user_type int2 NOT NULL, user_type int2 NOT NULL,
client_id varchar(255) NOT NULL, client_id varchar(255) NOT NULL,
@ -2970,7 +2970,7 @@ CREATE SEQUENCE system_oauth2_approve_seq
DROP TABLE IF EXISTS system_oauth2_client; DROP TABLE IF EXISTS system_oauth2_client;
CREATE TABLE system_oauth2_client CREATE TABLE system_oauth2_client
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_oauth2_client_seq'),
client_id varchar(255) NOT NULL, client_id varchar(255) NOT NULL,
secret varchar(255) NOT NULL, secret varchar(255) NOT NULL,
name varchar(255) NOT NULL, name varchar(255) NOT NULL,
@ -3041,7 +3041,7 @@ CREATE SEQUENCE system_oauth2_client_seq
DROP TABLE IF EXISTS system_oauth2_code; DROP TABLE IF EXISTS system_oauth2_code;
CREATE TABLE system_oauth2_code CREATE TABLE system_oauth2_code
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_oauth2_code_seq'),
user_id int8 NOT NULL, user_id int8 NOT NULL,
user_type int2 NOT NULL, user_type int2 NOT NULL,
code varchar(32) NOT NULL, code varchar(32) NOT NULL,
@ -3088,7 +3088,7 @@ CREATE SEQUENCE system_oauth2_code_seq
DROP TABLE IF EXISTS system_oauth2_refresh_token; DROP TABLE IF EXISTS system_oauth2_refresh_token;
CREATE TABLE system_oauth2_refresh_token CREATE TABLE system_oauth2_refresh_token
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_oauth2_refresh_token_seq'),
user_id int8 NOT NULL, user_id int8 NOT NULL,
refresh_token varchar(32) NOT NULL, refresh_token varchar(32) NOT NULL,
user_type int2 NOT NULL, user_type int2 NOT NULL,
@ -3131,7 +3131,7 @@ CREATE SEQUENCE system_oauth2_refresh_token_seq
DROP TABLE IF EXISTS system_operate_log; DROP TABLE IF EXISTS system_operate_log;
CREATE TABLE system_operate_log CREATE TABLE system_operate_log
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_operate_log_seq'),
trace_id varchar(64) NOT NULL DEFAULT '', trace_id varchar(64) NOT NULL DEFAULT '',
user_id int8 NOT NULL, user_id int8 NOT NULL,
user_type int2 NOT NULL DEFAULT 0, user_type int2 NOT NULL DEFAULT 0,
@ -3188,7 +3188,7 @@ CREATE SEQUENCE system_operate_log_seq
DROP TABLE IF EXISTS system_post; DROP TABLE IF EXISTS system_post;
CREATE TABLE system_post CREATE TABLE system_post
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_post_seq'),
code varchar(64) NOT NULL, code varchar(64) NOT NULL,
name varchar(50) NOT NULL, name varchar(50) NOT NULL,
sort int4 NOT NULL, sort int4 NOT NULL,
@ -3241,7 +3241,7 @@ CREATE SEQUENCE system_post_seq
DROP TABLE IF EXISTS system_role; DROP TABLE IF EXISTS system_role;
CREATE TABLE system_role CREATE TABLE system_role
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_role_seq'),
name varchar(30) NOT NULL, name varchar(30) NOT NULL,
code varchar(100) NOT NULL, code varchar(100) NOT NULL,
sort int4 NOT NULL, sort int4 NOT NULL,
@ -3304,7 +3304,7 @@ CREATE SEQUENCE system_role_seq
DROP TABLE IF EXISTS system_role_menu; DROP TABLE IF EXISTS system_role_menu;
CREATE TABLE system_role_menu CREATE TABLE system_role_menu
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_role_menu_seq'),
role_id int8 NOT NULL, role_id int8 NOT NULL,
menu_id int8 NOT NULL, menu_id int8 NOT NULL,
creator varchar(64) NULL DEFAULT '', creator varchar(64) NULL DEFAULT '',
@ -4210,7 +4210,7 @@ CREATE SEQUENCE system_role_menu_seq
DROP TABLE IF EXISTS system_sms_channel; DROP TABLE IF EXISTS system_sms_channel;
CREATE TABLE system_sms_channel CREATE TABLE system_sms_channel
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_sms_channel_seq'),
signature varchar(12) NOT NULL, signature varchar(12) NOT NULL,
code varchar(63) NOT NULL, code varchar(63) NOT NULL,
status int2 NOT NULL, status int2 NOT NULL,
@ -4264,7 +4264,7 @@ CREATE SEQUENCE system_sms_channel_seq
DROP TABLE IF EXISTS system_sms_code; DROP TABLE IF EXISTS system_sms_code;
CREATE TABLE system_sms_code CREATE TABLE system_sms_code
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_sms_code_seq'),
mobile varchar(11) NOT NULL, mobile varchar(11) NOT NULL,
code varchar(6) NOT NULL, code varchar(6) NOT NULL,
create_ip varchar(15) NOT NULL, create_ip varchar(15) NOT NULL,
@ -4313,7 +4313,7 @@ CREATE SEQUENCE system_sms_code_seq
DROP TABLE IF EXISTS system_sms_log; DROP TABLE IF EXISTS system_sms_log;
CREATE TABLE system_sms_log CREATE TABLE system_sms_log
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_sms_log_seq'),
channel_id int8 NOT NULL, channel_id int8 NOT NULL,
channel_code varchar(63) NOT NULL, channel_code varchar(63) NOT NULL,
template_id int8 NOT NULL, template_id int8 NOT NULL,
@ -4384,7 +4384,7 @@ CREATE SEQUENCE system_sms_log_seq
DROP TABLE IF EXISTS system_sms_template; DROP TABLE IF EXISTS system_sms_template;
CREATE TABLE system_sms_template CREATE TABLE system_sms_template
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_sms_template_seq'),
type int2 NOT NULL, type int2 NOT NULL,
status int2 NOT NULL, status int2 NOT NULL,
code varchar(63) NOT NULL, code varchar(63) NOT NULL,
@ -4456,7 +4456,7 @@ CREATE SEQUENCE system_sms_template_seq
DROP TABLE IF EXISTS system_social_client; DROP TABLE IF EXISTS system_social_client;
CREATE TABLE system_social_client CREATE TABLE system_social_client
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_social_client_seq'),
name varchar(255) NOT NULL, name varchar(255) NOT NULL,
social_type int2 NOT NULL, social_type int2 NOT NULL,
user_type int2 NOT NULL, user_type int2 NOT NULL,
@ -4514,7 +4514,7 @@ CREATE SEQUENCE system_social_client_seq
DROP TABLE IF EXISTS system_social_user; DROP TABLE IF EXISTS system_social_user;
CREATE TABLE system_social_user CREATE TABLE system_social_user
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_social_user_seq'),
type int2 NOT NULL, type int2 NOT NULL,
openid varchar(32) NOT NULL, openid varchar(32) NOT NULL,
token varchar(256) NULL DEFAULT NULL, token varchar(256) NULL DEFAULT NULL,
@ -4563,7 +4563,7 @@ CREATE SEQUENCE system_social_user_seq
DROP TABLE IF EXISTS system_social_user_bind; DROP TABLE IF EXISTS system_social_user_bind;
CREATE TABLE system_social_user_bind CREATE TABLE system_social_user_bind
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_social_user_bind_seq'),
user_id int8 NOT NULL, user_id int8 NOT NULL,
user_type int2 NOT NULL, user_type int2 NOT NULL,
social_type int2 NOT NULL, social_type int2 NOT NULL,
@ -4602,7 +4602,7 @@ CREATE SEQUENCE system_social_user_bind_seq
DROP TABLE IF EXISTS system_tenant; DROP TABLE IF EXISTS system_tenant;
CREATE TABLE system_tenant CREATE TABLE system_tenant
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_tenant_seq'),
name varchar(30) NOT NULL, name varchar(30) NOT NULL,
contact_user_id int8 NULL DEFAULT NULL, contact_user_id int8 NULL DEFAULT NULL,
contact_name varchar(30) NOT NULL, contact_name varchar(30) NOT NULL,
@ -4660,7 +4660,7 @@ CREATE SEQUENCE system_tenant_seq
DROP TABLE IF EXISTS system_tenant_package; DROP TABLE IF EXISTS system_tenant_package;
CREATE TABLE system_tenant_package CREATE TABLE system_tenant_package
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_tenant_package_seq'),
name varchar(30) NOT NULL, name varchar(30) NOT NULL,
status int2 NOT NULL DEFAULT 0, status int2 NOT NULL DEFAULT 0,
remark varchar(256) NULL DEFAULT '', remark varchar(256) NULL DEFAULT '',
@ -4707,7 +4707,7 @@ CREATE SEQUENCE system_tenant_package_seq
DROP TABLE IF EXISTS system_user_post; DROP TABLE IF EXISTS system_user_post;
CREATE TABLE system_user_post CREATE TABLE system_user_post
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_user_post_seq'),
user_id int8 NOT NULL DEFAULT 0, user_id int8 NOT NULL DEFAULT 0,
post_id int8 NOT NULL DEFAULT 0, post_id int8 NOT NULL DEFAULT 0,
creator varchar(64) NULL DEFAULT '', creator varchar(64) NULL DEFAULT '',
@ -4759,7 +4759,7 @@ CREATE SEQUENCE system_user_post_seq
DROP TABLE IF EXISTS system_user_role; DROP TABLE IF EXISTS system_user_role;
CREATE TABLE system_user_role CREATE TABLE system_user_role
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_user_role_seq'),
user_id int8 NOT NULL, user_id int8 NOT NULL,
role_id int8 NOT NULL, role_id int8 NOT NULL,
creator varchar(64) NULL DEFAULT '', creator varchar(64) NULL DEFAULT '',
@ -4819,7 +4819,7 @@ CREATE SEQUENCE system_user_role_seq
DROP TABLE IF EXISTS system_users; DROP TABLE IF EXISTS system_users;
CREATE TABLE system_users CREATE TABLE system_users
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('system_users_seq'),
username varchar(30) NOT NULL, username varchar(30) NOT NULL,
password varchar(100) NOT NULL DEFAULT '', password varchar(100) NOT NULL DEFAULT '',
nickname varchar(30) NOT NULL, nickname varchar(30) NOT NULL,
@ -4902,7 +4902,7 @@ CREATE SEQUENCE system_users_seq
DROP TABLE IF EXISTS yudao_demo01_contact; DROP TABLE IF EXISTS yudao_demo01_contact;
CREATE TABLE yudao_demo01_contact CREATE TABLE yudao_demo01_contact
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('yudao_demo01_contact_seq'),
name varchar(100) NOT NULL DEFAULT '', name varchar(100) NOT NULL DEFAULT '',
sex int2 NOT NULL, sex int2 NOT NULL,
birthday timestamp NOT NULL, birthday timestamp NOT NULL,
@ -4952,7 +4952,7 @@ CREATE SEQUENCE yudao_demo01_contact_seq
DROP TABLE IF EXISTS yudao_demo02_category; DROP TABLE IF EXISTS yudao_demo02_category;
CREATE TABLE yudao_demo02_category CREATE TABLE yudao_demo02_category
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('yudao_demo02_category_seq'),
name varchar(100) NOT NULL DEFAULT '', name varchar(100) NOT NULL DEFAULT '',
parent_id int8 NOT NULL, parent_id int8 NOT NULL,
creator varchar(64) NULL DEFAULT '', creator varchar(64) NULL DEFAULT '',
@ -5001,7 +5001,7 @@ CREATE SEQUENCE yudao_demo02_category_seq
DROP TABLE IF EXISTS yudao_demo03_course; DROP TABLE IF EXISTS yudao_demo03_course;
CREATE TABLE yudao_demo03_course CREATE TABLE yudao_demo03_course
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('yudao_demo03_course_seq'),
student_id int8 NOT NULL, student_id int8 NOT NULL,
name varchar(100) NOT NULL DEFAULT '', name varchar(100) NOT NULL DEFAULT '',
score int2 NOT NULL, score int2 NOT NULL,
@ -5063,7 +5063,7 @@ CREATE SEQUENCE yudao_demo03_course_seq
DROP TABLE IF EXISTS yudao_demo03_grade; DROP TABLE IF EXISTS yudao_demo03_grade;
CREATE TABLE yudao_demo03_grade CREATE TABLE yudao_demo03_grade
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('yudao_demo03_grade_seq'),
student_id int8 NOT NULL, student_id int8 NOT NULL,
name varchar(100) NOT NULL DEFAULT '', name varchar(100) NOT NULL DEFAULT '',
teacher varchar(255) NOT NULL, teacher varchar(255) NOT NULL,
@ -5111,7 +5111,7 @@ CREATE SEQUENCE yudao_demo03_grade_seq
DROP TABLE IF EXISTS yudao_demo03_student; DROP TABLE IF EXISTS yudao_demo03_student;
CREATE TABLE yudao_demo03_student CREATE TABLE yudao_demo03_student
( (
id int8 NOT NULL, id int8 NOT NULL default nextval('yudao_demo03_student_seq'),
name varchar(100) NOT NULL DEFAULT '', name varchar(100) NOT NULL DEFAULT '',
sex int2 NOT NULL, sex int2 NOT NULL,
birthday timestamp NOT NULL, birthday timestamp NOT NULL,

View File

@ -2945,7 +2945,7 @@ INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_t
GO GO
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1692, 14, N'MiniMax', N'MiniMax', N'ai_platform', 0, N'', N'', N'', N'1', N'2025-03-11 20:04:51', N'1', N'2025-03-11 20:04:51', N'0') INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1692, 14, N'MiniMax', N'MiniMax', N'ai_platform', 0, N'', N'', N'', N'1', N'2025-03-11 20:04:51', N'1', N'2025-03-11 20:04:51', N'0')
GO GO
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1693, 15, N'月之暗', N'Moonshot', N'ai_platform', 0, N'', N'', N'', N'1', N'2025-03-11 20:05:08', N'1', N'2025-03-11 20:05:08', N'0') INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (1693, 15, N'月之暗', N'Moonshot', N'ai_platform', 0, N'', N'', N'', N'1', N'2025-03-11 20:05:08', N'1', N'2025-03-11 20:05:08', N'0')
GO GO
INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2000, 0, N'标准数据格式JSON', N'0', N'iot_data_format', 0, N'default', N'', N'', N'1', N'2024-08-10 11:53:26', N'1', N'2025-03-17 09:28:16', N'0') INSERT INTO system_dict_data (id, sort, label, value, dict_type, status, color_type, css_class, remark, creator, create_time, updater, update_time, deleted) VALUES (2000, 0, N'标准数据格式JSON', N'0', N'iot_data_format', 0, N'default', N'', N'', N'1', N'2024-08-10 11:53:26', N'1', N'2025-03-17 09:28:16', N'0')
GO GO

View File

@ -52,6 +52,7 @@ def load_and_clean(sql_file: str) -> str:
REPLACE_PAIR_LIST = ( REPLACE_PAIR_LIST = (
(")\nVALUES ", ") VALUES "), (")\nVALUES ", ") VALUES "),
(" CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ", " "), (" CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ", " "),
(" CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ", " "),
(" KEY `", " INDEX `"), (" KEY `", " INDEX `"),
("UNIQUE INDEX", "UNIQUE KEY"), ("UNIQUE INDEX", "UNIQUE KEY"),
("b'0'", "'0'"), ("b'0'", "'0'"),
@ -61,6 +62,11 @@ def load_and_clean(sql_file: str) -> str:
content = open(sql_file, encoding="utf-8").read() content = open(sql_file, encoding="utf-8").read()
for replace_pair in REPLACE_PAIR_LIST: for replace_pair in REPLACE_PAIR_LIST:
content = content.replace(*replace_pair) content = content.replace(*replace_pair)
# 移除索引字段的前缀长度定义,例如: `name`(32) -> `name`
# 移除索引定义上的 USING BTREE COMMENT 部分
# 相关 issuehttps://t.zsxq.com/96IFc 、https://t.zsxq.com/rC3A3
content = re.sub(r'`([^`]+)`\(\d+\)', r'`\1`', content)
content = re.sub(r'\s+USING\s+BTREE\s+COMMENT\s+\'[^\']+\'', '', content)
content = re.sub(r"ENGINE.*COMMENT", "COMMENT", content) content = re.sub(r"ENGINE.*COMMENT", "COMMENT", content)
content = re.sub(r"ENGINE.*;", ";", content) content = re.sub(r"ENGINE.*;", ";", content)
return content return content
@ -262,10 +268,10 @@ class Convertor(ABC):
# 解析注释 # 解析注释
for column in table_ddl["columns"]: for column in table_ddl["columns"]:
column["comment"] = bytes(column["comment"], "utf-8").decode( column["comment"] = bytes(column["comment"], "utf-8").decode(
"unicode_escape" r"unicode_escape"
)[1:-1] )[1:-1]
table_ddl["comment"] = bytes(table_ddl["comment"], "utf-8").decode( table_ddl["comment"] = bytes(table_ddl["comment"], "utf-8").decode(
"unicode_escape" r"unicode_escape"
)[1:-1] )[1:-1]
# 为每个表生成个6个基本部分 # 为每个表生成个6个基本部分

View File

@ -46,38 +46,37 @@
<opentracing.version>0.33.0</opentracing.version> <opentracing.version>0.33.0</opentracing.version>
<!-- Test 测试相关 --> <!-- Test 测试相关 -->
<podam.version>7.2.11.RELEASE</podam.version> <!-- Spring Boot 2.X 最多使用 7.2.11 版本 --> <podam.version>7.2.11.RELEASE</podam.version> <!-- Spring Boot 2.X 最多使用 7.2.11 版本 -->
<jedis-mock.version>1.1.11</jedis-mock.version> <jedis-mock.version>1.1.12</jedis-mock.version>
<mockito-inline.version>4.11.0</mockito-inline.version> <mockito-inline.version>4.11.0</mockito-inline.version>
<!-- Bpm 工作流相关 --> <!-- Bpm 工作流相关 -->
<flowable.version>6.8.0</flowable.version> <flowable.version>6.8.0</flowable.version>
<!-- 工具类相关 --> <!-- 工具类相关 -->
<anji-plus-captcha.version>1.4.0</anji-plus-captcha.version> <anji-plus-captcha.version>1.4.0</anji-plus-captcha.version>
<jsoup.version>1.21.2</jsoup.version> <jsoup.version>1.21.2</jsoup.version>
<lombok.version>1.18.38</lombok.version> <lombok.version>1.18.42</lombok.version>
<mapstruct.version>1.6.3</mapstruct.version> <mapstruct.version>1.6.3</mapstruct.version>
<hutool-5.version>5.8.40</hutool-5.version> <hutool-5.version>5.8.41</hutool-5.version>
<fastexcel.version>1.3.0</fastexcel.version> <fastexcel.version>1.3.0</fastexcel.version>
<velocity.version>2.4</velocity.version> <!-- JDK8 不能从 2.4 升级到 2.4.1,会报包不存在!!!! --> <velocity.version>2.4</velocity.version> <!-- JDK8 不能从 2.4 升级到 2.4.1,会报包不存在!!!! -->
<fastjson.version>1.2.83</fastjson.version> <fastjson.version>1.2.83</fastjson.version>
<guava.version>33.4.8-jre</guava.version> <guava.version>33.5.0-jre</guava.version>
<transmittable-thread-local.version>2.14.5</transmittable-thread-local.version> <transmittable-thread-local.version>2.14.5</transmittable-thread-local.version>
<commons-net.version>3.11.1</commons-net.version> <commons-net.version>3.12.0</commons-net.version>
<commons-lang3.version>3.18.0</commons-lang3.version> <commons-lang3.version>3.20.0</commons-lang3.version>
<jsch.version>2.27.3</jsch.version> <jsch.version>2.27.6</jsch.version>
<tika-core.version>2.9.3</tika-core.version> <!-- JDK8 不能从 2.9.3 升级到 3.X会报 JDK8 不支持 --> <tika-core.version>2.9.3</tika-core.version> <!-- JDK8 不能从 2.9.3 升级到 3.X会报 JDK8 不支持 -->
<ip2region.version>2.7.0</ip2region.version> <ip2region.version>2.7.0</ip2region.version>
<bizlog-sdk.version>3.0.6</bizlog-sdk.version> <bizlog-sdk.version>3.0.6</bizlog-sdk.version>
<netty.version>4.2.4.Final</netty.version> <netty.version>4.2.7.Final</netty.version>
<mqtt.version>1.2.5</mqtt.version> <mqtt.version>1.2.5</mqtt.version>
<pf4j-spring.version>0.9.0</pf4j-spring.version>
<vertx.version>4.5.13</vertx.version> <vertx.version>4.5.13</vertx.version>
<!-- 三方云服务相关 --> <!-- 三方云服务相关 -->
<awssdk.version>2.30.14</awssdk.version> <awssdk.version>2.39.2</awssdk.version>
<justauth.version>1.16.7</justauth.version> <justauth.version>1.16.7</justauth.version>
<justauth-starter.version>1.4.0</justauth-starter.version> <justauth-starter.version>1.4.0</justauth-starter.version>
<jimureport.version>2.1.1</jimureport.version> <jimureport.version>2.1.1</jimureport.version>
<jimubi.version>2.1.0</jimubi.version> <jimubi.version>2.1.0</jimubi.version>
<weixin-java.version>4.7.7-20250808.182223</weixin-java.version> <weixin-java.version>4.7.8-20251117.120146</weixin-java.version>
<!-- 专属于 JDK8 安全漏洞升级 --> <!-- 专属于 JDK8 安全漏洞升级 -->
<logback.version>1.2.13</logback.version> <!-- 无法使用 1.3.X 版本,启动会报错 --> <logback.version>1.2.13</logback.version> <!-- 无法使用 1.3.X 版本,启动会报错 -->
</properties> </properties>
@ -635,19 +634,6 @@
</exclusions> </exclusions>
</dependency> </dependency>
<!-- PF4J -->
<dependency>
<groupId>org.pf4j</groupId>
<artifactId>pf4j-spring</artifactId>
<version>${pf4j-spring.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Vert.x --> <!-- Vert.x -->
<dependency> <dependency>
<groupId>io.vertx</groupId> <groupId>io.vertx</groupId>

View File

@ -1,10 +1,10 @@
package cn.iocoder.yudao.framework.common.util.json.databind; package cn.iocoder.yudao.framework.common.util.json.databind;
import cn.hutool.core.util.ReflectUtil;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.SerializerProvider;
import org.apache.commons.lang3.reflect.FieldUtils;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@ -25,7 +25,7 @@ public class TimestampLocalDateTimeSerializer extends JsonSerializer<LocalDateTi
public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
String fieldName = gen.getOutputContext().getCurrentName(); String fieldName = gen.getOutputContext().getCurrentName();
Class<?> clazz = gen.getOutputContext().getCurrentValue().getClass(); Class<?> clazz = gen.getOutputContext().getCurrentValue().getClass();
Field field = FieldUtils.getField(clazz, fieldName, true); Field field = ReflectUtil.getField(clazz, fieldName);
// 情况一 JsonFormat 自定义注解则使用它https://github.com/YunaiV/ruoyi-vue-pro/pull/1019 // 情况一 JsonFormat 自定义注解则使用它https://github.com/YunaiV/ruoyi-vue-pro/pull/1019
JsonFormat[] jsonFormats = field.getAnnotationsByType(JsonFormat.class); JsonFormat[] jsonFormats = field.getAnnotationsByType(JsonFormat.class);
if (jsonFormats.length > 0) { if (jsonFormats.length > 0) {

View File

@ -9,6 +9,7 @@ import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.util.List; import java.util.List;
/** /**
@ -44,9 +45,12 @@ public class ExcelUtils {
} }
public static <T> List<T> read(MultipartFile file, Class<T> head) throws IOException { public static <T> List<T> read(MultipartFile file, Class<T> head) throws IOException {
return FastExcelFactory.read(file.getInputStream(), head, null) // 参考 https://t.zsxq.com/zM77F 帖子增加 try 处理兼容 windows 场景
.autoCloseStream(false) // 不要自动关闭交给 Servlet 自己处理 try (InputStream inputStream = file.getInputStream()) {
.doReadAllSync(); return FastExcelFactory.read(inputStream, head, null)
.autoCloseStream(false) // 不要自动关闭交给 Servlet 自己处理
.doReadAllSync();
}
} }
} }

View File

@ -9,7 +9,10 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MapPropertySource;
import java.util.HashMap;
import java.util.Map;
import java.util.Set; import java.util.Set;
/** /**
@ -56,11 +59,19 @@ public class IdTypeEnvironmentPostProcessor implements EnvironmentPostProcessor
} }
public IdType getIdType(ConfigurableEnvironment environment) { public IdType getIdType(ConfigurableEnvironment environment) {
return environment.getProperty(ID_TYPE_KEY, IdType.class); String value = environment.getProperty(ID_TYPE_KEY);
try {
return StrUtil.isNotBlank(value) ? IdType.valueOf(value) : IdType.NONE;
} catch (IllegalArgumentException ex) {
log.error("[getIdType][无法解析 id-type 配置值({})]", value, ex);
return IdType.NONE;
}
} }
public void setIdType(ConfigurableEnvironment environment, IdType idType) { public void setIdType(ConfigurableEnvironment environment, IdType idType) {
environment.getSystemProperties().put(ID_TYPE_KEY, idType); Map<String, Object> map = new HashMap<>();
map.put(ID_TYPE_KEY, idType);
environment.getPropertySources().addFirst(new MapPropertySource("mybatisPlusIdType", map));
log.info("[setIdType][修改 MyBatis Plus 的 idType 为({})]", idType); log.info("[setIdType][修改 MyBatis Plus 的 idType 为({})]", idType);
} }

View File

@ -68,6 +68,29 @@ public interface BaseMapperX<T> extends MPJBaseMapper<T> {
return new PageResult<>(mpPage.getRecords(), mpPage.getTotal()); return new PageResult<>(mpPage.getRecords(), mpPage.getTotal());
} }
/**
* 执行分页查询并返回结果
*
* @param pageParam 分页参数包含页码每页条数和排序字段信息如果 pageSize {@link PageParam#PAGE_SIZE_NONE}则不分页直接查询所有数据
* @param clazz 结果集的类类型
* @param lambdaWrapper MyBatis Plus Join 查询条件包装器
* @param <D> 结果集的泛型类型
* @return 返回分页查询的结果包括总记录数和当前页的数据列表
*/
default <D> PageResult<D> selectJoinPage(SortablePageParam pageParam, Class<D> clazz, MPJLambdaWrapper<T> lambdaWrapper) {
// 特殊不分页直接查询全部
if (PageParam.PAGE_SIZE_NONE.equals(pageParam.getPageSize())) {
List<D> list = selectJoinList(clazz, lambdaWrapper);
return new PageResult<>(list, (long) list.size());
}
// MyBatis Plus Join 查询
IPage<D> mpPage = MyBatisUtils.buildPage(pageParam, pageParam.getSortingFields());
mpPage = selectJoinPage(mpPage, clazz, lambdaWrapper);
// 转换返回
return new PageResult<>(mpPage.getRecords(), mpPage.getTotal());
}
default <DTO> PageResult<DTO> selectJoinPage(PageParam pageParam, Class<DTO> resultTypeClass, MPJBaseJoin<T> joinQueryWrapper) { default <DTO> PageResult<DTO> selectJoinPage(PageParam pageParam, Class<DTO> resultTypeClass, MPJBaseJoin<T> joinQueryWrapper) {
IPage<DTO> mpPage = MyBatisUtils.buildPage(pageParam); IPage<DTO> mpPage = MyBatisUtils.buildPage(pageParam);
selectJoinPage(mpPage, resultTypeClass, joinQueryWrapper); selectJoinPage(mpPage, resultTypeClass, joinQueryWrapper);

View File

@ -42,15 +42,16 @@ public class ApiEncryptResponseWrapper extends HttpServletResponseWrapper {
this.flushBuffer(); this.flushBuffer();
byte[] body = byteArrayOutputStream.toByteArray(); byte[] body = byteArrayOutputStream.toByteArray();
// 2. 加密 body // 2. 添加加密 header 标识
String encryptedBody = symmetricEncryptor != null ? symmetricEncryptor.encryptBase64(body)
: asymmetricEncryptor.encryptBase64(body, KeyType.PublicKey);
response.getWriter().write(encryptedBody);
// 3. 添加加密 header 标识
this.addHeader(properties.getHeader(), "true"); this.addHeader(properties.getHeader(), "true");
// 特殊特殊https://juejin.cn/post/6867327674675625992 // 特殊特殊https://juejin.cn/post/6867327674675625992
this.addHeader("Access-Control-Expose-Headers", properties.getHeader()); this.addHeader("Access-Control-Expose-Headers", properties.getHeader());
// 3.1 加密 body
String encryptedBody = symmetricEncryptor != null ? symmetricEncryptor.encryptBase64(body)
: asymmetricEncryptor.encryptBase64(body, KeyType.PublicKey);
// 3.2 输出加密后的 body设置 header 要放在 response write 之前
response.getWriter().write(encryptedBody);
} }
@Override @Override

View File

@ -19,9 +19,9 @@
国外OpenAI、Ollama、Midjourney、StableDiffusion、Suno 国外OpenAI、Ollama、Midjourney、StableDiffusion、Suno
</description> </description>
<properties> <properties>
<spring-ai.version>1.0.1</spring-ai.version> <spring-ai.version>1.1.0</spring-ai.version>
<alibaba-ai.version>1.0.0.3</alibaba-ai.version> <alibaba-ai.version>1.0.0.4</alibaba-ai.version>
<tinyflow.version>1.0.2</tinyflow.version> <tinyflow.version>1.2.6</tinyflow.version>
</properties> </properties>
<dependencies> <dependencies>
@ -136,7 +136,7 @@
<version>1.0.0</version> <version>1.0.0</version>
</dependency> </dependency>
<dependency> <dependency>
<!-- 月之暗 --> <!-- 月之暗 -->
<groupId>org.springaicommunity</groupId> <groupId>org.springaicommunity</groupId>
<artifactId>moonshot-spring-boot-starter</artifactId> <artifactId>moonshot-spring-boot-starter</artifactId>
<version>1.0.0</version> <version>1.0.0</version>

View File

@ -26,7 +26,7 @@ public enum AiPlatformEnum implements ArrayValuable<String> {
HUN_YUAN("HunYuan", "混元"), // 腾讯 HUN_YUAN("HunYuan", "混元"), // 腾讯
SILICON_FLOW("SiliconFlow", "硅基流动"), // 硅基流动 SILICON_FLOW("SiliconFlow", "硅基流动"), // 硅基流动
MINI_MAX("MiniMax", "MiniMax"), // 稀宇科技 MINI_MAX("MiniMax", "MiniMax"), // 稀宇科技
MOONSHOT("Moonshot", "月之暗"), // KIMI MOONSHOT("Moonshot", "月之暗"), // KIMI
BAI_CHUAN("BaiChuan", "百川智能"), // 百川智能 BAI_CHUAN("BaiChuan", "百川智能"), // 百川智能
// ========== 国外平台 ========== // ========== 国外平台 ==========
@ -40,6 +40,7 @@ public enum AiPlatformEnum implements ArrayValuable<String> {
STABLE_DIFFUSION("StableDiffusion", "StableDiffusion"), // Stability AI STABLE_DIFFUSION("StableDiffusion", "StableDiffusion"), // Stability AI
MIDJOURNEY("Midjourney", "Midjourney"), // Midjourney MIDJOURNEY("Midjourney", "Midjourney"), // Midjourney
SUNO("Suno", "Suno"), // Suno AI SUNO("Suno", "Suno"), // Suno AI
GROK("Grok","Grok"), // Grok
; ;

View File

@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.ai.framework.ai.core.model.AiModelFactoryImpl;
import cn.iocoder.yudao.module.ai.framework.ai.core.model.baichuan.BaiChuanChatModel; import cn.iocoder.yudao.module.ai.framework.ai.core.model.baichuan.BaiChuanChatModel;
import cn.iocoder.yudao.module.ai.framework.ai.core.model.doubao.DouBaoChatModel; import cn.iocoder.yudao.module.ai.framework.ai.core.model.doubao.DouBaoChatModel;
import cn.iocoder.yudao.module.ai.framework.ai.core.model.gemini.GeminiChatModel; import cn.iocoder.yudao.module.ai.framework.ai.core.model.gemini.GeminiChatModel;
import cn.iocoder.yudao.module.ai.framework.ai.core.model.grok.GrokChatModel;
import cn.iocoder.yudao.module.ai.framework.ai.core.model.hunyuan.HunYuanChatModel; import cn.iocoder.yudao.module.ai.framework.ai.core.model.hunyuan.HunYuanChatModel;
import cn.iocoder.yudao.module.ai.framework.ai.core.model.midjourney.api.MidjourneyApi; import cn.iocoder.yudao.module.ai.framework.ai.core.model.midjourney.api.MidjourneyApi;
import cn.iocoder.yudao.module.ai.framework.ai.core.model.siliconflow.SiliconFlowApiConstants; import cn.iocoder.yudao.module.ai.framework.ai.core.model.siliconflow.SiliconFlowApiConstants;
@ -16,7 +17,9 @@ import cn.iocoder.yudao.module.ai.framework.ai.core.model.xinghuo.XingHuoChatMod
import cn.iocoder.yudao.module.ai.framework.ai.core.webserch.AiWebSearchClient; import cn.iocoder.yudao.module.ai.framework.ai.core.webserch.AiWebSearchClient;
import cn.iocoder.yudao.module.ai.framework.ai.core.webserch.bocha.AiBoChaWebSearchClient; import cn.iocoder.yudao.module.ai.framework.ai.core.webserch.bocha.AiBoChaWebSearchClient;
import cn.iocoder.yudao.module.ai.tool.method.PersonService; import cn.iocoder.yudao.module.ai.tool.method.PersonService;
import io.micrometer.observation.ObservationRegistry;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.deepseek.DeepSeekChatModel; import org.springframework.ai.deepseek.DeepSeekChatModel;
import org.springframework.ai.deepseek.DeepSeekChatOptions; import org.springframework.ai.deepseek.DeepSeekChatOptions;
import org.springframework.ai.deepseek.api.DeepSeekApi; import org.springframework.ai.deepseek.api.DeepSeekApi;
@ -34,12 +37,14 @@ import org.springframework.ai.vectorstore.milvus.autoconfigure.MilvusServiceClie
import org.springframework.ai.vectorstore.milvus.autoconfigure.MilvusVectorStoreProperties; import org.springframework.ai.vectorstore.milvus.autoconfigure.MilvusVectorStoreProperties;
import org.springframework.ai.vectorstore.qdrant.autoconfigure.QdrantVectorStoreProperties; import org.springframework.ai.vectorstore.qdrant.autoconfigure.QdrantVectorStoreProperties;
import org.springframework.ai.vectorstore.redis.autoconfigure.RedisVectorStoreProperties; import org.springframework.ai.vectorstore.redis.autoconfigure.RedisVectorStoreProperties;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import java.util.List; import java.util.List;
import java.util.Optional;
/** /**
* 芋道 AI 自动配置 * 芋道 AI 自动配置
@ -60,6 +65,13 @@ public class AiAutoConfiguration {
return new AiModelFactoryImpl(); return new AiModelFactoryImpl();
} }
@Bean
@ConditionalOnMissingBean
public ObservationRegistry observationRegistry() {
// 特殊兜底有 ObservationRegistry Bean避免相关的 ChatModel 创建报错相关 issuehttps://t.zsxq.com/CuPu4
return ObservationRegistry.NOOP;
}
// ========== 各种 AI Client 创建 ========== // ========== 各种 AI Client 创建 ==========
@Bean @Bean
@ -252,6 +264,28 @@ public class AiAutoConfiguration {
return new SunoApi(yudaoAiProperties.getSuno().getBaseUrl()); return new SunoApi(yudaoAiProperties.getSuno().getBaseUrl());
} }
public ChatModel buildGrokChatClient(YudaoAiProperties.Grok properties) {
if (StrUtil.isEmpty(properties.getModel())) {
properties.setModel(GrokChatModel.MODEL_DEFAULT);
}
OpenAiChatModel openAiChatModel = OpenAiChatModel.builder()
.openAiApi(OpenAiApi.builder()
.baseUrl(Optional.ofNullable(properties.getBaseUrl())
.orElse(GrokChatModel.BASE_URL))
.completionsPath(GrokChatModel.COMPLETE_PATH)
.apiKey(properties.getApiKey())
.build())
.defaultOptions(OpenAiChatOptions.builder()
.model(properties.getModel())
.temperature(properties.getTemperature())
.maxTokens(properties.getMaxTokens())
.topP(properties.getTopP())
.build())
.toolCallingManager(getToolCallingManager())
.build();
return new DouBaoChatModel(openAiChatModel);
}
// ========== RAG 相关 ========== // ========== RAG 相关 ==========
@Bean @Bean

View File

@ -160,6 +160,20 @@ public class YudaoAiProperties {
} }
@Data
public static class Grok {
private String enable;
private String apiKey;
private String baseUrl;
private String model;
private Double temperature;
private Integer maxTokens;
private Double topP;
}
@Data @Data
public static class WebSearch { public static class WebSearch {

View File

@ -87,7 +87,7 @@ import org.springframework.ai.model.zhipuai.autoconfigure.ZhiPuAiImageAutoConfig
import org.springframework.ai.ollama.OllamaChatModel; import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.ai.ollama.OllamaEmbeddingModel; import org.springframework.ai.ollama.OllamaEmbeddingModel;
import org.springframework.ai.ollama.api.OllamaApi; import org.springframework.ai.ollama.api.OllamaApi;
import org.springframework.ai.ollama.api.OllamaOptions; import org.springframework.ai.ollama.api.OllamaEmbeddingOptions;
import org.springframework.ai.openai.OpenAiChatModel; import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.ai.openai.OpenAiEmbeddingModel; import org.springframework.ai.openai.OpenAiEmbeddingModel;
import org.springframework.ai.openai.OpenAiEmbeddingOptions; import org.springframework.ai.openai.OpenAiEmbeddingOptions;
@ -178,6 +178,8 @@ public class AiModelFactoryImpl implements AiModelFactory {
return buildGeminiChatModel(apiKey); return buildGeminiChatModel(apiKey);
case OLLAMA: case OLLAMA:
return buildOllamaChatModel(url); return buildOllamaChatModel(url);
case GROK:
return buildGrokChatModel(apiKey,url);
default: default:
throw new IllegalArgumentException(StrUtil.format("未知平台({})", platform)); throw new IllegalArgumentException(StrUtil.format("未知平台({})", platform));
} }
@ -436,10 +438,12 @@ public class AiModelFactoryImpl implements AiModelFactory {
* 可参考 {@link ZhiPuAiChatAutoConfiguration} zhiPuAiChatModel 方法 * 可参考 {@link ZhiPuAiChatAutoConfiguration} zhiPuAiChatModel 方法
*/ */
private ZhiPuAiChatModel buildZhiPuChatModel(String apiKey, String url) { private ZhiPuAiChatModel buildZhiPuChatModel(String apiKey, String url) {
ZhiPuAiApi zhiPuAiApi = StrUtil.isEmpty(url) ? new ZhiPuAiApi(apiKey) ZhiPuAiApi.Builder zhiPuAiApiBuilder = ZhiPuAiApi.builder().apiKey(apiKey);
: new ZhiPuAiApi(url, apiKey); if (StrUtil.isNotEmpty(url)) {
zhiPuAiApiBuilder.baseUrl(url);
}
ZhiPuAiChatOptions options = ZhiPuAiChatOptions.builder().model(ZhiPuAiApi.DEFAULT_CHAT_MODEL).temperature(0.7).build(); ZhiPuAiChatOptions options = ZhiPuAiChatOptions.builder().model(ZhiPuAiApi.DEFAULT_CHAT_MODEL).temperature(0.7).build();
return new ZhiPuAiChatModel(zhiPuAiApi, options, getToolCallingManager(), DEFAULT_RETRY_TEMPLATE, return new ZhiPuAiChatModel(zhiPuAiApiBuilder.build(), options, getToolCallingManager(), DEFAULT_RETRY_TEMPLATE,
getObservationRegistry().getIfAvailable()); getObservationRegistry().getIfAvailable());
} }
@ -586,6 +590,13 @@ public class AiModelFactoryImpl implements AiModelFactory {
return new StabilityAiImageModel(stabilityAiApi); return new StabilityAiImageModel(stabilityAiApi);
} }
private ChatModel buildGrokChatModel(String apiKey,String url) {
YudaoAiProperties.Grok properties = new YudaoAiProperties.Grok()
.setBaseUrl(url)
.setApiKey(apiKey);
return new AiAutoConfiguration().buildGrokChatClient(properties);
}
// ========== 各种创建 EmbeddingModel 的方法 ========== // ========== 各种创建 EmbeddingModel 的方法 ==========
/** /**
@ -601,10 +612,12 @@ public class AiModelFactoryImpl implements AiModelFactory {
* 可参考 {@link ZhiPuAiEmbeddingAutoConfiguration} zhiPuAiEmbeddingModel 方法 * 可参考 {@link ZhiPuAiEmbeddingAutoConfiguration} zhiPuAiEmbeddingModel 方法
*/ */
private ZhiPuAiEmbeddingModel buildZhiPuEmbeddingModel(String apiKey, String url, String model) { private ZhiPuAiEmbeddingModel buildZhiPuEmbeddingModel(String apiKey, String url, String model) {
ZhiPuAiApi zhiPuAiApi = StrUtil.isEmpty(url) ? new ZhiPuAiApi(apiKey) ZhiPuAiApi.Builder zhiPuAiApiBuilder = ZhiPuAiApi.builder().apiKey(apiKey);
: new ZhiPuAiApi(url, apiKey); if (StrUtil.isNotEmpty(url)) {
zhiPuAiApiBuilder.baseUrl(url);
}
ZhiPuAiEmbeddingOptions zhiPuAiEmbeddingOptions = ZhiPuAiEmbeddingOptions.builder().model(model).build(); ZhiPuAiEmbeddingOptions zhiPuAiEmbeddingOptions = ZhiPuAiEmbeddingOptions.builder().model(model).build();
return new ZhiPuAiEmbeddingModel(zhiPuAiApi, MetadataMode.EMBED, zhiPuAiEmbeddingOptions); return new ZhiPuAiEmbeddingModel(zhiPuAiApiBuilder.build(), MetadataMode.EMBED, zhiPuAiEmbeddingOptions);
} }
/** /**
@ -632,7 +645,7 @@ public class AiModelFactoryImpl implements AiModelFactory {
private OllamaEmbeddingModel buildOllamaEmbeddingModel(String url, String model) { private OllamaEmbeddingModel buildOllamaEmbeddingModel(String url, String model) {
OllamaApi ollamaApi = OllamaApi.builder().baseUrl(url).build(); OllamaApi ollamaApi = OllamaApi.builder().baseUrl(url).build();
OllamaOptions ollamaOptions = OllamaOptions.builder().model(model).build(); OllamaEmbeddingOptions ollamaOptions = OllamaEmbeddingOptions.builder().model(model).build();
return OllamaEmbeddingModel.builder() return OllamaEmbeddingModel.builder()
.ollamaApi(ollamaApi) .ollamaApi(ollamaApi)
.defaultOptions(ollamaOptions) .defaultOptions(ollamaOptions)

View File

@ -0,0 +1,44 @@
package cn.iocoder.yudao.module.ai.framework.ai.core.model.grok;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.ChatOptions;
import org.springframework.ai.chat.prompt.Prompt;
import reactor.core.publisher.Flux;
/**
* Grok {@link ChatModel} 实现类
*
*
*/
@Slf4j
@RequiredArgsConstructor
public class GrokChatModel implements ChatModel {
public static final String BASE_URL = "https://api.x.ai";
public static final String COMPLETE_PATH = "/v1/chat/completions";
public static final String MODEL_DEFAULT = "grok-4-fast-reasoning";
/**
* 兼容 OpenAI 接口进行复用
*/
private final ChatModel openAiChatModel;
@Override
public ChatResponse call(Prompt prompt) {
return openAiChatModel.call(prompt);
}
@Override
public Flux<ChatResponse> stream(Prompt prompt) {
return openAiChatModel.stream(prompt);
}
@Override
public ChatOptions getDefaultOptions() {
return openAiChatModel.getDefaultOptions();
}
}

View File

@ -2,7 +2,8 @@ package cn.iocoder.yudao.module.ai.framework.security.config;
import cn.iocoder.yudao.framework.security.config.AuthorizeRequestsCustomizer; import cn.iocoder.yudao.framework.security.config.AuthorizeRequestsCustomizer;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.ai.mcp.server.autoconfigure.McpServerProperties; import org.springframework.ai.mcp.server.common.autoconfigure.properties.McpServerSseProperties;
import org.springframework.ai.mcp.server.common.autoconfigure.properties.McpServerStreamableHttpProperties;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@ -17,7 +18,9 @@ import java.util.Optional;
public class SecurityConfiguration { public class SecurityConfiguration {
@Resource @Resource
private Optional<McpServerProperties> serverProperties; private Optional<McpServerSseProperties> mcpServerSseProperties;
@Resource
private Optional<McpServerStreamableHttpProperties> mcpServerStreamableHttpProperties;
@Bean("aiAuthorizeRequestsCustomizer") @Bean("aiAuthorizeRequestsCustomizer")
public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() { public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() {
@ -25,11 +28,12 @@ public class SecurityConfiguration {
@Override @Override
public void customize(AuthorizeHttpRequestsConfigurer<HttpSecurity>.AuthorizationManagerRequestMatcherRegistry registry) { public void customize(AuthorizeHttpRequestsConfigurer<HttpSecurity>.AuthorizationManagerRequestMatcherRegistry registry) {
// MCP Server mcpServerSseProperties.ifPresent(properties -> {
serverProperties.ifPresent(properties -> {
registry.requestMatchers(properties.getSseEndpoint()).permitAll(); registry.requestMatchers(properties.getSseEndpoint()).permitAll();
registry.requestMatchers(properties.getSseMessageEndpoint()).permitAll(); registry.requestMatchers(properties.getSseMessageEndpoint()).permitAll();
}); });
mcpServerStreamableHttpProperties.ifPresent(properties ->
registry.requestMatchers(properties.getMcpEndpoint()).permitAll());
} }
}; };

View File

@ -49,7 +49,7 @@ import org.springframework.ai.chat.model.StreamingChatModel;
import org.springframework.ai.chat.prompt.ChatOptions; import org.springframework.ai.chat.prompt.ChatOptions;
import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.mcp.SyncMcpToolCallbackProvider; import org.springframework.ai.mcp.SyncMcpToolCallbackProvider;
import org.springframework.ai.mcp.client.autoconfigure.properties.McpClientCommonProperties; import org.springframework.ai.mcp.client.common.autoconfigure.properties.McpClientCommonProperties;
import org.springframework.ai.tool.ToolCallback; import org.springframework.ai.tool.ToolCallback;
import org.springframework.ai.tool.resolution.ToolCallbackResolver; import org.springframework.ai.tool.resolution.ToolCallbackResolver;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;

View File

@ -227,6 +227,9 @@ public class AiKnowledgeSegmentServiceImpl implements AiKnowledgeSegmentService
// 2. 检索 // 2. 检索
List<Document> documents = searchDocument(knowledge, reqBO); List<Document> documents = searchDocument(knowledge, reqBO);
if (CollUtil.isEmpty(documents)) {
return ListUtil.empty();
}
// 3.1 段落召回 // 3.1 段落召回
List<AiKnowledgeSegmentDO> segments = segmentMapper List<AiKnowledgeSegmentDO> segments = segmentMapper

View File

@ -16,7 +16,7 @@ import org.springframework.ai.chat.prompt.ChatOptions;
import org.springframework.ai.deepseek.DeepSeekAssistantMessage; import org.springframework.ai.deepseek.DeepSeekAssistantMessage;
import org.springframework.ai.deepseek.DeepSeekChatOptions; import org.springframework.ai.deepseek.DeepSeekChatOptions;
import org.springframework.ai.minimax.MiniMaxChatOptions; import org.springframework.ai.minimax.MiniMaxChatOptions;
import org.springframework.ai.ollama.api.OllamaOptions; import org.springframework.ai.ollama.api.OllamaChatOptions;
import org.springframework.ai.openai.OpenAiChatOptions; import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.ai.tool.ToolCallback; import org.springframework.ai.tool.ToolCallback;
import org.springframework.ai.zhipuai.ZhiPuAiChatOptions; import org.springframework.ai.zhipuai.ZhiPuAiChatOptions;
@ -68,6 +68,7 @@ public class AiUtils {
case OPENAI: case OPENAI:
case GEMINI: // 复用 OpenAI 客户端 case GEMINI: // 复用 OpenAI 客户端
case BAI_CHUAN: // 复用 OpenAI 客户端 case BAI_CHUAN: // 复用 OpenAI 客户端
case GROK: // 复用 OpenAI 客户端
return OpenAiChatOptions.builder().model(model).temperature(temperature).maxTokens(maxTokens) return OpenAiChatOptions.builder().model(model).temperature(temperature).maxTokens(maxTokens)
.toolCallbacks(toolCallbacks).toolContext(toolContext).build(); .toolCallbacks(toolCallbacks).toolContext(toolContext).build();
case AZURE_OPENAI: case AZURE_OPENAI:
@ -77,7 +78,7 @@ public class AiUtils {
return AnthropicChatOptions.builder().model(model).temperature(temperature).maxTokens(maxTokens) return AnthropicChatOptions.builder().model(model).temperature(temperature).maxTokens(maxTokens)
.toolCallbacks(toolCallbacks).toolContext(toolContext).build(); .toolCallbacks(toolCallbacks).toolContext(toolContext).build();
case OLLAMA: case OLLAMA:
return OllamaOptions.builder().model(model).temperature(temperature).numPredict(maxTokens) return OllamaChatOptions.builder().model(model).temperature(temperature).numPredict(maxTokens)
.toolCallbacks(toolCallbacks).toolContext(toolContext).build(); .toolCallbacks(toolCallbacks).toolContext(toolContext).build();
default: default:
throw new IllegalArgumentException(StrUtil.format("未知平台({})", platform)); throw new IllegalArgumentException(StrUtil.format("未知平台({})", platform));

View File

@ -28,7 +28,7 @@ public class AnthropicChatModelTest {
.baseUrl("https://aihubmix.com") .baseUrl("https://aihubmix.com")
.build()) .build())
.defaultOptions(AnthropicChatOptions.builder() .defaultOptions(AnthropicChatOptions.builder()
.model(AnthropicApi.ChatModel.CLAUDE_SONNET_4) .model(AnthropicApi.ChatModel.CLAUDE_SONNET_4_5)
.temperature(0.7) .temperature(0.7)
.maxTokens(4096) .maxTokens(4096)
.build()) .build())
@ -70,7 +70,7 @@ public class AnthropicChatModelTest {
List<Message> messages = new ArrayList<>(); List<Message> messages = new ArrayList<>();
messages.add(new UserMessage("thkinking 下1+1 为什么等于 2 ")); messages.add(new UserMessage("thkinking 下1+1 为什么等于 2 "));
AnthropicChatOptions options = AnthropicChatOptions.builder() AnthropicChatOptions options = AnthropicChatOptions.builder()
.model(AnthropicApi.ChatModel.CLAUDE_SONNET_4) .model(AnthropicApi.ChatModel.CLAUDE_SONNET_4_5)
.thinking(AnthropicApi.ThinkingType.ENABLED, 3096) .thinking(AnthropicApi.ThinkingType.ENABLED, 3096)
.temperature(1D) .temperature(1D)
.build(); .build();

View File

@ -9,8 +9,8 @@ import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.ollama.OllamaChatModel; import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.ai.ollama.api.OllamaApi; import org.springframework.ai.ollama.api.OllamaApi;
import org.springframework.ai.ollama.api.OllamaChatOptions;
import org.springframework.ai.ollama.api.OllamaModel; import org.springframework.ai.ollama.api.OllamaModel;
import org.springframework.ai.ollama.api.OllamaOptions;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
import java.util.ArrayList; import java.util.ArrayList;
@ -27,7 +27,7 @@ public class LlamaChatModelTests {
.ollamaApi(OllamaApi.builder() .ollamaApi(OllamaApi.builder()
.baseUrl("http://127.0.0.1:11434") // Ollama 服务地址 .baseUrl("http://127.0.0.1:11434") // Ollama 服务地址
.build()) .build())
.defaultOptions(OllamaOptions.builder() .defaultOptions(OllamaChatOptions.builder()
.model(OllamaModel.LLAMA3.getName()) // 模型 .model(OllamaModel.LLAMA3.getName()) // 模型
.build()) .build())
.build(); .build();
@ -70,7 +70,7 @@ public class LlamaChatModelTests {
// 准备参数 // 准备参数
List<Message> messages = new ArrayList<>(); List<Message> messages = new ArrayList<>();
messages.add(new UserMessage("详细分析下,如何设计一个电商系统?")); messages.add(new UserMessage("详细分析下,如何设计一个电商系统?"));
OllamaOptions options = OllamaOptions.builder() OllamaChatOptions options = OllamaChatOptions.builder()
.model("qwen3") .model("qwen3")
.build(); .build();
@ -83,5 +83,4 @@ public class LlamaChatModelTests {
}).then().block(); }).then().block();
} }
} }

View File

@ -9,7 +9,7 @@ import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.ollama.OllamaChatModel; import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.ai.ollama.api.OllamaApi; import org.springframework.ai.ollama.api.OllamaApi;
import org.springframework.ai.ollama.api.OllamaOptions; import org.springframework.ai.ollama.api.OllamaChatOptions;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
import java.util.ArrayList; import java.util.ArrayList;
@ -26,7 +26,7 @@ public class OllamaChatModelTests {
.ollamaApi(OllamaApi.builder() .ollamaApi(OllamaApi.builder()
.baseUrl("http://127.0.0.1:11434") // Ollama 服务地址 .baseUrl("http://127.0.0.1:11434") // Ollama 服务地址
.build()) .build())
.defaultOptions(OllamaOptions.builder() .defaultOptions(OllamaChatOptions.builder()
// .model("qwen") // 模型https://ollama.com/library/qwen // .model("qwen") // 模型https://ollama.com/library/qwen
.model("deepseek-r1") // 模型https://ollama.com/library/deepseek-r1 .model("deepseek-r1") // 模型https://ollama.com/library/deepseek-r1
.build()) .build())

View File

@ -23,7 +23,7 @@ import java.util.List;
public class ZhiPuAiChatModelTests { public class ZhiPuAiChatModelTests {
private final ZhiPuAiChatModel chatModel = new ZhiPuAiChatModel( private final ZhiPuAiChatModel chatModel = new ZhiPuAiChatModel(
new ZhiPuAiApi("2f35fb6ca4ea41fab898729b7fac086c.6ESSfPcCkxaKEUlR"), // 密钥 ZhiPuAiApi.builder().apiKey("2f35fb6ca4ea41fab898729b7fac086c.6ESSfPcCkxaKEUlR").build(), // 密钥
ZhiPuAiChatOptions.builder() ZhiPuAiChatOptions.builder()
.model(ZhiPuAiApi.ChatModel.GLM_4.getName()) // 模型 .model(ZhiPuAiApi.ChatModel.GLM_4.getName()) // 模型
.build() .build()

View File

@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
import cn.iocoder.yudao.module.ai.framework.ai.core.webserch.AiWebSearchRequest; import cn.iocoder.yudao.module.ai.framework.ai.core.webserch.AiWebSearchRequest;
import cn.iocoder.yudao.module.ai.framework.ai.core.webserch.AiWebSearchResponse; import cn.iocoder.yudao.module.ai.framework.ai.core.webserch.AiWebSearchResponse;
import cn.iocoder.yudao.module.ai.framework.ai.core.webserch.bocha.AiBoChaWebSearchClient; import cn.iocoder.yudao.module.ai.framework.ai.core.webserch.bocha.AiBoChaWebSearchClient;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
/** /**
@ -17,6 +18,7 @@ public class AiBoChaWebSearchClientTest {
"sk-40500e52840f4d24b956d0b1d80d9abe"); "sk-40500e52840f4d24b956d0b1d80d9abe");
@Test @Test
@Disabled
public void testSearch() { public void testSearch() {
AiWebSearchRequest request = new AiWebSearchRequest() AiWebSearchRequest request = new AiWebSearchRequest()
.setQuery("阿里巴巴") .setQuery("阿里巴巴")

View File

@ -18,11 +18,11 @@ import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConsta
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.flowable.bpmn.converter.BpmnXMLConverter; import org.flowable.bpmn.converter.BpmnXMLConverter;
import org.flowable.bpmn.model.Process;
import org.flowable.bpmn.model.*; import org.flowable.bpmn.model.*;
import org.flowable.bpmn.model.Process;
import org.flowable.common.engine.api.FlowableException; import org.flowable.common.engine.api.FlowableException;
import org.flowable.common.engine.api.delegate.Expression;
import org.flowable.common.engine.impl.util.io.BytesStreamSource; import org.flowable.common.engine.impl.util.io.BytesStreamSource;
import org.flowable.engine.impl.el.FixedValue;
import java.util.*; import java.util.*;
@ -406,7 +406,7 @@ public class BpmnModelUtils {
flowableListener.getFieldExtensions().add(fieldExtension); flowableListener.getFieldExtensions().add(fieldExtension);
} }
public static BpmSimpleModelNodeVO.ListenerHandler parseListenerConfig(FixedValue fixedValue) { public static BpmSimpleModelNodeVO.ListenerHandler parseListenerConfig(Expression fixedValue) {
String expressionText = fixedValue.getExpressionText(); String expressionText = fixedValue.getExpressionText();
Assert.notNull(expressionText, "监听器扩展字段({})不能为空", expressionText); Assert.notNull(expressionText, "监听器扩展字段({})不能为空", expressionText);
return JsonUtils.parseObject(expressionText, BpmSimpleModelNodeVO.ListenerHandler.class); return JsonUtils.parseObject(expressionText, BpmSimpleModelNodeVO.ListenerHandler.class);

View File

@ -54,7 +54,7 @@ public class BpmProcessInstanceCopyServiceImpl implements BpmProcessInstanceCopy
} }
// 执行抄送 // 执行抄送
createProcessInstanceCopy(userIds, reason, createProcessInstanceCopy(userIds, reason,
task.getProcessInstanceId(), task.getTaskDefinitionKey(), task.getId(), task.getName()); task.getProcessInstanceId(), task.getTaskDefinitionKey(), task.getName(), task.getId());
} }
@Override @Override

View File

@ -12,6 +12,7 @@ import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
import cn.iocoder.yudao.framework.common.util.object.PageUtils; import cn.iocoder.yudao.framework.common.util.object.PageUtils;
import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO;
@ -752,6 +753,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqVO createReqVO) { public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqVO createReqVO) {
// 获得流程定义 // 获得流程定义
ProcessDefinition definition = processDefinitionService ProcessDefinition definition = processDefinitionService
@ -762,6 +764,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
} }
@Override @Override
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO createReqDTO) { public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO createReqDTO) {
return FlowableUtils.executeAuthenticatedUserId(userId, () -> { return FlowableUtils.executeAuthenticatedUserId(userId, () -> {
// 获得流程定义 // 获得流程定义
@ -878,6 +881,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
} }
@Override @Override
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
public void cancelProcessInstanceByStartUser(Long userId, @Valid BpmProcessInstanceCancelReqVO cancelReqVO) { public void cancelProcessInstanceByStartUser(Long userId, @Valid BpmProcessInstanceCancelReqVO cancelReqVO) {
// 1.1 校验流程实例存在 // 1.1 校验流程实例存在
ProcessInstance instance = getProcessInstance(cancelReqVO.getId()); ProcessInstance instance = getProcessInstance(cancelReqVO.getId());
@ -907,6 +911,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
} }
@Override @Override
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
public void cancelProcessInstanceByAdmin(Long userId, BpmProcessInstanceCancelReqVO cancelReqVO) { public void cancelProcessInstanceByAdmin(Long userId, BpmProcessInstanceCancelReqVO cancelReqVO) {
// 1.1 校验流程实例存在 // 1.1 校验流程实例存在
ProcessInstance instance = getProcessInstance(cancelReqVO.getId()); ProcessInstance instance = getProcessInstance(cancelReqVO.getId());

View File

@ -376,6 +376,11 @@ public class BpmTaskServiceImpl implements BpmTaskService {
} }
// 2.2 过滤只有串行可到达的节点才可以退回类似非串行子流程无法退回 // 2.2 过滤只有串行可到达的节点才可以退回类似非串行子流程无法退回
previousUserList.removeIf(userTask -> !BpmnModelUtils.isSequentialReachable(source, userTask, null)); previousUserList.removeIf(userTask -> !BpmnModelUtils.isSequentialReachable(source, userTask, null));
// 2.3 过滤只能退回到已经处理过的节点排除审批未经过的节点相关 issuehttps://github.com/YunaiV/ruoyi-vue-pro/issues/982
List<HistoricTaskInstance> finishedTasks = getFinishedTaskListByProcessInstanceIdWithoutCancel(task.getProcessInstanceId());
Set<String> finishedTaskDefinitionKeys = convertSet(finishedTasks, HistoricTaskInstance::getTaskDefinitionKey);
previousUserList.removeIf(userTask -> !finishedTaskDefinitionKeys.contains(userTask.getId()));
return previousUserList; return previousUserList;
} }
@ -544,6 +549,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
public void approveTask(Long userId, @Valid BpmTaskApproveReqVO reqVO) { public void approveTask(Long userId, @Valid BpmTaskApproveReqVO reqVO) {
// 1.1 校验任务存在 // 1.1 校验任务存在
Task task = validateTask(userId, reqVO.getId()); Task task = validateTask(userId, reqVO.getId());
@ -788,6 +794,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
public void rejectTask(Long userId, @Valid BpmTaskRejectReqVO reqVO) { public void rejectTask(Long userId, @Valid BpmTaskRejectReqVO reqVO) {
// 1.1 校验任务存在 // 1.1 校验任务存在
Task task = validateTask(userId, reqVO.getId()); Task task = validateTask(userId, reqVO.getId());
@ -855,6 +862,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
public void returnTask(Long userId, BpmTaskReturnReqVO reqVO) { public void returnTask(Long userId, BpmTaskReturnReqVO reqVO) {
// 1.1 当前任务 task // 1.1 当前任务 task
Task task = validateTask(userId, reqVO.getId()); Task task = validateTask(userId, reqVO.getId());
@ -983,6 +991,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
public void delegateTask(Long userId, BpmTaskDelegateReqVO reqVO) { public void delegateTask(Long userId, BpmTaskDelegateReqVO reqVO) {
String taskId = reqVO.getId(); String taskId = reqVO.getId();
// 1.1 校验任务 // 1.1 校验任务
@ -1012,6 +1021,8 @@ public class BpmTaskServiceImpl implements BpmTaskService {
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
public void transferTask(Long userId, BpmTaskTransferReqVO reqVO) { public void transferTask(Long userId, BpmTaskTransferReqVO reqVO) {
String taskId = reqVO.getId(); String taskId = reqVO.getId();
// 1.1 校验任务 // 1.1 校验任务
@ -1042,6 +1053,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
public void moveTaskToEnd(String processInstanceId, String reason) { public void moveTaskToEnd(String processInstanceId, String reason) {
List<Task> taskList = getRunningTaskListByProcessInstanceId(processInstanceId, null, null); List<Task> taskList = getRunningTaskListByProcessInstanceId(processInstanceId, null, null);
if (CollUtil.isEmpty(taskList)) { if (CollUtil.isEmpty(taskList)) {
@ -1080,6 +1092,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
public void createSignTask(Long userId, BpmTaskSignCreateReqVO reqVO) { public void createSignTask(Long userId, BpmTaskSignCreateReqVO reqVO) {
// 1. 获取和校验任务 // 1. 获取和校验任务
TaskEntityImpl taskEntity = validateTaskCanCreateSign(userId, reqVO); TaskEntityImpl taskEntity = validateTaskCanCreateSign(userId, reqVO);
@ -1196,6 +1209,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
@SuppressWarnings("DataFlowIssue") @SuppressWarnings("DataFlowIssue")
public void deleteSignTask(Long userId, BpmTaskSignDeleteReqVO reqVO) { public void deleteSignTask(Long userId, BpmTaskSignDeleteReqVO reqVO) {
// 1.1 校验 task 可以被减签 // 1.1 校验 task 可以被减签
@ -1235,6 +1249,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@DataPermission(enable = false) // 关闭数据权限避免查询不到用户数据相关案例https://gitee.com/zhijiantianya/yudao-cloud/issues/ID1UYA
public void withdrawTask(Long userId, String taskId) { public void withdrawTask(Long userId, String taskId) {
// 1.1 查询本人已办任务 // 1.1 查询本人已办任务
HistoricTaskInstance taskInstance = historyService.createHistoricTaskInstanceQuery() HistoricTaskInstance taskInstance = historyService.createHistoricTaskInstanceQuery()

View File

@ -13,9 +13,9 @@ import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionServic
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
import lombok.Setter; import lombok.Setter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.flowable.common.engine.api.delegate.Expression;
import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener; import org.flowable.engine.delegate.ExecutionListener;
import org.flowable.engine.impl.el.FixedValue;
import org.flowable.engine.runtime.ProcessInstance; import org.flowable.engine.runtime.ProcessInstance;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -34,7 +34,7 @@ public class BpmCallActivityListener implements ExecutionListener {
public static final String DELEGATE_EXPRESSION = "${bpmCallActivityListener}"; public static final String DELEGATE_EXPRESSION = "${bpmCallActivityListener}";
@Setter @Setter
private FixedValue listenerConfig; private Expression listenerConfig;
@Resource @Resource
private BpmProcessDefinitionService processDefinitionService; private BpmProcessDefinitionService processDefinitionService;

View File

@ -6,8 +6,8 @@ import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmHttpRequestUt
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
import lombok.Setter; import lombok.Setter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.flowable.common.engine.api.delegate.Expression;
import org.flowable.engine.delegate.TaskListener; import org.flowable.engine.delegate.TaskListener;
import org.flowable.engine.impl.el.FixedValue;
import org.flowable.engine.runtime.ProcessInstance; import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.service.delegate.DelegateTask; import org.flowable.task.service.delegate.DelegateTask;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
@ -34,7 +34,7 @@ public class BpmUserTaskListener implements TaskListener {
private BpmProcessInstanceService processInstanceService; private BpmProcessInstanceService processInstanceService;
@Setter @Setter
private FixedValue listenerConfig; private Expression listenerConfig;
@Override @Override
public void notify(DelegateTask delegateTask) { public void notify(DelegateTask delegateTask) {

View File

@ -59,7 +59,6 @@ public class CrmReceivablePlanRespVO {
@ExcelProperty("回款编号") @ExcelProperty("回款编号")
private Long receivableId; private Long receivableId;
@Schema(description = "回款信息") @Schema(description = "回款信息")
@ExcelProperty("回款信息")
private CrmReceivableRespVO receivable; private CrmReceivableRespVO receivable;
@Schema(description = "提前几天提醒", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @Schema(description = "提前几天提醒", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")

View File

@ -19,10 +19,18 @@ public abstract class AbstractFileClient<Config extends FileClientConfig> implem
* 文件配置 * 文件配置
*/ */
protected Config config; protected Config config;
/**
* 原始的文件配置
*
* 原因{@link #config} 可能被子类所修改无法用于判断配置是否变更
* @link <a href="https://t.zsxq.com/29wkW">相关案例</a>
*/
private Config originalConfig;
public AbstractFileClient(Long id, Config config) { public AbstractFileClient(Long id, Config config) {
this.id = id; this.id = id;
this.config = config; this.config = config;
this.originalConfig = config;
} }
/** /**
@ -40,11 +48,12 @@ public abstract class AbstractFileClient<Config extends FileClientConfig> implem
public final void refresh(Config config) { public final void refresh(Config config) {
// 判断是否更新 // 判断是否更新
if (config.equals(this.config)) { if (config.equals(this.originalConfig)) {
return; return;
} }
log.info("[refresh][配置({})发生变化,重新初始化]", config); log.info("[refresh][配置({})发生变化,重新初始化]", config);
this.config = config; this.config = config;
this.originalConfig = config;
// 初始化 // 初始化
this.init(); this.init();
} }

View File

@ -33,7 +33,7 @@ public interface IotAlertConfigMapper extends BaseMapperX<IotAlertConfigDO> {
default List<IotAlertConfigDO> selectListBySceneRuleIdAndStatus(Long sceneRuleId, Integer status) { default List<IotAlertConfigDO> selectListBySceneRuleIdAndStatus(Long sceneRuleId, Integer status) {
return selectList(new LambdaQueryWrapperX<IotAlertConfigDO>() return selectList(new LambdaQueryWrapperX<IotAlertConfigDO>()
.eq(IotAlertConfigDO::getStatus, status) .eq(IotAlertConfigDO::getStatus, status)
.apply(MyBatisUtils.findInSet("scene_rule_id", sceneRuleId))); .apply(MyBatisUtils.findInSet("scene_rule_ids", sceneRuleId)));
} }
} }

View File

@ -43,9 +43,6 @@ public class IotSceneRuleMessageHandler implements IotMessageSubscriber<IotDevic
@Override @Override
public void onMessage(IotDeviceMessage message) { public void onMessage(IotDeviceMessage message) {
if (true) {
return;
}
log.info("[onMessage][消息内容({})]", message); log.info("[onMessage][消息内容({})]", message);
sceneRuleService.executeSceneRuleByDevice(message); sceneRuleService.executeSceneRuleByDevice(message);
} }

View File

@ -282,10 +282,11 @@ public class CouponServiceImpl implements CouponService {
if (ObjUtil.notEqual(couponTemplate.getTakeType(), takeType.getType())) { if (ObjUtil.notEqual(couponTemplate.getTakeType(), takeType.getType())) {
throw exception(COUPON_TEMPLATE_CANNOT_TAKE); throw exception(COUPON_TEMPLATE_CANNOT_TAKE);
} }
// 校验发放数量不能过小仅在 CouponTakeTypeEnum.USER 用户领取时 // 校验剩余发放数量是否充足仅在 CouponTakeTypeEnum.USER 用户领取时
// 关联案例https://t.zsxq.com/mElGQhttps://t.zsxq.com/6pLzr
if (CouponTakeTypeEnum.isUser(couponTemplate.getTakeType()) if (CouponTakeTypeEnum.isUser(couponTemplate.getTakeType())
&& ObjUtil.notEqual(couponTemplate.getTakeLimitCount(), CouponTemplateDO.TAKE_LIMIT_COUNT_MAX) // 校验不限制领取数 && ObjUtil.notEqual(couponTemplate.getTakeLimitCount(), CouponTemplateDO.TAKE_LIMIT_COUNT_MAX) // 校验不限制领取数
&& ObjUtil.notEqual(couponTemplate.getTotalCount(), CouponTemplateDO.TOTAL_COUNT_MAX)) { // 校验不限制发放数量 && couponTemplate.getTakeCount() > couponTemplate.getTotalCount()) { // 已领取数量 >= 发放数量
throw exception(COUPON_TEMPLATE_NOT_ENOUGH); throw exception(COUPON_TEMPLATE_NOT_ENOUGH);
} }
// 校验"固定日期"的有效期类型是否过期 // 校验"固定日期"的有效期类型是否过期

View File

@ -268,7 +268,9 @@ public interface TradeOrderConvert {
.setTitle(StrUtil.format("{}成功购买{}", user.getNickname(), item.getSpuName())) .setTitle(StrUtil.format("{}成功购买{}", user.getNickname(), item.getSpuName()))
.setFirstFixedPrice(0).setSecondFixedPrice(0); .setFirstFixedPrice(0).setSecondFixedPrice(0);
if (BooleanUtil.isTrue(spu.getSubCommissionType())) { if (BooleanUtil.isTrue(spu.getSubCommissionType())) {
bo.setFirstFixedPrice(sku.getFirstBrokeragePrice()).setSecondFixedPrice(sku.getSecondBrokeragePrice()); // 特殊单独设置的佣金需要乘以购买数量关联 https://gitee.com/yudaocode/yudao-mall-uniapp/issues/ICY7SJ
bo.setFirstFixedPrice(sku.getFirstBrokeragePrice() * item.getCount())
.setSecondFixedPrice(sku.getSecondBrokeragePrice() * item.getCount());
} }
return bo; return bo;
} }

View File

@ -29,7 +29,7 @@ public class BrokerageRecordDO extends BaseDO {
* 编号 * 编号
*/ */
@TableId @TableId
private Integer id; private Long id;
/** /**
* 用户编号 * 用户编号
* <p> * <p>

View File

@ -44,7 +44,7 @@ public interface BrokerageRecordMapper extends BaseMapperX<BrokerageRecordDO> {
.lt(BrokerageRecordDO::getUnfreezeTime, unfreezeTime)); .lt(BrokerageRecordDO::getUnfreezeTime, unfreezeTime));
} }
default int updateByIdAndStatus(Integer id, Integer status, BrokerageRecordDO updateObj) { default int updateByIdAndStatus(Long id, Integer status, BrokerageRecordDO updateObj) {
return update(updateObj, new LambdaQueryWrapper<BrokerageRecordDO>() return update(updateObj, new LambdaQueryWrapper<BrokerageRecordDO>()
.eq(BrokerageRecordDO::getId, id) .eq(BrokerageRecordDO::getId, id)
.eq(BrokerageRecordDO::getStatus, status)); .eq(BrokerageRecordDO::getStatus, status));

View File

@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.trade.service.aftersale; package cn.iocoder.yudao.module.trade.service.aftersale;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
@ -352,12 +353,20 @@ public class AfterSaleServiceImpl implements AfterSaleService {
throw exception(AFTER_SALE_REFUND_FAIL_STATUS_NOT_WAIT_REFUND); throw exception(AFTER_SALE_REFUND_FAIL_STATUS_NOT_WAIT_REFUND);
} }
// 发起退款单注意需要在事务提交后再进行发起避免重复发起 Integer newStatus;
createPayRefund(userIp, afterSale); if (ObjUtil.equals(afterSale.getRefundPrice(), 0)) {
// 特殊退款为 0 的订单直接标记为完成积分商城关联案例https://t.zsxq.com/AQEvL
updateAfterSaleStatus(afterSale.getId(), AfterSaleStatusEnum.WAIT_REFUND.getStatus(), new AfterSaleDO()
.setStatus(AfterSaleStatusEnum.COMPLETE.getStatus()).setRefundTime(LocalDateTime.now()));
newStatus = AfterSaleStatusEnum.COMPLETE.getStatus();
} else {
// 发起退款单注意需要在事务提交后再进行发起避免重复发起
createPayRefund(userIp, afterSale);
newStatus = afterSale.getStatus(); // 特殊这里状态不变而是最终 updateAfterSaleRefunded 处理
}
// 记录售后日志 // 记录售后日志
AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(), AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(), newStatus);
afterSale.getStatus()); // 特殊这里状态不变而是最终 updateAfterSaleRefunded 处理
} }
private void createPayRefund(String userIp, AfterSaleDO afterSale) { private void createPayRefund(String userIp, AfterSaleDO afterSale) {

View File

@ -147,9 +147,10 @@ public class BrokerageWithdrawServiceImpl implements BrokerageWithdrawService {
userAccount = wallet.getId().toString(); userAccount = wallet.getId().toString();
} }
// 1.2 构建请求 // 1.2 构建请求
Integer transferPrice = withdraw.getPrice() - withdraw.getFeePrice(); // 计算实际转账金额提现金额 - 手续费
PayTransferCreateReqDTO transferReqDTO = new PayTransferCreateReqDTO() PayTransferCreateReqDTO transferReqDTO = new PayTransferCreateReqDTO()
.setAppKey(tradeOrderProperties.getPayAppKey()).setChannelCode(channelCode) .setAppKey(tradeOrderProperties.getPayAppKey()).setChannelCode(channelCode)
.setMerchantTransferId(withdraw.getId().toString()).setSubject("佣金提现").setPrice(withdraw.getPrice()) .setMerchantTransferId(withdraw.getId().toString()).setSubject("佣金提现").setPrice(transferPrice)
.setUserAccount(userAccount).setUserName(userName).setUserIp(getClientIP()) .setUserAccount(userAccount).setUserName(userName).setUserIp(getClientIP())
.setUserId(withdraw.getUserId()).setUserType(UserTypeEnum.MEMBER.getValue()) // 用户信息 .setUserId(withdraw.getUserId()).setUserType(UserTypeEnum.MEMBER.getValue()) // 用户信息
.setChannelExtras(channelExtras); .setChannelExtras(channelExtras);
@ -280,9 +281,10 @@ public class BrokerageWithdrawServiceImpl implements BrokerageWithdrawService {
throw exception(BROKERAGE_WITHDRAW_UPDATE_STATUS_FAIL_PAY_TRANSFER_STATUS_NOT_SUCCESS_OR_CLOSED); throw exception(BROKERAGE_WITHDRAW_UPDATE_STATUS_FAIL_PAY_TRANSFER_STATUS_NOT_SUCCESS_OR_CLOSED);
} }
// 2.2 校验转账金额一致 // 2.2 校验转账金额一致
if (ObjectUtil.notEqual(payTransfer.getPrice(), withdraw.getPrice())) { Integer expectedTransferPrice = withdraw.getPrice() - withdraw.getFeePrice(); // 转账金额 = 提现金额 - 手续费
log.error("[validateBrokerageTransferStatusCanUpdate][withdraw({}) payTransfer({}) 转账金额不匹配请进行处理withdraw 数据是:{}payTransfer 数据是:{}]", if (ObjectUtil.notEqual(payTransfer.getPrice(), expectedTransferPrice)) {
withdraw.getId(), payTransferId, JsonUtils.toJsonString(withdraw), JsonUtils.toJsonString(payTransfer)); log.error("[validateBrokerageTransferStatusCanUpdate][withdraw({}) payTransfer({}) 转账金额不匹配请进行处理withdraw 数据是:{}payTransfer 数据是:{},期望转账金额:{}]",
withdraw.getId(), payTransferId, JsonUtils.toJsonString(withdraw), JsonUtils.toJsonString(payTransfer), expectedTransferPrice);
throw exception(BROKERAGE_WITHDRAW_UPDATE_STATUS_FAIL_PAY_PRICE_NOT_MATCH); throw exception(BROKERAGE_WITHDRAW_UPDATE_STATUS_FAIL_PAY_PRICE_NOT_MATCH);
} }
// 2.3 校验转账订单匹配 // 2.3 校验转账订单匹配

View File

@ -153,6 +153,7 @@ public class SocialUserServiceImpl implements SocialUserService {
if (socialUser.getId() == null) { if (socialUser.getId() == null) {
socialUserMapper.insert(socialUser); socialUserMapper.insert(socialUser);
} else { } else {
socialUser.clean(); // 避免 updateTime 不更新https://gitee.com/yudaocode/yudao-boot-mini/issues/ID7FUL
socialUserMapper.updateById(socialUser); socialUserMapper.updateById(socialUser);
} }
return socialUser; return socialUser;

View File

@ -276,7 +276,9 @@ public class AdminUserServiceImpl implements AdminUserService {
// 如果有角色编号查询角色对应的用户编号 // 如果有角色编号查询角色对应的用户编号
Set<Long> userIds = reqVO.getRoleId() != null ? Set<Long> userIds = reqVO.getRoleId() != null ?
permissionService.getUserRoleIdListByRoleId(singleton(reqVO.getRoleId())) : null; permissionService.getUserRoleIdListByRoleId(singleton(reqVO.getRoleId())) : null;
if (userIds != null && userIds.isEmpty()) {
return PageResult.empty();
}
// 分页查询 // 分页查询
return userMapper.selectPage(reqVO, getDeptCondition(reqVO.getDeptId()), userIds); return userMapper.selectPage(reqVO, getDeptCondition(reqVO.getDeptId()), userIds);
} }

View File

@ -59,11 +59,11 @@
<!-- </dependency>--> <!-- </dependency>-->
<!-- 微信公众号模块。默认注释,保证编译速度 --> <!-- 微信公众号模块。默认注释,保证编译速度 -->
<!-- <dependency>--> <dependency>
<!-- <groupId>cn.iocoder.boot</groupId>--> <groupId>cn.iocoder.boot</groupId>
<!-- <artifactId>yudao-module-mp</artifactId>--> <artifactId>yudao-module-mp</artifactId>
<!-- <version>${revision}</version>--> <version>${revision}</version>
<!-- </dependency>--> </dependency>
<!-- 商城相关模块。默认注释,保证编译速度--> <!-- 商城相关模块。默认注释,保证编译速度-->
<!-- <dependency>--> <!-- <dependency>-->

View File

@ -187,7 +187,7 @@ spring:
api-key: sk-47aa124781be4bfb95244cc62f6xxxx api-key: sk-47aa124781be4bfb95244cc62f6xxxx
minimax: # Minimaxhttps://www.minimaxi.com/ minimax: # Minimaxhttps://www.minimaxi.com/
api-key: xxxx api-key: xxxx
moonshot: # 月之暗KIMI moonshot: # 月之暗KIMI
api-key: sk-abc api-key: sk-abc
deepseek: # DeepSeek deepseek: # DeepSeek
api-key: sk-e94db327cc7d457d99a8de8810fc6b12 api-key: sk-e94db327cc7d457d99a8de8810fc6b12
@ -211,6 +211,8 @@ spring:
filesystem: filesystem:
url: http://127.0.0.1:8089 url: http://127.0.0.1:8089
sse-endpoint: /sse sse-endpoint: /sse
annotation-scanner:
enabled: false # TODO @芋艿:有 bug https://github.com/spring-projects/spring-ai/issues/4917 需要官方修复
yudao: yudao:
ai: ai: