commit 29dd439db8271ead01faf9d97c327235abc72d87 Author: old易 <156663459@qq.com> Date: Mon May 12 09:18:28 2025 +0800 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3feb18f --- /dev/null +++ b/.gitignore @@ -0,0 +1,40 @@ +# Build and Release Folders +bin-debug/ +bin-release/ +[Oo]bj/ +[Bb]in/ + +# Other files and folders +.settings/ + +# Executables +*.swf +*.air +*.ipa +*.apk + +# Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties` +# should NOT be excluded as they contain compiler settings and other important +# information for Eclipse / Flash Builder. +/Admin.NET/.vs +/Admin.NET/packages +/Admin.NET/Admin.NET.Web.Entry/wwwroot/Upload +/Admin.NET/Admin.NET.Web.Entry/wwwroot/Avatar +/Admin.NET/Admin.NET.Web.Entry/wwwroot/Signature +/Admin.NET/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj.user +/Admin.NET/Admin.NET.Web.Entry/Admin.NET.Web.Entry.csproj.user +/Admin.NET/Admin.NET.Web.Entry/Properties/PublishProfiles +/Admin.NET/Admin.NET.Web.Entry/publish +/Admin.NET/Admin.NET.Web.Entry/logs +/Admin.NET/Admin.NET.Web.Entry/*.db + +# folders +dist/ +node_modules/ +/Web/package-lock.json +/Web/public/config.js +/Web/stats.html +.vs +.idea +.DS_Store +/Admin.NET/Admin.NET.Core/Entity/CePing/BusScale.cs diff --git a/Admin.NET/.dockerignore b/Admin.NET/.dockerignore new file mode 100644 index 0000000..3729ff0 --- /dev/null +++ b/Admin.NET/.dockerignore @@ -0,0 +1,25 @@ +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/azds.yaml +**/bin +**/charts +**/docker-compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md \ No newline at end of file diff --git a/Admin.NET/.editorconfig b/Admin.NET/.editorconfig new file mode 100644 index 0000000..53ac171 --- /dev/null +++ b/Admin.NET/.editorconfig @@ -0,0 +1,175 @@ + +[*.cs] +#### 命名样式 #### + +# 命名规则 + +dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion +dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface +dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i + +dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.types_should_be_pascal_case.symbols = types +dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case + +dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members +dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case + +# 符号规范 + +dotnet_naming_symbols.interface.applicable_kinds = interface +dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.interface.required_modifiers = + +dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum +dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.types.required_modifiers = + +dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method +dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.non_field_members.required_modifiers = + +# 命名样式 + +dotnet_naming_style.begins_with_i.required_prefix = I +dotnet_naming_style.begins_with_i.required_suffix = +dotnet_naming_style.begins_with_i.word_separator = +dotnet_naming_style.begins_with_i.capitalization = pascal_case + +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case + +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case +csharp_using_directive_placement = outside_namespace:silent +csharp_style_expression_bodied_methods = false:silent +csharp_style_expression_bodied_constructors = false:silent +csharp_style_expression_bodied_operators = false:silent +csharp_style_expression_bodied_properties = true:silent +csharp_style_expression_bodied_indexers = true:silent +csharp_style_expression_bodied_accessors = true:silent +csharp_style_expression_bodied_lambdas = true:silent +csharp_style_expression_bodied_local_functions = false:silent +csharp_style_conditional_delegate_call = true:suggestion +csharp_style_var_for_built_in_types = false:silent +csharp_style_var_when_type_is_apparent = false:silent +csharp_style_var_elsewhere = false:silent +csharp_prefer_simple_using_statement = true:suggestion +csharp_prefer_braces = true:silent +csharp_style_namespace_declarations = file_scoped:silent +csharp_style_prefer_top_level_statements = true:silent +csharp_style_prefer_method_group_conversion = true:silent +csharp_prefer_static_local_function = true:suggestion +csharp_style_allow_embedded_statements_on_same_line_experimental = true:silent +csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true:silent +csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true:silent +csharp_style_prefer_switch_expression = true:suggestion +csharp_style_prefer_pattern_matching = true:silent +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_prefer_not_pattern = true:suggestion +csharp_style_prefer_extended_property_pattern = true:suggestion +csharp_style_throw_expression = true:suggestion +csharp_style_prefer_null_check_over_type_check = true:suggestion +csharp_prefer_simple_default_expression = true:suggestion +csharp_style_prefer_local_over_anonymous_function = true:suggestion +csharp_style_prefer_index_operator = true:suggestion +csharp_style_prefer_range_operator = true:suggestion +csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion +csharp_style_prefer_tuple_swap = true:suggestion +csharp_style_prefer_utf8_string_literals = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion +csharp_style_deconstructed_variable_declaration = true:suggestion +csharp_style_unused_value_assignment_preference = discard_variable:suggestion +csharp_style_unused_value_expression_statement_preference = discard_variable:silent +csharp_space_around_binary_operators = before_and_after +csharp_indent_labels = one_less_than_current + +[*.vb] +#### 命名样式 #### + +# 命名规则 + +dotnet_naming_rule.interface_should_be_以_i_开始.severity = suggestion +dotnet_naming_rule.interface_should_be_以_i_开始.symbols = interface +dotnet_naming_rule.interface_should_be_以_i_开始.style = 以_i_开始 + +dotnet_naming_rule.类型_should_be_帕斯卡拼写法.severity = suggestion +dotnet_naming_rule.类型_should_be_帕斯卡拼写法.symbols = 类型 +dotnet_naming_rule.类型_should_be_帕斯卡拼写法.style = 帕斯卡拼写法 + +dotnet_naming_rule.非字段成员_should_be_帕斯卡拼写法.severity = suggestion +dotnet_naming_rule.非字段成员_should_be_帕斯卡拼写法.symbols = 非字段成员 +dotnet_naming_rule.非字段成员_should_be_帕斯卡拼写法.style = 帕斯卡拼写法 + +# 符号规范 + +dotnet_naming_symbols.interface.applicable_kinds = interface +dotnet_naming_symbols.interface.applicable_accessibilities = public, friend, private, protected, protected_friend, private_protected +dotnet_naming_symbols.interface.required_modifiers = + +dotnet_naming_symbols.类型.applicable_kinds = class, struct, interface, enum +dotnet_naming_symbols.类型.applicable_accessibilities = public, friend, private, protected, protected_friend, private_protected +dotnet_naming_symbols.类型.required_modifiers = + +dotnet_naming_symbols.非字段成员.applicable_kinds = property, event, method +dotnet_naming_symbols.非字段成员.applicable_accessibilities = public, friend, private, protected, protected_friend, private_protected +dotnet_naming_symbols.非字段成员.required_modifiers = + +# 命名样式 + +dotnet_naming_style.以_i_开始.required_prefix = I +dotnet_naming_style.以_i_开始.required_suffix = +dotnet_naming_style.以_i_开始.word_separator = +dotnet_naming_style.以_i_开始.capitalization = pascal_case + +dotnet_naming_style.帕斯卡拼写法.required_prefix = +dotnet_naming_style.帕斯卡拼写法.required_suffix = +dotnet_naming_style.帕斯卡拼写法.word_separator = +dotnet_naming_style.帕斯卡拼写法.capitalization = pascal_case + +dotnet_naming_style.帕斯卡拼写法.required_prefix = +dotnet_naming_style.帕斯卡拼写法.required_suffix = +dotnet_naming_style.帕斯卡拼写法.word_separator = +dotnet_naming_style.帕斯卡拼写法.capitalization = pascal_case + +[*.{cs,vb}] +end_of_line = crlf +dotnet_style_qualification_for_field = false:silent +dotnet_style_qualification_for_property = false:silent +dotnet_style_qualification_for_method = false:silent +dotnet_style_qualification_for_event = false:silent +dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent +dotnet_code_quality_unused_parameters = all:suggestion +dotnet_style_readonly_field = true:suggestion +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent +dotnet_style_allow_multiple_blank_lines_experimental = true:silent +dotnet_style_allow_statement_immediately_after_block_experimental = true:silent +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_auto_properties = true:silent +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_prefer_simplified_boolean_expressions = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:silent +dotnet_style_prefer_conditional_expression_over_return = true:silent +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_compound_assignment = true:suggestion +dotnet_style_prefer_simplified_interpolation = true:suggestion +dotnet_style_namespace_match_folder = true:suggestion +dotnet_style_predefined_type_for_locals_parameters_members = true:silent +dotnet_style_predefined_type_for_member_access = true:silent +indent_size = 4 +tab_width = 4 +dotnet_style_operator_placement_when_wrapping = beginning_of_line \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/Admin.NET.Application.csproj b/Admin.NET/Admin.NET.Application/Admin.NET.Application.csproj new file mode 100644 index 0000000..dd9eddd --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Admin.NET.Application.csproj @@ -0,0 +1,48 @@ + + + + net8.0 + 1701;1702;1591;8632 + + True + disable + © Admin.NET + Admin.NET 通用权限开发平台 + + + + + true + PreserveNewest + PreserveNewest + + + true + PreserveNewest + PreserveNewest + + + + + + + + + + + + + + + + + + + + + + PreserveNewest + + + + diff --git a/Admin.NET/Admin.NET.Application/Configuration/APIJSON.json b/Admin.NET/Admin.NET.Application/Configuration/APIJSON.json new file mode 100644 index 0000000..5baf231 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Configuration/APIJSON.json @@ -0,0 +1,34 @@ +{ + "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + + "APIJSON": { + "Roles": [ + { + "RoleName": "Role1", // 权限名称 唯一 + "Select": { // 查询 + "Table": [ "*" ], // 可操作的表 + "Column": [ "*" ], // 可操作的字段 + "Filter": [] + }, + "Insert": { // 添加 + "Table": [ "table1", "table2", "table3" ], + "Column": [ "*", "*", "tb.*" ] + }, + "Update": { // 修改 + "Table": [ "table1", "table2", "table3" ], + "Column": [ "*", "tb.*", "tb.*" ] + }, + "Delete": { // 删除 + "Table": [ "table1", "table2", "table3" ] + } + }, + { + "RoleName": "Role2", + "Select": { + "Table": [ "table1" ], + "Column": [ "tb.*" ] + } + } + ] + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/Configuration/App.json b/Admin.NET/Admin.NET.Application/Configuration/App.json new file mode 100644 index 0000000..6d73dfe --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Configuration/App.json @@ -0,0 +1,54 @@ +{ + "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + + "Urls": "http://*:5006", // 配置默认端口 + // "https_port": 44325, + + "AllowedHosts": "*", + + "AppSettings": { + "InjectSpecificationDocument": true, // 生产环境是否开启Swagger + "ExternalAssemblies": [ "plugins" ] // 插件目录 + }, + "DynamicApiControllerSettings": { + //"DefaultRoutePrefix": "api", // 默认路由前缀 + "CamelCaseSeparator": "", // 驼峰命名分隔符 + "SplitCamelCase": false, // 切割骆驼(驼峰)/帕斯卡命名 + "LowercaseRoute": false, // 小写路由格式 + "AsLowerCamelCase": true, // 小驼峰命名(首字母小写) + "KeepVerb": false, // 保留动作方法请求谓词 + "KeepName": false // 保持原有名称不处理 + }, + "FriendlyExceptionSettings": { + "DefaultErrorMessage": "系统异常,请联系管理员", + "ThrowBah": true, // 是否将 Oops.Oh 默认抛出为业务异常 + "LogError": false // 是否输出异常日志 + }, + "LocalizationSettings": { + "SupportedCultures": [ "zh-CN", "en" ], // 语言列表 + "DefaultCulture": "zh-CN", // 默认语言 + "DateTimeFormatCulture": "zh-CN" // 固定时间区域为特定时区(多语言) + }, + "CorsAccessorSettings": { + // "WithOrigins": ["https://gitee.com"], + "WithExposedHeaders": [ "Content-Disposition", "X-Pagination", "access-token", "x-access-token" ], // 如果前端不代理且是axios请求 + "SignalRSupport": true // 启用 SignalR 跨域支持 + }, + "SnowId": { + "WorkerId": 1, // 机器码 全局唯一 + "WorkerIdBitLength": 6, // 机器码位长 默认值6,取值范围 [1, 19] + "SeqBitLength": 6, // 序列数位长 默认值6,取值范围 [3, 21](建议不小于4,值越大性能越高、Id位数也更长) + "WorkerPrefix": "adminnet_" // 缓存前缀 + }, + "Cryptogram": { + "StrongPassword": false, // 是否开启密码强度验证 + "PasswordStrengthValidation": "(?=^.{6,16}$)(?=.*\\d)(?=.*\\W+)(?=.*[A-Z])(?=.*[a-z])(?!.*\\n).*$", // 密码强度验证正则表达式,必须须包含大小写字母、数字和特殊字符的组合,长度在6-16之间 + "PasswordStrengthValidationMsg": "密码必须包含大小写字母、数字和特殊字符的组合,长度在6-16之间", // 密码强度验证消息提示 + "CryptoType": "SM2", // 密码加密算法:MD5、SM2、SM4 + "PublicKey": "0484C7466D950E120E5ECE5DD85D0C90EAA85081A3A2BD7C57AE6DC822EFCCBD66620C67B0103FC8DD280E36C3B282977B722AAEC3C56518EDCEBAFB72C5A05312", // 公钥 + "PrivateKey": "8EDB615B1D48B8BE188FC0F18EC08A41DF50EA731FA28BF409E6552809E3A111" // 私钥 + }, + "OutExApi": { + "BaseUrl": "http://192.168.104.102:8081/" + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/Configuration/Cache.json b/Admin.NET/Admin.NET.Application/Configuration/Cache.json new file mode 100644 index 0000000..dfcc8cd --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Configuration/Cache.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + + "Cache": { + "Prefix": "adminnet_", // 全局缓存前缀 + "CacheType": "Memory", // Memory、Redis + "Redis": { + "Configuration": "server=192.168.104.104:6379;password=jhkdjhkjdhsIUTYURTU_X6M3YN;db=5;", // Redis连接字符串 + "Prefix": "adminnet_", // Redis前缀(目前没用) + "MaxMessageSize": "1048576" // 最大消息大小 默认1024 * 1024 + } + }, + "Cluster": { // 集群配置 + "Enabled": false, // 启用集群:前提开启Redis缓存模式 + "ServerId": "adminnet", // 服务器标识 + "ServerIp": "", // 服务器IP + "SignalR": { + "RedisConfiguration": "192.168.104.104:6379,ssl=false,password=jhkdjhkjdhsIUTYURTU_X6M3YN,defaultDatabase=6", + "ChannelPrefix": "signalrPrefix_" + }, + "DataProtecteKey": "AdminNet:DataProtection-Keys", + "IsSentinel": false, // 是否哨兵模式 + "SentinelConfig": { + "DefaultDb": "4", + "EndPoints": [ // 哨兵端口 + // "10.10.0.124:26380" + ], + "MainPrefix": "adminNet:", + "Password": "123456", + "SentinelPassword": "adminNet", + "ServiceName": "adminNet", + "SignalRChannelPrefix": "signalR:" + } + }, + "Mongoopt": { + "Url": "mongodb://mongo_B26NQQ:mongo_35EGkB@192.168.104.104:27017" + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/Configuration/Captcha.json b/Admin.NET/Admin.NET.Application/Configuration/Captcha.json new file mode 100644 index 0000000..0d8646f --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Configuration/Captcha.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + + "CaptchaOptions": { + "CaptchaType": 10, // 验证码类型0、1、2、3、4、5、6、7、8、9、10、11 + "CodeLength": 1, // 验证码长度, 要放在CaptchaType设置后 当类型为算术表达式时,长度代表操作的个数, 例如2 + "ExpirySeconds": 60, // 验证码过期秒数 + "IgnoreCase": true, // 比较时是否忽略大小写 + "StoreageKeyPrefix": "", // 存储键前缀 + "ImageOption": { + "Animation": true, // 是否启用动画 + "FontSize": 36, // 字体大小 + "Width": 150, // 验证码宽度 + "Height": 50, // 验证码高度 + "BubbleMinRadius": 5, // 气泡最小半径 + "BubbleMaxRadius": 10, // 气泡最大半径 + "BubbleCount": 3, // 气泡数量 + "BubbleThickness": 1.0, // 气泡边沿厚度 + "InterferenceLineCount": 3, // 干扰线数量 + "FontFamily": "kaiti", // 包含actionj,epilog,fresnel,headache,lexo,prefix,progbot,ransom,robot,scandal,kaiti + "FrameDelay": 300, // 每帧延迟,Animation=true时有效, 默认300 + "BackgroundColor": "#ffffff", // 格式: rgb, rgba, rrggbb, or rrggbbaa format to match web syntax, 默认#fff + "ForegroundColors": "", // 颜色格式同BackgroundColor,多个颜色逗号分割,随机选取。不填,空值,则使用默认颜色集 + "Quality": 100, // 图片质量(质量越高图片越大,gif调整无效可能会更大) + "TextBold": true // 粗体 + } + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/Configuration/CodeGen.json b/Admin.NET/Admin.NET.Application/Configuration/CodeGen.json new file mode 100644 index 0000000..275087a --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Configuration/CodeGen.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + + // 代码生成配置项-程序集名称集合 + "CodeGen": { + "EntityAssemblyNames": [ "Admin.NET.Core", "Admin.NET.Application" ], + "BaseEntityNames": [ "EntityTenantId", "EntityTenant", "EntityTenantBaseData", "EntityBaseData", "EntityBase", "EntityBaseId" ], + "EntityBaseColumn": { + "EntityTenantId": [ "Id", "TenantId" ], + "EntityTenant": [ "Id", "CreateTime", "UpdateTime", "CreateUserId", "UpdateUserId", "CreateUserName", "UpdateUserName", "IsDelete", "TenantId" ], + "EntityTenantBaseData": [ "Id", "CreateTime", "UpdateTime", "CreateUserId", "UpdateUserId", "CreateUserName", "UpdateUserName", "IsDelete", "CreateOrgId", "CreateOrgName", "TenantId" ], + "EntityBaseData": [ "Id", "CreateTime", "UpdateTime", "CreateUserId", "UpdateUserId", "CreateUserName", "UpdateUserName", "IsDelete", "CreateOrgId", "CreateOrgName" ], + "EntityBase": [ "Id", "CreateTime", "UpdateTime", "CreateUserId", "UpdateUserId", "CreateUserName", "UpdateUserName", "IsDelete" ], + "EntityBaseId": [ "Id" ] + //"BaseId": [ "Id" ] + }, + "FrontRootPath": "Web", // 前端项目根目录 + "BackendApplicationNamespaces": [ "Admin.NET.Application", "Admin.NET.Application2" ] // 后端生成到的项目 + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/Configuration/Database.json b/Admin.NET/Admin.NET.Application/Configuration/Database.json new file mode 100644 index 0000000..9ceebd0 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Configuration/Database.json @@ -0,0 +1,76 @@ +{ + "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + + // 详细数据库配置见SqlSugar官网(第一个为默认库) + "DbConnection": { + "EnableConsoleSql": true, // 启用控制台打印SQL + "ConnectionConfigs": [ + { + //"ConfigId": "1300000000001", // 默认库标识-禁止修改 + "DbType": "MySql", // MySql、SqlServer、Sqlite、Oracle、PostgreSQL、Dm、Kdbndp、Oscar、MySqlConnector、Access、OpenGauss、QuestDB、HG、ClickHouse、GBase、Odbc、Custom + "ConnectionString": "DataSource=192.168.104.103; Port=3306;SslMode=None;Database=ZhiyuanForNet; Uid=ZhiyuanForNet; Pwd=xeYtEixkWixTpdhG;CharSet=utf8mb4", // 库连接字符串 + //"SlaveConnectionConfigs": [ // 读写分离/主从 + // { + // "HitRate": 10, + // "ConnectionString": "DataSource=./Admin.NET1.db" + // }, + // { + // "HitRate": 10, + // "ConnectionString": "DataSource=./Admin.NET2.db" + // } + //], + "DbSettings": { + "EnableInitDb": false, // 启用库初始化 + "EnableDiffLog": false, // 启用库表差异日志 + "EnableUnderLine": false // 启用驼峰转下划线 + }, + "TableSettings": { + "EnableInitTable": true, // 启用表初始化 + "EnableIncreTable": false // 启用表增量更新-特性[IncreTable] + }, + "SeedSettings": { + "EnableInitSeed": false, // 启用种子初始化 + "EnableIncreSeed": false // 启用种子增量更新-特性[IncreSeed] + } + } + //// 日志独立数据库配置 + //{ + // "ConfigId": "1300000000002", // 日志库标识-禁止修改 + // "DbType": "Sqlite", + // "ConnectionString": "DataSource=./Admin.NET.Log.db", // 库连接字符串 + // "DbSettings": { + // "EnableInitDb": true, // 启用库初始化 + // "EnableDiffLog": false, // 启用库表差异日志 + // "EnableUnderLine": false // 启用驼峰转下划线 + // }, + // "TableSettings": { + // "EnableInitTable": true, // 启用表初始化 + // "EnableIncreTable": false // 启用表增量更新-特性[IncreTable] + // }, + // "SeedSettings": { + // "EnableInitSeed": false, // 启用种子初始化 + // "EnableIncreSeed": false // 启用种子增量更新-特性[IncreSeed] + // } + //}, + //// 其他数据库配置(可以配置多个) + //{ + // "ConfigId": "test", // 库标识 + // "DbType": "Sqlite", // 库类型 + // "ConnectionString": "DataSource=./Admin.NET.Test.db", // 库连接字符串 + // "DbSettings": { + // "EnableInitDb": true, // 启用库初始化 + // "EnableDiffLog": false, // 启用库表差异日志 + // "EnableUnderLine": false // 启用驼峰转下划线 + // }, + // "TableSettings": { + // "EnableInitTable": true, // 启用表初始化 + // "EnableIncreTable": false // 启用表增量更新-特性[IncreTable] + // }, + // "SeedSettings": { + // "EnableInitSeed": true, // 启用种子初始化 + // "EnableIncreSeed": false // 启用种子增量更新-特性[IncreSeed] + // } + //} + ] + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/Configuration/Email.json b/Admin.NET/Admin.NET.Application/Configuration/Email.json new file mode 100644 index 0000000..bc53ba9 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Configuration/Email.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + + "Email": { + "Host": "smtp.163.com", // 主机 + "Port": 465, // 端口 465、994、25 + "EnableSsl": true, // 启用SSL + "DefaultFromEmail": "xxx@163.com", // 默认发件者邮箱 + "DefaultToEmail": "xxx@qq.com", // 默认接收人邮箱 + "UserName": "xxx@163.com", // 邮箱账号 + "Password": "", // 邮箱授权码 + "DefaultFromName": "Admin.NET 通用权限开发平台" // 默认邮件标题 + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/Configuration/Enum.json b/Admin.NET/Admin.NET.Application/Configuration/Enum.json new file mode 100644 index 0000000..dbcbbb1 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Configuration/Enum.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + + // 枚举实体所在程序集名称集合 + "Enum": { + "EntityAssemblyNames": [ "Admin.NET.Core", "Admin.NET.Application", "Admin.NET.AppCMS" ] + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/Configuration/EventBus.json b/Admin.NET/Admin.NET.Application/Configuration/EventBus.json new file mode 100644 index 0000000..520123e --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Configuration/EventBus.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + + "EventBus": { + "RabbitMQ": { + "UserName": "adminnet", + "Password": "adminnet++123456", + "HostName": "127.0.0.1", + "Port": 5672 + } + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/Configuration/JWT.json b/Admin.NET/Admin.NET.Application/Configuration/JWT.json new file mode 100644 index 0000000..40952e3 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Configuration/JWT.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + + "JWTSettings": { + "ValidateIssuerSigningKey": true, // 是否验证密钥,bool 类型,默认true + "IssuerSigningKey": "9k1cbc3f546eda35168c3aa3cb91780fbe703f0996c6d123ea96dc85c70bbc0a", // 密钥,string 类型,必须是复杂密钥,长度大于16 + "ValidateIssuer": true, // 是否验证签发方,bool 类型,默认true + "ValidIssuer": "YCYMEDUCENTER", // 签发方,string 类型 + "ValidateAudience": true, // 是否验证签收方,bool 类型,默认true + "ValidAudience": "YCYMEDUCLIENT", // 签收方,string 类型 + "ValidateLifetime": true, // 是否验证过期时间,bool 类型,默认true,建议true + //"ExpiredTime": 20, // 过期时间,long 类型,单位分钟,默认20分钟,最大支持 13 年 + "ClockSkew": 5, // 过期时间容错值,long 类型,单位秒,默认5秒 + "Algorithm": "HS256", // 加密算法,string 类型,默认 HS256 + "RequireExpirationTime": true // 验证过期时间,设置 false 将永不过期 + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/Configuration/Limit.json b/Admin.NET/Admin.NET.Application/Configuration/Limit.json new file mode 100644 index 0000000..9bce62c --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Configuration/Limit.json @@ -0,0 +1,121 @@ +{ + "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + + // IP限流配置 + "IpRateLimiting": { + // 例如:设置每分钟5次访问限流 + // 当False时:每个接口都加入计数,不管你访问哪个接口,只要在一分钟内累计够5次,将禁止访问。 + // 当True 时:当一分钟请求了5次GetData接口,则该接口将在时间段内禁止访问,但是还可以访问PostData()5次,总得来说是每个接口都有5次在这一分钟,互不干扰。 + "EnableEndpointRateLimiting": true, + // 如果StackBlockedRequests设置为false,拒绝的API调用不会添加到调用次数计数器上。比如:如果客户端每秒发出3个请求并且您设置了每秒一个调用的限制, + // 则每分钟或每天计数器等其他限制将仅记录第一个调用,即成功的API调用。如果您希望被拒绝的API调用计入其他时间的显示(分钟,小时等),则必须设置 + "StackBlockedRequests": false, + // 在RealIpHeader使用时,你的Kestrel服务器背后是一个反向代理,如果你的代理服务器使用不同的页眉然后提取客户端IP X-Real-IP使用此选项来设置它。 + "RealIpHeader": "X-Real-IP", + // 将ClientIdHeader被用于提取白名单的客户端ID。如果此标头中存在客户端ID并且与ClientWhitelist中指定的值匹配,则不应用速率限制。 + "ClientIdHeader": "X-ClientId", + // IP白名单:支持Ipv4和Ipv6 + "IpWhitelist": [], + // 端点白名单 + "EndpointWhitelist": [], + // 客户端白名单 + "ClientWhitelist": [], + "QuotaExceededResponse": { + "Content": "{{\"code\":429,\"type\":\"error\",\"message\":\"访问过于频繁,请稍后重试!\",\"result\":null,\"extras\":null}}", + "ContentType": "application/json", + "StatusCode": 429 + }, + // 返回状态码 + "HttpStatusCode": 429, + // API规则,结尾一定要带* + "GeneralRules": [ + // 1秒钟只能调用10次 + { + "Endpoint": "*", + "Period": "1s", + "Limit": 10 + }, + // 1分钟只能调用600次 + { + "Endpoint": "*", + "Period": "1m", + "Limit": 600 + }, + // 1小时只能调用3600 + { + "Endpoint": "*", + "Period": "1h", + "Limit": 3600 + }, + // 1天只能调用86400次 + { + "Endpoint": "*", + "Period": "1d", + "Limit": 86400 + } + ] + }, + "IpRateLimitPolicies": { + "IpRules": [ + { + "Ip": "XXX.XXX.XXX.XXX", + "Rules": [ + { + "Endpoint": "*", + "Period": "1s", + "Limit": 10 + }, + { + "Endpoint": "*", + "Period": "1m", + "Limit": 600 + } + ] + } + ] + }, + // 客户端限流配置 + "ClientRateLimiting": { + "EnableEndpointRateLimiting": true, + "ClientIdHeader": "X-ClientId", + "EndpointWhitelist": [], + "ClientWhitelist": [], + "QuotaExceededResponse": { + "Content": "{{\"code\":429,\"type\":\"error\",\"message\":\"访问人数过多,请稍后重试!\",\"result\":null,\"extras\":null}}", + "ContentType": "application/json", + "StatusCode": 429 + }, + "HttpStatusCode": 429, + "GeneralRules": [ + { + "Endpoint": "*", + "Period": "1s", + "Limit": 10 + }, + { + "Endpoint": "*", + "Period": "1m", + "Limit": 600 + } + ] + }, + "ClientRateLimitPolicies": { + "ClientRules": [ + { + "ClientId": "xxx-xxx", + "Rules": [ + { + "Endpoint": "*", + "Period": "1s", + "Limit": 10 + }, + { + "Endpoint": "*", + "Period": "1m", + "Limit": 600 + } + ] + } + ] + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/Configuration/Logging.json b/Admin.NET/Admin.NET.Application/Configuration/Logging.json new file mode 100644 index 0000000..5dee96c --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Configuration/Logging.json @@ -0,0 +1,47 @@ +{ + "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning", + "Microsoft.EntityFrameworkCore": "Information" + }, + "File": { + "Enabled": false, // 启用文件日志 + "FileName": "logs/{0:yyyyMMdd}_{1}.log", // 日志文件 + "Append": true, // 追加覆盖 + // "MinimumLevel": "Information", // 日志级别 + "FileSizeLimitBytes": 10485760, // 10M=10*1024*1024 + "MaxRollingFiles": 30 // 只保留30个文件 + }, + "Database": { + "Enabled": true, // 启用数据库日志 + "MinimumLevel": "Information" + }, + "ElasticSearch": { + "Enabled": false, // 启用ES日志 + "AuthType": "Basic", // ES认证类型,可选 Basic、ApiKey、Base64ApiKey + "User": "admin", // Basic认证的用户名,使用Basic认证类型时必填 + "Password": "123456", // Basic认证的密码,使用Basic认证类型时必填 + "ApiId": "", // 使用ApiKey认证类型时必填 + "ApiKey": "", // 使用ApiKey认证类型时必填 + "Base64ApiKey": "TmtrOEszNEJuQ0NyaWlydGtROFk6SG1RZ0w3YzBTc2lCanJTYlV3aXNzZw==", // 使用Base64ApiKey认证类型时必填 + "Fingerprint": "37:08:6A:C6:06:CC:9A:43:CF:ED:25:A2:1C:A4:69:57:90:31:2C:06:CA:61:56:39:6A:9C:46:11:BD:22:51:DA", // ES使用Https时的证书指纹 + "ServerUris": [ "http://192.168.1.100:9200" ], // 地址 + "DefaultIndex": "adminnet" // 索引 + }, + "Monitor": { + "GlobalEnabled": true, // 启用全局拦截日志 + "IncludeOfMethods": [], // 拦截特定方法,当GlobalEnabled=false有效 + "ExcludeOfMethods": [], // 排除特定方法,当GlobalEnabled=true有效 + "BahLogLevel": "Information", // Oops.Oh 和 Oops.Bah 业务日志输出级别 + "WithReturnValue": true, // 是否包含返回值,默认true + "ReturnValueThreshold": 500, // 返回值字符串阈值,默认0全量输出 + "JsonBehavior": "None", // 是否输出Json,默认None(OnlyJson、All) + "JsonIndented": false, // 是否格式化Json + "UseUtcTimestamp": false, // 时间格式UTC、LOCAL + "ConsoleLog": true // 是否显示控制台日志 + } + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/Configuration/OAuth.json b/Admin.NET/Admin.NET.Application/Configuration/OAuth.json new file mode 100644 index 0000000..c8f2ed6 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Configuration/OAuth.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + + "OAuth": { + "SSO": { + "ClientId": "ssoid", + "ClientSecret": "9k1cbc3f546eda35168c3aa3cb91780fbe703f0996c6d123ea96dc85c70bbc0a" + }, + "Weixin": { + "ClientId": "xxx", + "ClientSecret": "xxx" + }, + "Gitee": { + "ClientId": "xxx", + "ClientSecret": "xxx" + } + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/Configuration/SMS.json b/Admin.NET/Admin.NET.Application/Configuration/SMS.json new file mode 100644 index 0000000..f2a87b4 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Configuration/SMS.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + + "SMS": { + "Aliyun": { + "AccessKeyId": "", + "AccessKeySecret": "", + "SignName": "AdminNET平台", // 短信签名 + "TemplateCode": "" // 短信模板 + } + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/Configuration/Swagger.json b/Admin.NET/Admin.NET.Application/Configuration/Swagger.json new file mode 100644 index 0000000..b8179ca --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Configuration/Swagger.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + + "SpecificationDocumentSettings": { + "DocumentTitle": "Admin.NET 通用权限开发平台", + "GroupOpenApiInfos": [ + { + "Group": "Default", + "Title": "Admin.NET 通用权限开发平台", + "Description": "让 .NET 开发更简单、更通用、更流行。整合最新技术,模块插件式开发,前后端分离,开箱即用。", + "Version": "1.0.0", + "Order": 1000 + }, + { + "Group": "All Groups", + "Title": "所有接口", + "Description": "让 .NET 开发更简单、更通用、更流行。整合最新技术,模块插件式开发,前后端分离,开箱即用。", + "Version": "1.0.0", + "Order": 0 + } + ], + "DefaultGroupName": "Default", // 默认分组名 + "DocExpansionState": "List", // List、Full、None + "EnableAllGroups": true, + "LoginInfo": { + "Enabled": true, // 是否开启Swagger登录 + "CheckUrl": "/api/swagger/checkUrl", + "SubmitUrl": "/api/swagger/submitUrl" + }, + "EnumToNumber": true // 枚举类型生成值类型 + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/Configuration/Upload.json b/Admin.NET/Admin.NET.Application/Configuration/Upload.json new file mode 100644 index 0000000..6f0feb0 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Configuration/Upload.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + + "Upload": { + "Path": "Upload/{yyyy}/{MM}/{dd}", // 文件上传目录 + "MaxSize": 20480, // 文件最大限制KB:1024*20 + "ContentType": [ "application/json", "image/jpg", "image/png", "image/jpeg", "image/gif", "image/bmp", "text/plain", "application/pdf", "application/msword", "application/vnd.ms-excel", "application/vnd.ms-powerpoint", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "video/mp4" ], + "EnableMd5": false // 启用文件MDF5验证-防止重复上传 + }, + "OSSProvider": { + "IsEnable": true, + "Provider": "Aliyun", // OSS提供者 Invalid/Minio/Aliyun/QCloud/Qiniu/HuaweiCloud + "Endpoint": "oss-cn-shanghai.aliyuncs.com", // 节点/API地址(在腾讯云OSS中表示AppId) + "Region": "https://static-ycymedu-minpro.oss-cn-shanghai.aliyuncs.com", // 地域 + "AccessKey": "LTAI5tKs3TXSbt7E4WMDcxwR", + "SecretKey": "EvC8MjRaQC1kHubgU4MtecZnofOb0v", + "IsEnableHttps": true, // 是否启用HTTPS + "IsEnableCache": true, // 是否启用缓存 + "Bucket": "static-ycymedu-minpro" + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/Configuration/Wechat.json b/Admin.NET/Admin.NET.Application/Configuration/Wechat.json new file mode 100644 index 0000000..dc47c13 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Configuration/Wechat.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + + "Wechat": { + // 公众号 + "WechatAppId": "wxf8db44d5ec082dfc", + "WechatAppSecret": "9898bb082be3a517dabebb244b20182b", + "WechatToken": "", // 微信公众号服务器配置中的令牌(Token) + "WechatEncodingAESKey": "", // 微信公众号服务器配置中的消息加解密密钥(EncodingAESKey) + // 小程序 + "WxOpenAppId": "wx05e75004e657527c", + "WxOpenAppSecret": "9383aa5517e1d6bf23404dce9c86b0f1", + "WxToken": "", // 小程序消息推送中的令牌(Token) + "WxEncodingAESKey": "" // 小程序消息推送中的消息加解密密钥(EncodingAESKey) + }, + // 微信支付 + "WechatPay": { + "AppId": "wx05e75004e657527c", // 微信公众平台AppId、开放平台AppId、小程序AppId、企业微信CorpId + "MerchantId": "1614987630", // 商户平台的商户号 + "MerchantV3Secret": "brapuk6fon0wachiMlth2t3lb4a0h7ji", // 商户平台的APIv3密钥 + "MerchantCertificateSerialNumber": "1B304596B953D156B37863FF52FCAE40B458C9F2", // 商户平台的证书序列号 + "MerchantCertificatePrivateKey": "/wxpaycert/apiclient_key.pem" // 商户平台的API证书私钥(apiclient_key.pem文件内容) + }, + // 支付回调 + "PayCallBack": { + "WechatPayUrl": "https://api.v3.ycymedu.com/api/sysWechatPay/payCallBack", // 微信支付回调 + "WechatRefundUrl": "", // 微信退款回调 + "AlipayUrl": "", // 支付宝支付回调 + "AlipayRefundUrl": "" // 支付宝退款回调 + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/Configuration/sysregion.sql b/Admin.NET/Admin.NET.Application/Configuration/sysregion.sql new file mode 100644 index 0000000..60ba120 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Configuration/sysregion.sql @@ -0,0 +1,3750 @@ +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1, '100000', '中国', '0', '中国', 0, '', '', '中国', 116.36799621582031, 39.91510009765625, 'China'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2, '110000', '北京市', '100000', '北京', 1, '', '1', '中国,北京', 116.40499877929688, 39.904998779296875, 'Beijing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3, '110100', '北京市', '110000', '北京', 2, '010', '100000', '中国,北京,北京市', 116.40499877929688, 39.904998779296875, 'Beijing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (4, '110101', '东城区', '110100', '东城', 3, '010', '100010', '中国,北京,北京市,东城区', 116.41000366210938, 39.93159866333008, 'Dongcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (5, '110102', '西城区', '110100', '西城', 3, '010', '100032', '中国,北京,北京市,西城区', 116.36000061035156, 39.93050003051758, 'Xicheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (6, '110105', '朝阳区', '110100', '朝阳', 3, '010', '100020', '中国,北京,北京市,朝阳区', 116.48500061035156, 39.94839859008789, 'Chaoyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (7, '110106', '丰台区', '110100', '丰台', 3, '010', '100071', '中国,北京,北京市,丰台区', 116.28600311279297, 39.85850143432617, 'Fengtai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (8, '110107', '石景山区', '110100', '石景山', 3, '010', '100043', '中国,北京,北京市,石景山区', 116.2229995727539, 39.905601501464844, 'Shijingshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (9, '110108', '海淀区', '110100', '海淀', 3, '010', '100089', '中国,北京,北京市,海淀区', 116.2979965209961, 39.95930099487305, 'Haidian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (10, '110109', '门头沟区', '110100', '门头沟', 3, '010', '102300', '中国,北京,北京市,门头沟区', 116.10099792480469, 39.940399169921875, 'Mentougou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (11, '110111', '房山区', '110100', '房山', 3, '010', '102488', '中国,北京,北京市,房山区', 116.14299774169922, 39.74789810180664, 'Fangshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (12, '110112', '通州区', '110100', '通州', 3, '010', '101149', '中国,北京,北京市,通州区', 116.65699768066406, 39.909698486328125, 'Tongzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (13, '110113', '顺义区', '110100', '顺义', 3, '010', '101300', '中国,北京,北京市,顺义区', 116.65399932861328, 40.13019943237305, 'Shunyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (14, '110114', '昌平区', '110100', '昌平', 3, '010', '102200', '中国,北京,北京市,昌平区', 116.23100280761719, 40.220699310302734, 'Changping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (15, '110115', '大兴区', '110100', '大兴', 3, '010', '102600', '中国,北京,北京市,大兴区', 116.34100341796875, 39.72669982910156, 'Daxing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (16, '110116', '怀柔区', '110100', '怀柔', 3, '010', '101400', '中国,北京,北京市,怀柔区', 116.63200378417969, 40.316001892089844, 'Huairou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (17, '110117', '平谷区', '110100', '平谷', 3, '010', '101200', '中国,北京,北京市,平谷区', 117.12100219726562, 40.14059829711914, 'Pinggu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (18, '110228', '密云县', '110100', '密云', 3, '010', '101500', '中国,北京,北京市,密云县', 116.84300231933594, 40.37620162963867, 'Miyun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (19, '110229', '延庆县', '110100', '延庆', 3, '010', '102100', '中国,北京,北京市,延庆县', 115.9749984741211, 40.45669937133789, 'Yanqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (20, '120000', '天津市', '100000', '天津', 1, '', '1', '中国,天津', 117.19000244140625, 39.1255989074707, 'Tianjin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (21, '120100', '天津市', '120000', '天津', 2, '022', '300000', '中国,天津,天津市', 117.19000244140625, 39.1255989074707, 'Tianjin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (22, '120101', '和平区', '120100', '和平', 3, '022', '300041', '中国,天津,天津市,和平区', 117.21499633789062, 39.1171989440918, 'Heping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (23, '120102', '河东区', '120100', '河东', 3, '022', '300171', '中国,天津,天津市,河东区', 117.22599792480469, 39.123199462890625, 'Hedong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (24, '120103', '河西区', '120100', '河西', 3, '022', '300202', '中国,天津,天津市,河西区', 117.2229995727539, 39.10960006713867, 'Hexi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (25, '120104', '南开区', '120100', '南开', 3, '022', '300110', '中国,天津,天津市,南开区', 117.1510009765625, 39.13819885253906, 'Nankai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (26, '120105', '河北区', '120100', '河北', 3, '022', '300143', '中国,天津,天津市,河北区', 117.1969985961914, 39.14820098876953, 'Hebei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (27, '120106', '红桥区', '120100', '红桥', 3, '022', '300131', '中国,天津,天津市,红桥区', 117.1510009765625, 39.16709899902344, 'Hongqiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (28, '120110', '东丽区', '120100', '东丽', 3, '022', '300300', '中国,天津,天津市,东丽区', 117.31400299072266, 39.086299896240234, 'Dongli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (29, '120111', '西青区', '120100', '西青', 3, '022', '300380', '中国,天津,天津市,西青区', 117.00900268554688, 39.14120101928711, 'Xiqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (30, '120112', '津南区', '120100', '津南', 3, '022', '300350', '中国,天津,天津市,津南区', 117.38500213623047, 38.99140167236328, 'Jinnan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (31, '120113', '北辰区', '120100', '北辰', 3, '022', '300400', '中国,天津,天津市,北辰区', 117.13200378417969, 39.22129821777344, 'Beichen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (32, '120114', '武清区', '120100', '武清', 3, '022', '301700', '中国,天津,天津市,武清区', 117.04399871826172, 39.38420104980469, 'Wuqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (33, '120115', '宝坻区', '120100', '宝坻', 3, '022', '301800', '中国,天津,天津市,宝坻区', 117.30999755859375, 39.71760177612305, 'Baodi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (34, '120116', '滨海新区', '120100', '滨海新区', 3, '022', '300451', '中国,天津,天津市,滨海新区', 117.7020034790039, 39.02669906616211, 'Binhaixinqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (35, '120221', '宁河县', '120100', '宁河', 3, '022', '301500', '中国,天津,天津市,宁河县', 117.82599639892578, 39.330501556396484, 'Ninghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (36, '120223', '静海县', '120100', '静海', 3, '022', '301600', '中国,天津,天津市,静海县', 116.9739990234375, 38.94580078125, 'Jinghai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (37, '120225', '蓟县', '120100', '蓟县', 3, '022', '301900', '中国,天津,天津市,蓟县', 117.40799713134766, 40.04570007324219, 'Jixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (38, '130000', '河北省', '100000', '河北', 1, '', '1', '中国,河北省', 114.50199890136719, 38.045501708984375, 'Hebei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (39, '130100', '石家庄市', '130000', '石家庄', 2, '0311', '050011', '中国,河北省,石家庄市', 114.50199890136719, 38.045501708984375, 'Shijiazhuang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (40, '130102', '长安区', '130100', '长安', 3, '0311', '050011', '中国,河北省,石家庄市,长安区', 114.53900146484375, 38.03670120239258, 'Chang\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (41, '130104', '桥西区', '130100', '桥西', 3, '0311', '050091', '中国,河北省,石家庄市,桥西区', 114.47000122070312, 38.03219985961914, 'Qiaoxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (42, '130105', '新华区', '130100', '新华', 3, '0311', '050051', '中国,河北省,石家庄市,新华区', 114.46299743652344, 38.050899505615234, 'Xinhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (43, '130107', '井陉矿区', '130100', '井陉矿区', 3, '0311', '050100', '中国,河北省,石家庄市,井陉矿区', 114.06500244140625, 38.067100524902344, 'Jingxingkuangqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (44, '130108', '裕华区', '130100', '裕华', 3, '0311', '050031', '中国,河北省,石家庄市,裕华区', 114.53099822998047, 38.00600051879883, 'Yuhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (45, '130109', '藁城区', '130100', '藁城', 3, '0311', '052160', '中国,河北省,石家庄市,藁城区', 114.84700012207031, 38.02159881591797, 'Gaocheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (46, '130110', '鹿泉区', '130100', '鹿泉', 3, '0311', '050200', '中国,河北省,石家庄市,鹿泉区', 114.31300354003906, 38.087799072265625, 'Luquan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (47, '130111', '栾城区', '130100', '栾城', 3, '0311', '051430', '中国,河北省,石家庄市,栾城区', 114.64800262451172, 37.90019989013672, 'Luancheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (48, '130121', '井陉县', '130100', '井陉', 3, '0311', '050300', '中国,河北省,石家庄市,井陉县', 114.14299774169922, 38.03689956665039, 'Jingxing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (49, '130123', '正定县', '130100', '正定', 3, '0311', '050800', '中国,河北省,石家庄市,正定县', 114.572998046875, 38.144500732421875, 'Zhengding'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (50, '130125', '行唐县', '130100', '行唐', 3, '0311', '050600', '中国,河北省,石家庄市,行唐县', 114.5530014038086, 38.436500549316406, 'Xingtang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (51, '130126', '灵寿县', '130100', '灵寿', 3, '0311', '050500', '中国,河北省,石家庄市,灵寿县', 114.38300323486328, 38.30839920043945, 'Lingshou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (52, '130127', '高邑县', '130100', '高邑', 3, '0311', '051330', '中国,河北省,石家庄市,高邑县', 114.61100006103516, 37.6156005859375, 'Gaoyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (53, '130128', '深泽县', '130100', '深泽', 3, '0311', '052560', '中国,河北省,石家庄市,深泽县', 115.2040023803711, 38.18349838256836, 'Shenze'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (54, '130129', '赞皇县', '130100', '赞皇', 3, '0311', '051230', '中国,河北省,石家庄市,赞皇县', 114.38800048828125, 37.661399841308594, 'Zanhuang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (55, '130130', '无极县', '130100', '无极', 3, '0311', '052460', '中国,河北省,石家庄市,无极县', 114.9749984741211, 38.17649841308594, 'Wuji'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (56, '130131', '平山县', '130100', '平山', 3, '0311', '050400', '中国,河北省,石家庄市,平山县', 114.18599700927734, 38.2598991394043, 'Pingshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (57, '130132', '元氏县', '130100', '元氏', 3, '0311', '051130', '中国,河北省,石家庄市,元氏县', 114.5250015258789, 37.766700744628906, 'Yuanshi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (58, '130133', '赵县', '130100', '赵县', 3, '0311', '051530', '中国,河北省,石家庄市,赵县', 114.7760009765625, 37.75630187988281, 'Zhaoxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (59, '130181', '辛集市', '130100', '辛集', 3, '0311', '052360', '中国,河北省,石家庄市,辛集市', 115.20600128173828, 37.940799713134766, 'Xinji'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (60, '130183', '晋州市', '130100', '晋州', 3, '0311', '052260', '中国,河北省,石家庄市,晋州市', 115.04299926757812, 38.03129959106445, 'Jinzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (61, '130184', '新乐市', '130100', '新乐', 3, '0311', '050700', '中国,河北省,石家庄市,新乐市', 114.69000244140625, 38.344200134277344, 'Xinle'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (62, '130200', '唐山市', '130000', '唐山', 2, '0315', '063000', '中国,河北省,唐山市', 118.17500305175781, 39.635101318359375, 'Tangshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (63, '130202', '路南区', '130200', '路南', 3, '0315', '063000', '中国,河北省,唐山市,路南区', 118.15399932861328, 39.625, 'Lunan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (64, '130203', '路北区', '130200', '路北', 3, '0315', '063000', '中国,河北省,唐山市,路北区', 118.20099639892578, 39.6244010925293, 'Lubei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (65, '130204', '古冶区', '130200', '古冶', 3, '0315', '063100', '中国,河北省,唐山市,古冶区', 118.45800018310547, 39.71989822387695, 'Guye'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (66, '130205', '开平区', '130200', '开平', 3, '0315', '063021', '中国,河北省,唐山市,开平区', 118.26200103759766, 39.67129898071289, 'Kaiping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (67, '130207', '丰南区', '130200', '丰南', 3, '0315', '063300', '中国,河北省,唐山市,丰南区', 118.11299896240234, 39.56480026245117, 'Fengnan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (68, '130208', '丰润区', '130200', '丰润', 3, '0315', '064000', '中国,河北省,唐山市,丰润区', 118.12999725341797, 39.82440185546875, 'Fengrun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (69, '130209', '曹妃甸区', '130200', '曹妃甸', 3, '0315', '063200', '中国,河北省,唐山市,曹妃甸区', 118.45999908447266, 39.273101806640625, 'Caofeidian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (70, '130223', '滦县', '130200', '滦县', 3, '0315', '063700', '中国,河北省,唐山市,滦县', 118.7030029296875, 39.7406005859375, 'Luanxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (71, '130224', '滦南县', '130200', '滦南', 3, '0315', '063500', '中国,河北省,唐山市,滦南县', 118.67400360107422, 39.50389862060547, 'Luannan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (72, '130225', '乐亭县', '130200', '乐亭', 3, '0315', '063600', '中国,河北省,唐山市,乐亭县', 118.91200256347656, 39.42559814453125, 'Laoting'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (73, '130227', '迁西县', '130200', '迁西', 3, '0315', '064300', '中国,河北省,唐山市,迁西县', 118.31600189208984, 40.14590072631836, 'Qianxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (74, '130229', '玉田县', '130200', '玉田', 3, '0315', '064100', '中国,河北省,唐山市,玉田县', 117.73899841308594, 39.9005012512207, 'Yutian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (75, '130281', '遵化市', '130200', '遵化', 3, '0315', '064200', '中国,河北省,唐山市,遵化市', 117.96399688720703, 40.187400817871094, 'Zunhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (76, '130283', '迁安市', '130200', '迁安', 3, '0315', '064400', '中国,河北省,唐山市,迁安市', 118.70099639892578, 39.99829864501953, 'Qian\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (77, '130300', '秦皇岛市', '130000', '秦皇岛', 2, '0335', '066000', '中国,河北省,秦皇岛市', 119.58699798583984, 39.942501068115234, 'Qinhuangdao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (78, '130302', '海港区', '130300', '海港', 3, '0335', '066000', '中国,河北省,秦皇岛市,海港区', 119.61000061035156, 39.93450164794922, 'Haigang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (79, '130303', '山海关区', '130300', '山海关', 3, '0335', '066200', '中国,河北省,秦皇岛市,山海关区', 119.7760009765625, 39.97869873046875, 'Shanhaiguan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (80, '130304', '北戴河区', '130300', '北戴河', 3, '0335', '066100', '中国,河北省,秦皇岛市,北戴河区', 119.48400115966797, 39.83409881591797, 'Beidaihe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (81, '130321', '青龙满族自治县', '130300', '青龙', 3, '0335', '066500', '中国,河北省,秦皇岛市,青龙满族自治县', 118.9520034790039, 40.40739822387695, 'Qinglong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (82, '130322', '昌黎县', '130300', '昌黎', 3, '0335', '066600', '中国,河北省,秦皇岛市,昌黎县', 119.16600036621094, 39.70880126953125, 'Changli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (83, '130323', '抚宁县', '130300', '抚宁', 3, '0335', '066300', '中国,河北省,秦皇岛市,抚宁县', 119.24500274658203, 39.87540054321289, 'Funing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (84, '130324', '卢龙县', '130300', '卢龙', 3, '0335', '066400', '中国,河北省,秦皇岛市,卢龙县', 118.89299774169922, 39.89179992675781, 'Lulong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (85, '130400', '邯郸市', '130000', '邯郸', 2, '0310', '056002', '中国,河北省,邯郸市', 114.49099731445312, 36.612300872802734, 'Handan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (86, '130402', '邯山区', '130400', '邯山', 3, '0310', '056001', '中国,河北省,邯郸市,邯山区', 114.48400115966797, 36.600101470947266, 'Hanshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (87, '130403', '丛台区', '130400', '丛台', 3, '0310', '056002', '中国,河北省,邯郸市,丛台区', 114.49299621582031, 36.618499755859375, 'Congtai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (88, '130404', '复兴区', '130400', '复兴', 3, '0310', '056003', '中国,河北省,邯郸市,复兴区', 114.45899963378906, 36.61130142211914, 'Fuxing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (89, '130406', '峰峰矿区', '130400', '峰峰矿区', 3, '0310', '056200', '中国,河北省,邯郸市,峰峰矿区', 114.21099853515625, 36.41939926147461, 'Fengfengkuangqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (90, '130421', '邯郸县', '130400', '邯郸', 3, '0310', '056101', '中国,河北省,邯郸市,邯郸县', 114.53099822998047, 36.59379959106445, 'Handan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (91, '130423', '临漳县', '130400', '临漳', 3, '0310', '056600', '中国,河北省,邯郸市,临漳县', 114.61900329589844, 36.334598541259766, 'Linzhang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (92, '130424', '成安县', '130400', '成安', 3, '0310', '056700', '中国,河北省,邯郸市,成安县', 114.66999816894531, 36.44409942626953, 'Cheng\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (93, '130425', '大名县', '130400', '大名', 3, '0310', '056900', '中国,河北省,邯郸市,大名县', 115.15399932861328, 36.27989959716797, 'Daming'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (94, '130426', '涉县', '130400', '涉县', 3, '0310', '056400', '中国,河北省,邯郸市,涉县', 113.69200134277344, 36.5806999206543, 'Shexian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (95, '130427', '磁县', '130400', '磁县', 3, '0310', '056500', '中国,河北省,邯郸市,磁县', 114.3740005493164, 36.3739013671875, 'Cixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (96, '130428', '肥乡县', '130400', '肥乡', 3, '0310', '057550', '中国,河北省,邯郸市,肥乡县', 114.80000305175781, 36.548099517822266, 'Feixiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (97, '130429', '永年县', '130400', '永年', 3, '0310', '057150', '中国,河北省,邯郸市,永年县', 114.48899841308594, 36.783599853515625, 'Yongnian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (98, '130430', '邱县', '130400', '邱县', 3, '0310', '057450', '中国,河北省,邯郸市,邱县', 115.17400360107422, 36.82080078125, 'Qiuxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (99, '130431', '鸡泽县', '130400', '鸡泽', 3, '0310', '057350', '中国,河北省,邯郸市,鸡泽县', 114.8740005493164, 36.92369842529297, 'Jize'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (100, '130432', '广平县', '130400', '广平', 3, '0310', '057650', '中国,河北省,邯郸市,广平县', 114.9469985961914, 36.480499267578125, 'Guangping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (101, '130433', '馆陶县', '130400', '馆陶', 3, '0310', '057750', '中国,河北省,邯郸市,馆陶县', 115.29900360107422, 36.537200927734375, 'Guantao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (102, '130434', '魏县', '130400', '魏县', 3, '0310', '056800', '中国,河北省,邯郸市,魏县', 114.93499755859375, 36.361698150634766, 'Weixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (103, '130435', '曲周县', '130400', '曲周', 3, '0310', '057250', '中国,河北省,邯郸市,曲周县', 114.9520034790039, 36.77669906616211, 'Quzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (104, '130481', '武安市', '130400', '武安', 3, '0310', '056300', '中国,河北省,邯郸市,武安市', 114.2020034790039, 36.69279861450195, 'Wu\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (105, '130500', '邢台市', '130000', '邢台', 2, '0319', '054001', '中国,河北省,邢台市', 114.50900268554688, 37.068199157714844, 'Xingtai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (106, '130502', '桥东区', '130500', '桥东', 3, '0319', '054001', '中国,河北省,邢台市,桥东区', 114.50700378417969, 37.06800079345703, 'Qiaodong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (107, '130503', '桥西区', '130500', '桥西', 3, '0319', '054000', '中国,河北省,邢台市,桥西区', 114.46800231933594, 37.05979919433594, 'Qiaoxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (108, '130521', '邢台县', '130500', '邢台', 3, '0319', '054001', '中国,河北省,邢台市,邢台县', 114.56600189208984, 37.04560089111328, 'Xingtai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (109, '130522', '临城县', '130500', '临城', 3, '0319', '054300', '中国,河北省,邢台市,临城县', 114.50399780273438, 37.43980026245117, 'Lincheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (110, '130523', '内丘县', '130500', '内丘', 3, '0319', '054200', '中国,河北省,邢台市,内丘县', 114.51200103759766, 37.28670120239258, 'Neiqiu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (111, '130524', '柏乡县', '130500', '柏乡', 3, '0319', '055450', '中国,河北省,邢台市,柏乡县', 114.69300079345703, 37.482398986816406, 'Baixiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (112, '130525', '隆尧县', '130500', '隆尧', 3, '0319', '055350', '中国,河北省,邢台市,隆尧县', 114.7760009765625, 37.35350036621094, 'Longyao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (113, '130526', '任县', '130500', '任县', 3, '0319', '055150', '中国,河北省,邢台市,任县', 114.68399810791016, 37.12580108642578, 'Renxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (114, '130527', '南和县', '130500', '南和', 3, '0319', '054400', '中国,河北省,邢台市,南和县', 114.68399810791016, 37.00490188598633, 'Nanhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (115, '130528', '宁晋县', '130500', '宁晋', 3, '0319', '055550', '中国,河北省,邢台市,宁晋县', 114.9209976196289, 37.617000579833984, 'Ningjin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (116, '130529', '巨鹿县', '130500', '巨鹿', 3, '0319', '055250', '中国,河北省,邢台市,巨鹿县', 115.03500366210938, 37.21799850463867, 'Julu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (117, '130530', '新河县', '130500', '新河', 3, '0319', '055650', '中国,河北省,邢台市,新河县', 115.25, 37.527198791503906, 'Xinhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (118, '130531', '广宗县', '130500', '广宗', 3, '0319', '054600', '中国,河北省,邢台市,广宗县', 115.14299774169922, 37.07460021972656, 'Guangzong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (119, '130532', '平乡县', '130500', '平乡', 3, '0319', '054500', '中国,河北省,邢台市,平乡县', 115.02999877929688, 37.063201904296875, 'Pingxiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (120, '130533', '威县', '130500', '威县', 3, '0319', '054700', '中国,河北省,邢台市,威县', 115.26399993896484, 36.97679901123047, 'Weixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (121, '130534', '清河县', '130500', '清河', 3, '0319', '054800', '中国,河北省,邢台市,清河县', 115.66500091552734, 37.07120132446289, 'Qinghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (122, '130535', '临西县', '130500', '临西', 3, '0319', '054900', '中国,河北省,邢台市,临西县', 115.5009994506836, 36.87080001831055, 'Linxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (123, '130581', '南宫市', '130500', '南宫', 3, '0319', '055750', '中国,河北省,邢台市,南宫市', 115.39099884033203, 37.358001708984375, 'Nangong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (124, '130582', '沙河市', '130500', '沙河', 3, '0319', '054100', '中国,河北省,邢台市,沙河市', 114.49800109863281, 36.85770034790039, 'Shahe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (125, '130600', '保定市', '130000', '保定', 2, '0312', '071052', '中国,河北省,保定市', 115.48200225830078, 38.867698669433594, 'Baoding'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (126, '130602', '新市区', '130600', '新市', 3, '0312', '071051', '中国,河北省,保定市,新市区', 115.45899963378906, 38.877498626708984, 'Xinshi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (127, '130603', '北市区', '130600', '北市', 3, '0312', '071000', '中国,河北省,保定市,北市区', 115.49700164794922, 38.883201599121094, 'Beishi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (128, '130604', '南市区', '130600', '南市', 3, '0312', '071001', '中国,河北省,保定市,南市区', 115.52899932861328, 38.85449981689453, 'Nanshi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (129, '130621', '满城县', '130600', '满城', 3, '0312', '072150', '中国,河北省,保定市,满城县', 115.322998046875, 38.94969940185547, 'Mancheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (130, '130622', '清苑县', '130600', '清苑', 3, '0312', '071100', '中国,河北省,保定市,清苑县', 115.49299621582031, 38.7671012878418, 'Qingyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (131, '130623', '涞水县', '130600', '涞水', 3, '0312', '074100', '中国,河北省,保定市,涞水县', 115.71499633789062, 39.39400100708008, 'Laishui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (132, '130624', '阜平县', '130600', '阜平', 3, '0312', '073200', '中国,河北省,保定市,阜平县', 114.1969985961914, 38.847599029541016, 'Fuping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (133, '130625', '徐水县', '130600', '徐水', 3, '0312', '072550', '中国,河北省,保定市,徐水县', 115.65799713134766, 39.020999908447266, 'Xushui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (134, '130626', '定兴县', '130600', '定兴', 3, '0312', '072650', '中国,河北省,保定市,定兴县', 115.80799865722656, 39.263099670410156, 'Dingxing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (135, '130627', '唐县', '130600', '唐县', 3, '0312', '072350', '中国,河北省,保定市,唐县', 114.98500061035156, 38.74509811401367, 'Tangxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (136, '130628', '高阳县', '130600', '高阳', 3, '0312', '071500', '中国,河北省,保定市,高阳县', 115.77899932861328, 38.70000076293945, 'Gaoyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (137, '130629', '容城县', '130600', '容城', 3, '0312', '071700', '中国,河北省,保定市,容城县', 115.87200164794922, 39.05350112915039, 'Rongcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (138, '130630', '涞源县', '130600', '涞源', 3, '0312', '074300', '中国,河北省,保定市,涞源县', 114.69100189208984, 39.35390090942383, 'Laiyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (139, '130631', '望都县', '130600', '望都', 3, '0312', '072450', '中国,河北省,保定市,望都县', 115.15699768066406, 38.709999084472656, 'Wangdu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (140, '130632', '安新县', '130600', '安新', 3, '0312', '071600', '中国,河北省,保定市,安新县', 115.93599700927734, 38.935298919677734, 'Anxin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (141, '130633', '易县', '130600', '易县', 3, '0312', '074200', '中国,河北省,保定市,易县', 115.49800109863281, 39.348899841308594, 'Yixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (142, '130634', '曲阳县', '130600', '曲阳', 3, '0312', '073100', '中国,河北省,保定市,曲阳县', 114.70099639892578, 38.621498107910156, 'Quyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (143, '130635', '蠡县', '130600', '蠡县', 3, '0312', '071400', '中国,河北省,保定市,蠡县', 115.5770034790039, 38.48970031738281, 'Lixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (144, '130636', '顺平县', '130600', '顺平', 3, '0312', '072250', '中国,河北省,保定市,顺平县', 115.13500213623047, 38.8385009765625, 'Shunping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (145, '130637', '博野县', '130600', '博野', 3, '0312', '071300', '中国,河北省,保定市,博野县', 115.47000122070312, 38.45640182495117, 'Boye'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (146, '130638', '雄县', '130600', '雄县', 3, '0312', '071800', '中国,河北省,保定市,雄县', 116.10900115966797, 38.99440002441406, 'Xiongxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (147, '130681', '涿州市', '130600', '涿州', 3, '0312', '072750', '中国,河北省,保定市,涿州市', 115.98100280761719, 39.48619842529297, 'Zhuozhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (148, '130682', '定州市', '130600', '定州', 3, '0312', '073000', '中国,河北省,保定市,定州市', 114.98999786376953, 38.51620101928711, 'Dingzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (149, '130683', '安国市', '130600', '安国', 3, '0312', '071200', '中国,河北省,保定市,安国市', 115.322998046875, 38.41389846801758, 'Anguo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (150, '130684', '高碑店市', '130600', '高碑店', 3, '0312', '074000', '中国,河北省,保定市,高碑店市', 115.8740005493164, 39.326499938964844, 'Gaobeidian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (151, '130700', '张家口市', '130000', '张家口', 2, '0313', '075000', '中国,河北省,张家口市', 114.88400268554688, 40.8119010925293, 'Zhangjiakou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (152, '130702', '桥东区', '130700', '桥东', 3, '0313', '075000', '中国,河北省,张家口市,桥东区', 114.89399719238281, 40.78839874267578, 'Qiaodong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (153, '130703', '桥西区', '130700', '桥西', 3, '0313', '075061', '中国,河北省,张家口市,桥西区', 114.87000274658203, 40.81949996948242, 'Qiaoxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (154, '130705', '宣化区', '130700', '宣化', 3, '0313', '075100', '中国,河北省,张家口市,宣化区', 115.06500244140625, 40.60960006713867, 'Xuanhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (155, '130706', '下花园区', '130700', '下花园', 3, '0313', '075300', '中国,河北省,张家口市,下花园区', 115.28700256347656, 40.50239944458008, 'Xiahuayuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (156, '130721', '宣化县', '130700', '宣化', 3, '0313', '075100', '中国,河北省,张家口市,宣化县', 115.15499877929688, 40.566200256347656, 'Xuanhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (157, '130722', '张北县', '130700', '张北', 3, '0313', '076450', '中国,河北省,张家口市,张北县', 114.71399688720703, 41.1598014831543, 'Zhangbei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (158, '130723', '康保县', '130700', '康保', 3, '0313', '076650', '中国,河北省,张家口市,康保县', 114.5999984741211, 41.85219955444336, 'Kangbao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (159, '130724', '沽源县', '130700', '沽源', 3, '0313', '076550', '中国,河北省,张家口市,沽源县', 115.68900299072266, 41.66960144042969, 'Guyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (160, '130725', '尚义县', '130700', '尚义', 3, '0313', '076750', '中国,河北省,张家口市,尚义县', 113.97100067138672, 41.07780075073242, 'Shangyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (161, '130726', '蔚县', '130700', '蔚县', 3, '0313', '075700', '中国,河北省,张家口市,蔚县', 114.58899688720703, 39.8406982421875, 'Yuxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (162, '130727', '阳原县', '130700', '阳原', 3, '0313', '075800', '中国,河北省,张家口市,阳原县', 114.1510009765625, 40.103599548339844, 'Yangyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (163, '130728', '怀安县', '130700', '怀安', 3, '0313', '076150', '中国,河北省,张家口市,怀安县', 114.38600158691406, 40.67430114746094, 'Huai\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (164, '130729', '万全县', '130700', '万全', 3, '0313', '076250', '中国,河北省,张家口市,万全县', 114.74099731445312, 40.76689910888672, 'Wanquan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (165, '130730', '怀来县', '130700', '怀来', 3, '0313', '075400', '中国,河北省,张家口市,怀来县', 115.51799774169922, 40.415401458740234, 'Huailai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (166, '130731', '涿鹿县', '130700', '涿鹿', 3, '0313', '075600', '中国,河北省,张家口市,涿鹿县', 115.2239990234375, 40.376399993896484, 'Zhuolu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (167, '130732', '赤城县', '130700', '赤城', 3, '0313', '075500', '中国,河北省,张家口市,赤城县', 115.83200073242188, 40.914398193359375, 'Chicheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (168, '130733', '崇礼县', '130700', '崇礼', 3, '0313', '076350', '中国,河北省,张家口市,崇礼县', 115.27999877929688, 40.97520065307617, 'Chongli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (169, '130800', '承德市', '130000', '承德', 2, '0314', '067000', '中国,河北省,承德市', 117.93900299072266, 40.976200103759766, 'Chengde'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (170, '130802', '双桥区', '130800', '双桥', 3, '0314', '067000', '中国,河北省,承德市,双桥区', 117.94300079345703, 40.974700927734375, 'Shuangqiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (171, '130803', '双滦区', '130800', '双滦', 3, '0314', '067001', '中国,河北省,承德市,双滦区', 117.74500274658203, 40.953800201416016, 'Shuangluan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (172, '130804', '鹰手营子矿区', '130800', '鹰手营子矿区', 3, '0314', '067200', '中国,河北省,承德市,鹰手营子矿区', 117.66000366210938, 40.547401428222656, 'Yingshouyingzikuangqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (173, '130821', '承德县', '130800', '承德', 3, '0314', '067400', '中国,河北省,承德市,承德县', 118.1760025024414, 40.769901275634766, 'Chengde'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (174, '130822', '兴隆县', '130800', '兴隆', 3, '0314', '067300', '中国,河北省,承德市,兴隆县', 117.5009994506836, 40.41709899902344, 'Xinglong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (175, '130823', '平泉县', '130800', '平泉', 3, '0314', '067500', '中国,河北省,承德市,平泉县', 118.7020034790039, 41.01839828491211, 'Pingquan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (176, '130824', '滦平县', '130800', '滦平', 3, '0314', '068250', '中国,河北省,承德市,滦平县', 117.33300018310547, 40.94150161743164, 'Luanping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (177, '130825', '隆化县', '130800', '隆化', 3, '0314', '068150', '中国,河北省,承德市,隆化县', 117.7300033569336, 41.3140983581543, 'Longhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (178, '130826', '丰宁满族自治县', '130800', '丰宁', 3, '0314', '068350', '中国,河北省,承德市,丰宁满族自治县', 116.64900207519531, 41.20479965209961, 'Fengning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (179, '130827', '宽城满族自治县', '130800', '宽城', 3, '0314', '067600', '中国,河北省,承德市,宽城满族自治县', 118.49199676513672, 40.608299255371094, 'Kuancheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (180, '130828', '围场满族蒙古族自治县', '130800', '围场', 3, '0314', '068450', '中国,河北省,承德市,围场满族蒙古族自治县', 117.76000213623047, 41.94369888305664, 'Weichang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (181, '130900', '沧州市', '130000', '沧州', 2, '0317', '061001', '中国,河北省,沧州市', 116.85700225830078, 38.31060028076172, 'Cangzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (182, '130902', '新华区', '130900', '新华', 3, '0317', '061000', '中国,河北省,沧州市,新华区', 116.86599731445312, 38.31439971923828, 'Xinhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (183, '130903', '运河区', '130900', '运河', 3, '0317', '061001', '中国,河北省,沧州市,运河区', 116.85700225830078, 38.313499450683594, 'Yunhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (184, '130921', '沧县', '130900', '沧县', 3, '0317', '061000', '中国,河北省,沧州市,沧县', 116.87799835205078, 38.29359817504883, 'Cangxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (185, '130922', '青县', '130900', '青县', 3, '0317', '062650', '中国,河北省,沧州市,青县', 116.8030014038086, 38.583499908447266, 'Qingxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (186, '130923', '东光县', '130900', '东光', 3, '0317', '061600', '中国,河北省,沧州市,东光县', 116.53700256347656, 37.88570022583008, 'Dongguang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (187, '130924', '海兴县', '130900', '海兴', 3, '0317', '061200', '中国,河北省,沧州市,海兴县', 117.49800109863281, 38.13959884643555, 'Haixing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (188, '130925', '盐山县', '130900', '盐山', 3, '0317', '061300', '中国,河北省,沧州市,盐山县', 117.23100280761719, 38.05649948120117, 'Yanshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (189, '130926', '肃宁县', '130900', '肃宁', 3, '0317', '062350', '中国,河北省,沧州市,肃宁县', 115.83000183105469, 38.422698974609375, 'Suning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (190, '130927', '南皮县', '130900', '南皮', 3, '0317', '061500', '中国,河北省,沧州市,南皮县', 116.7020034790039, 38.041099548339844, 'Nanpi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (191, '130928', '吴桥县', '130900', '吴桥', 3, '0317', '061800', '中国,河北省,沧州市,吴桥县', 116.38500213623047, 37.6254997253418, 'Wuqiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (192, '130929', '献县', '130900', '献县', 3, '0317', '062250', '中国,河北省,沧州市,献县', 116.12699890136719, 38.192298889160156, 'Xianxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (193, '130930', '孟村回族自治县', '130900', '孟村', 3, '0317', '061400', '中国,河北省,沧州市,孟村回族自治县', 117.10399627685547, 38.05339813232422, 'Mengcun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (194, '130981', '泊头市', '130900', '泊头', 3, '0317', '062150', '中国,河北省,沧州市,泊头市', 116.5780029296875, 38.08359909057617, 'Botou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (195, '130982', '任丘市', '130900', '任丘', 3, '0317', '062550', '中国,河北省,沧州市,任丘市', 116.10299682617188, 38.71120071411133, 'Renqiu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (196, '130983', '黄骅市', '130900', '黄骅', 3, '0317', '061100', '中国,河北省,沧州市,黄骅市', 117.33899688720703, 38.370601654052734, 'Huanghua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (197, '130984', '河间市', '130900', '河间', 3, '0317', '062450', '中国,河北省,沧州市,河间市', 116.0989990234375, 38.445499420166016, 'Hejian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (198, '131000', '廊坊市', '130000', '廊坊', 2, '0316', '065000', '中国,河北省,廊坊市', 116.71399688720703, 39.52920150756836, 'Langfang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (199, '131002', '安次区', '131000', '安次', 3, '0316', '065000', '中国,河北省,廊坊市,安次区', 116.7030029296875, 39.520599365234375, 'Anci'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (200, '131003', '广阳区', '131000', '广阳', 3, '0316', '065000', '中国,河北省,廊坊市,广阳区', 116.71099853515625, 39.52280044555664, 'Guangyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (201, '131022', '固安县', '131000', '固安', 3, '0316', '065500', '中国,河北省,廊坊市,固安县', 116.29900360107422, 39.43830108642578, 'Gu\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (202, '131023', '永清县', '131000', '永清', 3, '0316', '065600', '中国,河北省,廊坊市,永清县', 116.5009994506836, 39.320701599121094, 'Yongqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (203, '131024', '香河县', '131000', '香河', 3, '0316', '065400', '中国,河北省,廊坊市,香河县', 117.00599670410156, 39.76129913330078, 'Xianghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (204, '131025', '大城县', '131000', '大城', 3, '0316', '065900', '中国,河北省,廊坊市,大城县', 116.65399932861328, 38.705299377441406, 'Daicheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (205, '131026', '文安县', '131000', '文安', 3, '0316', '065800', '中国,河北省,廊坊市,文安县', 116.45800018310547, 38.873199462890625, 'Wen\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (206, '131028', '大厂回族自治县', '131000', '大厂', 3, '0316', '065300', '中国,河北省,廊坊市,大厂回族自治县', 116.98899841308594, 39.88650131225586, 'Dachang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (207, '131081', '霸州市', '131000', '霸州', 3, '0316', '065700', '中国,河北省,廊坊市,霸州市', 116.39199829101562, 39.125701904296875, 'Bazhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (208, '131082', '三河市', '131000', '三河', 3, '0316', '065200', '中国,河北省,廊坊市,三河市', 117.0719985961914, 39.98360061645508, 'Sanhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (209, '131100', '衡水市', '130000', '衡水', 2, '0318', '053000', '中国,河北省,衡水市', 115.66600036621094, 37.73509979248047, 'Hengshui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (210, '131102', '桃城区', '131100', '桃城', 3, '0318', '053000', '中国,河北省,衡水市,桃城区', 115.67500305175781, 37.73500061035156, 'Taocheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (211, '131121', '枣强县', '131100', '枣强', 3, '0318', '053100', '中国,河北省,衡水市,枣强县', 115.72599792480469, 37.51029968261719, 'Zaoqiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (212, '131122', '武邑县', '131100', '武邑', 3, '0318', '053400', '中国,河北省,衡水市,武邑县', 115.88700103759766, 37.80179977416992, 'Wuyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (213, '131123', '武强县', '131100', '武强', 3, '0318', '053300', '中国,河北省,衡水市,武强县', 115.98200225830078, 38.04140090942383, 'Wuqiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (214, '131124', '饶阳县', '131100', '饶阳', 3, '0318', '053900', '中国,河北省,衡水市,饶阳县', 115.72599792480469, 38.23529815673828, 'Raoyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (215, '131125', '安平县', '131100', '安平', 3, '0318', '053600', '中国,河北省,衡水市,安平县', 115.51899719238281, 38.2338981628418, 'Anping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (216, '131126', '故城县', '131100', '故城', 3, '0318', '053800', '中国,河北省,衡水市,故城县', 115.97100067138672, 37.34769821166992, 'Gucheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (217, '131127', '景县', '131100', '景县', 3, '0318', '053500', '中国,河北省,衡水市,景县', 116.26899719238281, 37.69260025024414, 'Jingxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (218, '131128', '阜城县', '131100', '阜城', 3, '0318', '053700', '中国,河北省,衡水市,阜城县', 116.14399719238281, 37.86880111694336, 'Fucheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (219, '131181', '冀州市', '131100', '冀州', 3, '0318', '053200', '中国,河北省,衡水市,冀州市', 115.5790023803711, 37.55080032348633, 'Jizhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (220, '131182', '深州市', '131100', '深州', 3, '0318', '053800', '中国,河北省,衡水市,深州市', 115.55999755859375, 38.0010986328125, 'Shenzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (221, '140000', '山西省', '100000', '山西', 1, '', '1', '中国,山西省', 112.54900360107422, 37.856998443603516, 'Shanxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (222, '140100', '太原市', '140000', '太原', 2, '0351', '030082', '中国,山西省,太原市', 112.54900360107422, 37.856998443603516, 'Taiyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (223, '140105', '小店区', '140100', '小店', 3, '0351', '030032', '中国,山西省,太原市,小店区', 112.56900024414062, 37.735599517822266, 'Xiaodian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (224, '140106', '迎泽区', '140100', '迎泽', 3, '0351', '030002', '中国,山西省,太原市,迎泽区', 112.56300354003906, 37.86330032348633, 'Yingze'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (225, '140107', '杏花岭区', '140100', '杏花岭', 3, '0351', '030009', '中国,山西省,太原市,杏花岭区', 112.56199645996094, 37.884300231933594, 'Xinghualing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (226, '140108', '尖草坪区', '140100', '尖草坪', 3, '0351', '030023', '中国,山西省,太原市,尖草坪区', 112.48699951171875, 37.941898345947266, 'Jiancaoping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (227, '140109', '万柏林区', '140100', '万柏林', 3, '0351', '030024', '中国,山西省,太原市,万柏林区', 112.51599884033203, 37.85919952392578, 'Wanbailin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (228, '140110', '晋源区', '140100', '晋源', 3, '0351', '030025', '中国,山西省,太原市,晋源区', 112.4800033569336, 37.72480010986328, 'Jinyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (229, '140121', '清徐县', '140100', '清徐', 3, '0351', '030400', '中国,山西省,太原市,清徐县', 112.35900115966797, 37.607601165771484, 'Qingxu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (230, '140122', '阳曲县', '140100', '阳曲', 3, '0351', '030100', '中国,山西省,太原市,阳曲县', 112.67900085449219, 38.059898376464844, 'Yangqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (231, '140123', '娄烦县', '140100', '娄烦', 3, '0351', '030300', '中国,山西省,太原市,娄烦县', 111.79499816894531, 38.066898345947266, 'Loufan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (232, '140181', '古交市', '140100', '古交', 3, '0351', '030200', '中国,山西省,太原市,古交市', 112.16899871826172, 37.9098014831543, 'Gujiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (233, '140200', '大同市', '140000', '大同', 2, '0352', '037008', '中国,山西省,大同市', 113.29499816894531, 40.090301513671875, 'Datong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (234, '140202', '城区', '140200', '城区', 3, '0352', '037008', '中国,山西省,大同市,城区', 113.2979965209961, 40.07569885253906, 'Chengqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (235, '140203', '矿区', '140200', '矿区', 3, '0352', '037003', '中国,山西省,大同市,矿区', 113.177001953125, 40.036800384521484, 'Kuangqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (236, '140211', '南郊区', '140200', '南郊', 3, '0352', '037001', '中国,山西省,大同市,南郊区', 113.14900207519531, 40.005401611328125, 'Nanjiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (237, '140212', '新荣区', '140200', '新荣', 3, '0352', '037002', '中国,山西省,大同市,新荣区', 113.13500213623047, 40.25619888305664, 'Xinrong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (238, '140221', '阳高县', '140200', '阳高', 3, '0352', '038100', '中国,山西省,大同市,阳高县', 113.75, 40.36259841918945, 'Yanggao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (239, '140222', '天镇县', '140200', '天镇', 3, '0352', '038200', '中国,山西省,大同市,天镇县', 114.09300231933594, 40.42300033569336, 'Tianzhen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (240, '140223', '广灵县', '140200', '广灵', 3, '0352', '037500', '中国,山西省,大同市,广灵县', 114.28199768066406, 39.760799407958984, 'Guangling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (241, '140224', '灵丘县', '140200', '灵丘', 3, '0352', '034400', '中国,山西省,大同市,灵丘县', 114.23699951171875, 39.440399169921875, 'Lingqiu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (242, '140225', '浑源县', '140200', '浑源', 3, '0352', '037400', '中国,山西省,大同市,浑源县', 113.69599914550781, 39.69960021972656, 'Hunyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (243, '140226', '左云县', '140200', '左云', 3, '0352', '037100', '中国,山西省,大同市,左云县', 112.7030029296875, 40.01340103149414, 'Zuoyun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (244, '140227', '大同县', '140200', '大同', 3, '0352', '037300', '中国,山西省,大同市,大同县', 113.61199951171875, 40.04010009765625, 'Datong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (245, '140300', '阳泉市', '140000', '阳泉', 2, '0353', '045000', '中国,山西省,阳泉市', 113.58300018310547, 37.86119842529297, 'Yangquan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (246, '140302', '城区', '140300', '城区', 3, '0353', '045000', '中国,山西省,阳泉市,城区', 113.60099792480469, 37.8474006652832, 'Chengqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (247, '140303', '矿区', '140300', '矿区', 3, '0353', '045000', '中国,山西省,阳泉市,矿区', 113.55699920654297, 37.868900299072266, 'Kuangqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (248, '140311', '郊区', '140300', '郊区', 3, '0353', '045011', '中国,山西省,阳泉市,郊区', 113.58499908447266, 37.94139862060547, 'Jiaoqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (249, '140321', '平定县', '140300', '平定', 3, '0353', '045200', '中国,山西省,阳泉市,平定县', 113.65799713134766, 37.7859992980957, 'Pingding'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (250, '140322', '盂县', '140300', '盂县', 3, '0353', '045100', '中国,山西省,阳泉市,盂县', 113.41200256347656, 38.08580017089844, 'Yuxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (251, '140400', '长治市', '140000', '长治', 2, '0355', '046000', '中国,山西省,长治市', 113.11399841308594, 36.19110107421875, 'Changzhi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (252, '140402', '城区', '140400', '城区', 3, '0355', '046011', '中国,山西省,长治市,城区', 113.12300109863281, 36.20349884033203, 'Chengqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (253, '140411', '郊区', '140400', '郊区', 3, '0355', '046011', '中国,山西省,长治市,郊区', 113.12699890136719, 36.19919967651367, 'Jiaoqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (254, '140421', '长治县', '140400', '长治', 3, '0355', '047100', '中国,山西省,长治市,长治县', 113.0479965209961, 36.04719924926758, 'Changzhi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (255, '140423', '襄垣县', '140400', '襄垣', 3, '0355', '046200', '中国,山西省,长治市,襄垣县', 113.052001953125, 36.535301208496094, 'Xiangyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (256, '140424', '屯留县', '140400', '屯留', 3, '0355', '046100', '中国,山西省,长治市,屯留县', 112.89199829101562, 36.315799713134766, 'Tunliu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (257, '140425', '平顺县', '140400', '平顺', 3, '0355', '047400', '中国,山西省,长治市,平顺县', 113.43599700927734, 36.20009994506836, 'Pingshun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (258, '140426', '黎城县', '140400', '黎城', 3, '0355', '047600', '中国,山西省,长治市,黎城县', 113.38800048828125, 36.50299835205078, 'Licheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (259, '140427', '壶关县', '140400', '壶关', 3, '0355', '047300', '中国,山西省,长治市,壶关县', 113.20700073242188, 36.112998962402344, 'Huguan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (260, '140428', '长子县', '140400', '长子', 3, '0355', '046600', '中国,山西省,长治市,长子县', 112.87699890136719, 36.121299743652344, 'Zhangzi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (261, '140429', '武乡县', '140400', '武乡', 3, '0355', '046300', '中国,山西省,长治市,武乡县', 112.86299896240234, 36.83689880371094, 'Wuxiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (262, '140430', '沁县', '140400', '沁县', 3, '0355', '046400', '中国,山西省,长治市,沁县', 112.6989974975586, 36.75630187988281, 'Qinxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (263, '140431', '沁源县', '140400', '沁源', 3, '0355', '046500', '中国,山西省,长治市,沁源县', 112.33799743652344, 36.500099182128906, 'Qinyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (264, '140481', '潞城市', '140400', '潞城', 3, '0355', '047500', '中国,山西省,长治市,潞城市', 113.22899627685547, 36.33409881591797, 'Lucheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (265, '140500', '晋城市', '140000', '晋城', 2, '0356', '048000', '中国,山西省,晋城市', 112.85099792480469, 35.49760055541992, 'Jincheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (266, '140502', '城区', '140500', '城区', 3, '0356', '048000', '中国,山西省,晋城市,城区', 112.85299682617188, 35.501800537109375, 'Chengqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (267, '140521', '沁水县', '140500', '沁水', 3, '0356', '048200', '中国,山西省,晋城市,沁水县', 112.18699645996094, 35.691001892089844, 'Qinshui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (268, '140522', '阳城县', '140500', '阳城', 3, '0356', '048100', '中国,山西省,晋城市,阳城县', 112.41500091552734, 35.48609924316406, 'Yangcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (269, '140524', '陵川县', '140500', '陵川', 3, '0356', '048300', '中国,山西省,晋城市,陵川县', 113.28099822998047, 35.775299072265625, 'Lingchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (270, '140525', '泽州县', '140500', '泽州', 3, '0356', '048012', '中国,山西省,晋城市,泽州县', 112.83899688720703, 35.50790023803711, 'Zezhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (271, '140581', '高平市', '140500', '高平', 3, '0356', '048400', '中国,山西省,晋城市,高平市', 112.9229965209961, 35.79710006713867, 'Gaoping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (272, '140600', '朔州市', '140000', '朔州', 2, '0349', '038500', '中国,山西省,朔州市', 112.43299865722656, 39.331298828125, 'Shuozhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (273, '140602', '朔城区', '140600', '朔城', 3, '0349', '036000', '中国,山西省,朔州市,朔城区', 112.43199920654297, 39.319801330566406, 'Shuocheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (274, '140603', '平鲁区', '140600', '平鲁', 3, '0349', '038600', '中国,山西省,朔州市,平鲁区', 112.28800201416016, 39.511600494384766, 'Pinglu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (275, '140621', '山阴县', '140600', '山阴', 3, '0349', '036900', '中国,山西省,朔州市,山阴县', 112.81700134277344, 39.527000427246094, 'Shanyin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (276, '140622', '应县', '140600', '应县', 3, '0349', '037600', '中国,山西省,朔州市,应县', 113.19100189208984, 39.552799224853516, 'Yingxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (277, '140623', '右玉县', '140600', '右玉', 3, '0349', '037200', '中国,山西省,朔州市,右玉县', 112.46900177001953, 39.9901008605957, 'Youyu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (278, '140624', '怀仁县', '140600', '怀仁', 3, '0349', '038300', '中国,山西省,朔州市,怀仁县', 113.0999984741211, 39.82809829711914, 'Huairen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (279, '140700', '晋中市', '140000', '晋中', 2, '0354', '030600', '中国,山西省,晋中市', 112.73600006103516, 37.69649887084961, 'Jinzhong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (280, '140702', '榆次区', '140700', '榆次', 3, '0354', '030600', '中国,山西省,晋中市,榆次区', 112.70800018310547, 37.69779968261719, 'Yuci'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (281, '140721', '榆社县', '140700', '榆社', 3, '0354', '031800', '中国,山西省,晋中市,榆社县', 112.97599792480469, 37.07210159301758, 'Yushe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (282, '140722', '左权县', '140700', '左权', 3, '0354', '032600', '中国,山西省,晋中市,左权县', 113.37899780273438, 37.082401275634766, 'Zuoquan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (283, '140723', '和顺县', '140700', '和顺', 3, '0354', '032700', '中国,山西省,晋中市,和顺县', 113.56999969482422, 37.3296012878418, 'Heshun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (284, '140724', '昔阳县', '140700', '昔阳', 3, '0354', '045300', '中国,山西省,晋中市,昔阳县', 113.70500183105469, 37.61859893798828, 'Xiyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (285, '140725', '寿阳县', '140700', '寿阳', 3, '0354', '045400', '中国,山西省,晋中市,寿阳县', 113.17500305175781, 37.888999938964844, 'Shouyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (286, '140726', '太谷县', '140700', '太谷', 3, '0354', '030800', '中国,山西省,晋中市,太谷县', 112.552001953125, 37.421600341796875, 'Taigu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (287, '140727', '祁县', '140700', '祁县', 3, '0354', '030900', '中国,山西省,晋中市,祁县', 112.33399963378906, 37.3578987121582, 'Qixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (288, '140728', '平遥县', '140700', '平遥', 3, '0354', '031100', '中国,山西省,晋中市,平遥县', 112.1760025024414, 37.18920135498047, 'Pingyao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (289, '140729', '灵石县', '140700', '灵石', 3, '0354', '031300', '中国,山西省,晋中市,灵石县', 111.7770004272461, 36.84809875488281, 'Lingshi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (290, '140781', '介休市', '140700', '介休', 3, '0354', '032000', '中国,山西省,晋中市,介休市', 111.91799926757812, 37.0276985168457, 'Jiexiu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (291, '140800', '运城市', '140000', '运城', 2, '0359', '044000', '中国,山西省,运城市', 111.00399780273438, 35.02280044555664, 'Yuncheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (292, '140802', '盐湖区', '140800', '盐湖', 3, '0359', '044000', '中国,山西省,运城市,盐湖区', 110.99800109863281, 35.015098571777344, 'Yanhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (293, '140821', '临猗县', '140800', '临猗', 3, '0359', '044100', '中国,山西省,运城市,临猗县', 110.77400207519531, 35.14459991455078, 'Linyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (294, '140822', '万荣县', '140800', '万荣', 3, '0359', '044200', '中国,山西省,运城市,万荣县', 110.83699798583984, 35.41559982299805, 'Wanrong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (295, '140823', '闻喜县', '140800', '闻喜', 3, '0359', '043800', '中国,山西省,运城市,闻喜县', 111.2229995727539, 35.355499267578125, 'Wenxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (296, '140824', '稷山县', '140800', '稷山', 3, '0359', '043200', '中国,山西省,运城市,稷山县', 110.97899627685547, 35.59989929199219, 'Jishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (297, '140825', '新绛县', '140800', '新绛', 3, '0359', '043100', '中国,山西省,运城市,新绛县', 111.2249984741211, 35.615699768066406, 'Xinjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (298, '140826', '绛县', '140800', '绛县', 3, '0359', '043600', '中国,山西省,运城市,绛县', 111.56700134277344, 35.49100112915039, 'Jiangxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (299, '140827', '垣曲县', '140800', '垣曲', 3, '0359', '043700', '中国,山西省,运城市,垣曲县', 111.6719970703125, 35.299198150634766, 'Yuanqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (300, '140828', '夏县', '140800', '夏县', 3, '0359', '044400', '中国,山西省,运城市,夏县', 111.22000122070312, 35.14120101928711, 'Xiaxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (301, '140829', '平陆县', '140800', '平陆', 3, '0359', '044300', '中国,山西省,运城市,平陆县', 111.21700286865234, 34.83769989013672, 'Pinglu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (302, '140830', '芮城县', '140800', '芮城', 3, '0359', '044600', '中国,山西省,运城市,芮城县', 110.69499969482422, 34.69380187988281, 'Ruicheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (303, '140881', '永济市', '140800', '永济', 3, '0359', '044500', '中国,山西省,运城市,永济市', 110.44499969482422, 34.8656005859375, 'Yongji'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (304, '140882', '河津市', '140800', '河津', 3, '0359', '043300', '中国,山西省,运城市,河津市', 110.71199798583984, 35.59479904174805, 'Hejin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (305, '140900', '忻州市', '140000', '忻州', 2, '0350', '034000', '中国,山西省,忻州市', 112.73400115966797, 38.417701721191406, 'Xinzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (306, '140902', '忻府区', '140900', '忻府', 3, '0350', '034000', '中国,山西省,忻州市,忻府区', 112.74600219726562, 38.40409851074219, 'Xinfu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (307, '140921', '定襄县', '140900', '定襄', 3, '0350', '035400', '中国,山西省,忻州市,定襄县', 112.95700073242188, 38.473899841308594, 'Dingxiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (308, '140922', '五台县', '140900', '五台', 3, '0350', '035500', '中国,山西省,忻州市,五台县', 113.25299835205078, 38.727699279785156, 'Wutai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (309, '140923', '代县', '140900', '代县', 3, '0350', '034200', '中国,山西省,忻州市,代县', 112.95899963378906, 39.06719970703125, 'Daixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (310, '140924', '繁峙县', '140900', '繁峙', 3, '0350', '034300', '中国,山西省,忻州市,繁峙县', 113.26300048828125, 39.188899993896484, 'Fanshi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (311, '140925', '宁武县', '140900', '宁武', 3, '0350', '036700', '中国,山西省,忻州市,宁武县', 112.30400085449219, 39.00210189819336, 'Ningwu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (312, '140926', '静乐县', '140900', '静乐', 3, '0350', '035100', '中国,山西省,忻州市,静乐县', 111.94200134277344, 38.360198974609375, 'Jingle'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (313, '140927', '神池县', '140900', '神池', 3, '0350', '036100', '中国,山西省,忻州市,神池县', 112.20500183105469, 39.09000015258789, 'Shenchi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (314, '140928', '五寨县', '140900', '五寨', 3, '0350', '036200', '中国,山西省,忻州市,五寨县', 111.8489990234375, 38.90760040283203, 'Wuzhai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (315, '140929', '岢岚县', '140900', '岢岚', 3, '0350', '036300', '中国,山西省,忻州市,岢岚县', 111.5739974975586, 38.704498291015625, 'Kelan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (316, '140930', '河曲县', '140900', '河曲', 3, '0350', '036500', '中国,山西省,忻州市,河曲县', 111.13800048828125, 39.3843994140625, 'Hequ'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (317, '140931', '保德县', '140900', '保德', 3, '0350', '036600', '中国,山西省,忻州市,保德县', 111.08699798583984, 39.022499084472656, 'Baode'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (318, '140932', '偏关县', '140900', '偏关', 3, '0350', '036400', '中国,山西省,忻州市,偏关县', 111.50900268554688, 39.436100006103516, 'Pianguan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (319, '140981', '原平市', '140900', '原平', 3, '0350', '034100', '中国,山西省,忻州市,原平市', 112.70600128173828, 38.7318000793457, 'Yuanping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (320, '141000', '临汾市', '140000', '临汾', 2, '0357', '041000', '中国,山西省,临汾市', 111.51799774169922, 36.08409881591797, 'Linfen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (321, '141002', '尧都区', '141000', '尧都', 3, '0357', '041000', '中国,山西省,临汾市,尧都区', 111.5790023803711, 36.08300018310547, 'Yaodu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (322, '141021', '曲沃县', '141000', '曲沃', 3, '0357', '043400', '中国,山西省,临汾市,曲沃县', 111.4749984741211, 35.64120101928711, 'Quwo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (323, '141022', '翼城县', '141000', '翼城', 3, '0357', '043500', '中国,山西省,临汾市,翼城县', 111.71800231933594, 35.738800048828125, 'Yicheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (324, '141023', '襄汾县', '141000', '襄汾', 3, '0357', '041500', '中国,山西省,临汾市,襄汾县', 111.44200134277344, 35.87710189819336, 'Xiangfen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (325, '141024', '洪洞县', '141000', '洪洞', 3, '0357', '041600', '中国,山西省,临汾市,洪洞县', 111.67500305175781, 36.25419998168945, 'Hongtong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (326, '141025', '古县', '141000', '古县', 3, '0357', '042400', '中国,山西省,临汾市,古县', 111.91999816894531, 36.26689910888672, 'Guxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (327, '141026', '安泽县', '141000', '安泽', 3, '0357', '042500', '中国,山西省,临汾市,安泽县', 112.25, 36.14799880981445, 'Anze'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (328, '141027', '浮山县', '141000', '浮山', 3, '0357', '042600', '中国,山西省,临汾市,浮山县', 111.84700012207031, 35.96849822998047, 'Fushan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (329, '141028', '吉县', '141000', '吉县', 3, '0357', '042200', '中国,山西省,临汾市,吉县', 110.68099975585938, 36.09870147705078, 'Jixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (330, '141029', '乡宁县', '141000', '乡宁', 3, '0357', '042100', '中国,山西省,临汾市,乡宁县', 110.84700012207031, 35.970699310302734, 'Xiangning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (331, '141030', '大宁县', '141000', '大宁', 3, '0357', '042300', '中国,山西省,临汾市,大宁县', 110.75199890136719, 36.46620178222656, 'Daning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (332, '141031', '隰县', '141000', '隰县', 3, '0357', '041300', '中国,山西省,临汾市,隰县', 110.93900299072266, 36.69260025024414, 'Xixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (333, '141032', '永和县', '141000', '永和', 3, '0357', '041400', '中国,山西省,临汾市,永和县', 110.63200378417969, 36.758399963378906, 'Yonghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (334, '141033', '蒲县', '141000', '蒲县', 3, '0357', '041200', '中国,山西省,临汾市,蒲县', 111.09700012207031, 36.41239929199219, 'Puxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (335, '141034', '汾西县', '141000', '汾西', 3, '0357', '031500', '中国,山西省,临汾市,汾西县', 111.56800079345703, 36.65060043334961, 'Fenxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (336, '141081', '侯马市', '141000', '侯马', 3, '0357', '043000', '中国,山西省,临汾市,侯马市', 111.37200164794922, 35.61899948120117, 'Houma'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (337, '141082', '霍州市', '141000', '霍州', 3, '0357', '031400', '中国,山西省,临汾市,霍州市', 111.75499725341797, 36.56380081176758, 'Huozhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (338, '141100', '吕梁市', '140000', '吕梁', 2, '0358', '033000', '中国,山西省,吕梁市', 111.13400268554688, 37.52439880371094, 'Lvliang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (339, '141102', '离石区', '141100', '离石', 3, '0358', '033000', '中国,山西省,吕梁市,离石区', 111.1510009765625, 37.5177001953125, 'Lishi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (340, '141121', '文水县', '141100', '文水', 3, '0358', '032100', '中国,山西省,吕梁市,文水县', 112.02799987792969, 37.43840026855469, 'Wenshui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (341, '141122', '交城县', '141100', '交城', 3, '0358', '030500', '中国,山西省,吕梁市,交城县', 112.15899658203125, 37.55120086669922, 'Jiaocheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (342, '141123', '兴县', '141100', '兴县', 3, '0358', '033600', '中国,山西省,吕梁市,兴县', 111.12699890136719, 38.463199615478516, 'Xingxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (343, '141124', '临县', '141100', '临县', 3, '0358', '033200', '中国,山西省,吕梁市,临县', 110.99299621582031, 37.952701568603516, 'Linxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (344, '141125', '柳林县', '141100', '柳林', 3, '0358', '033300', '中国,山西省,吕梁市,柳林县', 110.88899993896484, 37.429298400878906, 'Liulin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (345, '141126', '石楼县', '141100', '石楼', 3, '0358', '032500', '中国,山西省,吕梁市,石楼县', 110.83499908447266, 36.99729919433594, 'Shilou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (346, '141127', '岚县', '141100', '岚县', 3, '0358', '033500', '中国,山西省,吕梁市,岚县', 111.6760025024414, 38.27870178222656, 'Lanxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (347, '141128', '方山县', '141100', '方山', 3, '0358', '033100', '中国,山西省,吕梁市,方山县', 111.23999786376953, 37.889801025390625, 'Fangshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (348, '141129', '中阳县', '141100', '中阳', 3, '0358', '033400', '中国,山西省,吕梁市,中阳县', 111.17900085449219, 37.357200622558594, 'Zhongyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (349, '141130', '交口县', '141100', '交口', 3, '0358', '032400', '中国,山西省,吕梁市,交口县', 111.18099975585938, 36.98210144042969, 'Jiaokou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (350, '141181', '孝义市', '141100', '孝义', 3, '0358', '032300', '中国,山西省,吕梁市,孝义市', 111.77400207519531, 37.144100189208984, 'Xiaoyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (351, '141182', '汾阳市', '141100', '汾阳', 3, '0358', '032200', '中国,山西省,吕梁市,汾阳市', 111.78800201416016, 37.26599884033203, 'Fenyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (352, '150000', '内蒙古', '100000', '内蒙古', 1, '', '1', '中国,内蒙古自治区', 111.6709976196289, 40.81829833984375, 'Inner Mongolia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (353, '150100', '呼和浩特市', '150000', '呼和浩特', 2, '0471', '010000', '中国,内蒙古自治区,呼和浩特市', 111.6709976196289, 40.81829833984375, 'Hohhot'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (354, '150102', '新城区', '150100', '新城', 3, '0471', '010050', '中国,内蒙古自治区,呼和浩特市,新城区', 111.66600036621094, 40.858299255371094, 'Xincheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (355, '150103', '回民区', '150100', '回民', 3, '0471', '010030', '中国,内蒙古自治区,呼和浩特市,回民区', 111.6240005493164, 40.80830001831055, 'Huimin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (356, '150104', '玉泉区', '150100', '玉泉', 3, '0471', '010020', '中国,内蒙古自治区,呼和浩特市,玉泉区', 111.67500305175781, 40.75230026245117, 'Yuquan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (357, '150105', '赛罕区', '150100', '赛罕', 3, '0471', '010020', '中国,内蒙古自治区,呼和浩特市,赛罕区', 111.7020034790039, 40.79209899902344, 'Saihan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (358, '150121', '土默特左旗', '150100', '土默特左旗', 3, '0471', '010100', '中国,内蒙古自治区,呼和浩特市,土默特左旗', 111.14900207519531, 40.7223014831543, 'Tumotezuoqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (359, '150122', '托克托县', '150100', '托克托', 3, '0471', '010200', '中国,内蒙古自治区,呼和浩特市,托克托县', 111.19100189208984, 40.274898529052734, 'Tuoketuo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (360, '150123', '和林格尔县', '150100', '和林格尔', 3, '0471', '011500', '中国,内蒙古自治区,呼和浩特市,和林格尔县', 111.8219985961914, 40.37889862060547, 'Helingeer'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (361, '150124', '清水河县', '150100', '清水河', 3, '0471', '011600', '中国,内蒙古自治区,呼和浩特市,清水河县', 111.68299865722656, 39.909698486328125, 'Qingshuihe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (362, '150125', '武川县', '150100', '武川', 3, '0471', '011700', '中国,内蒙古自治区,呼和浩特市,武川县', 111.45800018310547, 41.092899322509766, 'Wuchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (363, '150200', '包头市', '150000', '包头', 2, '0472', '014025', '中国,内蒙古自治区,包头市', 109.83999633789062, 40.658199310302734, 'Baotou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (364, '150202', '东河区', '150200', '东河', 3, '0472', '014040', '中国,内蒙古自治区,包头市,东河区', 110.0459976196289, 40.582401275634766, 'Donghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (365, '150203', '昆都仑区', '150200', '昆都仑', 3, '0472', '014010', '中国,内蒙古自治区,包头市,昆都仑区', 109.83899688720703, 40.64179992675781, 'Kundulun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (366, '150204', '青山区', '150200', '青山', 3, '0472', '014030', '中国,内蒙古自治区,包头市,青山区', 109.9010009765625, 40.6432991027832, 'Qingshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (367, '150205', '石拐区', '150200', '石拐', 3, '0472', '014070', '中国,内蒙古自治区,包头市,石拐区', 110.27300262451172, 40.67300033569336, 'Shiguai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (368, '150206', '白云鄂博矿区', '150200', '白云鄂博矿区', 3, '0472', '014080', '中国,内蒙古自治区,包头市,白云鄂博矿区', 109.9739990234375, 41.76969909667969, 'Baiyunebokuangqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (369, '150207', '九原区', '150200', '九原', 3, '0472', '014060', '中国,内蒙古自治区,包头市,九原区', 109.96499633789062, 40.605499267578125, 'Jiuyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (370, '150221', '土默特右旗', '150200', '土默特右旗', 3, '0472', '014100', '中国,内蒙古自治区,包头市,土默特右旗', 110.52400207519531, 40.56880187988281, 'Tumoteyouqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (371, '150222', '固阳县', '150200', '固阳', 3, '0472', '014200', '中国,内蒙古自治区,包头市,固阳县', 110.06400299072266, 41.01850128173828, 'Guyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (372, '150223', '达尔罕茂明安联合旗', '150200', '达茂旗', 3, '0472', '014500', '中国,内蒙古自治区,包头市,达尔罕茂明安联合旗', 110.43299865722656, 41.698699951171875, 'Damaoqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (373, '150300', '乌海市', '150000', '乌海', 2, '0473', '016000', '中国,内蒙古自治区,乌海市', 106.82599639892578, 39.67369842529297, 'Wuhai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (374, '150302', '海勃湾区', '150300', '海勃湾', 3, '0473', '016000', '中国,内蒙古自治区,乌海市,海勃湾区', 106.8219985961914, 39.66960144042969, 'Haibowan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (375, '150303', '海南区', '150300', '海南', 3, '0473', '016030', '中国,内蒙古自治区,乌海市,海南区', 106.88700103759766, 39.44129943847656, 'Hainan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (376, '150304', '乌达区', '150300', '乌达', 3, '0473', '016040', '中国,内蒙古自治区,乌海市,乌达区', 106.72699737548828, 39.505001068115234, 'Wuda'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (377, '150400', '赤峰市', '150000', '赤峰', 2, '0476', '024000', '中国,内蒙古自治区,赤峰市', 118.95700073242188, 42.275299072265625, 'Chifeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (378, '150402', '红山区', '150400', '红山', 3, '0476', '024020', '中国,内蒙古自治区,赤峰市,红山区', 118.95800018310547, 42.243099212646484, 'Hongshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (379, '150403', '元宝山区', '150400', '元宝山', 3, '0476', '024076', '中国,内蒙古自治区,赤峰市,元宝山区', 119.28900146484375, 42.04010009765625, 'Yuanbaoshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (380, '150404', '松山区', '150400', '松山', 3, '0476', '024005', '中国,内蒙古自治区,赤峰市,松山区', 118.93299865722656, 42.28609848022461, 'Songshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (381, '150421', '阿鲁科尔沁旗', '150400', '阿鲁科尔沁旗', 3, '0476', '025550', '中国,内蒙古自治区,赤峰市,阿鲁科尔沁旗', 120.06500244140625, 43.87990188598633, 'Alukeerqinqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (382, '150422', '巴林左旗', '150400', '巴林左旗', 3, '0476', '025450', '中国,内蒙古自治区,赤峰市,巴林左旗', 119.37999725341797, 43.970298767089844, 'Balinzuoqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (383, '150423', '巴林右旗', '150400', '巴林右旗', 3, '0476', '025150', '中国,内蒙古自治区,赤峰市,巴林右旗', 118.66500091552734, 43.53390121459961, 'Balinyouqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (384, '150424', '林西县', '150400', '林西', 3, '0476', '025250', '中国,内蒙古自治区,赤峰市,林西县', 118.0469970703125, 43.61159896850586, 'Linxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (385, '150425', '克什克腾旗', '150400', '克什克腾旗', 3, '0476', '025350', '中国,内蒙古自治区,赤峰市,克什克腾旗', 117.5459976196289, 43.26499938964844, 'Keshiketengqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (386, '150426', '翁牛特旗', '150400', '翁牛特旗', 3, '0476', '024500', '中国,内蒙古自治区,赤峰市,翁牛特旗', 119.02999877929688, 42.93149948120117, 'Wengniuteqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (387, '150428', '喀喇沁旗', '150400', '喀喇沁旗', 3, '0476', '024400', '中国,内蒙古自治区,赤峰市,喀喇沁旗', 118.70099639892578, 41.92919921875, 'Kalaqinqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (388, '150429', '宁城县', '150400', '宁城', 3, '0476', '024200', '中国,内蒙古自治区,赤峰市,宁城县', 119.34400177001953, 41.59659957885742, 'Ningcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (389, '150430', '敖汉旗', '150400', '敖汉旗', 3, '0476', '024300', '中国,内蒙古自治区,赤峰市,敖汉旗', 119.9219970703125, 42.29069900512695, 'Aohanqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (390, '150500', '通辽市', '150000', '通辽', 2, '0475', '028000', '中国,内蒙古自治区,通辽市', 122.26300048828125, 43.617401123046875, 'Tongliao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (391, '150502', '科尔沁区', '150500', '科尔沁', 3, '0475', '028000', '中国,内蒙古自治区,通辽市,科尔沁区', 122.25599670410156, 43.62260055541992, 'Keerqin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (392, '150521', '科尔沁左翼中旗', '150500', '科尔沁左翼中旗', 3, '0475', '029300', '中国,内蒙古自治区,通辽市,科尔沁左翼中旗', 123.31900024414062, 44.13010025024414, 'Keerqinzuoyizhongqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (393, '150522', '科尔沁左翼后旗', '150500', '科尔沁左翼后旗', 3, '0475', '028100', '中国,内蒙古自治区,通辽市,科尔沁左翼后旗', 122.35700225830078, 42.94900131225586, 'Keerqinzuoyihouqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (394, '150523', '开鲁县', '150500', '开鲁', 3, '0475', '028400', '中国,内蒙古自治区,通辽市,开鲁县', 121.31900024414062, 43.599998474121094, 'Kailu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (395, '150524', '库伦旗', '150500', '库伦旗', 3, '0475', '028200', '中国,内蒙古自治区,通辽市,库伦旗', 121.7760009765625, 42.72999954223633, 'Kulunqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (396, '150525', '奈曼旗', '150500', '奈曼旗', 3, '0475', '028300', '中国,内蒙古自治区,通辽市,奈曼旗', 120.66300201416016, 42.845298767089844, 'Naimanqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (397, '150526', '扎鲁特旗', '150500', '扎鲁特旗', 3, '0475', '029100', '中国,内蒙古自治区,通辽市,扎鲁特旗', 120.91500091552734, 44.55590057373047, 'Zhaluteqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (398, '150581', '霍林郭勒市', '150500', '霍林郭勒', 3, '0475', '029200', '中国,内蒙古自治区,通辽市,霍林郭勒市', 119.65399932861328, 45.53450012207031, 'Huolinguole'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (399, '150600', '鄂尔多斯市', '150000', '鄂尔多斯', 2, '0477', '017004', '中国,内蒙古自治区,鄂尔多斯市', 109.98999786376953, 39.81719970703125, 'Ordos'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (400, '150602', '东胜区', '150600', '东胜', 3, '0477', '017000', '中国,内蒙古自治区,鄂尔多斯市,东胜区', 109.96299743652344, 39.8223991394043, 'Dongsheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (401, '150621', '达拉特旗', '150600', '达拉特旗', 3, '0477', '014300', '中国,内蒙古自治区,鄂尔多斯市,达拉特旗', 110.03299713134766, 40.40010070800781, 'Dalateqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (402, '150622', '准格尔旗', '150600', '准格尔旗', 3, '0477', '017100', '中国,内蒙古自治区,鄂尔多斯市,准格尔旗', 111.23600006103516, 39.867801666259766, 'Zhungeerqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (403, '150623', '鄂托克前旗', '150600', '鄂托克前旗', 3, '0477', '016200', '中国,内蒙古自治区,鄂尔多斯市,鄂托克前旗', 107.48400115966797, 38.183998107910156, 'Etuokeqianqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (404, '150624', '鄂托克旗', '150600', '鄂托克旗', 3, '0477', '016100', '中国,内蒙古自治区,鄂尔多斯市,鄂托克旗', 107.98200225830078, 39.094600677490234, 'Etuokeqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (405, '150625', '杭锦旗', '150600', '杭锦旗', 3, '0477', '017400', '中国,内蒙古自治区,鄂尔多斯市,杭锦旗', 108.72899627685547, 39.8401985168457, 'Hangjinqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (406, '150626', '乌审旗', '150600', '乌审旗', 3, '0477', '017300', '中国,内蒙古自治区,鄂尔多斯市,乌审旗', 108.84600067138672, 38.59090042114258, 'Wushenqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (407, '150627', '伊金霍洛旗', '150600', '伊金霍洛旗', 3, '0477', '017200', '中国,内蒙古自治区,鄂尔多斯市,伊金霍洛旗', 109.7490005493164, 39.57389831542969, 'Yijinhuoluoqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (408, '150700', '呼伦贝尔市', '150000', '呼伦贝尔', 2, '0470', '021008', '中国,内蒙古自治区,呼伦贝尔市', 119.75800323486328, 49.215301513671875, 'Hulunber'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (409, '150702', '海拉尔区', '150700', '海拉尔', 3, '0470', '021000', '中国,内蒙古自治区,呼伦贝尔市,海拉尔区', 119.73600006103516, 49.21220016479492, 'Hailaer'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (410, '150703', '扎赉诺尔区', '150700', '扎赉诺尔', 3, '0470', '021410', '中国,内蒙古自治区,呼伦贝尔市,扎赉诺尔区', 117.79299926757812, 49.486900329589844, 'Zhalainuoer'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (411, '150721', '阿荣旗', '150700', '阿荣旗', 3, '0470', '162750', '中国,内蒙古自治区,呼伦贝尔市,阿荣旗', 123.45899963378906, 48.12580108642578, 'Arongqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (412, '150722', '莫力达瓦达斡尔族自治旗', '150700', '莫旗', 3, '0470', '162850', '中国,内蒙古自治区,呼伦贝尔市,莫力达瓦达斡尔族自治旗', 124.51499938964844, 48.480499267578125, 'Moqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (413, '150723', '鄂伦春自治旗', '150700', '鄂伦春', 3, '0470', '165450', '中国,内蒙古自治区,呼伦贝尔市,鄂伦春自治旗', 123.72599792480469, 50.597801208496094, 'Elunchun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (414, '150724', '鄂温克族自治旗', '150700', '鄂温', 3, '0470', '021100', '中国,内蒙古自治区,呼伦贝尔市,鄂温克族自治旗', 119.75700378417969, 49.142799377441406, 'Ewen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (415, '150725', '陈巴尔虎旗', '150700', '陈巴尔虎旗', 3, '0470', '021500', '中国,内蒙古自治区,呼伦贝尔市,陈巴尔虎旗', 119.42400360107422, 49.32680130004883, 'Chenbaerhuqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (416, '150726', '新巴尔虎左旗', '150700', '新巴尔虎左旗', 3, '0470', '021200', '中国,内蒙古自治区,呼伦贝尔市,新巴尔虎左旗', 118.2699966430664, 48.21839904785156, 'Xinbaerhuzuoqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (417, '150727', '新巴尔虎右旗', '150700', '新巴尔虎右旗', 3, '0470', '021300', '中国,内蒙古自治区,呼伦贝尔市,新巴尔虎右旗', 116.8239974975586, 48.66469955444336, 'Xinbaerhuyouqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (418, '150781', '满洲里市', '150700', '满洲里', 3, '0470', '021400', '中国,内蒙古自治区,呼伦贝尔市,满洲里市', 117.47899627685547, 49.582698822021484, 'Manzhouli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (419, '150782', '牙克石市', '150700', '牙克石', 3, '0470', '022150', '中国,内蒙古自治区,呼伦贝尔市,牙克石市', 120.71199798583984, 49.28559875488281, 'Yakeshi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (420, '150783', '扎兰屯市', '150700', '扎兰屯', 3, '0470', '162650', '中国,内蒙古自治区,呼伦贝尔市,扎兰屯市', 122.73799896240234, 48.01359939575195, 'Zhalantun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (421, '150784', '额尔古纳市', '150700', '额尔古纳', 3, '0470', '022250', '中国,内蒙古自治区,呼伦贝尔市,额尔古纳市', 120.19100189208984, 50.24250030517578, 'Eerguna'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (422, '150785', '根河市', '150700', '根河', 3, '0470', '022350', '中国,内蒙古自治区,呼伦贝尔市,根河市', 121.52200317382812, 50.779998779296875, 'Genhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (423, '150800', '巴彦淖尔市', '150000', '巴彦淖尔', 2, '0478', '015001', '中国,内蒙古自治区,巴彦淖尔市', 107.41699981689453, 40.75740051269531, 'Bayan Nur'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (424, '150802', '临河区', '150800', '临河', 3, '0478', '015001', '中国,内蒙古自治区,巴彦淖尔市,临河区', 107.427001953125, 40.75830078125, 'Linhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (425, '150821', '五原县', '150800', '五原', 3, '0478', '015100', '中国,内蒙古自治区,巴彦淖尔市,五原县', 108.26899719238281, 41.09629821777344, 'Wuyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (426, '150822', '磴口县', '150800', '磴口', 3, '0478', '015200', '中国,内蒙古自治区,巴彦淖尔市,磴口县', 107.00900268554688, 40.33060073852539, 'Dengkou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (427, '150823', '乌拉特前旗', '150800', '乌拉特前旗', 3, '0478', '014400', '中国,内蒙古自治区,巴彦淖尔市,乌拉特前旗', 108.6520004272461, 40.73649978637695, 'Wulateqianqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (428, '150824', '乌拉特中旗', '150800', '乌拉特中旗', 3, '0478', '015300', '中国,内蒙古自治区,巴彦淖尔市,乌拉特中旗', 108.5260009765625, 41.567901611328125, 'Wulatezhongqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (429, '150825', '乌拉特后旗', '150800', '乌拉特后旗', 3, '0478', '015500', '中国,内蒙古自治区,巴彦淖尔市,乌拉特后旗', 106.98999786376953, 41.43149948120117, 'Wulatehouqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (430, '150826', '杭锦后旗', '150800', '杭锦后旗', 3, '0478', '015400', '中国,内蒙古自治区,巴彦淖尔市,杭锦后旗', 107.1510009765625, 40.88629913330078, 'Hangjinhouqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (431, '150900', '乌兰察布市', '150000', '乌兰察布', 2, '0474', '012000', '中国,内蒙古自治区,乌兰察布市', 113.11499786376953, 41.03409957885742, 'Ulanqab'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (432, '150902', '集宁区', '150900', '集宁', 3, '0474', '012000', '中国,内蒙古自治区,乌兰察布市,集宁区', 113.11499786376953, 41.035301208496094, 'Jining'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (433, '150921', '卓资县', '150900', '卓资', 3, '0474', '012300', '中国,内蒙古自治区,乌兰察布市,卓资县', 112.5780029296875, 40.894100189208984, 'Zhuozi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (434, '150922', '化德县', '150900', '化德', 3, '0474', '013350', '中国,内蒙古自治区,乌兰察布市,化德县', 114.01100158691406, 41.904300689697266, 'Huade'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (435, '150923', '商都县', '150900', '商都', 3, '0474', '013450', '中国,内蒙古自治区,乌兰察布市,商都县', 113.5780029296875, 41.56209945678711, 'Shangdu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (436, '150924', '兴和县', '150900', '兴和', 3, '0474', '013650', '中国,内蒙古自治区,乌兰察布市,兴和县', 113.83399963378906, 40.87189865112305, 'Xinghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (437, '150925', '凉城县', '150900', '凉城', 3, '0474', '013750', '中国,内蒙古自治区,乌兰察布市,凉城县', 112.49600219726562, 40.53350067138672, 'Liangcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (438, '150926', '察哈尔右翼前旗', '150900', '察右前旗', 3, '0474', '012200', '中国,内蒙古自治区,乌兰察布市,察哈尔右翼前旗', 113.22100067138672, 40.77880096435547, 'Chayouqianqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (439, '150927', '察哈尔右翼中旗', '150900', '察右中旗', 3, '0474', '013550', '中国,内蒙古自治区,乌兰察布市,察哈尔右翼中旗', 112.63500213623047, 41.277400970458984, 'Chayouzhongqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (440, '150928', '察哈尔右翼后旗', '150900', '察右后旗', 3, '0474', '012400', '中国,内蒙古自治区,乌兰察布市,察哈尔右翼后旗', 113.19200134277344, 41.43550109863281, 'Chayouhouqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (441, '150929', '四子王旗', '150900', '四子王旗', 3, '0474', '011800', '中国,内蒙古自治区,乌兰察布市,四子王旗', 111.70700073242188, 41.53310012817383, 'Siziwangqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (442, '150981', '丰镇市', '150900', '丰镇', 3, '0474', '012100', '中国,内蒙古自治区,乌兰察布市,丰镇市', 113.11000061035156, 40.4369010925293, 'Fengzhen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (443, '152200', '兴安盟', '150000', '兴安盟', 2, '0482', '137401', '中国,内蒙古自治区,兴安盟', 122.06999969482422, 46.07630157470703, 'Hinggan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (444, '152201', '乌兰浩特市', '152200', '乌兰浩特', 3, '0482', '137401', '中国,内蒙古自治区,兴安盟,乌兰浩特市', 122.06400299072266, 46.062400817871094, 'Wulanhaote'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (445, '152202', '阿尔山市', '152200', '阿尔山', 3, '0482', '137800', '中国,内蒙古自治区,兴安盟,阿尔山市', 119.94300079345703, 47.17720031738281, 'Aershan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (446, '152221', '科尔沁右翼前旗', '152200', '科右前旗', 3, '0482', '137423', '中国,内蒙古自治区,兴安盟,科尔沁右翼前旗', 121.9530029296875, 46.079498291015625, 'Keyouqianqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (447, '152222', '科尔沁右翼中旗', '152200', '科右中旗', 3, '0482', '029400', '中国,内蒙古自治区,兴安盟,科尔沁右翼中旗', 121.46800231933594, 45.055999755859375, 'Keyouzhongqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (448, '152223', '扎赉特旗', '152200', '扎赉特旗', 3, '0482', '137600', '中国,内蒙古自治区,兴安盟,扎赉特旗', 122.91200256347656, 46.72669982910156, 'Zhalaiteqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (449, '152224', '突泉县', '152200', '突泉', 3, '0482', '137500', '中国,内蒙古自治区,兴安盟,突泉县', 121.59400177001953, 45.381900787353516, 'Tuquan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (450, '152500', '锡林郭勒盟', '150000', '锡林郭勒盟', 2, '0479', '026000', '中国,内蒙古自治区,锡林郭勒盟', 116.09100341796875, 43.944000244140625, 'Xilin Gol'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (451, '152501', '二连浩特市', '152500', '二连浩特', 3, '0479', '011100', '中国,内蒙古自治区,锡林郭勒盟,二连浩特市', 111.98300170898438, 43.65299987792969, 'Erlianhaote'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (452, '152502', '锡林浩特市', '152500', '锡林浩特', 3, '0479', '026021', '中国,内蒙古自治区,锡林郭勒盟,锡林浩特市', 116.08599853515625, 43.93339920043945, 'Xilinhaote'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (453, '152522', '阿巴嘎旗', '152500', '阿巴嘎旗', 3, '0479', '011400', '中国,内蒙古自治区,锡林郭勒盟,阿巴嘎旗', 114.96800231933594, 44.02170181274414, 'Abagaqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (454, '152523', '苏尼特左旗', '152500', '苏尼特左旗', 3, '0479', '011300', '中国,内蒙古自治区,锡林郭勒盟,苏尼特左旗', 113.6510009765625, 43.85689926147461, 'Sunitezuoqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (455, '152524', '苏尼特右旗', '152500', '苏尼特右旗', 3, '0479', '011200', '中国,内蒙古自治区,锡林郭勒盟,苏尼特右旗', 112.65699768066406, 42.74689865112305, 'Suniteyouqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (456, '152525', '东乌珠穆沁旗', '152500', '东乌旗', 3, '0479', '026300', '中国,内蒙古自治区,锡林郭勒盟,东乌珠穆沁旗', 116.9729995727539, 45.51110076904297, 'Dongwuqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (457, '152526', '西乌珠穆沁旗', '152500', '西乌旗', 3, '0479', '026200', '中国,内蒙古自治区,锡林郭勒盟,西乌珠穆沁旗', 117.61000061035156, 44.59619903564453, 'Xiwuqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (458, '152527', '太仆寺旗', '152500', '太仆寺旗', 3, '0479', '027000', '中国,内蒙古自治区,锡林郭勒盟,太仆寺旗', 115.28299713134766, 41.87730026245117, 'Taipusiqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (459, '152528', '镶黄旗', '152500', '镶黄旗', 3, '0479', '013250', '中国,内蒙古自治区,锡林郭勒盟,镶黄旗', 113.84500122070312, 42.23929977416992, 'Xianghuangqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (460, '152529', '正镶白旗', '152500', '正镶白旗', 3, '0479', '013800', '中国,内蒙古自治区,锡林郭勒盟,正镶白旗', 115.0009994506836, 42.307098388671875, 'Zhengxiangbaiqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (461, '152530', '正蓝旗', '152500', '正蓝旗', 3, '0479', '027200', '中国,内蒙古自治区,锡林郭勒盟,正蓝旗', 116.00399780273438, 42.25230026245117, 'Zhenglanqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (462, '152531', '多伦县', '152500', '多伦', 3, '0479', '027300', '中国,内蒙古自治区,锡林郭勒盟,多伦县', 116.48600006103516, 42.202999114990234, 'Duolun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (463, '152900', '阿拉善盟', '150000', '阿拉善盟', 2, '0483', '750306', '中国,内蒙古自治区,阿拉善盟', 105.70600128173828, 38.84479904174805, 'Alxa'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (464, '152921', '阿拉善左旗', '152900', '阿拉善左旗', 3, '0483', '750306', '中国,内蒙古自治区,阿拉善盟,阿拉善左旗', 105.67500305175781, 38.82929992675781, 'Alashanzuoqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (465, '152922', '阿拉善右旗', '152900', '阿拉善右旗', 3, '0483', '737300', '中国,内蒙古自治区,阿拉善盟,阿拉善右旗', 101.66699981689453, 39.215301513671875, 'Alashanyouqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (466, '152923', '额济纳旗', '152900', '额济纳旗', 3, '0483', '735400', '中国,内蒙古自治区,阿拉善盟,额济纳旗', 101.06900024414062, 41.967498779296875, 'Ejinaqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (467, '210000', '辽宁省', '100000', '辽宁', 1, '', '1', '中国,辽宁省', 123.42900085449219, 41.79679870605469, 'Liaoning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (468, '210100', '沈阳市', '210000', '沈阳', 2, '024', '110013', '中国,辽宁省,沈阳市', 123.42900085449219, 41.79679870605469, 'Shenyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (469, '210102', '和平区', '210100', '和平', 3, '024', '110001', '中国,辽宁省,沈阳市,和平区', 123.41999816894531, 41.790000915527344, 'Heping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (470, '210103', '沈河区', '210100', '沈河', 3, '024', '110011', '中国,辽宁省,沈阳市,沈河区', 123.45899963378906, 41.796199798583984, 'Shenhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (471, '210104', '大东区', '210100', '大东', 3, '024', '110041', '中国,辽宁省,沈阳市,大东区', 123.47000122070312, 41.80540084838867, 'Dadong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (472, '210105', '皇姑区', '210100', '皇姑', 3, '024', '110031', '中国,辽宁省,沈阳市,皇姑区', 123.42500305175781, 41.82040023803711, 'Huanggu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (473, '210106', '铁西区', '210100', '铁西', 3, '024', '110021', '中国,辽宁省,沈阳市,铁西区', 123.37699890136719, 41.80270004272461, 'Tiexi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (474, '210111', '苏家屯区', '210100', '苏家屯', 3, '024', '110101', '中国,辽宁省,沈阳市,苏家屯区', 123.34400177001953, 41.66469955444336, 'Sujiatun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (475, '210112', '浑南区', '210100', '浑南', 3, '024', '110015', '中国,辽宁省,沈阳市,浑南区', 123.45800018310547, 41.71950149536133, 'Hunnan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (476, '210113', '沈北新区', '210100', '沈北新区', 3, '024', '110121', '中国,辽宁省,沈阳市,沈北新区', 123.5270004272461, 42.053001403808594, 'Shenbeixinqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (477, '210114', '于洪区', '210100', '于洪', 3, '024', '110141', '中国,辽宁省,沈阳市,于洪区', 123.30799865722656, 41.79399871826172, 'Yuhong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (478, '210122', '辽中县', '210100', '辽中', 3, '024', '110200', '中国,辽宁省,沈阳市,辽中县', 122.72699737548828, 41.51300048828125, 'Liaozhong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (479, '210123', '康平县', '210100', '康平', 3, '024', '110500', '中国,辽宁省,沈阳市,康平县', 123.35399627685547, 42.75080108642578, 'Kangping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (480, '210124', '法库县', '210100', '法库', 3, '024', '110400', '中国,辽宁省,沈阳市,法库县', 123.41200256347656, 42.506099700927734, 'Faku'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (481, '210181', '新民市', '210100', '新民', 3, '024', '110300', '中国,辽宁省,沈阳市,新民市', 122.8290023803711, 41.99850082397461, 'Xinmin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (482, '210200', '大连市', '210000', '大连', 2, '0411', '116011', '中国,辽宁省,大连市', 121.61900329589844, 38.91460037231445, 'Dalian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (483, '210202', '中山区', '210200', '中山', 3, '0411', '116001', '中国,辽宁省,大连市,中山区', 121.6449966430664, 38.91859817504883, 'Zhongshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (484, '210203', '西岗区', '210200', '西岗', 3, '0411', '116011', '中国,辽宁省,大连市,西岗区', 121.61199951171875, 38.91469955444336, 'Xigang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (485, '210204', '沙河口区', '210200', '沙河口', 3, '0411', '116021', '中国,辽宁省,大连市,沙河口区', 121.58000183105469, 38.905399322509766, 'Shahekou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (486, '210211', '甘井子区', '210200', '甘井子', 3, '0411', '116033', '中国,辽宁省,大连市,甘井子区', 121.56600189208984, 38.950199127197266, 'Ganjingzi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (487, '210212', '旅顺口区', '210200', '旅顺口', 3, '0411', '116041', '中国,辽宁省,大连市,旅顺口区', 121.26200103759766, 38.851200103759766, 'Lvshunkou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (488, '210213', '金州区', '210200', '金州', 3, '0411', '116100', '中国,辽宁省,大连市,金州区', 121.71900177001953, 39.100399017333984, 'Jinzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (489, '210224', '长海县', '210200', '长海', 3, '0411', '116500', '中国,辽宁省,大连市,长海县', 122.58899688720703, 39.272701263427734, 'Changhai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (490, '210281', '瓦房店市', '210200', '瓦房店', 3, '0411', '116300', '中国,辽宁省,大连市,瓦房店市', 121.98100280761719, 39.62839889526367, 'Wafangdian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (491, '210282', '普兰店市', '210200', '普兰店', 3, '0411', '116200', '中国,辽宁省,大连市,普兰店市', 121.96299743652344, 39.39459991455078, 'Pulandian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (492, '210283', '庄河市', '210200', '庄河', 3, '0411', '116400', '中国,辽宁省,大连市,庄河市', 122.96700286865234, 39.6880989074707, 'Zhuanghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (493, '210300', '鞍山市', '210000', '鞍山', 2, '0412', '114001', '中国,辽宁省,鞍山市', 122.99600219726562, 41.110599517822266, 'Anshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (494, '210302', '铁东区', '210300', '铁东', 3, '0412', '114001', '中国,辽宁省,鞍山市,铁东区', 122.99099731445312, 41.089698791503906, 'Tiedong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (495, '210303', '铁西区', '210300', '铁西', 3, '0413', '114013', '中国,辽宁省,鞍山市,铁西区', 122.97000122070312, 41.11980056762695, 'Tiexi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (496, '210304', '立山区', '210300', '立山', 3, '0414', '114031', '中国,辽宁省,鞍山市,立山区', 123.02899932861328, 41.15010070800781, 'Lishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (497, '210311', '千山区', '210300', '千山', 3, '0415', '114041', '中国,辽宁省,鞍山市,千山区', 122.95999908447266, 41.07509994506836, 'Qianshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (498, '210321', '台安县', '210300', '台安', 3, '0417', '114100', '中国,辽宁省,鞍山市,台安县', 122.43599700927734, 41.41270065307617, 'Tai\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (499, '210323', '岫岩满族自治县', '210300', '岫岩', 3, '0418', '114300', '中国,辽宁省,鞍山市,岫岩满族自治县', 123.28900146484375, 40.279998779296875, 'Xiuyan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (500, '210381', '海城市', '210300', '海城', 3, '0416', '114200', '中国,辽宁省,鞍山市,海城市', 122.68499755859375, 40.88140106201172, 'Haicheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (501, '210400', '抚顺市', '210000', '抚顺', 2, '024', '113008', '中国,辽宁省,抚顺市', 123.9209976196289, 41.875999450683594, 'Fushun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (502, '210402', '新抚区', '210400', '新抚', 3, '024', '113008', '中国,辽宁省,抚顺市,新抚区', 123.91300201416016, 41.86199951171875, 'Xinfu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (503, '210403', '东洲区', '210400', '东洲', 3, '024', '113003', '中国,辽宁省,抚顺市,东洲区', 124.03800201416016, 41.851898193359375, 'Dongzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (504, '210404', '望花区', '210400', '望花', 3, '024', '113001', '中国,辽宁省,抚顺市,望花区', 123.78299713134766, 41.85530090332031, 'Wanghua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (505, '210411', '顺城区', '210400', '顺城', 3, '024', '113006', '中国,辽宁省,抚顺市,顺城区', 123.94499969482422, 41.883201599121094, 'Shuncheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (506, '210421', '抚顺县', '210400', '抚顺', 3, '024', '113006', '中国,辽宁省,抚顺市,抚顺县', 124.1780014038086, 41.71220016479492, 'Fushun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (507, '210422', '新宾满族自治县', '210400', '新宾', 3, '024', '113200', '中国,辽宁省,抚顺市,新宾满族自治县', 125.04000091552734, 41.734100341796875, 'Xinbin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (508, '210423', '清原满族自治县', '210400', '清原', 3, '024', '113300', '中国,辽宁省,抚顺市,清原满族自治县', 124.9280014038086, 42.10219955444336, 'Qingyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (509, '210500', '本溪市', '210000', '本溪', 2, '0414', '117000', '中国,辽宁省,本溪市', 123.77100372314453, 41.29790115356445, 'Benxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (510, '210502', '平山区', '210500', '平山', 3, '0414', '117000', '中国,辽宁省,本溪市,平山区', 123.76899719238281, 41.29970169067383, 'Pingshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (511, '210503', '溪湖区', '210500', '溪湖', 3, '0414', '117002', '中国,辽宁省,本溪市,溪湖区', 123.76799774169922, 41.329200744628906, 'Xihu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (512, '210504', '明山区', '210500', '明山', 3, '0414', '117021', '中国,辽宁省,本溪市,明山区', 123.81700134277344, 41.30830001831055, 'Mingshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (513, '210505', '南芬区', '210500', '南芬', 3, '0414', '117014', '中国,辽宁省,本溪市,南芬区', 123.74500274658203, 41.10060119628906, 'Nanfen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (514, '210521', '本溪满族自治县', '210500', '本溪', 3, '0414', '117100', '中国,辽宁省,本溪市,本溪满族自治县', 124.12699890136719, 41.30059814453125, 'Benxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (515, '210522', '桓仁满族自治县', '210500', '桓仁', 3, '0414', '117200', '中国,辽宁省,本溪市,桓仁满族自治县', 125.36100006103516, 41.268001556396484, 'Huanren'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (516, '210600', '丹东市', '210000', '丹东', 2, '0415', '118000', '中国,辽宁省,丹东市', 124.38300323486328, 40.124298095703125, 'Dandong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (517, '210602', '元宝区', '210600', '元宝', 3, '0415', '118000', '中国,辽宁省,丹东市,元宝区', 124.39600372314453, 40.13650131225586, 'Yuanbao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (518, '210603', '振兴区', '210600', '振兴', 3, '0415', '118002', '中国,辽宁省,丹东市,振兴区', 124.36000061035156, 40.10490036010742, 'Zhenxing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (519, '210604', '振安区', '210600', '振安', 3, '0415', '118001', '中国,辽宁省,丹东市,振安区', 124.4280014038086, 40.15829849243164, 'Zhen\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (520, '210624', '宽甸满族自治县', '210600', '宽甸', 3, '0415', '118200', '中国,辽宁省,丹东市,宽甸满族自治县', 124.78199768066406, 40.73189926147461, 'Kuandian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (521, '210681', '东港市', '210600', '东港', 3, '0415', '118300', '中国,辽宁省,丹东市,东港市', 124.16300201416016, 39.86259841918945, 'Donggang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (522, '210682', '凤城市', '210600', '凤城', 3, '0415', '118100', '中国,辽宁省,丹东市,凤城市', 124.06700134277344, 40.452999114990234, 'Fengcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (523, '210700', '锦州市', '210000', '锦州', 2, '0416', '121000', '中国,辽宁省,锦州市', 121.13600158691406, 41.119300842285156, 'Jinzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (524, '210702', '古塔区', '210700', '古塔', 3, '0416', '121001', '中国,辽宁省,锦州市,古塔区', 121.12799835205078, 41.1171989440918, 'Guta'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (525, '210703', '凌河区', '210700', '凌河', 3, '0416', '121000', '中国,辽宁省,锦州市,凌河区', 121.1510009765625, 41.1150016784668, 'Linghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (526, '210711', '太和区', '210700', '太和', 3, '0416', '121011', '中国,辽宁省,锦州市,太和区', 121.10399627685547, 41.10929870605469, 'Taihe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (527, '210726', '黑山县', '210700', '黑山', 3, '0416', '121400', '中国,辽宁省,锦州市,黑山县', 122.12100219726562, 41.69419860839844, 'Heishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (528, '210727', '义县', '210700', '义县', 3, '0416', '121100', '中国,辽宁省,锦州市,义县', 121.23999786376953, 41.53459930419922, 'Yixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (529, '210781', '凌海市', '210700', '凌海', 3, '0416', '121200', '中国,辽宁省,锦州市,凌海市', 121.35700225830078, 41.17369842529297, 'Linghai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (530, '210782', '北镇市', '210700', '北镇', 3, '0416', '121300', '中国,辽宁省,锦州市,北镇市', 121.79900360107422, 41.595401763916016, 'Beizhen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (531, '210800', '营口市', '210000', '营口', 2, '0417', '115003', '中国,辽宁省,营口市', 122.23500061035156, 40.66740036010742, 'Yingkou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (532, '210802', '站前区', '210800', '站前', 3, '0417', '115002', '中国,辽宁省,营口市,站前区', 122.25900268554688, 40.672698974609375, 'Zhanqian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (533, '210803', '西市区', '210800', '西市', 3, '0417', '115004', '中国,辽宁省,营口市,西市区', 122.20600128173828, 40.66640090942383, 'Xishi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (534, '210804', '鲅鱼圈区', '210800', '鲅鱼圈', 3, '0417', '115007', '中国,辽宁省,营口市,鲅鱼圈区', 122.13300323486328, 40.268699645996094, 'Bayuquan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (535, '210811', '老边区', '210800', '老边', 3, '0417', '115005', '中国,辽宁省,营口市,老边区', 122.37999725341797, 40.680301666259766, 'Laobian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (536, '210881', '盖州市', '210800', '盖州', 3, '0417', '115200', '中国,辽宁省,营口市,盖州市', 122.3550033569336, 40.40449905395508, 'Gaizhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (537, '210882', '大石桥市', '210800', '大石桥', 3, '0417', '115100', '中国,辽宁省,营口市,大石桥市', 122.50900268554688, 40.64569854736328, 'Dashiqiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (538, '210900', '阜新市', '210000', '阜新', 2, '0418', '123000', '中国,辽宁省,阜新市', 121.64900207519531, 42.01179885864258, 'Fuxin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (539, '210902', '海州区', '210900', '海州', 3, '0418', '123000', '中国,辽宁省,阜新市,海州区', 121.65599822998047, 42.01340103149414, 'Haizhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (540, '210903', '新邱区', '210900', '新邱', 3, '0418', '123005', '中国,辽宁省,阜新市,新邱区', 121.79299926757812, 42.091800689697266, 'Xinqiu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (541, '210904', '太平区', '210900', '太平', 3, '0418', '123003', '中国,辽宁省,阜新市,太平区', 121.67900085449219, 42.01070022583008, 'Taiping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (542, '210905', '清河门区', '210900', '清河门', 3, '0418', '123006', '中国,辽宁省,阜新市,清河门区', 121.41600036621094, 41.78310012817383, 'Qinghemen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (543, '210911', '细河区', '210900', '细河', 3, '0418', '123000', '中国,辽宁省,阜新市,细河区', 121.68000030517578, 42.025299072265625, 'Xihe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (544, '210921', '阜新蒙古族自治县', '210900', '阜新', 3, '0418', '123100', '中国,辽宁省,阜新市,阜新蒙古族自治县', 121.75800323486328, 42.065101623535156, 'Fuxin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (545, '210922', '彰武县', '210900', '彰武', 3, '0418', '123200', '中国,辽宁省,阜新市,彰武县', 122.54000091552734, 42.386199951171875, 'Zhangwu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (546, '211000', '辽阳市', '210000', '辽阳', 2, '0419', '111000', '中国,辽宁省,辽阳市', 123.18199920654297, 41.26940155029297, 'Liaoyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (547, '211002', '白塔区', '211000', '白塔', 3, '0419', '111000', '中国,辽宁省,辽阳市,白塔区', 123.17500305175781, 41.270198822021484, 'Baita'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (548, '211003', '文圣区', '211000', '文圣', 3, '0419', '111000', '中国,辽宁省,辽阳市,文圣区', 123.18499755859375, 41.262699127197266, 'Wensheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (549, '211004', '宏伟区', '211000', '宏伟', 3, '0419', '111003', '中国,辽宁省,辽阳市,宏伟区', 123.19300079345703, 41.21849822998047, 'Hongwei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (550, '211005', '弓长岭区', '211000', '弓长岭', 3, '0419', '111008', '中国,辽宁省,辽阳市,弓长岭区', 123.41999816894531, 41.151798248291016, 'Gongchangling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (551, '211011', '太子河区', '211000', '太子河', 3, '0419', '111000', '中国,辽宁省,辽阳市,太子河区', 123.18199920654297, 41.25339889526367, 'Taizihe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (552, '211021', '辽阳县', '211000', '辽阳', 3, '0419', '111200', '中国,辽宁省,辽阳市,辽阳县', 123.10600280761719, 41.20539855957031, 'Liaoyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (553, '211081', '灯塔市', '211000', '灯塔', 3, '0419', '111300', '中国,辽宁省,辽阳市,灯塔市', 123.33899688720703, 41.42610168457031, 'Dengta'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (554, '211100', '盘锦市', '210000', '盘锦', 2, '0427', '124010', '中国,辽宁省,盘锦市', 122.06999969482422, 41.1245002746582, 'Panjin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (555, '211102', '双台子区', '211100', '双台子', 3, '0427', '124000', '中国,辽宁省,盘锦市,双台子区', 122.05999755859375, 41.19060134887695, 'Shuangtaizi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (556, '211103', '兴隆台区', '211100', '兴隆台', 3, '0427', '124010', '中国,辽宁省,盘锦市,兴隆台区', 122.07499694824219, 41.124000549316406, 'Xinglongtai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (557, '211121', '大洼县', '211100', '大洼', 3, '0427', '124200', '中国,辽宁省,盘锦市,大洼县', 122.08200073242188, 41.00239944458008, 'Dawa'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (558, '211122', '盘山县', '211100', '盘山', 3, '0427', '124000', '中国,辽宁省,盘锦市,盘山县', 121.99800109863281, 41.237998962402344, 'Panshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (559, '211200', '铁岭市', '210000', '铁岭', 2, '024', '112000', '中国,辽宁省,铁岭市', 123.84400177001953, 42.29059982299805, 'Tieling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (560, '211202', '银州区', '211200', '银州', 3, '024', '112000', '中国,辽宁省,铁岭市,银州区', 123.85700225830078, 42.295101165771484, 'Yinzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (561, '211204', '清河区', '211200', '清河', 3, '024', '112003', '中国,辽宁省,铁岭市,清河区', 124.15899658203125, 42.54679870605469, 'Qinghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (562, '211221', '铁岭县', '211200', '铁岭', 3, '024', '112000', '中国,辽宁省,铁岭市,铁岭县', 123.77300262451172, 42.224998474121094, 'Tieling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (563, '211223', '西丰县', '211200', '西丰', 3, '024', '112400', '中国,辽宁省,铁岭市,西丰县', 124.7300033569336, 42.73759841918945, 'Xifeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (564, '211224', '昌图县', '211200', '昌图', 3, '024', '112500', '中国,辽宁省,铁岭市,昌图县', 124.11199951171875, 42.7843017578125, 'Changtu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (565, '211281', '调兵山市', '211200', '调兵山', 3, '024', '112700', '中国,辽宁省,铁岭市,调兵山市', 123.56700134277344, 42.467498779296875, 'Diaobingshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (566, '211282', '开原市', '211200', '开原', 3, '024', '112300', '中国,辽宁省,铁岭市,开原市', 124.03900146484375, 42.545799255371094, 'Kaiyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (567, '211300', '朝阳市', '210000', '朝阳', 2, '0421', '122000', '中国,辽宁省,朝阳市', 120.45099639892578, 41.57680130004883, 'Chaoyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (568, '211302', '双塔区', '211300', '双塔', 3, '0421', '122000', '中国,辽宁省,朝阳市,双塔区', 120.4540023803711, 41.566001892089844, 'Shuangta'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (569, '211303', '龙城区', '211300', '龙城', 3, '0421', '122000', '中国,辽宁省,朝阳市,龙城区', 120.43699645996094, 41.59260177612305, 'Longcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (570, '211321', '朝阳县', '211300', '朝阳', 3, '0421', '122000', '中国,辽宁省,朝阳市,朝阳县', 120.17400360107422, 41.43239974975586, 'Chaoyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (571, '211322', '建平县', '211300', '建平', 3, '0421', '122400', '中国,辽宁省,朝阳市,建平县', 119.64399719238281, 41.403099060058594, 'Jianping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (572, '211324', '喀喇沁左翼蒙古族自治县', '211300', '喀喇沁左翼', 3, '0421', '122300', '中国,辽宁省,朝阳市,喀喇沁左翼蒙古族自治县', 119.74199676513672, 41.12799835205078, 'Kalaqinzuoyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (573, '211381', '北票市', '211300', '北票', 3, '0421', '122100', '中国,辽宁省,朝阳市,北票市', 120.7699966430664, 41.801998138427734, 'Beipiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (574, '211382', '凌源市', '211300', '凌源', 3, '0421', '122500', '中国,辽宁省,朝阳市,凌源市', 119.4010009765625, 41.245601654052734, 'Lingyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (575, '211400', '葫芦岛市', '210000', '葫芦岛', 2, '0429', '125000', '中国,辽宁省,葫芦岛市', 120.85600280761719, 40.75559997558594, 'Huludao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (576, '211402', '连山区', '211400', '连山', 3, '0429', '125001', '中国,辽宁省,葫芦岛市,连山区', 120.86399841308594, 40.75550079345703, 'Lianshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (577, '211403', '龙港区', '211400', '龙港', 3, '0429', '125003', '中国,辽宁省,葫芦岛市,龙港区', 120.9489974975586, 40.719200134277344, 'Longgang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (578, '211404', '南票区', '211400', '南票', 3, '0429', '125027', '中国,辽宁省,葫芦岛市,南票区', 120.75, 41.10710144042969, 'Nanpiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (579, '211421', '绥中县', '211400', '绥中', 3, '0429', '125200', '中国,辽宁省,葫芦岛市,绥中县', 120.34500122070312, 40.32550048828125, 'Suizhong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (580, '211422', '建昌县', '211400', '建昌', 3, '0429', '125300', '中国,辽宁省,葫芦岛市,建昌县', 119.83799743652344, 40.824501037597656, 'Jianchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (581, '211481', '兴城市', '211400', '兴城', 3, '0429', '125100', '中国,辽宁省,葫芦岛市,兴城市', 120.7249984741211, 40.614898681640625, 'Xingcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (582, '211500', '金普新区', '210000', '金普新区', 2, '0411', '116100', '中国,辽宁省,金普新区', 121.79000091552734, 39.05550003051758, 'Jinpuxinqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (583, '211501', '金州新区', '211500', '金州新区', 3, '0411', '116100', '中国,辽宁省,金普新区,金州新区', 121.78500366210938, 39.05229949951172, 'Jinzhouxinqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (584, '211502', '普湾新区', '211500', '普湾新区', 3, '0411', '116200', '中国,辽宁省,金普新区,普湾新区', 121.81300354003906, 39.330101013183594, 'Puwanxinqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (585, '211503', '保税区', '211500', '保税区', 3, '0411', '116100', '中国,辽宁省,金普新区,保税区', 121.94300079345703, 39.22460174560547, 'Baoshuiqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (586, '220000', '吉林省', '100000', '吉林', 1, '', '1', '中国,吉林省', 125.32499694824219, 43.88679885864258, 'Jilin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (587, '220100', '长春市', '220000', '长春', 2, '0431', '130022', '中国,吉林省,长春市', 125.32499694824219, 43.88679885864258, 'Changchun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (588, '220102', '南关区', '220100', '南关', 3, '0431', '130022', '中国,吉林省,长春市,南关区', 125.3499984741211, 43.86399841308594, 'Nanguan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (589, '220103', '宽城区', '220100', '宽城', 3, '0431', '130051', '中国,吉林省,长春市,宽城区', 125.32599639892578, 43.901798248291016, 'Kuancheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (590, '220104', '朝阳区', '220100', '朝阳', 3, '0431', '130012', '中国,吉林省,长春市,朝阳区', 125.28800201416016, 43.83340072631836, 'Chaoyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (591, '220105', '二道区', '220100', '二道', 3, '0431', '130031', '中国,吉林省,长春市,二道区', 125.3740005493164, 43.8650016784668, 'Erdao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (592, '220106', '绿园区', '220100', '绿园', 3, '0431', '130062', '中国,吉林省,长春市,绿园区', 125.25599670410156, 43.88050079345703, 'Lvyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (593, '220112', '双阳区', '220100', '双阳', 3, '0431', '130600', '中国,吉林省,长春市,双阳区', 125.65599822998047, 43.52799987792969, 'Shuangyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (594, '220113', '九台区', '220100', '九台', 3, '0431', '130500', '中国,吉林省,长春市,九台区', 125.83999633789062, 44.1515998840332, 'Jiutai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (595, '220122', '农安县', '220100', '农安', 3, '0431', '130200', '中国,吉林省,长春市,农安县', 125.18499755859375, 44.432701110839844, 'Nong\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (596, '220182', '榆树市', '220100', '榆树', 3, '0431', '130400', '中国,吉林省,长春市,榆树市', 126.55699920654297, 44.825199127197266, 'Yushu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (597, '220183', '德惠市', '220100', '德惠', 3, '0431', '130300', '中国,吉林省,长春市,德惠市', 125.70500183105469, 44.537200927734375, 'Dehui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (598, '220200', '吉林市', '220000', '吉林', 2, '0432', '132011', '中国,吉林省,吉林市', 126.5530014038086, 43.84360122680664, 'Jilin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (599, '220202', '昌邑区', '220200', '昌邑', 3, '0432', '132002', '中国,吉林省,吉林市,昌邑区', 126.5739974975586, 43.88180160522461, 'Changyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (600, '220203', '龙潭区', '220200', '龙潭', 3, '0432', '132021', '中国,吉林省,吉林市,龙潭区', 126.56199645996094, 43.910499572753906, 'Longtan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (601, '220204', '船营区', '220200', '船营', 3, '0432', '132011', '中国,吉林省,吉林市,船营区', 126.54100036621094, 43.83340072631836, 'Chuanying'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (602, '220211', '丰满区', '220200', '丰满', 3, '0432', '132013', '中国,吉林省,吉林市,丰满区', 126.56199645996094, 43.8223991394043, 'Fengman'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (603, '220221', '永吉县', '220200', '永吉', 3, '0432', '132200', '中国,吉林省,吉林市,永吉县', 126.49600219726562, 43.672000885009766, 'Yongji'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (604, '220281', '蛟河市', '220200', '蛟河', 3, '0432', '132500', '中国,吉林省,吉林市,蛟河市', 127.34400177001953, 43.72700119018555, 'Jiaohe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (605, '220282', '桦甸市', '220200', '桦甸', 3, '0432', '132400', '中国,吉林省,吉林市,桦甸市', 126.74600219726562, 42.97209930419922, 'Huadian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (606, '220283', '舒兰市', '220200', '舒兰', 3, '0432', '132600', '中国,吉林省,吉林市,舒兰市', 126.96499633789062, 44.405799865722656, 'Shulan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (607, '220284', '磐石市', '220200', '磐石', 3, '0432', '132300', '中国,吉林省,吉林市,磐石市', 126.06199645996094, 42.9463005065918, 'Panshi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (608, '220300', '四平市', '220000', '四平', 2, '0434', '136000', '中国,吉林省,四平市', 124.37100219726562, 43.1702995300293, 'Siping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (609, '220302', '铁西区', '220300', '铁西', 3, '0434', '136000', '中国,吉林省,四平市,铁西区', 124.3740005493164, 43.174598693847656, 'Tiexi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (610, '220303', '铁东区', '220300', '铁东', 3, '0434', '136001', '中国,吉林省,四平市,铁东区', 124.41000366210938, 43.16239929199219, 'Tiedong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (611, '220322', '梨树县', '220300', '梨树', 3, '0434', '136500', '中国,吉林省,四平市,梨树县', 124.33599853515625, 43.30720138549805, 'Lishu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (612, '220323', '伊通满族自治县', '220300', '伊通', 3, '0434', '130700', '中国,吉林省,四平市,伊通满族自治县', 125.30599975585938, 43.34429931640625, 'Yitong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (613, '220381', '公主岭市', '220300', '公主岭', 3, '0434', '136100', '中国,吉林省,四平市,公主岭市', 124.822998046875, 43.50450134277344, 'Gongzhuling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (614, '220382', '双辽市', '220300', '双辽', 3, '0434', '136400', '中国,吉林省,四平市,双辽市', 123.5009994506836, 43.520999908447266, 'Shuangliao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (615, '220400', '辽源市', '220000', '辽源', 2, '0437', '136200', '中国,吉林省,辽源市', 125.1449966430664, 42.9026985168457, 'Liaoyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (616, '220402', '龙山区', '220400', '龙山', 3, '0437', '136200', '中国,吉林省,辽源市,龙山区', 125.13600158691406, 42.897098541259766, 'Longshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (617, '220403', '西安区', '220400', '西安', 3, '0437', '136201', '中国,吉林省,辽源市,西安区', 125.14900207519531, 42.926998138427734, 'Xi\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (618, '220421', '东丰县', '220400', '东丰', 3, '0437', '136300', '中国,吉林省,辽源市,东丰县', 125.53199768066406, 42.67829895019531, 'Dongfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (619, '220422', '东辽县', '220400', '东辽', 3, '0437', '136600', '中国,吉林省,辽源市,东辽县', 124.98600006103516, 42.92490005493164, 'Dongliao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (620, '220500', '通化市', '220000', '通化', 2, '0435', '134001', '中国,吉林省,通化市', 125.93699645996094, 41.72119903564453, 'Tonghua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (621, '220502', '东昌区', '220500', '东昌', 3, '0435', '134001', '中国,吉林省,通化市,东昌区', 125.95500183105469, 41.72850036621094, 'Dongchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (622, '220503', '二道江区', '220500', '二道江', 3, '0435', '134003', '中国,吉林省,通化市,二道江区', 126.04299926757812, 41.77410125732422, 'Erdaojiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (623, '220521', '通化县', '220500', '通化', 3, '0435', '134100', '中国,吉林省,通化市,通化县', 125.75900268554688, 41.679298400878906, 'Tonghua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (624, '220523', '辉南县', '220500', '辉南', 3, '0435', '135100', '中国,吉林省,通化市,辉南县', 126.0469970703125, 42.685001373291016, 'Huinan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (625, '220524', '柳河县', '220500', '柳河', 3, '0435', '135300', '中国,吉林省,通化市,柳河县', 125.74500274658203, 42.284698486328125, 'Liuhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (626, '220581', '梅河口市', '220500', '梅河口', 3, '0435', '135000', '中国,吉林省,通化市,梅河口市', 125.70999908447266, 42.538299560546875, 'Meihekou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (627, '220582', '集安市', '220500', '集安', 3, '0435', '134200', '中国,吉林省,通化市,集安市', 126.18800354003906, 41.12269973754883, 'Ji\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (628, '220600', '白山市', '220000', '白山', 2, '0439', '134300', '中国,吉林省,白山市', 126.4280014038086, 41.942501068115234, 'Baishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (629, '220602', '浑江区', '220600', '浑江', 3, '0439', '134300', '中国,吉林省,白山市,浑江区', 126.4219970703125, 41.945701599121094, 'Hunjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (630, '220605', '江源区', '220600', '江源', 3, '0439', '134700', '中国,吉林省,白山市,江源区', 126.59100341796875, 42.05659866333008, 'Jiangyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (631, '220621', '抚松县', '220600', '抚松', 3, '0439', '134500', '中国,吉林省,白山市,抚松县', 127.27999877929688, 42.34199905395508, 'Fusong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (632, '220622', '靖宇县', '220600', '靖宇', 3, '0439', '135200', '中国,吉林省,白山市,靖宇县', 126.81300354003906, 42.38859939575195, 'Jingyu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (633, '220623', '长白朝鲜族自治县', '220600', '长白', 3, '0439', '134400', '中国,吉林省,白山市,长白朝鲜族自治县', 128.1999969482422, 41.41999816894531, 'Changbai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (634, '220681', '临江市', '220600', '临江', 3, '0439', '134600', '中国,吉林省,白山市,临江市', 126.91799926757812, 41.8114013671875, 'Linjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (635, '220700', '松原市', '220000', '松原', 2, '0438', '138000', '中国,吉林省,松原市', 124.8239974975586, 45.11819839477539, 'Songyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (636, '220702', '宁江区', '220700', '宁江', 3, '0438', '138000', '中国,吉林省,松原市,宁江区', 124.81700134277344, 45.17169952392578, 'Ningjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (637, '220721', '前郭尔罗斯蒙古族自治县', '220700', '前郭尔罗斯', 3, '0438', '138000', '中国,吉林省,松原市,前郭尔罗斯蒙古族自治县', 124.8239974975586, 45.1172981262207, 'Qianguoerluosi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (638, '220722', '长岭县', '220700', '长岭', 3, '0438', '131500', '中国,吉林省,松原市,长岭县', 123.96700286865234, 44.27579879760742, 'Changling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (639, '220723', '乾安县', '220700', '乾安', 3, '0438', '131400', '中国,吉林省,松原市,乾安县', 124.0270004272461, 45.01070022583008, 'Qian\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (640, '220781', '扶余市', '220700', '扶余', 3, '0438', '131200', '中国,吉林省,松原市,扶余市', 126.04299926757812, 44.98619842529297, 'Fuyu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (641, '220800', '白城市', '220000', '白城', 2, '0436', '137000', '中国,吉林省,白城市', 122.84100341796875, 45.61899948120117, 'Baicheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (642, '220802', '洮北区', '220800', '洮北', 3, '0436', '137000', '中国,吉林省,白城市,洮北区', 122.85099792480469, 45.621700286865234, 'Taobei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (643, '220821', '镇赉县', '220800', '镇赉', 3, '0436', '137300', '中国,吉林省,白城市,镇赉县', 123.1989974975586, 45.847801208496094, 'Zhenlai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (644, '220822', '通榆县', '220800', '通榆', 3, '0436', '137200', '中国,吉林省,白城市,通榆县', 123.08799743652344, 44.813899993896484, 'Tongyu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (645, '220881', '洮南市', '220800', '洮南', 3, '0436', '137100', '中国,吉林省,白城市,洮南市', 122.78800201416016, 45.334999084472656, 'Taonan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (646, '220882', '大安市', '220800', '大安', 3, '0436', '131300', '中国,吉林省,白城市,大安市', 124.29499816894531, 45.50849914550781, 'Da\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (647, '222400', '延边朝鲜族自治州', '220000', '延边', 2, '0433', '133000', '中国,吉林省,延边朝鲜族自治州', 129.51300048828125, 42.90480041503906, 'Yanbian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (648, '222401', '延吉市', '222400', '延吉', 3, '0433', '133000', '中国,吉林省,延边朝鲜族自治州,延吉市', 129.51400756835938, 42.90679931640625, 'Yanji'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (649, '222402', '图们市', '222400', '图们', 3, '0433', '133100', '中国,吉林省,延边朝鲜族自治州,图们市', 129.843994140625, 42.96799850463867, 'Tumen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (650, '222403', '敦化市', '222400', '敦化', 3, '0433', '133700', '中国,吉林省,延边朝鲜族自治州,敦化市', 128.23199462890625, 43.37300109863281, 'Dunhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (651, '222404', '珲春市', '222400', '珲春', 3, '0433', '133300', '中国,吉林省,延边朝鲜族自治州,珲春市', 130.36599731445312, 42.86240005493164, 'Hunchun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (652, '222405', '龙井市', '222400', '龙井', 3, '0433', '133400', '中国,吉林省,延边朝鲜族自治州,龙井市', 129.42599487304688, 42.768001556396484, 'Longjing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (653, '222406', '和龙市', '222400', '和龙', 3, '0433', '133500', '中国,吉林省,延边朝鲜族自治州,和龙市', 129.01100158691406, 42.5463981628418, 'Helong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (654, '222424', '汪清县', '222400', '汪清', 3, '0433', '133200', '中国,吉林省,延边朝鲜族自治州,汪清县', 129.77099609375, 43.312801361083984, 'Wangqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (655, '222426', '安图县', '222400', '安图', 3, '0433', '133600', '中国,吉林省,延边朝鲜族自治州,安图县', 128.906005859375, 43.115299224853516, 'Antu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (656, '230000', '黑龙江省', '100000', '黑龙江', 1, '', '1', '中国,黑龙江省', 126.64199829101562, 45.75699996948242, 'Heilongjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (657, '230100', '哈尔滨市', '230000', '哈尔滨', 2, '0451', '150010', '中国,黑龙江省,哈尔滨市', 126.64199829101562, 45.75699996948242, 'Harbin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (658, '230102', '道里区', '230100', '道里', 3, '0451', '150010', '中国,黑龙江省,哈尔滨市,道里区', 126.61699676513672, 45.75590133666992, 'Daoli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (659, '230103', '南岗区', '230100', '南岗', 3, '0451', '150006', '中国,黑龙江省,哈尔滨市,南岗区', 126.66899871826172, 45.7599983215332, 'Nangang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (660, '230104', '道外区', '230100', '道外', 3, '0451', '150020', '中国,黑龙江省,哈尔滨市,道外区', 126.64900207519531, 45.791900634765625, 'Daowai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (661, '230108', '平房区', '230100', '平房', 3, '0451', '150060', '中国,黑龙江省,哈尔滨市,平房区', 126.63700103759766, 45.597801208496094, 'Pingfang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (662, '230109', '松北区', '230100', '松北', 3, '0451', '150028', '中国,黑龙江省,哈尔滨市,松北区', 126.56300354003906, 45.80830001831055, 'Songbei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (663, '230110', '香坊区', '230100', '香坊', 3, '0451', '150036', '中国,黑龙江省,哈尔滨市,香坊区', 126.68000030517578, 45.72380065917969, 'Xiangfang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (664, '230111', '呼兰区', '230100', '呼兰', 3, '0451', '150500', '中国,黑龙江省,哈尔滨市,呼兰区', 126.58799743652344, 45.888999938964844, 'Hulan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (665, '230112', '阿城区', '230100', '阿城', 3, '0451', '150300', '中国,黑龙江省,哈尔滨市,阿城区', 126.9749984741211, 45.54140090942383, 'A\'cheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (666, '230113', '双城区', '230100', '双城', 3, '0451', '150100', '中国,黑龙江省,哈尔滨市,双城区', 126.30899810791016, 45.377899169921875, 'Shuangcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (667, '230123', '依兰县', '230100', '依兰', 3, '0451', '154800', '中国,黑龙江省,哈尔滨市,依兰县', 129.5679931640625, 46.32469940185547, 'Yilan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (668, '230124', '方正县', '230100', '方正', 3, '0451', '150800', '中国,黑龙江省,哈尔滨市,方正县', 128.8300018310547, 45.851600646972656, 'Fangzheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (669, '230125', '宾县', '230100', '宾县', 3, '0451', '150400', '中国,黑龙江省,哈尔滨市,宾县', 127.48699951171875, 45.755001068115234, 'Binxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (670, '230126', '巴彦县', '230100', '巴彦', 3, '0451', '151800', '中国,黑龙江省,哈尔滨市,巴彦县', 127.40799713134766, 46.08150100708008, 'Bayan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (671, '230127', '木兰县', '230100', '木兰', 3, '0451', '151900', '中国,黑龙江省,哈尔滨市,木兰县', 128.0449981689453, 45.94940185546875, 'Mulan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (672, '230128', '通河县', '230100', '通河', 3, '0451', '150900', '中国,黑龙江省,哈尔滨市,通河县', 128.74600219726562, 45.9901008605957, 'Tonghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (673, '230129', '延寿县', '230100', '延寿', 3, '0451', '150700', '中国,黑龙江省,哈尔滨市,延寿县', 128.33399963378906, 45.45539855957031, 'Yanshou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (674, '230183', '尚志市', '230100', '尚志', 3, '0451', '150600', '中国,黑龙江省,哈尔滨市,尚志市', 127.96199798583984, 45.21739959716797, 'Shangzhi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (675, '230184', '五常市', '230100', '五常', 3, '0451', '150200', '中国,黑龙江省,哈尔滨市,五常市', 127.16799926757812, 44.931800842285156, 'Wuchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (676, '230200', '齐齐哈尔市', '230000', '齐齐哈尔', 2, '0452', '161005', '中国,黑龙江省,齐齐哈尔市', 123.9530029296875, 47.34809875488281, 'Qiqihar'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (677, '230202', '龙沙区', '230200', '龙沙', 3, '0452', '161000', '中国,黑龙江省,齐齐哈尔市,龙沙区', 123.95800018310547, 47.31779861450195, 'Longsha'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (678, '230203', '建华区', '230200', '建华', 3, '0452', '161006', '中国,黑龙江省,齐齐哈尔市,建华区', 124.01300048828125, 47.3671989440918, 'Jianhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (679, '230204', '铁锋区', '230200', '铁锋', 3, '0452', '161000', '中国,黑龙江省,齐齐哈尔市,铁锋区', 123.97799682617188, 47.34080123901367, 'Tiefeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (680, '230205', '昂昂溪区', '230200', '昂昂溪', 3, '0452', '161031', '中国,黑龙江省,齐齐哈尔市,昂昂溪区', 123.8219985961914, 47.15510177612305, 'Angangxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (681, '230206', '富拉尔基区', '230200', '富拉尔基', 3, '0452', '161041', '中国,黑龙江省,齐齐哈尔市,富拉尔基区', 123.62899780273438, 47.20880126953125, 'Fulaerji'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (682, '230207', '碾子山区', '230200', '碾子山', 3, '0452', '161046', '中国,黑龙江省,齐齐哈尔市,碾子山区', 122.88200378417969, 47.5166015625, 'Nianzishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (683, '230208', '梅里斯达斡尔族区', '230200', '梅里斯', 3, '0452', '161021', '中国,黑龙江省,齐齐哈尔市,梅里斯达斡尔族区', 123.75299835205078, 47.30950164794922, 'Meilisi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (684, '230221', '龙江县', '230200', '龙江', 3, '0452', '161100', '中国,黑龙江省,齐齐哈尔市,龙江县', 123.20500183105469, 47.33869934082031, 'Longjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (685, '230223', '依安县', '230200', '依安', 3, '0452', '161500', '中国,黑龙江省,齐齐哈尔市,依安县', 125.30899810791016, 47.89310073852539, 'Yi\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (686, '230224', '泰来县', '230200', '泰来', 3, '0452', '162400', '中国,黑龙江省,齐齐哈尔市,泰来县', 123.4229965209961, 46.39390182495117, 'Tailai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (687, '230225', '甘南县', '230200', '甘南', 3, '0452', '162100', '中国,黑龙江省,齐齐哈尔市,甘南县', 123.50299835205078, 47.924400329589844, 'Gannan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (688, '230227', '富裕县', '230200', '富裕', 3, '0452', '161200', '中国,黑龙江省,齐齐哈尔市,富裕县', 124.4749984741211, 47.77429962158203, 'Fuyu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (689, '230229', '克山县', '230200', '克山', 3, '0452', '161600', '中国,黑龙江省,齐齐哈尔市,克山县', 125.8740005493164, 48.03260040283203, 'Keshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (690, '230230', '克东县', '230200', '克东', 3, '0452', '164800', '中国,黑龙江省,齐齐哈尔市,克东县', 126.2490005493164, 48.038299560546875, 'Kedong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (691, '230231', '拜泉县', '230200', '拜泉', 3, '0452', '164700', '中国,黑龙江省,齐齐哈尔市,拜泉县', 126.09200286865234, 47.60820007324219, 'Baiquan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (692, '230281', '讷河市', '230200', '讷河', 3, '0452', '161300', '中国,黑龙江省,齐齐哈尔市,讷河市', 124.87699890136719, 48.4838981628418, 'Nehe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (693, '230300', '鸡西市', '230000', '鸡西', 2, '0467', '158100', '中国,黑龙江省,鸡西市', 130.9759979248047, 45.29999923706055, 'Jixi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (694, '230302', '鸡冠区', '230300', '鸡冠', 3, '0467', '158100', '中国,黑龙江省,鸡西市,鸡冠区', 130.9810028076172, 45.30400085449219, 'Jiguan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (695, '230303', '恒山区', '230300', '恒山', 3, '0467', '158130', '中国,黑龙江省,鸡西市,恒山区', 130.90499877929688, 45.21070098876953, 'Hengshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (696, '230304', '滴道区', '230300', '滴道', 3, '0467', '158150', '中国,黑龙江省,鸡西市,滴道区', 130.84800720214844, 45.35110092163086, 'Didao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (697, '230305', '梨树区', '230300', '梨树', 3, '0467', '158160', '中国,黑龙江省,鸡西市,梨树区', 130.697998046875, 45.09040069580078, 'Lishu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (698, '230306', '城子河区', '230300', '城子河', 3, '0467', '158170', '中国,黑龙江省,鸡西市,城子河区', 131.01100158691406, 45.33689880371094, 'Chengzihe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (699, '230307', '麻山区', '230300', '麻山', 3, '0467', '158180', '中国,黑龙江省,鸡西市,麻山区', 130.47799682617188, 45.212100982666016, 'Mashan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (700, '230321', '鸡东县', '230300', '鸡东', 3, '0467', '158200', '中国,黑龙江省,鸡西市,鸡东县', 131.12399291992188, 45.26029968261719, 'Jidong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (701, '230381', '虎林市', '230300', '虎林', 3, '0467', '158400', '中国,黑龙江省,鸡西市,虎林市', 132.93699645996094, 45.762901306152344, 'Hulin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (702, '230382', '密山市', '230300', '密山', 3, '0467', '158300', '中国,黑龙江省,鸡西市,密山市', 131.8459930419922, 45.529701232910156, 'Mishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (703, '230400', '鹤岗市', '230000', '鹤岗', 2, '0468', '154100', '中国,黑龙江省,鹤岗市', 130.27699279785156, 47.33209991455078, 'Hegang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (704, '230402', '向阳区', '230400', '向阳', 3, '0468', '154100', '中国,黑龙江省,鹤岗市,向阳区', 130.29400634765625, 47.342498779296875, 'Xiangyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (705, '230403', '工农区', '230400', '工农', 3, '0468', '154101', '中国,黑龙江省,鹤岗市,工农区', 130.27499389648438, 47.31869888305664, 'Gongnong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (706, '230404', '南山区', '230400', '南山', 3, '0468', '154104', '中国,黑龙江省,鹤岗市,南山区', 130.27699279785156, 47.31399917602539, 'Nanshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (707, '230405', '兴安区', '230400', '兴安', 3, '0468', '154102', '中国,黑龙江省,鹤岗市,兴安区', 130.24000549316406, 47.252601623535156, 'Xing\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (708, '230406', '东山区', '230400', '东山', 3, '0468', '154106', '中国,黑龙江省,鹤岗市,东山区', 130.31700134277344, 47.3385009765625, 'Dongshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (709, '230407', '兴山区', '230400', '兴山', 3, '0468', '154105', '中国,黑龙江省,鹤岗市,兴山区', 130.29299926757812, 47.3577995300293, 'Xingshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (710, '230421', '萝北县', '230400', '萝北', 3, '0468', '154200', '中国,黑龙江省,鹤岗市,萝北县', 130.83299255371094, 47.5796012878418, 'Luobei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (711, '230422', '绥滨县', '230400', '绥滨', 3, '0468', '156200', '中国,黑龙江省,鹤岗市,绥滨县', 131.86000061035156, 47.29029846191406, 'Suibin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (712, '230500', '双鸭山市', '230000', '双鸭山', 2, '0469', '155100', '中国,黑龙江省,双鸭山市', 131.15699768066406, 46.64339828491211, 'Shuangyashan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (713, '230502', '尖山区', '230500', '尖山', 3, '0469', '155100', '中国,黑龙江省,双鸭山市,尖山区', 131.1580047607422, 46.646400451660156, 'Jianshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (714, '230503', '岭东区', '230500', '岭东', 3, '0469', '155120', '中国,黑龙江省,双鸭山市,岭东区', 131.1649932861328, 46.59040069580078, 'Lingdong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (715, '230505', '四方台区', '230500', '四方台', 3, '0469', '155130', '中国,黑龙江省,双鸭山市,四方台区', 131.33599853515625, 46.595001220703125, 'Sifangtai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (716, '230506', '宝山区', '230500', '宝山', 3, '0469', '155131', '中国,黑龙江省,双鸭山市,宝山区', 131.40199279785156, 46.57720184326172, 'Baoshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (717, '230521', '集贤县', '230500', '集贤', 3, '0469', '155900', '中国,黑龙江省,双鸭山市,集贤县', 131.14100646972656, 46.72679901123047, 'Jixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (718, '230522', '友谊县', '230500', '友谊', 3, '0469', '155800', '中国,黑龙江省,双鸭山市,友谊县', 131.80799865722656, 46.767398834228516, 'Youyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (719, '230523', '宝清县', '230500', '宝清', 3, '0469', '155600', '中国,黑龙江省,双鸭山市,宝清县', 132.19700622558594, 46.32720184326172, 'Baoqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (720, '230524', '饶河县', '230500', '饶河', 3, '0469', '155700', '中国,黑龙江省,双鸭山市,饶河县', 134.02000427246094, 46.79899978637695, 'Raohe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (721, '230600', '大庆市', '230000', '大庆', 2, '0459', '163000', '中国,黑龙江省,大庆市', 125.11299896240234, 46.5906982421875, 'Daqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (722, '230602', '萨尔图区', '230600', '萨尔图', 3, '0459', '163001', '中国,黑龙江省,大庆市,萨尔图区', 125.08799743652344, 46.59360122680664, 'Saertu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (723, '230603', '龙凤区', '230600', '龙凤', 3, '0459', '163711', '中国,黑龙江省,大庆市,龙凤区', 125.11699676513672, 46.53269958496094, 'Longfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (724, '230604', '让胡路区', '230600', '让胡路', 3, '0459', '163712', '中国,黑龙江省,大庆市,让胡路区', 124.87100219726562, 46.652198791503906, 'Ranghulu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (725, '230605', '红岗区', '230600', '红岗', 3, '0459', '163511', '中国,黑龙江省,大庆市,红岗区', 124.89199829101562, 46.40129852294922, 'Honggang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (726, '230606', '大同区', '230600', '大同', 3, '0459', '163515', '中国,黑龙江省,大庆市,大同区', 124.81600189208984, 46.03300094604492, 'Datong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (727, '230621', '肇州县', '230600', '肇州', 3, '0459', '166400', '中国,黑龙江省,大庆市,肇州县', 125.27100372314453, 45.7041015625, 'Zhaozhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (728, '230622', '肇源县', '230600', '肇源', 3, '0459', '166500', '中国,黑龙江省,大庆市,肇源县', 125.08499908447266, 45.520301818847656, 'Zhaoyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (729, '230623', '林甸县', '230600', '林甸', 3, '0459', '166300', '中国,黑龙江省,大庆市,林甸县', 124.8759994506836, 47.18600082397461, 'Lindian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (730, '230624', '杜尔伯特蒙古族自治县', '230600', '杜尔伯特', 3, '0459', '166200', '中国,黑龙江省,大庆市,杜尔伯特蒙古族自治县', 124.4489974975586, 46.8651008605957, 'Duerbote'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (731, '230700', '伊春市', '230000', '伊春', 2, '0458', '153000', '中国,黑龙江省,伊春市', 128.8990020751953, 47.72480010986328, 'Yichun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (732, '230702', '伊春区', '230700', '伊春', 3, '0458', '153000', '中国,黑龙江省,伊春市,伊春区', 128.9080047607422, 47.72800064086914, 'Yichun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (733, '230703', '南岔区', '230700', '南岔', 3, '0458', '153100', '中国,黑龙江省,伊春市,南岔区', 129.28399658203125, 47.138999938964844, 'Nancha'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (734, '230704', '友好区', '230700', '友好', 3, '0458', '153031', '中国,黑龙江省,伊春市,友好区', 128.83999633789062, 47.85369873046875, 'Youhao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (735, '230705', '西林区', '230700', '西林', 3, '0458', '153025', '中国,黑龙江省,伊春市,西林区', 129.31199645996094, 47.48099899291992, 'Xilin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (736, '230706', '翠峦区', '230700', '翠峦', 3, '0458', '153013', '中国,黑龙江省,伊春市,翠峦区', 128.66700744628906, 47.724998474121094, 'Cuiluan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (737, '230707', '新青区', '230700', '新青', 3, '0458', '153036', '中国,黑龙江省,伊春市,新青区', 129.53700256347656, 48.29069900512695, 'Xinqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (738, '230708', '美溪区', '230700', '美溪', 3, '0458', '153021', '中国,黑龙江省,伊春市,美溪区', 129.13699340820312, 47.635101318359375, 'Meixi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (739, '230709', '金山屯区', '230700', '金山屯', 3, '0458', '153026', '中国,黑龙江省,伊春市,金山屯区', 129.43800354003906, 47.41350173950195, 'Jinshantun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (740, '230710', '五营区', '230700', '五营', 3, '0458', '153033', '中国,黑龙江省,伊春市,五营区', 129.2449951171875, 48.1078987121582, 'Wuying'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (741, '230711', '乌马河区', '230700', '乌马河', 3, '0458', '153011', '中国,黑龙江省,伊春市,乌马河区', 128.7969970703125, 47.72800064086914, 'Wumahe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (742, '230712', '汤旺河区', '230700', '汤旺河', 3, '0458', '153037', '中国,黑龙江省,伊春市,汤旺河区', 129.57200622558594, 48.45180130004883, 'Tangwanghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (743, '230713', '带岭区', '230700', '带岭', 3, '0458', '153106', '中国,黑龙江省,伊春市,带岭区', 129.0240020751953, 47.0255012512207, 'Dailing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (744, '230714', '乌伊岭区', '230700', '乌伊岭', 3, '0458', '153038', '中国,黑龙江省,伊春市,乌伊岭区', 129.44000244140625, 48.59600067138672, 'Wuyiling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (745, '230715', '红星区', '230700', '红星', 3, '0458', '153035', '中国,黑龙江省,伊春市,红星区', 129.38900756835938, 48.23939895629883, 'Hongxing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (746, '230716', '上甘岭区', '230700', '上甘岭', 3, '0458', '153032', '中国,黑龙江省,伊春市,上甘岭区', 129.0240020751953, 47.97520065307617, 'Shangganling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (747, '230722', '嘉荫县', '230700', '嘉荫', 3, '0458', '153200', '中国,黑龙江省,伊春市,嘉荫县', 130.3979949951172, 48.891700744628906, 'Jiayin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (748, '230781', '铁力市', '230700', '铁力', 3, '0458', '152500', '中国,黑龙江省,伊春市,铁力市', 128.03199768066406, 46.98569869995117, 'Tieli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (749, '230800', '佳木斯市', '230000', '佳木斯', 2, '0454', '154002', '中国,黑龙江省,佳木斯市', 130.36199951171875, 46.809600830078125, 'Jiamusi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (750, '230803', '向阳区', '230800', '向阳', 3, '0454', '154002', '中国,黑龙江省,佳木斯市,向阳区', 130.36500549316406, 46.80780029296875, 'Xiangyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (751, '230804', '前进区', '230800', '前进', 3, '0454', '154002', '中国,黑龙江省,佳木斯市,前进区', 130.375, 46.81399917602539, 'Qianjin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (752, '230805', '东风区', '230800', '东风', 3, '0454', '154005', '中国,黑龙江省,佳木斯市,东风区', 130.4040069580078, 46.822601318359375, 'Dongfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (753, '230811', '郊区', '230800', '郊区', 3, '0454', '154004', '中国,黑龙江省,佳木斯市,郊区', 130.32699584960938, 46.809600830078125, 'Jiaoqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (754, '230822', '桦南县', '230800', '桦南', 3, '0454', '154400', '中国,黑龙江省,佳木斯市,桦南县', 130.5540008544922, 46.239200592041016, 'Huanan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (755, '230826', '桦川县', '230800', '桦川', 3, '0454', '154300', '中国,黑龙江省,佳木斯市,桦川县', 130.718994140625, 47.02299880981445, 'Huachuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (756, '230828', '汤原县', '230800', '汤原', 3, '0454', '154700', '中国,黑龙江省,佳木斯市,汤原县', 129.91000366210938, 46.72760009765625, 'Tangyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (757, '230833', '抚远县', '230800', '抚远', 3, '0454', '156500', '中国,黑龙江省,佳木斯市,抚远县', 134.29600524902344, 48.36790084838867, 'Fuyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (758, '230881', '同江市', '230800', '同江', 3, '0454', '156400', '中国,黑龙江省,佳木斯市,同江市', 132.51100158691406, 47.6421012878418, 'Tongjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (759, '230882', '富锦市', '230800', '富锦', 3, '0454', '156100', '中国,黑龙江省,佳木斯市,富锦市', 132.03700256347656, 47.25130081176758, 'Fujin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (760, '230900', '七台河市', '230000', '七台河', 2, '0464', '154600', '中国,黑龙江省,七台河市', 131.01600646972656, 45.77130126953125, 'Qitaihe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (761, '230902', '新兴区', '230900', '新兴', 3, '0464', '154604', '中国,黑龙江省,七台河市,新兴区', 130.9320068359375, 45.816200256347656, 'Xinxing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (762, '230903', '桃山区', '230900', '桃山', 3, '0464', '154600', '中国,黑龙江省,七台河市,桃山区', 131.01800537109375, 45.767799377441406, 'Taoshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (763, '230904', '茄子河区', '230900', '茄子河', 3, '0464', '154622', '中国,黑龙江省,七台河市,茄子河区', 131.0679931640625, 45.78519821166992, 'Qiezihe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (764, '230921', '勃利县', '230900', '勃利', 3, '0464', '154500', '中国,黑龙江省,七台河市,勃利县', 130.5919952392578, 45.755001068115234, 'Boli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (765, '231000', '牡丹江市', '230000', '牡丹江', 2, '0453', '157000', '中国,黑龙江省,牡丹江市', 129.61900329589844, 44.58300018310547, 'Mudanjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (766, '231002', '东安区', '231000', '东安', 3, '0453', '157000', '中国,黑龙江省,牡丹江市,东安区', 129.6269989013672, 44.581298828125, 'Dong\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (767, '231003', '阳明区', '231000', '阳明', 3, '0453', '157013', '中国,黑龙江省,牡丹江市,阳明区', 129.63499450683594, 44.59600067138672, 'Yangming'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (768, '231004', '爱民区', '231000', '爱民', 3, '0453', '157009', '中国,黑龙江省,牡丹江市,爱民区', 129.59100341796875, 44.596500396728516, 'Aimin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (769, '231005', '西安区', '231000', '西安', 3, '0453', '157000', '中国,黑龙江省,牡丹江市,西安区', 129.61599731445312, 44.577701568603516, 'Xi\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (770, '231024', '东宁县', '231000', '东宁', 3, '0453', '157200', '中国,黑龙江省,牡丹江市,东宁县', 131.1280059814453, 44.06610107421875, 'Dongning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (771, '231025', '林口县', '231000', '林口', 3, '0453', '157600', '中国,黑龙江省,牡丹江市,林口县', 130.28399658203125, 45.278099060058594, 'Linkou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (772, '231081', '绥芬河市', '231000', '绥芬河', 3, '0453', '157300', '中国,黑龙江省,牡丹江市,绥芬河市', 131.1510009765625, 44.412498474121094, 'Suifenhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (773, '231083', '海林市', '231000', '海林', 3, '0453', '157100', '中国,黑龙江省,牡丹江市,海林市', 129.3820037841797, 44.59000015258789, 'Hailin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (774, '231084', '宁安市', '231000', '宁安', 3, '0453', '157400', '中国,黑龙江省,牡丹江市,宁安市', 129.48300170898438, 44.3401985168457, 'Ning\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (775, '231085', '穆棱市', '231000', '穆棱', 3, '0453', '157500', '中国,黑龙江省,牡丹江市,穆棱市', 130.52499389648438, 44.91899871826172, 'Muling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (776, '231100', '黑河市', '230000', '黑河', 2, '0456', '164300', '中国,黑龙江省,黑河市', 127.4990005493164, 50.24959945678711, 'Heihe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (777, '231102', '爱辉区', '231100', '爱辉', 3, '0456', '164300', '中国,黑龙江省,黑河市,爱辉区', 127.5009994506836, 50.25199890136719, 'Aihui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (778, '231121', '嫩江县', '231100', '嫩江', 3, '0456', '161400', '中国,黑龙江省,黑河市,嫩江县', 125.22599792480469, 49.17839813232422, 'Nenjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (779, '231123', '逊克县', '231100', '逊克', 3, '0456', '164400', '中国,黑龙江省,黑河市,逊克县', 128.47900390625, 49.57979965209961, 'Xunke'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (780, '231124', '孙吴县', '231100', '孙吴', 3, '0456', '164200', '中国,黑龙江省,黑河市,孙吴县', 127.33599853515625, 49.42539978027344, 'Sunwu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (781, '231181', '北安市', '231100', '北安', 3, '0456', '164000', '中国,黑龙江省,黑河市,北安市', 126.48200225830078, 48.23870086669922, 'Bei\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (782, '231182', '五大连池市', '231100', '五大连池', 3, '0456', '164100', '中国,黑龙江省,黑河市,五大连池市', 126.2030029296875, 48.515098571777344, 'Wudalianchi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (783, '231200', '绥化市', '230000', '绥化', 2, '0455', '152000', '中国,黑龙江省,绥化市', 126.99299621582031, 46.63740158081055, 'Suihua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (784, '231202', '北林区', '231200', '北林', 3, '0455', '152000', '中国,黑龙江省,绥化市,北林区', 126.98600006103516, 46.637298583984375, 'Beilin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (785, '231221', '望奎县', '231200', '望奎', 3, '0455', '152100', '中国,黑龙江省,绥化市,望奎县', 126.48200225830078, 46.8307991027832, 'Wangkui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (786, '231222', '兰西县', '231200', '兰西', 3, '0455', '151500', '中国,黑龙江省,绥化市,兰西县', 126.29000091552734, 46.252498626708984, 'Lanxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (787, '231223', '青冈县', '231200', '青冈', 3, '0455', '151600', '中国,黑龙江省,绥化市,青冈县', 126.11299896240234, 46.685298919677734, 'Qinggang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (788, '231224', '庆安县', '231200', '庆安', 3, '0455', '152400', '中国,黑龙江省,绥化市,庆安县', 127.50800323486328, 46.88019943237305, 'Qing\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (789, '231225', '明水县', '231200', '明水', 3, '0455', '151700', '中国,黑龙江省,绥化市,明水县', 125.90599822998047, 47.173301696777344, 'Mingshui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (790, '231226', '绥棱县', '231200', '绥棱', 3, '0455', '152200', '中国,黑龙江省,绥化市,绥棱县', 127.11599731445312, 47.242698669433594, 'Suileng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (791, '231281', '安达市', '231200', '安达', 3, '0455', '151400', '中国,黑龙江省,绥化市,安达市', 125.34400177001953, 46.417701721191406, 'Anda'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (792, '231282', '肇东市', '231200', '肇东', 3, '0455', '151100', '中国,黑龙江省,绥化市,肇东市', 125.96199798583984, 46.051300048828125, 'Zhaodong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (793, '231283', '海伦市', '231200', '海伦', 3, '0455', '152300', '中国,黑龙江省,绥化市,海伦市', 126.96800231933594, 47.460899353027344, 'Hailun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (794, '232700', '大兴安岭地区', '230000', '大兴安岭', 2, '0457', '165000', '中国,黑龙江省,大兴安岭地区', 124.71199798583984, 52.33530044555664, 'DaXingAnLing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (795, '232701', '加格达奇区', '232700', '加格达奇', 3, '0457', '165000', '中国,黑龙江省,大兴安岭地区,加格达奇区', 124.30999755859375, 51.98139953613281, 'Jiagedaqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (796, '232702', '新林区', '232700', '新林', 3, '0457', '165000', '中国,黑龙江省,大兴安岭地区,新林区', 124.39800262451172, 51.67340087890625, 'Xinlin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (797, '232703', '松岭区', '232700', '松岭', 3, '0457', '165000', '中国,黑龙江省,大兴安岭地区,松岭区', 124.19000244140625, 51.98550033569336, 'Songling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (798, '232704', '呼中区', '232700', '呼中', 3, '0457', '165000', '中国,黑龙江省,大兴安岭地区,呼中区', 123.5999984741211, 52.03350067138672, 'Huzhong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (799, '232721', '呼玛县', '232700', '呼玛', 3, '0457', '165100', '中国,黑龙江省,大兴安岭地区,呼玛县', 126.66200256347656, 51.73109817504883, 'Huma'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (800, '232722', '塔河县', '232700', '塔河', 3, '0457', '165200', '中国,黑龙江省,大兴安岭地区,塔河县', 124.70999908447266, 52.33430099487305, 'Tahe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (801, '232723', '漠河县', '232700', '漠河', 3, '0457', '165300', '中国,黑龙江省,大兴安岭地区,漠河县', 122.53800201416016, 52.970001220703125, 'Mohe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (802, '310000', '上海市', '100000', '上海', 1, '', '1', '中国,上海', 121.4729995727539, 31.231700897216797, 'Shanghai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (803, '310100', '上海市', '310000', '上海', 2, '021', '200000', '中国,上海,上海市', 121.4729995727539, 31.231700897216797, 'Shanghai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (804, '310101', '黄浦区', '310100', '黄浦', 3, '021', '200001', '中国,上海,上海市,黄浦区', 121.49299621582031, 31.223400115966797, 'Huangpu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (805, '310104', '徐汇区', '310100', '徐汇', 3, '021', '200030', '中国,上海,上海市,徐汇区', 121.43699645996094, 31.18829917907715, 'Xuhui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (806, '310105', '长宁区', '310100', '长宁', 3, '021', '200050', '中国,上海,上海市,长宁区', 121.42500305175781, 31.220399856567383, 'Changning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (807, '310106', '静安区', '310100', '静安', 3, '021', '200040', '中国,上海,上海市,静安区', 121.44400024414062, 31.22879981994629, 'Jing\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (808, '310107', '普陀区', '310100', '普陀', 3, '021', '200333', '中国,上海,上海市,普陀区', 121.39700317382812, 31.249500274658203, 'Putuo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (809, '310108', '闸北区', '310100', '闸北', 3, '021', '200070', '中国,上海,上海市,闸北区', 121.44599914550781, 31.280799865722656, 'Zhabei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (810, '310109', '虹口区', '310100', '虹口', 3, '021', '200086', '中国,上海,上海市,虹口区', 121.48200225830078, 31.27790069580078, 'Hongkou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (811, '310110', '杨浦区', '310100', '杨浦', 3, '021', '200082', '中国,上海,上海市,杨浦区', 121.5260009765625, 31.25950050354004, 'Yangpu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (812, '310112', '闵行区', '310100', '闵行', 3, '021', '201100', '中国,上海,上海市,闵行区', 121.38200378417969, 31.112499237060547, 'Minhang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (813, '310113', '宝山区', '310100', '宝山', 3, '021', '201900', '中国,上海,上海市,宝山区', 121.48899841308594, 31.404499053955078, 'Baoshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (814, '310114', '嘉定区', '310100', '嘉定', 3, '021', '201800', '中国,上海,上海市,嘉定区', 121.26599884033203, 31.37470054626465, 'Jiading'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (815, '310115', '浦东新区', '310100', '浦东', 3, '021', '200135', '中国,上海,上海市,浦东新区', 121.54499816894531, 31.22249984741211, 'Pudong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (816, '310116', '金山区', '310100', '金山', 3, '021', '200540', '中国,上海,上海市,金山区', 121.34200286865234, 30.741600036621094, 'Jinshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (817, '310117', '松江区', '310100', '松江', 3, '021', '201600', '中国,上海,上海市,松江区', 121.22899627685547, 31.03219985961914, 'Songjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (818, '310118', '青浦区', '310100', '青浦', 3, '021', '201700', '中国,上海,上海市,青浦区', 121.1240005493164, 31.149700164794922, 'Qingpu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (819, '310120', '奉贤区', '310100', '奉贤', 3, '021', '201400', '中国,上海,上海市,奉贤区', 121.4739990234375, 30.91790008544922, 'Fengxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (820, '310230', '崇明区', '310100', '崇明', 3, '021', '202150', '中国,上海,上海市,崇明县', 121.39800262451172, 31.622800827026367, 'Chongming'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (821, '320000', '江苏省', '100000', '江苏', 1, '', '1', '中国,江苏省', 118.76699829101562, 32.041500091552734, 'Jiangsu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (822, '320100', '南京市', '320000', '南京', 2, '025', '210008', '中国,江苏省,南京市', 118.76699829101562, 32.041500091552734, 'Nanjing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (823, '320102', '玄武区', '320100', '玄武', 3, '025', '210018', '中国,江苏省,南京市,玄武区', 118.7979965209961, 32.04859924316406, 'Xuanwu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (824, '320104', '秦淮区', '320100', '秦淮', 3, '025', '210001', '中国,江苏省,南京市,秦淮区', 118.7979965209961, 32.01110076904297, 'Qinhuai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (825, '320105', '建邺区', '320100', '建邺', 3, '025', '210004', '中国,江苏省,南京市,建邺区', 118.76599884033203, 32.03099822998047, 'Jianye'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (826, '320106', '鼓楼区', '320100', '鼓楼', 3, '025', '210009', '中国,江苏省,南京市,鼓楼区', 118.7699966430664, 32.06629943847656, 'Gulou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (827, '320111', '浦口区', '320100', '浦口', 3, '025', '211800', '中国,江苏省,南京市,浦口区', 118.62799835205078, 32.058799743652344, 'Pukou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (828, '320113', '栖霞区', '320100', '栖霞', 3, '025', '210046', '中国,江苏省,南京市,栖霞区', 118.88099670410156, 32.11349868774414, 'Qixia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (829, '320114', '雨花台区', '320100', '雨花台', 3, '025', '210012', '中国,江苏省,南京市,雨花台区', 118.77999877929688, 31.992000579833984, 'Yuhuatai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (830, '320115', '江宁区', '320100', '江宁', 3, '025', '211100', '中国,江苏省,南京市,江宁区', 118.83999633789062, 31.952600479125977, 'Jiangning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (831, '320116', '六合区', '320100', '六合', 3, '025', '211500', '中国,江苏省,南京市,六合区', 118.84100341796875, 32.342201232910156, 'Luhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (832, '320117', '溧水区', '320100', '溧水', 3, '025', '211200', '中国,江苏省,南京市,溧水区', 119.02899932861328, 31.653099060058594, 'Lishui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (833, '320118', '高淳区', '320100', '高淳', 3, '025', '211300', '中国,江苏省,南京市,高淳区', 118.8759994506836, 31.32710075378418, 'Gaochun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (834, '320200', '无锡市', '320000', '无锡', 2, '0510', '214000', '中国,江苏省,无锡市', 120.302001953125, 31.57469940185547, 'Wuxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (835, '320202', '崇安区', '320200', '崇安', 3, '0510', '214001', '中国,江苏省,无锡市,崇安区', 120.30000305175781, 31.579999923706055, 'Chong\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (836, '320203', '南长区', '320200', '南长', 3, '0510', '214021', '中国,江苏省,无锡市,南长区', 120.30899810791016, 31.563600540161133, 'Nanchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (837, '320204', '北塘区', '320200', '北塘', 3, '0510', '214044', '中国,江苏省,无锡市,北塘区', 120.29399871826172, 31.605899810791016, 'Beitang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (838, '320205', '锡山区', '320200', '锡山', 3, '0510', '214101', '中国,江苏省,无锡市,锡山区', 120.35700225830078, 31.588600158691406, 'Xishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (839, '320206', '惠山区', '320200', '惠山', 3, '0510', '214174', '中国,江苏省,无锡市,惠山区', 120.2979965209961, 31.68090057373047, 'Huishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (840, '320211', '滨湖区', '320200', '滨湖', 3, '0510', '214123', '中国,江苏省,无锡市,滨湖区', 120.29499816894531, 31.5216007232666, 'Binhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (841, '320281', '江阴市', '320200', '江阴', 3, '0510', '214431', '中国,江苏省,无锡市,江阴市', 120.28500366210938, 31.920000076293945, 'Jiangyin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (842, '320282', '宜兴市', '320200', '宜兴', 3, '0510', '214200', '中国,江苏省,无锡市,宜兴市', 119.8239974975586, 31.339799880981445, 'Yixing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (843, '320300', '徐州市', '320000', '徐州', 2, '0516', '221003', '中国,江苏省,徐州市', 117.18499755859375, 34.26179885864258, 'Xuzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (844, '320302', '鼓楼区', '320300', '鼓楼', 3, '0516', '221005', '中国,江苏省,徐州市,鼓楼区', 117.18599700927734, 34.28850173950195, 'Gulou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (845, '320303', '云龙区', '320300', '云龙', 3, '0516', '221007', '中国,江苏省,徐州市,云龙区', 117.23100280761719, 34.249000549316406, 'Yunlong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (846, '320305', '贾汪区', '320300', '贾汪', 3, '0516', '221003', '中国,江苏省,徐州市,贾汪区', 117.4530029296875, 34.44260025024414, 'Jiawang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (847, '320311', '泉山区', '320300', '泉山', 3, '0516', '221006', '中国,江苏省,徐州市,泉山区', 117.19400024414062, 34.24420166015625, 'Quanshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (848, '320312', '铜山区', '320300', '铜山', 3, '0516', '221106', '中国,江苏省,徐州市,铜山区', 117.18399810791016, 34.192901611328125, 'Tongshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (849, '320321', '丰县', '320300', '丰县', 3, '0516', '221700', '中国,江苏省,徐州市,丰县', 116.5999984741211, 34.69969940185547, 'Fengxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (850, '320322', '沛县', '320300', '沛县', 3, '0516', '221600', '中国,江苏省,徐州市,沛县', 116.93699645996094, 34.72159957885742, 'Peixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (851, '320324', '睢宁县', '320300', '睢宁', 3, '0516', '221200', '中国,江苏省,徐州市,睢宁县', 117.94100189208984, 33.91270065307617, 'Suining'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (852, '320381', '新沂市', '320300', '新沂', 3, '0516', '221400', '中国,江苏省,徐州市,新沂市', 118.3550033569336, 34.36940002441406, 'Xinyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (853, '320382', '邳州市', '320300', '邳州', 3, '0516', '221300', '中国,江苏省,徐州市,邳州市', 117.95899963378906, 34.33330154418945, 'Pizhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (854, '320400', '常州市', '320000', '常州', 2, '0519', '213000', '中国,江苏省,常州市', 119.9469985961914, 31.77280044555664, 'Changzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (855, '320402', '天宁区', '320400', '天宁', 3, '0519', '213000', '中国,江苏省,常州市,天宁区', 119.95099639892578, 31.752099990844727, 'Tianning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (856, '320404', '钟楼区', '320400', '钟楼', 3, '0519', '213023', '中国,江苏省,常州市,钟楼区', 119.9020004272461, 31.802200317382812, 'Zhonglou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (857, '320405', '戚墅堰区', '320400', '戚墅堰', 3, '0519', '213025', '中国,江苏省,常州市,戚墅堰区', 120.06099700927734, 31.719600677490234, 'Qishuyan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (858, '320411', '新北区', '320400', '新北', 3, '0519', '213022', '中国,江苏省,常州市,新北区', 119.97100067138672, 31.83049964904785, 'Xinbei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (859, '320412', '武进区', '320400', '武进', 3, '0519', '213100', '中国,江苏省,常州市,武进区', 119.94200134277344, 31.700899124145508, 'Wujin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (860, '320481', '溧阳市', '320400', '溧阳', 3, '0519', '213300', '中国,江苏省,常州市,溧阳市', 119.48400115966797, 31.4153995513916, 'Liyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (861, '320482', '金坛市', '320400', '金坛', 3, '0519', '213200', '中国,江苏省,常州市,金坛市', 119.5780029296875, 31.740400314331055, 'Jintan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (862, '320500', '苏州市', '320000', '苏州', 2, '0512', '215002', '中国,江苏省,苏州市', 120.62000274658203, 31.299400329589844, 'Suzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (863, '320505', '虎丘区', '320500', '虎丘', 3, '0512', '215004', '中国,江苏省,苏州市,虎丘区', 120.572998046875, 31.295299530029297, 'Huqiu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (864, '320506', '吴中区', '320500', '吴中', 3, '0512', '215128', '中国,江苏省,苏州市,吴中区', 120.63200378417969, 31.262300491333008, 'Wuzhong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (865, '320507', '相城区', '320500', '相城', 3, '0512', '215131', '中国,江苏省,苏州市,相城区', 120.64199829101562, 31.368900299072266, 'Xiangcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (866, '320508', '姑苏区', '320500', '姑苏', 3, '0512', '215031', '中国,江苏省,苏州市,姑苏区', 120.62000274658203, 31.299400329589844, 'Gusu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (867, '320509', '吴江区', '320500', '吴江', 3, '0512', '215200', '中国,江苏省,苏州市,吴江区', 120.63800048828125, 31.159799575805664, 'Wujiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (868, '320581', '常熟市', '320500', '常熟', 3, '0512', '215500', '中国,江苏省,苏州市,常熟市', 120.75199890136719, 31.65369987487793, 'Changshu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (869, '320582', '张家港市', '320500', '张家港', 3, '0512', '215600', '中国,江苏省,苏州市,张家港市', 120.55500030517578, 31.87529945373535, 'Zhangjiagang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (870, '320583', '昆山市', '320500', '昆山', 3, '0512', '215300', '中国,江苏省,苏州市,昆山市', 120.98100280761719, 31.384599685668945, 'Kunshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (871, '320585', '太仓市', '320500', '太仓', 3, '0512', '215400', '中国,江苏省,苏州市,太仓市', 121.10900115966797, 31.44969940185547, 'Taicang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (872, '320600', '南通市', '320000', '南通', 2, '0513', '226001', '中国,江苏省,南通市', 120.86499786376953, 32.01620101928711, 'Nantong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (873, '320602', '崇川区', '320600', '崇川', 3, '0513', '226001', '中国,江苏省,南通市,崇川区', 120.85700225830078, 32.00979995727539, 'Chongchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (874, '320611', '港闸区', '320600', '港闸', 3, '0513', '226001', '中国,江苏省,南通市,港闸区', 120.81800079345703, 32.03160095214844, 'Gangzha'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (875, '320612', '通州区', '320600', '通州', 3, '0513', '226300', '中国,江苏省,南通市,通州区', 121.072998046875, 32.06760025024414, 'Tongzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (876, '320621', '海安县', '320600', '海安', 3, '0513', '226600', '中国,江苏省,南通市,海安县', 120.45899963378906, 32.545101165771484, 'Hai\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (877, '320623', '如东县', '320600', '如东', 3, '0513', '226400', '中国,江苏省,南通市,如东县', 121.18900299072266, 32.31439971923828, 'Rudong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (878, '320681', '启东市', '320600', '启东', 3, '0513', '226200', '中国,江苏省,南通市,启东市', 121.66000366210938, 31.810800552368164, 'Qidong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (879, '320682', '如皋市', '320600', '如皋', 3, '0513', '226500', '中国,江苏省,南通市,如皋市', 120.55999755859375, 32.375999450683594, 'Rugao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (880, '320684', '海门市', '320600', '海门', 3, '0513', '226100', '中国,江苏省,南通市,海门市', 121.16999816894531, 31.89419937133789, 'Haimen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (881, '320700', '连云港市', '320000', '连云港', 2, '0518', '222002', '中国,江苏省,连云港市', 119.17900085449219, 34.599998474121094, 'Lianyungang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (882, '320703', '连云区', '320700', '连云', 3, '0518', '222042', '中国,江苏省,连云港市,连云区', 119.37300109863281, 34.752899169921875, 'Lianyun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (883, '320706', '海州区', '320700', '海州', 3, '0518', '222003', '中国,江苏省,连云港市,海州区', 119.13099670410156, 34.56990051269531, 'Haizhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (884, '320707', '赣榆区', '320700', '赣榆', 3, '0518', '222100', '中国,江苏省,连云港市,赣榆区', 119.12899780273438, 34.83919906616211, 'Ganyu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (885, '320722', '东海县', '320700', '东海', 3, '0518', '222300', '中国,江苏省,连云港市,东海县', 118.77100372314453, 34.54209899902344, 'Donghai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (886, '320723', '灌云县', '320700', '灌云', 3, '0518', '222200', '中国,江苏省,连云港市,灌云县', 119.23899841308594, 34.28390121459961, 'Guanyun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (887, '320724', '灌南县', '320700', '灌南', 3, '0518', '222500', '中国,江苏省,连云港市,灌南县', 119.35600280761719, 34.09000015258789, 'Guannan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (888, '320800', '淮安市', '320000', '淮安', 2, '0517', '223001', '中国,江苏省,淮安市', 119.02100372314453, 33.59749984741211, 'Huai\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (889, '320802', '清河区', '320800', '清河', 3, '0517', '223001', '中国,江苏省,淮安市,清河区', 119.00800323486328, 33.5994987487793, 'Qinghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (890, '320803', '淮安区', '320800', '淮安', 3, '0517', '223200', '中国,江苏省,淮安市,淮安区', 119.02100372314453, 33.59749984741211, 'Huai\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (891, '320804', '淮阴区', '320800', '淮阴', 3, '0517', '223300', '中国,江苏省,淮安市,淮阴区', 119.03500366210938, 33.63169860839844, 'Huaiyin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (892, '320811', '清浦区', '320800', '清浦', 3, '0517', '223002', '中国,江苏省,淮安市,清浦区', 119.0260009765625, 33.55229949951172, 'Qingpu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (893, '320826', '涟水县', '320800', '涟水', 3, '0517', '223400', '中国,江苏省,淮安市,涟水县', 119.26100158691406, 33.78089904785156, 'Lianshui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (894, '320829', '洪泽县', '320800', '洪泽', 3, '0517', '223100', '中国,江苏省,淮安市,洪泽县', 118.87300109863281, 33.2943000793457, 'Hongze'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (895, '320830', '盱眙县', '320800', '盱眙', 3, '0517', '211700', '中国,江苏省,淮安市,盱眙县', 118.54499816894531, 33.01089859008789, 'Xuyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (896, '320831', '金湖县', '320800', '金湖', 3, '0517', '211600', '中国,江苏省,淮安市,金湖县', 119.02300262451172, 33.02220153808594, 'Jinhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (897, '320900', '盐城市', '320000', '盐城', 2, '0515', '224005', '中国,江苏省,盐城市', 120.13999938964844, 33.377601623535156, 'Yancheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (898, '320902', '亭湖区', '320900', '亭湖', 3, '0515', '224005', '中国,江苏省,盐城市,亭湖区', 120.16600036621094, 33.378299713134766, 'Tinghu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (899, '320903', '盐都区', '320900', '盐都', 3, '0515', '224055', '中国,江苏省,盐城市,盐都区', 120.15399932861328, 33.33729934692383, 'Yandu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (900, '320921', '响水县', '320900', '响水', 3, '0515', '224600', '中国,江苏省,盐城市,响水县', 119.56999969482422, 34.205101013183594, 'Xiangshui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (901, '320922', '滨海县', '320900', '滨海', 3, '0515', '224500', '中国,江苏省,盐城市,滨海县', 119.82099914550781, 33.98970031738281, 'Binhai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (902, '320923', '阜宁县', '320900', '阜宁', 3, '0515', '224400', '中国,江苏省,盐城市,阜宁县', 119.802001953125, 33.78229904174805, 'Funing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (903, '320924', '射阳县', '320900', '射阳', 3, '0515', '224300', '中国,江苏省,盐城市,射阳县', 120.26000213623047, 33.77640151977539, 'Sheyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (904, '320925', '建湖县', '320900', '建湖', 3, '0515', '224700', '中国,江苏省,盐城市,建湖县', 119.79900360107422, 33.4724006652832, 'Jianhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (905, '320981', '东台市', '320900', '东台', 3, '0515', '224200', '中国,江苏省,盐城市,东台市', 120.3239974975586, 32.850799560546875, 'Dongtai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (906, '320982', '大丰市', '320900', '大丰', 3, '0515', '224100', '中国,江苏省,盐城市,大丰市', 120.46600341796875, 33.19889831542969, 'Dafeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (907, '321000', '扬州市', '320000', '扬州', 2, '0514', '225002', '中国,江苏省,扬州市', 119.4209976196289, 32.3931999206543, 'Yangzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (908, '321002', '广陵区', '321000', '广陵', 3, '0514', '225002', '中国,江苏省,扬州市,广陵区', 119.43199920654297, 32.39469909667969, 'Guangling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (909, '321003', '邗江区', '321000', '邗江', 3, '0514', '225002', '中国,江苏省,扬州市,邗江区', 119.39800262451172, 32.37649917602539, 'Hanjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (910, '321012', '江都区', '321000', '江都', 3, '0514', '225200', '中国,江苏省,扬州市,江都区', 119.56700134277344, 32.42660140991211, 'Jiangdu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (911, '321023', '宝应县', '321000', '宝应', 3, '0514', '225800', '中国,江苏省,扬州市,宝应县', 119.31199645996094, 33.23550033569336, 'Baoying'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (912, '321081', '仪征市', '321000', '仪征', 3, '0514', '211400', '中国,江苏省,扬州市,仪征市', 119.18399810791016, 32.27199935913086, 'Yizheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (913, '321084', '高邮市', '321000', '高邮', 3, '0514', '225600', '中国,江苏省,扬州市,高邮市', 119.45999908447266, 32.78129959106445, 'Gaoyou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (914, '321100', '镇江市', '320000', '镇江', 2, '0511', '212004', '中国,江苏省,镇江市', 119.4530029296875, 32.20439910888672, 'Zhenjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (915, '321102', '京口区', '321100', '京口', 3, '0511', '212003', '中国,江苏省,镇江市,京口区', 119.46900177001953, 32.19810104370117, 'Jingkou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (916, '321111', '润州区', '321100', '润州', 3, '0511', '212005', '中国,江苏省,镇江市,润州区', 119.41100311279297, 32.1952018737793, 'Runzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (917, '321112', '丹徒区', '321100', '丹徒', 3, '0511', '212028', '中国,江苏省,镇江市,丹徒区', 119.43399810791016, 32.13180160522461, 'Dantu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (918, '321181', '丹阳市', '321100', '丹阳', 3, '0511', '212300', '中国,江苏省,镇江市,丹阳市', 119.57499694824219, 31.991199493408203, 'Danyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (919, '321182', '扬中市', '321100', '扬中', 3, '0511', '212200', '中国,江苏省,镇江市,扬中市', 119.7969970703125, 32.23630142211914, 'Yangzhong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (920, '321183', '句容市', '321100', '句容', 3, '0511', '212400', '中国,江苏省,镇江市,句容市', 119.16500091552734, 31.955900192260742, 'Jurong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (921, '321200', '泰州市', '320000', '泰州', 2, '0523', '225300', '中国,江苏省,泰州市', 119.91500091552734, 32.484901428222656, 'Taizhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (922, '321202', '海陵区', '321200', '海陵', 3, '0523', '225300', '中国,江苏省,泰州市,海陵区', 119.91899871826172, 32.49100112915039, 'Hailing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (923, '321203', '高港区', '321200', '高港', 3, '0523', '225321', '中国,江苏省,泰州市,高港区', 119.88099670410156, 32.31829833984375, 'Gaogang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (924, '321204', '姜堰区', '321200', '姜堰', 3, '0523', '225500', '中国,江苏省,泰州市,姜堰区', 120.14800262451172, 32.50849914550781, 'Jiangyan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (925, '321281', '兴化市', '321200', '兴化', 3, '0523', '225700', '中国,江苏省,泰州市,兴化市', 119.85199737548828, 32.909400939941406, 'Xinghua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (926, '321282', '靖江市', '321200', '靖江', 3, '0523', '214500', '中国,江苏省,泰州市,靖江市', 120.27300262451172, 32.015899658203125, 'Jingjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (927, '321283', '泰兴市', '321200', '泰兴', 3, '0523', '225400', '中国,江苏省,泰州市,泰兴市', 120.052001953125, 32.17190170288086, 'Taixing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (928, '321300', '宿迁市', '320000', '宿迁', 2, '0527', '223800', '中国,江苏省,宿迁市', 118.29299926757812, 33.9452018737793, 'Suqian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (929, '321302', '宿城区', '321300', '宿城', 3, '0527', '223800', '中国,江苏省,宿迁市,宿城区', 118.29100036621094, 33.94219970703125, 'Sucheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (930, '321311', '宿豫区', '321300', '宿豫', 3, '0527', '223800', '中国,江苏省,宿迁市,宿豫区', 118.3290023803711, 33.94670104980469, 'Suyu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (931, '321322', '沭阳县', '321300', '沭阳', 3, '0527', '223600', '中国,江苏省,宿迁市,沭阳县', 118.76899719238281, 34.114498138427734, 'Shuyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (932, '321323', '泗阳县', '321300', '泗阳', 3, '0527', '223700', '中国,江苏省,宿迁市,泗阳县', 118.7030029296875, 33.72100067138672, 'Siyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (933, '321324', '泗洪县', '321300', '泗洪', 3, '0527', '223900', '中国,江苏省,宿迁市,泗洪县', 118.21700286865234, 33.459999084472656, 'Sihong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (934, '330000', '浙江省', '100000', '浙江', 1, '', '1', '中国,浙江省', 120.15399932861328, 30.287500381469727, 'Zhejiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (935, '330100', '杭州市', '330000', '杭州', 2, '0571', '310026', '中国,浙江省,杭州市', 120.15399932861328, 30.287500381469727, 'Hangzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (936, '330102', '上城区', '330100', '上城', 3, '0571', '310002', '中国,浙江省,杭州市,上城区', 120.16899871826172, 30.24250030517578, 'Shangcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (937, '330103', '下城区', '330100', '下城', 3, '0571', '310006', '中国,浙江省,杭州市,下城区', 120.18099975585938, 30.2814998626709, 'Xiacheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (938, '330104', '江干区', '330100', '江干', 3, '0571', '310016', '中国,浙江省,杭州市,江干区', 120.20500183105469, 30.257200241088867, 'Jianggan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (939, '330105', '拱墅区', '330100', '拱墅', 3, '0571', '310011', '中国,浙江省,杭州市,拱墅区', 120.14199829101562, 30.319700241088867, 'Gongshu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (940, '330106', '西湖区', '330100', '西湖', 3, '0571', '310013', '中国,浙江省,杭州市,西湖区', 120.12999725341797, 30.25950050354004, 'Xihu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (941, '330108', '滨江区', '330100', '滨江', 3, '0571', '310051', '中国,浙江省,杭州市,滨江区', 120.21199798583984, 30.20829963684082, 'Binjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (942, '330109', '萧山区', '330100', '萧山', 3, '0571', '311200', '中国,浙江省,杭州市,萧山区', 120.26499938964844, 30.184999465942383, 'Xiaoshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (943, '330110', '余杭区', '330100', '余杭', 3, '0571', '311100', '中国,浙江省,杭州市,余杭区', 120.30000305175781, 30.41830062866211, 'Yuhang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (944, '330122', '桐庐县', '330100', '桐庐', 3, '0571', '311500', '中国,浙江省,杭州市,桐庐县', 119.68900299072266, 29.797800064086914, 'Tonglu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (945, '330127', '淳安县', '330100', '淳安', 3, '0571', '311700', '中国,浙江省,杭州市,淳安县', 119.04299926757812, 29.609899520874023, 'Chun\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (946, '330182', '建德市', '330100', '建德', 3, '0571', '311600', '中国,浙江省,杭州市,建德市', 119.28199768066406, 29.47599983215332, 'Jiande'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (947, '330183', '富阳区', '330100', '富阳', 3, '0571', '311400', '中国,浙江省,杭州市,富阳区', 119.95999908447266, 30.048799514770508, 'Fuyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (948, '330185', '临安市', '330100', '临安', 3, '0571', '311300', '中国,浙江省,杭州市,临安市', 119.7249984741211, 30.234500885009766, 'Lin\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (949, '330200', '宁波市', '330000', '宁波', 2, '0574', '315000', '中国,浙江省,宁波市', 121.55000305175781, 29.86840057373047, 'Ningbo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (950, '330203', '海曙区', '330200', '海曙', 3, '0574', '315000', '中国,浙江省,宁波市,海曙区', 121.5510025024414, 29.859800338745117, 'Haishu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (951, '330204', '江东区', '330200', '江东', 3, '0574', '315040', '中国,浙江省,宁波市,江东区', 121.56999969482422, 29.867000579833984, 'Jiangdong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (952, '330205', '江北区', '330200', '江北', 3, '0574', '315020', '中国,浙江省,宁波市,江北区', 121.55699920654297, 29.887800216674805, 'Jiangbei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (953, '330206', '北仑区', '330200', '北仑', 3, '0574', '315800', '中国,浙江省,宁波市,北仑区', 121.84400177001953, 29.900699615478516, 'Beilun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (954, '330211', '镇海区', '330200', '镇海', 3, '0574', '315200', '中国,浙江省,宁波市,镇海区', 121.71600341796875, 29.94890022277832, 'Zhenhai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (955, '330212', '鄞州区', '330200', '鄞州', 3, '0574', '315100', '中国,浙江省,宁波市,鄞州区', 121.5479965209961, 29.816099166870117, 'Yinzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (956, '330225', '象山县', '330200', '象山', 3, '0574', '315700', '中国,浙江省,宁波市,象山县', 121.86900329589844, 29.47760009765625, 'Xiangshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (957, '330226', '宁海县', '330200', '宁海', 3, '0574', '315600', '中国,浙江省,宁波市,宁海县', 121.43099975585938, 29.28890037536621, 'Ninghai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (958, '330281', '余姚市', '330200', '余姚', 3, '0574', '315400', '中国,浙江省,宁波市,余姚市', 121.15299987792969, 30.038700103759766, 'Yuyao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (959, '330282', '慈溪市', '330200', '慈溪', 3, '0574', '315300', '中国,浙江省,宁波市,慈溪市', 121.26599884033203, 30.169599533081055, 'Cixi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (960, '330283', '奉化市', '330200', '奉化', 3, '0574', '315500', '中国,浙江省,宁波市,奉化市', 121.41000366210938, 29.655399322509766, 'Fenghua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (961, '330300', '温州市', '330000', '温州', 2, '0577', '325000', '中国,浙江省,温州市', 120.6719970703125, 28.000600814819336, 'Wenzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (962, '330302', '鹿城区', '330300', '鹿城', 3, '0577', '325000', '中国,浙江省,温州市,鹿城区', 120.65499877929688, 28.01490020751953, 'Lucheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (963, '330303', '龙湾区', '330300', '龙湾', 3, '0577', '325013', '中国,浙江省,温州市,龙湾区', 120.83100128173828, 27.912799835205078, 'Longwan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (964, '330304', '瓯海区', '330300', '瓯海', 3, '0577', '325005', '中国,浙江省,温州市,瓯海区', 120.63800048828125, 28.007099151611328, 'Ouhai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (965, '330322', '洞头县', '330300', '洞头', 3, '0577', '325700', '中国,浙江省,温州市,洞头县', 121.15599822998047, 27.836299896240234, 'Dongtou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (966, '330324', '永嘉县', '330300', '永嘉', 3, '0577', '325100', '中国,浙江省,温州市,永嘉县', 120.69300079345703, 28.154600143432617, 'Yongjia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (967, '330326', '平阳县', '330300', '平阳', 3, '0577', '325400', '中国,浙江省,温州市,平阳县', 120.56500244140625, 27.662500381469727, 'Pingyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (968, '330327', '苍南县', '330300', '苍南', 3, '0577', '325800', '中国,浙江省,温州市,苍南县', 120.4260025024414, 27.51740074157715, 'Cangnan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (969, '330328', '文成县', '330300', '文成', 3, '0577', '325300', '中国,浙江省,温州市,文成县', 120.09100341796875, 27.786800384521484, 'Wencheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (970, '330329', '泰顺县', '330300', '泰顺', 3, '0577', '325500', '中国,浙江省,温州市,泰顺县', 119.71800231933594, 27.556900024414062, 'Taishun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (971, '330381', '瑞安市', '330300', '瑞安', 3, '0577', '325200', '中国,浙江省,温州市,瑞安市', 120.65499877929688, 27.780399322509766, 'Rui\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (972, '330382', '乐清市', '330300', '乐清', 3, '0577', '325600', '中国,浙江省,温州市,乐清市', 120.96199798583984, 28.124000549316406, 'Yueqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (973, '330400', '嘉兴市', '330000', '嘉兴', 2, '0573', '314000', '中国,浙江省,嘉兴市', 120.7509994506836, 30.762699127197266, 'Jiaxing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (974, '330402', '南湖区', '330400', '南湖', 3, '0573', '314051', '中国,浙江省,嘉兴市,南湖区', 120.78500366210938, 30.748600006103516, 'Nanhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (975, '330411', '秀洲区', '330400', '秀洲', 3, '0573', '314031', '中国,浙江省,嘉兴市,秀洲区', 120.70899963378906, 30.76449966430664, 'Xiuzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (976, '330421', '嘉善县', '330400', '嘉善', 3, '0573', '314100', '中国,浙江省,嘉兴市,嘉善县', 120.9260025024414, 30.82990074157715, 'Jiashan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (977, '330424', '海盐县', '330400', '海盐', 3, '0573', '314300', '中国,浙江省,嘉兴市,海盐县', 120.94599914550781, 30.52549934387207, 'Haiyan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (978, '330481', '海宁市', '330400', '海宁', 3, '0573', '314400', '中国,浙江省,嘉兴市,海宁市', 120.68099975585938, 30.509700775146484, 'Haining'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (979, '330482', '平湖市', '330400', '平湖', 3, '0573', '314200', '中国,浙江省,嘉兴市,平湖市', 121.02200317382812, 30.696199417114258, 'Pinghu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (980, '330483', '桐乡市', '330400', '桐乡', 3, '0573', '314500', '中国,浙江省,嘉兴市,桐乡市', 120.56500244140625, 30.630199432373047, 'Tongxiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (981, '330500', '湖州市', '330000', '湖州', 2, '0572', '313000', '中国,浙江省,湖州市', 120.10199737548828, 30.86720085144043, 'Huzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (982, '330502', '吴兴区', '330500', '吴兴', 3, '0572', '313000', '中国,浙江省,湖州市,吴兴区', 120.125, 30.857500076293945, 'Wuxing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (983, '330503', '南浔区', '330500', '南浔', 3, '0572', '313009', '中国,浙江省,湖州市,南浔区', 120.41999816894531, 30.866899490356445, 'Nanxun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (984, '330521', '德清县', '330500', '德清', 3, '0572', '313200', '中国,浙江省,湖州市,德清县', 119.97799682617188, 30.533700942993164, 'Deqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (985, '330522', '长兴县', '330500', '长兴', 3, '0572', '313100', '中国,浙江省,湖州市,长兴县', 119.90799713134766, 31.006099700927734, 'Changxing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (986, '330523', '安吉县', '330500', '安吉', 3, '0572', '313300', '中国,浙江省,湖州市,安吉县', 119.68199920654297, 30.63800048828125, 'Anji'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (987, '330600', '绍兴市', '330000', '绍兴', 2, '0575', '312000', '中国,浙江省,绍兴市', 120.58200073242188, 29.997100830078125, 'Shaoxing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (988, '330602', '越城区', '330600', '越城', 3, '0575', '312000', '中国,浙江省,绍兴市,越城区', 120.58200073242188, 29.98900032043457, 'Yuecheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (989, '330603', '柯桥区', '330600', '柯桥', 3, '0575', '312030', '中国,浙江省,绍兴市,柯桥区', 120.49299621582031, 30.087600708007812, 'Keqiao '); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (990, '330604', '上虞区', '330600', '上虞', 3, '0575', '312300', '中国,浙江省,绍兴市,上虞区', 120.47599792480469, 30.077999114990234, 'Shangyu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (991, '330624', '新昌县', '330600', '新昌', 3, '0575', '312500', '中国,浙江省,绍兴市,新昌县', 120.90399932861328, 29.499900817871094, 'Xinchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (992, '330681', '诸暨市', '330600', '诸暨', 3, '0575', '311800', '中国,浙江省,绍兴市,诸暨市', 120.23600006103516, 29.713600158691406, 'Zhuji'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (993, '330683', '嵊州市', '330600', '嵊州', 3, '0575', '312400', '中国,浙江省,绍兴市,嵊州市', 120.8219985961914, 29.588499069213867, 'Shengzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (994, '330700', '金华市', '330000', '金华', 2, '0579', '321000', '中国,浙江省,金华市', 119.6500015258789, 29.089500427246094, 'Jinhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (995, '330702', '婺城区', '330700', '婺城', 3, '0579', '321000', '中国,浙江省,金华市,婺城区', 119.57099914550781, 29.095199584960938, 'Wucheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (996, '330703', '金东区', '330700', '金东', 3, '0579', '321000', '中国,浙江省,金华市,金东区', 119.69300079345703, 29.09910011291504, 'Jindong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (997, '330723', '武义县', '330700', '武义', 3, '0579', '321200', '中国,浙江省,金华市,武义县', 119.81600189208984, 28.893299102783203, 'Wuyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (998, '330726', '浦江县', '330700', '浦江', 3, '0579', '322200', '中国,浙江省,金华市,浦江县', 119.89199829101562, 29.453500747680664, 'Pujiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (999, '330727', '磐安县', '330700', '磐安', 3, '0579', '322300', '中国,浙江省,金华市,磐安县', 120.44999694824219, 29.057300567626953, 'Pan\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1000, '330781', '兰溪市', '330700', '兰溪', 3, '0579', '321100', '中国,浙江省,金华市,兰溪市', 119.45999908447266, 29.20840072631836, 'Lanxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1001, '330782', '义乌市', '330700', '义乌', 3, '0579', '322000', '中国,浙江省,金华市,义乌市', 120.0739974975586, 29.305599212646484, 'Yiwu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1002, '330783', '东阳市', '330700', '东阳', 3, '0579', '322100', '中国,浙江省,金华市,东阳市', 120.24199676513672, 29.289400100708008, 'Dongyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1003, '330784', '永康市', '330700', '永康', 3, '0579', '321300', '中国,浙江省,金华市,永康市', 120.0469970703125, 28.888399124145508, 'Yongkang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1004, '330800', '衢州市', '330000', '衢州', 2, '0570', '324002', '中国,浙江省,衢州市', 118.87300109863281, 28.941699981689453, 'Quzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1005, '330802', '柯城区', '330800', '柯城', 3, '0570', '324100', '中国,浙江省,衢州市,柯城区', 118.87100219726562, 28.968599319458008, 'Kecheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1006, '330803', '衢江区', '330800', '衢江', 3, '0570', '324022', '中国,浙江省,衢州市,衢江区', 118.95999908447266, 28.979799270629883, 'Qujiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1007, '330822', '常山县', '330800', '常山', 3, '0570', '324200', '中国,浙江省,衢州市,常山县', 118.51000213623047, 28.901899337768555, 'Changshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1008, '330824', '开化县', '330800', '开化', 3, '0570', '324300', '中国,浙江省,衢州市,开化县', 118.41600036621094, 29.137800216674805, 'Kaihua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1009, '330825', '龙游县', '330800', '龙游', 3, '0570', '324400', '中国,浙江省,衢州市,龙游县', 119.1719970703125, 29.028200149536133, 'Longyou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1010, '330881', '江山市', '330800', '江山', 3, '0570', '324100', '中国,浙江省,衢州市,江山市', 118.62699890136719, 28.73859977722168, 'Jiangshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1011, '330900', '舟山市', '330000', '舟山', 2, '0580', '316000', '中国,浙江省,舟山市', 122.10700225830078, 30.016000747680664, 'Zhoushan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1012, '330902', '定海区', '330900', '定海', 3, '0580', '316000', '中国,浙江省,舟山市,定海区', 122.10700225830078, 30.019800186157227, 'Dinghai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1013, '330903', '普陀区', '330900', '普陀', 3, '0580', '316100', '中国,浙江省,舟山市,普陀区', 122.3030014038086, 29.949100494384766, 'Putuo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1014, '330921', '岱山县', '330900', '岱山', 3, '0580', '316200', '中国,浙江省,舟山市,岱山县', 122.20500183105469, 30.243900299072266, 'Daishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1015, '330922', '嵊泗县', '330900', '嵊泗', 3, '0580', '202450', '中国,浙江省,舟山市,嵊泗县', 122.45099639892578, 30.7268009185791, 'Shengsi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1016, '331000', '台州市', '330000', '台州', 2, '0576', '318000', '中国,浙江省,台州市', 121.42900085449219, 28.661399841308594, 'Taizhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1017, '331002', '椒江区', '331000', '椒江', 3, '0576', '318000', '中国,浙江省,台州市,椒江区', 121.44300079345703, 28.67300033569336, 'Jiaojiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1018, '331003', '黄岩区', '331000', '黄岩', 3, '0576', '318020', '中国,浙江省,台州市,黄岩区', 121.25900268554688, 28.650800704956055, 'Huangyan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1019, '331004', '路桥区', '331000', '路桥', 3, '0576', '318050', '中国,浙江省,台州市,路桥区', 121.3740005493164, 28.5802001953125, 'Luqiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1020, '331021', '玉环县', '331000', '玉环', 3, '0576', '317600', '中国,浙江省,台州市,玉环县', 121.23200225830078, 28.13640022277832, 'Yuhuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1021, '331022', '三门县', '331000', '三门', 3, '0576', '317100', '中国,浙江省,台州市,三门县', 121.39399719238281, 29.105100631713867, 'Sanmen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1022, '331023', '天台县', '331000', '天台', 3, '0576', '317200', '中国,浙江省,台州市,天台县', 121.00800323486328, 29.142900466918945, 'Tiantai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1023, '331024', '仙居县', '331000', '仙居', 3, '0576', '317300', '中国,浙江省,台州市,仙居县', 120.72899627685547, 28.84670066833496, 'Xianju'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1024, '331081', '温岭市', '331000', '温岭', 3, '0576', '317500', '中国,浙江省,台州市,温岭市', 121.38600158691406, 28.37179946899414, 'Wenling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1025, '331082', '临海市', '331000', '临海', 3, '0576', '317000', '中国,浙江省,台州市,临海市', 121.13899993896484, 28.856000900268555, 'Linhai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1026, '331100', '丽水市', '330000', '丽水', 2, '0578', '323000', '中国,浙江省,丽水市', 119.9219970703125, 28.45199966430664, 'Lishui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1027, '331102', '莲都区', '331100', '莲都', 3, '0578', '323000', '中国,浙江省,丽水市,莲都区', 119.91300201416016, 28.44580078125, 'Liandu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1028, '331121', '青田县', '331100', '青田', 3, '0578', '323900', '中国,浙江省,丽水市,青田县', 120.29000091552734, 28.138999938964844, 'Qingtian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1029, '331122', '缙云县', '331100', '缙云', 3, '0578', '321400', '中国,浙江省,丽水市,缙云县', 120.08999633789062, 28.659400939941406, 'Jinyun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1030, '331123', '遂昌县', '331100', '遂昌', 3, '0578', '323300', '中国,浙江省,丽水市,遂昌县', 119.2760009765625, 28.592899322509766, 'Suichang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1031, '331124', '松阳县', '331100', '松阳', 3, '0578', '323400', '中国,浙江省,丽水市,松阳县', 119.48200225830078, 28.449399948120117, 'Songyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1032, '331125', '云和县', '331100', '云和', 3, '0578', '323600', '中国,浙江省,丽水市,云和县', 119.572998046875, 28.11639976501465, 'Yunhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1033, '331126', '庆元县', '331100', '庆元', 3, '0578', '323800', '中国,浙江省,丽水市,庆元县', 119.06300354003906, 27.61840057373047, 'Qingyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1034, '331127', '景宁畲族自治县', '331100', '景宁', 3, '0578', '323500', '中国,浙江省,丽水市,景宁畲族自治县', 119.63800048828125, 27.973899841308594, 'Jingning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1035, '331181', '龙泉市', '331100', '龙泉', 3, '0578', '323700', '中国,浙江省,丽水市,龙泉市', 119.14199829101562, 28.07430076599121, 'Longquan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1036, '331200', '舟山群岛新区', '330000', '舟山新区', 2, '0580', '316000', '中国,浙江省,舟山群岛新区', 122.31800079345703, 29.813199996948242, 'Zhoushan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1037, '331201', '金塘岛', '331200', '金塘', 3, '0580', '316000', '中国,浙江省,舟山群岛新区,金塘岛', 121.89299774169922, 30.040599822998047, 'Jintang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1038, '331202', '六横岛', '331200', '六横', 3, '0580', '316000', '中国,浙江省,舟山群岛新区,六横岛', 122.14299774169922, 29.662900924682617, 'Liuheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1039, '331203', '衢山岛', '331200', '衢山', 3, '0580', '316000', '中国,浙江省,舟山群岛新区,衢山岛', 122.35800170898438, 30.44260025024414, 'Qushan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1040, '331204', '舟山本岛西北部', '331200', '舟山', 3, '0580', '316000', '中国,浙江省,舟山群岛新区,舟山本岛西北部', 122.03099822998047, 30.140399932861328, 'Zhoushan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1041, '331205', '岱山岛西南部', '331200', '岱山', 3, '0580', '316000', '中国,浙江省,舟山群岛新区,岱山岛西南部', 122.18000030517578, 30.277299880981445, 'Daishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1042, '331206', '泗礁岛', '331200', '泗礁', 3, '0580', '316000', '中国,浙江省,舟山群岛新区,泗礁岛', 122.45800018310547, 30.725099563598633, 'Sijiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1043, '331207', '朱家尖岛', '331200', '朱家尖', 3, '0580', '316000', '中国,浙江省,舟山群岛新区,朱家尖岛', 122.39099884033203, 29.91629981994629, 'Zhujiajian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1044, '331208', '洋山岛', '331200', '洋山', 3, '0580', '316000', '中国,浙江省,舟山群岛新区,洋山岛', 121.99600219726562, 30.094600677490234, 'Yangshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1045, '331209', '长涂岛', '331200', '长涂', 3, '0580', '316000', '中国,浙江省,舟山群岛新区,长涂岛', 122.28500366210938, 30.248899459838867, 'Changtu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1046, '331210', '虾峙岛', '331200', '虾峙', 3, '0580', '316000', '中国,浙江省,舟山群岛新区,虾峙岛', 122.24500274658203, 29.752899169921875, 'Xiazhi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1047, '340000', '安徽省', '100000', '安徽', 1, '', '1', '中国,安徽省', 117.28299713134766, 31.8612003326416, 'Anhui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1048, '340100', '合肥市', '340000', '合肥', 2, '0551', '230001', '中国,安徽省,合肥市', 117.28299713134766, 31.8612003326416, 'Hefei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1049, '340102', '瑶海区', '340100', '瑶海', 3, '0551', '230011', '中国,安徽省,合肥市,瑶海区', 117.30899810791016, 31.85810089111328, 'Yaohai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1050, '340103', '庐阳区', '340100', '庐阳', 3, '0551', '230001', '中国,安徽省,合肥市,庐阳区', 117.26499938964844, 31.878700256347656, 'Luyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1051, '340104', '蜀山区', '340100', '蜀山', 3, '0551', '230031', '中国,安徽省,合肥市,蜀山区', 117.26100158691406, 31.851200103759766, 'Shushan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1052, '340111', '包河区', '340100', '包河', 3, '0551', '230041', '中国,安徽省,合肥市,包河区', 117.30999755859375, 31.795000076293945, 'Baohe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1053, '340121', '长丰县', '340100', '长丰', 3, '0551', '231100', '中国,安徽省,合肥市,长丰县', 117.16500091552734, 32.47959899902344, 'Changfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1054, '340122', '肥东县', '340100', '肥东', 3, '0551', '231600', '中国,安徽省,合肥市,肥东县', 117.47100067138672, 31.885299682617188, 'Feidong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1055, '340123', '肥西县', '340100', '肥西', 3, '0551', '231200', '中国,安徽省,合肥市,肥西县', 117.16799926757812, 31.721399307250977, 'Feixi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1056, '340124', '庐江县', '340100', '庐江', 3, '0565', '231500', '中国,安徽省,合肥市,庐江县', 117.29000091552734, 31.25149917602539, 'Lujiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1057, '340181', '巢湖市', '340100', '巢湖', 3, '0565', '238000', '中国,安徽省,合肥市,巢湖市', 117.8740005493164, 31.600500106811523, 'Chaohu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1058, '340200', '芜湖市', '340000', '芜湖', 2, '0551', '241000', '中国,安徽省,芜湖市', 118.3759994506836, 31.3262996673584, 'Wuhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1059, '340202', '镜湖区', '340200', '镜湖', 3, '0553', '241000', '中国,安徽省,芜湖市,镜湖区', 118.38500213623047, 31.34040069580078, 'Jinghu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1060, '340203', '弋江区', '340200', '弋江', 3, '0553', '241000', '中国,安徽省,芜湖市,弋江区', 118.37300109863281, 31.311800003051758, 'Yijiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1061, '340207', '鸠江区', '340200', '鸠江', 3, '0553', '241000', '中国,安徽省,芜湖市,鸠江区', 118.39199829101562, 31.369300842285156, 'Jiujiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1062, '340208', '三山区', '340200', '三山', 3, '0553', '241000', '中国,安徽省,芜湖市,三山区', 118.2249984741211, 31.207000732421875, 'Sanshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1063, '340221', '芜湖县', '340200', '芜湖', 3, '0553', '241100', '中国,安徽省,芜湖市,芜湖县', 118.57499694824219, 31.13479995727539, 'Wuhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1064, '340222', '繁昌县', '340200', '繁昌', 3, '0553', '241200', '中国,安徽省,芜湖市,繁昌县', 118.19999694824219, 31.083200454711914, 'Fanchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1065, '340223', '南陵县', '340200', '南陵', 3, '0553', '242400', '中国,安徽省,芜湖市,南陵县', 118.33699798583984, 30.919700622558594, 'Nanling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1066, '340225', '无为县', '340200', '无为', 3, '0565', '238300', '中国,安徽省,芜湖市,无为县', 117.91100311279297, 31.3031005859375, 'Wuwei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1067, '340300', '蚌埠市', '340000', '蚌埠', 2, '0552', '233000', '中国,安徽省,蚌埠市', 117.36199951171875, 32.933998107910156, 'Bengbu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1068, '340302', '龙子湖区', '340300', '龙子湖', 3, '0552', '233000', '中国,安徽省,蚌埠市,龙子湖区', 117.39399719238281, 32.94300079345703, 'Longzihu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1069, '340303', '蚌山区', '340300', '蚌山', 3, '0552', '233000', '中国,安徽省,蚌埠市,蚌山区', 117.36799621582031, 32.94409942626953, 'Bengshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1070, '340304', '禹会区', '340300', '禹会', 3, '0552', '233010', '中国,安徽省,蚌埠市,禹会区', 117.35299682617188, 32.93339920043945, 'Yuhui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1071, '340311', '淮上区', '340300', '淮上', 3, '0552', '233002', '中国,安徽省,蚌埠市,淮上区', 117.36000061035156, 32.96419906616211, 'Huaishang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1072, '340321', '怀远县', '340300', '怀远', 3, '0552', '233400', '中国,安徽省,蚌埠市,怀远县', 117.20500183105469, 32.97010040283203, 'Huaiyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1073, '340322', '五河县', '340300', '五河', 3, '0552', '233300', '中国,安徽省,蚌埠市,五河县', 117.89099884033203, 33.14459991455078, 'Wuhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1074, '340323', '固镇县', '340300', '固镇', 3, '0552', '233700', '中国,安徽省,蚌埠市,固镇县', 117.31600189208984, 33.31800079345703, 'Guzhen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1075, '340400', '淮南市', '340000', '淮南', 2, '0554', '232001', '中国,安徽省,淮南市', 117.0250015258789, 32.64590072631836, 'Huainan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1076, '340402', '大通区', '340400', '大通', 3, '0554', '232033', '中国,安徽省,淮南市,大通区', 117.0530014038086, 32.632598876953125, 'Datong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1077, '340403', '田家庵区', '340400', '田家庵', 3, '0554', '232000', '中国,安徽省,淮南市,田家庵区', 117.01699829101562, 32.64699935913086, 'Tianjiaan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1078, '340404', '谢家集区', '340400', '谢家集', 3, '0554', '232052', '中国,安徽省,淮南市,谢家集区', 116.86399841308594, 32.598201751708984, 'Xiejiaji'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1079, '340405', '八公山区', '340400', '八公山', 3, '0554', '232072', '中国,安徽省,淮南市,八公山区', 116.83699798583984, 32.629398345947266, 'Bagongshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1080, '340406', '潘集区', '340400', '潘集', 3, '0554', '232082', '中国,安徽省,淮南市,潘集区', 116.81600189208984, 32.782901763916016, 'Panji'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1081, '340421', '凤台县', '340400', '凤台', 3, '0554', '232100', '中国,安徽省,淮南市,凤台县', 116.71600341796875, 32.70750045776367, 'Fengtai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1082, '340500', '马鞍山市', '340000', '马鞍山', 2, '0555', '243001', '中国,安徽省,马鞍山市', 118.50800323486328, 31.68939971923828, 'Ma\'anshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1083, '340503', '花山区', '340500', '花山', 3, '0555', '243000', '中国,安徽省,马鞍山市,花山区', 118.51200103759766, 31.70009994506836, 'Huashan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1084, '340504', '雨山区', '340500', '雨山', 3, '0555', '243071', '中国,安徽省,马鞍山市,雨山区', 118.4990005493164, 31.682199478149414, 'Yushan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1085, '340506', '博望区', '340500', '博望', 3, '0555', '243131', '中国,安徽省,马鞍山市,博望区', 118.84400177001953, 31.561899185180664, 'Bowang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1086, '340521', '当涂县', '340500', '当涂', 3, '0555', '243100', '中国,安徽省,马鞍山市,当涂县', 118.49800109863281, 31.570999145507812, 'Dangtu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1087, '340522', '含山县', '340500', '含山', 3, '0555', '238100', '中国,安徽省,马鞍山市,含山县', 118.10600280761719, 31.727800369262695, 'Hanshan '); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1088, '340523', '和县', '340500', '和县', 3, '0555', '238200', '中国,安徽省,马鞍山市,和县', 118.35099792480469, 31.74180030822754, 'Hexian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1089, '340600', '淮北市', '340000', '淮北', 2, '0561', '235000', '中国,安徽省,淮北市', 116.79499816894531, 33.97169876098633, 'Huaibei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1090, '340602', '杜集区', '340600', '杜集', 3, '0561', '235000', '中国,安徽省,淮北市,杜集区', 116.83000183105469, 33.99359893798828, 'Duji'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1091, '340603', '相山区', '340600', '相山', 3, '0561', '235000', '中国,安徽省,淮北市,相山区', 116.79499816894531, 33.959800720214844, 'Xiangshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1092, '340604', '烈山区', '340600', '烈山', 3, '0561', '235000', '中国,安徽省,淮北市,烈山区', 116.81400299072266, 33.89360046386719, 'Lieshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1093, '340621', '濉溪县', '340600', '濉溪', 3, '0561', '235100', '中国,安徽省,淮北市,濉溪县', 116.76799774169922, 33.91460037231445, 'Suixi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1094, '340700', '铜陵市', '340000', '铜陵', 2, '0562', '244000', '中国,安徽省,铜陵市', 117.81700134277344, 30.929899215698242, 'Tongling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1095, '340702', '铜官山区', '340700', '铜官山', 3, '0562', '244000', '中国,安徽省,铜陵市,铜官山区', 117.81500244140625, 30.934200286865234, 'Tongguanshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1096, '340703', '狮子山区', '340700', '狮子山', 3, '0562', '244000', '中国,安徽省,铜陵市,狮子山区', 117.89199829101562, 30.926300048828125, 'Shizishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1097, '340711', '郊区', '340700', '郊区', 3, '0562', '244000', '中国,安徽省,铜陵市,郊区', 117.80899810791016, 30.9197998046875, 'Jiaoqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1098, '340721', '铜陵县', '340700', '铜陵', 3, '0562', '244100', '中国,安徽省,铜陵市,铜陵县', 117.79100036621094, 30.95359992980957, 'Tongling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1099, '340800', '安庆市', '340000', '安庆', 2, '0556', '246001', '中国,安徽省,安庆市', 117.05400085449219, 30.524799346923828, 'Anqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1100, '340802', '迎江区', '340800', '迎江', 3, '0556', '246001', '中国,安徽省,安庆市,迎江区', 117.04900360107422, 30.504199981689453, 'Yingjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1101, '340803', '大观区', '340800', '大观', 3, '0556', '246002', '中国,安徽省,安庆市,大观区', 117.03399658203125, 30.51219940185547, 'Daguan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1102, '340811', '宜秀区', '340800', '宜秀', 3, '0556', '246003', '中国,安徽省,安庆市,宜秀区', 117.06099700927734, 30.50779914855957, 'Yixiu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1103, '340822', '怀宁县', '340800', '怀宁', 3, '0556', '246100', '中国,安徽省,安庆市,怀宁县', 116.83000183105469, 30.733800888061523, 'Huaining'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1104, '340823', '枞阳县', '340800', '枞阳', 3, '0556', '246700', '中国,安徽省,安庆市,枞阳县', 117.22000122070312, 30.699600219726562, 'Zongyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1105, '340824', '潜山县', '340800', '潜山', 3, '0556', '246300', '中国,安徽省,安庆市,潜山县', 116.57599639892578, 30.630399703979492, 'Qianshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1106, '340825', '太湖县', '340800', '太湖', 3, '0556', '246400', '中国,安徽省,安庆市,太湖县', 116.30899810791016, 30.454099655151367, 'Taihu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1107, '340826', '宿松县', '340800', '宿松', 3, '0556', '246500', '中国,安徽省,安庆市,宿松县', 116.12899780273438, 30.153600692749023, 'Susong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1108, '340827', '望江县', '340800', '望江', 3, '0556', '246200', '中国,安徽省,安庆市,望江县', 116.68800354003906, 30.125900268554688, 'Wangjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1109, '340828', '岳西县', '340800', '岳西', 3, '0556', '246600', '中国,安徽省,安庆市,岳西县', 116.36000061035156, 30.84980010986328, 'Yuexi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1110, '340881', '桐城市', '340800', '桐城', 3, '0556', '231400', '中国,安徽省,安庆市,桐城市', 116.95099639892578, 31.052200317382812, 'Tongcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1111, '341000', '黄山市', '340000', '黄山', 2, '0559', '245000', '中国,安徽省,黄山市', 118.31700134277344, 29.709199905395508, 'Huangshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1112, '341002', '屯溪区', '341000', '屯溪', 3, '0559', '245000', '中国,安徽省,黄山市,屯溪区', 118.33399963378906, 29.71139907836914, 'Tunxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1113, '341003', '黄山区', '341000', '黄山', 3, '0559', '242700', '中国,安徽省,黄山市,黄山区', 118.14199829101562, 30.272899627685547, 'Huangshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1114, '341004', '徽州区', '341000', '徽州', 3, '0559', '245061', '中国,安徽省,黄山市,徽州区', 118.33699798583984, 29.827800750732422, 'Huizhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1115, '341021', '歙县', '341000', '歙县', 3, '0559', '245200', '中国,安徽省,黄山市,歙县', 118.43699645996094, 29.86750030517578, 'Shexian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1116, '341022', '休宁县', '341000', '休宁', 3, '0559', '245400', '中国,安徽省,黄山市,休宁县', 118.18099975585938, 29.786100387573242, 'Xiuning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1117, '341023', '黟县', '341000', '黟县', 3, '0559', '245500', '中国,安徽省,黄山市,黟县', 117.94100189208984, 29.925899505615234, 'Yixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1118, '341024', '祁门县', '341000', '祁门', 3, '0559', '245600', '中国,安徽省,黄山市,祁门县', 117.71800231933594, 29.857200622558594, 'Qimen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1119, '341100', '滁州市', '340000', '滁州', 2, '0550', '239000', '中国,安徽省,滁州市', 118.31600189208984, 32.3036003112793, 'Chuzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1120, '341102', '琅琊区', '341100', '琅琊', 3, '0550', '239000', '中国,安徽省,滁州市,琅琊区', 118.30500030517578, 32.29520034790039, 'Langya'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1121, '341103', '南谯区', '341100', '南谯', 3, '0550', '239000', '中国,安徽省,滁州市,南谯区', 118.31199645996094, 32.318599700927734, 'Nanqiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1122, '341122', '来安县', '341100', '来安', 3, '0550', '239200', '中国,安徽省,滁州市,来安县', 118.43399810791016, 32.45180130004883, 'Lai\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1123, '341124', '全椒县', '341100', '全椒', 3, '0550', '239500', '中国,安徽省,滁州市,全椒县', 118.27300262451172, 32.085201263427734, 'Quanjiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1124, '341125', '定远县', '341100', '定远', 3, '0550', '233200', '中国,安徽省,滁州市,定远县', 117.68000030517578, 32.524898529052734, 'Dingyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1125, '341126', '凤阳县', '341100', '凤阳', 3, '0550', '233100', '中国,安徽省,滁州市,凤阳县', 117.56500244140625, 32.8651008605957, 'Fengyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1126, '341181', '天长市', '341100', '天长', 3, '0550', '239300', '中国,安徽省,滁州市,天长市', 118.9990005493164, 32.691200256347656, 'Tianchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1127, '341182', '明光市', '341100', '明光', 3, '0550', '239400', '中国,安徽省,滁州市,明光市', 117.99099731445312, 32.7781982421875, 'Mingguang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1128, '341200', '阜阳市', '340000', '阜阳', 2, '0558', '236033', '中国,安徽省,阜阳市', 115.81999969482422, 32.89699935913086, 'Fuyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1129, '341202', '颍州区', '341200', '颍州', 3, '0558', '236001', '中国,安徽省,阜阳市,颍州区', 115.80699920654297, 32.88349914550781, 'Yingzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1130, '341203', '颍东区', '341200', '颍东', 3, '0558', '236058', '中国,安徽省,阜阳市,颍东区', 115.85700225830078, 32.91299819946289, 'Yingdong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1131, '341204', '颍泉区', '341200', '颍泉', 3, '0558', '236045', '中国,安徽省,阜阳市,颍泉区', 115.80699920654297, 32.92490005493164, 'Yingquan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1132, '341221', '临泉县', '341200', '临泉', 3, '0558', '236400', '中国,安徽省,阜阳市,临泉县', 115.26200103759766, 33.06760025024414, 'Linquan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1133, '341222', '太和县', '341200', '太和', 3, '0558', '236600', '中国,安徽省,阜阳市,太和县', 115.62200164794922, 33.160301208496094, 'Taihe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1134, '341225', '阜南县', '341200', '阜南', 3, '0558', '236300', '中国,安徽省,阜阳市,阜南县', 115.58599853515625, 32.635501861572266, 'Funan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1135, '341226', '颍上县', '341200', '颍上', 3, '0558', '236200', '中国,安徽省,阜阳市,颍上县', 116.26499938964844, 32.630001068115234, 'Yingshang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1136, '341282', '界首市', '341200', '界首', 3, '0558', '236500', '中国,安徽省,阜阳市,界首市', 115.3740005493164, 33.25709915161133, 'Jieshou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1137, '341300', '宿州市', '340000', '宿州', 2, '0557', '234000', '中国,安徽省,宿州市', 116.98400115966797, 33.6338996887207, 'Suzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1138, '341302', '埇桥区', '341300', '埇桥', 3, '0557', '234000', '中国,安徽省,宿州市,埇桥区', 116.97699737548828, 33.64059829711914, 'Yongqiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1139, '341321', '砀山县', '341300', '砀山', 3, '0557', '235300', '中国,安徽省,宿州市,砀山县', 116.35399627685547, 34.42359924316406, 'Dangshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1140, '341322', '萧县', '341300', '萧县', 3, '0557', '235200', '中国,安徽省,宿州市,萧县', 116.94499969482422, 34.18790054321289, 'Xiaoxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1141, '341323', '灵璧县', '341300', '灵璧', 3, '0557', '234200', '中国,安徽省,宿州市,灵璧县', 117.55799865722656, 33.543399810791016, 'Lingbi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1142, '341324', '泗县', '341300', '泗县', 3, '0557', '234300', '中国,安徽省,宿州市,泗县', 117.91000366210938, 33.4828987121582, 'Sixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1143, '341500', '六安市', '340000', '六安', 2, '0564', '237000', '中国,安徽省,六安市', 116.50800323486328, 31.752899169921875, 'Lu\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1144, '341502', '金安区', '341500', '金安', 3, '0564', '237005', '中国,安徽省,六安市,金安区', 116.50900268554688, 31.755699157714844, 'Jin\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1145, '341503', '裕安区', '341500', '裕安', 3, '0564', '237010', '中国,安徽省,六安市,裕安区', 116.4800033569336, 31.737899780273438, 'Yu\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1146, '341521', '寿县', '341500', '寿县', 3, '0564', '232200', '中国,安徽省,六安市,寿县', 116.78500366210938, 32.576499938964844, 'Shouxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1147, '341522', '霍邱县', '341500', '霍邱', 3, '0564', '237400', '中国,安徽省,六安市,霍邱县', 116.27799987792969, 32.35300064086914, 'Huoqiu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1148, '341523', '舒城县', '341500', '舒城', 3, '0564', '231300', '中国,安徽省,六安市,舒城县', 116.94499969482422, 31.464099884033203, 'Shucheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1149, '341524', '金寨县', '341500', '金寨', 3, '0564', '237300', '中国,安徽省,六安市,金寨县', 115.93499755859375, 31.73509979248047, 'Jinzhai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1150, '341525', '霍山县', '341500', '霍山', 3, '0564', '237200', '中国,安徽省,六安市,霍山县', 116.33300018310547, 31.392900466918945, 'Huoshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1151, '341600', '亳州市', '340000', '亳州', 2, '0558', '236802', '中国,安徽省,亳州市', 115.78299713134766, 33.869300842285156, 'Bozhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1152, '341602', '谯城区', '341600', '谯城', 3, '0558', '236800', '中国,安徽省,亳州市,谯城区', 115.77899932861328, 33.875301361083984, 'Qiaocheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1153, '341621', '涡阳县', '341600', '涡阳', 3, '0558', '233600', '中国,安徽省,亳州市,涡阳县', 116.21700286865234, 33.50910186767578, 'Guoyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1154, '341622', '蒙城县', '341600', '蒙城', 3, '0558', '233500', '中国,安徽省,亳州市,蒙城县', 116.56500244140625, 33.264801025390625, 'Mengcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1155, '341623', '利辛县', '341600', '利辛', 3, '0558', '236700', '中国,安徽省,亳州市,利辛县', 116.20800018310547, 33.141998291015625, 'Lixin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1156, '341700', '池州市', '340000', '池州', 2, '0566', '247100', '中国,安徽省,池州市', 117.48899841308594, 30.6560001373291, 'Chizhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1157, '341702', '贵池区', '341700', '贵池', 3, '0566', '247100', '中国,安徽省,池州市,贵池区', 117.48699951171875, 30.652799606323242, 'Guichi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1158, '341721', '东至县', '341700', '东至', 3, '0566', '247200', '中国,安徽省,池州市,东至县', 117.0270004272461, 30.096900939941406, 'Dongzhi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1159, '341722', '石台县', '341700', '石台', 3, '0566', '245100', '中国,安徽省,池州市,石台县', 117.48699951171875, 30.210399627685547, 'Shitai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1160, '341723', '青阳县', '341700', '青阳', 3, '0566', '242800', '中国,安徽省,池州市,青阳县', 117.84700012207031, 30.639299392700195, 'Qingyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1161, '341800', '宣城市', '340000', '宣城', 2, '0563', '242000', '中国,安徽省,宣城市', 118.75800323486328, 30.94569969177246, 'Xuancheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1162, '341802', '宣州区', '341800', '宣州', 3, '0563', '242000', '中国,安徽省,宣城市,宣州区', 118.75499725341797, 30.944400787353516, 'Xuanzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1163, '341821', '郎溪县', '341800', '郎溪', 3, '0563', '242100', '中国,安徽省,宣城市,郎溪县', 119.17900085449219, 31.125999450683594, 'Langxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1164, '341822', '广德县', '341800', '广德', 3, '0563', '242200', '中国,安徽省,宣城市,广德县', 119.41799926757812, 30.893699645996094, 'Guangde'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1165, '341823', '泾县', '341800', '泾县', 3, '0563', '242500', '中国,安徽省,宣城市,泾县', 118.41999816894531, 30.69499969482422, 'Jingxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1166, '341824', '绩溪县', '341800', '绩溪', 3, '0563', '245300', '中国,安徽省,宣城市,绩溪县', 118.5979995727539, 30.07069969177246, 'Jixi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1167, '341825', '旌德县', '341800', '旌德', 3, '0563', '242600', '中国,安徽省,宣城市,旌德县', 118.54299926757812, 30.288999557495117, 'Jingde'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1168, '341881', '宁国市', '341800', '宁国', 3, '0563', '242300', '中国,安徽省,宣城市,宁国市', 118.98300170898438, 30.62380027770996, 'Ningguo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1169, '350000', '福建省', '100000', '福建', 1, '', '1', '中国,福建省', 119.30599975585938, 26.075300216674805, 'Fujian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1170, '350100', '福州市', '350000', '福州', 2, '0591', '350001', '中国,福建省,福州市', 119.30599975585938, 26.075300216674805, 'Fuzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1171, '350102', '鼓楼区', '350100', '鼓楼', 3, '0591', '350001', '中国,福建省,福州市,鼓楼区', 119.30400085449219, 26.082300186157227, 'Gulou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1172, '350103', '台江区', '350100', '台江', 3, '0591', '350004', '中国,福建省,福州市,台江区', 119.30899810791016, 26.062000274658203, 'Taijiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1173, '350104', '仓山区', '350100', '仓山', 3, '0591', '350007', '中国,福建省,福州市,仓山区', 119.31500244140625, 26.043399810791016, 'Cangshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1174, '350105', '马尾区', '350100', '马尾', 3, '0591', '350015', '中国,福建省,福州市,马尾区', 119.45500183105469, 25.98940086364746, 'Mawei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1175, '350111', '晋安区', '350100', '晋安', 3, '0591', '350011', '中国,福建省,福州市,晋安区', 119.3280029296875, 26.08180046081543, 'Jin\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1176, '350121', '闽侯县', '350100', '闽侯', 3, '0591', '350100', '中国,福建省,福州市,闽侯县', 119.13400268554688, 26.150100708007812, 'Minhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1177, '350122', '连江县', '350100', '连江', 3, '0591', '350500', '中国,福建省,福州市,连江县', 119.53399658203125, 26.194700241088867, 'Lianjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1178, '350123', '罗源县', '350100', '罗源', 3, '0591', '350600', '中国,福建省,福州市,罗源县', 119.5510025024414, 26.487499237060547, 'Luoyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1179, '350124', '闽清县', '350100', '闽清', 3, '0591', '350800', '中国,福建省,福州市,闽清县', 118.86199951171875, 26.2189998626709, 'Minqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1180, '350125', '永泰县', '350100', '永泰', 3, '0591', '350700', '中国,福建省,福州市,永泰县', 118.93599700927734, 25.868200302124023, 'Yongtai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1181, '350128', '平潭县', '350100', '平潭', 3, '0591', '350400', '中国,福建省,福州市,平潭县', 119.79100036621094, 25.503700256347656, 'Pingtan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1182, '350181', '福清市', '350100', '福清', 3, '0591', '350300', '中国,福建省,福州市,福清市', 119.38500213623047, 25.72089958190918, 'Fuqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1183, '350182', '长乐市', '350100', '长乐', 3, '0591', '350200', '中国,福建省,福州市,长乐市', 119.52300262451172, 25.962799072265625, 'Changle'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1184, '350200', '厦门市', '350000', '厦门', 2, '0592', '361003', '中国,福建省,厦门市', 118.11000061035156, 24.49049949645996, 'Xiamen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1185, '350203', '思明区', '350200', '思明', 3, '0592', '361001', '中国,福建省,厦门市,思明区', 118.08200073242188, 24.44540023803711, 'Siming'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1186, '350205', '海沧区', '350200', '海沧', 3, '0592', '361026', '中国,福建省,厦门市,海沧区', 118.03299713134766, 24.484600067138672, 'Haicang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1187, '350206', '湖里区', '350200', '湖里', 3, '0592', '361006', '中国,福建省,厦门市,湖里区', 118.14600372314453, 24.512500762939453, 'Huli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1188, '350211', '集美区', '350200', '集美', 3, '0592', '361021', '中国,福建省,厦门市,集美区', 118.09700012207031, 24.5757999420166, 'Jimei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1189, '350212', '同安区', '350200', '同安', 3, '0592', '361100', '中国,福建省,厦门市,同安区', 118.1520004272461, 24.723100662231445, 'Tong\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1190, '350213', '翔安区', '350200', '翔安', 3, '0592', '361101', '中国,福建省,厦门市,翔安区', 118.24800109863281, 24.618600845336914, 'Xiang\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1191, '350300', '莆田市', '350000', '莆田', 2, '0594', '351100', '中国,福建省,莆田市', 119.00800323486328, 25.430999755859375, 'Putian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1192, '350302', '城厢区', '350300', '城厢', 3, '0594', '351100', '中国,福建省,莆田市,城厢区', 118.99500274658203, 25.418699264526367, 'Chengxiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1193, '350303', '涵江区', '350300', '涵江', 3, '0594', '351111', '中国,福建省,莆田市,涵江区', 119.11599731445312, 25.458799362182617, 'Hanjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1194, '350304', '荔城区', '350300', '荔城', 3, '0594', '351100', '中国,福建省,莆田市,荔城区', 119.01300048828125, 25.433700561523438, 'Licheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1195, '350305', '秀屿区', '350300', '秀屿', 3, '0594', '351152', '中国,福建省,莆田市,秀屿区', 119.10600280761719, 25.318300247192383, 'Xiuyu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1196, '350322', '仙游县', '350300', '仙游', 3, '0594', '351200', '中国,福建省,莆田市,仙游县', 118.69200134277344, 25.36210060119629, 'Xianyou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1197, '350400', '三明市', '350000', '三明', 2, '0598', '365000', '中国,福建省,三明市', 117.63500213623047, 26.265399932861328, 'Sanming'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1198, '350402', '梅列区', '350400', '梅列', 3, '0598', '365000', '中国,福建省,三明市,梅列区', 117.64600372314453, 26.271699905395508, 'Meilie'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1199, '350403', '三元区', '350400', '三元', 3, '0598', '365001', '中国,福建省,三明市,三元区', 117.60800170898438, 26.233699798583984, 'Sanyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1200, '350421', '明溪县', '350400', '明溪', 3, '0598', '365200', '中国,福建省,三明市,明溪县', 117.20500183105469, 26.3528995513916, 'Mingxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1201, '350423', '清流县', '350400', '清流', 3, '0598', '365300', '中国,福建省,三明市,清流县', 116.81500244140625, 26.17140007019043, 'Qingliu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1202, '350424', '宁化县', '350400', '宁化', 3, '0598', '365400', '中国,福建省,三明市,宁化县', 116.66100311279297, 26.258699417114258, 'Ninghua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1203, '350425', '大田县', '350400', '大田', 3, '0598', '366100', '中国,福建省,三明市,大田县', 117.84700012207031, 25.69260025024414, 'Datian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1204, '350426', '尤溪县', '350400', '尤溪', 3, '0598', '365100', '中国,福建省,三明市,尤溪县', 118.19000244140625, 26.170000076293945, 'Youxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1205, '350427', '沙县', '350400', '沙县', 3, '0598', '365500', '中国,福建省,三明市,沙县', 117.79299926757812, 26.39620018005371, 'Shaxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1206, '350428', '将乐县', '350400', '将乐', 3, '0598', '353300', '中国,福建省,三明市,将乐县', 117.4729995727539, 26.7283992767334, 'Jiangle'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1207, '350429', '泰宁县', '350400', '泰宁', 3, '0598', '354400', '中国,福建省,三明市,泰宁县', 117.1760025024414, 26.900100708007812, 'Taining'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1208, '350430', '建宁县', '350400', '建宁', 3, '0598', '354500', '中国,福建省,三明市,建宁县', 116.84600067138672, 26.830900192260742, 'Jianning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1209, '350481', '永安市', '350400', '永安', 3, '0598', '366000', '中国,福建省,三明市,永安市', 117.36499786376953, 25.9414005279541, 'Yong\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1210, '350500', '泉州市', '350000', '泉州', 2, '0595', '362000', '中国,福建省,泉州市', 118.58899688720703, 24.908899307250977, 'Quanzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1211, '350502', '鲤城区', '350500', '鲤城', 3, '0595', '362000', '中国,福建省,泉州市,鲤城区', 118.56600189208984, 24.887399673461914, 'Licheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1212, '350503', '丰泽区', '350500', '丰泽', 3, '0595', '362000', '中国,福建省,泉州市,丰泽区', 118.61299896240234, 24.891199111938477, 'Fengze'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1213, '350504', '洛江区', '350500', '洛江', 3, '0595', '362011', '中国,福建省,泉州市,洛江区', 118.6709976196289, 24.939800262451172, 'Luojiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1214, '350505', '泉港区', '350500', '泉港', 3, '0595', '362114', '中国,福建省,泉州市,泉港区', 118.91600036621094, 25.120100021362305, 'Quangang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1215, '350521', '惠安县', '350500', '惠安', 3, '0595', '362100', '中国,福建省,泉州市,惠安县', 118.7969970703125, 25.03059959411621, 'Hui\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1216, '350524', '安溪县', '350500', '安溪', 3, '0595', '362400', '中国,福建省,泉州市,安溪县', 118.18699645996094, 25.056299209594727, 'Anxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1217, '350525', '永春县', '350500', '永春', 3, '0595', '362600', '中国,福建省,泉州市,永春县', 118.29399871826172, 25.321800231933594, 'Yongchun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1218, '350526', '德化县', '350500', '德化', 3, '0595', '362500', '中国,福建省,泉州市,德化县', 118.24199676513672, 25.49220085144043, 'Dehua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1219, '350527', '金门县', '350500', '金门', 3, '', '', '中国,福建省,泉州市,金门县', 118.322998046875, 24.42919921875, 'Jinmen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1220, '350581', '石狮市', '350500', '石狮', 3, '0595', '362700', '中国,福建省,泉州市,石狮市', 118.64800262451172, 24.73240089416504, 'Shishi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1221, '350582', '晋江市', '350500', '晋江', 3, '0595', '362200', '中国,福建省,泉州市,晋江市', 118.552001953125, 24.781400680541992, 'Jinjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1222, '350583', '南安市', '350500', '南安', 3, '0595', '362300', '中国,福建省,泉州市,南安市', 118.38600158691406, 24.960599899291992, 'Nan\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1223, '350600', '漳州市', '350000', '漳州', 2, '0596', '363005', '中国,福建省,漳州市', 117.66200256347656, 24.510900497436523, 'Zhangzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1224, '350602', '芗城区', '350600', '芗城', 3, '0596', '363000', '中国,福建省,漳州市,芗城区', 117.65399932861328, 24.510799407958984, 'Xiangcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1225, '350603', '龙文区', '350600', '龙文', 3, '0596', '363005', '中国,福建省,漳州市,龙文区', 117.70999908447266, 24.50320053100586, 'Longwen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1226, '350622', '云霄县', '350600', '云霄', 3, '0596', '363300', '中国,福建省,漳州市,云霄县', 117.34100341796875, 23.955299377441406, 'Yunxiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1227, '350623', '漳浦县', '350600', '漳浦', 3, '0596', '363200', '中国,福建省,漳州市,漳浦县', 117.61399841308594, 24.11709976196289, 'Zhangpu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1228, '350624', '诏安县', '350600', '诏安', 3, '0596', '363500', '中国,福建省,漳州市,诏安县', 117.17500305175781, 23.71150016784668, 'Zhao\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1229, '350625', '长泰县', '350600', '长泰', 3, '0596', '363900', '中国,福建省,漳州市,长泰县', 117.75900268554688, 24.62529945373535, 'Changtai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1230, '350626', '东山县', '350600', '东山', 3, '0596', '363400', '中国,福建省,漳州市,东山县', 117.4280014038086, 23.701099395751953, 'Dongshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1231, '350627', '南靖县', '350600', '南靖', 3, '0596', '363600', '中国,福建省,漳州市,南靖县', 117.35700225830078, 24.51449966430664, 'Nanjing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1232, '350628', '平和县', '350600', '平和', 3, '0596', '363700', '中国,福建省,漳州市,平和县', 117.31199645996094, 24.36400032043457, 'Pinghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1233, '350629', '华安县', '350600', '华安', 3, '0596', '363800', '中国,福建省,漳州市,华安县', 117.54100036621094, 25.005599975585938, 'Hua\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1234, '350681', '龙海市', '350600', '龙海', 3, '0596', '363100', '中国,福建省,漳州市,龙海市', 117.81800079345703, 24.44659996032715, 'Longhai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1235, '350700', '南平市', '350000', '南平', 2, '0599', '353000', '中国,福建省,南平市', 118.1780014038086, 26.63559913635254, 'Nanping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1236, '350702', '延平区', '350700', '延平', 3, '0600', '353000', '中国,福建省,南平市,延平区', 118.18199920654297, 26.637399673461914, 'Yanping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1237, '350703', '建阳区', '350700', '建阳', 3, '0599', '354200', '中国,福建省,南平市,建阳区', 118.12300109863281, 27.33209991455078, 'Jianyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1238, '350721', '顺昌县', '350700', '顺昌', 3, '0605', '353200', '中国,福建省,南平市,顺昌县', 117.80999755859375, 26.792999267578125, 'Shunchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1239, '350722', '浦城县', '350700', '浦城', 3, '0606', '353400', '中国,福建省,南平市,浦城县', 118.54000091552734, 27.918899536132812, 'Pucheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1240, '350723', '光泽县', '350700', '光泽', 3, '0607', '354100', '中国,福建省,南平市,光泽县', 117.33300018310547, 27.542299270629883, 'Guangze'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1241, '350724', '松溪县', '350700', '松溪', 3, '0608', '353500', '中国,福建省,南平市,松溪县', 118.78500366210938, 27.526199340820312, 'Songxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1242, '350725', '政和县', '350700', '政和', 3, '0609', '353600', '中国,福建省,南平市,政和县', 118.85600280761719, 27.367700576782227, 'Zhenghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1243, '350781', '邵武市', '350700', '邵武', 3, '0601', '354000', '中国,福建省,南平市,邵武市', 117.49199676513672, 27.340299606323242, 'Shaowu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1244, '350782', '武夷山市', '350700', '武夷山', 3, '0602', '354300', '中国,福建省,南平市,武夷山市', 118.03700256347656, 27.755399703979492, 'Wuyishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1245, '350783', '建瓯市', '350700', '建瓯', 3, '0603', '353100', '中国,福建省,南平市,建瓯市', 118.2979965209961, 27.023000717163086, 'Jianou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1246, '350800', '龙岩市', '350000', '龙岩', 2, '0597', '364000', '中国,福建省,龙岩市', 117.02999877929688, 25.09160041809082, 'Longyan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1247, '350802', '新罗区', '350800', '新罗', 3, '0597', '364000', '中国,福建省,龙岩市,新罗区', 117.03700256347656, 25.09830093383789, 'Xinluo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1248, '350821', '长汀县', '350800', '长汀', 3, '0597', '366300', '中国,福建省,龙岩市,长汀县', 116.35900115966797, 25.827699661254883, 'Changting'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1249, '350822', '永定区', '350800', '永定', 3, '0597', '364100', '中国,福建省,龙岩市,永定区', 116.73200225830078, 24.722999572753906, 'Yongding'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1250, '350823', '上杭县', '350800', '上杭', 3, '0597', '364200', '中国,福建省,龙岩市,上杭县', 116.41999816894531, 25.049400329589844, 'Shanghang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1251, '350824', '武平县', '350800', '武平', 3, '0597', '364300', '中国,福建省,龙岩市,武平县', 116.10199737548828, 25.09239959716797, 'Wuping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1252, '350825', '连城县', '350800', '连城', 3, '0597', '366200', '中国,福建省,龙岩市,连城县', 116.75499725341797, 25.71030044555664, 'Liancheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1253, '350881', '漳平市', '350800', '漳平', 3, '0597', '364400', '中国,福建省,龙岩市,漳平市', 117.41999816894531, 25.291099548339844, 'Zhangping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1254, '350900', '宁德市', '350000', '宁德', 2, '0593', '352100', '中国,福建省,宁德市', 119.5270004272461, 26.65920066833496, 'Ningde'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1255, '350902', '蕉城区', '350900', '蕉城', 3, '0593', '352100', '中国,福建省,宁德市,蕉城区', 119.5260009765625, 26.660499572753906, 'Jiaocheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1256, '350921', '霞浦县', '350900', '霞浦', 3, '0593', '355100', '中国,福建省,宁德市,霞浦县', 119.9990005493164, 26.885799407958984, 'Xiapu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1257, '350922', '古田县', '350900', '古田', 3, '0593', '352200', '中国,福建省,宁德市,古田县', 118.74700164794922, 26.576799392700195, 'Gutian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1258, '350923', '屏南县', '350900', '屏南', 3, '0593', '352300', '中国,福建省,宁德市,屏南县', 118.98899841308594, 26.910999298095703, 'Pingnan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1259, '350924', '寿宁县', '350900', '寿宁', 3, '0593', '355500', '中国,福建省,宁德市,寿宁县', 119.50399780273438, 27.459999084472656, 'Shouning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1260, '350925', '周宁县', '350900', '周宁', 3, '0593', '355400', '中国,福建省,宁德市,周宁县', 119.33799743652344, 27.106599807739258, 'Zhouning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1261, '350926', '柘荣县', '350900', '柘荣', 3, '0593', '355300', '中国,福建省,宁德市,柘荣县', 119.9000015258789, 27.23539924621582, 'Zherong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1262, '350981', '福安市', '350900', '福安', 3, '0593', '355000', '中国,福建省,宁德市,福安市', 119.64900207519531, 27.086700439453125, 'Fu\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1263, '350982', '福鼎市', '350900', '福鼎', 3, '0593', '355200', '中国,福建省,宁德市,福鼎市', 120.21700286865234, 27.32430076599121, 'Fuding'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1264, '360000', '江西省', '100000', '江西', 1, '', '1', '中国,江西省', 115.89199829101562, 28.67650032043457, 'Jiangxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1265, '360100', '南昌市', '360000', '南昌', 2, '0791', '330008', '中国,江西省,南昌市', 115.89199829101562, 28.67650032043457, 'Nanchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1266, '360102', '东湖区', '360100', '东湖', 3, '0791', '330006', '中国,江西省,南昌市,东湖区', 115.89900207519531, 28.684999465942383, 'Donghu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1267, '360103', '西湖区', '360100', '西湖', 3, '0791', '330009', '中国,江西省,南昌市,西湖区', 115.87699890136719, 28.65690040588379, 'Xihu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1268, '360104', '青云谱区', '360100', '青云谱', 3, '0791', '330001', '中国,江西省,南昌市,青云谱区', 115.91500091552734, 28.631999969482422, 'Qingyunpu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1269, '360105', '湾里区', '360100', '湾里', 3, '0791', '330004', '中国,江西省,南昌市,湾里区', 115.73100280761719, 28.715299606323242, 'Wanli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1270, '360111', '青山湖区', '360100', '青山湖', 3, '0791', '330029', '中国,江西省,南昌市,青山湖区', 115.96199798583984, 28.682100296020508, 'Qingshanhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1271, '360121', '南昌县', '360100', '南昌', 3, '0791', '330200', '中国,江西省,南昌市,南昌县', 115.94400024414062, 28.54560089111328, 'Nanchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1272, '360122', '新建县', '360100', '新建', 3, '0791', '330100', '中国,江西省,南昌市,新建县', 115.81500244140625, 28.6924991607666, 'Xinjian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1273, '360123', '安义县', '360100', '安义', 3, '0791', '330500', '中国,江西省,南昌市,安义县', 115.54900360107422, 28.84600067138672, 'Anyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1274, '360124', '进贤县', '360100', '进贤', 3, '0791', '331700', '中国,江西省,南昌市,进贤县', 116.24099731445312, 28.376800537109375, 'Jinxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1275, '360200', '景德镇市', '360000', '景德镇', 2, '0798', '333000', '中国,江西省,景德镇市', 117.21499633789062, 29.292600631713867, 'Jingdezhen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1276, '360202', '昌江区', '360200', '昌江', 3, '0799', '333000', '中国,江西省,景德镇市,昌江区', 117.18399810791016, 29.2731990814209, 'Changjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1277, '360203', '珠山区', '360200', '珠山', 3, '0800', '333000', '中国,江西省,景德镇市,珠山区', 117.2020034790039, 29.301300048828125, 'Zhushan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1278, '360222', '浮梁县', '360200', '浮梁', 3, '0802', '333400', '中国,江西省,景德镇市,浮梁县', 117.21499633789062, 29.351600646972656, 'Fuliang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1279, '360281', '乐平市', '360200', '乐平', 3, '0801', '333300', '中国,江西省,景德镇市,乐平市', 117.12899780273438, 28.962900161743164, 'Leping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1280, '360300', '萍乡市', '360000', '萍乡', 2, '0799', '337000', '中国,江西省,萍乡市', 113.85199737548828, 27.622900009155273, 'Pingxiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1281, '360302', '安源区', '360300', '安源', 3, '0800', '337000', '中国,江西省,萍乡市,安源区', 113.89099884033203, 27.616500854492188, 'Anyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1282, '360313', '湘东区', '360300', '湘东', 3, '0801', '337016', '中国,江西省,萍乡市,湘东区', 113.73300170898438, 27.640100479125977, 'Xiangdong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1283, '360321', '莲花县', '360300', '莲花', 3, '0802', '337100', '中国,江西省,萍乡市,莲花县', 113.96099853515625, 27.128700256347656, 'Lianhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1284, '360322', '上栗县', '360300', '上栗', 3, '0803', '337009', '中国,江西省,萍乡市,上栗县', 113.79399871826172, 27.87470054626465, 'Shangli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1285, '360323', '芦溪县', '360300', '芦溪', 3, '0804', '337053', '中国,江西省,萍乡市,芦溪县', 114.02999877929688, 27.630599975585938, 'Luxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1286, '360400', '九江市', '360000', '九江', 2, '0792', '332000', '中国,江西省,九江市', 115.99299621582031, 29.711999893188477, 'Jiujiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1287, '360402', '庐山区', '360400', '庐山', 3, '0792', '332005', '中国,江西省,九江市,庐山区', 115.98899841308594, 29.67180061340332, 'Lushan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1288, '360403', '浔阳区', '360400', '浔阳', 3, '0792', '332000', '中国,江西省,九江市,浔阳区', 115.98999786376953, 29.7278995513916, 'Xunyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1289, '360421', '九江县', '360400', '九江', 3, '0792', '332100', '中国,江西省,九江市,九江县', 115.91100311279297, 29.60849952697754, 'Jiujiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1290, '360423', '武宁县', '360400', '武宁', 3, '0792', '332300', '中国,江西省,九江市,武宁县', 115.10099792480469, 29.258399963378906, 'Wuning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1291, '360424', '修水县', '360400', '修水', 3, '0792', '332400', '中国,江西省,九江市,修水县', 114.5469970703125, 29.025400161743164, 'Xiushui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1292, '360425', '永修县', '360400', '永修', 3, '0792', '330300', '中国,江西省,九江市,永修县', 115.80899810791016, 29.02090072631836, 'Yongxiu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1293, '360426', '德安县', '360400', '德安', 3, '0792', '330400', '中国,江西省,九江市,德安县', 115.75599670410156, 29.313400268554688, 'De\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1294, '360427', '星子县', '360400', '星子', 3, '0792', '332800', '中国,江西省,九江市,星子县', 116.04499816894531, 29.44610023498535, 'Xingzi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1295, '360428', '都昌县', '360400', '都昌', 3, '0792', '332600', '中国,江西省,九江市,都昌县', 116.2040023803711, 29.273300170898438, 'Duchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1296, '360429', '湖口县', '360400', '湖口', 3, '0792', '332500', '中国,江西省,九江市,湖口县', 116.21900177001953, 29.73819923400879, 'Hukou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1297, '360430', '彭泽县', '360400', '彭泽', 3, '0792', '332700', '中国,江西省,九江市,彭泽县', 116.55000305175781, 29.89590072631836, 'Pengze'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1298, '360481', '瑞昌市', '360400', '瑞昌', 3, '0792', '332200', '中国,江西省,九江市,瑞昌市', 115.66699981689453, 29.67180061340332, 'Ruichang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1299, '360482', '共青城市', '360400', '共青城', 3, '0792', '332020', '中国,江西省,九江市,共青城市', 115.802001953125, 29.238800048828125, 'Gongqingcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1300, '360500', '新余市', '360000', '新余', 2, '0790', '338025', '中国,江西省,新余市', 114.93099975585938, 27.810800552368164, 'Xinyu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1301, '360502', '渝水区', '360500', '渝水', 3, '0790', '338025', '中国,江西省,新余市,渝水区', 114.94400024414062, 27.801000595092773, 'Yushui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1302, '360521', '分宜县', '360500', '分宜', 3, '0790', '336600', '中国,江西省,新余市,分宜县', 114.69200134277344, 27.814800262451172, 'Fenyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1303, '360600', '鹰潭市', '360000', '鹰潭', 2, '0701', '335000', '中国,江西省,鹰潭市', 117.03399658203125, 28.23859977722168, 'Yingtan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1304, '360602', '月湖区', '360600', '月湖', 3, '0701', '335000', '中国,江西省,鹰潭市,月湖区', 117.03700256347656, 28.239099502563477, 'Yuehu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1305, '360622', '余江县', '360600', '余江', 3, '0701', '335200', '中国,江西省,鹰潭市,余江县', 116.81900024414062, 28.21030044555664, 'Yujiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1306, '360681', '贵溪市', '360600', '贵溪', 3, '0701', '335400', '中国,江西省,鹰潭市,贵溪市', 117.24199676513672, 28.292600631713867, 'Guixi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1307, '360700', '赣州市', '360000', '赣州', 2, '0797', '341000', '中国,江西省,赣州市', 114.94000244140625, 25.85099983215332, 'Ganzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1308, '360702', '章贡区', '360700', '章贡', 3, '0797', '341000', '中国,江西省,赣州市,章贡区', 114.94300079345703, 25.86240005493164, 'Zhanggong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1309, '360703', '南康区', '360700', '南康', 3, '0797', '341400', '中国,江西省,赣州市,南康区', 114.75700378417969, 25.661699295043945, 'Nankang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1310, '360721', '赣县', '360700', '赣县', 3, '0797', '341100', '中国,江西省,赣州市,赣县', 115.01200103759766, 25.861499786376953, 'Ganxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1311, '360722', '信丰县', '360700', '信丰', 3, '0797', '341600', '中国,江西省,赣州市,信丰县', 114.9229965209961, 25.38610076904297, 'Xinfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1312, '360723', '大余县', '360700', '大余', 3, '0797', '341500', '中国,江西省,赣州市,大余县', 114.35800170898438, 25.395599365234375, 'Dayu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1313, '360724', '上犹县', '360700', '上犹', 3, '0797', '341200', '中国,江西省,赣州市,上犹县', 114.54100036621094, 25.795700073242188, 'Shangyou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1314, '360725', '崇义县', '360700', '崇义', 3, '0797', '341300', '中国,江西省,赣州市,崇义县', 114.30799865722656, 25.681900024414062, 'Chongyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1315, '360726', '安远县', '360700', '安远', 3, '0797', '342100', '中国,江西省,赣州市,安远县', 115.3949966430664, 25.137100219726562, 'Anyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1316, '360727', '龙南县', '360700', '龙南', 3, '0797', '341700', '中国,江西省,赣州市,龙南县', 114.79000091552734, 24.910900115966797, 'Longnan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1317, '360728', '定南县', '360700', '定南', 3, '0797', '341900', '中国,江西省,赣州市,定南县', 115.0270004272461, 24.784000396728516, 'Dingnan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1318, '360729', '全南县', '360700', '全南', 3, '0797', '341800', '中国,江西省,赣州市,全南县', 114.52899932861328, 24.743200302124023, 'Quannan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1319, '360730', '宁都县', '360700', '宁都', 3, '0797', '342800', '中国,江西省,赣州市,宁都县', 116.01599884033203, 26.472299575805664, 'Ningdu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1320, '360731', '于都县', '360700', '于都', 3, '0797', '342300', '中国,江西省,赣州市,于都县', 115.41400146484375, 25.952600479125977, 'Yudu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1321, '360732', '兴国县', '360700', '兴国', 3, '0797', '342400', '中国,江西省,赣州市,兴国县', 115.36299896240234, 26.337799072265625, 'Xingguo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1322, '360733', '会昌县', '360700', '会昌', 3, '0797', '342600', '中国,江西省,赣州市,会昌县', 115.78600311279297, 25.60070037841797, 'Huichang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1323, '360734', '寻乌县', '360700', '寻乌', 3, '0797', '342200', '中国,江西省,赣州市,寻乌县', 115.64900207519531, 24.95509910583496, 'Xunwu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1324, '360735', '石城县', '360700', '石城', 3, '0797', '342700', '中国,江西省,赣州市,石城县', 116.34400177001953, 26.326200485229492, 'Shicheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1325, '360781', '瑞金市', '360700', '瑞金', 3, '0797', '342500', '中国,江西省,赣州市,瑞金市', 116.0270004272461, 25.88559913635254, 'Ruijin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1326, '360800', '吉安市', '360000', '吉安', 2, '0796', '343000', '中国,江西省,吉安市', 114.98600006103516, 27.1117000579834, 'Ji\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1327, '360802', '吉州区', '360800', '吉州', 3, '0796', '343000', '中国,江西省,吉安市,吉州区', 114.97599792480469, 27.106700897216797, 'Jizhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1328, '360803', '青原区', '360800', '青原', 3, '0796', '343009', '中国,江西省,吉安市,青原区', 115.01699829101562, 27.10580062866211, 'Qingyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1329, '360821', '吉安县', '360800', '吉安', 3, '0796', '343100', '中国,江西省,吉安市,吉安县', 114.90699768066406, 27.04050064086914, 'Ji\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1330, '360822', '吉水县', '360800', '吉水', 3, '0796', '331600', '中国,江西省,吉安市,吉水县', 115.13400268554688, 27.2106990814209, 'Jishui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1331, '360823', '峡江县', '360800', '峡江', 3, '0796', '331409', '中国,江西省,吉安市,峡江县', 115.31700134277344, 27.576000213623047, 'Xiajiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1332, '360824', '新干县', '360800', '新干', 3, '0796', '331300', '中国,江西省,吉安市,新干县', 115.39299774169922, 27.74090003967285, 'Xingan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1333, '360825', '永丰县', '360800', '永丰', 3, '0796', '331500', '中国,江西省,吉安市,永丰县', 115.44200134277344, 27.317899703979492, 'Yongfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1334, '360826', '泰和县', '360800', '泰和', 3, '0796', '343700', '中国,江西省,吉安市,泰和县', 114.90799713134766, 26.791099548339844, 'Taihe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1335, '360827', '遂川县', '360800', '遂川', 3, '0796', '343900', '中国,江西省,吉安市,遂川县', 114.51599884033203, 26.326000213623047, 'Suichuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1336, '360828', '万安县', '360800', '万安', 3, '0796', '343800', '中国,江西省,吉安市,万安县', 114.78700256347656, 26.459299087524414, 'Wan\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1337, '360829', '安福县', '360800', '安福', 3, '0796', '343200', '中国,江西省,吉安市,安福县', 114.62000274658203, 27.392799377441406, 'Anfu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1338, '360830', '永新县', '360800', '永新', 3, '0796', '343400', '中国,江西省,吉安市,永新县', 114.24199676513672, 26.944900512695312, 'Yongxin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1339, '360881', '井冈山市', '360800', '井冈山', 3, '0796', '343600', '中国,江西省,吉安市,井冈山市', 114.28900146484375, 26.74799919128418, 'Jinggangshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1340, '360900', '宜春市', '360000', '宜春', 2, '0795', '336000', '中国,江西省,宜春市', 114.39099884033203, 27.80430030822754, 'Yichun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1341, '360902', '袁州区', '360900', '袁州', 3, '0795', '336000', '中国,江西省,宜春市,袁州区', 114.38200378417969, 27.796499252319336, 'Yuanzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1342, '360921', '奉新县', '360900', '奉新', 3, '0795', '330700', '中国,江西省,宜春市,奉新县', 115.4000015258789, 28.68790054321289, 'Fengxin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1343, '360922', '万载县', '360900', '万载', 3, '0795', '336100', '中国,江西省,宜春市,万载县', 114.44599914550781, 28.106599807739258, 'Wanzai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1344, '360923', '上高县', '360900', '上高', 3, '0795', '336400', '中国,江西省,宜春市,上高县', 114.92500305175781, 28.23419952392578, 'Shanggao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1345, '360924', '宜丰县', '360900', '宜丰', 3, '0795', '336300', '中国,江西省,宜春市,宜丰县', 114.77999877929688, 28.385499954223633, 'Yifeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1346, '360925', '靖安县', '360900', '靖安', 3, '0795', '330600', '中国,江西省,宜春市,靖安县', 115.36299896240234, 28.8617000579834, 'Jing\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1347, '360926', '铜鼓县', '360900', '铜鼓', 3, '0795', '336200', '中国,江西省,宜春市,铜鼓县', 114.37000274658203, 28.523099899291992, 'Tonggu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1348, '360981', '丰城市', '360900', '丰城', 3, '0795', '331100', '中国,江西省,宜春市,丰城市', 115.77100372314453, 28.15920066833496, 'Fengcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1349, '360982', '樟树市', '360900', '樟树', 3, '0795', '331200', '中国,江西省,宜春市,樟树市', 115.5469970703125, 28.053300857543945, 'Zhangshu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1350, '360983', '高安市', '360900', '高安', 3, '0795', '330800', '中国,江西省,宜春市,高安市', 115.375, 28.417800903320312, 'Gao\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1351, '361000', '抚州市', '360000', '抚州', 2, '0794', '344000', '中国,江西省,抚州市', 116.35800170898438, 27.98390007019043, 'Fuzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1352, '361002', '临川区', '361000', '临川', 3, '0794', '344000', '中国,江西省,抚州市,临川区', 116.35900115966797, 27.97719955444336, 'Linchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1353, '361021', '南城县', '361000', '南城', 3, '0794', '344700', '中国,江西省,抚州市,南城县', 116.64399719238281, 27.553800582885742, 'Nancheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1354, '361022', '黎川县', '361000', '黎川', 3, '0794', '344600', '中国,江西省,抚州市,黎川县', 116.90799713134766, 27.28230094909668, 'Lichuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1355, '361023', '南丰县', '361000', '南丰', 3, '0794', '344500', '中国,江西省,抚州市,南丰县', 116.5260009765625, 27.218399047851562, 'Nanfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1356, '361024', '崇仁县', '361000', '崇仁', 3, '0794', '344200', '中国,江西省,抚州市,崇仁县', 116.05999755859375, 27.759599685668945, 'Chongren'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1357, '361025', '乐安县', '361000', '乐安', 3, '0794', '344300', '中国,江西省,抚州市,乐安县', 115.83100128173828, 27.4281005859375, 'Le\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1358, '361026', '宜黄县', '361000', '宜黄', 3, '0794', '344400', '中国,江西省,抚州市,宜黄县', 116.23600006103516, 27.554899215698242, 'Yihuang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1359, '361027', '金溪县', '361000', '金溪', 3, '0794', '344800', '中国,江西省,抚州市,金溪县', 116.77400207519531, 27.907499313354492, 'Jinxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1360, '361028', '资溪县', '361000', '资溪', 3, '0794', '335300', '中国,江西省,抚州市,资溪县', 117.06900024414062, 27.70490074157715, 'Zixi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1361, '361029', '东乡县', '361000', '东乡', 3, '0794', '331800', '中国,江西省,抚州市,东乡县', 116.58999633789062, 28.236099243164062, 'Dongxiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1362, '361030', '广昌县', '361000', '广昌', 3, '0794', '344900', '中国,江西省,抚州市,广昌县', 116.32499694824219, 26.8341007232666, 'Guangchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1363, '361100', '上饶市', '360000', '上饶', 2, '0793', '334000', '中国,江西省,上饶市', 117.97100067138672, 28.444400787353516, 'Shangrao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1364, '361102', '信州区', '361100', '信州', 3, '0793', '334000', '中国,江西省,上饶市,信州区', 117.96700286865234, 28.43120002746582, 'Xinzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1365, '361121', '上饶县', '361100', '上饶', 3, '0793', '334100', '中国,江西省,上饶市,上饶县', 117.90899658203125, 28.44860076904297, 'Shangrao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1366, '361122', '广丰县', '361100', '广丰', 3, '0793', '334600', '中国,江西省,上饶市,广丰县', 118.19200134277344, 28.437700271606445, 'Guangfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1367, '361123', '玉山县', '361100', '玉山', 3, '0793', '334700', '中国,江西省,上饶市,玉山县', 118.24500274658203, 28.681800842285156, 'Yushan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1368, '361124', '铅山县', '361100', '铅山', 3, '0793', '334500', '中国,江西省,上饶市,铅山县', 117.70999908447266, 28.315500259399414, 'Yanshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1369, '361125', '横峰县', '361100', '横峰', 3, '0793', '334300', '中国,江西省,上饶市,横峰县', 117.59600067138672, 28.40719985961914, 'Hengfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1370, '361126', '弋阳县', '361100', '弋阳', 3, '0793', '334400', '中国,江西省,上饶市,弋阳县', 117.45899963378906, 28.374500274658203, 'Yiyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1371, '361127', '余干县', '361100', '余干', 3, '0793', '335100', '中国,江西省,上饶市,余干县', 116.69599914550781, 28.70210075378418, 'Yugan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1372, '361128', '鄱阳县', '361100', '鄱阳', 3, '0793', '333100', '中国,江西省,上饶市,鄱阳县', 116.69999694824219, 29.01180076599121, 'Poyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1373, '361129', '万年县', '361100', '万年', 3, '0793', '335500', '中国,江西省,上饶市,万年县', 117.06900024414062, 28.69540023803711, 'Wannian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1374, '361130', '婺源县', '361100', '婺源', 3, '0793', '333200', '中国,江西省,上饶市,婺源县', 117.86100006103516, 29.24839973449707, 'Wuyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1375, '361181', '德兴市', '361100', '德兴', 3, '0793', '334200', '中国,江西省,上饶市,德兴市', 117.5790023803711, 28.947399139404297, 'Dexing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1376, '370000', '山东省', '100000', '山东', 1, '', '99', '中国,山东省', 117.0009994506836, 36.67580032348633, 'Shandong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1377, '370100', '济南市', '370000', '济南', 2, '0531', '250001', '中国,山东省,济南市', 117.0009994506836, 36.67580032348633, 'Jinan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1378, '370102', '历下区', '370100', '历下', 3, '0531', '250014', '中国,山东省,济南市,历下区', 117.0770034790039, 36.66659927368164, 'Lixia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1379, '370103', '市中区', '370100', '市中区', 3, '0531', '250001', '中国,山东省,济南市,市中区', 116.99700164794922, 36.6510009765625, 'Shizhongqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1380, '370104', '槐荫区', '370100', '槐荫', 3, '0531', '250117', '中国,山东省,济南市,槐荫区', 116.9010009765625, 36.65140151977539, 'Huaiyin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1381, '370105', '天桥区', '370100', '天桥', 3, '0531', '250031', '中国,山东省,济南市,天桥区', 116.98699951171875, 36.678001403808594, 'Tianqiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1382, '370112', '历城区', '370100', '历城', 3, '0531', '250100', '中国,山东省,济南市,历城区', 117.06500244140625, 36.68000030517578, 'Licheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1383, '370113', '长清区', '370100', '长清', 3, '0531', '250300', '中国,山东省,济南市,长清区', 116.75199890136719, 36.55350112915039, 'Changqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1384, '370124', '平阴县', '370100', '平阴', 3, '0531', '250400', '中国,山东省,济南市,平阴县', 116.45600128173828, 36.28960037231445, 'Pingyin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1385, '370125', '济阳县', '370100', '济阳', 3, '0531', '251400', '中国,山东省,济南市,济阳县', 117.1729965209961, 36.97850036621094, 'Jiyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1386, '370126', '商河县', '370100', '商河', 3, '0531', '251600', '中国,山东省,济南市,商河县', 117.15699768066406, 37.31119918823242, 'Shanghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1387, '370181', '章丘市', '370100', '章丘', 3, '0531', '250200', '中国,山东省,济南市,章丘市', 117.53700256347656, 36.71390151977539, 'Zhangqiu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1388, '370200', '青岛市', '370000', '青岛', 2, '0532', '266001', '中国,山东省,青岛市', 120.37000274658203, 36.094398498535156, 'Qingdao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1389, '370202', '市南区', '370200', '市南', 3, '0532', '266001', '中国,山东省,青岛市,市南区', 120.38800048828125, 36.06669998168945, 'Shinan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1390, '370203', '市北区', '370200', '市北', 3, '0532', '266011', '中国,山东省,青岛市,市北区', 120.375, 36.08729934692383, 'Shibei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1391, '370211', '黄岛区', '370200', '黄岛', 3, '0532', '266500', '中国,山东省,青岛市,黄岛区', 120.197998046875, 35.96070098876953, 'Huangdao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1392, '370212', '崂山区', '370200', '崂山', 3, '0532', '266100', '中国,山东省,青岛市,崂山区', 120.46900177001953, 36.107200622558594, 'Laoshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1393, '370213', '李沧区', '370200', '李沧', 3, '0532', '266021', '中国,山东省,青岛市,李沧区', 120.43299865722656, 36.14500045776367, 'Licang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1394, '370214', '城阳区', '370200', '城阳', 3, '0532', '266041', '中国,山东省,青岛市,城阳区', 120.39600372314453, 36.30739974975586, 'Chengyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1395, '370281', '胶州市', '370200', '胶州', 3, '0532', '266300', '中国,山东省,青岛市,胶州市', 120.03399658203125, 36.264400482177734, 'Jiaozhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1396, '370282', '即墨市', '370200', '即墨', 3, '0532', '266200', '中国,山东省,青岛市,即墨市', 120.4469985961914, 36.38909912109375, 'Jimo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1397, '370283', '平度市', '370200', '平度', 3, '0532', '266700', '中国,山东省,青岛市,平度市', 119.95999908447266, 36.78689956665039, 'Pingdu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1398, '370285', '莱西市', '370200', '莱西', 3, '0532', '266600', '中国,山东省,青岛市,莱西市', 120.51799774169922, 36.88800048828125, 'Laixi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1399, '370286', '西海岸新区', '370200', '西海岸', 3, '0532', '266500', '中国,山东省,青岛市,西海岸新区', 120.197998046875, 35.96070098876953, 'Xihai\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1400, '370300', '淄博市', '370000', '淄博', 2, '0533', '255039', '中国,山东省,淄博市', 118.0479965209961, 36.81489944458008, 'Zibo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1401, '370302', '淄川区', '370300', '淄川', 3, '0533', '255100', '中国,山东省,淄博市,淄川区', 117.96700286865234, 36.64339828491211, 'Zichuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1402, '370303', '张店区', '370300', '张店', 3, '0533', '255022', '中国,山东省,淄博市,张店区', 118.01799774169922, 36.806800842285156, 'Zhangdian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1403, '370304', '博山区', '370300', '博山', 3, '0533', '255200', '中国,山东省,淄博市,博山区', 117.86199951171875, 36.49470138549805, 'Boshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1404, '370305', '临淄区', '370300', '临淄', 3, '0533', '255400', '中国,山东省,淄博市,临淄区', 118.30999755859375, 36.82590103149414, 'Linzi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1405, '370306', '周村区', '370300', '周村', 3, '0533', '255300', '中国,山东省,淄博市,周村区', 117.87000274658203, 36.803199768066406, 'Zhoucun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1406, '370321', '桓台县', '370300', '桓台', 3, '0533', '256400', '中国,山东省,淄博市,桓台县', 118.09700012207031, 36.96039962768555, 'Huantai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1407, '370322', '高青县', '370300', '高青', 3, '0533', '256300', '中国,山东省,淄博市,高青县', 117.8270034790039, 37.172000885009766, 'Gaoqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1408, '370323', '沂源县', '370300', '沂源', 3, '0533', '256100', '中国,山东省,淄博市,沂源县', 118.1709976196289, 36.18539810180664, 'Yiyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1409, '370400', '枣庄市', '370000', '枣庄', 2, '0632', '277101', '中国,山东省,枣庄市', 117.55799865722656, 34.85639953613281, 'Zaozhuang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1410, '370402', '市中区', '370400', '市中区', 3, '0632', '277101', '中国,山东省,枣庄市,市中区', 117.55599975585938, 34.86389923095703, 'Shizhongqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1411, '370403', '薛城区', '370400', '薛城', 3, '0632', '277000', '中国,山东省,枣庄市,薛城区', 117.26300048828125, 34.79499816894531, 'Xuecheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1412, '370404', '峄城区', '370400', '峄城', 3, '0632', '277300', '中国,山东省,枣庄市,峄城区', 117.59100341796875, 34.772300720214844, 'Yicheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1413, '370405', '台儿庄区', '370400', '台儿庄', 3, '0632', '277400', '中国,山东省,枣庄市,台儿庄区', 117.73500061035156, 34.5635986328125, 'Taierzhuang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1414, '370406', '山亭区', '370400', '山亭', 3, '0632', '277200', '中国,山东省,枣庄市,山亭区', 117.46600341796875, 35.095401763916016, 'Shanting'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1415, '370481', '滕州市', '370400', '滕州', 3, '0632', '277500', '中国,山东省,枣庄市,滕州市', 117.16500091552734, 35.10530090332031, 'Tengzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1416, '370500', '东营市', '370000', '东营', 2, '0546', '257093', '中国,山东省,东营市', 118.49600219726562, 37.461299896240234, 'Dongying'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1417, '370502', '东营区', '370500', '东营', 3, '0546', '257029', '中国,山东省,东营市,东营区', 118.58200073242188, 37.448699951171875, 'Dongying'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1418, '370503', '河口区', '370500', '河口', 3, '0546', '257200', '中国,山东省,东营市,河口区', 118.5250015258789, 37.885398864746094, 'Hekou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1419, '370521', '垦利县', '370500', '垦利', 3, '0546', '257500', '中国,山东省,东营市,垦利县', 118.5479965209961, 37.588199615478516, 'Kenli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1420, '370522', '利津县', '370500', '利津', 3, '0546', '257400', '中国,山东省,东营市,利津县', 118.25599670410156, 37.491600036621094, 'Lijin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1421, '370523', '广饶县', '370500', '广饶', 3, '0546', '257300', '中国,山东省,东营市,广饶县', 118.40699768066406, 37.05379867553711, 'Guangrao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1422, '370600', '烟台市', '370000', '烟台', 2, '0635', '264010', '中国,山东省,烟台市', 121.39099884033203, 37.53929901123047, 'Yantai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1423, '370602', '芝罘区', '370600', '芝罘', 3, '0635', '264001', '中国,山东省,烟台市,芝罘区', 121.4000015258789, 37.54059982299805, 'Zhifu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1424, '370611', '福山区', '370600', '福山', 3, '0635', '265500', '中国,山东省,烟台市,福山区', 121.26799774169922, 37.4984016418457, 'Fushan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1425, '370612', '牟平区', '370600', '牟平', 3, '0635', '264100', '中国,山东省,烟台市,牟平区', 121.60099792480469, 37.38850021362305, 'Muping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1426, '370613', '莱山区', '370600', '莱山', 3, '0635', '264600', '中国,山东省,烟台市,莱山区', 121.44499969482422, 37.51169967651367, 'Laishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1427, '370634', '长岛县', '370600', '长岛', 3, '0635', '265800', '中国,山东省,烟台市,长岛县', 120.73799896240234, 37.91749954223633, 'Changdao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1428, '370681', '龙口市', '370600', '龙口', 3, '0635', '265700', '中国,山东省,烟台市,龙口市', 120.50599670410156, 37.64059829711914, 'Longkou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1429, '370682', '莱阳市', '370600', '莱阳', 3, '0635', '265200', '中国,山东省,烟台市,莱阳市', 120.71099853515625, 36.980098724365234, 'Laiyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1430, '370683', '莱州市', '370600', '莱州', 3, '0635', '261400', '中国,山东省,烟台市,莱州市', 119.94100189208984, 37.1781005859375, 'Laizhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1431, '370684', '蓬莱市', '370600', '蓬莱', 3, '0635', '265600', '中国,山东省,烟台市,蓬莱市', 120.76000213623047, 37.81119918823242, 'Penglai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1432, '370685', '招远市', '370600', '招远', 3, '0635', '265400', '中国,山东省,烟台市,招远市', 120.40499877929688, 37.362701416015625, 'Zhaoyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1433, '370686', '栖霞市', '370600', '栖霞', 3, '0635', '265300', '中国,山东省,烟台市,栖霞市', 120.8499984741211, 37.33570098876953, 'Qixia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1434, '370687', '海阳市', '370600', '海阳', 3, '0635', '265100', '中国,山东省,烟台市,海阳市', 121.16000366210938, 36.77619934082031, 'Haiyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1435, '370700', '潍坊市', '370000', '潍坊', 2, '0536', '261041', '中国,山东省,潍坊市', 119.10700225830078, 36.70930099487305, 'Weifang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1436, '370702', '潍城区', '370700', '潍城', 3, '0536', '261021', '中国,山东省,潍坊市,潍城区', 119.10600280761719, 36.71390151977539, 'Weicheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1437, '370703', '寒亭区', '370700', '寒亭', 3, '0536', '261100', '中国,山东省,潍坊市,寒亭区', 119.21800231933594, 36.775001525878906, 'Hanting'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1438, '370704', '坊子区', '370700', '坊子', 3, '0536', '261200', '中国,山东省,潍坊市,坊子区', 119.16500091552734, 36.652198791503906, 'Fangzi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1439, '370705', '奎文区', '370700', '奎文', 3, '0536', '261031', '中国,山东省,潍坊市,奎文区', 119.125, 36.70719909667969, 'Kuiwen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1440, '370724', '临朐县', '370700', '临朐', 3, '0536', '262600', '中国,山东省,潍坊市,临朐县', 118.54399871826172, 36.51219940185547, 'Linqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1441, '370725', '昌乐县', '370700', '昌乐', 3, '0536', '262400', '中国,山东省,潍坊市,昌乐县', 118.83000183105469, 36.707801818847656, 'Changle'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1442, '370781', '青州市', '370700', '青州', 3, '0536', '262500', '中国,山东省,潍坊市,青州市', 118.47899627685547, 36.68510055541992, 'Qingzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1443, '370782', '诸城市', '370700', '诸城', 3, '0536', '262200', '中国,山东省,潍坊市,诸城市', 119.41000366210938, 35.99660110473633, 'Zhucheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1444, '370783', '寿光市', '370700', '寿光', 3, '0536', '262700', '中国,山东省,潍坊市,寿光市', 118.73999786376953, 36.88130187988281, 'Shouguang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1445, '370784', '安丘市', '370700', '安丘', 3, '0536', '262100', '中国,山东省,潍坊市,安丘市', 119.21900177001953, 36.47850036621094, 'Anqiu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1446, '370785', '高密市', '370700', '高密', 3, '0536', '261500', '中国,山东省,潍坊市,高密市', 119.75700378417969, 36.38399887084961, 'Gaomi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1447, '370786', '昌邑市', '370700', '昌邑', 3, '0536', '261300', '中国,山东省,潍坊市,昌邑市', 119.39800262451172, 36.86009979248047, 'Changyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1448, '370800', '济宁市', '370000', '济宁', 2, '0537', '272119', '中国,山东省,济宁市', 116.58699798583984, 35.415401458740234, 'Jining'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1449, '370811', '任城区', '370800', '任城', 3, '0537', '272113', '中国,山东省,济宁市,任城区', 116.59500122070312, 35.40660095214844, 'Rencheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1450, '370812', '兖州区', '370800', '兖州', 3, '0537', '272000', '中国,山东省,济宁市,兖州区', 116.8270034790039, 35.55229949951172, 'Yanzhou '); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1451, '370826', '微山县', '370800', '微山', 3, '0537', '277600', '中国,山东省,济宁市,微山县', 117.12899780273438, 34.807098388671875, 'Weishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1452, '370827', '鱼台县', '370800', '鱼台', 3, '0537', '272300', '中国,山东省,济宁市,鱼台县', 116.64800262451172, 34.996700286865234, 'Yutai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1453, '370828', '金乡县', '370800', '金乡', 3, '0537', '272200', '中国,山东省,济宁市,金乡县', 116.31099700927734, 35.064998626708984, 'Jinxiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1454, '370829', '嘉祥县', '370800', '嘉祥', 3, '0537', '272400', '中国,山东省,济宁市,嘉祥县', 116.34200286865234, 35.40840148925781, 'Jiaxiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1455, '370830', '汶上县', '370800', '汶上', 3, '0537', '272501', '中国,山东省,济宁市,汶上县', 116.48699951171875, 35.7328987121582, 'Wenshang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1456, '370831', '泗水县', '370800', '泗水', 3, '0537', '273200', '中国,山东省,济宁市,泗水县', 117.27899932861328, 35.66109848022461, 'Sishui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1457, '370832', '梁山县', '370800', '梁山', 3, '0537', '272600', '中国,山东省,济宁市,梁山县', 116.09700012207031, 35.803199768066406, 'Liangshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1458, '370881', '曲阜市', '370800', '曲阜', 3, '0537', '273100', '中国,山东省,济宁市,曲阜市', 116.98600006103516, 35.58089828491211, 'Qufu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1459, '370883', '邹城市', '370800', '邹城', 3, '0537', '273500', '中国,山东省,济宁市,邹城市', 116.9729995727539, 35.40530014038086, 'Zoucheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1460, '370900', '泰安市', '370000', '泰安', 2, '0538', '271000', '中国,山东省,泰安市', 117.12899780273438, 36.19499969482422, 'Tai\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1461, '370902', '泰山区', '370900', '泰山', 3, '0538', '271000', '中国,山东省,泰安市,泰山区', 117.13400268554688, 36.19409942626953, 'Taishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1462, '370911', '岱岳区', '370900', '岱岳', 3, '0538', '271000', '中国,山东省,泰安市,岱岳区', 117.04199981689453, 36.1875, 'Daiyue'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1463, '370921', '宁阳县', '370900', '宁阳', 3, '0538', '271400', '中国,山东省,泰安市,宁阳县', 116.80500030517578, 35.7598991394043, 'Ningyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1464, '370923', '东平县', '370900', '东平', 3, '0538', '271500', '中国,山东省,泰安市,东平县', 116.47100067138672, 35.93790054321289, 'Dongping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1465, '370982', '新泰市', '370900', '新泰', 3, '0538', '271200', '中国,山东省,泰安市,新泰市', 117.7699966430664, 35.90890121459961, 'Xintai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1466, '370983', '肥城市', '370900', '肥城', 3, '0538', '271600', '中国,山东省,泰安市,肥城市', 116.76799774169922, 36.182498931884766, 'Feicheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1467, '371000', '威海市', '370000', '威海', 2, '0631', '264200', '中国,山东省,威海市', 122.11599731445312, 37.509700775146484, 'Weihai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1468, '371002', '环翠区', '371000', '环翠', 3, '0631', '264200', '中国,山东省,威海市,环翠区', 122.12300109863281, 37.50199890136719, 'Huancui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1469, '371003', '文登区', '371000', '文登', 3, '0631', '266440', '中国,山东省,威海市,文登区', 122.05699920654297, 37.19620132446289, 'Wendeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1470, '371082', '荣成市', '371000', '荣成', 3, '0631', '264300', '中国,山东省,威海市,荣成市', 122.48799896240234, 37.165199279785156, 'Rongcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1471, '371083', '乳山市', '371000', '乳山', 3, '0631', '264500', '中国,山东省,威海市,乳山市', 121.53800201416016, 36.9192008972168, 'Rushan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1472, '371100', '日照市', '370000', '日照', 2, '0633', '276800', '中国,山东省,日照市', 119.46099853515625, 35.4286003112793, 'Rizhao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1473, '371102', '东港区', '371100', '东港', 3, '0633', '276800', '中国,山东省,日照市,东港区', 119.46199798583984, 35.42539978027344, 'Donggang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1474, '371103', '岚山区', '371100', '岚山', 3, '0633', '276808', '中国,山东省,日照市,岚山区', 119.31900024414062, 35.12200164794922, 'Lanshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1475, '371121', '五莲县', '371100', '五莲', 3, '0633', '262300', '中国,山东省,日照市,五莲县', 119.20700073242188, 35.75, 'Wulian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1476, '371122', '莒县', '371100', '莒县', 3, '0633', '276500', '中国,山东省,日照市,莒县', 118.83799743652344, 35.580501556396484, 'Juxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1477, '371200', '莱芜市', '370000', '莱芜', 2, '0634', '271100', '中国,山东省,莱芜市', 117.6780014038086, 36.21440124511719, 'Laiwu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1478, '371202', '莱城区', '371200', '莱城', 3, '0634', '271199', '中国,山东省,莱芜市,莱城区', 117.66000366210938, 36.20320129394531, 'Laicheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1479, '371203', '钢城区', '371200', '钢城', 3, '0634', '271100', '中国,山东省,莱芜市,钢城区', 117.80500030517578, 36.063201904296875, 'Gangcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1480, '371300', '临沂市', '370000', '临沂', 2, '0539', '253000', '中国,山东省,临沂市', 118.32599639892578, 35.06529998779297, 'Linyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1481, '371302', '兰山区', '371300', '兰山', 3, '0539', '276002', '中国,山东省,临沂市,兰山区', 118.3479995727539, 35.06869888305664, 'Lanshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1482, '371311', '罗庄区', '371300', '罗庄', 3, '0539', '276022', '中国,山东省,临沂市,罗庄区', 118.28500366210938, 34.996299743652344, 'Luozhuang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1483, '371312', '河东区', '371300', '河东', 3, '0539', '276034', '中国,山东省,临沂市,河东区', 118.41100311279297, 35.0880012512207, 'Hedong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1484, '371321', '沂南县', '371300', '沂南', 3, '0539', '276300', '中国,山东省,临沂市,沂南县', 118.47100067138672, 35.551300048828125, 'Yinan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1485, '371322', '郯城县', '371300', '郯城', 3, '0539', '276100', '中国,山东省,临沂市,郯城县', 118.36699676513672, 34.61349868774414, 'Tancheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1486, '371323', '沂水县', '371300', '沂水', 3, '0539', '276400', '中国,山东省,临沂市,沂水县', 118.62999725341797, 35.78730010986328, 'Yishui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1487, '371324', '兰陵县', '371300', '兰陵', 3, '0539', '277700', '中国,山东省,临沂市,兰陵县', 117.85700225830078, 34.73830032348633, 'Lanling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1488, '371325', '费县', '371300', '费县', 3, '0539', '273400', '中国,山东省,临沂市,费县', 117.97799682617188, 35.26559829711914, 'Feixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1489, '371326', '平邑县', '371300', '平邑', 3, '0539', '273300', '中国,山东省,临沂市,平邑县', 117.63899993896484, 35.505699157714844, 'Pingyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1490, '371327', '莒南县', '371300', '莒南', 3, '0539', '276600', '中国,山东省,临沂市,莒南县', 118.83200073242188, 35.17539978027344, 'Junan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1491, '371328', '蒙阴县', '371300', '蒙阴', 3, '0539', '276200', '中国,山东省,临沂市,蒙阴县', 117.94599914550781, 35.709999084472656, 'Mengyin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1492, '371329', '临沭县', '371300', '临沭', 3, '0539', '276700', '中国,山东省,临沂市,临沭县', 118.65299987792969, 34.9208984375, 'Linshu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1493, '371400', '德州市', '370000', '德州', 2, '0534', '253000', '中国,山东省,德州市', 116.30699920654297, 37.45399856567383, 'Dezhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1494, '371402', '德城区', '371400', '德城', 3, '0534', '253012', '中国,山东省,德州市,德城区', 116.29900360107422, 37.45130157470703, 'Decheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1495, '371403', '陵城区', '371400', '陵城', 3, '0534', '253500', '中国,山东省,德州市,陵城区', 116.57599639892578, 37.33570098876953, 'Lingcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1496, '371422', '宁津县', '371400', '宁津', 3, '0534', '253400', '中国,山东省,德州市,宁津县', 116.7969970703125, 37.65299987792969, 'Ningjin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1497, '371423', '庆云县', '371400', '庆云', 3, '0534', '253700', '中国,山东省,德州市,庆云县', 117.38600158691406, 37.77619934082031, 'Qingyun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1498, '371424', '临邑县', '371400', '临邑', 3, '0534', '251500', '中国,山东省,德州市,临邑县', 116.86499786376953, 37.19049835205078, 'Linyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1499, '371425', '齐河县', '371400', '齐河', 3, '0534', '251100', '中国,山东省,德州市,齐河县', 116.75499725341797, 36.7952995300293, 'Qihe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1500, '371426', '平原县', '371400', '平原', 3, '0534', '253100', '中国,山东省,德州市,平原县', 116.43399810791016, 37.16630172729492, 'Pingyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1501, '371427', '夏津县', '371400', '夏津', 3, '0534', '253200', '中国,山东省,德州市,夏津县', 116.00199890136719, 36.94850158691406, 'Xiajin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1502, '371428', '武城县', '371400', '武城', 3, '0534', '253300', '中国,山东省,德州市,武城县', 116.06999969482422, 37.2140007019043, 'Wucheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1503, '371481', '乐陵市', '371400', '乐陵', 3, '0534', '253600', '中国,山东省,德州市,乐陵市', 117.23100280761719, 37.73160171508789, 'Leling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1504, '371482', '禹城市', '371400', '禹城', 3, '0534', '251200', '中国,山东省,德州市,禹城市', 116.64299774169922, 36.93439865112305, 'Yucheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1505, '371500', '聊城市', '370000', '聊城', 2, '0635', '252052', '中国,山东省,聊城市', 115.9800033569336, 36.45600128173828, 'Liaocheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1506, '371502', '东昌府区', '371500', '东昌府', 3, '0635', '252000', '中国,山东省,聊城市,东昌府区', 115.9739990234375, 36.44459915161133, 'Dongchangfu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1507, '371521', '阳谷县', '371500', '阳谷', 3, '0635', '252300', '中国,山东省,聊城市,阳谷县', 115.79100036621094, 36.11439895629883, 'Yanggu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1508, '371522', '莘县', '371500', '莘县', 3, '0635', '252400', '中国,山东省,聊城市,莘县', 115.66999816894531, 36.23419952392578, 'Shenxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1509, '371523', '茌平县', '371500', '茌平', 3, '0635', '252100', '中国,山东省,聊城市,茌平县', 116.25499725341797, 36.5797004699707, 'Chiping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1510, '371524', '东阿县', '371500', '东阿', 3, '0635', '252200', '中国,山东省,聊城市,东阿县', 116.25, 36.33209991455078, 'Dong\'e'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1511, '371525', '冠县', '371500', '冠县', 3, '0635', '252500', '中国,山东省,聊城市,冠县', 115.44200134277344, 36.48429870605469, 'Guanxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1512, '371526', '高唐县', '371500', '高唐', 3, '0635', '252800', '中国,山东省,聊城市,高唐县', 116.23200225830078, 36.865299224853516, 'Gaotang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1513, '371581', '临清市', '371500', '临清', 3, '0635', '252600', '中国,山东省,聊城市,临清市', 115.70600128173828, 36.839500427246094, 'Linqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1514, '371600', '滨州市', '370000', '滨州', 2, '0543', '256619', '中国,山东省,滨州市', 118.01699829101562, 37.38349914550781, 'Binzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1515, '371602', '滨城区', '371600', '滨城', 3, '0543', '256613', '中国,山东省,滨州市,滨城区', 118.0199966430664, 37.38520050048828, 'Bincheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1516, '371603', '沾化区', '371600', '沾化', 3, '0543', '256800', '中国,山东省,滨州市,沾化区', 118.13200378417969, 37.698299407958984, 'Zhanhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1517, '371621', '惠民县', '371600', '惠民', 3, '0543', '251700', '中国,山东省,滨州市,惠民县', 117.51100158691406, 37.4901008605957, 'Huimin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1518, '371622', '阳信县', '371600', '阳信', 3, '0543', '251800', '中国,山东省,滨州市,阳信县', 117.58100128173828, 37.641998291015625, 'Yangxin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1519, '371623', '无棣县', '371600', '无棣', 3, '0543', '251900', '中国,山东省,滨州市,无棣县', 117.61399841308594, 37.7401008605957, 'Wudi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1520, '371625', '博兴县', '371600', '博兴', 3, '0543', '256500', '中国,山东省,滨州市,博兴县', 118.13400268554688, 37.1431999206543, 'Boxing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1521, '371626', '邹平县', '371600', '邹平', 3, '0543', '256200', '中国,山东省,滨州市,邹平县', 117.74299621582031, 36.86289978027344, 'Zouping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1522, '371627', '北海新区', '371600', '北海新区', 3, '0543', '256200', '中国,山东省,滨州市,北海新区', 118.01699829101562, 37.38349914550781, 'Beihaixinqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1523, '371700', '菏泽市', '370000', '菏泽', 2, '0530', '274020', '中国,山东省,菏泽市', 115.46900177001953, 35.246498107910156, 'Heze'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1524, '371702', '牡丹区', '371700', '牡丹', 3, '0530', '274009', '中国,山东省,菏泽市,牡丹区', 115.41699981689453, 35.25090026855469, 'Mudan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1525, '371721', '曹县', '371700', '曹县', 3, '0530', '274400', '中国,山东省,菏泽市,曹县', 115.54199981689453, 34.82659912109375, 'Caoxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1526, '371722', '单县', '371700', '单县', 3, '0530', '273700', '中国,山东省,菏泽市,单县', 116.08699798583984, 34.795101165771484, 'Shanxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1527, '371723', '成武县', '371700', '成武', 3, '0530', '274200', '中国,山东省,菏泽市,成武县', 115.88999938964844, 34.95330047607422, 'Chengwu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1528, '371724', '巨野县', '371700', '巨野', 3, '0530', '274900', '中国,山东省,菏泽市,巨野县', 116.09500122070312, 35.39789962768555, 'Juye'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1529, '371725', '郓城县', '371700', '郓城', 3, '0530', '274700', '中国,山东省,菏泽市,郓城县', 115.94400024414062, 35.600399017333984, 'Yuncheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1530, '371726', '鄄城县', '371700', '鄄城', 3, '0530', '274600', '中国,山东省,菏泽市,鄄城县', 115.51000213623047, 35.5640983581543, 'Juancheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1531, '371727', '定陶县', '371700', '定陶', 3, '0530', '274100', '中国,山东省,菏泽市,定陶县', 115.572998046875, 35.07120132446289, 'Dingtao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1532, '371728', '东明县', '371700', '东明', 3, '0530', '274500', '中国,山东省,菏泽市,东明县', 115.09100341796875, 35.289100646972656, 'Dongming'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1533, '410000', '河南省', '100000', '河南', 1, '', '1', '中国,河南省', 113.66500091552734, 34.757999420166016, 'Henan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1534, '410100', '郑州市', '410000', '郑州', 2, '0371', '450000', '中国,河南省,郑州市', 113.66500091552734, 34.757999420166016, 'Zhengzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1535, '410102', '中原区', '410100', '中原', 3, '0371', '450007', '中国,河南省,郑州市,中原区', 113.61299896240234, 34.74829864501953, 'Zhongyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1536, '410103', '二七区', '410100', '二七', 3, '0371', '450052', '中国,河南省,郑州市,二七区', 113.63899993896484, 34.7234001159668, 'Erqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1537, '410104', '管城回族区', '410100', '管城', 3, '0371', '450000', '中国,河南省,郑州市,管城回族区', 113.677001953125, 34.75379943847656, 'Guancheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1538, '410105', '金水区', '410100', '金水', 3, '0371', '450003', '中国,河南省,郑州市,金水区', 113.66100311279297, 34.80030059814453, 'Jinshui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1539, '410106', '上街区', '410100', '上街', 3, '0371', '450041', '中国,河南省,郑州市,上街区', 113.30899810791016, 34.802799224853516, 'Shangjie'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1540, '410108', '惠济区', '410100', '惠济', 3, '0371', '450053', '中国,河南省,郑州市,惠济区', 113.61699676513672, 34.867401123046875, 'Huiji'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1541, '410122', '中牟县', '410100', '中牟', 3, '0371', '451450', '中国,河南省,郑州市,中牟县', 113.97599792480469, 34.71900177001953, 'Zhongmu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1542, '410181', '巩义市', '410100', '巩义', 3, '0371', '451200', '中国,河南省,郑州市,巩义市', 113.02200317382812, 34.74789810180664, 'Gongyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1543, '410182', '荥阳市', '410100', '荥阳', 3, '0371', '450100', '中国,河南省,郑州市,荥阳市', 113.38300323486328, 34.787601470947266, 'Xingyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1544, '410183', '新密市', '410100', '新密', 3, '0371', '452300', '中国,河南省,郑州市,新密市', 113.38700103759766, 34.5369987487793, 'Xinmi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1545, '410184', '新郑市', '410100', '新郑', 3, '0371', '451100', '中国,河南省,郑州市,新郑市', 113.73600006103516, 34.39550018310547, 'Xinzheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1546, '410185', '登封市', '410100', '登封', 3, '0371', '452470', '中国,河南省,郑州市,登封市', 113.05000305175781, 34.453399658203125, 'Dengfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1547, '410200', '开封市', '410000', '开封', 2, '0378', '475001', '中国,河南省,开封市', 114.34100341796875, 34.79710006713867, 'Kaifeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1548, '410202', '龙亭区', '410200', '龙亭', 3, '0378', '475100', '中国,河南省,开封市,龙亭区', 114.3550033569336, 34.79990005493164, 'Longting'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1549, '410203', '顺河回族区', '410200', '顺河', 3, '0378', '475000', '中国,河南省,开封市,顺河回族区', 114.36100006103516, 34.7958984375, 'Shunhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1550, '410204', '鼓楼区', '410200', '鼓楼', 3, '0378', '475000', '中国,河南省,开封市,鼓楼区', 114.35600280761719, 34.79520034790039, 'Gulou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1551, '410205', '禹王台区', '410200', '禹王台', 3, '0378', '475003', '中国,河南省,开封市,禹王台区', 114.3479995727539, 34.77690124511719, 'Yuwangtai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1552, '410212', '祥符区', '410200', '祥符', 3, '0378', '475100', '中国,河南省,开封市,祥符区', 114.43900299072266, 34.75870132446289, 'Xiangfu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1553, '410221', '杞县', '410200', '杞县', 3, '0378', '475200', '中国,河南省,开封市,杞县', 114.78299713134766, 34.55030059814453, 'Qixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1554, '410222', '通许县', '410200', '通许', 3, '0378', '475400', '中国,河南省,开封市,通许县', 114.46700286865234, 34.47520065307617, 'Tongxu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1555, '410223', '尉氏县', '410200', '尉氏', 3, '0378', '475500', '中国,河南省,开封市,尉氏县', 114.19300079345703, 34.412200927734375, 'Weishi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1556, '410225', '兰考县', '410200', '兰考', 3, '0378', '475300', '中国,河南省,开封市,兰考县', 114.81999969482422, 34.82350158691406, 'Lankao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1557, '410300', '洛阳市', '410000', '洛阳', 2, '0379', '471000', '中国,河南省,洛阳市', 112.43399810791016, 34.66299819946289, 'Luoyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1558, '410302', '老城区', '410300', '老城', 3, '0379', '471002', '中国,河南省,洛阳市,老城区', 112.46900177001953, 34.68360137939453, 'Laocheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1559, '410303', '西工区', '410300', '西工', 3, '0379', '471000', '中国,河南省,洛阳市,西工区', 112.43699645996094, 34.66999816894531, 'Xigong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1560, '410304', '瀍河回族区', '410300', '瀍河', 3, '0379', '471002', '中国,河南省,洛阳市,瀍河回族区', 112.5, 34.679901123046875, 'Chanhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1561, '410305', '涧西区', '410300', '涧西', 3, '0379', '471003', '中国,河南省,洛阳市,涧西区', 112.39600372314453, 34.658199310302734, 'Jianxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1562, '410306', '吉利区', '410300', '吉利', 3, '0379', '471012', '中国,河南省,洛阳市,吉利区', 112.58899688720703, 34.900901794433594, 'Jili'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1563, '410311', '洛龙区', '410300', '洛龙', 3, '0379', '471000', '中国,河南省,洛阳市,洛龙区', 112.46399688720703, 34.61869812011719, 'Luolong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1564, '410322', '孟津县', '410300', '孟津', 3, '0379', '471100', '中国,河南省,洛阳市,孟津县', 112.44400024414062, 34.82600021362305, 'Mengjin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1565, '410323', '新安县', '410300', '新安', 3, '0379', '471800', '中国,河南省,洛阳市,新安县', 112.13200378417969, 34.72809982299805, 'Xin\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1566, '410324', '栾川县', '410300', '栾川', 3, '0379', '471500', '中国,河南省,洛阳市,栾川县', 111.61799621582031, 33.78580093383789, 'Luanchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1567, '410325', '嵩县', '410300', '嵩县', 3, '0379', '471400', '中国,河南省,洛阳市,嵩县', 112.08499908447266, 34.134700775146484, 'Songxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1568, '410326', '汝阳县', '410300', '汝阳', 3, '0379', '471200', '中国,河南省,洛阳市,汝阳县', 112.4729995727539, 34.153900146484375, 'Ruyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1569, '410327', '宜阳县', '410300', '宜阳', 3, '0379', '471600', '中国,河南省,洛阳市,宜阳县', 112.17900085449219, 34.515201568603516, 'Yiyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1570, '410328', '洛宁县', '410300', '洛宁', 3, '0379', '471700', '中国,河南省,洛阳市,洛宁县', 111.6510009765625, 34.38909912109375, 'Luoning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1571, '410329', '伊川县', '410300', '伊川', 3, '0379', '471300', '中国,河南省,洛阳市,伊川县', 112.42900085449219, 34.42210006713867, 'Yichuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1572, '410381', '偃师市', '410300', '偃师', 3, '0379', '471900', '中国,河南省,洛阳市,偃师市', 112.79199981689453, 34.72809982299805, 'Yanshi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1573, '410400', '平顶山市', '410000', '平顶山', 2, '0375', '467000', '中国,河南省,平顶山市', 113.30799865722656, 33.735198974609375, 'Pingdingshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1574, '410402', '新华区', '410400', '新华', 3, '0375', '467002', '中国,河南省,平顶山市,新华区', 113.29399871826172, 33.737300872802734, 'Xinhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1575, '410403', '卫东区', '410400', '卫东', 3, '0375', '467021', '中国,河南省,平顶山市,卫东区', 113.33499908447266, 33.73469924926758, 'Weidong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1576, '410404', '石龙区', '410400', '石龙', 3, '0375', '467045', '中国,河南省,平顶山市,石龙区', 112.89900207519531, 33.898799896240234, 'Shilong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1577, '410411', '湛河区', '410400', '湛河', 3, '0375', '467000', '中国,河南省,平顶山市,湛河区', 113.29299926757812, 33.73619842529297, 'Zhanhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1578, '410421', '宝丰县', '410400', '宝丰', 3, '0375', '467400', '中国,河南省,平顶山市,宝丰县', 113.05500030517578, 33.86920166015625, 'Baofeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1579, '410422', '叶县', '410400', '叶县', 3, '0375', '467200', '中国,河南省,平顶山市,叶县', 113.35099792480469, 33.62220001220703, 'Yexian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1580, '410423', '鲁山县', '410400', '鲁山', 3, '0375', '467300', '中国,河南省,平顶山市,鲁山县', 112.90599822998047, 33.738800048828125, 'Lushan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1581, '410425', '郏县', '410400', '郏县', 3, '0375', '467100', '中国,河南省,平顶山市,郏县', 113.21600341796875, 33.970699310302734, 'Jiaxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1582, '410481', '舞钢市', '410400', '舞钢', 3, '0375', '462500', '中国,河南省,平顶山市,舞钢市', 113.52400207519531, 33.293800354003906, 'Wugang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1583, '410482', '汝州市', '410400', '汝州', 3, '0375', '467500', '中国,河南省,平顶山市,汝州市', 112.84300231933594, 34.161399841308594, 'Ruzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1584, '410500', '安阳市', '410000', '安阳', 2, '0372', '455000', '中国,河南省,安阳市', 114.35199737548828, 36.10340118408203, 'Anyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1585, '410502', '文峰区', '410500', '文峰', 3, '0372', '455000', '中国,河南省,安阳市,文峰区', 114.35700225830078, 36.09049987792969, 'Wenfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1586, '410503', '北关区', '410500', '北关', 3, '0372', '455001', '中国,河南省,安阳市,北关区', 114.35700225830078, 36.11869812011719, 'Beiguan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1587, '410505', '殷都区', '410500', '殷都', 3, '0372', '455004', '中国,河南省,安阳市,殷都区', 114.3030014038086, 36.109901428222656, 'Yindu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1588, '410506', '龙安区', '410500', '龙安', 3, '0372', '455001', '中国,河南省,安阳市,龙安区', 114.3479995727539, 36.11899948120117, 'Long\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1589, '410522', '安阳县', '410500', '安阳', 3, '0372', '455000', '中国,河南省,安阳市,安阳县', 114.36599731445312, 36.06700134277344, 'Anyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1590, '410523', '汤阴县', '410500', '汤阴', 3, '0372', '456150', '中国,河南省,安阳市,汤阴县', 114.35800170898438, 35.92150115966797, 'Tangyin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1591, '410526', '滑县', '410500', '滑县', 3, '0372', '456400', '中国,河南省,安阳市,滑县', 114.52100372314453, 35.5806999206543, 'Huaxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1592, '410527', '内黄县', '410500', '内黄', 3, '0372', '456350', '中国,河南省,安阳市,内黄县', 114.90699768066406, 35.952701568603516, 'Neihuang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1593, '410581', '林州市', '410500', '林州', 3, '0372', '456550', '中国,河南省,安阳市,林州市', 113.81600189208984, 36.077999114990234, 'Linzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1594, '410600', '鹤壁市', '410000', '鹤壁', 2, '0392', '458030', '中国,河南省,鹤壁市', 114.29499816894531, 35.748199462890625, 'Hebi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1595, '410602', '鹤山区', '410600', '鹤山', 3, '0392', '458010', '中国,河南省,鹤壁市,鹤山区', 114.16300201416016, 35.9546012878418, 'Heshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1596, '410603', '山城区', '410600', '山城', 3, '0392', '458000', '中国,河南省,鹤壁市,山城区', 114.18399810791016, 35.897701263427734, 'Shancheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1597, '410611', '淇滨区', '410600', '淇滨', 3, '0392', '458000', '中国,河南省,鹤壁市,淇滨区', 114.29900360107422, 35.74129867553711, 'Qibin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1598, '410621', '浚县', '410600', '浚县', 3, '0392', '456250', '中国,河南省,鹤壁市,浚县', 114.54900360107422, 35.670799255371094, 'Xunxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1599, '410622', '淇县', '410600', '淇县', 3, '0392', '456750', '中国,河南省,鹤壁市,淇县', 114.197998046875, 35.6077995300293, 'Qixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1600, '410700', '新乡市', '410000', '新乡', 2, '0373', '453000', '中国,河南省,新乡市', 113.88400268554688, 35.3026008605957, 'Xinxiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1601, '410702', '红旗区', '410700', '红旗', 3, '0373', '453000', '中国,河南省,新乡市,红旗区', 113.875, 35.3036994934082, 'Hongqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1602, '410703', '卫滨区', '410700', '卫滨', 3, '0373', '453000', '中国,河南省,新乡市,卫滨区', 113.86599731445312, 35.302101135253906, 'Weibin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1603, '410704', '凤泉区', '410700', '凤泉', 3, '0373', '453011', '中国,河南省,新乡市,凤泉区', 113.91500091552734, 35.38399887084961, 'Fengquan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1604, '410711', '牧野区', '410700', '牧野', 3, '0373', '453002', '中国,河南省,新乡市,牧野区', 113.90899658203125, 35.31489944458008, 'Muye'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1605, '410721', '新乡县', '410700', '新乡', 3, '0373', '453700', '中国,河南省,新乡市,新乡县', 113.80500030517578, 35.190799713134766, 'Xinxiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1606, '410724', '获嘉县', '410700', '获嘉', 3, '0373', '453800', '中国,河南省,新乡市,获嘉县', 113.66200256347656, 35.265201568603516, 'Huojia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1607, '410725', '原阳县', '410700', '原阳', 3, '0373', '453500', '中国,河南省,新乡市,原阳县', 113.94000244140625, 35.06570053100586, 'Yuanyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1608, '410726', '延津县', '410700', '延津', 3, '0373', '453200', '中国,河南省,新乡市,延津县', 114.2030029296875, 35.1432991027832, 'Yanjin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1609, '410727', '封丘县', '410700', '封丘', 3, '0373', '453300', '中国,河南省,新乡市,封丘县', 114.41899871826172, 35.04169845581055, 'Fengqiu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1610, '410728', '长垣县', '410700', '长垣', 3, '0373', '453400', '中国,河南省,新乡市,长垣县', 114.66899871826172, 35.20050048828125, 'Changyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1611, '410781', '卫辉市', '410700', '卫辉', 3, '0373', '453100', '中国,河南省,新乡市,卫辉市', 114.06500244140625, 35.398399353027344, 'Weihui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1612, '410782', '辉县市', '410700', '辉县', 3, '0373', '453600', '中国,河南省,新乡市,辉县市', 113.80699920654297, 35.46310043334961, 'Huixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1613, '410800', '焦作市', '410000', '焦作', 2, '0391', '454002', '中国,河南省,焦作市', 113.23799896240234, 35.23899841308594, 'Jiaozuo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1614, '410802', '解放区', '410800', '解放', 3, '0391', '454000', '中国,河南省,焦作市,解放区', 113.22899627685547, 35.24020004272461, 'Jiefang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1615, '410803', '中站区', '410800', '中站', 3, '0391', '454191', '中国,河南省,焦作市,中站区', 113.18299865722656, 35.23659896850586, 'Zhongzhan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1616, '410804', '马村区', '410800', '马村', 3, '0391', '454171', '中国,河南省,焦作市,马村区', 113.31900024414062, 35.269100189208984, 'Macun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1617, '410811', '山阳区', '410800', '山阳', 3, '0391', '454002', '中国,河南省,焦作市,山阳区', 113.25499725341797, 35.21440124511719, 'Shanyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1618, '410821', '修武县', '410800', '修武', 3, '0391', '454350', '中国,河南省,焦作市,修武县', 113.447998046875, 35.22359848022461, 'Xiuwu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1619, '410822', '博爱县', '410800', '博爱', 3, '0391', '454450', '中国,河南省,焦作市,博爱县', 113.06700134277344, 35.16939926147461, 'Boai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1620, '410823', '武陟县', '410800', '武陟', 3, '0391', '454950', '中国,河南省,焦作市,武陟县', 113.39700317382812, 35.09510040283203, 'Wuzhi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1621, '410825', '温县', '410800', '温县', 3, '0391', '454850', '中国,河南省,焦作市,温县', 113.08100128173828, 34.94020080566406, 'Wenxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1622, '410882', '沁阳市', '410800', '沁阳', 3, '0391', '454550', '中国,河南省,焦作市,沁阳市', 112.94499969482422, 35.08940124511719, 'Qinyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1623, '410883', '孟州市', '410800', '孟州', 3, '0391', '454750', '中国,河南省,焦作市,孟州市', 112.79100036621094, 34.907100677490234, 'Mengzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1624, '410900', '濮阳市', '410000', '濮阳', 2, '0393', '457000', '中国,河南省,濮阳市', 115.04100036621094, 35.7681999206543, 'Puyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1625, '410902', '华龙区', '410900', '华龙', 3, '0393', '457001', '中国,河南省,濮阳市,华龙区', 115.0739974975586, 35.777400970458984, 'Hualong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1626, '410922', '清丰县', '410900', '清丰', 3, '0393', '457300', '中国,河南省,濮阳市,清丰县', 115.10399627685547, 35.885101318359375, 'Qingfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1627, '410923', '南乐县', '410900', '南乐', 3, '0393', '457400', '中国,河南省,濮阳市,南乐县', 115.20600128173828, 36.076900482177734, 'Nanle'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1628, '410926', '范县', '410900', '范县', 3, '0393', '457500', '中国,河南省,濮阳市,范县', 115.50399780273438, 35.85179901123047, 'Fanxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1629, '410927', '台前县', '410900', '台前', 3, '0393', '457600', '中国,河南省,濮阳市,台前县', 115.87200164794922, 35.969200134277344, 'Taiqian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1630, '410928', '濮阳县', '410900', '濮阳', 3, '0393', '457100', '中国,河南省,濮阳市,濮阳县', 115.03099822998047, 35.70750045776367, 'Puyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1631, '411000', '许昌市', '410000', '许昌', 2, '0374', '461000', '中国,河南省,许昌市', 113.82599639892578, 34.02299880981445, 'Xuchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1632, '411002', '魏都区', '411000', '魏都', 3, '0374', '461000', '中国,河南省,许昌市,魏都区', 113.822998046875, 34.02539825439453, 'Weidu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1633, '411023', '许昌县', '411000', '许昌', 3, '0374', '461100', '中国,河南省,许昌市,许昌县', 113.84700012207031, 34.00410079956055, 'Xuchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1634, '411024', '鄢陵县', '411000', '鄢陵', 3, '0374', '461200', '中国,河南省,许昌市,鄢陵县', 114.18800354003906, 34.10319900512695, 'Yanling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1635, '411025', '襄城县', '411000', '襄城', 3, '0374', '461700', '中国,河南省,许昌市,襄城县', 113.48200225830078, 33.849300384521484, 'Xiangcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1636, '411081', '禹州市', '411000', '禹州', 3, '0374', '461670', '中国,河南省,许昌市,禹州市', 113.48799896240234, 34.140499114990234, 'Yuzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1637, '411082', '长葛市', '411000', '长葛', 3, '0374', '461500', '中国,河南省,许昌市,长葛市', 113.77300262451172, 34.21849822998047, 'Changge'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1638, '411100', '漯河市', '410000', '漯河', 2, '0395', '462000', '中国,河南省,漯河市', 114.0260009765625, 33.57590103149414, 'Luohe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1639, '411102', '源汇区', '411100', '源汇', 3, '0395', '462000', '中国,河南省,漯河市,源汇区', 114.00599670410156, 33.55630111694336, 'Yuanhui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1640, '411103', '郾城区', '411100', '郾城', 3, '0395', '462300', '中国,河南省,漯河市,郾城区', 114.00700378417969, 33.58720016479492, 'Yancheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1641, '411104', '召陵区', '411100', '召陵', 3, '0395', '462300', '中国,河南省,漯河市,召陵区', 114.09400177001953, 33.58599853515625, 'Zhaoling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1642, '411121', '舞阳县', '411100', '舞阳', 3, '0395', '462400', '中国,河南省,漯河市,舞阳县', 113.5979995727539, 33.43239974975586, 'Wuyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1643, '411122', '临颍县', '411100', '临颍', 3, '0395', '462600', '中国,河南省,漯河市,临颍县', 113.93699645996094, 33.81119918823242, 'Linying'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1644, '411200', '三门峡市', '410000', '三门峡', 2, '0398', '472000', '中国,河南省,三门峡市', 111.19400024414062, 34.77730178833008, 'Sanmenxia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1645, '411202', '湖滨区', '411200', '湖滨', 3, '0398', '472000', '中国,河南省,三门峡市,湖滨区', 111.19999694824219, 34.77870178222656, 'Hubin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1646, '411221', '渑池县', '411200', '渑池', 3, '0398', '472400', '中国,河南省,三门峡市,渑池县', 111.76200103759766, 34.76729965209961, 'Mianchi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1647, '411222', '陕县', '411200', '陕县', 3, '0398', '472100', '中国,河南省,三门峡市,陕县', 111.10299682617188, 34.72050094604492, 'Shanxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1648, '411224', '卢氏县', '411200', '卢氏', 3, '0398', '472200', '中国,河南省,三门峡市,卢氏县', 111.0479965209961, 34.05440139770508, 'Lushi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1649, '411281', '义马市', '411200', '义马', 3, '0398', '472300', '中国,河南省,三门峡市,义马市', 111.8740005493164, 34.74720001220703, 'Yima'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1650, '411282', '灵宝市', '411200', '灵宝', 3, '0398', '472500', '中国,河南省,三门峡市,灵宝市', 110.8949966430664, 34.51679992675781, 'Lingbao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1651, '411300', '南阳市', '410000', '南阳', 2, '0377', '473002', '中国,河南省,南阳市', 112.54100036621094, 32.99909973144531, 'Nanyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1652, '411302', '宛城区', '411300', '宛城', 3, '0377', '473001', '中国,河南省,南阳市,宛城区', 112.54000091552734, 33.00379943847656, 'Wancheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1653, '411303', '卧龙区', '411300', '卧龙', 3, '0377', '473003', '中国,河南省,南阳市,卧龙区', 112.53500366210938, 32.98609924316406, 'Wolong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1654, '411321', '南召县', '411300', '南召', 3, '0377', '474650', '中国,河南省,南阳市,南召县', 112.43199920654297, 33.49100112915039, 'Nanzhao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1655, '411322', '方城县', '411300', '方城', 3, '0377', '473200', '中国,河南省,南阳市,方城县', 113.01300048828125, 33.25450134277344, 'Fangcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1656, '411323', '西峡县', '411300', '西峡', 3, '0377', '474550', '中国,河南省,南阳市,西峡县', 111.48200225830078, 33.297698974609375, 'Xixia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1657, '411324', '镇平县', '411300', '镇平', 3, '0377', '474250', '中国,河南省,南阳市,镇平县', 112.23999786376953, 33.03630065917969, 'Zhenping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1658, '411325', '内乡县', '411300', '内乡', 3, '0377', '474350', '中国,河南省,南阳市,内乡县', 111.8499984741211, 33.04669952392578, 'Neixiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1659, '411326', '淅川县', '411300', '淅川', 3, '0377', '474450', '中国,河南省,南阳市,淅川县', 111.48699951171875, 33.13710021972656, 'Xichuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1660, '411327', '社旗县', '411300', '社旗', 3, '0377', '473300', '中国,河南省,南阳市,社旗县', 112.9469985961914, 33.05500030517578, 'Sheqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1661, '411328', '唐河县', '411300', '唐河', 3, '0377', '473400', '中国,河南省,南阳市,唐河县', 112.83599853515625, 32.69449996948242, 'Tanghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1662, '411329', '新野县', '411300', '新野', 3, '0377', '473500', '中国,河南省,南阳市,新野县', 112.36199951171875, 32.516998291015625, 'Xinye'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1663, '411330', '桐柏县', '411300', '桐柏', 3, '0377', '474750', '中国,河南省,南阳市,桐柏县', 113.42900085449219, 32.37919998168945, 'Tongbai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1664, '411381', '邓州市', '411300', '邓州', 3, '0377', '474150', '中国,河南省,南阳市,邓州市', 112.08999633789062, 32.68579864501953, 'Dengzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1665, '411400', '商丘市', '410000', '商丘', 2, '0370', '476000', '中国,河南省,商丘市', 115.6500015258789, 34.43709945678711, 'Shangqiu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1666, '411402', '梁园区', '411400', '梁园', 3, '0370', '476000', '中国,河南省,商丘市,梁园区', 115.6449966430664, 34.44340133666992, 'Liangyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1667, '411403', '睢阳区', '411400', '睢阳', 3, '0370', '476100', '中国,河南省,商丘市,睢阳区', 115.65299987792969, 34.38800048828125, 'Suiyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1668, '411421', '民权县', '411400', '民权', 3, '0370', '476800', '中国,河南省,商丘市,民权县', 115.14600372314453, 34.64929962158203, 'Minquan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1669, '411422', '睢县', '411400', '睢县', 3, '0370', '476900', '中国,河南省,商丘市,睢县', 115.0719985961914, 34.44540023803711, 'Suixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1670, '411423', '宁陵县', '411400', '宁陵', 3, '0370', '476700', '中国,河南省,商丘市,宁陵县', 115.30500030517578, 34.4546012878418, 'Ningling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1671, '411424', '柘城县', '411400', '柘城', 3, '0370', '476200', '中国,河南省,商丘市,柘城县', 115.30500030517578, 34.09109878540039, 'Zhecheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1672, '411425', '虞城县', '411400', '虞城', 3, '0370', '476300', '中国,河南省,商丘市,虞城县', 115.86299896240234, 34.40190124511719, 'Yucheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1673, '411426', '夏邑县', '411400', '夏邑', 3, '0370', '476400', '中国,河南省,商丘市,夏邑县', 116.13300323486328, 34.232398986816406, 'Xiayi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1674, '411481', '永城市', '411400', '永城', 3, '0370', '476600', '中国,河南省,商丘市,永城市', 116.4489974975586, 33.929100036621094, 'Yongcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1675, '411500', '信阳市', '410000', '信阳', 2, '0376', '464000', '中国,河南省,信阳市', 114.07499694824219, 32.12329864501953, 'Xinyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1676, '411502', '浉河区', '411500', '浉河', 3, '0376', '464000', '中国,河南省,信阳市,浉河区', 114.05899810791016, 32.116798400878906, 'Shihe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1677, '411503', '平桥区', '411500', '平桥', 3, '0376', '464100', '中国,河南省,信阳市,平桥区', 114.1240005493164, 32.10089874267578, 'Pingqiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1678, '411521', '罗山县', '411500', '罗山', 3, '0376', '464200', '中国,河南省,信阳市,罗山县', 114.53099822998047, 32.20280075073242, 'Luoshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1679, '411522', '光山县', '411500', '光山', 3, '0376', '465450', '中国,河南省,信阳市,光山县', 114.91899871826172, 32.0098991394043, 'Guangshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1680, '411523', '新县', '411500', '新县', 3, '0376', '465550', '中国,河南省,信阳市,新县', 114.87899780273438, 31.64389991760254, 'Xinxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1681, '411524', '商城县', '411500', '商城', 3, '0376', '465350', '中国,河南省,信阳市,商城县', 115.40899658203125, 31.79990005493164, 'Shangcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1682, '411525', '固始县', '411500', '固始', 3, '0376', '465250', '中国,河南省,信阳市,固始县', 115.68299865722656, 32.18009948730469, 'Gushi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1683, '411526', '潢川县', '411500', '潢川', 3, '0376', '465150', '中国,河南省,信阳市,潢川县', 115.0469970703125, 32.13759994506836, 'Huangchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1684, '411527', '淮滨县', '411500', '淮滨', 3, '0376', '464400', '中国,河南省,信阳市,淮滨县', 115.4209976196289, 32.46609878540039, 'Huaibin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1685, '411528', '息县', '411500', '息县', 3, '0376', '464300', '中国,河南省,信阳市,息县', 114.73999786376953, 32.34280014038086, 'Xixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1686, '411600', '周口市', '410000', '周口', 2, '0394', '466000', '中国,河南省,周口市', 114.6500015258789, 33.620399475097656, 'Zhoukou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1687, '411602', '川汇区', '411600', '川汇', 3, '0394', '466000', '中国,河南省,周口市,川汇区', 114.64199829101562, 33.6255989074707, 'Chuanhui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1688, '411621', '扶沟县', '411600', '扶沟', 3, '0394', '461300', '中国,河南省,周口市,扶沟县', 114.3949966430664, 34.060001373291016, 'Fugou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1689, '411622', '西华县', '411600', '西华', 3, '0394', '466600', '中国,河南省,周口市,西华县', 114.52300262451172, 33.785499572753906, 'Xihua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1690, '411623', '商水县', '411600', '商水', 3, '0394', '466100', '中国,河南省,周口市,商水县', 114.60600280761719, 33.539100646972656, 'Shangshui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1691, '411624', '沈丘县', '411600', '沈丘', 3, '0394', '466300', '中国,河南省,周口市,沈丘县', 115.0989990234375, 33.409400939941406, 'Shenqiu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1692, '411625', '郸城县', '411600', '郸城', 3, '0394', '477150', '中国,河南省,周口市,郸城县', 115.177001953125, 33.644901275634766, 'Dancheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1693, '411626', '淮阳县', '411600', '淮阳', 3, '0394', '466700', '中国,河南省,周口市,淮阳县', 114.88800048828125, 33.73210144042969, 'Huaiyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1694, '411627', '太康县', '411600', '太康', 3, '0394', '461400', '中国,河南省,周口市,太康县', 114.83799743652344, 34.06380081176758, 'Taikang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1695, '411628', '鹿邑县', '411600', '鹿邑', 3, '0394', '477200', '中国,河南省,周口市,鹿邑县', 115.48600006103516, 33.85929870605469, 'Luyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1696, '411681', '项城市', '411600', '项城', 3, '0394', '466200', '中国,河南省,周口市,项城市', 114.8759994506836, 33.467201232910156, 'Xiangcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1697, '411700', '驻马店市', '410000', '驻马店', 2, '0396', '463000', '中国,河南省,驻马店市', 114.0250015258789, 32.980201721191406, 'Zhumadian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1698, '411702', '驿城区', '411700', '驿城', 3, '0396', '463000', '中国,河南省,驻马店市,驿城区', 113.99400329589844, 32.973201751708984, 'Yicheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1699, '411721', '西平县', '411700', '西平', 3, '0396', '463900', '中国,河南省,驻马店市,西平县', 114.02300262451172, 33.384498596191406, 'Xiping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1700, '411722', '上蔡县', '411700', '上蔡', 3, '0396', '463800', '中国,河南省,驻马店市,上蔡县', 114.26799774169922, 33.2681999206543, 'Shangcai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1701, '411723', '平舆县', '411700', '平舆', 3, '0396', '463400', '中国,河南省,驻马店市,平舆县', 114.63600158691406, 32.957298278808594, 'Pingyu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1702, '411724', '正阳县', '411700', '正阳', 3, '0396', '463600', '中国,河南省,驻马店市,正阳县', 114.38999938964844, 32.60390090942383, 'Zhengyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1703, '411725', '确山县', '411700', '确山', 3, '0396', '463200', '中国,河南省,驻马店市,确山县', 114.02899932861328, 32.802799224853516, 'Queshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1704, '411726', '泌阳县', '411700', '泌阳', 3, '0396', '463700', '中国,河南省,驻马店市,泌阳县', 113.3270034790039, 32.71780014038086, 'Biyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1705, '411727', '汝南县', '411700', '汝南', 3, '0396', '463300', '中国,河南省,驻马店市,汝南县', 114.36100006103516, 33.004600524902344, 'Runan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1706, '411728', '遂平县', '411700', '遂平', 3, '0396', '463100', '中国,河南省,驻马店市,遂平县', 114.01300048828125, 33.14569854736328, 'Suiping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1707, '411729', '新蔡县', '411700', '新蔡', 3, '0396', '463500', '中国,河南省,驻马店市,新蔡县', 114.98200225830078, 32.75019836425781, 'Xincai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1708, '419000', '直辖县级', '410000', ' ', 2, '', '', '中国,河南省,直辖县级', 113.66500091552734, 34.757999420166016, ''); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1709, '419001', '济源市', '419000', '济源', 3, '0391', '454650', '中国,河南省,直辖县级,济源市', 112.58999633789062, 35.09040069580078, 'Jiyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1710, '420000', '湖北省', '100000', '湖北', 1, '', '1', '中国,湖北省', 114.29900360107422, 30.584400177001953, 'Hubei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1711, '420100', '武汉市', '420000', '武汉', 2, '', '430014', '中国,湖北省,武汉市', 114.29900360107422, 30.584400177001953, 'Wuhan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1712, '420102', '江岸区', '420100', '江岸', 3, '027', '430014', '中国,湖北省,武汉市,江岸区', 114.30899810791016, 30.59980010986328, 'Jiang\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1713, '420103', '江汉区', '420100', '江汉', 3, '027', '430021', '中国,湖北省,武汉市,江汉区', 114.27100372314453, 30.601499557495117, 'Jianghan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1714, '420104', '硚口区', '420100', '硚口', 3, '027', '430033', '中国,湖北省,武汉市,硚口区', 114.26399993896484, 30.569499969482422, 'Qiaokou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1715, '420105', '汉阳区', '420100', '汉阳', 3, '027', '430050', '中国,湖北省,武汉市,汉阳区', 114.2750015258789, 30.5492000579834, 'Hanyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1716, '420106', '武昌区', '420100', '武昌', 3, '027', '430061', '中国,湖北省,武汉市,武昌区', 114.31600189208984, 30.55389976501465, 'Wuchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1717, '420107', '青山区', '420100', '青山', 3, '027', '430080', '中国,湖北省,武汉市,青山区', 114.39099884033203, 30.634300231933594, 'Qingshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1718, '420111', '洪山区', '420100', '洪山', 3, '027', '430070', '中国,湖北省,武汉市,洪山区', 114.34400177001953, 30.499900817871094, 'Hongshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1719, '420112', '东西湖区', '420100', '东西湖', 3, '027', '430040', '中国,湖北省,武汉市,东西湖区', 114.13700103759766, 30.61989974975586, 'Dongxihu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1720, '420113', '汉南区', '420100', '汉南', 3, '027', '430090', '中国,湖北省,武汉市,汉南区', 114.08499908447266, 30.308799743652344, 'Hannan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1721, '420114', '蔡甸区', '420100', '蔡甸', 3, '027', '430100', '中国,湖北省,武汉市,蔡甸区', 114.02899932861328, 30.582000732421875, 'Caidian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1722, '420115', '江夏区', '420100', '江夏', 3, '027', '430200', '中国,湖北省,武汉市,江夏区', 114.31300354003906, 30.346500396728516, 'Jiangxia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1723, '420116', '黄陂区', '420100', '黄陂', 3, '027', '432200', '中国,湖北省,武汉市,黄陂区', 114.375, 30.881500244140625, 'Huangpi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1724, '420117', '新洲区', '420100', '新洲', 3, '027', '431400', '中国,湖北省,武汉市,新洲区', 114.8010025024414, 30.841400146484375, 'Xinzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1725, '420200', '黄石市', '420000', '黄石', 2, '0714', '435003', '中国,湖北省,黄石市', 115.0770034790039, 30.22010040283203, 'Huangshi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1726, '420202', '黄石港区', '420200', '黄石港', 3, '0714', '435000', '中国,湖北省,黄石市,黄石港区', 115.06600189208984, 30.22279930114746, 'Huangshigang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1727, '420203', '西塞山区', '420200', '西塞山', 3, '0714', '435001', '中国,湖北省,黄石市,西塞山区', 115.11000061035156, 30.20490074157715, 'Xisaishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1728, '420204', '下陆区', '420200', '下陆', 3, '0714', '435005', '中国,湖北省,黄石市,下陆区', 114.96099853515625, 30.1737003326416, 'Xialu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1729, '420205', '铁山区', '420200', '铁山', 3, '0714', '435006', '中国,湖北省,黄石市,铁山区', 114.9010009765625, 30.20680046081543, 'Tieshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1730, '420222', '阳新县', '420200', '阳新', 3, '0714', '435200', '中国,湖北省,黄石市,阳新县', 115.21499633789062, 29.830400466918945, 'Yangxin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1731, '420281', '大冶市', '420200', '大冶', 3, '0714', '435100', '中国,湖北省,黄石市,大冶市', 114.97200012207031, 30.09440040588379, 'Daye'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1732, '420300', '十堰市', '420000', '十堰', 2, '0719', '442000', '中国,湖北省,十堰市', 110.78500366210938, 32.64699935913086, 'Shiyan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1733, '420302', '茅箭区', '420300', '茅箭', 3, '0719', '442012', '中国,湖北省,十堰市,茅箭区', 110.81300354003906, 32.59149932861328, 'Maojian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1734, '420303', '张湾区', '420300', '张湾', 3, '0719', '442001', '中国,湖北省,十堰市,张湾区', 110.77100372314453, 32.652000427246094, 'Zhangwan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1735, '420304', '郧阳区', '420300', '郧阳', 3, '0719', '442500', '中国,湖北省,十堰市,郧阳区', 110.81900024414062, 32.835899353027344, 'Yunyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1736, '420322', '郧西县', '420300', '郧西', 3, '0719', '442600', '中国,湖北省,十堰市,郧西县', 110.4260025024414, 32.993499755859375, 'Yunxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1737, '420323', '竹山县', '420300', '竹山', 3, '0719', '442200', '中国,湖北省,十堰市,竹山县', 110.23100280761719, 32.225399017333984, 'Zhushan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1738, '420324', '竹溪县', '420300', '竹溪', 3, '0719', '442300', '中国,湖北省,十堰市,竹溪县', 109.71800231933594, 32.319000244140625, 'Zhuxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1739, '420325', '房县', '420300', '房县', 3, '0719', '442100', '中国,湖北省,十堰市,房县', 110.74400329589844, 32.057899475097656, 'Fangxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1740, '420381', '丹江口市', '420300', '丹江口', 3, '0719', '442700', '中国,湖北省,十堰市,丹江口市', 111.51499938964844, 32.54090118408203, 'Danjiangkou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1741, '420500', '宜昌市', '420000', '宜昌', 2, '0717', '443000', '中国,湖北省,宜昌市', 111.29100036621094, 30.702600479125977, 'Yichang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1742, '420502', '西陵区', '420500', '西陵', 3, '0717', '443000', '中国,湖北省,宜昌市,西陵区', 111.28600311279297, 30.710800170898438, 'Xiling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1743, '420503', '伍家岗区', '420500', '伍家岗', 3, '0717', '443001', '中国,湖北省,宜昌市,伍家岗区', 111.36100006103516, 30.64430046081543, 'Wujiagang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1744, '420504', '点军区', '420500', '点军', 3, '0717', '443006', '中国,湖北省,宜昌市,点军区', 111.26799774169922, 30.69339942932129, 'Dianjun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1745, '420505', '猇亭区', '420500', '猇亭', 3, '0717', '443007', '中国,湖北省,宜昌市,猇亭区', 111.44100189208984, 30.526599884033203, 'Xiaoting'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1746, '420506', '夷陵区', '420500', '夷陵', 3, '0717', '443100', '中国,湖北省,宜昌市,夷陵区', 111.32599639892578, 30.768800735473633, 'Yiling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1747, '420525', '远安县', '420500', '远安', 3, '0717', '444200', '中国,湖北省,宜昌市,远安县', 111.64199829101562, 31.059900283813477, 'Yuan\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1748, '420526', '兴山县', '420500', '兴山', 3, '0717', '443711', '中国,湖北省,宜昌市,兴山县', 110.75, 31.346900939941406, 'Xingshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1749, '420527', '秭归县', '420500', '秭归', 3, '0717', '443600', '中国,湖北省,宜昌市,秭归县', 110.98200225830078, 30.82699966430664, 'Zigui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1750, '420528', '长阳土家族自治县', '420500', '长阳', 3, '0717', '443500', '中国,湖北省,宜昌市,长阳土家族自治县', 111.20099639892578, 30.470500946044922, 'Changyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1751, '420529', '五峰土家族自治县', '420500', '五峰', 3, '0717', '443413', '中国,湖北省,宜昌市,五峰土家族自治县', 110.67500305175781, 30.19860076904297, 'Wufeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1752, '420581', '宜都市', '420500', '宜都', 3, '0717', '443300', '中国,湖北省,宜昌市,宜都市', 111.44999694824219, 30.37809944152832, 'Yidu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1753, '420582', '当阳市', '420500', '当阳', 3, '0717', '444100', '中国,湖北省,宜昌市,当阳市', 111.78900146484375, 30.82080078125, 'Dangyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1754, '420583', '枝江市', '420500', '枝江', 3, '0717', '443200', '中国,湖北省,宜昌市,枝江市', 111.76899719238281, 30.42609977722168, 'Zhijiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1755, '420600', '襄阳市', '420000', '襄阳', 2, '0710', '441021', '中国,湖北省,襄阳市', 112.14399719238281, 32.04240036010742, 'Xiangyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1756, '420602', '襄城区', '420600', '襄城', 3, '0710', '441021', '中国,湖北省,襄阳市,襄城区', 112.13400268554688, 32.01020050048828, 'Xiangcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1757, '420606', '樊城区', '420600', '樊城', 3, '0710', '441001', '中国,湖北省,襄阳市,樊城区', 112.13500213623047, 32.0447998046875, 'Fancheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1758, '420607', '襄州区', '420600', '襄州', 3, '0710', '441100', '中国,湖北省,襄阳市,襄州区', 112.1500015258789, 32.015098571777344, 'Xiangzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1759, '420624', '南漳县', '420600', '南漳', 3, '0710', '441500', '中国,湖北省,襄阳市,南漳县', 111.84600067138672, 31.776500701904297, 'Nanzhang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1760, '420625', '谷城县', '420600', '谷城', 3, '0710', '441700', '中国,湖北省,襄阳市,谷城县', 111.65299987792969, 32.26380157470703, 'Gucheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1761, '420626', '保康县', '420600', '保康', 3, '0710', '441600', '中国,湖北省,襄阳市,保康县', 111.26100158691406, 31.878700256347656, 'Baokang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1762, '420682', '老河口市', '420600', '老河口', 3, '0710', '441800', '中国,湖北省,襄阳市,老河口市', 111.6709976196289, 32.38479995727539, 'Laohekou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1763, '420683', '枣阳市', '420600', '枣阳', 3, '0710', '441200', '中国,湖北省,襄阳市,枣阳市', 112.77400207519531, 32.13140106201172, 'Zaoyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1764, '420684', '宜城市', '420600', '宜城', 3, '0710', '441400', '中国,湖北省,襄阳市,宜城市', 112.25800323486328, 31.71969985961914, 'Yicheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1765, '420700', '鄂州市', '420000', '鄂州', 2, '0711', '436000', '中国,湖北省,鄂州市', 114.89099884033203, 30.396499633789062, 'Ezhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1766, '420702', '梁子湖区', '420700', '梁子湖', 3, '0711', '436064', '中国,湖北省,鄂州市,梁子湖区', 114.68499755859375, 30.100000381469727, 'Liangzihu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1767, '420703', '华容区', '420700', '华容', 3, '0711', '436030', '中国,湖北省,鄂州市,华容区', 114.73600006103516, 30.533300399780273, 'Huarong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1768, '420704', '鄂城区', '420700', '鄂城', 3, '0711', '436000', '中国,湖北省,鄂州市,鄂城区', 114.89199829101562, 30.40019989013672, 'Echeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1769, '420800', '荆门市', '420000', '荆门', 2, '0724', '448000', '中国,湖北省,荆门市', 112.2040023803711, 31.035400390625, 'Jingmen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1770, '420802', '东宝区', '420800', '东宝', 3, '0724', '448004', '中国,湖北省,荆门市,东宝区', 112.20099639892578, 31.05190086364746, 'Dongbao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1771, '420804', '掇刀区', '420800', '掇刀', 3, '0724', '448124', '中国,湖北省,荆门市,掇刀区', 112.20800018310547, 30.97319984436035, 'Duodao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1772, '420821', '京山县', '420800', '京山', 3, '0724', '431800', '中国,湖北省,荆门市,京山县', 113.11100006103516, 31.02239990234375, 'Jingshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1773, '420822', '沙洋县', '420800', '沙洋', 3, '0724', '448200', '中国,湖北省,荆门市,沙洋县', 112.58899688720703, 30.709199905395508, 'Shayang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1774, '420881', '钟祥市', '420800', '钟祥', 3, '0724', '431900', '中国,湖北省,荆门市,钟祥市', 112.58899688720703, 31.167800903320312, 'Zhongxiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1775, '420900', '孝感市', '420000', '孝感', 2, '0712', '432100', '中国,湖北省,孝感市', 113.927001953125, 30.92639923095703, 'Xiaogan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1776, '420902', '孝南区', '420900', '孝南', 3, '0712', '432100', '中国,湖北省,孝感市,孝南区', 113.91100311279297, 30.916799545288086, 'Xiaonan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1777, '420921', '孝昌县', '420900', '孝昌', 3, '0712', '432900', '中国,湖北省,孝感市,孝昌县', 113.99800109863281, 31.257999420166016, 'Xiaochang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1778, '420922', '大悟县', '420900', '大悟', 3, '0712', '432800', '中国,湖北省,孝感市,大悟县', 114.1259994506836, 31.561800003051758, 'Dawu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1779, '420923', '云梦县', '420900', '云梦', 3, '0712', '432500', '中国,湖北省,孝感市,云梦县', 113.75299835205078, 31.02090072631836, 'Yunmeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1780, '420981', '应城市', '420900', '应城', 3, '0712', '432400', '中国,湖北省,孝感市,应城市', 113.572998046875, 30.928300857543945, 'Yingcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1781, '420982', '安陆市', '420900', '安陆', 3, '0712', '432600', '中国,湖北省,孝感市,安陆市', 113.68599700927734, 31.256900787353516, 'Anlu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1782, '420984', '汉川市', '420900', '汉川', 3, '0712', '432300', '中国,湖北省,孝感市,汉川市', 113.83899688720703, 30.66119956970215, 'Hanchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1783, '421000', '荆州市', '420000', '荆州', 2, '0716', '434000', '中国,湖北省,荆州市', 112.23799896240234, 30.326900482177734, 'Jingzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1784, '421002', '沙市区', '421000', '沙市', 3, '0716', '434000', '中国,湖北省,荆州市,沙市区', 112.25499725341797, 30.311100006103516, 'Shashi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1785, '421003', '荆州区', '421000', '荆州', 3, '0716', '434020', '中国,湖北省,荆州市,荆州区', 112.19000244140625, 30.35260009765625, 'Jingzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1786, '421022', '公安县', '421000', '公安', 3, '0716', '434300', '中国,湖北省,荆州市,公安县', 112.23200225830078, 30.05900001525879, 'Gong\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1787, '421023', '监利县', '421000', '监利', 3, '0716', '433300', '中国,湖北省,荆州市,监利县', 112.8949966430664, 29.814899444580078, 'Jianli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1788, '421024', '江陵县', '421000', '江陵', 3, '0716', '434101', '中国,湖北省,荆州市,江陵县', 112.42500305175781, 30.04170036315918, 'Jiangling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1789, '421081', '石首市', '421000', '石首', 3, '0716', '434400', '中国,湖北省,荆州市,石首市', 112.4260025024414, 29.72130012512207, 'Shishou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1790, '421083', '洪湖市', '421000', '洪湖', 3, '0716', '433200', '中国,湖北省,荆州市,洪湖市', 113.47599792480469, 29.82699966430664, 'Honghu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1791, '421087', '松滋市', '421000', '松滋', 3, '0716', '434200', '中国,湖北省,荆州市,松滋市', 111.76699829101562, 30.169599533081055, 'Songzi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1792, '421100', '黄冈市', '420000', '黄冈', 2, '0713', '438000', '中国,湖北省,黄冈市', 114.87899780273438, 30.44770050048828, 'Huanggang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1793, '421102', '黄州区', '421100', '黄州', 3, '0713', '438000', '中国,湖北省,黄冈市,黄州区', 114.87999725341797, 30.43440055847168, 'Huangzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1794, '421121', '团风县', '421100', '团风', 3, '0713', '438800', '中国,湖北省,黄冈市,团风县', 114.87200164794922, 30.643600463867188, 'Tuanfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1795, '421122', '红安县', '421100', '红安', 3, '0713', '438401', '中国,湖北省,黄冈市,红安县', 114.62200164794922, 31.286699295043945, 'Hong\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1796, '421123', '罗田县', '421100', '罗田', 3, '0713', '438600', '中国,湖北省,黄冈市,罗田县', 115.4000015258789, 30.78260040283203, 'Luotian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1797, '421124', '英山县', '421100', '英山', 3, '0713', '438700', '中国,湖北省,黄冈市,英山县', 115.68099975585938, 30.735200881958008, 'Yingshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1798, '421125', '浠水县', '421100', '浠水', 3, '0713', '438200', '中国,湖北省,黄冈市,浠水县', 115.26899719238281, 30.452699661254883, 'Xishui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1799, '421126', '蕲春县', '421100', '蕲春', 3, '0713', '435300', '中国,湖北省,黄冈市,蕲春县', 115.43599700927734, 30.22610092163086, 'Qichun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1800, '421127', '黄梅县', '421100', '黄梅', 3, '0713', '435500', '中国,湖北省,黄冈市,黄梅县', 115.94400024414062, 30.07029914855957, 'Huangmei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1801, '421181', '麻城市', '421100', '麻城', 3, '0713', '438300', '中国,湖北省,黄冈市,麻城市', 115.01000213623047, 31.172300338745117, 'Macheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1802, '421182', '武穴市', '421100', '武穴', 3, '0713', '435400', '中国,湖北省,黄冈市,武穴市', 115.55999755859375, 29.844499588012695, 'Wuxue'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1803, '421200', '咸宁市', '420000', '咸宁', 2, '0715', '437000', '中国,湖北省,咸宁市', 114.3290023803711, 29.832799911499023, 'Xianning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1804, '421202', '咸安区', '421200', '咸安', 3, '0715', '437000', '中国,湖北省,咸宁市,咸安区', 114.29900360107422, 29.8528995513916, 'Xian\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1805, '421221', '嘉鱼县', '421200', '嘉鱼', 3, '0715', '437200', '中国,湖北省,咸宁市,嘉鱼县', 113.93900299072266, 29.970500946044922, 'Jiayu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1806, '421222', '通城县', '421200', '通城', 3, '0715', '437400', '中国,湖北省,咸宁市,通城县', 113.81600189208984, 29.24570083618164, 'Tongcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1807, '421223', '崇阳县', '421200', '崇阳', 3, '0715', '437500', '中国,湖北省,咸宁市,崇阳县', 114.04000091552734, 29.555599212646484, 'Chongyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1808, '421224', '通山县', '421200', '通山', 3, '0715', '437600', '中国,湖北省,咸宁市,通山县', 114.48200225830078, 29.606300354003906, 'Tongshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1809, '421281', '赤壁市', '421200', '赤壁', 3, '0715', '437300', '中国,湖北省,咸宁市,赤壁市', 113.9000015258789, 29.72450065612793, 'Chibi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1810, '421300', '随州市', '420000', '随州', 2, '0722', '441300', '中国,湖北省,随州市', 113.3740005493164, 31.717500686645508, 'Suizhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1811, '421303', '曾都区', '421300', '曾都', 3, '0722', '441300', '中国,湖北省,随州市,曾都区', 113.37100219726562, 31.716100692749023, 'Zengdu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1812, '421321', '随县', '421300', '随县', 3, '0722', '441309', '中国,湖北省,随州市,随县', 113.8270034790039, 31.617900848388672, 'Suixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1813, '421381', '广水市', '421300', '广水', 3, '0722', '432700', '中国,湖北省,随州市,广水市', 113.8270034790039, 31.617900848388672, 'Guangshui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1814, '422800', '恩施土家族苗族自治州', '420000', '恩施', 2, '0718', '445000', '中国,湖北省,恩施土家族苗族自治州', 109.48699951171875, 30.283100128173828, 'Enshi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1815, '422801', '恩施市', '422800', '恩施', 3, '0718', '445000', '中国,湖北省,恩施土家族苗族自治州,恩施市', 109.47899627685547, 30.295000076293945, 'Enshi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1816, '422802', '利川市', '422800', '利川', 3, '0718', '445400', '中国,湖北省,恩施土家族苗族自治州,利川市', 108.93599700927734, 30.291200637817383, 'Lichuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1817, '422822', '建始县', '422800', '建始', 3, '0718', '445300', '中国,湖北省,恩施土家族苗族自治州,建始县', 109.72200012207031, 30.602100372314453, 'Jianshi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1818, '422823', '巴东县', '422800', '巴东', 3, '0718', '444300', '中国,湖北省,恩施土家族苗族自治州,巴东县', 110.34100341796875, 31.042299270629883, 'Badong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1819, '422825', '宣恩县', '422800', '宣恩', 3, '0718', '445500', '中国,湖北省,恩施土家族苗族自治州,宣恩县', 109.49199676513672, 29.98710060119629, 'Xuanen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1820, '422826', '咸丰县', '422800', '咸丰', 3, '0718', '445600', '中国,湖北省,恩施土家族苗族自治州,咸丰县', 109.1520004272461, 29.679800033569336, 'Xianfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1821, '422827', '来凤县', '422800', '来凤', 3, '0718', '445700', '中国,湖北省,恩施土家族苗族自治州,来凤县', 109.40699768066406, 29.49370002746582, 'Laifeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1822, '422828', '鹤峰县', '422800', '鹤峰', 3, '0718', '445800', '中国,湖北省,恩施土家族苗族自治州,鹤峰县', 110.03099822998047, 29.89069938659668, 'Hefeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1823, '429000', '直辖县级', '420000', ' ', 2, '', '', '中国,湖北省,直辖县级', 114.29900360107422, 30.584400177001953, ''); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1824, '429004', '仙桃市', '429000', '仙桃', 3, '0728', '433000', '中国,湖北省,直辖县级,仙桃市', 113.4540023803711, 30.364999771118164, 'Xiantao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1825, '429005', '潜江市', '429000', '潜江', 3, '0728', '433100', '中国,湖北省,直辖县级,潜江市', 112.89700317382812, 30.421199798583984, 'Qianjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1826, '429006', '天门市', '429000', '天门', 3, '0728', '431700', '中国,湖北省,直辖县级,天门市', 113.16600036621094, 30.653099060058594, 'Tianmen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1827, '429021', '神农架林区', '429000', '神农架', 3, '0719', '442400', '中国,湖北省,直辖县级,神农架林区', 110.6719970703125, 31.744400024414062, 'Shennongjia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1828, '430000', '湖南省', '100000', '湖南', 1, '', '1', '中国,湖南省', 112.98200225830078, 28.19409942626953, 'Hunan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1829, '430100', '长沙市', '430000', '长沙', 2, '0731', '410005', '中国,湖南省,长沙市', 112.98200225830078, 28.19409942626953, 'Changsha'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1830, '430102', '芙蓉区', '430100', '芙蓉', 3, '0731', '410011', '中国,湖南省,长沙市,芙蓉区', 113.03199768066406, 28.18440055847168, 'Furong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1831, '430103', '天心区', '430100', '天心', 3, '0731', '410004', '中国,湖南省,长沙市,天心区', 112.98999786376953, 28.112699508666992, 'Tianxin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1832, '430104', '岳麓区', '430100', '岳麓', 3, '0731', '410013', '中国,湖南省,长沙市,岳麓区', 112.93099975585938, 28.23509979248047, 'Yuelu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1833, '430105', '开福区', '430100', '开福', 3, '0731', '410008', '中国,湖南省,长沙市,开福区', 112.98600006103516, 28.255800247192383, 'Kaifu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1834, '430111', '雨花区', '430100', '雨花', 3, '0731', '410011', '中国,湖南省,长沙市,雨花区', 113.03600311279297, 28.135400772094727, 'Yuhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1835, '430112', '望城区', '430100', '望城', 3, '0731', '410200', '中国,湖南省,长沙市,望城区', 112.81999969482422, 28.34749984741211, 'Wangcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1836, '430121', '长沙县', '430100', '长沙', 3, '0731', '410100', '中国,湖南省,长沙市,长沙县', 113.08100128173828, 28.246000289916992, 'Changsha'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1837, '430124', '宁乡县', '430100', '宁乡', 3, '0731', '410600', '中国,湖南省,长沙市,宁乡县', 112.55699920654297, 28.253599166870117, 'Ningxiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1838, '430181', '浏阳市', '430100', '浏阳', 3, '0731', '410300', '中国,湖南省,长沙市,浏阳市', 113.64299774169922, 28.163700103759766, 'Liuyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1839, '430200', '株洲市', '430000', '株洲', 2, '0731', '412000', '中国,湖南省,株洲市', 113.1520004272461, 27.835800170898438, 'Zhuzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1840, '430202', '荷塘区', '430200', '荷塘', 3, '0731', '412000', '中国,湖南省,株洲市,荷塘区', 113.1729965209961, 27.85569953918457, 'Hetang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1841, '430203', '芦淞区', '430200', '芦淞', 3, '0731', '412000', '中国,湖南省,株洲市,芦淞区', 113.15599822998047, 27.785200119018555, 'Lusong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1842, '430204', '石峰区', '430200', '石峰', 3, '0731', '412005', '中国,湖南省,株洲市,石峰区', 113.11799621582031, 27.875499725341797, 'Shifeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1843, '430211', '天元区', '430200', '天元', 3, '0731', '412007', '中国,湖南省,株洲市,天元区', 113.12300109863281, 27.83099937438965, 'Tianyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1844, '430221', '株洲县', '430200', '株洲', 3, '0731', '412100', '中国,湖南省,株洲市,株洲县', 113.14399719238281, 27.698299407958984, 'Zhuzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1845, '430223', '攸县', '430200', '攸县', 3, '0731', '412300', '中国,湖南省,株洲市,攸县', 113.34400177001953, 27.00349998474121, 'Youxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1846, '430224', '茶陵县', '430200', '茶陵', 3, '0731', '412400', '中国,湖南省,株洲市,茶陵县', 113.54399871826172, 26.791500091552734, 'Chaling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1847, '430225', '炎陵县', '430200', '炎陵', 3, '0731', '412500', '中国,湖南省,株洲市,炎陵县', 113.77200317382812, 26.48819923400879, 'Yanling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1848, '430281', '醴陵市', '430200', '醴陵', 3, '0731', '412200', '中国,湖南省,株洲市,醴陵市', 113.49700164794922, 27.64620018005371, 'Liling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1849, '430300', '湘潭市', '430000', '湘潭', 2, '0731', '411100', '中国,湖南省,湘潭市', 112.92500305175781, 27.84670066833496, 'Xiangtan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1850, '430302', '雨湖区', '430300', '雨湖', 3, '0731', '411100', '中国,湖南省,湘潭市,雨湖区', 112.90399932861328, 27.868600845336914, 'Yuhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1851, '430304', '岳塘区', '430300', '岳塘', 3, '0731', '411101', '中国,湖南省,湘潭市,岳塘区', 112.96099853515625, 27.857799530029297, 'Yuetang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1852, '430321', '湘潭县', '430300', '湘潭', 3, '0731', '411228', '中国,湖南省,湘潭市,湘潭县', 112.95099639892578, 27.778900146484375, 'Xiangtan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1853, '430381', '湘乡市', '430300', '湘乡', 3, '0731', '411400', '中国,湖南省,湘潭市,湘乡市', 112.53500366210938, 27.73539924621582, 'Xiangxiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1854, '430382', '韶山市', '430300', '韶山', 3, '0731', '411300', '中国,湖南省,湘潭市,韶山市', 112.5270004272461, 27.915000915527344, 'Shaoshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1855, '430400', '衡阳市', '430000', '衡阳', 2, '0734', '421001', '中国,湖南省,衡阳市', 112.60800170898438, 26.900400161743164, 'Hengyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1856, '430405', '珠晖区', '430400', '珠晖', 3, '0734', '421002', '中国,湖南省,衡阳市,珠晖区', 112.62100219726562, 26.893600463867188, 'Zhuhui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1857, '430406', '雁峰区', '430400', '雁峰', 3, '0734', '421001', '中国,湖南省,衡阳市,雁峰区', 112.61699676513672, 26.888700485229492, 'Yanfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1858, '430407', '石鼓区', '430400', '石鼓', 3, '0734', '421005', '中国,湖南省,衡阳市,石鼓区', 112.61100006103516, 26.902299880981445, 'Shigu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1859, '430408', '蒸湘区', '430400', '蒸湘', 3, '0734', '421001', '中国,湖南省,衡阳市,蒸湘区', 112.60299682617188, 26.896499633789062, 'Zhengxiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1860, '430412', '南岳区', '430400', '南岳', 3, '0734', '421900', '中国,湖南省,衡阳市,南岳区', 112.73799896240234, 27.23259925842285, 'Nanyue'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1861, '430421', '衡阳县', '430400', '衡阳', 3, '0734', '421200', '中国,湖南省,衡阳市,衡阳县', 112.37100219726562, 26.970600128173828, 'Hengyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1862, '430422', '衡南县', '430400', '衡南', 3, '0734', '421131', '中国,湖南省,衡阳市,衡南县', 112.6780014038086, 26.738300323486328, 'Hengnan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1863, '430423', '衡山县', '430400', '衡山', 3, '0734', '421300', '中国,湖南省,衡阳市,衡山县', 112.86799621582031, 27.231300354003906, 'Hengshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1864, '430424', '衡东县', '430400', '衡东', 3, '0734', '421400', '中国,湖南省,衡阳市,衡东县', 112.947998046875, 27.080900192260742, 'Hengdong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1865, '430426', '祁东县', '430400', '祁东', 3, '0734', '421600', '中国,湖南省,衡阳市,祁东县', 112.08999633789062, 26.79960060119629, 'Qidong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1866, '430481', '耒阳市', '430400', '耒阳', 3, '0734', '421800', '中国,湖南省,衡阳市,耒阳市', 112.86000061035156, 26.421300888061523, 'Leiyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1867, '430482', '常宁市', '430400', '常宁', 3, '0734', '421500', '中国,湖南省,衡阳市,常宁市', 112.4010009765625, 26.40690040588379, 'Changning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1868, '430500', '邵阳市', '430000', '邵阳', 2, '0739', '422000', '中国,湖南省,邵阳市', 111.46900177001953, 27.23780059814453, 'Shaoyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1869, '430502', '双清区', '430500', '双清', 3, '0739', '422001', '中国,湖南省,邵阳市,双清区', 111.49700164794922, 27.232900619506836, 'Shuangqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1870, '430503', '大祥区', '430500', '大祥', 3, '0739', '422000', '中国,湖南省,邵阳市,大祥区', 111.4540023803711, 27.233299255371094, 'Daxiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1871, '430511', '北塔区', '430500', '北塔', 3, '0739', '422007', '中国,湖南省,邵阳市,北塔区', 111.4520034790039, 27.24650001525879, 'Beita'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1872, '430521', '邵东县', '430500', '邵东', 3, '0739', '422800', '中国,湖南省,邵阳市,邵东县', 111.74400329589844, 27.258399963378906, 'Shaodong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1873, '430522', '新邵县', '430500', '新邵', 3, '0739', '422900', '中国,湖南省,邵阳市,新邵县', 111.46099853515625, 27.321699142456055, 'Xinshao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1874, '430523', '邵阳县', '430500', '邵阳', 3, '0739', '422100', '中国,湖南省,邵阳市,邵阳县', 111.2750015258789, 26.99139976501465, 'Shaoyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1875, '430524', '隆回县', '430500', '隆回', 3, '0739', '422200', '中国,湖南省,邵阳市,隆回县', 111.03199768066406, 27.109399795532227, 'Longhui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1876, '430525', '洞口县', '430500', '洞口', 3, '0739', '422300', '中国,湖南省,邵阳市,洞口县', 110.5739974975586, 27.05459976196289, 'Dongkou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1877, '430527', '绥宁县', '430500', '绥宁', 3, '0739', '422600', '中国,湖南省,邵阳市,绥宁县', 110.15599822998047, 26.58639907836914, 'Suining'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1878, '430528', '新宁县', '430500', '新宁', 3, '0739', '422700', '中国,湖南省,邵阳市,新宁县', 110.85099792480469, 26.429399490356445, 'Xinning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1879, '430529', '城步苗族自治县', '430500', '城步', 3, '0739', '422500', '中国,湖南省,邵阳市,城步苗族自治县', 110.3219985961914, 26.390499114990234, 'Chengbu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1880, '430581', '武冈市', '430500', '武冈', 3, '0739', '422400', '中国,湖南省,邵阳市,武冈市', 110.63300323486328, 26.728200912475586, 'Wugang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1881, '430600', '岳阳市', '430000', '岳阳', 2, '0730', '414000', '中国,湖南省,岳阳市', 113.13300323486328, 29.37030029296875, 'Yueyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1882, '430602', '岳阳楼区', '430600', '岳阳楼', 3, '0730', '414000', '中国,湖南省,岳阳市,岳阳楼区', 113.12899780273438, 29.37190055847168, 'Yueyanglou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1883, '430603', '云溪区', '430600', '云溪', 3, '0730', '414009', '中国,湖南省,岳阳市,云溪区', 113.2770004272461, 29.473600387573242, 'Yunxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1884, '430611', '君山区', '430600', '君山', 3, '0730', '414005', '中国,湖南省,岳阳市,君山区', 113.00399780273438, 29.459400177001953, 'Junshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1885, '430621', '岳阳县', '430600', '岳阳', 3, '0730', '414100', '中国,湖南省,岳阳市,岳阳县', 113.12000274658203, 29.14310073852539, 'Yueyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1886, '430623', '华容县', '430600', '华容', 3, '0730', '414200', '中国,湖南省,岳阳市,华容县', 112.54100036621094, 29.53019905090332, 'Huarong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1887, '430624', '湘阴县', '430600', '湘阴', 3, '0730', '414600', '中国,湖南省,岳阳市,湘阴县', 112.90899658203125, 28.689199447631836, 'Xiangyin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1888, '430626', '平江县', '430600', '平江', 3, '0730', '414500', '中国,湖南省,岳阳市,平江县', 113.58100128173828, 28.706600189208984, 'Pingjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1889, '430681', '汨罗市', '430600', '汨罗', 3, '0730', '414400', '中国,湖南省,岳阳市,汨罗市', 113.06700134277344, 28.806299209594727, 'Miluo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1890, '430682', '临湘市', '430600', '临湘', 3, '0730', '414300', '中国,湖南省,岳阳市,临湘市', 113.44999694824219, 29.476999282836914, 'Linxiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1891, '430700', '常德市', '430000', '常德', 2, '0736', '415000', '中国,湖南省,常德市', 111.69100189208984, 29.040199279785156, 'Changde'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1892, '430702', '武陵区', '430700', '武陵', 3, '0736', '415000', '中国,湖南省,常德市,武陵区', 111.697998046875, 29.028799057006836, 'Wuling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1893, '430703', '鼎城区', '430700', '鼎城', 3, '0736', '415101', '中国,湖南省,常德市,鼎城区', 111.68099975585938, 29.018600463867188, 'Dingcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1894, '430721', '安乡县', '430700', '安乡', 3, '0736', '415600', '中国,湖南省,常德市,安乡县', 112.16699981689453, 29.413299560546875, 'Anxiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1895, '430722', '汉寿县', '430700', '汉寿', 3, '0736', '415900', '中国,湖南省,常德市,汉寿县', 111.96700286865234, 28.902999877929688, 'Hanshou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1896, '430723', '澧县', '430700', '澧县', 3, '0736', '415500', '中国,湖南省,常德市,澧县', 111.75900268554688, 29.63319969177246, 'Lixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1897, '430724', '临澧县', '430700', '临澧', 3, '0736', '415200', '中国,湖南省,常德市,临澧县', 111.6520004272461, 29.441600799560547, 'Linli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1898, '430725', '桃源县', '430700', '桃源', 3, '0736', '415700', '中国,湖南省,常德市,桃源县', 111.48899841308594, 28.904699325561523, 'Taoyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1899, '430726', '石门县', '430700', '石门', 3, '0736', '415300', '中国,湖南省,常德市,石门县', 111.37999725341797, 29.584199905395508, 'Shimen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1900, '430781', '津市市', '430700', '津市', 3, '0736', '415400', '中国,湖南省,常德市,津市市', 111.87799835205078, 29.605600357055664, 'Jinshi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1901, '430800', '张家界市', '430000', '张家界', 2, '0744', '427000', '中国,湖南省,张家界市', 110.4800033569336, 29.127399444580078, 'Zhangjiajie'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1902, '430802', '永定区', '430800', '永定', 3, '0744', '427000', '中国,湖南省,张家界市,永定区', 110.4749984741211, 29.133899688720703, 'Yongding'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1903, '430811', '武陵源区', '430800', '武陵源', 3, '0744', '427400', '中国,湖南省,张家界市,武陵源区', 110.55000305175781, 29.345699310302734, 'Wulingyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1904, '430821', '慈利县', '430800', '慈利', 3, '0744', '427200', '中国,湖南省,张家界市,慈利县', 111.13899993896484, 29.429899215698242, 'Cili'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1905, '430822', '桑植县', '430800', '桑植', 3, '0744', '427100', '中国,湖南省,张家界市,桑植县', 110.16300201416016, 29.398099899291992, 'Sangzhi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1906, '430900', '益阳市', '430000', '益阳', 2, '0737', '413000', '中国,湖南省,益阳市', 112.3550033569336, 28.570100784301758, 'Yiyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1907, '430902', '资阳区', '430900', '资阳', 3, '0737', '413001', '中国,湖南省,益阳市,资阳区', 112.3239974975586, 28.590999603271484, 'Ziyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1908, '430903', '赫山区', '430900', '赫山', 3, '0737', '413002', '中国,湖南省,益阳市,赫山区', 112.37300109863281, 28.574199676513672, 'Heshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1909, '430921', '南县', '430900', '南县', 3, '0737', '413200', '中国,湖南省,益阳市,南县', 112.39600372314453, 29.361600875854492, 'Nanxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1910, '430922', '桃江县', '430900', '桃江', 3, '0737', '413400', '中国,湖南省,益阳市,桃江县', 112.15599822998047, 28.51810073852539, 'Taojiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1911, '430923', '安化县', '430900', '安化', 3, '0737', '413500', '中国,湖南省,益阳市,安化县', 111.21299743652344, 28.37420082092285, 'Anhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1912, '430981', '沅江市', '430900', '沅江', 3, '0737', '413100', '中国,湖南省,益阳市,沅江市', 112.35399627685547, 28.8439998626709, 'Yuanjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1913, '431000', '郴州市', '430000', '郴州', 2, '0735', '423000', '中国,湖南省,郴州市', 113.03199768066406, 25.79360008239746, 'Chenzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1914, '431002', '北湖区', '431000', '北湖', 3, '0735', '423000', '中国,湖南省,郴州市,北湖区', 113.01100158691406, 25.784000396728516, 'Beihu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1915, '431003', '苏仙区', '431000', '苏仙', 3, '0735', '423000', '中国,湖南省,郴州市,苏仙区', 113.04199981689453, 25.800399780273438, 'Suxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1916, '431021', '桂阳县', '431000', '桂阳', 3, '0735', '424400', '中国,湖南省,郴州市,桂阳县', 112.73400115966797, 25.754100799560547, 'Guiyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1917, '431022', '宜章县', '431000', '宜章', 3, '0735', '424200', '中国,湖南省,郴州市,宜章县', 112.95099639892578, 25.39929962158203, 'Yizhang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1918, '431023', '永兴县', '431000', '永兴', 3, '0735', '423300', '中国,湖南省,郴州市,永兴县', 113.11199951171875, 26.12649917602539, 'Yongxing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1919, '431024', '嘉禾县', '431000', '嘉禾', 3, '0735', '424500', '中国,湖南省,郴州市,嘉禾县', 112.36900329589844, 25.587900161743164, 'Jiahe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1920, '431025', '临武县', '431000', '临武', 3, '0735', '424300', '中国,湖南省,郴州市,临武县', 112.56400299072266, 25.275999069213867, 'Linwu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1921, '431026', '汝城县', '431000', '汝城', 3, '0735', '424100', '中国,湖南省,郴州市,汝城县', 113.68599700927734, 25.552000045776367, 'Rucheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1922, '431027', '桂东县', '431000', '桂东', 3, '0735', '423500', '中国,湖南省,郴州市,桂东县', 113.9469985961914, 26.07990074157715, 'Guidong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1923, '431028', '安仁县', '431000', '安仁', 3, '0735', '423600', '中国,湖南省,郴州市,安仁县', 113.26899719238281, 26.709299087524414, 'Anren'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1924, '431081', '资兴市', '431000', '资兴', 3, '0735', '423400', '中国,湖南省,郴州市,资兴市', 113.23699951171875, 25.976699829101562, 'Zixing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1925, '431100', '永州市', '430000', '永州', 2, '0746', '425000', '中国,湖南省,永州市', 111.60800170898438, 26.434499740600586, 'Yongzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1926, '431102', '零陵区', '431100', '零陵', 3, '0746', '425100', '中国,湖南省,永州市,零陵区', 111.62100219726562, 26.221099853515625, 'Lingling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1927, '431103', '冷水滩区', '431100', '冷水滩', 3, '0746', '425100', '中国,湖南省,永州市,冷水滩区', 111.59200286865234, 26.46109962463379, 'Lengshuitan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1928, '431121', '祁阳县', '431100', '祁阳', 3, '0746', '426100', '中国,湖南省,永州市,祁阳县', 111.83999633789062, 26.58009910583496, 'Qiyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1929, '431122', '东安县', '431100', '东安', 3, '0746', '425900', '中国,湖南省,永州市,东安县', 111.31600189208984, 26.392000198364258, 'Dong\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1930, '431123', '双牌县', '431100', '双牌', 3, '0746', '425200', '中国,湖南省,永州市,双牌县', 111.65899658203125, 25.95989990234375, 'Shuangpai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1931, '431124', '道县', '431100', '道县', 3, '0746', '425300', '中国,湖南省,永州市,道县', 111.60199737548828, 25.527700424194336, 'Daoxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1932, '431125', '江永县', '431100', '江永', 3, '0746', '425400', '中国,湖南省,永州市,江永县', 111.34100341796875, 25.272300720214844, 'Jiangyong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1933, '431126', '宁远县', '431100', '宁远', 3, '0746', '425600', '中国,湖南省,永州市,宁远县', 111.94599914550781, 25.56909942626953, 'Ningyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1934, '431127', '蓝山县', '431100', '蓝山', 3, '0746', '425800', '中国,湖南省,永州市,蓝山县', 112.19400024414062, 25.367900848388672, 'Lanshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1935, '431128', '新田县', '431100', '新田', 3, '0746', '425700', '中国,湖南省,永州市,新田县', 112.22100067138672, 25.909500122070312, 'Xintian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1936, '431129', '江华瑶族自治县', '431100', '江华', 3, '0746', '425500', '中国,湖南省,永州市,江华瑶族自治县', 111.58799743652344, 25.184499740600586, 'Jianghua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1937, '431200', '怀化市', '430000', '怀化', 2, '0745', '418000', '中国,湖南省,怀化市', 109.97799682617188, 27.550100326538086, 'Huaihua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1938, '431202', '鹤城区', '431200', '鹤城', 3, '0745', '418000', '中国,湖南省,怀化市,鹤城区', 109.96499633789062, 27.549400329589844, 'Hecheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1939, '431221', '中方县', '431200', '中方', 3, '0745', '418005', '中国,湖南省,怀化市,中方县', 109.94499969482422, 27.439899444580078, 'Zhongfang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1940, '431222', '沅陵县', '431200', '沅陵', 3, '0745', '419600', '中国,湖南省,怀化市,沅陵县', 110.39600372314453, 28.45549964904785, 'Yuanling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1941, '431223', '辰溪县', '431200', '辰溪', 3, '0745', '419500', '中国,湖南省,怀化市,辰溪县', 110.18900299072266, 28.004100799560547, 'Chenxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1942, '431224', '溆浦县', '431200', '溆浦', 3, '0745', '419300', '中国,湖南省,怀化市,溆浦县', 110.59400177001953, 27.90839958190918, 'Xupu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1943, '431225', '会同县', '431200', '会同', 3, '0745', '418300', '中国,湖南省,怀化市,会同县', 109.73600006103516, 26.88719940185547, 'Huitong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1944, '431226', '麻阳苗族自治县', '431200', '麻阳', 3, '0745', '419400', '中国,湖南省,怀化市,麻阳苗族自治县', 109.802001953125, 27.865999221801758, 'Mayang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1945, '431227', '新晃侗族自治县', '431200', '新晃', 3, '0745', '419200', '中国,湖南省,怀化市,新晃侗族自治县', 109.1719970703125, 27.359399795532227, 'Xinhuang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1946, '431228', '芷江侗族自治县', '431200', '芷江', 3, '0745', '419100', '中国,湖南省,怀化市,芷江侗族自治县', 109.68499755859375, 27.44300079345703, 'Zhijiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1947, '431229', '靖州苗族侗族自治县', '431200', '靖州', 3, '0745', '418400', '中国,湖南省,怀化市,靖州苗族侗族自治县', 109.697998046875, 26.576499938964844, 'Jingzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1948, '431230', '通道侗族自治县', '431200', '通道', 3, '0745', '418500', '中国,湖南省,怀化市,通道侗族自治县', 109.78500366210938, 26.157100677490234, 'Tongdao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1949, '431281', '洪江市', '431200', '洪江', 3, '0745', '418100', '中国,湖南省,怀化市,洪江市', 109.83699798583984, 27.209199905395508, 'Hongjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1950, '431300', '娄底市', '430000', '娄底', 2, '0738', '417000', '中国,湖南省,娄底市', 112.00800323486328, 27.728099822998047, 'Loudi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1951, '431302', '娄星区', '431300', '娄星', 3, '0738', '417000', '中国,湖南省,娄底市,娄星区', 112.00199890136719, 27.729900360107422, 'Louxing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1952, '431321', '双峰县', '431300', '双峰', 3, '0738', '417700', '中国,湖南省,娄底市,双峰县', 112.1989974975586, 27.454200744628906, 'Shuangfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1953, '431322', '新化县', '431300', '新化', 3, '0738', '417600', '中国,湖南省,娄底市,新化县', 111.3270034790039, 27.726600646972656, 'Xinhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1954, '431381', '冷水江市', '431300', '冷水江', 3, '0738', '417500', '中国,湖南省,娄底市,冷水江市', 111.43599700927734, 27.681499481201172, 'Lengshuijiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1955, '431382', '涟源市', '431300', '涟源', 3, '0738', '417100', '中国,湖南省,娄底市,涟源市', 111.6719970703125, 27.68829917907715, 'Lianyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1956, '433100', '湘西土家族苗族自治州', '430000', '湘西', 2, '0743', '416000', '中国,湖南省,湘西土家族苗族自治州', 109.73999786376953, 28.314300537109375, 'Xiangxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1957, '433101', '吉首市', '433100', '吉首', 3, '0743', '416000', '中国,湖南省,湘西土家族苗族自治州,吉首市', 109.697998046875, 28.262500762939453, 'Jishou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1958, '433122', '泸溪县', '433100', '泸溪', 3, '0743', '416100', '中国,湖南省,湘西土家族苗族自治州,泸溪县', 110.21700286865234, 28.220500946044922, 'Luxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1959, '433123', '凤凰县', '433100', '凤凰', 3, '0743', '416200', '中国,湖南省,湘西土家族苗族自治州,凤凰县', 109.60199737548828, 27.948200225830078, 'Fenghuang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1960, '433124', '花垣县', '433100', '花垣', 3, '0743', '416400', '中国,湖南省,湘西土家族苗族自治州,花垣县', 109.48200225830078, 28.572099685668945, 'Huayuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1961, '433125', '保靖县', '433100', '保靖', 3, '0743', '416500', '中国,湖南省,湘西土家族苗族自治州,保靖县', 109.66000366210938, 28.700000762939453, 'Baojing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1962, '433126', '古丈县', '433100', '古丈', 3, '0743', '416300', '中国,湖南省,湘西土家族苗族自治州,古丈县', 109.947998046875, 28.619400024414062, 'Guzhang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1963, '433127', '永顺县', '433100', '永顺', 3, '0743', '416700', '中国,湖南省,湘西土家族苗族自治州,永顺县', 109.85299682617188, 29.000999450683594, 'Yongshun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1964, '433130', '龙山县', '433100', '龙山', 3, '0743', '416800', '中国,湖南省,湘西土家族苗族自治州,龙山县', 109.44300079345703, 29.456899642944336, 'Longshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1965, '440000', '广东省', '100000', '广东', 1, '', '1', '中国,广东省', 113.28099822998047, 23.125200271606445, 'Guangdong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1966, '440100', '广州市', '440000', '广州', 2, '020', '510032', '中国,广东省,广州市', 113.28099822998047, 23.125200271606445, 'Guangzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1967, '440103', '荔湾区', '440100', '荔湾', 3, '020', '510170', '中国,广东省,广州市,荔湾区', 113.24400329589844, 23.125900268554688, 'Liwan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1968, '440104', '越秀区', '440100', '越秀', 3, '020', '510030', '中国,广东省,广州市,越秀区', 113.26699829101562, 23.128999710083008, 'Yuexiu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1969, '440105', '海珠区', '440100', '海珠', 3, '020', '510300', '中国,广东省,广州市,海珠区', 113.26200103759766, 23.10379981994629, 'Haizhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1970, '440106', '天河区', '440100', '天河', 3, '020', '510665', '中国,广东省,广州市,天河区', 113.36100006103516, 23.12470054626465, 'Tianhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1971, '440111', '白云区', '440100', '白云', 3, '020', '510405', '中国,广东省,广州市,白云区', 113.27300262451172, 23.157899856567383, 'Baiyun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1972, '440112', '黄埔区', '440100', '黄埔', 3, '020', '510700', '中国,广东省,广州市,黄埔区', 113.45899963378906, 23.106399536132812, 'Huangpu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1973, '440113', '番禺区', '440100', '番禺', 3, '020', '511400', '中国,广东省,广州市,番禺区', 113.38400268554688, 22.93600082397461, 'Panyu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1974, '440114', '花都区', '440100', '花都', 3, '020', '510800', '中国,广东省,广州市,花都区', 113.22000122070312, 23.403600692749023, 'Huadu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1975, '440115', '南沙区', '440100', '南沙', 3, '020', '511458', '中国,广东省,广州市,南沙区', 113.60800170898438, 22.771400451660156, 'Nansha'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1976, '440117', '从化区', '440100', '从化', 3, '020', '510900', '中国,广东省,广州市,从化区', 113.58699798583984, 23.545299530029297, 'Conghua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1977, '440118', '增城区', '440100', '增城', 3, '020', '511300', '中国,广东省,广州市,增城区', 113.83000183105469, 23.29050064086914, 'Zengcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1978, '440200', '韶关市', '440000', '韶关', 2, '0751', '512002', '中国,广东省,韶关市', 113.59200286865234, 24.801300048828125, 'Shaoguan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1979, '440203', '武江区', '440200', '武江', 3, '0751', '512026', '中国,广东省,韶关市,武江区', 113.58799743652344, 24.792600631713867, 'Wujiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1980, '440204', '浈江区', '440200', '浈江', 3, '0751', '512023', '中国,广东省,韶关市,浈江区', 113.61100006103516, 24.804399490356445, 'Zhenjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1981, '440205', '曲江区', '440200', '曲江', 3, '0751', '512101', '中国,广东省,韶关市,曲江区', 113.60199737548828, 24.679100036621094, 'Qujiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1982, '440222', '始兴县', '440200', '始兴', 3, '0751', '512500', '中国,广东省,韶关市,始兴县', 114.06800079345703, 24.947599411010742, 'Shixing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1983, '440224', '仁化县', '440200', '仁化', 3, '0751', '512300', '中国,广东省,韶关市,仁化县', 113.74700164794922, 25.087400436401367, 'Renhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1984, '440229', '翁源县', '440200', '翁源', 3, '0751', '512600', '中国,广东省,韶关市,翁源县', 114.13400268554688, 24.34950065612793, 'Wengyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1985, '440232', '乳源瑶族自治县', '440200', '乳源', 3, '0751', '512700', '中国,广东省,韶关市,乳源瑶族自治县', 113.2770004272461, 24.777999877929688, 'Ruyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1986, '440233', '新丰县', '440200', '新丰', 3, '0751', '511100', '中国,广东省,韶关市,新丰县', 114.20800018310547, 24.059200286865234, 'Xinfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1987, '440281', '乐昌市', '440200', '乐昌', 3, '0751', '512200', '中国,广东省,韶关市,乐昌市', 113.35700225830078, 25.128000259399414, 'Lechang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1988, '440282', '南雄市', '440200', '南雄', 3, '0751', '512400', '中国,广东省,韶关市,南雄市', 114.30999755859375, 25.11709976196289, 'Nanxiong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1989, '440300', '深圳市', '440000', '深圳', 2, '0755', '518035', '中国,广东省,深圳市', 114.08599853515625, 22.547000885009766, 'Shenzhen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1990, '440303', '罗湖区', '440300', '罗湖', 3, '0755', '518021', '中国,广东省,深圳市,罗湖区', 114.13099670410156, 22.54840087890625, 'Luohu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1991, '440304', '福田区', '440300', '福田', 3, '0755', '518048', '中国,广东省,深圳市,福田区', 114.05599975585938, 22.52239990234375, 'Futian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1992, '440305', '南山区', '440300', '南山', 3, '0755', '518051', '中国,广东省,深圳市,南山区', 113.93000030517578, 22.532899856567383, 'Nanshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1993, '440306', '宝安区', '440300', '宝安', 3, '0755', '518101', '中国,广东省,深圳市,宝安区', 113.88300323486328, 22.553699493408203, 'Bao\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1994, '440307', '龙岗区', '440300', '龙岗', 3, '0755', '518172', '中国,广东省,深圳市,龙岗区', 114.24800109863281, 22.719900131225586, 'Longgang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1995, '440308', '盐田区', '440300', '盐田', 3, '0755', '518081', '中国,广东省,深圳市,盐田区', 114.23699951171875, 22.55780029296875, 'Yantian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1996, '440309', '光明新区', '440300', '光明新区', 3, '0755', '518100', '中国,广东省,深圳市,光明新区', 113.89600372314453, 22.777299880981445, 'Guangmingxinqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1997, '440310', '坪山新区', '440300', '坪山新区', 3, '0755', '518000', '中国,广东省,深圳市,坪山新区', 114.34600067138672, 22.690500259399414, 'Pingshanxinqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1998, '440311', '大鹏新区', '440300', '大鹏新区', 3, '0755', '518000', '中国,广东省,深圳市,大鹏新区', 114.4800033569336, 22.587900161743164, 'Dapengxinqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (1999, '440312', '龙华新区', '440300', '龙华新区', 3, '0755', '518100', '中国,广东省,深圳市,龙华新区', 114.03700256347656, 22.687000274658203, 'Longhuaxinqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2000, '440400', '珠海市', '440000', '珠海', 2, '0756', '519000', '中国,广东省,珠海市', 113.5530014038086, 22.25589942932129, 'Zhuhai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2001, '440402', '香洲区', '440400', '香洲', 3, '0756', '519000', '中国,广东省,珠海市,香洲区', 113.54399871826172, 22.26650047302246, 'Xiangzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2002, '440403', '斗门区', '440400', '斗门', 3, '0756', '519110', '中国,广东省,珠海市,斗门区', 113.2959976196289, 22.208999633789062, 'Doumen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2003, '440404', '金湾区', '440400', '金湾', 3, '0756', '519040', '中国,广东省,珠海市,金湾区', 113.36399841308594, 22.146900177001953, 'Jinwan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2004, '440500', '汕头市', '440000', '汕头', 2, '0754', '515041', '中国,广东省,汕头市', 116.70800018310547, 23.371000289916992, 'Shantou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2005, '440507', '龙湖区', '440500', '龙湖', 3, '0754', '515041', '中国,广东省,汕头市,龙湖区', 116.71600341796875, 23.371700286865234, 'Longhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2006, '440511', '金平区', '440500', '金平', 3, '0754', '515041', '中国,广东省,汕头市,金平区', 116.7040023803711, 23.36639976501465, 'Jinping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2007, '440512', '濠江区', '440500', '濠江', 3, '0754', '515071', '中国,广东省,汕头市,濠江区', 116.72699737548828, 23.285900115966797, 'Haojiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2008, '440513', '潮阳区', '440500', '潮阳', 3, '0754', '515100', '中国,广东省,汕头市,潮阳区', 116.60199737548828, 23.26490020751953, 'Chaoyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2009, '440514', '潮南区', '440500', '潮南', 3, '0754', '515144', '中国,广东省,汕头市,潮南区', 116.43199920654297, 23.25, 'Chaonan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2010, '440515', '澄海区', '440500', '澄海', 3, '0754', '515800', '中国,广东省,汕头市,澄海区', 116.75599670410156, 23.467300415039062, 'Chenghai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2011, '440523', '南澳县', '440500', '南澳', 3, '0754', '515900', '中国,广东省,汕头市,南澳县', 117.01899719238281, 23.422300338745117, 'Nanao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2012, '440600', '佛山市', '440000', '佛山', 2, '0757', '528000', '中国,广东省,佛山市', 113.12300109863281, 23.028799057006836, 'Foshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2013, '440604', '禅城区', '440600', '禅城', 3, '0757', '528000', '中国,广东省,佛山市,禅城区', 113.12300109863281, 23.008399963378906, 'Chancheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2014, '440605', '南海区', '440600', '南海', 3, '0757', '528251', '中国,广东省,佛山市,南海区', 113.14299774169922, 23.028799057006836, 'Nanhai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2015, '440606', '顺德区', '440600', '顺德', 3, '0757', '528300', '中国,广东省,佛山市,顺德区', 113.29399871826172, 22.804500579833984, 'Shunde'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2016, '440607', '三水区', '440600', '三水', 3, '0757', '528133', '中国,广东省,佛山市,三水区', 112.89700317382812, 23.15559959411621, 'Sanshui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2017, '440608', '高明区', '440600', '高明', 3, '0757', '528500', '中国,广东省,佛山市,高明区', 112.89299774169922, 22.90019989013672, 'Gaoming'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2018, '440700', '江门市', '440000', '江门', 2, '0750', '529000', '中国,广东省,江门市', 113.09500122070312, 22.59040069580078, 'Jiangmen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2019, '440703', '蓬江区', '440700', '蓬江', 3, '0750', '529000', '中国,广东省,江门市,蓬江区', 113.0780029296875, 22.59510040283203, 'Pengjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2020, '440704', '江海区', '440700', '江海', 3, '0750', '529040', '中国,广东省,江门市,江海区', 113.11100006103516, 22.560199737548828, 'Jianghai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2021, '440705', '新会区', '440700', '新会', 3, '0750', '529100', '中国,广东省,江门市,新会区', 113.03199768066406, 22.458799362182617, 'Xinhui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2022, '440781', '台山市', '440700', '台山', 3, '0750', '529200', '中国,广东省,江门市,台山市', 112.79399871826172, 22.25149917602539, 'Taishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2023, '440783', '开平市', '440700', '开平', 3, '0750', '529337', '中国,广东省,江门市,开平市', 112.697998046875, 22.37619972229004, 'Kaiping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2024, '440784', '鹤山市', '440700', '鹤山', 3, '0750', '529700', '中国,广东省,江门市,鹤山市', 112.96399688720703, 22.765199661254883, 'Heshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2025, '440785', '恩平市', '440700', '恩平', 3, '0750', '529400', '中国,广东省,江门市,恩平市', 112.30500030517578, 22.182899475097656, 'Enping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2026, '440800', '湛江市', '440000', '湛江', 2, '0759', '524047', '中国,广东省,湛江市', 110.40599822998047, 21.19529914855957, 'Zhanjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2027, '440802', '赤坎区', '440800', '赤坎', 3, '0759', '524033', '中国,广东省,湛江市,赤坎区', 110.36599731445312, 21.26609992980957, 'Chikan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2028, '440803', '霞山区', '440800', '霞山', 3, '0759', '524011', '中国,广东省,湛江市,霞山区', 110.39800262451172, 21.19179916381836, 'Xiashan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2029, '440804', '坡头区', '440800', '坡头', 3, '0759', '524057', '中国,广东省,湛江市,坡头区', 110.45500183105469, 21.244699478149414, 'Potou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2030, '440811', '麻章区', '440800', '麻章', 3, '0759', '524094', '中国,广东省,湛江市,麻章区', 110.33399963378906, 21.2632999420166, 'Mazhang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2031, '440823', '遂溪县', '440800', '遂溪', 3, '0759', '524300', '中国,广东省,湛江市,遂溪县', 110.25, 21.377199172973633, 'Suixi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2032, '440825', '徐闻县', '440800', '徐闻', 3, '0759', '524100', '中国,广东省,湛江市,徐闻县', 110.17400360107422, 20.328100204467773, 'Xuwen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2033, '440881', '廉江市', '440800', '廉江', 3, '0759', '524400', '中国,广东省,湛江市,廉江市', 110.28399658203125, 21.60919952392578, 'Lianjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2034, '440882', '雷州市', '440800', '雷州', 3, '0759', '524200', '中国,广东省,湛江市,雷州市', 110.10099792480469, 20.9143009185791, 'Leizhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2035, '440883', '吴川市', '440800', '吴川', 3, '0759', '524500', '中国,广东省,湛江市,吴川市', 110.7770004272461, 21.44580078125, 'Wuchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2036, '440900', '茂名市', '440000', '茂名', 2, '0668', '525000', '中国,广东省,茂名市', 110.91899871826172, 21.659799575805664, 'Maoming'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2037, '440902', '茂南区', '440900', '茂南', 3, '0668', '525000', '中国,广东省,茂名市,茂南区', 110.91899871826172, 21.641000747680664, 'Maonan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2038, '440904', '电白区', '440900', '电白', 3, '0668', '525400', '中国,广东省,茂名市,电白区', 111.00700378417969, 21.507200241088867, 'Dianbai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2039, '440981', '高州市', '440900', '高州', 3, '0668', '525200', '中国,广东省,茂名市,高州市', 110.8550033569336, 21.92060089111328, 'Gaozhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2040, '440982', '化州市', '440900', '化州', 3, '0668', '525100', '中国,广东省,茂名市,化州市', 110.63899993896484, 21.66390037536621, 'Huazhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2041, '440983', '信宜市', '440900', '信宜', 3, '0668', '525300', '中国,广东省,茂名市,信宜市', 110.94599914550781, 22.353500366210938, 'Xinyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2042, '441200', '肇庆市', '440000', '肇庆', 2, '0758', '526040', '中国,广东省,肇庆市', 112.4729995727539, 23.05150032043457, 'Zhaoqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2043, '441202', '端州区', '441200', '端州', 3, '0758', '526060', '中国,广东省,肇庆市,端州区', 112.48500061035156, 23.05190086364746, 'Duanzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2044, '441203', '鼎湖区', '441200', '鼎湖', 3, '0758', '526070', '中国,广东省,肇庆市,鼎湖区', 112.56600189208984, 23.15850067138672, 'Dinghu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2045, '441223', '广宁县', '441200', '广宁', 3, '0758', '526300', '中国,广东省,肇庆市,广宁县', 112.44100189208984, 23.634599685668945, 'Guangning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2046, '441224', '怀集县', '441200', '怀集', 3, '0758', '526400', '中国,广东省,肇庆市,怀集县', 112.18399810791016, 23.90920066833496, 'Huaiji'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2047, '441225', '封开县', '441200', '封开', 3, '0758', '526500', '中国,广东省,肇庆市,封开县', 111.50299835205078, 23.435699462890625, 'Fengkai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2048, '441226', '德庆县', '441200', '德庆', 3, '0758', '526600', '中国,广东省,肇庆市,德庆县', 111.78600311279297, 23.143699645996094, 'Deqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2049, '441283', '高要市', '441200', '高要', 3, '0758', '526100', '中国,广东省,肇庆市,高要市', 112.45800018310547, 23.025800704956055, 'Gaoyao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2050, '441284', '四会市', '441200', '四会', 3, '0758', '526200', '中国,广东省,肇庆市,四会市', 112.73400115966797, 23.326900482177734, 'Sihui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2051, '441300', '惠州市', '440000', '惠州', 2, '0752', '516000', '中国,广东省,惠州市', 114.41300201416016, 23.07939910888672, 'Huizhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2052, '441302', '惠城区', '441300', '惠城', 3, '0752', '516008', '中国,广东省,惠州市,惠城区', 114.38300323486328, 23.083799362182617, 'Huicheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2053, '441303', '惠阳区', '441300', '惠阳', 3, '0752', '516211', '中国,广东省,惠州市,惠阳区', 114.45600128173828, 22.78849983215332, 'Huiyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2054, '441322', '博罗县', '441300', '博罗', 3, '0752', '516100', '中国,广东省,惠州市,博罗县', 114.29000091552734, 23.173099517822266, 'Boluo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2055, '441323', '惠东县', '441300', '惠东', 3, '0752', '516300', '中国,广东省,惠州市,惠东县', 114.72000122070312, 22.984800338745117, 'Huidong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2056, '441324', '龙门县', '441300', '龙门', 3, '0752', '516800', '中国,广东省,惠州市,龙门县', 114.25499725341797, 23.72760009765625, 'Longmen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2057, '441400', '梅州市', '440000', '梅州', 2, '0753', '514021', '中国,广东省,梅州市', 116.11799621582031, 24.299100875854492, 'Meizhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2058, '441402', '梅江区', '441400', '梅江', 3, '0753', '514000', '中国,广东省,梅州市,梅江区', 116.11699676513672, 24.31060028076172, 'Meijiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2059, '441403', '梅县区', '441400', '梅县', 3, '0753', '514787', '中国,广东省,梅州市,梅县区', 116.0979995727539, 24.286699295043945, 'Meixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2060, '441422', '大埔县', '441400', '大埔', 3, '0753', '514200', '中国,广东省,梅州市,大埔县', 116.6969985961914, 24.353300094604492, 'Dabu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2061, '441423', '丰顺县', '441400', '丰顺', 3, '0753', '514300', '中国,广东省,梅州市,丰顺县', 116.18199920654297, 23.74090003967285, 'Fengshun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2062, '441424', '五华县', '441400', '五华', 3, '0753', '514400', '中国,广东省,梅州市,五华县', 115.77899932861328, 23.9242000579834, 'Wuhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2063, '441426', '平远县', '441400', '平远', 3, '0753', '514600', '中国,广东省,梅州市,平远县', 115.89600372314453, 24.571199417114258, 'Pingyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2064, '441427', '蕉岭县', '441400', '蕉岭', 3, '0753', '514100', '中国,广东省,梅州市,蕉岭县', 116.1709976196289, 24.65730094909668, 'Jiaoling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2065, '441481', '兴宁市', '441400', '兴宁', 3, '0753', '514500', '中国,广东省,梅州市,兴宁市', 115.73100280761719, 24.139999389648438, 'Xingning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2066, '441500', '汕尾市', '440000', '汕尾', 2, '0660', '516600', '中国,广东省,汕尾市', 115.36399841308594, 22.774499893188477, 'Shanwei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2067, '441502', '城区', '441500', '城区', 3, '0660', '516600', '中国,广东省,汕尾市,城区', 115.36499786376953, 22.778900146484375, 'Chengqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2068, '441521', '海丰县', '441500', '海丰', 3, '0660', '516400', '中国,广东省,汕尾市,海丰县', 115.322998046875, 22.96649932861328, 'Haifeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2069, '441523', '陆河县', '441500', '陆河', 3, '0660', '516700', '中国,广东省,汕尾市,陆河县', 115.65599822998047, 23.303600311279297, 'Luhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2070, '441581', '陆丰市', '441500', '陆丰', 3, '0660', '516500', '中国,广东省,汕尾市,陆丰市', 115.64800262451172, 22.943300247192383, 'Lufeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2071, '441600', '河源市', '440000', '河源', 2, '0762', '517000', '中国,广东省,河源市', 114.697998046875, 23.746299743652344, 'Heyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2072, '441602', '源城区', '441600', '源城', 3, '0762', '517000', '中国,广东省,河源市,源城区', 114.7020034790039, 23.734100341796875, 'Yuancheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2073, '441621', '紫金县', '441600', '紫金', 3, '0762', '517400', '中国,广东省,河源市,紫金县', 115.18399810791016, 23.638700485229492, 'Zijin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2074, '441622', '龙川县', '441600', '龙川', 3, '0762', '517300', '中国,广东省,河源市,龙川县', 115.26000213623047, 24.10140037536621, 'Longchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2075, '441623', '连平县', '441600', '连平', 3, '0762', '517100', '中国,广东省,河源市,连平县', 114.48999786376953, 24.371599197387695, 'Lianping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2076, '441624', '和平县', '441600', '和平', 3, '0762', '517200', '中国,广东省,河源市,和平县', 114.93800354003906, 24.443199157714844, 'Heping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2077, '441625', '东源县', '441600', '东源', 3, '0762', '517583', '中国,广东省,河源市,东源县', 114.74600219726562, 23.788299560546875, 'Dongyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2078, '441700', '阳江市', '440000', '阳江', 2, '0662', '529500', '中国,广东省,阳江市', 111.9749984741211, 21.85919952392578, 'Yangjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2079, '441702', '江城区', '441700', '江城', 3, '0662', '529500', '中国,广东省,阳江市,江城区', 111.95500183105469, 21.861900329589844, 'Jiangcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2080, '441704', '阳东区', '441700', '阳东', 3, '0662', '529900', '中国,广东省,阳江市,阳东区', 112.01499938964844, 21.874000549316406, 'Yangdong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2081, '441721', '阳西县', '441700', '阳西', 3, '0662', '529800', '中国,广东省,阳江市,阳西县', 111.61799621582031, 21.752300262451172, 'Yangxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2082, '441781', '阳春市', '441700', '阳春', 3, '0662', '529600', '中国,广东省,阳江市,阳春市', 111.78900146484375, 22.172300338745117, 'Yangchun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2083, '441800', '清远市', '440000', '清远', 2, '0763', '511500', '中国,广东省,清远市', 113.03700256347656, 23.704200744628906, 'Qingyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2084, '441802', '清城区', '441800', '清城', 3, '0763', '511515', '中国,广东省,清远市,清城区', 113.06300354003906, 23.697799682617188, 'Qingcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2085, '441803', '清新区', '441800', '清新', 3, '0763', '511810', '中国,广东省,清远市,清新区', 113.01499938964844, 23.736900329589844, 'Qingxin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2086, '441821', '佛冈县', '441800', '佛冈', 3, '0763', '511600', '中国,广东省,清远市,佛冈县', 113.53299713134766, 23.872299194335938, 'Fogang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2087, '441823', '阳山县', '441800', '阳山', 3, '0763', '513100', '中国,广东省,清远市,阳山县', 112.64099884033203, 24.465200424194336, 'Yangshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2088, '441825', '连山壮族瑶族自治县', '441800', '连山', 3, '0763', '513200', '中国,广东省,清远市,连山壮族瑶族自治县', 112.08000183105469, 24.568099975585938, 'Lianshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2089, '441826', '连南瑶族自治县', '441800', '连南', 3, '0763', '513300', '中国,广东省,清远市,连南瑶族自治县', 112.28800201416016, 24.717300415039062, 'Liannan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2090, '441881', '英德市', '441800', '英德', 3, '0763', '513000', '中国,广东省,清远市,英德市', 113.41500091552734, 24.185699462890625, 'Yingde'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2091, '441882', '连州市', '441800', '连州', 3, '0763', '513400', '中国,广东省,清远市,连州市', 112.38200378417969, 24.77910041809082, 'Lianzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2092, '441900', '东莞市', '440000', '东莞', 2, '0769', '523888', '中国,广东省,东莞市', 113.76000213623047, 23.048900604248047, 'Dongguan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2093, '441901', '莞城区', '441900', '莞城', 3, '0769', '523128', '中国,广东省,东莞市,莞城区', 113.7509994506836, 23.05340003967285, 'Guancheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2094, '441902', '南城区', '441900', '南城', 3, '0769', '523617', '中国,广东省,东莞市,南城区', 113.75199890136719, 23.020200729370117, 'Nancheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2095, '441904', '万江区', '441900', '万江', 3, '0769', '523039', '中国,广东省,东莞市,万江区', 113.73899841308594, 23.043800354003906, 'Wanjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2096, '441905', '石碣镇', '441900', '石碣', 3, '0769', '523290', '中国,广东省,东莞市,石碣镇', 113.802001953125, 23.099000930786133, 'Shijie'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2097, '441906', '石龙镇', '441900', '石龙', 3, '0769', '523326', '中国,广东省,东莞市,石龙镇', 113.8759994506836, 23.10740089416504, 'Shilong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2098, '441907', '茶山镇', '441900', '茶山', 3, '0769', '523380', '中国,广东省,东莞市,茶山镇', 113.88400268554688, 23.062400817871094, 'Chashan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2099, '441908', '石排镇', '441900', '石排', 3, '0769', '523346', '中国,广东省,东莞市,石排镇', 113.91999816894531, 23.086299896240234, 'Shipai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2100, '441909', '企石镇', '441900', '企石', 3, '0769', '523507', '中国,广东省,东莞市,企石镇', 114.01300048828125, 23.06599998474121, 'Qishi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2101, '441910', '横沥镇', '441900', '横沥', 3, '0769', '523471', '中国,广东省,东莞市,横沥镇', 113.95700073242188, 23.025699615478516, 'Hengli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2102, '441911', '桥头镇', '441900', '桥头', 3, '0769', '523520', '中国,广东省,东莞市,桥头镇', 114.01399993896484, 22.939699172973633, 'Qiaotou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2103, '441912', '谢岗镇', '441900', '谢岗', 3, '0769', '523592', '中国,广东省,东莞市,谢岗镇', 114.14099884033203, 22.959699630737305, 'Xiegang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2104, '441913', '东坑镇', '441900', '东坑', 3, '0769', '523451', '中国,广东省,东莞市,东坑镇', 113.94000244140625, 22.992799758911133, 'Dongkeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2105, '441914', '常平镇', '441900', '常平', 3, '0769', '523560', '中国,广东省,东莞市,常平镇', 114.02999877929688, 23.01609992980957, 'Changping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2106, '441915', '寮步镇', '441900', '寮步', 3, '0769', '523411', '中国,广东省,东莞市,寮步镇', 113.88500213623047, 22.99169921875, 'Liaobu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2107, '441916', '大朗镇', '441900', '大朗', 3, '0769', '523770', '中国,广东省,东莞市,大朗镇', 113.927001953125, 22.965700149536133, 'Dalang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2108, '441917', '麻涌镇', '441900', '麻涌', 3, '0769', '523143', '中国,广东省,东莞市,麻涌镇', 113.5459976196289, 23.045299530029297, 'Machong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2109, '441918', '中堂镇', '441900', '中堂', 3, '0769', '523233', '中国,广东省,东莞市,中堂镇', 113.65399932861328, 23.090200424194336, 'Zhongtang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2110, '441919', '高埗镇', '441900', '高埗', 3, '0769', '523282', '中国,广东省,东莞市,高埗镇', 113.73600006103516, 23.06839942932129, 'Gaobu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2111, '441920', '樟木头镇', '441900', '樟木头', 3, '0769', '523619', '中国,广东省,东莞市,樟木头镇', 114.06600189208984, 22.95669937133789, 'Zhangmutou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2112, '441921', '大岭山镇', '441900', '大岭山', 3, '0769', '523835', '中国,广东省,东莞市,大岭山镇', 113.78299713134766, 22.885400772094727, 'Dalingshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2113, '441922', '望牛墩镇', '441900', '望牛墩', 3, '0769', '523203', '中国,广东省,东莞市,望牛墩镇', 113.65899658203125, 23.05500030517578, 'Wangniudun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2114, '441923', '黄江镇', '441900', '黄江', 3, '0769', '523755', '中国,广东省,东莞市,黄江镇', 113.99299621582031, 22.877500534057617, 'Huangjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2115, '441924', '洪梅镇', '441900', '洪梅', 3, '0769', '523163', '中国,广东省,东莞市,洪梅镇', 113.61299896240234, 22.992700576782227, 'Hongmei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2116, '441925', '清溪镇', '441900', '清溪', 3, '0769', '523660', '中国,广东省,东莞市,清溪镇', 114.15599822998047, 22.844499588012695, 'Qingxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2117, '441926', '沙田镇', '441900', '沙田', 3, '0769', '523988', '中国,广东省,东莞市,沙田镇', 113.76000213623047, 23.048900604248047, 'Shatian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2118, '441927', '道滘镇', '441900', '道滘', 3, '0769', '523171', '中国,广东省,东莞市,道滘镇', 113.76000213623047, 23.048900604248047, 'Daojiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2119, '441928', '塘厦镇', '441900', '塘厦', 3, '0769', '523713', '中国,广东省,东莞市,塘厦镇', 114.10800170898438, 22.822900772094727, 'Tangxia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2120, '441929', '虎门镇', '441900', '虎门', 3, '0769', '523932', '中国,广东省,东莞市,虎门镇', 113.71099853515625, 22.826200485229492, 'Humen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2121, '441930', '厚街镇', '441900', '厚街', 3, '0769', '523960', '中国,广东省,东莞市,厚街镇', 113.6729965209961, 22.940799713134766, 'Houjie'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2122, '441931', '凤岗镇', '441900', '凤岗', 3, '0769', '523690', '中国,广东省,东莞市,凤岗镇', 114.14099884033203, 22.744600296020508, 'Fenggang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2123, '441932', '长安镇', '441900', '长安', 3, '0769', '523850', '中国,广东省,东莞市,长安镇', 113.80400085449219, 22.816600799560547, 'Chang\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2124, '442000', '中山市', '440000', '中山', 2, '0760', '528403', '中国,广东省,中山市', 113.38200378417969, 22.521099090576172, 'Zhongshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2125, '442001', '石岐区', '442000', '石岐', 3, '0760', '528400', '中国,广东省,中山市,石岐区', 113.37899780273438, 22.52519989013672, 'Shiqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2126, '442004', '南区', '442000', '南区', 3, '0760', '528400', '中国,广东省,中山市,南区', 113.35600280761719, 22.486600875854492, 'Nanqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2127, '442005', '五桂山区', '442000', '五桂山', 3, '0760', '528458', '中国,广东省,中山市,五桂山区', 113.41100311279297, 22.519699096679688, 'Wuguishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2128, '442006', '火炬开发区', '442000', '火炬', 3, '0760', '528437', '中国,广东省,中山市,火炬开发区', 113.48100280761719, 22.566099166870117, 'Huoju'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2129, '442007', '黄圃镇', '442000', '黄圃', 3, '0760', '528429', '中国,广东省,中山市,黄圃镇', 113.34200286865234, 22.715099334716797, 'Huangpu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2130, '442008', '南头镇', '442000', '南头', 3, '0760', '528421', '中国,广东省,中山市,南头镇', 113.2959976196289, 22.713899612426758, 'Nantou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2131, '442009', '东凤镇', '442000', '东凤', 3, '0760', '528425', '中国,广东省,中山市,东凤镇', 113.26100158691406, 22.687700271606445, 'Dongfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2132, '442010', '阜沙镇', '442000', '阜沙', 3, '0760', '528434', '中国,广东省,中山市,阜沙镇', 113.35299682617188, 22.666400909423828, 'Fusha'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2133, '442011', '小榄镇', '442000', '小榄', 3, '0760', '528415', '中国,广东省,中山市,小榄镇', 113.24400329589844, 22.66699981689453, 'Xiaolan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2134, '442012', '东升镇', '442000', '东升', 3, '0760', '528400', '中国,广东省,中山市,东升镇', 113.2959976196289, 22.61400032043457, 'Dongsheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2135, '442013', '古镇镇', '442000', '古镇', 3, '0760', '528422', '中国,广东省,中山市,古镇镇', 113.18000030517578, 22.611000061035156, 'Guzhen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2136, '442014', '横栏镇', '442000', '横栏', 3, '0760', '528478', '中国,广东省,中山市,横栏镇', 113.26599884033203, 22.5231990814209, 'Henglan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2137, '442015', '三角镇', '442000', '三角', 3, '0760', '528422', '中国,广东省,中山市,三角镇', 113.42400360107422, 22.677000045776367, 'Sanjiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2138, '442016', '民众镇', '442000', '民众', 3, '0760', '528441', '中国,广东省,中山市,民众镇', 113.48600006103516, 22.62350082397461, 'Minzhong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2139, '442017', '南朗镇', '442000', '南朗', 3, '0760', '528454', '中国,广东省,中山市,南朗镇', 113.53399658203125, 22.492399215698242, 'Nanlang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2140, '442018', '港口镇', '442000', '港口', 3, '0760', '528447', '中国,广东省,中山市,港口镇', 113.38200378417969, 22.521099090576172, 'Gangkou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2141, '442019', '大涌镇', '442000', '大涌', 3, '0760', '528476', '中国,广东省,中山市,大涌镇', 113.29199981689453, 22.46769905090332, 'Dayong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2142, '442020', '沙溪镇', '442000', '沙溪', 3, '0760', '528471', '中国,广东省,中山市,沙溪镇', 113.3280029296875, 22.52630043029785, 'Shaxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2143, '442021', '三乡镇', '442000', '三乡', 3, '0760', '528463', '中国,广东省,中山市,三乡镇', 113.43299865722656, 22.352500915527344, 'Sanxiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2144, '442022', '板芙镇', '442000', '板芙', 3, '0760', '528459', '中国,广东省,中山市,板芙镇', 113.31999969482422, 22.415700912475586, 'Banfu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2145, '442023', '神湾镇', '442000', '神湾', 3, '0760', '528462', '中国,广东省,中山市,神湾镇', 113.35900115966797, 22.3125, 'Shenwan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2146, '442024', '坦洲镇', '442000', '坦洲', 3, '0760', '528467', '中国,广东省,中山市,坦洲镇', 113.48600006103516, 22.26129913330078, 'Tanzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2147, '445100', '潮州市', '440000', '潮州', 2, '0768', '521000', '中国,广东省,潮州市', 116.63200378417969, 23.661699295043945, 'Chaozhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2148, '445102', '湘桥区', '445100', '湘桥', 3, '0768', '521000', '中国,广东省,潮州市,湘桥区', 116.62799835205078, 23.67449951171875, 'Xiangqiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2149, '445103', '潮安区', '445100', '潮安', 3, '0768', '515638', '中国,广东省,潮州市,潮安区', 116.59300231933594, 23.643699645996094, 'Chao\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2150, '445122', '饶平县', '445100', '饶平', 3, '0768', '515700', '中国,广东省,潮州市,饶平县', 117.00700378417969, 23.66990089416504, 'Raoping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2151, '445200', '揭阳市', '440000', '揭阳', 2, '0633', '522000', '中国,广东省,揭阳市', 116.35600280761719, 23.543800354003906, 'Jieyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2152, '445202', '榕城区', '445200', '榕城', 3, '0633', '522000', '中国,广东省,揭阳市,榕城区', 116.36699676513672, 23.525100708007812, 'Rongcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2153, '445203', '揭东区', '445200', '揭东', 3, '0633', '515500', '中国,广东省,揭阳市,揭东区', 116.41300201416016, 23.569900512695312, 'Jiedong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2154, '445222', '揭西县', '445200', '揭西', 3, '0633', '515400', '中国,广东省,揭阳市,揭西县', 115.83899688720703, 23.427099227905273, 'Jiexi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2155, '445224', '惠来县', '445200', '惠来', 3, '0633', '515200', '中国,广东省,揭阳市,惠来县', 116.2959976196289, 23.032899856567383, 'Huilai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2156, '445281', '普宁市', '445200', '普宁', 3, '0633', '515300', '中国,广东省,揭阳市,普宁市', 116.16600036621094, 23.297300338745117, 'Puning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2157, '445300', '云浮市', '440000', '云浮', 2, '0766', '527300', '中国,广东省,云浮市', 112.04399871826172, 22.929800033569336, 'Yunfu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2158, '445302', '云城区', '445300', '云城', 3, '0766', '527300', '中国,广东省,云浮市,云城区', 112.03900146484375, 22.93000030517578, 'Yuncheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2159, '445303', '云安区', '445300', '云安', 3, '0766', '527500', '中国,广东省,云浮市,云安区', 112.00900268554688, 23.077800750732422, 'Yun\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2160, '445321', '新兴县', '445300', '新兴', 3, '0766', '527400', '中国,广东省,云浮市,新兴县', 112.2300033569336, 22.69729995727539, 'Xinxing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2161, '445322', '郁南县', '445300', '郁南', 3, '0766', '527100', '中国,广东省,云浮市,郁南县', 111.53399658203125, 23.23310089111328, 'Yunan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2162, '445381', '罗定市', '445300', '罗定', 3, '0766', '527200', '中国,广东省,云浮市,罗定市', 111.56999969482422, 22.769699096679688, 'Luoding'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2163, '450000', '广西', '100000', '广西', 1, '', '1', '中国,广西壮族自治区', 108.31999969482422, 22.823999404907227, 'Guangxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2164, '450100', '南宁市', '450000', '南宁', 2, '0771', '530028', '中国,广西壮族自治区,南宁市', 108.31999969482422, 22.823999404907227, 'Nanning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2165, '450102', '兴宁区', '450100', '兴宁', 3, '0771', '530023', '中国,广西壮族自治区,南宁市,兴宁区', 108.36699676513672, 22.853500366210938, 'Xingning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2166, '450103', '青秀区', '450100', '青秀', 3, '0771', '530213', '中国,广西壮族自治区,南宁市,青秀区', 108.49500274658203, 22.78510093688965, 'Qingxiu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2167, '450105', '江南区', '450100', '江南', 3, '0771', '530031', '中国,广西壮族自治区,南宁市,江南区', 108.27300262451172, 22.781299591064453, 'Jiangnan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2168, '450107', '西乡塘区', '450100', '西乡塘', 3, '0771', '530001', '中国,广西壮族自治区,南宁市,西乡塘区', 108.31300354003906, 22.833900451660156, 'Xixiangtang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2169, '450108', '良庆区', '450100', '良庆', 3, '0771', '530219', '中国,广西壮族自治区,南宁市,良庆区', 108.41300201416016, 22.749099731445312, 'Liangqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2170, '450109', '邕宁区', '450100', '邕宁', 3, '0771', '530200', '中国,广西壮族自治区,南宁市,邕宁区', 108.48699951171875, 22.75629997253418, 'Yongning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2171, '450122', '武鸣县', '450100', '武鸣', 3, '0771', '530100', '中国,广西壮族自治区,南宁市,武鸣县', 108.2770004272461, 23.156400680541992, 'Wuming'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2172, '450123', '隆安县', '450100', '隆安', 3, '0771', '532700', '中国,广西壮族自治区,南宁市,隆安县', 107.69200134277344, 23.17340087890625, 'Long\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2173, '450124', '马山县', '450100', '马山', 3, '0771', '530600', '中国,广西壮族自治区,南宁市,马山县', 108.177001953125, 23.709299087524414, 'Mashan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2174, '450125', '上林县', '450100', '上林', 3, '0771', '530500', '中国,广西壮族自治区,南宁市,上林县', 108.6050033569336, 23.43199920654297, 'Shanglin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2175, '450126', '宾阳县', '450100', '宾阳', 3, '0771', '530400', '中国,广西壮族自治区,南宁市,宾阳县', 108.81199645996094, 23.219600677490234, 'Binyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2176, '450127', '横县', '450100', '横县', 3, '0771', '530300', '中国,广西壮族自治区,南宁市,横县', 109.26599884033203, 22.684499740600586, 'Hengxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2177, '450128', '埌东新区', '450100', '埌东', 3, '0771', '530000', '中国,广西壮族自治区,南宁市,埌东新区', 108.41899871826172, 22.812999725341797, 'Langdong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2178, '450200', '柳州市', '450000', '柳州', 2, '0772', '545001', '中国,广西壮族自治区,柳州市', 109.41200256347656, 24.314599990844727, 'Liuzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2179, '450202', '城中区', '450200', '城中', 3, '0772', '545001', '中国,广西壮族自治区,柳州市,城中区', 109.41100311279297, 24.315399169921875, 'Chengzhong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2180, '450203', '鱼峰区', '450200', '鱼峰', 3, '0772', '545005', '中国,广西壮族自治区,柳州市,鱼峰区', 109.4530029296875, 24.318700790405273, 'Yufeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2181, '450204', '柳南区', '450200', '柳南', 3, '0772', '545007', '中国,广西壮族自治区,柳州市,柳南区', 109.38500213623047, 24.336000442504883, 'Liunan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2182, '450205', '柳北区', '450200', '柳北', 3, '0772', '545002', '中国,广西壮族自治区,柳州市,柳北区', 109.4020004272461, 24.362699508666992, 'Liubei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2183, '450221', '柳江县', '450200', '柳江', 3, '0772', '545100', '中国,广西壮族自治区,柳州市,柳江县', 109.33300018310547, 24.256000518798828, 'Liujiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2184, '450222', '柳城县', '450200', '柳城', 3, '0772', '545200', '中国,广西壮族自治区,柳州市,柳城县', 109.23899841308594, 24.649499893188477, 'Liucheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2185, '450223', '鹿寨县', '450200', '鹿寨', 3, '0772', '545600', '中国,广西壮族自治区,柳州市,鹿寨县', 109.75199890136719, 24.473100662231445, 'Luzhai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2186, '450224', '融安县', '450200', '融安', 3, '0772', '545400', '中国,广西壮族自治区,柳州市,融安县', 109.39800262451172, 25.224599838256836, 'Rong\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2187, '450225', '融水苗族自治县', '450200', '融水', 3, '0772', '545300', '中国,广西壮族自治区,柳州市,融水苗族自治县', 109.25599670410156, 25.066299438476562, 'Rongshui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2188, '450226', '三江侗族自治县', '450200', '三江', 3, '0772', '545500', '中国,广西壮族自治区,柳州市,三江侗族自治县', 109.60399627685547, 25.784299850463867, 'Sanjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2189, '450227', '柳东新区', '450200', '柳东', 3, '0772', '545000', '中国,广西壮族自治区,柳州市,柳东新区', 109.43699645996094, 24.329200744628906, 'Liudong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2190, '450300', '桂林市', '450000', '桂林', 2, '0773', '541100', '中国,广西壮族自治区,桂林市', 110.29900360107422, 25.274200439453125, 'Guilin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2191, '450302', '秀峰区', '450300', '秀峰', 3, '0773', '541001', '中国,广西壮族自治区,桂林市,秀峰区', 110.28900146484375, 25.282499313354492, 'Xiufeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2192, '450303', '叠彩区', '450300', '叠彩', 3, '0773', '541001', '中国,广西壮族自治区,桂林市,叠彩区', 110.302001953125, 25.313800811767578, 'Diecai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2193, '450304', '象山区', '450300', '象山', 3, '0773', '541002', '中国,广西壮族自治区,桂林市,象山区', 110.28099822998047, 25.261699676513672, 'Xiangshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2194, '450305', '七星区', '450300', '七星', 3, '0773', '541004', '中国,广西壮族自治区,桂林市,七星区', 110.31800079345703, 25.252500534057617, 'Qixing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2195, '450311', '雁山区', '450300', '雁山', 3, '0773', '541006', '中国,广西壮族自治区,桂林市,雁山区', 110.30899810791016, 25.060400009155273, 'Yanshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2196, '450312', '临桂区', '450300', '临桂', 3, '0773', '541100', '中国,广西壮族自治区,桂林市,临桂区', 110.20500183105469, 25.246299743652344, 'Lingui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2197, '450321', '阳朔县', '450300', '阳朔', 3, '0773', '541900', '中国,广西壮族自治区,桂林市,阳朔县', 110.49500274658203, 24.775800704956055, 'Yangshuo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2198, '450323', '灵川县', '450300', '灵川', 3, '0773', '541200', '中国,广西壮族自治区,桂林市,灵川县', 110.3290023803711, 25.412900924682617, 'Lingchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2199, '450324', '全州县', '450300', '全州', 3, '0773', '541503', '中国,广西壮族自治区,桂林市,全州县', 111.0719985961914, 25.92799949645996, 'Quanzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2200, '450325', '兴安县', '450300', '兴安', 3, '0773', '541300', '中国,广西壮族自治区,桂林市,兴安县', 110.6709976196289, 25.6117000579834, 'Xing\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2201, '450326', '永福县', '450300', '永福', 3, '0773', '541800', '中国,广西壮族自治区,桂林市,永福县', 109.98300170898438, 24.979999542236328, 'Yongfu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2202, '450327', '灌阳县', '450300', '灌阳', 3, '0773', '541600', '中国,广西壮族自治区,桂林市,灌阳县', 111.16000366210938, 25.488000869750977, 'Guanyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2203, '450328', '龙胜各族自治县', '450300', '龙胜', 3, '0773', '541700', '中国,广西壮族自治区,桂林市,龙胜各族自治县', 110.01200103759766, 25.796100616455078, 'Longsheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2204, '450329', '资源县', '450300', '资源', 3, '0773', '541400', '中国,广西壮族自治区,桂林市,资源县', 110.65299987792969, 26.042400360107422, 'Ziyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2205, '450330', '平乐县', '450300', '平乐', 3, '0773', '542400', '中国,广西壮族自治区,桂林市,平乐县', 110.64199829101562, 24.632400512695312, 'Pingle'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2206, '450331', '荔浦县', '450300', '荔浦', 3, '0773', '546600', '中国,广西壮族自治区,桂林市,荔浦县', 110.39700317382812, 24.495899200439453, 'Lipu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2207, '450332', '恭城瑶族自治县', '450300', '恭城', 3, '0773', '542500', '中国,广西壮族自治区,桂林市,恭城瑶族自治县', 110.83000183105469, 24.83289909362793, 'Gongcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2208, '450400', '梧州市', '450000', '梧州', 2, '0774', '543002', '中国,广西壮族自治区,梧州市', 111.31600189208984, 23.472299575805664, 'Wuzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2209, '450403', '万秀区', '450400', '万秀', 3, '0774', '543000', '中国,广西壮族自治区,梧州市,万秀区', 111.32099914550781, 23.472999572753906, 'Wanxiu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2210, '450405', '长洲区', '450400', '长洲', 3, '0774', '543003', '中国,广西壮族自治区,梧州市,长洲区', 111.2750015258789, 23.485700607299805, 'Changzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2211, '450406', '龙圩区', '450400', '龙圩', 3, '0774', '543002', '中国,广西壮族自治区,梧州市,龙圩区', 111.31600189208984, 23.472299575805664, 'Longxu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2212, '450421', '苍梧县', '450400', '苍梧', 3, '0774', '543100', '中国,广西壮族自治区,梧州市,苍梧县', 111.24500274658203, 23.420499801635742, 'Cangwu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2213, '450422', '藤县', '450400', '藤县', 3, '0774', '543300', '中国,广西壮族自治区,梧州市,藤县', 110.91400146484375, 23.376100540161133, 'Tengxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2214, '450423', '蒙山县', '450400', '蒙山', 3, '0774', '546700', '中国,广西壮族自治区,梧州市,蒙山县', 110.52200317382812, 24.20170021057129, 'Mengshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2215, '450481', '岑溪市', '450400', '岑溪', 3, '0774', '543200', '中国,广西壮族自治区,梧州市,岑溪市', 110.99600219726562, 22.919099807739258, 'Cenxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2216, '450500', '北海市', '450000', '北海', 2, '0779', '536000', '中国,广西壮族自治区,北海市', 109.11900329589844, 21.47330093383789, 'Beihai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2217, '450502', '海城区', '450500', '海城', 3, '0779', '536000', '中国,广西壮族自治区,北海市,海城区', 109.11699676513672, 21.475000381469727, 'Haicheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2218, '450503', '银海区', '450500', '银海', 3, '0779', '536000', '中国,广西壮族自治区,北海市,银海区', 109.12999725341797, 21.478300094604492, 'Yinhai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2219, '450512', '铁山港区', '450500', '铁山港', 3, '0779', '536017', '中国,广西壮族自治区,北海市,铁山港区', 109.45600128173828, 21.596599578857422, 'Tieshangang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2220, '450521', '合浦县', '450500', '合浦', 3, '0779', '536100', '中国,广西壮族自治区,北海市,合浦县', 109.20099639892578, 21.666000366210938, 'Hepu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2221, '450600', '防城港市', '450000', '防城港', 2, '0770', '538001', '中国,广西壮族自治区,防城港市', 108.34500122070312, 21.614599227905273, 'Fangchenggang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2222, '450602', '港口区', '450600', '港口', 3, '0770', '538001', '中国,广西壮族自治区,防城港市,港口区', 108.37999725341797, 21.643400192260742, 'Gangkou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2223, '450603', '防城区', '450600', '防城', 3, '0770', '538021', '中国,广西壮族自治区,防城港市,防城区', 108.35700225830078, 21.76460075378418, 'Fangcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2224, '450621', '上思县', '450600', '上思', 3, '0770', '535500', '中国,广西壮族自治区,防城港市,上思县', 107.98200225830078, 22.149599075317383, 'Shangsi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2225, '450681', '东兴市', '450600', '东兴', 3, '0770', '538100', '中国,广西壮族自治区,防城港市,东兴市', 107.97200012207031, 21.547100067138672, 'Dongxing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2226, '450700', '钦州市', '450000', '钦州', 2, '0777', '535099', '中国,广西壮族自治区,钦州市', 108.6240005493164, 21.967100143432617, 'Qinzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2227, '450702', '钦南区', '450700', '钦南', 3, '0777', '535099', '中国,广西壮族自治区,钦州市,钦南区', 108.61799621582031, 21.951400756835938, 'Qinnan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2228, '450703', '钦北区', '450700', '钦北', 3, '0777', '535099', '中国,广西壮族自治区,钦州市,钦北区', 108.62999725341797, 21.9512996673584, 'Qinbei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2229, '450721', '灵山县', '450700', '灵山', 3, '0777', '535099', '中国,广西壮族自治区,钦州市,灵山县', 109.29199981689453, 22.416500091552734, 'Lingshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2230, '450722', '浦北县', '450700', '浦北', 3, '0777', '535099', '中国,广西壮族自治区,钦州市,浦北县', 109.55599975585938, 22.26889991760254, 'Pubei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2231, '450800', '贵港市', '450000', '贵港', 2, '0775', '537100', '中国,广西壮族自治区,贵港市', 109.60199737548828, 23.093599319458008, 'Guigang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2232, '450802', '港北区', '450800', '港北', 3, '0775', '537100', '中国,广西壮族自治区,贵港市,港北区', 109.5719985961914, 23.111499786376953, 'Gangbei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2233, '450803', '港南区', '450800', '港南', 3, '0775', '537100', '中国,广西壮族自治区,贵港市,港南区', 109.60600280761719, 23.07229995727539, 'Gangnan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2234, '450804', '覃塘区', '450800', '覃塘', 3, '0775', '537121', '中国,广西壮族自治区,贵港市,覃塘区', 109.44300079345703, 23.126800537109375, 'Qintang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2235, '450821', '平南县', '450800', '平南', 3, '0775', '537300', '中国,广西壮族自治区,贵港市,平南县', 110.39099884033203, 23.54199981689453, 'Pingnan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2236, '450881', '桂平市', '450800', '桂平', 3, '0775', '537200', '中国,广西壮族自治区,贵港市,桂平市', 110.08100128173828, 23.393400192260742, 'Guiping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2237, '450900', '玉林市', '450000', '玉林', 2, '0775', '537000', '中国,广西壮族自治区,玉林市', 110.15399932861328, 22.631399154663086, 'Yulin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2238, '450902', '玉州区', '450900', '玉州', 3, '0775', '537000', '中国,广西壮族自治区,玉林市,玉州区', 110.1510009765625, 22.62809944152832, 'Yuzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2239, '450903', '福绵区', '450900', '福绵', 3, '0775', '537023', '中国,广西壮族自治区,玉林市,福绵区', 110.06500244140625, 22.583099365234375, 'Fumian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2240, '450904', '玉东新区', '450900', '玉东', 3, '0775', '537000', '中国,广西壮族自治区,玉林市,玉东新区', 110.15399932861328, 22.631399154663086, 'Yudong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2241, '450921', '容县', '450900', '容县', 3, '0775', '537500', '中国,广西壮族自治区,玉林市,容县', 110.55599975585938, 22.85700035095215, 'Rongxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2242, '450922', '陆川县', '450900', '陆川', 3, '0775', '537700', '中国,广西壮族自治区,玉林市,陆川县', 110.26399993896484, 22.324499130249023, 'Luchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2243, '450923', '博白县', '450900', '博白', 3, '0775', '537600', '中国,广西壮族自治区,玉林市,博白县', 109.97699737548828, 22.272899627685547, 'Bobai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2244, '450924', '兴业县', '450900', '兴业', 3, '0775', '537800', '中国,广西壮族自治区,玉林市,兴业县', 109.8759994506836, 22.742399215698242, 'Xingye'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2245, '450981', '北流市', '450900', '北流', 3, '0775', '537400', '中国,广西壮族自治区,玉林市,北流市', 110.35299682617188, 22.708200454711914, 'Beiliu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2246, '451000', '百色市', '450000', '百色', 2, '0776', '533000', '中国,广西壮族自治区,百色市', 106.61599731445312, 23.8976993560791, 'Baise'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2247, '451002', '右江区', '451000', '右江', 3, '0776', '533000', '中国,广西壮族自治区,百色市,右江区', 106.61799621582031, 23.90089988708496, 'Youjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2248, '451021', '田阳县', '451000', '田阳', 3, '0776', '533600', '中国,广西壮族自治区,百色市,田阳县', 106.91600036621094, 23.735300064086914, 'Tianyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2249, '451022', '田东县', '451000', '田东', 3, '0776', '531500', '中国,广西壮族自治区,百色市,田东县', 107.1240005493164, 23.600000381469727, 'Tiandong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2250, '451023', '平果县', '451000', '平果', 3, '0776', '531400', '中国,广西壮族自治区,百色市,平果县', 107.58999633789062, 23.329700469970703, 'Pingguo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2251, '451024', '德保县', '451000', '德保', 3, '0776', '533700', '中国,广西壮族自治区,百色市,德保县', 106.61900329589844, 23.32509994506836, 'Debao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2252, '451025', '靖西县', '451000', '靖西', 3, '0776', '533800', '中国,广西壮族自治区,百色市,靖西县', 106.41799926757812, 23.134300231933594, 'Jingxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2253, '451026', '那坡县', '451000', '那坡', 3, '0776', '533900', '中国,广西壮族自治区,百色市,那坡县', 105.84200286865234, 23.4064998626709, 'Napo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2254, '451027', '凌云县', '451000', '凌云', 3, '0776', '533100', '中国,广西壮族自治区,百色市,凌云县', 106.56199645996094, 24.34749984741211, 'Lingyun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2255, '451028', '乐业县', '451000', '乐业', 3, '0776', '533200', '中国,广西壮族自治区,百色市,乐业县', 106.56099700927734, 24.782899856567383, 'Leye'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2256, '451029', '田林县', '451000', '田林', 3, '0776', '533300', '中国,广西壮族自治区,百色市,田林县', 106.22899627685547, 24.29210090637207, 'Tianlin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2257, '451030', '西林县', '451000', '西林', 3, '0776', '533500', '中国,广西壮族自治区,百色市,西林县', 105.09700012207031, 24.489700317382812, 'Xilin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2258, '451031', '隆林各族自治县', '451000', '隆林', 3, '0776', '533400', '中国,广西壮族自治区,百色市,隆林各族自治县', 105.34300231933594, 24.77039909362793, 'Longlin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2259, '451100', '贺州市', '450000', '贺州', 2, '0774', '542800', '中国,广西壮族自治区,贺州市', 111.552001953125, 24.414100646972656, 'Hezhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2260, '451102', '八步区', '451100', '八步', 3, '0774', '542800', '中国,广西壮族自治区,贺州市,八步区', 111.552001953125, 24.411800384521484, 'Babu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2261, '451121', '昭平县', '451100', '昭平', 3, '0774', '546800', '中国,广西壮族自治区,贺州市,昭平县', 110.81099700927734, 24.17009925842285, 'Zhaoping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2262, '451122', '钟山县', '451100', '钟山', 3, '0774', '542600', '中国,广西壮族自治区,贺州市,钟山县', 111.30500030517578, 24.524799346923828, 'Zhongshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2263, '451123', '富川瑶族自治县', '451100', '富川', 3, '0774', '542700', '中国,广西壮族自治区,贺州市,富川瑶族自治县', 111.27799987792969, 24.814300537109375, 'Fuchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2264, '451124', '平桂管理区', '451100', '平桂', 3, '0774', '542800', '中国,广西壮族自治区,贺州市,平桂管理区', 111.48600006103516, 24.45800018310547, 'Pingui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2265, '451200', '河池市', '450000', '河池', 2, '0778', '547000', '中国,广西壮族自治区,河池市', 108.06199645996094, 24.695899963378906, 'Hechi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2266, '451202', '金城江区', '451200', '金城江', 3, '0779', '547000', '中国,广西壮族自治区,河池市,金城江区', 108.03700256347656, 24.689699172973633, 'Jinchengjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2267, '451221', '南丹县', '451200', '南丹', 3, '0781', '547200', '中国,广西壮族自治区,河池市,南丹县', 107.5459976196289, 24.97760009765625, 'Nandan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2268, '451222', '天峨县', '451200', '天峨', 3, '0782', '547300', '中国,广西壮族自治区,河池市,天峨县', 107.1719970703125, 24.995899200439453, 'Tiane'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2269, '451223', '凤山县', '451200', '凤山', 3, '0783', '547600', '中国,广西壮族自治区,河池市,凤山县', 107.04900360107422, 24.542200088500977, 'Fengshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2270, '451224', '东兰县', '451200', '东兰', 3, '0784', '547400', '中国,广西壮族自治区,河池市,东兰县', 107.375, 24.510499954223633, 'Donglan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2271, '451225', '罗城仫佬族自治县', '451200', '罗城', 3, '0785', '546400', '中国,广西壮族自治区,河池市,罗城仫佬族自治县', 108.90799713134766, 24.779199600219727, 'Luocheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2272, '451226', '环江毛南族自治县', '451200', '环江', 3, '0786', '547100', '中国,广西壮族自治区,河池市,环江毛南族自治县', 108.26100158691406, 24.829200744628906, 'Huanjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2273, '451227', '巴马瑶族自治县', '451200', '巴马', 3, '0787', '547500', '中国,广西壮族自治区,河池市,巴马瑶族自治县', 107.25299835205078, 24.141300201416016, 'Bama'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2274, '451228', '都安瑶族自治县', '451200', '都安', 3, '0788', '530700', '中国,广西壮族自治区,河池市,都安瑶族自治县', 108.10099792480469, 23.93239974975586, 'Du\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2275, '451229', '大化瑶族自治县', '451200', '大化', 3, '0789', '530800', '中国,广西壮族自治区,河池市,大化瑶族自治县', 107.99800109863281, 23.74489974975586, 'Dahua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2276, '451281', '宜州市', '451200', '宜州', 3, '0780', '546300', '中国,广西壮族自治区,河池市,宜州市', 108.65299987792969, 24.493900299072266, 'Yizhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2277, '451300', '来宾市', '450000', '来宾', 2, '0772', '546100', '中国,广西壮族自治区,来宾市', 109.2300033569336, 23.733800888061523, 'Laibin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2278, '451302', '兴宾区', '451300', '兴宾', 3, '0772', '546100', '中国,广西壮族自治区,来宾市,兴宾区', 109.23500061035156, 23.7273006439209, 'Xingbin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2279, '451321', '忻城县', '451300', '忻城', 3, '0772', '546200', '中国,广西壮族自治区,来宾市,忻城县', 108.66400146484375, 24.068599700927734, 'Xincheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2280, '451322', '象州县', '451300', '象州', 3, '0772', '545800', '中国,广西壮族自治区,来宾市,象州县', 109.6989974975586, 23.973600387573242, 'Xiangzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2281, '451323', '武宣县', '451300', '武宣', 3, '0772', '545900', '中国,广西壮族自治区,来宾市,武宣县', 109.66300201416016, 23.59469985961914, 'Wuxuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2282, '451324', '金秀瑶族自治县', '451300', '金秀', 3, '0772', '545799', '中国,广西壮族自治区,来宾市,金秀瑶族自治县', 110.19100189208984, 24.12929916381836, 'Jinxiu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2283, '451381', '合山市', '451300', '合山', 3, '0772', '546500', '中国,广西壮族自治区,来宾市,合山市', 108.88600158691406, 23.80620002746582, 'Heshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2284, '451400', '崇左市', '450000', '崇左', 2, '0771', '532299', '中国,广西壮族自治区,崇左市', 107.35399627685547, 22.40410041809082, 'Chongzuo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2285, '451402', '江州区', '451400', '江州', 3, '0771', '532299', '中国,广西壮族自治区,崇左市,江州区', 107.34700012207031, 22.411399841308594, 'Jiangzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2286, '451421', '扶绥县', '451400', '扶绥', 3, '0771', '532199', '中国,广西壮族自治区,崇左市,扶绥县', 107.90399932861328, 22.63409996032715, 'Fusui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2287, '451422', '宁明县', '451400', '宁明', 3, '0771', '532599', '中国,广西壮族自治区,崇左市,宁明县', 107.072998046875, 22.136600494384766, 'Ningming'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2288, '451423', '龙州县', '451400', '龙州', 3, '0771', '532499', '中国,广西壮族自治区,崇左市,龙州县', 106.85399627685547, 22.339399337768555, 'Longzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2289, '451424', '大新县', '451400', '大新', 3, '0771', '532399', '中国,广西壮族自治区,崇左市,大新县', 107.197998046875, 22.8341007232666, 'Daxin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2290, '451425', '天等县', '451400', '天等', 3, '0771', '532899', '中国,广西壮族自治区,崇左市,天等县', 107.13999938964844, 23.07699966430664, 'Tiandeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2291, '451481', '凭祥市', '451400', '凭祥', 3, '0771', '532699', '中国,广西壮族自治区,崇左市,凭祥市', 106.75499725341797, 22.10569953918457, 'Pingxiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2292, '460000', '海南省', '100000', '海南', 1, '', '1', '中国,海南省', 110.33100128173828, 20.031999588012695, 'Hainan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2293, '460100', '海口市', '460000', '海口', 2, '0898', '570000', '中国,海南省,海口市', 110.33100128173828, 20.031999588012695, 'Haikou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2294, '460105', '秀英区', '460100', '秀英', 3, '0898', '570311', '中国,海南省,海口市,秀英区', 110.29299926757812, 20.00749969482422, 'Xiuying'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2295, '460106', '龙华区', '460100', '龙华', 3, '0898', '570145', '中国,海南省,海口市,龙华区', 110.302001953125, 20.02869987487793, 'Longhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2296, '460107', '琼山区', '460100', '琼山', 3, '0898', '571100', '中国,海南省,海口市,琼山区', 110.35399627685547, 20.00320053100586, 'Qiongshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2297, '460108', '美兰区', '460100', '美兰', 3, '0898', '570203', '中国,海南省,海口市,美兰区', 110.36900329589844, 20.028600692749023, 'Meilan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2298, '460200', '三亚市', '460000', '三亚', 2, '0898', '572000', '中国,海南省,三亚市', 109.50800323486328, 18.247900009155273, 'Sanya'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2299, '460202', '海棠区', '460200', '海棠', 3, '0898', '572000', '中国,海南省,三亚市,海棠区', 109.50800323486328, 18.247900009155273, 'Haitang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2300, '460203', '吉阳区', '460200', '吉阳', 3, '0898', '572000', '中国,海南省,三亚市,吉阳区', 109.50800323486328, 18.247900009155273, 'Jiyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2301, '460204', '天涯区', '460200', '天涯', 3, '0898', '572000', '中国,海南省,三亚市,天涯区', 109.50800323486328, 18.247900009155273, 'Tianya'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2302, '460205', '崖州区', '460200', '崖州', 3, '0898', '572000', '中国,海南省,三亚市,崖州区', 109.50800323486328, 18.247900009155273, 'Yazhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2303, '460300', '三沙市', '460000', '三沙', 2, '0898', '573199', '中国,海南省,三沙市', 112.3489990234375, 16.83099937438965, 'Sansha'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2304, '460321', '西沙群岛', '460300', '西沙', 3, '0898', '572000', '中国,海南省,三沙市,西沙群岛', 112.0260009765625, 16.331300735473633, 'Xisha Islands'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2305, '460322', '南沙群岛', '460300', '南沙', 3, '0898', '573100', '中国,海南省,三沙市,南沙群岛', 116.75, 11.47189998626709, 'Nansha Islands'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2306, '460323', '中沙群岛', '460300', '中沙', 3, '0898', '573100', '中国,海南省,三沙市,中沙群岛', 117.73999786376953, 15.112899780273438, 'Zhongsha Islands'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2307, '469000', '直辖县级', '460000', ' ', 2, '', '', '中国,海南省,直辖县级', 109.50299835205078, 18.739900588989258, ''); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2308, '469001', '五指山市', '469000', '五指山', 3, '0898', '572200', '中国,海南省,直辖县级,五指山市', 109.51699829101562, 18.776899337768555, 'Wuzhishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2309, '469002', '琼海市', '469000', '琼海', 3, '0898', '571400', '中国,海南省,直辖县级,琼海市', 110.46700286865234, 19.246000289916992, 'Qionghai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2310, '469003', '儋州市', '469000', '儋州', 3, '0898', '571700', '中国,海南省,直辖县级,儋州市', 109.5770034790039, 19.517499923706055, 'Danzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2311, '469005', '文昌市', '469000', '文昌', 3, '0898', '571339', '中国,海南省,直辖县级,文昌市', 110.75399780273438, 19.613000869750977, 'Wenchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2312, '469006', '万宁市', '469000', '万宁', 3, '0898', '571500', '中国,海南省,直辖县级,万宁市', 110.38899993896484, 18.796199798583984, 'Wanning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2313, '469007', '东方市', '469000', '东方', 3, '0898', '572600', '中国,海南省,直辖县级,东方市', 108.65399932861328, 19.101999282836914, 'Dongfang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2314, '469021', '定安县', '469000', '定安', 3, '0898', '571200', '中国,海南省,直辖县级,定安县', 110.3239974975586, 19.699199676513672, 'Ding\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2315, '469022', '屯昌县', '469000', '屯昌', 3, '0898', '571600', '中国,海南省,直辖县级,屯昌县', 110.10299682617188, 19.362899780273438, 'Tunchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2316, '469023', '澄迈县', '469000', '澄迈', 3, '0898', '571900', '中国,海南省,直辖县级,澄迈县', 110.00700378417969, 19.73710060119629, 'Chengmai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2317, '469024', '临高县', '469000', '临高', 3, '0898', '571800', '中国,海南省,直辖县级,临高县', 109.68800354003906, 19.908300399780273, 'Lingao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2318, '469025', '白沙黎族自治县', '469000', '白沙', 3, '0898', '572800', '中国,海南省,直辖县级,白沙黎族自治县', 109.4530029296875, 19.224599838256836, 'Baisha'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2319, '469026', '昌江黎族自治县', '469000', '昌江', 3, '0898', '572700', '中国,海南省,直辖县级,昌江黎族自治县', 109.0530014038086, 19.26099967956543, 'Changjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2320, '469027', '乐东黎族自治县', '469000', '乐东', 3, '0898', '572500', '中国,海南省,直辖县级,乐东黎族自治县', 109.17500305175781, 18.747600555419922, 'Ledong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2321, '469028', '陵水黎族自治县', '469000', '陵水', 3, '0898', '572400', '中国,海南省,直辖县级,陵水黎族自治县', 110.03700256347656, 18.5049991607666, 'Lingshui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2322, '469029', '保亭黎族苗族自治县', '469000', '保亭', 3, '0898', '572300', '中国,海南省,直辖县级,保亭黎族苗族自治县', 109.7020034790039, 18.63640022277832, 'Baoting'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2323, '469030', '琼中黎族苗族自治县', '469000', '琼中', 3, '0898', '572900', '中国,海南省,直辖县级,琼中黎族苗族自治县', 109.83999633789062, 19.035600662231445, 'Qiongzhong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2324, '500000', '重庆市', '100000', '重庆', 1, '', '1', '中国,重庆', 106.50499725341797, 29.533199310302734, 'Chongqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2325, '500100', '重庆市', '500000', '重庆', 2, '023', '400000', '中国,重庆,重庆市', 106.50499725341797, 29.533199310302734, 'Chongqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2326, '500101', '万州区', '500100', '万州', 3, '023', '404000', '中国,重庆,重庆市,万州区', 108.40899658203125, 30.807899475097656, 'Wanzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2327, '500102', '涪陵区', '500100', '涪陵', 3, '023', '408000', '中国,重庆,重庆市,涪陵区', 107.38999938964844, 29.702899932861328, 'Fuling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2328, '500103', '渝中区', '500100', '渝中', 3, '023', '400010', '中国,重庆,重庆市,渝中区', 106.56900024414062, 29.552799224853516, 'Yuzhong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2329, '500104', '大渡口区', '500100', '大渡口', 3, '023', '400080', '中国,重庆,重庆市,大渡口区', 106.48300170898438, 29.484500885009766, 'Dadukou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2330, '500105', '江北区', '500100', '江北', 3, '023', '400020', '中国,重庆,重庆市,江北区', 106.5739974975586, 29.606599807739258, 'Jiangbei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2331, '500106', '沙坪坝区', '500100', '沙坪坝', 3, '023', '400030', '中国,重庆,重庆市,沙坪坝区', 106.45800018310547, 29.541099548339844, 'Shapingba'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2332, '500107', '九龙坡区', '500100', '九龙坡', 3, '023', '400050', '中国,重庆,重庆市,九龙坡区', 106.51100158691406, 29.50200080871582, 'Jiulongpo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2333, '500108', '南岸区', '500100', '南岸', 3, '023', '400064', '中国,重庆,重庆市,南岸区', 106.56300354003906, 29.523099899291992, 'Nan\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2334, '500109', '北碚区', '500100', '北碚', 3, '023', '400700', '中国,重庆,重庆市,北碚区', 106.39600372314453, 29.805700302124023, 'Beibei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2335, '500110', '綦江区', '500100', '綦江', 3, '023', '400800', '中国,重庆,重庆市,綦江区', 106.927001953125, 28.9606990814209, 'Qijiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2336, '500111', '大足区', '500100', '大足', 3, '023', '400900', '中国,重庆,重庆市,大足区', 105.76799774169922, 29.483999252319336, 'Dazu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2337, '500112', '渝北区', '500100', '渝北', 3, '023', '401120', '中国,重庆,重庆市,渝北区', 106.63099670410156, 29.71820068359375, 'Yubei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2338, '500113', '巴南区', '500100', '巴南', 3, '023', '401320', '中国,重庆,重庆市,巴南区', 106.52400207519531, 29.383100509643555, 'Banan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2339, '500114', '黔江区', '500100', '黔江', 3, '023', '409700', '中国,重庆,重庆市,黔江区', 108.77100372314453, 29.533199310302734, 'Qianjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2340, '500115', '长寿区', '500100', '长寿', 3, '023', '401220', '中国,重庆,重庆市,长寿区', 107.08200073242188, 29.853599548339844, 'Changshou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2341, '500116', '江津区', '500100', '江津', 3, '023', '402260', '中国,重庆,重庆市,江津区', 106.25900268554688, 29.29010009765625, 'Jiangjin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2342, '500117', '合川区', '500100', '合川', 3, '023', '401520', '中国,重庆,重庆市,合川区', 106.2760009765625, 29.972299575805664, 'Hechuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2343, '500118', '永川区', '500100', '永川', 3, '023', '402160', '中国,重庆,重庆市,永川区', 105.927001953125, 29.355899810791016, 'Yongchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2344, '500119', '南川区', '500100', '南川', 3, '023', '408400', '中国,重庆,重庆市,南川区', 107.0989990234375, 29.157499313354492, 'Nanchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2345, '500120', '璧山区', '500100', '璧山', 3, '023', '402760', '中国,重庆,重庆市,璧山区', 106.23100280761719, 29.593599319458008, 'Bishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2346, '500151', '铜梁区', '500100', '铜梁', 3, '023', '402560', '中国,重庆,重庆市,铜梁区', 106.05500030517578, 29.83989906311035, 'Tongliang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2347, '500223', '潼南县', '500100', '潼南', 3, '023', '402660', '中国,重庆,重庆市,潼南县', 105.83999633789062, 30.191200256347656, 'Tongnan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2348, '500226', '荣昌县', '500100', '荣昌', 3, '023', '402460', '中国,重庆,重庆市,荣昌县', 105.59400177001953, 29.40489959716797, 'Rongchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2349, '500228', '梁平县', '500100', '梁平', 3, '023', '405200', '中国,重庆,重庆市,梁平县', 107.80000305175781, 30.675399780273438, 'Liangping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2350, '500229', '城口县', '500100', '城口', 3, '023', '405900', '中国,重庆,重庆市,城口县', 108.66500091552734, 31.947999954223633, 'Chengkou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2351, '500230', '丰都县', '500100', '丰都', 3, '023', '408200', '中国,重庆,重庆市,丰都县', 107.73100280761719, 29.863500595092773, 'Fengdu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2352, '500231', '垫江县', '500100', '垫江', 3, '023', '408300', '中国,重庆,重庆市,垫江县', 107.35399627685547, 30.333599090576172, 'Dianjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2353, '500232', '武隆县', '500100', '武隆', 3, '023', '408500', '中国,重庆,重庆市,武隆县', 107.76000213623047, 29.32550048828125, 'Wulong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2354, '500233', '忠县', '500100', '忠县', 3, '023', '404300', '中国,重庆,重庆市,忠县', 108.03700256347656, 30.288999557495117, 'Zhongxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2355, '500234', '开县', '500100', '开县', 3, '023', '405400', '中国,重庆,重庆市,开县', 108.39299774169922, 31.160900115966797, 'Kaixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2356, '500235', '云阳县', '500100', '云阳', 3, '023', '404500', '中国,重庆,重庆市,云阳县', 108.6969985961914, 30.930599212646484, 'Yunyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2357, '500236', '奉节县', '500100', '奉节', 3, '023', '404600', '中国,重庆,重庆市,奉节县', 109.46499633789062, 31.018199920654297, 'Fengjie'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2358, '500237', '巫山县', '500100', '巫山', 3, '023', '404700', '中国,重庆,重庆市,巫山县', 109.87799835205078, 31.074600219726562, 'Wushan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2359, '500238', '巫溪县', '500100', '巫溪', 3, '023', '405800', '中国,重庆,重庆市,巫溪县', 109.63099670410156, 31.397600173950195, 'Wuxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2360, '500240', '石柱土家族自治县', '500100', '石柱', 3, '023', '409100', '中国,重庆,重庆市,石柱土家族自治县', 108.11399841308594, 30.000499725341797, 'Shizhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2361, '500241', '秀山土家族苗族自治县', '500100', '秀山', 3, '023', '409900', '中国,重庆,重庆市,秀山土家族苗族自治县', 108.98899841308594, 28.450599670410156, 'Xiushan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2362, '500242', '酉阳土家族苗族自治县', '500100', '酉阳', 3, '023', '409800', '中国,重庆,重庆市,酉阳土家族苗族自治县', 108.77200317382812, 28.844600677490234, 'Youyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2363, '500243', '彭水苗族土家族自治县', '500100', '彭水', 3, '023', '409600', '中国,重庆,重庆市,彭水苗族土家族自治县', 108.16600036621094, 29.29520034790039, 'Pengshui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2364, '500300', '两江新区', '500000', '两江新区', 2, '023', '400000', '中国,重庆,两江新区', 106.46299743652344, 29.72920036315918, 'Liangjiangxinqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2365, '500301', '北部新区', '500300', '北部新区', 3, '023', '400000', '中国,重庆,两江新区,北部新区', 106.48899841308594, 29.66710090637207, 'Beibuxinqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2366, '500302', '保税港区', '500300', '保税港区', 3, '023', '400000', '中国,重庆,两江新区,保税港区', 106.63800048828125, 29.716299057006836, 'Baoshuigangqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2367, '500303', '工业园区', '500300', '工业园区', 3, '023', '400000', '中国,重庆,两江新区,工业园区', 106.6259994506836, 29.555500030517578, 'Gongyeyuanqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2368, '510000', '四川省', '100000', '四川', 1, '', '1', '中国,四川省', 104.06600189208984, 30.659500122070312, 'Sichuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2369, '510100', '成都市', '510000', '成都', 2, '028', '610015', '中国,四川省,成都市', 104.06600189208984, 30.659500122070312, 'Chengdu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2370, '510104', '锦江区', '510100', '锦江', 3, '028', '610021', '中国,四川省,成都市,锦江区', 104.08300018310547, 30.656099319458008, 'Jinjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2371, '510105', '青羊区', '510100', '青羊', 3, '028', '610031', '中国,四川省,成都市,青羊区', 104.06199645996094, 30.673900604248047, 'Qingyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2372, '510106', '金牛区', '510100', '金牛', 3, '028', '610036', '中国,四川省,成都市,金牛区', 104.0510025024414, 30.691299438476562, 'Jinniu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2373, '510107', '武侯区', '510100', '武侯', 3, '028', '610041', '中国,四川省,成都市,武侯区', 104.04299926757812, 30.64229965209961, 'Wuhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2374, '510108', '成华区', '510100', '成华', 3, '028', '610066', '中国,四川省,成都市,成华区', 104.10199737548828, 30.659900665283203, 'Chenghua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2375, '510112', '龙泉驿区', '510100', '龙泉驿', 3, '028', '610100', '中国,四川省,成都市,龙泉驿区', 104.2750015258789, 30.55660057067871, 'Longquanyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2376, '510113', '青白江区', '510100', '青白江', 3, '028', '610300', '中国,四川省,成都市,青白江区', 104.2509994506836, 30.878400802612305, 'Qingbaijiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2377, '510114', '新都区', '510100', '新都', 3, '028', '610500', '中国,四川省,成都市,新都区', 104.15899658203125, 30.82309913635254, 'Xindu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2378, '510115', '温江区', '510100', '温江', 3, '028', '611130', '中国,四川省,成都市,温江区', 103.8489990234375, 30.68440055847168, 'Wenjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2379, '510121', '金堂县', '510100', '金堂', 3, '028', '610400', '中国,四川省,成都市,金堂县', 104.41200256347656, 30.861900329589844, 'Jintang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2380, '510122', '双流县', '510100', '双流', 3, '028', '610200', '中国,四川省,成都市,双流县', 103.92400360107422, 30.574399948120117, 'Shuangliu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2381, '510124', '郫县', '510100', '郫县', 3, '028', '611730', '中国,四川省,成都市,郫县', 103.88700103759766, 30.81049919128418, 'Pixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2382, '510129', '大邑县', '510100', '大邑', 3, '028', '611330', '中国,四川省,成都市,大邑县', 103.52100372314453, 30.587400436401367, 'Dayi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2383, '510131', '蒲江县', '510100', '蒲江', 3, '028', '611630', '中国,四川省,成都市,蒲江县', 103.50599670410156, 30.196699142456055, 'Pujiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2384, '510132', '新津县', '510100', '新津', 3, '028', '611430', '中国,四川省,成都市,新津县', 103.81099700927734, 30.409799575805664, 'Xinjin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2385, '510181', '都江堰市', '510100', '都江堰', 3, '028', '611830', '中国,四川省,成都市,都江堰市', 103.61900329589844, 30.998199462890625, 'Dujiangyan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2386, '510182', '彭州市', '510100', '彭州', 3, '028', '611930', '中国,四川省,成都市,彭州市', 103.95800018310547, 30.990100860595703, 'Pengzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2387, '510183', '邛崃市', '510100', '邛崃', 3, '028', '611530', '中国,四川省,成都市,邛崃市', 103.46299743652344, 30.414899826049805, 'Qionglai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2388, '510184', '崇州市', '510100', '崇州', 3, '028', '611230', '中国,四川省,成都市,崇州市', 103.6729965209961, 30.63010025024414, 'Chongzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2389, '510300', '自贡市', '510000', '自贡', 2, '0813', '643000', '中国,四川省,自贡市', 104.77300262451172, 29.352800369262695, 'Zigong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2390, '510302', '自流井区', '510300', '自流井', 3, '0813', '643000', '中国,四川省,自贡市,自流井区', 104.7770004272461, 29.337499618530273, 'Ziliujing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2391, '510303', '贡井区', '510300', '贡井', 3, '0813', '643020', '中国,四川省,自贡市,贡井区', 104.71499633789062, 29.345800399780273, 'Gongjing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2392, '510304', '大安区', '510300', '大安', 3, '0813', '643010', '中国,四川省,自贡市,大安区', 104.77400207519531, 29.36359977722168, 'Da\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2393, '510311', '沿滩区', '510300', '沿滩', 3, '0813', '643030', '中国,四川省,自贡市,沿滩区', 104.87999725341797, 29.26609992980957, 'Yantan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2394, '510321', '荣县', '510300', '荣县', 3, '0813', '643100', '中国,四川省,自贡市,荣县', 104.41799926757812, 29.444499969482422, 'Rongxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2395, '510322', '富顺县', '510300', '富顺', 3, '0813', '643200', '中国,四川省,自贡市,富顺县', 104.9749984741211, 29.18120002746582, 'Fushun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2396, '510400', '攀枝花市', '510000', '攀枝花', 2, '0812', '617000', '中国,四川省,攀枝花市', 101.71600341796875, 26.580400466918945, 'Panzhihua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2397, '510402', '东区', '510400', '东区', 3, '0812', '617067', '中国,四川省,攀枝花市,东区', 101.70500183105469, 26.54680061340332, 'Dongqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2398, '510403', '西区', '510400', '西区', 3, '0812', '617068', '中国,四川省,攀枝花市,西区', 101.63099670410156, 26.59749984741211, 'Xiqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2399, '510411', '仁和区', '510400', '仁和', 3, '0812', '617061', '中国,四川省,攀枝花市,仁和区', 101.73799896240234, 26.49839973449707, 'Renhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2400, '510421', '米易县', '510400', '米易', 3, '0812', '617200', '中国,四川省,攀枝花市,米易县', 102.11100006103516, 26.88719940185547, 'Miyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2401, '510422', '盐边县', '510400', '盐边', 3, '0812', '617100', '中国,四川省,攀枝花市,盐边县', 101.85399627685547, 26.688499450683594, 'Yanbian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2402, '510500', '泸州市', '510000', '泸州', 2, '0830', '646000', '中国,四川省,泸州市', 105.44300079345703, 28.88909912109375, 'Luzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2403, '510502', '江阳区', '510500', '江阳', 3, '0830', '646000', '中国,四川省,泸州市,江阳区', 105.4530029296875, 28.889299392700195, 'Jiangyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2404, '510503', '纳溪区', '510500', '纳溪', 3, '0830', '646300', '中国,四川省,泸州市,纳溪区', 105.37300109863281, 28.773399353027344, 'Naxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2405, '510504', '龙马潭区', '510500', '龙马潭', 3, '0830', '646000', '中国,四川省,泸州市,龙马潭区', 105.43800354003906, 28.91309928894043, 'Longmatan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2406, '510521', '泸县', '510500', '泸县', 3, '0830', '646106', '中国,四川省,泸州市,泸县', 105.38200378417969, 29.150400161743164, 'Luxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2407, '510522', '合江县', '510500', '合江', 3, '0830', '646200', '中国,四川省,泸州市,合江县', 105.83499908447266, 28.809999465942383, 'Hejiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2408, '510524', '叙永县', '510500', '叙永', 3, '0830', '646400', '中国,四川省,泸州市,叙永县', 105.44499969482422, 28.155899047851562, 'Xuyong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2409, '510525', '古蔺县', '510500', '古蔺', 3, '0830', '646500', '中国,四川省,泸州市,古蔺县', 105.81300354003906, 28.038700103759766, 'Gulin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2410, '510600', '德阳市', '510000', '德阳', 2, '0838', '618000', '中国,四川省,德阳市', 104.39900207519531, 31.128000259399414, 'Deyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2411, '510603', '旌阳区', '510600', '旌阳', 3, '0838', '618000', '中国,四川省,德阳市,旌阳区', 104.39399719238281, 31.13909912109375, 'Jingyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2412, '510623', '中江县', '510600', '中江', 3, '0838', '618100', '中国,四川省,德阳市,中江县', 104.67900085449219, 31.033000946044922, 'Zhongjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2413, '510626', '罗江县', '510600', '罗江', 3, '0838', '618500', '中国,四川省,德阳市,罗江县', 104.51000213623047, 31.316699981689453, 'Luojiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2414, '510681', '广汉市', '510600', '广汉', 3, '0838', '618300', '中国,四川省,德阳市,广汉市', 104.28199768066406, 30.976900100708008, 'Guanghan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2415, '510682', '什邡市', '510600', '什邡', 3, '0838', '618400', '中国,四川省,德阳市,什邡市', 104.16799926757812, 31.126399993896484, 'Shifang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2416, '510683', '绵竹市', '510600', '绵竹', 3, '0838', '618200', '中国,四川省,德阳市,绵竹市', 104.22100067138672, 31.33769989013672, 'Mianzhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2417, '510700', '绵阳市', '510000', '绵阳', 2, '0816', '621000', '中国,四川省,绵阳市', 104.74199676513672, 31.464000701904297, 'Mianyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2418, '510703', '涪城区', '510700', '涪城', 3, '0816', '621000', '中国,四川省,绵阳市,涪城区', 104.75700378417969, 31.4552001953125, 'Fucheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2419, '510704', '游仙区', '510700', '游仙', 3, '0816', '621022', '中国,四川省,绵阳市,游仙区', 104.77100372314453, 31.465700149536133, 'Youxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2420, '510722', '三台县', '510700', '三台', 3, '0816', '621100', '中国,四川省,绵阳市,三台县', 105.09100341796875, 31.091800689697266, 'Santai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2421, '510723', '盐亭县', '510700', '盐亭', 3, '0816', '621600', '中国,四川省,绵阳市,盐亭县', 105.38999938964844, 31.221799850463867, 'Yanting'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2422, '510724', '安县', '510700', '安县', 3, '0816', '622650', '中国,四川省,绵阳市,安县', 104.56700134277344, 31.534900665283203, 'Anxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2423, '510725', '梓潼县', '510700', '梓潼', 3, '0816', '622150', '中国,四川省,绵阳市,梓潼县', 105.16200256347656, 31.635900497436523, 'Zitong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2424, '510726', '北川羌族自治县', '510700', '北川', 3, '0816', '622750', '中国,四川省,绵阳市,北川羌族自治县', 104.46399688720703, 31.83289909362793, 'Beichuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2425, '510727', '平武县', '510700', '平武', 3, '0816', '622550', '中国,四川省,绵阳市,平武县', 104.52899932861328, 32.407901763916016, 'Pingwu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2426, '510781', '江油市', '510700', '江油', 3, '0816', '621700', '中国,四川省,绵阳市,江油市', 104.74500274658203, 31.777799606323242, 'Jiangyou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2427, '510800', '广元市', '510000', '广元', 2, '0839', '628000', '中国,四川省,广元市', 105.83000183105469, 32.43370056152344, 'Guangyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2428, '510802', '利州区', '510800', '利州', 3, '0839', '628017', '中国,四川省,广元市,利州区', 105.82599639892578, 32.43230056762695, 'Lizhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2429, '510811', '昭化区', '510800', '昭化', 3, '0839', '628017', '中国,四川省,广元市,昭化区', 105.63999938964844, 32.38650131225586, 'Zhaohua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2430, '510812', '朝天区', '510800', '朝天', 3, '0839', '628017', '中国,四川省,广元市,朝天区', 105.89299774169922, 32.64400100708008, 'Chaotian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2431, '510821', '旺苍县', '510800', '旺苍', 3, '0839', '628200', '中国,四川省,广元市,旺苍县', 106.29000091552734, 32.22850036621094, 'Wangcang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2432, '510822', '青川县', '510800', '青川', 3, '0839', '628100', '中国,四川省,广元市,青川县', 105.23899841308594, 32.585601806640625, 'Qingchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2433, '510823', '剑阁县', '510800', '剑阁', 3, '0839', '628300', '中国,四川省,广元市,剑阁县', 105.5250015258789, 32.28839874267578, 'Jiange'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2434, '510824', '苍溪县', '510800', '苍溪', 3, '0839', '628400', '中国,四川省,广元市,苍溪县', 105.93599700927734, 31.732099533081055, 'Cangxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2435, '510900', '遂宁市', '510000', '遂宁', 2, '0825', '629000', '中国,四川省,遂宁市', 105.57099914550781, 30.5132999420166, 'Suining'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2436, '510903', '船山区', '510900', '船山', 3, '0825', '629000', '中国,四川省,遂宁市,船山区', 105.58100128173828, 30.499900817871094, 'Chuanshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2437, '510904', '安居区', '510900', '安居', 3, '0825', '629000', '中国,四川省,遂宁市,安居区', 105.46399688720703, 30.357799530029297, 'Anju'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2438, '510921', '蓬溪县', '510900', '蓬溪', 3, '0825', '629100', '中国,四川省,遂宁市,蓬溪县', 105.70800018310547, 30.757699966430664, 'Pengxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2439, '510922', '射洪县', '510900', '射洪', 3, '0825', '629200', '中国,四川省,遂宁市,射洪县', 105.38899993896484, 30.871999740600586, 'Shehong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2440, '510923', '大英县', '510900', '大英', 3, '0825', '629300', '中国,四川省,遂宁市,大英县', 105.24299621582031, 30.59429931640625, 'Daying'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2441, '511000', '内江市', '510000', '内江', 2, '0832', '641000', '中国,四川省,内江市', 105.06600189208984, 29.587099075317383, 'Neijiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2442, '511002', '市中区', '511000', '市中区', 3, '0832', '641000', '中国,四川省,内江市,市中区', 105.06800079345703, 29.587099075317383, 'Shizhongqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2443, '511011', '东兴区', '511000', '东兴', 3, '0832', '641100', '中国,四川省,内江市,东兴区', 105.07599639892578, 29.59280014038086, 'Dongxing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2444, '511024', '威远县', '511000', '威远', 3, '0832', '642450', '中国,四川省,内江市,威远县', 104.66999816894531, 29.528200149536133, 'Weiyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2445, '511025', '资中县', '511000', '资中', 3, '0832', '641200', '中国,四川省,内江市,资中县', 104.85199737548828, 29.76409912109375, 'Zizhong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2446, '511028', '隆昌县', '511000', '隆昌', 3, '0832', '642150', '中国,四川省,内江市,隆昌县', 105.28700256347656, 29.339399337768555, 'Longchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2447, '511100', '乐山市', '510000', '乐山', 2, '0833', '614000', '中国,四川省,乐山市', 103.76100158691406, 29.582000732421875, 'Leshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2448, '511102', '市中区', '511100', '市中区', 3, '0833', '614000', '中国,四川省,乐山市,市中区', 103.76200103759766, 29.555400848388672, 'Shizhongqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2449, '511111', '沙湾区', '511100', '沙湾', 3, '0833', '614900', '中国,四川省,乐山市,沙湾区', 103.54900360107422, 29.41189956665039, 'Shawan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2450, '511112', '五通桥区', '511100', '五通桥', 3, '0833', '614800', '中国,四川省,乐山市,五通桥区', 103.822998046875, 29.403400421142578, 'Wutongqiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2451, '511113', '金口河区', '511100', '金口河', 3, '0833', '614700', '中国,四川省,乐山市,金口河区', 103.0790023803711, 29.245800018310547, 'Jinkouhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2452, '511123', '犍为县', '511100', '犍为', 3, '0833', '614400', '中国,四川省,乐山市,犍为县', 103.94999694824219, 29.209699630737305, 'Qianwei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2453, '511124', '井研县', '511100', '井研', 3, '0833', '613100', '中国,四川省,乐山市,井研县', 104.06999969482422, 29.652299880981445, 'Jingyan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2454, '511126', '夹江县', '511100', '夹江', 3, '0833', '614100', '中国,四川省,乐山市,夹江县', 103.5719985961914, 29.73870086669922, 'Jiajiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2455, '511129', '沐川县', '511100', '沐川', 3, '0833', '614500', '中国,四川省,乐山市,沐川县', 103.90399932861328, 28.956499099731445, 'Muchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2456, '511132', '峨边彝族自治县', '511100', '峨边', 3, '0833', '614300', '中国,四川省,乐山市,峨边彝族自治县', 103.26300048828125, 29.229999542236328, 'Ebian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2457, '511133', '马边彝族自治县', '511100', '马边', 3, '0833', '614600', '中国,四川省,乐山市,马边彝族自治县', 103.5459976196289, 28.835899353027344, 'Mabian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2458, '511181', '峨眉山市', '511100', '峨眉山', 3, '0833', '614200', '中国,四川省,乐山市,峨眉山市', 103.48400115966797, 29.601200103759766, 'Emeishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2459, '511300', '南充市', '510000', '南充', 2, '0817', '637000', '中国,四川省,南充市', 106.08300018310547, 30.795299530029297, 'Nanchong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2460, '511302', '顺庆区', '511300', '顺庆', 3, '0817', '637000', '中国,四川省,南充市,顺庆区', 106.09200286865234, 30.79640007019043, 'Shunqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2461, '511303', '高坪区', '511300', '高坪', 3, '0817', '637100', '中国,四川省,南充市,高坪区', 106.11900329589844, 30.781600952148438, 'Gaoping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2462, '511304', '嘉陵区', '511300', '嘉陵', 3, '0817', '637100', '中国,四川省,南充市,嘉陵区', 106.07099914550781, 30.758499145507812, 'Jialing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2463, '511321', '南部县', '511300', '南部', 3, '0817', '637300', '中国,四川省,南充市,南部县', 106.06700134277344, 31.35449981689453, 'Nanbu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2464, '511322', '营山县', '511300', '营山', 3, '0817', '637700', '中国,四川省,南充市,营山县', 106.56600189208984, 31.077499389648438, 'Yingshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2465, '511323', '蓬安县', '511300', '蓬安', 3, '0817', '637800', '中国,四川省,南充市,蓬安县', 106.41300201416016, 31.029600143432617, 'Peng\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2466, '511324', '仪陇县', '511300', '仪陇', 3, '0817', '637600', '中国,四川省,南充市,仪陇县', 106.30000305175781, 31.27630043029785, 'Yilong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2467, '511325', '西充县', '511300', '西充', 3, '0817', '637200', '中国,四川省,南充市,西充县', 105.9000015258789, 30.99690055847168, 'Xichong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2468, '511381', '阆中市', '511300', '阆中', 3, '0817', '637400', '中国,四川省,南充市,阆中市', 106.00499725341797, 31.558300018310547, 'Langzhong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2469, '511400', '眉山市', '510000', '眉山', 2, '028', '620020', '中国,四川省,眉山市', 103.83200073242188, 30.04829978942871, 'Meishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2470, '511402', '东坡区', '511400', '东坡', 3, '028', '620010', '中国,四川省,眉山市,东坡区', 103.83200073242188, 30.042200088500977, 'Dongpo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2471, '511403', '彭山区', '511400', '彭山', 3, '028', '620860', '中国,四川省,眉山市,彭山区', 103.87300109863281, 30.192800521850586, 'Pengshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2472, '511421', '仁寿县', '511400', '仁寿', 3, '028', '620500', '中国,四川省,眉山市,仁寿县', 104.13400268554688, 29.996000289916992, 'Renshou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2473, '511423', '洪雅县', '511400', '洪雅', 3, '028', '620360', '中国,四川省,眉山市,洪雅县', 103.37300109863281, 29.906600952148438, 'Hongya'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2474, '511424', '丹棱县', '511400', '丹棱', 3, '028', '620200', '中国,四川省,眉山市,丹棱县', 103.51300048828125, 30.015600204467773, 'Danling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2475, '511425', '青神县', '511400', '青神', 3, '028', '620460', '中国,四川省,眉山市,青神县', 103.8479995727539, 29.832300186157227, 'Qingshen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2476, '511500', '宜宾市', '510000', '宜宾', 2, '0831', '644000', '中国,四川省,宜宾市', 104.63099670410156, 28.76020050048828, 'Yibin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2477, '511502', '翠屏区', '511500', '翠屏', 3, '0831', '644000', '中国,四川省,宜宾市,翠屏区', 104.62000274658203, 28.76569938659668, 'Cuiping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2478, '511503', '南溪区', '511500', '南溪', 3, '0831', '644100', '中国,四川省,宜宾市,南溪区', 104.98100280761719, 28.839799880981445, 'Nanxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2479, '511521', '宜宾县', '511500', '宜宾', 3, '0831', '644600', '中国,四川省,宜宾市,宜宾县', 104.53299713134766, 28.690000534057617, 'Yibin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2480, '511523', '江安县', '511500', '江安', 3, '0831', '644200', '中国,四川省,宜宾市,江安县', 105.06700134277344, 28.723899841308594, 'Jiang\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2481, '511524', '长宁县', '511500', '长宁', 3, '0831', '644300', '中国,四川省,宜宾市,长宁县', 104.92500305175781, 28.577800750732422, 'Changning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2482, '511525', '高县', '511500', '高县', 3, '0831', '645150', '中国,四川省,宜宾市,高县', 104.51799774169922, 28.436199188232422, 'Gaoxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2483, '511526', '珙县', '511500', '珙县', 3, '0831', '644500', '中国,四川省,宜宾市,珙县', 104.71399688720703, 28.445100784301758, 'Gongxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2484, '511527', '筠连县', '511500', '筠连', 3, '0831', '645250', '中国,四川省,宜宾市,筠连县', 104.51200103759766, 28.164899826049805, 'Junlian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2485, '511528', '兴文县', '511500', '兴文', 3, '0831', '644400', '中国,四川省,宜宾市,兴文县', 105.23699951171875, 28.304399490356445, 'Xingwen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2486, '511529', '屏山县', '511500', '屏山', 3, '0831', '645350', '中国,四川省,宜宾市,屏山县', 104.16300201416016, 28.643699645996094, 'Pingshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2487, '511600', '广安市', '510000', '广安', 2, '0826', '638000', '中国,四川省,广安市', 106.63300323486328, 30.45639991760254, 'Guang\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2488, '511602', '广安区', '511600', '广安', 3, '0826', '638000', '中国,四川省,广安市,广安区', 106.64199829101562, 30.473899841308594, 'Guang\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2489, '511603', '前锋区', '511600', '前锋', 3, '0826', '638019', '中国,四川省,广安市,前锋区', 106.89399719238281, 30.494600296020508, 'Qianfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2490, '511621', '岳池县', '511600', '岳池', 3, '0826', '638300', '中国,四川省,广安市,岳池县', 106.44100189208984, 30.539199829101562, 'Yuechi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2491, '511622', '武胜县', '511600', '武胜', 3, '0826', '638400', '中国,四川省,广安市,武胜县', 106.2959976196289, 30.349300384521484, 'Wusheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2492, '511623', '邻水县', '511600', '邻水', 3, '0826', '638500', '中国,四川省,广安市,邻水县', 106.93000030517578, 30.33449935913086, 'Linshui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2493, '511681', '华蓥市', '511600', '华蓥', 3, '0826', '638600', '中国,四川省,广安市,华蓥市', 106.78500366210938, 30.390100479125977, 'Huaying'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2494, '511700', '达州市', '510000', '达州', 2, '0818', '635000', '中国,四川省,达州市', 107.50199890136719, 31.20949935913086, 'Dazhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2495, '511702', '通川区', '511700', '通川', 3, '0818', '635000', '中国,四川省,达州市,通川区', 107.50499725341797, 31.21470069885254, 'Tongchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2496, '511703', '达川区', '511700', '达川', 3, '0818', '635000', '中国,四川省,达州市,达川区', 107.50199890136719, 31.20949935913086, 'Dachuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2497, '511722', '宣汉县', '511700', '宣汉', 3, '0818', '636150', '中国,四川省,达州市,宣汉县', 107.72799682617188, 31.355199813842773, 'Xuanhan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2498, '511723', '开江县', '511700', '开江', 3, '0818', '636250', '中国,四川省,达州市,开江县', 107.86900329589844, 31.0841007232666, 'Kaijiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2499, '511724', '大竹县', '511700', '大竹', 3, '0818', '635100', '中国,四川省,达州市,大竹县', 107.20899963378906, 30.741500854492188, 'Dazhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2500, '511725', '渠县', '511700', '渠县', 3, '0818', '635200', '中国,四川省,达州市,渠县', 106.9739990234375, 30.837600708007812, 'Quxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2501, '511781', '万源市', '511700', '万源', 3, '0818', '636350', '中国,四川省,达州市,万源市', 108.03600311279297, 32.08089828491211, 'Wanyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2502, '511800', '雅安市', '510000', '雅安', 2, '0835', '625000', '中国,四川省,雅安市', 103.0009994506836, 29.987699508666992, 'Ya\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2503, '511802', '雨城区', '511800', '雨城', 3, '0835', '625000', '中国,四川省,雅安市,雨城区', 103.03299713134766, 30.005300521850586, 'Yucheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2504, '511803', '名山区', '511800', '名山', 3, '0835', '625100', '中国,四川省,雅安市,名山区', 103.11199951171875, 30.084699630737305, 'Mingshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2505, '511822', '荥经县', '511800', '荥经', 3, '0835', '625200', '中国,四川省,雅安市,荥经县', 102.84700012207031, 29.79400062561035, 'Yingjing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2506, '511823', '汉源县', '511800', '汉源', 3, '0835', '625300', '中国,四川省,雅安市,汉源县', 102.6780014038086, 29.351699829101562, 'Hanyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2507, '511824', '石棉县', '511800', '石棉', 3, '0835', '625400', '中国,四川省,雅安市,石棉县', 102.35900115966797, 29.22800064086914, 'Shimian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2508, '511825', '天全县', '511800', '天全', 3, '0835', '625500', '中国,四川省,雅安市,天全县', 102.75900268554688, 30.0674991607666, 'Tianquan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2509, '511826', '芦山县', '511800', '芦山', 3, '0835', '625600', '中国,四川省,雅安市,芦山县', 102.9280014038086, 30.143699645996094, 'Lushan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2510, '511827', '宝兴县', '511800', '宝兴', 3, '0835', '625700', '中国,四川省,雅安市,宝兴县', 102.81600189208984, 30.36840057373047, 'Baoxing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2511, '511900', '巴中市', '510000', '巴中', 2, '0827', '636000', '中国,四川省,巴中市', 106.75399780273438, 31.858800888061523, 'Bazhong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2512, '511902', '巴州区', '511900', '巴州', 3, '0827', '636001', '中国,四川省,巴中市,巴州区', 106.76899719238281, 31.851200103759766, 'Bazhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2513, '511903', '恩阳区', '511900', '恩阳', 3, '0827', '636064', '中国,四川省,巴中市,恩阳区', 106.75399780273438, 31.858800888061523, 'Enyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2514, '511921', '通江县', '511900', '通江', 3, '0827', '636700', '中国,四川省,巴中市,通江县', 107.24400329589844, 31.912900924682617, 'Tongjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2515, '511922', '南江县', '511900', '南江', 3, '0827', '636600', '中国,四川省,巴中市,南江县', 106.84200286865234, 32.35340118408203, 'Nanjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2516, '511923', '平昌县', '511900', '平昌', 3, '0827', '636400', '中国,四川省,巴中市,平昌县', 107.10399627685547, 31.55940055847168, 'Pingchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2517, '512000', '资阳市', '510000', '资阳', 2, '028', '641300', '中国,四川省,资阳市', 104.64199829101562, 30.12220001220703, 'Ziyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2518, '512002', '雁江区', '512000', '雁江', 3, '028', '641300', '中国,四川省,资阳市,雁江区', 104.6520004272461, 30.11520004272461, 'Yanjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2519, '512021', '安岳县', '512000', '安岳', 3, '028', '642350', '中国,四川省,资阳市,安岳县', 105.33599853515625, 30.097900390625, 'Anyue'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2520, '512022', '乐至县', '512000', '乐至', 3, '028', '641500', '中国,四川省,资阳市,乐至县', 105.03199768066406, 30.272300720214844, 'Lezhi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2521, '512081', '简阳市', '512000', '简阳', 3, '028', '641400', '中国,四川省,资阳市,简阳市', 104.54900360107422, 30.390399932861328, 'Jianyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2522, '513200', '阿坝藏族羌族自治州', '510000', '阿坝', 2, '0837', '624000', '中国,四川省,阿坝藏族羌族自治州', 102.22100067138672, 31.899799346923828, 'Aba'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2523, '513221', '汶川县', '513200', '汶川', 3, '0837', '623000', '中国,四川省,阿坝藏族羌族自治州,汶川县', 103.59100341796875, 31.47330093383789, 'Wenchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2524, '513222', '理县', '513200', '理县', 3, '0837', '623100', '中国,四川省,阿坝藏族羌族自治州,理县', 103.1719970703125, 31.43600082397461, 'Lixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2525, '513223', '茂县', '513200', '茂县', 3, '0837', '623200', '中国,四川省,阿坝藏族羌族自治州,茂县', 103.85399627685547, 31.68199920654297, 'Maoxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2526, '513224', '松潘县', '513200', '松潘', 3, '0837', '623300', '中国,四川省,阿坝藏族羌族自治州,松潘县', 103.5989990234375, 32.63869857788086, 'Songpan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2527, '513225', '九寨沟县', '513200', '九寨沟', 3, '0837', '623400', '中国,四川省,阿坝藏族羌族自治州,九寨沟县', 104.23699951171875, 33.26319885253906, 'Jiuzhaigou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2528, '513226', '金川县', '513200', '金川', 3, '0837', '624100', '中国,四川省,阿坝藏族羌族自治州,金川县', 102.06600189208984, 31.476200103759766, 'Jinchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2529, '513227', '小金县', '513200', '小金', 3, '0837', '624200', '中国,四川省,阿坝藏族羌族自治州,小金县', 102.36499786376953, 30.999300003051758, 'Xiaojin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2530, '513228', '黑水县', '513200', '黑水', 3, '0837', '623500', '中国,四川省,阿坝藏族羌族自治州,黑水县', 102.99199676513672, 32.061798095703125, 'Heishui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2531, '513229', '马尔康县', '513200', '马尔康', 3, '0837', '624000', '中国,四川省,阿坝藏族羌族自治州,马尔康县', 102.20600128173828, 31.905799865722656, 'Maerkang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2532, '513230', '壤塘县', '513200', '壤塘', 3, '0837', '624300', '中国,四川省,阿坝藏族羌族自治州,壤塘县', 100.97799682617188, 32.26580047607422, 'Rangtang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2533, '513231', '阿坝县', '513200', '阿坝', 3, '0837', '624600', '中国,四川省,阿坝藏族羌族自治州,阿坝县', 101.70600128173828, 32.90299987792969, 'Aba'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2534, '513232', '若尔盖县', '513200', '若尔盖', 3, '0837', '624500', '中国,四川省,阿坝藏族羌族自治州,若尔盖县', 102.95999908447266, 33.57429885864258, 'Ruoergai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2535, '513233', '红原县', '513200', '红原', 3, '0837', '624400', '中国,四川省,阿坝藏族羌族自治州,红原县', 102.54499816894531, 32.78990173339844, 'Hongyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2536, '513300', '甘孜藏族自治州', '510000', '甘孜', 2, '0836', '626000', '中国,四川省,甘孜藏族自治州', 101.96399688720703, 30.05069923400879, 'Garze'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2537, '513321', '康定县', '513300', '康定', 3, '0836', '626000', '中国,四川省,甘孜藏族自治州,康定县', 101.96499633789062, 30.055299758911133, 'Kangding'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2538, '513322', '泸定县', '513300', '泸定', 3, '0836', '626100', '中国,四川省,甘孜藏族自治州,泸定县', 102.23500061035156, 29.91469955444336, 'Luding'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2539, '513323', '丹巴县', '513300', '丹巴', 3, '0836', '626300', '中国,四川省,甘孜藏族自治州,丹巴县', 101.88400268554688, 30.87660026550293, 'Danba'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2540, '513324', '九龙县', '513300', '九龙', 3, '0836', '626200', '中国,四川省,甘孜藏族自治州,九龙县', 101.50800323486328, 29.000900268554688, 'Jiulong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2541, '513325', '雅江县', '513300', '雅江', 3, '0836', '627450', '中国,四川省,甘孜藏族自治州,雅江县', 101.01499938964844, 30.032800674438477, 'Yajiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2542, '513326', '道孚县', '513300', '道孚', 3, '0836', '626400', '中国,四川省,甘孜藏族自治州,道孚县', 101.1259994506836, 30.980499267578125, 'Daofu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2543, '513327', '炉霍县', '513300', '炉霍', 3, '0836', '626500', '中国,四川省,甘孜藏族自治州,炉霍县', 100.677001953125, 31.391700744628906, 'Luhuo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2544, '513328', '甘孜县', '513300', '甘孜', 3, '0836', '626700', '中国,四川省,甘孜藏族自治州,甘孜县', 99.99310302734375, 31.626699447631836, 'Ganzi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2545, '513329', '新龙县', '513300', '新龙', 3, '0836', '626800', '中国,四川省,甘孜藏族自治州,新龙县', 100.31199645996094, 30.94070053100586, 'Xinlong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2546, '513330', '德格县', '513300', '德格', 3, '0836', '627250', '中国,四川省,甘孜藏族自治州,德格县', 98.58080291748047, 31.80620002746582, 'Dege'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2547, '513331', '白玉县', '513300', '白玉', 3, '0836', '627150', '中国,四川省,甘孜藏族自治州,白玉县', 98.82569885253906, 31.208999633789062, 'Baiyu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2548, '513332', '石渠县', '513300', '石渠', 3, '0836', '627350', '中国,四川省,甘孜藏族自治州,石渠县', 98.10160064697266, 32.97880172729492, 'Shiqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2549, '513333', '色达县', '513300', '色达', 3, '0836', '626600', '中国,四川省,甘孜藏族自治州,色达县', 100.33200073242188, 32.26839828491211, 'Seda'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2550, '513334', '理塘县', '513300', '理塘', 3, '0836', '627550', '中国,四川省,甘孜藏族自治州,理塘县', 100.2699966430664, 29.996700286865234, 'Litang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2551, '513335', '巴塘县', '513300', '巴塘', 3, '0836', '627650', '中国,四川省,甘孜藏族自治州,巴塘县', 99.1041030883789, 30.004199981689453, 'Batang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2552, '513336', '乡城县', '513300', '乡城', 3, '0836', '627850', '中国,四川省,甘孜藏族自治州,乡城县', 99.79940032958984, 28.93549919128418, 'Xiangcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2553, '513337', '稻城县', '513300', '稻城', 3, '0836', '627750', '中国,四川省,甘孜藏族自治州,稻城县', 100.2979965209961, 29.037900924682617, 'Daocheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2554, '513338', '得荣县', '513300', '得荣', 3, '0836', '627950', '中国,四川省,甘孜藏族自治州,得荣县', 99.28630065917969, 28.71299934387207, 'Derong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2555, '513400', '凉山彝族自治州', '510000', '凉山', 2, '0834', '615000', '中国,四川省,凉山彝族自治州', 102.25900268554688, 27.88680076599121, 'Liangshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2556, '513401', '西昌市', '513400', '西昌', 3, '0835', '615000', '中国,四川省,凉山彝族自治州,西昌市', 102.26399993896484, 27.895200729370117, 'Xichang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2557, '513422', '木里藏族自治县', '513400', '木里', 3, '0851', '615800', '中国,四川省,凉山彝族自治州,木里藏族自治县', 101.27999877929688, 27.928699493408203, 'Muli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2558, '513423', '盐源县', '513400', '盐源', 3, '0836', '615700', '中国,四川省,凉山彝族自治州,盐源县', 101.51000213623047, 27.42180061340332, 'Yanyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2559, '513424', '德昌县', '513400', '德昌', 3, '0837', '615500', '中国,四川省,凉山彝族自治州,德昌县', 102.18000030517578, 27.404800415039062, 'Dechang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2560, '513425', '会理县', '513400', '会理', 3, '0838', '615100', '中国,四川省,凉山彝族自治州,会理县', 102.24500274658203, 26.656299591064453, 'Huili'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2561, '513426', '会东县', '513400', '会东', 3, '0839', '615200', '中国,四川省,凉山彝族自治州,会东县', 102.5780029296875, 26.634300231933594, 'Huidong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2562, '513427', '宁南县', '513400', '宁南', 3, '0840', '615400', '中国,四川省,凉山彝族自治州,宁南县', 102.76100158691406, 27.06570053100586, 'Ningnan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2563, '513428', '普格县', '513400', '普格', 3, '0841', '615300', '中国,四川省,凉山彝族自治州,普格县', 102.54100036621094, 27.374799728393555, 'Puge'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2564, '513429', '布拖县', '513400', '布拖', 3, '0842', '616350', '中国,四川省,凉山彝族自治州,布拖县', 102.81199645996094, 27.70789909362793, 'Butuo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2565, '513430', '金阳县', '513400', '金阳', 3, '0843', '616250', '中国,四川省,凉山彝族自治州,金阳县', 103.24800109863281, 27.69700050354004, 'Jinyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2566, '513431', '昭觉县', '513400', '昭觉', 3, '0844', '616150', '中国,四川省,凉山彝族自治州,昭觉县', 102.84700012207031, 28.011600494384766, 'Zhaojue'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2567, '513432', '喜德县', '513400', '喜德', 3, '0845', '616750', '中国,四川省,凉山彝族自治州,喜德县', 102.41300201416016, 28.30739974975586, 'Xide'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2568, '513433', '冕宁县', '513400', '冕宁', 3, '0846', '615600', '中国,四川省,凉山彝族自治州,冕宁县', 102.1709976196289, 28.551599502563477, 'Mianning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2569, '513434', '越西县', '513400', '越西', 3, '0847', '616650', '中国,四川省,凉山彝族自治州,越西县', 102.50800323486328, 28.641300201416016, 'Yuexi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2570, '513435', '甘洛县', '513400', '甘洛', 3, '0848', '616850', '中国,四川省,凉山彝族自治州,甘洛县', 102.77200317382812, 28.96619987487793, 'Ganluo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2571, '513436', '美姑县', '513400', '美姑', 3, '0849', '616450', '中国,四川省,凉山彝族自治州,美姑县', 103.13099670410156, 28.326000213623047, 'Meigu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2572, '513437', '雷波县', '513400', '雷波', 3, '0850', '616550', '中国,四川省,凉山彝族自治州,雷波县', 103.572998046875, 28.26409912109375, 'Leibo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2573, '520000', '贵州省', '100000', '贵州', 1, '', '1', '中国,贵州省', 106.71299743652344, 26.57830047607422, 'Guizhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2574, '520100', '贵阳市', '520000', '贵阳', 2, '0851', '550001', '中国,贵州省,贵阳市', 106.71299743652344, 26.57830047607422, 'Guiyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2575, '520102', '南明区', '520100', '南明', 3, '0851', '550001', '中国,贵州省,贵阳市,南明区', 106.71499633789062, 26.568199157714844, 'Nanming'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2576, '520103', '云岩区', '520100', '云岩', 3, '0851', '550001', '中国,贵州省,贵阳市,云岩区', 106.7249984741211, 26.604799270629883, 'Yunyan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2577, '520111', '花溪区', '520100', '花溪', 3, '0851', '550025', '中国,贵州省,贵阳市,花溪区', 106.677001953125, 26.433399200439453, 'Huaxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2578, '520112', '乌当区', '520100', '乌当', 3, '0851', '550018', '中国,贵州省,贵阳市,乌当区', 106.75199890136719, 26.630199432373047, 'Wudang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2579, '520113', '白云区', '520100', '白云', 3, '0851', '550014', '中国,贵州省,贵阳市,白云区', 106.63099670410156, 26.68280029296875, 'Baiyun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2580, '520115', '观山湖区', '520100', '观山湖', 3, '0851', '550009', '中国,贵州省,贵阳市,观山湖区', 106.625, 26.618200302124023, 'Guanshanhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2581, '520121', '开阳县', '520100', '开阳', 3, '0851', '550300', '中国,贵州省,贵阳市,开阳县', 106.96900177001953, 27.055299758911133, 'Kaiyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2582, '520122', '息烽县', '520100', '息烽', 3, '0851', '551100', '中国,贵州省,贵阳市,息烽县', 106.73799896240234, 27.0935001373291, 'Xifeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2583, '520123', '修文县', '520100', '修文', 3, '0851', '550200', '中国,贵州省,贵阳市,修文县', 106.59500122070312, 26.837799072265625, 'Xiuwen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2584, '520181', '清镇市', '520100', '清镇', 3, '0851', '551400', '中国,贵州省,贵阳市,清镇市', 106.46900177001953, 26.552600860595703, 'Qingzhen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2585, '520200', '六盘水市', '520000', '六盘水', 2, '0858', '553400', '中国,贵州省,六盘水市', 104.84700012207031, 26.5846004486084, 'Liupanshui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2586, '520201', '钟山区', '520200', '钟山', 3, '0858', '553000', '中国,贵州省,六盘水市,钟山区', 104.87799835205078, 26.57699966430664, 'Zhongshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2587, '520203', '六枝特区', '520200', '六枝', 3, '0858', '553400', '中国,贵州省,六盘水市,六枝特区', 105.48100280761719, 26.201200485229492, 'Liuzhi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2588, '520221', '水城县', '520200', '水城', 3, '0858', '553000', '中国,贵州省,六盘水市,水城县', 104.95800018310547, 26.547800064086914, 'Shuicheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2589, '520222', '盘县', '520200', '盘县', 3, '0858', '561601', '中国,贵州省,六盘水市,盘县', 104.47100067138672, 25.713600158691406, 'Panxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2590, '520300', '遵义市', '520000', '遵义', 2, '0852', '563000', '中国,贵州省,遵义市', 106.93699645996094, 27.706600189208984, 'Zunyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2591, '520302', '红花岗区', '520300', '红花岗', 3, '0852', '563000', '中国,贵州省,遵义市,红花岗区', 106.89399719238281, 27.644699096679688, 'Honghuagang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2592, '520303', '汇川区', '520300', '汇川', 3, '0852', '563000', '中国,贵州省,遵义市,汇川区', 106.93900299072266, 27.706199645996094, 'Huichuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2593, '520321', '遵义县', '520300', '遵义', 3, '0852', '563100', '中国,贵州省,遵义市,遵义县', 106.83300018310547, 27.537700653076172, 'Zunyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2594, '520322', '桐梓县', '520300', '桐梓', 3, '0852', '563200', '中国,贵州省,遵义市,桐梓县', 106.82599639892578, 28.138099670410156, 'Tongzi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2595, '520323', '绥阳县', '520300', '绥阳', 3, '0852', '563300', '中国,贵州省,遵义市,绥阳县', 107.19100189208984, 27.94700050354004, 'Suiyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2596, '520324', '正安县', '520300', '正安', 3, '0852', '563400', '中国,贵州省,遵义市,正安县', 107.44400024414062, 28.55120086669922, 'Zheng\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2597, '520325', '道真仡佬族苗族自治县', '520300', '道真', 3, '0852', '563500', '中国,贵州省,遵义市,道真仡佬族苗族自治县', 107.61199951171875, 28.86400032043457, 'Daozhen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2598, '520326', '务川仡佬族苗族自治县', '520300', '务川', 3, '0852', '564300', '中国,贵州省,遵义市,务川仡佬族苗族自治县', 107.88899993896484, 28.522300720214844, 'Wuchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2599, '520327', '凤冈县', '520300', '凤冈', 3, '0852', '564200', '中国,贵州省,遵义市,凤冈县', 107.71700286865234, 27.954599380493164, 'Fenggang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2600, '520328', '湄潭县', '520300', '湄潭', 3, '0852', '564100', '中国,贵州省,遵义市,湄潭县', 107.48799896240234, 27.766799926757812, 'Meitan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2601, '520329', '余庆县', '520300', '余庆', 3, '0852', '564400', '中国,贵州省,遵义市,余庆县', 107.88800048828125, 27.225299835205078, 'Yuqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2602, '520330', '习水县', '520300', '习水', 3, '0852', '564600', '中国,贵州省,遵义市,习水县', 106.21299743652344, 28.319799423217773, 'Xishui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2603, '520381', '赤水市', '520300', '赤水', 3, '0852', '564700', '中国,贵州省,遵义市,赤水市', 105.697998046875, 28.58919906616211, 'Chishui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2604, '520382', '仁怀市', '520300', '仁怀', 3, '0852', '564500', '中国,贵州省,遵义市,仁怀市', 106.4020004272461, 27.792299270629883, 'Renhuai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2605, '520400', '安顺市', '520000', '安顺', 2, '0853', '561000', '中国,贵州省,安顺市', 105.93199920654297, 26.245500564575195, 'Anshun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2606, '520402', '西秀区', '520400', '西秀', 3, '0853', '561000', '中国,贵州省,安顺市,西秀区', 105.96600341796875, 26.24489974975586, 'Xixiu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2607, '520421', '平坝区', '520400', '平坝', 3, '0853', '561100', '中国,贵州省,安顺市,平坝区', 106.25700378417969, 26.405399322509766, 'Pingba'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2608, '520422', '普定县', '520400', '普定', 3, '0853', '562100', '中国,贵州省,安顺市,普定县', 105.74299621582031, 26.30139923095703, 'Puding'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2609, '520423', '镇宁布依族苗族自治县', '520400', '镇宁', 3, '0853', '561200', '中国,贵州省,安顺市,镇宁布依族苗族自治县', 105.76499938964844, 26.055299758911133, 'Zhenning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2610, '520424', '关岭布依族苗族自治县', '520400', '关岭', 3, '0853', '561300', '中国,贵州省,安顺市,关岭布依族苗族自治县', 105.61900329589844, 25.9424991607666, 'Guanling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2611, '520425', '紫云苗族布依族自治县', '520400', '紫云', 3, '0853', '550800', '中国,贵州省,安顺市,紫云苗族布依族自治县', 106.08399963378906, 25.752599716186523, 'Ziyun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2612, '520500', '毕节市', '520000', '毕节', 2, '0857', '551700', '中国,贵州省,毕节市', 105.28500366210938, 27.301700592041016, 'Bijie'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2613, '520502', '七星关区', '520500', '七星关', 3, '0857', '551700', '中国,贵州省,毕节市,七星关区', 104.94999694824219, 27.153600692749023, 'Qixingguan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2614, '520521', '大方县', '520500', '大方', 3, '0857', '551600', '中国,贵州省,毕节市,大方县', 105.60900115966797, 27.14349937438965, 'Dafang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2615, '520522', '黔西县', '520500', '黔西', 3, '0857', '551500', '中国,贵州省,毕节市,黔西县', 106.03800201416016, 27.024900436401367, 'Qianxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2616, '520523', '金沙县', '520500', '金沙', 3, '0857', '551800', '中国,贵州省,毕节市,金沙县', 106.22200012207031, 27.459699630737305, 'Jinsha'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2617, '520524', '织金县', '520500', '织金', 3, '0857', '552100', '中国,贵州省,毕节市,织金县', 105.76899719238281, 26.668500900268555, 'Zhijin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2618, '520525', '纳雍县', '520500', '纳雍', 3, '0857', '553300', '中国,贵州省,毕节市,纳雍县', 105.375, 26.769899368286133, 'Nayong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2619, '520526', '威宁彝族回族苗族自治县', '520500', '威宁', 3, '0857', '553100', '中国,贵州省,毕节市,威宁彝族回族苗族自治县', 104.28700256347656, 26.859100341796875, 'Weining'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2620, '520527', '赫章县', '520500', '赫章', 3, '0857', '553200', '中国,贵州省,毕节市,赫章县', 104.72599792480469, 27.119199752807617, 'Hezhang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2621, '520600', '铜仁市', '520000', '铜仁', 2, '0856', '554300', '中国,贵州省,铜仁市', 109.19200134277344, 27.718299865722656, 'Tongren'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2622, '520602', '碧江区', '520600', '碧江', 3, '0856', '554300', '中国,贵州省,铜仁市,碧江区', 109.19200134277344, 27.718299865722656, 'Bijiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2623, '520603', '万山区', '520600', '万山', 3, '0856', '554200', '中国,贵州省,铜仁市,万山区', 109.21199798583984, 27.518999099731445, 'Wanshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2624, '520621', '江口县', '520600', '江口', 3, '0856', '554400', '中国,贵州省,铜仁市,江口县', 108.8479995727539, 27.6919002532959, 'Jiangkou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2625, '520622', '玉屏侗族自治县', '520600', '玉屏', 3, '0856', '554004', '中国,贵州省,铜仁市,玉屏侗族自治县', 108.91799926757812, 27.238000869750977, 'Yuping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2626, '520623', '石阡县', '520600', '石阡', 3, '0856', '555100', '中国,贵州省,铜仁市,石阡县', 108.2300033569336, 27.519399642944336, 'Shiqian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2627, '520624', '思南县', '520600', '思南', 3, '0856', '565100', '中国,贵州省,铜仁市,思南县', 108.25599670410156, 27.941299438476562, 'Sinan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2628, '520625', '印江土家族苗族自治县', '520600', '印江', 3, '0856', '555200', '中国,贵州省,铜仁市,印江土家族苗族自治县', 108.40599822998047, 27.99799919128418, 'Yinjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2629, '520626', '德江县', '520600', '德江', 3, '0856', '565200', '中国,贵州省,铜仁市,德江县', 108.11699676513672, 28.260900497436523, 'Dejiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2630, '520627', '沿河土家族自治县', '520600', '沿河', 3, '0856', '565300', '中国,贵州省,铜仁市,沿河土家族自治县', 108.49600219726562, 28.56049919128418, 'Yuanhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2631, '520628', '松桃苗族自治县', '520600', '松桃', 3, '0856', '554100', '中国,贵州省,铜仁市,松桃苗族自治县', 109.2030029296875, 28.1653995513916, 'Songtao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2632, '522300', '黔西南布依族苗族自治州', '520000', '黔西南', 2, '0859', '562400', '中国,贵州省,黔西南布依族苗族自治州', 104.89800262451172, 25.08810043334961, 'Qianxinan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2633, '522301', '兴义市 ', '522300', '兴义', 3, '0859', '562400', '中国,贵州省,黔西南布依族苗族自治州,兴义市 ', 104.8949966430664, 25.092100143432617, 'Xingyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2634, '522322', '兴仁县', '522300', '兴仁', 3, '0859', '562300', '中国,贵州省,黔西南布依族苗族自治州,兴仁县', 105.18699645996094, 25.43280029296875, 'Xingren'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2635, '522323', '普安县', '522300', '普安', 3, '0859', '561500', '中国,贵州省,黔西南布依族苗族自治州,普安县', 104.95500183105469, 25.785999298095703, 'Pu\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2636, '522324', '晴隆县', '522300', '晴隆', 3, '0859', '561400', '中国,贵州省,黔西南布依族苗族自治州,晴隆县', 105.21900177001953, 25.8351993560791, 'Qinglong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2637, '522325', '贞丰县', '522300', '贞丰', 3, '0859', '562200', '中国,贵州省,黔西南布依族苗族自治州,贞丰县', 105.65499877929688, 25.384599685668945, 'Zhenfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2638, '522326', '望谟县', '522300', '望谟', 3, '0859', '552300', '中国,贵州省,黔西南布依族苗族自治州,望谟县', 106.0999984741211, 25.178199768066406, 'Wangmo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2639, '522327', '册亨县', '522300', '册亨', 3, '0859', '552200', '中国,贵州省,黔西南布依族苗族自治州,册亨县', 105.81199645996094, 24.983800888061523, 'Ceheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2640, '522328', '安龙县', '522300', '安龙', 3, '0859', '552400', '中国,贵州省,黔西南布依族苗族自治州,安龙县', 105.44300079345703, 25.09819984436035, 'Anlong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2641, '522600', '黔东南苗族侗族自治州', '520000', '黔东南', 2, '0855', '556000', '中国,贵州省,黔东南苗族侗族自治州', 107.97699737548828, 26.58340072631836, 'Qiandongnan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2642, '522601', '凯里市', '522600', '凯里', 3, '0855', '556000', '中国,贵州省,黔东南苗族侗族自治州,凯里市', 107.98100280761719, 26.5669002532959, 'Kaili'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2643, '522622', '黄平县', '522600', '黄平', 3, '0855', '556100', '中国,贵州省,黔东南苗族侗族自治州,黄平县', 107.9020004272461, 26.895700454711914, 'Huangping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2644, '522623', '施秉县', '522600', '施秉', 3, '0855', '556200', '中国,贵州省,黔东南苗族侗族自治州,施秉县', 108.1259994506836, 27.03499984741211, 'Shibing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2645, '522624', '三穗县', '522600', '三穗', 3, '0855', '556500', '中国,贵州省,黔东南苗族侗族自治州,三穗县', 108.6709976196289, 26.94770050048828, 'Sansui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2646, '522625', '镇远县', '522600', '镇远', 3, '0855', '557700', '中国,贵州省,黔东南苗族侗族自治州,镇远县', 108.427001953125, 27.049299240112305, 'Zhenyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2647, '522626', '岑巩县', '522600', '岑巩', 3, '0855', '557800', '中国,贵州省,黔东南苗族侗族自治州,岑巩县', 108.81900024414062, 27.175399780273438, 'Cengong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2648, '522627', '天柱县', '522600', '天柱', 3, '0855', '556600', '中国,贵州省,黔东南苗族侗族自治州,天柱县', 109.20700073242188, 26.907800674438477, 'Tianzhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2649, '522628', '锦屏县', '522600', '锦屏', 3, '0855', '556700', '中国,贵州省,黔东南苗族侗族自治州,锦屏县', 109.19999694824219, 26.676300048828125, 'Jinping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2650, '522629', '剑河县', '522600', '剑河', 3, '0855', '556400', '中国,贵州省,黔东南苗族侗族自治州,剑河县', 108.59100341796875, 26.65250015258789, 'Jianhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2651, '522630', '台江县', '522600', '台江', 3, '0855', '556300', '中国,贵州省,黔东南苗族侗族自治州,台江县', 108.31800079345703, 26.669200897216797, 'Taijiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2652, '522631', '黎平县', '522600', '黎平', 3, '0855', '557300', '中国,贵州省,黔东南苗族侗族自治州,黎平县', 109.13600158691406, 26.23110008239746, 'Liping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2653, '522632', '榕江县', '522600', '榕江', 3, '0855', '557200', '中国,贵州省,黔东南苗族侗族自治州,榕江县', 108.52100372314453, 25.9242000579834, 'Rongjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2654, '522633', '从江县', '522600', '从江', 3, '0855', '557400', '中国,贵州省,黔东南苗族侗族自治州,从江县', 108.90499877929688, 25.754199981689453, 'Congjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2655, '522634', '雷山县', '522600', '雷山', 3, '0855', '557100', '中国,贵州省,黔东南苗族侗族自治州,雷山县', 108.0770034790039, 26.383899688720703, 'Leishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2656, '522635', '麻江县', '522600', '麻江', 3, '0855', '557600', '中国,贵州省,黔东南苗族侗族自治州,麻江县', 107.59200286865234, 26.492300033569336, 'Majiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2657, '522636', '丹寨县', '522600', '丹寨', 3, '0855', '557500', '中国,贵州省,黔东南苗族侗族自治州,丹寨县', 107.7969970703125, 26.198200225830078, 'Danzhai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2658, '522700', '黔南布依族苗族自治州', '520000', '黔南', 2, '0854', '558000', '中国,贵州省,黔南布依族苗族自治州', 107.51699829101562, 26.25819969177246, 'Qiannan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2659, '522701', '都匀市', '522700', '都匀', 3, '0854', '558000', '中国,贵州省,黔南布依族苗族自治州,都匀市', 107.51899719238281, 26.2593994140625, 'Duyun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2660, '522702', '福泉市', '522700', '福泉', 3, '0854', '550500', '中国,贵州省,黔南布依族苗族自治州,福泉市', 107.51699829101562, 26.679899215698242, 'Fuquan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2661, '522722', '荔波县', '522700', '荔波', 3, '0854', '558400', '中国,贵州省,黔南布依族苗族自治州,荔波县', 107.88600158691406, 25.41390037536621, 'Libo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2662, '522723', '贵定县', '522700', '贵定', 3, '0854', '551300', '中国,贵州省,黔南布依族苗族自治州,贵定县', 107.23699951171875, 26.578100204467773, 'Guiding'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2663, '522725', '瓮安县', '522700', '瓮安', 3, '0854', '550400', '中国,贵州省,黔南布依族苗族自治州,瓮安县', 107.47599792480469, 27.068099975585938, 'Weng\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2664, '522726', '独山县', '522700', '独山', 3, '0854', '558200', '中国,贵州省,黔南布依族苗族自治州,独山县', 107.54100036621094, 25.824499130249023, 'Dushan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2665, '522727', '平塘县', '522700', '平塘', 3, '0854', '558300', '中国,贵州省,黔南布依族苗族自治州,平塘县', 107.3239974975586, 25.83289909362793, 'Pingtang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2666, '522728', '罗甸县', '522700', '罗甸', 3, '0854', '550100', '中国,贵州省,黔南布依族苗族自治州,罗甸县', 106.75199890136719, 25.425899505615234, 'Luodian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2667, '522729', '长顺县', '522700', '长顺', 3, '0854', '550700', '中国,贵州省,黔南布依族苗族自治州,长顺县', 106.4520034790039, 26.023000717163086, 'Changshun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2668, '522730', '龙里县', '522700', '龙里', 3, '0854', '551200', '中国,贵州省,黔南布依族苗族自治州,龙里县', 106.97699737548828, 26.4507999420166, 'Longli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2669, '522731', '惠水县', '522700', '惠水', 3, '0854', '550600', '中国,贵州省,黔南布依族苗族自治州,惠水县', 106.65899658203125, 26.133899688720703, 'Huishui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2670, '522732', '三都水族自治县', '522700', '三都', 3, '0854', '558100', '中国,贵州省,黔南布依族苗族自治州,三都水族自治县', 107.875, 25.985599517822266, 'Sandu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2671, '530000', '云南省', '100000', '云南', 1, '', '1', '中国,云南省', 102.71199798583984, 25.040599822998047, 'Yunnan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2672, '530100', '昆明市', '530000', '昆明', 2, '0871', '650500', '中国,云南省,昆明市', 102.71199798583984, 25.040599822998047, 'Kunming'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2673, '530102', '五华区', '530100', '五华', 3, '0871', '650021', '中国,云南省,昆明市,五华区', 102.70800018310547, 25.035200119018555, 'Wuhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2674, '530103', '盘龙区', '530100', '盘龙', 3, '0871', '650051', '中国,云南省,昆明市,盘龙区', 102.72000122070312, 25.04050064086914, 'Panlong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2675, '530111', '官渡区', '530100', '官渡', 3, '0871', '650200', '中国,云南省,昆明市,官渡区', 102.74400329589844, 25.014999389648438, 'Guandu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2676, '530112', '西山区', '530100', '西山', 3, '0871', '650118', '中国,云南省,昆明市,西山区', 102.66500091552734, 25.038000106811523, 'Xishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2677, '530113', '东川区', '530100', '东川', 3, '0871', '654100', '中国,云南省,昆明市,东川区', 103.18800354003906, 26.08300018310547, 'Dongchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2678, '530114', '呈贡区', '530100', '呈贡', 3, '0871', '650500', '中国,云南省,昆明市,呈贡区', 102.8010025024414, 24.889299392700195, 'Chenggong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2679, '530122', '晋宁县', '530100', '晋宁', 3, '0871', '650600', '中国,云南省,昆明市,晋宁县', 102.59400177001953, 24.666500091552734, 'Jinning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2680, '530124', '富民县', '530100', '富民', 3, '0871', '650400', '中国,云南省,昆明市,富民县', 102.49800109863281, 25.221200942993164, 'Fumin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2681, '530125', '宜良县', '530100', '宜良', 3, '0871', '652100', '中国,云南省,昆明市,宜良县', 103.14099884033203, 24.91699981689453, 'Yiliang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2682, '530126', '石林彝族自治县', '530100', '石林', 3, '0871', '652200', '中国,云南省,昆明市,石林彝族自治县', 103.27100372314453, 24.759000778198242, 'Shilin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2683, '530127', '嵩明县', '530100', '嵩明', 3, '0871', '651700', '中国,云南省,昆明市,嵩明县', 103.03700256347656, 25.33989906311035, 'Songming'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2684, '530128', '禄劝彝族苗族自治县', '530100', '禄劝', 3, '0871', '651500', '中国,云南省,昆明市,禄劝彝族苗族自治县', 102.46700286865234, 25.55389976501465, 'Luquan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2685, '530129', '寻甸回族彝族自治县 ', '530100', '寻甸', 3, '0871', '655200', '中国,云南省,昆明市,寻甸回族彝族自治县 ', 103.25599670410156, 25.559600830078125, 'Xundian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2686, '530181', '安宁市', '530100', '安宁', 3, '0871', '650300', '中国,云南省,昆明市,安宁市', 102.47000122070312, 24.916500091552734, 'Anning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2687, '530300', '曲靖市', '530000', '曲靖', 2, '0874', '655000', '中国,云南省,曲靖市', 103.7979965209961, 25.50160026550293, 'Qujing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2688, '530302', '麒麟区', '530300', '麒麟', 3, '0874', '655000', '中国,云南省,曲靖市,麒麟区', 103.80500030517578, 25.495100021362305, 'Qilin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2689, '530321', '马龙县', '530300', '马龙', 3, '0874', '655100', '中国,云南省,曲靖市,马龙县', 103.5790023803711, 25.425199508666992, 'Malong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2690, '530322', '陆良县', '530300', '陆良', 3, '0874', '655600', '中国,云南省,曲靖市,陆良县', 103.66600036621094, 25.023300170898438, 'Luliang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2691, '530323', '师宗县', '530300', '师宗', 3, '0874', '655700', '中国,云南省,曲靖市,师宗县', 103.99099731445312, 24.82819938659668, 'Shizong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2692, '530324', '罗平县', '530300', '罗平', 3, '0874', '655800', '中国,云南省,曲靖市,罗平县', 104.30899810791016, 24.8843994140625, 'Luoping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2693, '530325', '富源县', '530300', '富源', 3, '0874', '655500', '中国,云南省,曲靖市,富源县', 104.25399780273438, 25.6658992767334, 'Fuyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2694, '530326', '会泽县', '530300', '会泽', 3, '0874', '654200', '中国,云南省,曲靖市,会泽县', 103.30000305175781, 26.41080093383789, 'Huize'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2695, '530328', '沾益县', '530300', '沾益', 3, '0874', '655331', '中国,云南省,曲靖市,沾益县', 103.82099914550781, 25.607099533081055, 'Zhanyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2696, '530381', '宣威市', '530300', '宣威', 3, '0874', '655400', '中国,云南省,曲靖市,宣威市', 104.10399627685547, 26.217300415039062, 'Xuanwei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2697, '530400', '玉溪市', '530000', '玉溪', 2, '0877', '653100', '中国,云南省,玉溪市', 102.54399871826172, 24.350500106811523, 'Yuxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2698, '530402', '红塔区', '530400', '红塔', 3, '0877', '653100', '中国,云南省,玉溪市,红塔区', 102.54499816894531, 24.35409927368164, 'Hongta'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2699, '530421', '江川县', '530400', '江川', 3, '0877', '652600', '中国,云南省,玉溪市,江川县', 102.75399780273438, 24.28860092163086, 'Jiangchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2700, '530422', '澄江县', '530400', '澄江', 3, '0877', '652500', '中国,云南省,玉溪市,澄江县', 102.90799713134766, 24.673799514770508, 'Chengjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2701, '530423', '通海县', '530400', '通海', 3, '0877', '652700', '中国,云南省,玉溪市,通海县', 102.76599884033203, 24.11359977722168, 'Tonghai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2702, '530424', '华宁县', '530400', '华宁', 3, '0877', '652800', '中国,云南省,玉溪市,华宁县', 102.9280014038086, 24.19260025024414, 'Huaning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2703, '530425', '易门县', '530400', '易门', 3, '0877', '651100', '中国,云南省,玉溪市,易门县', 102.16400146484375, 24.671199798583984, 'Yimen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2704, '530426', '峨山彝族自治县', '530400', '峨山', 3, '0877', '653200', '中国,云南省,玉溪市,峨山彝族自治县', 102.40599822998047, 24.16900062561035, 'Eshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2705, '530427', '新平彝族傣族自治县', '530400', '新平', 3, '0877', '653400', '中国,云南省,玉溪市,新平彝族傣族自治县', 101.98899841308594, 24.068899154663086, 'Xinping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2706, '530428', '元江哈尼族彝族傣族自治县', '530400', '元江', 3, '0877', '653300', '中国,云南省,玉溪市,元江哈尼族彝族傣族自治县', 101.99800109863281, 23.596500396728516, 'Yuanjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2707, '530500', '保山市', '530000', '保山', 2, '0875', '678000', '中国,云南省,保山市', 99.16709899902344, 25.111799240112305, 'Baoshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2708, '530502', '隆阳区', '530500', '隆阳', 3, '0875', '678000', '中国,云南省,保山市,隆阳区', 99.16329956054688, 25.111600875854492, 'Longyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2709, '530521', '施甸县', '530500', '施甸', 3, '0875', '678200', '中国,云南省,保山市,施甸县', 99.18769836425781, 24.724199295043945, 'Shidian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2710, '530522', '腾冲县', '530500', '腾冲', 3, '0875', '679100', '中国,云南省,保山市,腾冲县', 98.49410247802734, 25.025400161743164, 'Tengchong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2711, '530523', '龙陵县', '530500', '龙陵', 3, '0875', '678300', '中国,云南省,保山市,龙陵县', 98.69020080566406, 24.587499618530273, 'Longling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2712, '530524', '昌宁县', '530500', '昌宁', 3, '0875', '678100', '中国,云南省,保山市,昌宁县', 99.60359954833984, 24.827600479125977, 'Changning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2713, '530600', '昭通市', '530000', '昭通', 2, '0870', '657000', '中国,云南省,昭通市', 103.71700286865234, 27.336999893188477, 'Zhaotong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2714, '530602', '昭阳区', '530600', '昭阳', 3, '0870', '657000', '中国,云南省,昭通市,昭阳区', 103.70700073242188, 27.31999969482422, 'Zhaoyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2715, '530621', '鲁甸县', '530600', '鲁甸', 3, '0870', '657100', '中国,云南省,昭通市,鲁甸县', 103.5469970703125, 27.192399978637695, 'Ludian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2716, '530622', '巧家县', '530600', '巧家', 3, '0870', '654600', '中国,云南省,昭通市,巧家县', 102.92400360107422, 26.912399291992188, 'Qiaojia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2717, '530623', '盐津县', '530600', '盐津', 3, '0870', '657500', '中国,云南省,昭通市,盐津县', 104.23500061035156, 28.108600616455078, 'Yanjin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2718, '530624', '大关县', '530600', '大关', 3, '0870', '657400', '中国,云南省,昭通市,大关县', 103.89299774169922, 27.74880027770996, 'Daguan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2719, '530625', '永善县', '530600', '永善', 3, '0870', '657300', '中国,云南省,昭通市,永善县', 103.63500213623047, 28.2278995513916, 'Yongshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2720, '530626', '绥江县', '530600', '绥江', 3, '0870', '657700', '中国,云南省,昭通市,绥江县', 103.9489974975586, 28.596599578857422, 'Suijiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2721, '530627', '镇雄县', '530600', '镇雄', 3, '0870', '657200', '中国,云南省,昭通市,镇雄县', 104.87300109863281, 27.439800262451172, 'Zhenxiong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2722, '530628', '彝良县', '530600', '彝良', 3, '0870', '657600', '中国,云南省,昭通市,彝良县', 104.05000305175781, 27.62809944152832, 'Yiliang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2723, '530629', '威信县', '530600', '威信', 3, '0870', '657900', '中国,云南省,昭通市,威信县', 105.0479965209961, 27.840700149536133, 'Weixin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2724, '530630', '水富县', '530600', '水富', 3, '0870', '657800', '中国,云南省,昭通市,水富县', 104.41600036621094, 28.629899978637695, 'Shuifu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2725, '530700', '丽江市', '530000', '丽江', 2, '0888', '674100', '中国,云南省,丽江市', 100.23300170898438, 26.872100830078125, 'Lijiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2726, '530702', '古城区', '530700', '古城', 3, '0888', '674100', '中国,云南省,丽江市,古城区', 100.22599792480469, 26.87700080871582, 'Gucheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2727, '530721', '玉龙纳西族自治县', '530700', '玉龙', 3, '0888', '674100', '中国,云南省,丽江市,玉龙纳西族自治县', 100.23699951171875, 26.821500778198242, 'Yulong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2728, '530722', '永胜县', '530700', '永胜', 3, '0888', '674200', '中国,云南省,丽江市,永胜县', 100.74700164794922, 26.68589973449707, 'Yongsheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2729, '530723', '华坪县', '530700', '华坪', 3, '0888', '674800', '中国,云南省,丽江市,华坪县', 101.26599884033203, 26.62969970703125, 'Huaping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2730, '530724', '宁蒗彝族自治县', '530700', '宁蒗', 3, '0888', '674300', '中国,云南省,丽江市,宁蒗彝族自治县', 100.85099792480469, 27.28179931640625, 'Ninglang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2731, '530800', '普洱市', '530000', '普洱', 2, '0879', '665000', '中国,云南省,普洱市', 100.97200012207031, 22.777299880981445, 'Pu\'er'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2732, '530802', '思茅区', '530800', '思茅', 3, '0879', '665000', '中国,云南省,普洱市,思茅区', 100.97699737548828, 22.78689956665039, 'Simao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2733, '530821', '宁洱哈尼族彝族自治县', '530800', '宁洱', 3, '0879', '665100', '中国,云南省,普洱市,宁洱哈尼族彝族自治县', 101.0469970703125, 23.063400268554688, 'Ninger'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2734, '530822', '墨江哈尼族自治县', '530800', '墨江', 3, '0879', '654800', '中国,云南省,普洱市,墨江哈尼族自治县', 101.69200134277344, 23.432100296020508, 'Mojiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2735, '530823', '景东彝族自治县', '530800', '景东', 3, '0879', '676200', '中国,云南省,普洱市,景东彝族自治县', 100.83599853515625, 24.447900772094727, 'Jingdong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2736, '530824', '景谷傣族彝族自治县', '530800', '景谷', 3, '0879', '666400', '中国,云南省,普洱市,景谷傣族彝族自治县', 100.7030029296875, 23.496999740600586, 'Jinggu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2737, '530825', '镇沅彝族哈尼族拉祜族自治县', '530800', '镇沅', 3, '0879', '666500', '中国,云南省,普洱市,镇沅彝族哈尼族拉祜族自治县', 101.10700225830078, 24.005599975585938, 'Zhenyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2738, '530826', '江城哈尼族彝族自治县', '530800', '江城', 3, '0879', '665900', '中国,云南省,普洱市,江城哈尼族彝族自治县', 101.85800170898438, 22.584199905395508, 'Jiangcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2739, '530827', '孟连傣族拉祜族佤族自治县', '530800', '孟连', 3, '0879', '665800', '中国,云南省,普洱市,孟连傣族拉祜族佤族自治县', 99.58419799804688, 22.329200744628906, 'Menglian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2740, '530828', '澜沧拉祜族自治县', '530800', '澜沧', 3, '0879', '665600', '中国,云南省,普洱市,澜沧拉祜族自治县', 99.93589782714844, 22.55470085144043, 'Lancang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2741, '530829', '西盟佤族自治县', '530800', '西盟', 3, '0879', '665700', '中国,云南省,普洱市,西盟佤族自治县', 99.59870147705078, 22.6476993560791, 'Ximeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2742, '530900', '临沧市', '530000', '临沧', 2, '0883', '677000', '中国,云南省,临沧市', 100.08699798583984, 23.886600494384766, 'Lincang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2743, '530902', '临翔区', '530900', '临翔', 3, '0883', '677000', '中国,云南省,临沧市,临翔区', 100.08200073242188, 23.895000457763672, 'Linxiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2744, '530921', '凤庆县', '530900', '凤庆', 3, '0883', '675900', '中国,云南省,临沧市,凤庆县', 99.92839813232422, 24.580299377441406, 'Fengqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2745, '530922', '云县', '530900', '云县', 3, '0883', '675800', '中国,云南省,临沧市,云县', 100.12799835205078, 24.446800231933594, 'Yunxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2746, '530923', '永德县', '530900', '永德', 3, '0883', '677600', '中国,云南省,临沧市,永德县', 99.25330352783203, 24.027599334716797, 'Yongde'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2747, '530924', '镇康县', '530900', '镇康', 3, '0883', '677704', '中国,云南省,临沧市,镇康县', 98.82550048828125, 23.762399673461914, 'Zhenkang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2748, '530925', '双江拉祜族佤族布朗族傣族自治县', '530900', '双江', 3, '0883', '677300', '中国,云南省,临沧市,双江拉祜族佤族布朗族傣族自治县', 99.82769775390625, 23.473499298095703, 'Shuangjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2749, '530926', '耿马傣族佤族自治县', '530900', '耿马', 3, '0883', '677500', '中国,云南省,临沧市,耿马傣族佤族自治县', 99.39790344238281, 23.537799835205078, 'Gengma'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2750, '530927', '沧源佤族自治县', '530900', '沧源', 3, '0883', '677400', '中国,云南省,临沧市,沧源佤族自治县', 99.24549865722656, 23.1481990814209, 'Cangyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2751, '532300', '楚雄彝族自治州', '530000', '楚雄', 2, '0878', '675000', '中国,云南省,楚雄彝族自治州', 101.5459976196289, 25.04199981689453, 'Chuxiong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2752, '532301', '楚雄市', '532300', '楚雄', 3, '0878', '675000', '中国,云南省,楚雄彝族自治州,楚雄市', 101.5459976196289, 25.032899856567383, 'Chuxiong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2753, '532322', '双柏县', '532300', '双柏', 3, '0878', '675100', '中国,云南省,楚雄彝族自治州,双柏县', 101.64199829101562, 24.688800811767578, 'Shuangbai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2754, '532323', '牟定县', '532300', '牟定', 3, '0878', '675500', '中国,云南省,楚雄彝族自治州,牟定县', 101.54000091552734, 25.315500259399414, 'Mouding'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2755, '532324', '南华县', '532300', '南华', 3, '0878', '675200', '中国,云南省,楚雄彝族自治州,南华县', 101.27300262451172, 25.192899703979492, 'Nanhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2756, '532325', '姚安县', '532300', '姚安', 3, '0878', '675300', '中国,云南省,楚雄彝族自治州,姚安县', 101.24299621582031, 25.50469970703125, 'Yao\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2757, '532326', '大姚县', '532300', '大姚', 3, '0878', '675400', '中国,云南省,楚雄彝族自治州,大姚县', 101.3239974975586, 25.722200393676758, 'Dayao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2758, '532327', '永仁县', '532300', '永仁', 3, '0878', '651400', '中国,云南省,楚雄彝族自治州,永仁县', 101.6719970703125, 26.057899475097656, 'Yongren'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2759, '532328', '元谋县', '532300', '元谋', 3, '0878', '651300', '中国,云南省,楚雄彝族自治州,元谋县', 101.87699890136719, 25.70439910888672, 'Yuanmou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2760, '532329', '武定县', '532300', '武定', 3, '0878', '651600', '中国,云南省,楚雄彝族自治州,武定县', 102.40399932861328, 25.529499053955078, 'Wuding'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2761, '532331', '禄丰县', '532300', '禄丰', 3, '0878', '651200', '中国,云南省,楚雄彝族自治州,禄丰县', 102.0780029296875, 25.148099899291992, 'Lufeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2762, '532500', '红河哈尼族彝族自治州', '530000', '红河', 2, '0873', '661400', '中国,云南省,红河哈尼族彝族自治州', 103.38400268554688, 23.36680030822754, 'Honghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2763, '532501', '个旧市', '532500', '个旧', 3, '0873', '661000', '中国,云南省,红河哈尼族彝族自治州,个旧市', 103.16000366210938, 23.35890007019043, 'Gejiu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2764, '532502', '开远市', '532500', '开远', 3, '0873', '661600', '中国,云南省,红河哈尼族彝族自治州,开远市', 103.2699966430664, 23.710100173950195, 'Kaiyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2765, '532503', '蒙自市', '532500', '蒙自', 3, '0873', '661101', '中国,云南省,红河哈尼族彝族自治州,蒙自市', 103.38500213623047, 23.36680030822754, 'Mengzi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2766, '532504', '弥勒市', '532500', '弥勒', 3, '0873', '652300', '中国,云南省,红河哈尼族彝族自治州,弥勒市', 103.43699645996094, 24.40839958190918, 'Mile '); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2767, '532523', '屏边苗族自治县', '532500', '屏边', 3, '0873', '661200', '中国,云南省,红河哈尼族彝族自治州,屏边苗族自治县', 103.68599700927734, 22.98419952392578, 'Pingbian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2768, '532524', '建水县', '532500', '建水', 3, '0873', '654300', '中国,云南省,红河哈尼族彝族自治州,建水县', 102.8270034790039, 23.634700775146484, 'Jianshui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2769, '532525', '石屏县', '532500', '石屏', 3, '0873', '662200', '中国,云南省,红河哈尼族彝族自治州,石屏县', 102.49400329589844, 23.714399337768555, 'Shiping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2770, '532527', '泸西县', '532500', '泸西', 3, '0873', '652400', '中国,云南省,红河哈尼族彝族自治州,泸西县', 103.76399993896484, 24.528499603271484, 'Luxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2771, '532528', '元阳县', '532500', '元阳', 3, '0873', '662400', '中国,云南省,红河哈尼族彝族自治州,元阳县', 102.83300018310547, 23.22279930114746, 'Yuanyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2772, '532529', '红河县', '532500', '红河县', 3, '0873', '654400', '中国,云南省,红河哈尼族彝族自治州,红河县', 102.4209976196289, 23.367700576782227, 'Honghexian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2773, '532530', '金平苗族瑶族傣族自治县', '532500', '金平', 3, '0873', '661500', '中国,云南省,红河哈尼族彝族自治州,金平苗族瑶族傣族自治县', 103.22699737548828, 22.779600143432617, 'Jinping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2774, '532531', '绿春县', '532500', '绿春', 3, '0873', '662500', '中国,云南省,红河哈尼族彝族自治州,绿春县', 102.39700317382812, 22.99370002746582, 'Lvchun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2775, '532532', '河口瑶族自治县', '532500', '河口', 3, '0873', '661300', '中国,云南省,红河哈尼族彝族自治州,河口瑶族自治县', 103.93900299072266, 22.529300689697266, 'Hekou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2776, '532600', '文山壮族苗族自治州', '530000', '文山', 2, '0876', '663000', '中国,云南省,文山壮族苗族自治州', 104.24400329589844, 23.36949920654297, 'Wenshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2777, '532601', '文山市', '532600', '文山', 3, '0876', '663000', '中国,云南省,文山壮族苗族自治州,文山市', 104.24400329589844, 23.369199752807617, 'Wenshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2778, '532622', '砚山县', '532600', '砚山', 3, '0876', '663100', '中国,云南省,文山壮族苗族自治州,砚山县', 104.33300018310547, 23.607200622558594, 'Yanshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2779, '532623', '西畴县', '532600', '西畴', 3, '0876', '663500', '中国,云南省,文山壮族苗族自治州,西畴县', 104.67400360107422, 23.43939971923828, 'Xichou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2780, '532624', '麻栗坡县', '532600', '麻栗坡', 3, '0876', '663600', '中国,云南省,文山壮族苗族自治州,麻栗坡县', 104.70099639892578, 23.12030029296875, 'Malipo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2781, '532625', '马关县', '532600', '马关', 3, '0876', '663700', '中国,云南省,文山壮族苗族自治州,马关县', 104.3949966430664, 23.01289939880371, 'Maguan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2782, '532626', '丘北县', '532600', '丘北', 3, '0876', '663200', '中国,云南省,文山壮族苗族自治州,丘北县', 104.19300079345703, 24.039600372314453, 'Qiubei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2783, '532627', '广南县', '532600', '广南', 3, '0876', '663300', '中国,云南省,文山壮族苗族自治州,广南县', 105.05500030517578, 24.04640007019043, 'Guangnan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2784, '532628', '富宁县', '532600', '富宁', 3, '0876', '663400', '中国,云南省,文山壮族苗族自治州,富宁县', 105.63099670410156, 23.62540054321289, 'Funing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2785, '532800', '西双版纳傣族自治州', '530000', '西双版纳', 2, '0691', '666100', '中国,云南省,西双版纳傣族自治州', 100.7979965209961, 22.001699447631836, 'Xishuangbanna'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2786, '532801', '景洪市', '532800', '景洪', 3, '0691', '666100', '中国,云南省,西双版纳傣族自治州,景洪市', 100.80000305175781, 22.010700225830078, 'Jinghong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2787, '532822', '勐海县', '532800', '勐海', 3, '0691', '666200', '中国,云南省,西双版纳傣族自治州,勐海县', 100.4489974975586, 21.96179962158203, 'Menghai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2788, '532823', '勐腊县', '532800', '勐腊', 3, '0691', '666300', '中国,云南省,西双版纳傣族自治州,勐腊县', 101.56500244140625, 21.481599807739258, 'Mengla'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2789, '532900', '大理白族自治州', '530000', '大理', 2, '0872', '671000', '中国,云南省,大理白族自治州', 100.23999786376953, 25.59280014038086, 'Dali'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2790, '532901', '大理市', '532900', '大理', 3, '0872', '671000', '中国,云南省,大理白族自治州,大理市', 100.2300033569336, 25.59160041809082, 'Dali'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2791, '532922', '漾濞彝族自治县', '532900', '漾濞', 3, '0872', '672500', '中国,云南省,大理白族自治州,漾濞彝族自治县', 99.95469665527344, 25.665199279785156, 'Yangbi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2792, '532923', '祥云县', '532900', '祥云', 3, '0872', '672100', '中国,云南省,大理白族自治州,祥云县', 100.55799865722656, 25.473400115966797, 'Xiangyun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2793, '532924', '宾川县', '532900', '宾川', 3, '0872', '671600', '中国,云南省,大理白族自治州,宾川县', 100.5770034790039, 25.83139991760254, 'Binchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2794, '532925', '弥渡县', '532900', '弥渡', 3, '0872', '675600', '中国,云南省,大理白族自治州,弥渡县', 100.49099731445312, 25.341800689697266, 'Midu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2795, '532926', '南涧彝族自治县', '532900', '南涧', 3, '0872', '675700', '中国,云南省,大理白族自治州,南涧彝族自治县', 100.51000213623047, 25.043500900268555, 'Nanjian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2796, '532927', '巍山彝族回族自治县', '532900', '巍山', 3, '0872', '672400', '中国,云南省,大理白族自治州,巍山彝族回族自治县', 100.30599975585938, 25.23200035095215, 'Weishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2797, '532928', '永平县', '532900', '永平', 3, '0872', '672600', '中国,云南省,大理白族自治州,永平县', 99.54090118408203, 25.464500427246094, 'Yongping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2798, '532929', '云龙县', '532900', '云龙', 3, '0872', '672700', '中国,云南省,大理白族自治州,云龙县', 99.37259674072266, 25.885000228881836, 'Yunlong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2799, '532930', '洱源县', '532900', '洱源', 3, '0872', '671200', '中国,云南省,大理白族自治州,洱源县', 99.9489974975586, 26.108299255371094, 'Eryuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2800, '532931', '剑川县', '532900', '剑川', 3, '0872', '671300', '中国,云南省,大理白族自治州,剑川县', 99.90540313720703, 26.53689956665039, 'Jianchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2801, '532932', '鹤庆县', '532900', '鹤庆', 3, '0872', '671500', '中国,云南省,大理白族自治州,鹤庆县', 100.177001953125, 26.558000564575195, 'Heqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2802, '533100', '德宏傣族景颇族自治州', '530000', '德宏', 2, '0692', '678400', '中国,云南省,德宏傣族景颇族自治州', 98.57839965820312, 24.43670082092285, 'Dehong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2803, '533102', '瑞丽市', '533100', '瑞丽', 3, '0692', '678600', '中国,云南省,德宏傣族景颇族自治州,瑞丽市', 97.85179901123047, 24.012800216674805, 'Ruili'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2804, '533103', '芒市', '533100', '芒市', 3, '0692', '678400', '中国,云南省,德宏傣族景颇族自治州,芒市', 98.5886001586914, 24.433700561523438, 'Mangshi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2805, '533122', '梁河县', '533100', '梁河', 3, '0692', '679200', '中国,云南省,德宏傣族景颇族自治州,梁河县', 98.2970962524414, 24.80660057067871, 'Lianghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2806, '533123', '盈江县', '533100', '盈江', 3, '0692', '679300', '中国,云南省,德宏傣族景颇族自治州,盈江县', 97.93180084228516, 24.705799102783203, 'Yingjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2807, '533124', '陇川县', '533100', '陇川', 3, '0692', '678700', '中国,云南省,德宏傣族景颇族自治州,陇川县', 97.79199981689453, 24.183000564575195, 'Longchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2808, '533300', '怒江傈僳族自治州', '530000', '怒江', 2, '0886', '673100', '中国,云南省,怒江傈僳族自治州', 98.85430145263672, 25.850900650024414, 'Nujiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2809, '533321', '泸水县', '533300', '泸水', 3, '0886', '673100', '中国,云南省,怒江傈僳族自治州,泸水县', 98.85530090332031, 25.83769989013672, 'Lushui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2810, '533323', '福贡县', '533300', '福贡', 3, '0886', '673400', '中国,云南省,怒江傈僳族自治州,福贡县', 98.86969757080078, 26.90369987487793, 'Fugong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2811, '533324', '贡山独龙族怒族自治县', '533300', '贡山', 3, '0886', '673500', '中国,云南省,怒江傈僳族自治州,贡山独龙族怒族自治县', 98.66580200195312, 27.74090003967285, 'Gongshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2812, '533325', '兰坪白族普米族自治县', '533300', '兰坪', 3, '0886', '671400', '中国,云南省,怒江傈僳族自治州,兰坪白族普米族自治县', 99.41889953613281, 26.452499389648438, 'Lanping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2813, '533400', '迪庆藏族自治州', '530000', '迪庆', 2, '0887', '674400', '中国,云南省,迪庆藏族自治州', 99.70649719238281, 27.826900482177734, 'Deqen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2814, '533421', '香格里拉市', '533400', '香格里拉', 3, '0887', '674400', '中国,云南省,迪庆藏族自治州,香格里拉市', 99.70600128173828, 27.82309913635254, 'Xianggelila'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2815, '533422', '德钦县', '533400', '德钦', 3, '0887', '674500', '中国,云南省,迪庆藏族自治州,德钦县', 98.91079711914062, 28.486299514770508, 'Deqin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2816, '533423', '维西傈僳族自治县', '533400', '维西', 3, '0887', '674600', '中国,云南省,迪庆藏族自治州,维西傈僳族自治县', 99.28399658203125, 27.17930030822754, 'Weixi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2817, '540000', '西藏', '100000', '西藏', 1, '', '1', '中国,西藏自治区', 91.1322021484375, 29.660400390625, 'Tibet'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2818, '540100', '拉萨市', '540000', '拉萨', 2, '0891', '850000', '中国,西藏自治区,拉萨市', 91.1322021484375, 29.660400390625, 'Lhasa'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2819, '540102', '城关区', '540100', '城关', 3, '0891', '850000', '中国,西藏自治区,拉萨市,城关区', 91.13860321044922, 29.653099060058594, 'Chengguan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2820, '540121', '林周县', '540100', '林周', 3, '0891', '851600', '中国,西藏自治区,拉萨市,林周县', 91.25859832763672, 29.894399642944336, 'Linzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2821, '540122', '当雄县', '540100', '当雄', 3, '0891', '851500', '中国,西藏自治区,拉萨市,当雄县', 91.10079956054688, 30.48310089111328, 'Dangxiong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2822, '540123', '尼木县', '540100', '尼木', 3, '0891', '851300', '中国,西藏自治区,拉萨市,尼木县', 90.16380310058594, 29.433500289916992, 'Nimu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2823, '540124', '曲水县', '540100', '曲水', 3, '0891', '850600', '中国,西藏自治区,拉萨市,曲水县', 90.73190307617188, 29.356399536132812, 'Qushui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2824, '540125', '堆龙德庆县', '540100', '堆龙德庆', 3, '0891', '851400', '中国,西藏自治区,拉萨市,堆龙德庆县', 91.00029754638672, 29.649999618530273, 'Duilongdeqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2825, '540126', '达孜县', '540100', '达孜', 3, '0891', '850100', '中国,西藏自治区,拉萨市,达孜县', 91.35759735107422, 29.672199249267578, 'Dazi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2826, '540127', '墨竹工卡县', '540100', '墨竹工卡', 3, '0891', '850200', '中国,西藏自治区,拉萨市,墨竹工卡县', 91.72810363769531, 29.83609962463379, 'Mozhugongka'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2827, '540200', '日喀则市', '540000', '日喀则', 2, '0892', '857000', '中国,西藏自治区,日喀则市', 88.88490295410156, 29.2637996673584, 'Rikaze'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2828, '540202', '桑珠孜区', '540200', '桑珠孜', 3, '0892', '857000', '中国,西藏自治区,日喀则市,桑珠孜区', 88.88040161132812, 29.26959991455078, 'Sangzhuzi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2829, '540221', '南木林县', '540200', '南木林', 3, '0892', '857100', '中国,西藏自治区,日喀则市,南木林县', 89.0969009399414, 29.682100296020508, 'Nanmulin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2830, '540222', '江孜县', '540200', '江孜', 3, '0892', '857400', '中国,西藏自治区,日喀则市,江孜县', 89.60260009765625, 28.917400360107422, 'Jiangzi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2831, '540223', '定日县', '540200', '定日', 3, '0892', '858200', '中国,西藏自治区,日喀则市,定日县', 87.1218032836914, 28.661300659179688, 'Dingri'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2832, '540224', '萨迦县', '540200', '萨迦', 3, '0892', '857800', '中国,西藏自治区,日喀则市,萨迦县', 88.02189636230469, 28.902999877929688, 'Sajia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2833, '540225', '拉孜县', '540200', '拉孜', 3, '0892', '858100', '中国,西藏自治区,日喀则市,拉孜县', 87.63410186767578, 29.084999084472656, 'Lazi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2834, '540226', '昂仁县', '540200', '昂仁', 3, '0892', '858500', '中国,西藏自治区,日喀则市,昂仁县', 87.23860168457031, 29.295000076293945, 'Angren'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2835, '540227', '谢通门县', '540200', '谢通门', 3, '0892', '858900', '中国,西藏自治区,日喀则市,谢通门县', 88.26239776611328, 29.433399200439453, 'Xietongmen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2836, '540228', '白朗县', '540200', '白朗', 3, '0892', '857300', '中国,西藏自治区,日喀则市,白朗县', 89.26200103759766, 29.105499267578125, 'Bailang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2837, '540229', '仁布县', '540200', '仁布', 3, '0892', '857200', '中国,西藏自治区,日喀则市,仁布县', 89.84230041503906, 29.230100631713867, 'Renbu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2838, '540230', '康马县', '540200', '康马', 3, '0892', '857500', '中国,西藏自治区,日喀则市,康马县', 89.685302734375, 28.556699752807617, 'Kangma'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2839, '540231', '定结县', '540200', '定结', 3, '0892', '857900', '中国,西藏自治区,日喀则市,定结县', 87.77259826660156, 28.36400032043457, 'Dingjie'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2840, '540232', '仲巴县', '540200', '仲巴', 3, '0892', '858800', '中国,西藏自治区,日喀则市,仲巴县', 84.02950286865234, 29.765899658203125, 'Zhongba'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2841, '540233', '亚东县', '540200', '亚东', 3, '0892', '857600', '中国,西藏自治区,日喀则市,亚东县', 88.90799713134766, 27.48390007019043, 'Yadong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2842, '540234', '吉隆县', '540200', '吉隆', 3, '0892', '858700', '中国,西藏自治区,日喀则市,吉隆县', 85.29850006103516, 28.85379981994629, 'Jilong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2843, '540235', '聂拉木县', '540200', '聂拉木', 3, '0892', '858300', '中国,西藏自治区,日喀则市,聂拉木县', 85.9800033569336, 28.1564998626709, 'Nielamu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2844, '540236', '萨嘎县', '540200', '萨嘎', 3, '0892', '857800', '中国,西藏自治区,日喀则市,萨嘎县', 85.23410034179688, 29.32939910888672, 'Saga'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2845, '540237', '岗巴县', '540200', '岗巴', 3, '0892', '857700', '中国,西藏自治区,日喀则市,岗巴县', 88.52069854736328, 28.274999618530273, 'Gangba'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2846, '540300', '昌都市', '540000', '昌都', 2, '0895', '854000', '中国,西藏自治区,昌都市', 97.17849731445312, 31.136899948120117, 'Qamdo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2847, '540302', '卡若区', '540300', '昌都', 3, '0895', '854000', '中国,西藏自治区,昌都市,卡若区', 97.1803970336914, 31.138500213623047, 'Karuo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2848, '540321', '江达县', '540300', '江达', 3, '0895', '854100', '中国,西藏自治区,昌都市,江达县', 98.21869659423828, 31.503400802612305, 'Jiangda'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2849, '540322', '贡觉县', '540300', '贡觉', 3, '0895', '854200', '中国,西藏自治区,昌都市,贡觉县', 98.27159881591797, 30.859399795532227, 'Gongjue'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2850, '540323', '类乌齐县', '540300', '类乌齐', 3, '0895', '855600', '中国,西藏自治区,昌都市,类乌齐县', 96.6001968383789, 31.212099075317383, 'Leiwuqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2851, '540324', '丁青县', '540300', '丁青', 3, '0895', '855700', '中国,西藏自治区,昌都市,丁青县', 95.59359741210938, 31.416200637817383, 'Dingqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2852, '540325', '察雅县', '540300', '察雅', 3, '0895', '854300', '中国,西藏自治区,昌都市,察雅县', 97.56520080566406, 30.653400421142578, 'Chaya'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2853, '540326', '八宿县', '540300', '八宿', 3, '0895', '854600', '中国,西藏自治区,昌都市,八宿县', 96.9176025390625, 30.053499221801758, 'Basu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2854, '540327', '左贡县', '540300', '左贡', 3, '0895', '854400', '中国,西藏自治区,昌都市,左贡县', 97.84429931640625, 29.671100616455078, 'Zuogong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2855, '540328', '芒康县', '540300', '芒康', 3, '0895', '854500', '中国,西藏自治区,昌都市,芒康县', 98.59380340576172, 29.679500579833984, 'Mangkang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2856, '540329', '洛隆县', '540300', '洛隆', 3, '0895', '855400', '中国,西藏自治区,昌都市,洛隆县', 95.82640075683594, 30.74049949645996, 'Luolong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2857, '540330', '边坝县', '540300', '边坝', 3, '0895', '855500', '中国,西藏自治区,昌都市,边坝县', 94.70690155029297, 30.93429946899414, 'Bianba'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2858, '542200', '山南地区', '540000', '山南', 2, '0893', '856000', '中国,西藏自治区,山南地区', 91.7665023803711, 29.236000061035156, 'Shannan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2859, '542221', '乃东县', '542200', '乃东', 3, '0893', '856100', '中国,西藏自治区,山南地区,乃东县', 91.7614974975586, 29.224899291992188, 'Naidong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2860, '542222', '扎囊县', '542200', '扎囊', 3, '0893', '850800', '中国,西藏自治区,山南地区,扎囊县', 91.33290100097656, 29.239900588989258, 'Zhanang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2861, '542223', '贡嘎县', '542200', '贡嘎', 3, '0893', '850700', '中国,西藏自治区,山南地区,贡嘎县', 90.98870086669922, 29.294099807739258, 'Gongga'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2862, '542224', '桑日县', '542200', '桑日', 3, '0893', '856200', '中国,西藏自治区,山南地区,桑日县', 92.02010345458984, 29.266399383544922, 'Sangri'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2863, '542225', '琼结县', '542200', '琼结', 3, '0893', '856800', '中国,西藏自治区,山南地区,琼结县', 91.68090057373047, 29.02630043029785, 'Qiongjie'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2864, '542226', '曲松县', '542200', '曲松', 3, '0893', '856300', '中国,西藏自治区,山南地区,曲松县', 92.20259857177734, 29.06410026550293, 'Qusong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2865, '542227', '措美县', '542200', '措美', 3, '0893', '856900', '中国,西藏自治区,山南地区,措美县', 91.43240356445312, 28.43790054321289, 'Cuomei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2866, '542228', '洛扎县', '542200', '洛扎', 3, '0893', '856600', '中国,西藏自治区,山南地区,洛扎县', 90.86039733886719, 28.38719940185547, 'Luozha'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2867, '542229', '加查县', '542200', '加查', 3, '0893', '856400', '中国,西藏自治区,山南地区,加查县', 92.5770034790039, 29.139699935913086, 'Jiacha'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2868, '542231', '隆子县', '542200', '隆子', 3, '0893', '856600', '中国,西藏自治区,山南地区,隆子县', 92.46150207519531, 28.408000946044922, 'Longzi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2869, '542232', '错那县', '542200', '错那', 3, '0893', '856700', '中国,西藏自治区,山南地区,错那县', 91.9574966430664, 27.99220085144043, 'Cuona'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2870, '542233', '浪卡子县', '542200', '浪卡子', 3, '0893', '851100', '中国,西藏自治区,山南地区,浪卡子县', 90.4000015258789, 28.969499588012695, 'Langkazi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2871, '542400', '那曲地区', '540000', '那曲', 2, '0896', '852000', '中国,西藏自治区,那曲地区', 92.0602035522461, 31.47599983215332, 'Nagqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2872, '542421', '那曲县', '542400', '那曲', 3, '0896', '852000', '中国,西藏自治区,那曲地区,那曲县', 92.05349731445312, 31.469600677490234, 'Naqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2873, '542422', '嘉黎县', '542400', '嘉黎', 3, '0896', '852400', '中国,西藏自治区,那曲地区,嘉黎县', 93.2499008178711, 30.64229965209961, 'Jiali'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2874, '542423', '比如县', '542400', '比如', 3, '0896', '852300', '中国,西藏自治区,那曲地区,比如县', 93.68689727783203, 31.4778995513916, 'Biru'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2875, '542424', '聂荣县', '542400', '聂荣', 3, '0896', '853500', '中国,西藏自治区,那曲地区,聂荣县', 92.29570007324219, 32.111900329589844, 'Nierong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2876, '542425', '安多县', '542400', '安多', 3, '0896', '853400', '中国,西藏自治区,那曲地区,安多县', 91.67949676513672, 32.261199951171875, 'Anduo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2877, '542426', '申扎县', '542400', '申扎', 3, '0896', '853100', '中国,西藏自治区,那曲地区,申扎县', 88.70780181884766, 30.93000030517578, 'Shenzha'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2878, '542427', '索县', '542400', '索县', 3, '0896', '852200', '中国,西藏自治区,那曲地区,索县', 93.78299713134766, 31.884300231933594, 'Suoxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2879, '542428', '班戈县', '542400', '班戈', 3, '0896', '852500', '中国,西藏自治区,那曲地区,班戈县', 90.01909637451172, 31.361499786376953, 'Bange'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2880, '542429', '巴青县', '542400', '巴青', 3, '0896', '852100', '中国,西藏自治区,那曲地区,巴青县', 94.0531997680664, 31.91830062866211, 'Baqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2881, '542430', '尼玛县', '542400', '尼玛', 3, '0896', '852600', '中国,西藏自治区,那曲地区,尼玛县', 87.25260162353516, 31.796499252319336, 'Nima'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2882, '542431', '双湖县', '542400', '双湖', 3, '0896', '852600', '中国,西藏自治区,那曲地区,双湖县', 88.83779907226562, 33.18899917602539, 'Shuanghu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2883, '542500', '阿里地区', '540000', '阿里', 2, '0897', '859000', '中国,西藏自治区,阿里地区', 80.10549926757812, 32.50320053100586, 'Ngari'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2884, '542521', '普兰县', '542500', '普兰', 3, '0897', '859500', '中国,西藏自治区,阿里地区,普兰县', 81.177001953125, 30.299999237060547, 'Pulan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2885, '542522', '札达县', '542500', '札达', 3, '0897', '859600', '中国,西藏自治区,阿里地区,札达县', 79.80259704589844, 31.483400344848633, 'Zhada'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2886, '542523', '噶尔县', '542500', '噶尔', 3, '0897', '859400', '中国,西藏自治区,阿里地区,噶尔县', 80.0958023071289, 32.50019836425781, 'Gaer'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2887, '542524', '日土县', '542500', '日土', 3, '0897', '859700', '中国,西藏自治区,阿里地区,日土县', 79.71309661865234, 33.38740158081055, 'Ritu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2888, '542525', '革吉县', '542500', '革吉', 3, '0897', '859100', '中国,西藏自治区,阿里地区,革吉县', 81.1510009765625, 32.396400451660156, 'Geji'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2889, '542526', '改则县', '542500', '改则', 3, '0897', '859200', '中国,西藏自治区,阿里地区,改则县', 84.06300354003906, 32.304500579833984, 'Gaize'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2890, '542527', '措勤县', '542500', '措勤', 3, '0897', '859300', '中国,西藏自治区,阿里地区,措勤县', 85.16619873046875, 31.020999908447266, 'Cuoqin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2891, '542600', '林芝地区', '540000', '林芝', 2, '0894', '850400', '中国,西藏自治区,林芝地区', 94.36239624023438, 29.654699325561523, 'Nyingchi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2892, '542621', '林芝县', '542600', '林芝', 3, '0894', '850400', '中国,西藏自治区,林芝地区,林芝县', 94.48390197753906, 29.575599670410156, 'Linzhi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2893, '542622', '工布江达县', '542600', '工布江达', 3, '0894', '850300', '中国,西藏自治区,林芝地区,工布江达县', 93.24520111083984, 29.885799407958984, 'Gongbujiangda'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2894, '542623', '米林县', '542600', '米林', 3, '0894', '850500', '中国,西藏自治区,林芝地区,米林县', 94.21320343017578, 29.215299606323242, 'Milin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2895, '542624', '墨脱县', '542600', '墨脱', 3, '0894', '855300', '中国,西藏自治区,林芝地区,墨脱县', 95.33159637451172, 29.32699966430664, 'Motuo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2896, '542625', '波密县', '542600', '波密', 3, '0894', '855200', '中国,西藏自治区,林芝地区,波密县', 95.77100372314453, 29.859100341796875, 'Bomi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2897, '542626', '察隅县', '542600', '察隅', 3, '0894', '855100', '中国,西藏自治区,林芝地区,察隅县', 97.466796875, 28.661800384521484, 'Chayu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2898, '542627', '朗县', '542600', '朗县', 3, '0894', '856500', '中国,西藏自治区,林芝地区,朗县', 93.07540130615234, 29.045499801635742, 'Langxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2899, '610000', '陕西省', '100000', '陕西', 1, '', '1', '中国,陕西省', 108.947998046875, 34.26319885253906, 'Shaanxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2900, '610100', '西安市', '610000', '西安', 2, '029', '710003', '中国,陕西省,西安市', 108.947998046875, 34.26319885253906, 'Xi\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2901, '610102', '新城区', '610100', '新城', 3, '029', '710004', '中国,陕西省,西安市,新城区', 108.96099853515625, 34.26639938354492, 'Xincheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2902, '610103', '碑林区', '610100', '碑林', 3, '029', '710001', '中国,陕西省,西安市,碑林区', 108.93399810791016, 34.23040008544922, 'Beilin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2903, '610104', '莲湖区', '610100', '莲湖', 3, '029', '710003', '中国,陕西省,西安市,莲湖区', 108.94000244140625, 34.2671012878418, 'Lianhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2904, '610111', '灞桥区', '610100', '灞桥', 3, '029', '710038', '中国,陕西省,西安市,灞桥区', 109.06500244140625, 34.27259826660156, 'Baqiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2905, '610112', '未央区', '610100', '未央', 3, '029', '710014', '中国,陕西省,西安市,未央区', 108.9469985961914, 34.292999267578125, 'Weiyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2906, '610113', '雁塔区', '610100', '雁塔', 3, '029', '710061', '中国,陕西省,西安市,雁塔区', 108.9489974975586, 34.22249984741211, 'Yanta'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2907, '610114', '阎良区', '610100', '阎良', 3, '029', '710087', '中国,陕西省,西安市,阎良区', 109.22599792480469, 34.662200927734375, 'Yanliang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2908, '610115', '临潼区', '610100', '临潼', 3, '029', '710600', '中国,陕西省,西安市,临潼区', 109.21399688720703, 34.366600036621094, 'Lintong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2909, '610116', '长安区', '610100', '长安', 3, '029', '710100', '中国,陕西省,西安市,长安区', 108.94599914550781, 34.155601501464844, 'Chang\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2910, '610122', '蓝田县', '610100', '蓝田', 3, '029', '710500', '中国,陕西省,西安市,蓝田县', 109.322998046875, 34.15129852294922, 'Lantian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2911, '610124', '周至县', '610100', '周至', 3, '029', '710400', '中国,陕西省,西安市,周至县', 108.22200012207031, 34.16339874267578, 'Zhouzhi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2912, '610125', '户县', '610100', '户县', 3, '029', '710300', '中国,陕西省,西安市,户县', 108.6050033569336, 34.10860061645508, 'Huxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2913, '610126', '高陵区', '610100', '高陵', 3, '029', '710200', '中国,陕西省,西安市,高陵区', 109.08799743652344, 34.5348014831543, 'Gaoling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2914, '610200', '铜川市', '610000', '铜川', 2, '0919', '727100', '中国,陕西省,铜川市', 108.96299743652344, 34.90890121459961, 'Tongchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2915, '610202', '王益区', '610200', '王益', 3, '0919', '727000', '中国,陕西省,铜川市,王益区', 109.07599639892578, 35.069000244140625, 'Wangyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2916, '610203', '印台区', '610200', '印台', 3, '0919', '727007', '中国,陕西省,铜川市,印台区', 109.10199737548828, 35.11690139770508, 'Yintai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2917, '610204', '耀州区', '610200', '耀州', 3, '0919', '727100', '中国,陕西省,铜川市,耀州区', 108.98600006103516, 34.91310119628906, 'Yaozhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2918, '610222', '宜君县', '610200', '宜君', 3, '0919', '727200', '中国,陕西省,铜川市,宜君县', 109.11799621582031, 35.401100158691406, 'Yijun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2919, '610300', '宝鸡市', '610000', '宝鸡', 2, '0917', '721000', '中国,陕西省,宝鸡市', 107.1449966430664, 34.369300842285156, 'Baoji'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2920, '610302', '渭滨区', '610300', '渭滨', 3, '0917', '721000', '中国,陕西省,宝鸡市,渭滨区', 107.1500015258789, 34.37120056152344, 'Weibin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2921, '610303', '金台区', '610300', '金台', 3, '0917', '721000', '中国,陕西省,宝鸡市,金台区', 107.14700317382812, 34.3760986328125, 'Jintai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2922, '610304', '陈仓区', '610300', '陈仓', 3, '0917', '721300', '中国,陕西省,宝鸡市,陈仓区', 107.38700103759766, 34.35449981689453, 'Chencang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2923, '610322', '凤翔县', '610300', '凤翔', 3, '0917', '721400', '中国,陕西省,宝鸡市,凤翔县', 107.39600372314453, 34.52320098876953, 'Fengxiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2924, '610323', '岐山县', '610300', '岐山', 3, '0917', '722400', '中国,陕西省,宝鸡市,岐山县', 107.62200164794922, 34.44380187988281, 'Qishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2925, '610324', '扶风县', '610300', '扶风', 3, '0917', '722200', '中国,陕西省,宝鸡市,扶风县', 107.9000015258789, 34.37519836425781, 'Fufeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2926, '610326', '眉县', '610300', '眉县', 3, '0917', '722300', '中国,陕西省,宝鸡市,眉县', 107.7509994506836, 34.275699615478516, 'Meixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2927, '610327', '陇县', '610300', '陇县', 3, '0917', '721200', '中国,陕西省,宝鸡市,陇县', 106.85900115966797, 34.89400100708008, 'Longxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2928, '610328', '千阳县', '610300', '千阳', 3, '0917', '721100', '中国,陕西省,宝鸡市,千阳县', 107.12999725341797, 34.6422004699707, 'Qianyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2929, '610329', '麟游县', '610300', '麟游', 3, '0917', '721500', '中国,陕西省,宝鸡市,麟游县', 107.7959976196289, 34.67839813232422, 'Linyou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2930, '610330', '凤县', '610300', '凤县', 3, '0917', '721700', '中国,陕西省,宝鸡市,凤县', 106.52400207519531, 33.91170120239258, 'Fengxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2931, '610331', '太白县', '610300', '太白', 3, '0917', '721600', '中国,陕西省,宝鸡市,太白县', 107.31600189208984, 34.06209945678711, 'Taibai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2932, '610400', '咸阳市', '610000', '咸阳', 2, '029', '712000', '中国,陕西省,咸阳市', 108.70500183105469, 34.33340072631836, 'Xianyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2933, '610402', '秦都区', '610400', '秦都', 3, '029', '712000', '中国,陕西省,咸阳市,秦都区', 108.71499633789062, 34.3380012512207, 'Qindu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2934, '610403', '杨陵区', '610400', '杨陵', 3, '029', '712100', '中国,陕西省,咸阳市,杨陵区', 108.08300018310547, 34.27040100097656, 'Yangling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2935, '610404', '渭城区', '610400', '渭城', 3, '029', '712000', '中国,陕西省,咸阳市,渭城区', 108.72200012207031, 34.332000732421875, 'Weicheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2936, '610422', '三原县', '610400', '三原', 3, '029', '713800', '中国,陕西省,咸阳市,三原县', 108.93199920654297, 34.6156005859375, 'Sanyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2937, '610423', '泾阳县', '610400', '泾阳', 3, '029', '713700', '中国,陕西省,咸阳市,泾阳县', 108.84300231933594, 34.527099609375, 'Jingyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2938, '610424', '乾县', '610400', '乾县', 3, '029', '713300', '中国,陕西省,咸阳市,乾县', 108.24199676513672, 34.52949905395508, 'Qianxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2939, '610425', '礼泉县', '610400', '礼泉', 3, '029', '713200', '中国,陕西省,咸阳市,礼泉县', 108.4260025024414, 34.48460006713867, 'Liquan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2940, '610426', '永寿县', '610400', '永寿', 3, '029', '713400', '中国,陕西省,咸阳市,永寿县', 108.1449966430664, 34.690799713134766, 'Yongshou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2941, '610427', '彬县', '610400', '彬县', 3, '029', '713500', '中国,陕西省,咸阳市,彬县', 108.08499908447266, 35.03419876098633, 'Binxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2942, '610428', '长武县', '610400', '长武', 3, '029', '713600', '中国,陕西省,咸阳市,长武县', 107.79499816894531, 35.20669937133789, 'Changwu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2943, '610429', '旬邑县', '610400', '旬邑', 3, '029', '711300', '中国,陕西省,咸阳市,旬邑县', 108.33399963378906, 35.113399505615234, 'Xunyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2944, '610430', '淳化县', '610400', '淳化', 3, '029', '711200', '中国,陕西省,咸阳市,淳化县', 108.58000183105469, 34.79890060424805, 'Chunhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2945, '610431', '武功县', '610400', '武功', 3, '029', '712200', '中国,陕西省,咸阳市,武功县', 108.2040023803711, 34.2599983215332, 'Wugong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2946, '610481', '兴平市', '610400', '兴平', 3, '029', '713100', '中国,陕西省,咸阳市,兴平市', 108.49099731445312, 34.29790115356445, 'Xingping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2947, '610500', '渭南市', '610000', '渭南', 2, '0913', '714000', '中国,陕西省,渭南市', 109.50299835205078, 34.4994010925293, 'Weinan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2948, '610502', '临渭区', '610500', '临渭', 3, '0913', '714000', '中国,陕西省,渭南市,临渭区', 109.49299621582031, 34.498199462890625, 'Linwei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2949, '610521', '华县', '610500', '华县', 3, '0913', '714100', '中国,陕西省,渭南市,华县', 109.77200317382812, 34.51259994506836, 'Huaxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2950, '610522', '潼关县', '610500', '潼关', 3, '0913', '714300', '中国,陕西省,渭南市,潼关县', 110.24400329589844, 34.54280090332031, 'Tongguan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2951, '610523', '大荔县', '610500', '大荔', 3, '0913', '715100', '中国,陕西省,渭南市,大荔县', 109.94200134277344, 34.79570007324219, 'Dali'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2952, '610524', '合阳县', '610500', '合阳', 3, '0913', '715300', '中国,陕西省,渭南市,合阳县', 110.14900207519531, 35.237998962402344, 'Heyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2953, '610525', '澄城县', '610500', '澄城', 3, '0913', '715200', '中国,陕西省,渭南市,澄城县', 109.93399810791016, 35.183998107910156, 'Chengcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2954, '610526', '蒲城县', '610500', '蒲城', 3, '0913', '715500', '中国,陕西省,渭南市,蒲城县', 109.58999633789062, 34.9567985534668, 'Pucheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2955, '610527', '白水县', '610500', '白水', 3, '0913', '715600', '中国,陕西省,渭南市,白水县', 109.59300231933594, 35.1786003112793, 'Baishui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2956, '610528', '富平县', '610500', '富平', 3, '0913', '711700', '中国,陕西省,渭南市,富平县', 109.18000030517578, 34.7510986328125, 'Fuping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2957, '610581', '韩城市', '610500', '韩城', 3, '0913', '715400', '中国,陕西省,渭南市,韩城市', 110.44200134277344, 35.47930145263672, 'Hancheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2958, '610582', '华阴市', '610500', '华阴', 3, '0913', '714200', '中国,陕西省,渭南市,华阴市', 110.08799743652344, 34.56610107421875, 'Huayin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2959, '610600', '延安市', '610000', '延安', 2, '0911', '716000', '中国,陕西省,延安市', 109.49099731445312, 36.596500396728516, 'Yan\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2960, '610602', '宝塔区', '610600', '宝塔', 3, '0911', '716000', '中国,陕西省,延安市,宝塔区', 109.49299621582031, 36.59149932861328, 'Baota'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2961, '610621', '延长县', '610600', '延长', 3, '0911', '717100', '中国,陕西省,延安市,延长县', 110.01100158691406, 36.57899856567383, 'Yanchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2962, '610622', '延川县', '610600', '延川', 3, '0911', '717200', '中国,陕西省,延安市,延川县', 110.19400024414062, 36.87820053100586, 'Yanchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2963, '610623', '子长县', '610600', '子长', 3, '0911', '717300', '中国,陕西省,延安市,子长县', 109.67500305175781, 37.14250183105469, 'Zichang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2964, '610624', '安塞县', '610600', '安塞', 3, '0911', '717400', '中国,陕西省,延安市,安塞县', 109.3270034790039, 36.8651008605957, 'Ansai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2965, '610625', '志丹县', '610600', '志丹', 3, '0911', '717500', '中国,陕西省,延安市,志丹县', 108.76799774169922, 36.821800231933594, 'Zhidan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2966, '610626', '吴起县', '610600', '吴起', 3, '0911', '717600', '中国,陕西省,延安市,吴起县', 108.1760025024414, 36.927799224853516, 'Wuqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2967, '610627', '甘泉县', '610600', '甘泉', 3, '0911', '716100', '中国,陕西省,延安市,甘泉县', 109.3499984741211, 36.27750015258789, 'Ganquan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2968, '610628', '富县', '610600', '富县', 3, '0911', '727500', '中国,陕西省,延安市,富县', 109.37899780273438, 35.987998962402344, 'Fuxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2969, '610629', '洛川县', '610600', '洛川', 3, '0911', '727400', '中国,陕西省,延安市,洛川县', 109.43299865722656, 35.760799407958984, 'Luochuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2970, '610630', '宜川县', '610600', '宜川', 3, '0911', '716200', '中国,陕西省,延安市,宜川县', 110.1719970703125, 36.047298431396484, 'Yichuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2971, '610631', '黄龙县', '610600', '黄龙', 3, '0911', '715700', '中国,陕西省,延安市,黄龙县', 109.84300231933594, 35.583499908447266, 'Huanglong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2972, '610632', '黄陵县', '610600', '黄陵', 3, '0911', '727300', '中国,陕西省,延安市,黄陵县', 109.26300048828125, 35.58359909057617, 'Huangling'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2973, '610700', '汉中市', '610000', '汉中', 2, '0916', '723000', '中国,陕西省,汉中市', 107.02899932861328, 33.077701568603516, 'Hanzhong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2974, '610702', '汉台区', '610700', '汉台', 3, '0916', '723000', '中国,陕西省,汉中市,汉台区', 107.03199768066406, 33.06769943237305, 'Hantai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2975, '610721', '南郑县', '610700', '南郑', 3, '0916', '723100', '中国,陕西省,汉中市,南郑县', 106.94000244140625, 33.00299835205078, 'Nanzheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2976, '610722', '城固县', '610700', '城固', 3, '0916', '723200', '中国,陕西省,汉中市,城固县', 107.33399963378906, 33.15660095214844, 'Chenggu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2977, '610723', '洋县', '610700', '洋县', 3, '0916', '723300', '中国,陕西省,汉中市,洋县', 107.5469970703125, 33.22100067138672, 'Yangxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2978, '610724', '西乡县', '610700', '西乡', 3, '0916', '723500', '中国,陕西省,汉中市,西乡县', 107.76899719238281, 32.984100341796875, 'Xixiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2979, '610725', '勉县', '610700', '勉县', 3, '0916', '724200', '中国,陕西省,汉中市,勉县', 106.6760025024414, 33.1526985168457, 'Mianxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2980, '610726', '宁强县', '610700', '宁强', 3, '0916', '724400', '中国,陕西省,汉中市,宁强县', 106.26000213623047, 32.828800201416016, 'Ningqiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2981, '610727', '略阳县', '610700', '略阳', 3, '0916', '724300', '中国,陕西省,汉中市,略阳县', 106.15399932861328, 33.330101013183594, 'Lueyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2982, '610728', '镇巴县', '610700', '镇巴', 3, '0916', '723600', '中国,陕西省,汉中市,镇巴县', 107.89600372314453, 32.5349006652832, 'Zhenba'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2983, '610729', '留坝县', '610700', '留坝', 3, '0916', '724100', '中国,陕西省,汉中市,留坝县', 106.9219970703125, 33.6161003112793, 'Liuba'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2984, '610730', '佛坪县', '610700', '佛坪', 3, '0916', '723400', '中国,陕西省,汉中市,佛坪县', 107.98999786376953, 33.525001525878906, 'Foping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2985, '610800', '榆林市', '610000', '榆林', 2, '0912', '719000', '中国,陕西省,榆林市', 109.74099731445312, 38.290199279785156, 'Yulin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2986, '610802', '榆阳区', '610800', '榆阳', 3, '0912', '719000', '中国,陕西省,榆林市,榆阳区', 109.73500061035156, 38.27840042114258, 'Yuyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2987, '610821', '神木县', '610800', '神木', 3, '0912', '719300', '中国,陕西省,榆林市,神木县', 110.4990005493164, 38.84230041503906, 'Shenmu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2988, '610822', '府谷县', '610800', '府谷', 3, '0912', '719400', '中国,陕西省,榆林市,府谷县', 111.06700134277344, 39.02799987792969, 'Fugu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2989, '610823', '横山县', '610800', '横山', 3, '0912', '719100', '中国,陕西省,榆林市,横山县', 109.2959976196289, 37.95800018310547, 'Hengshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2990, '610824', '靖边县', '610800', '靖边', 3, '0912', '718500', '中国,陕西省,榆林市,靖边县', 108.79399871826172, 37.59939956665039, 'Jingbian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2991, '610825', '定边县', '610800', '定边', 3, '0912', '718600', '中国,陕西省,榆林市,定边县', 107.5979995727539, 37.59040069580078, 'Dingbian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2992, '610826', '绥德县', '610800', '绥德', 3, '0912', '718000', '中国,陕西省,榆林市,绥德县', 110.26100158691406, 37.497798919677734, 'Suide'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2993, '610827', '米脂县', '610800', '米脂', 3, '0912', '718100', '中国,陕西省,榆林市,米脂县', 110.18399810791016, 37.75529861450195, 'Mizhi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2994, '610828', '佳县', '610800', '佳县', 3, '0912', '719200', '中国,陕西省,榆林市,佳县', 110.49400329589844, 38.022499084472656, 'Jiaxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2995, '610829', '吴堡县', '610800', '吴堡', 3, '0912', '718200', '中国,陕西省,榆林市,吴堡县', 110.74500274658203, 37.45709991455078, 'Wubu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2996, '610830', '清涧县', '610800', '清涧', 3, '0912', '718300', '中国,陕西省,榆林市,清涧县', 110.12200164794922, 37.0885009765625, 'Qingjian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2997, '610831', '子洲县', '610800', '子洲', 3, '0912', '718400', '中国,陕西省,榆林市,子洲县', 110.03500366210938, 37.61240005493164, 'Zizhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2998, '610900', '安康市', '610000', '安康', 2, '0915', '725000', '中国,陕西省,安康市', 109.02899932861328, 32.69029998779297, 'Ankang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (2999, '610902', '汉滨区', '610900', '汉滨', 3, '0915', '725000', '中国,陕西省,安康市,汉滨区', 109.0270004272461, 32.6952018737793, 'Hanbin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3000, '610921', '汉阴县', '610900', '汉阴', 3, '0915', '725100', '中国,陕西省,安康市,汉阴县', 108.51100158691406, 32.891300201416016, 'Hanyin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3001, '610922', '石泉县', '610900', '石泉', 3, '0915', '725200', '中国,陕西省,安康市,石泉县', 108.24800109863281, 33.03969955444336, 'Shiquan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3002, '610923', '宁陕县', '610900', '宁陕', 3, '0915', '711600', '中国,陕西省,安康市,宁陕县', 108.31500244140625, 33.317298889160156, 'Ningshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3003, '610924', '紫阳县', '610900', '紫阳', 3, '0915', '725300', '中国,陕西省,安康市,紫阳县', 108.53700256347656, 32.52109909057617, 'Ziyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3004, '610925', '岚皋县', '610900', '岚皋', 3, '0915', '725400', '中国,陕西省,安康市,岚皋县', 108.90299987792969, 32.307899475097656, 'Langao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3005, '610926', '平利县', '610900', '平利', 3, '0915', '725500', '中国,陕西省,安康市,平利县', 109.35800170898438, 32.3911018371582, 'Pingli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3006, '610927', '镇坪县', '610900', '镇坪', 3, '0915', '725600', '中国,陕西省,安康市,镇坪县', 109.5250015258789, 31.88330078125, 'Zhenping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3007, '610928', '旬阳县', '610900', '旬阳', 3, '0915', '725700', '中国,陕西省,安康市,旬阳县', 109.36199951171875, 32.83209991455078, 'Xunyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3008, '610929', '白河县', '610900', '白河', 3, '0915', '725800', '中国,陕西省,安康市,白河县', 110.11299896240234, 32.809600830078125, 'Baihe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3009, '611000', '商洛市', '610000', '商洛', 2, '0914', '726000', '中国,陕西省,商洛市', 109.94000244140625, 33.86830139160156, 'Shangluo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3010, '611002', '商州区', '611000', '商州', 3, '0914', '726000', '中国,陕西省,商洛市,商州区', 109.94100189208984, 33.862701416015625, 'Shangzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3011, '611021', '洛南县', '611000', '洛南', 3, '0914', '726100', '中国,陕西省,商洛市,洛南县', 110.14600372314453, 34.089900970458984, 'Luonan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3012, '611022', '丹凤县', '611000', '丹凤', 3, '0914', '726200', '中国,陕西省,商洛市,丹凤县', 110.33499908447266, 33.694698333740234, 'Danfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3013, '611023', '商南县', '611000', '商南', 3, '0914', '726300', '中国,陕西省,商洛市,商南县', 110.88400268554688, 33.52579879760742, 'Shangnan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3014, '611024', '山阳县', '611000', '山阳', 3, '0914', '726400', '中国,陕西省,商洛市,山阳县', 109.88800048828125, 33.529300689697266, 'Shanyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3015, '611025', '镇安县', '611000', '镇安', 3, '0914', '711500', '中国,陕西省,商洛市,镇安县', 109.15399932861328, 33.42369842529297, 'Zhen\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3016, '611026', '柞水县', '611000', '柞水', 3, '0914', '711400', '中国,陕西省,商洛市,柞水县', 109.11100006103516, 33.683101654052734, 'Zhashui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3017, '611100', '西咸新区', '610000', '西咸', 2, '029', '712000', '中国,陕西省,西咸新区', 108.81099700927734, 34.307098388671875, 'Xixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3018, '611101', '空港新城', '611100', '空港', 3, '0374', '461000', '中国,陕西省,西咸新区,空港新城', 108.76100158691406, 34.44089889526367, 'Konggang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3019, '611102', '沣东新城', '611100', '沣东', 3, '029', '710000', '中国,陕西省,西咸新区,沣东新城', 108.83000183105469, 34.267398834228516, 'Fengdong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3020, '611103', '秦汉新城', '611100', '秦汉', 3, '029', '712000', '中国,陕西省,西咸新区,秦汉新城', 108.83799743652344, 34.38650131225586, 'Qinhan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3021, '611104', '沣西新城', '611100', '沣西', 3, '029', '710000', '中国,陕西省,西咸新区,沣西新城', 108.71199798583984, 34.19049835205078, 'Fengxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3022, '611105', '泾河新城', '611100', '泾河', 3, '029', '713700', '中国,陕西省,西咸新区,泾河新城', 109.05000305175781, 34.460601806640625, 'Jinghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3023, '620000', '甘肃省', '100000', '甘肃', 1, '', '1', '中国,甘肃省', 103.8239974975586, 36.05799865722656, 'Gansu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3024, '620100', '兰州市', '620000', '兰州', 2, '0931', '730030', '中国,甘肃省,兰州市', 103.8239974975586, 36.05799865722656, 'Lanzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3025, '620102', '城关区', '620100', '城关', 3, '0931', '730030', '中国,甘肃省,兰州市,城关区', 103.82499694824219, 36.05730056762695, 'Chengguan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3026, '620103', '七里河区', '620100', '七里河', 3, '0931', '730050', '中国,甘肃省,兰州市,七里河区', 103.78600311279297, 36.065799713134766, 'Qilihe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3027, '620104', '西固区', '620100', '西固', 3, '0931', '730060', '中国,甘肃省,兰州市,西固区', 103.62799835205078, 36.088600158691406, 'Xigu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3028, '620105', '安宁区', '620100', '安宁', 3, '0931', '730070', '中国,甘肃省,兰州市,安宁区', 103.71900177001953, 36.10380172729492, 'Anning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3029, '620111', '红古区', '620100', '红古', 3, '0931', '730084', '中国,甘肃省,兰州市,红古区', 102.86000061035156, 36.345401763916016, 'Honggu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3030, '620121', '永登县', '620100', '永登', 3, '0931', '730300', '中国,甘肃省,兰州市,永登县', 103.26100158691406, 36.735198974609375, 'Yongdeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3031, '620122', '皋兰县', '620100', '皋兰', 3, '0931', '730200', '中国,甘肃省,兰州市,皋兰县', 103.94499969482422, 36.33209991455078, 'Gaolan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3032, '620123', '榆中县', '620100', '榆中', 3, '0931', '730100', '中国,甘肃省,兰州市,榆中县', 104.11499786376953, 35.844200134277344, 'Yuzhong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3033, '620200', '嘉峪关市', '620000', '嘉峪关', 2, '0937', '735100', '中国,甘肃省,嘉峪关市', 98.27729797363281, 39.7864990234375, 'Jiayuguan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3034, '620201', '雄关区', '620200', '雄关', 3, '0937', '735100', '中国,甘肃省,嘉峪关市,雄关区', 98.27739715576172, 39.779300689697266, 'Xiongguan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3035, '620202', '长城区', '620200', '长城', 3, '0937', '735106', '中国,甘肃省,嘉峪关市,长城区', 98.27349853515625, 39.78739929199219, 'Changcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3036, '620203', '镜铁区', '620200', '镜铁', 3, '0937', '735100', '中国,甘肃省,嘉峪关市,镜铁区', 98.27729797363281, 39.7864990234375, 'Jingtie'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3037, '620300', '金昌市', '620000', '金昌', 2, '0935', '737100', '中国,甘肃省,金昌市', 102.18800354003906, 38.514198303222656, 'Jinchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3038, '620302', '金川区', '620300', '金川', 3, '0935', '737100', '中国,甘肃省,金昌市,金川区', 102.19400024414062, 38.520999908447266, 'Jinchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3039, '620321', '永昌县', '620300', '永昌', 3, '0935', '737200', '中国,甘肃省,金昌市,永昌县', 101.97200012207031, 38.247100830078125, 'Yongchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3040, '620400', '白银市', '620000', '白银', 2, '0943', '730900', '中国,甘肃省,白银市', 104.17400360107422, 36.54570007324219, 'Baiyin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3041, '620402', '白银区', '620400', '白银', 3, '0943', '730900', '中国,甘肃省,白银市,白银区', 104.17400360107422, 36.54410171508789, 'Baiyin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3042, '620403', '平川区', '620400', '平川', 3, '0943', '730913', '中国,甘肃省,白银市,平川区', 104.82499694824219, 36.727699279785156, 'Pingchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3043, '620421', '靖远县', '620400', '靖远', 3, '0943', '730600', '中国,甘肃省,白银市,靖远县', 104.68299865722656, 36.566001892089844, 'Jingyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3044, '620422', '会宁县', '620400', '会宁', 3, '0943', '730700', '中国,甘肃省,白银市,会宁县', 105.0530014038086, 35.6963005065918, 'Huining'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3045, '620423', '景泰县', '620400', '景泰', 3, '0943', '730400', '中国,甘肃省,白银市,景泰县', 104.06300354003906, 37.18360137939453, 'Jingtai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3046, '620500', '天水市', '620000', '天水', 2, '0938', '741000', '中国,甘肃省,天水市', 105.7249984741211, 34.57849884033203, 'Tianshui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3047, '620502', '秦州区', '620500', '秦州', 3, '0938', '741000', '中国,甘肃省,天水市,秦州区', 105.7239990234375, 34.58089828491211, 'Qinzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3048, '620503', '麦积区', '620500', '麦积', 3, '0938', '741020', '中国,甘肃省,天水市,麦积区', 105.88999938964844, 34.570701599121094, 'Maiji'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3049, '620521', '清水县', '620500', '清水', 3, '0938', '741400', '中国,甘肃省,天水市,清水县', 106.13700103759766, 34.750301361083984, 'Qingshui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3050, '620522', '秦安县', '620500', '秦安', 3, '0938', '741600', '中国,甘肃省,天水市,秦安县', 105.66999816894531, 34.8588981628418, 'Qin\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3051, '620523', '甘谷县', '620500', '甘谷', 3, '0938', '741200', '中国,甘肃省,天水市,甘谷县', 105.33300018310547, 34.73659896850586, 'Gangu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3052, '620524', '武山县', '620500', '武山', 3, '0938', '741300', '中国,甘肃省,天水市,武山县', 104.88400268554688, 34.72119903564453, 'Wushan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3053, '620525', '张家川回族自治县', '620500', '张家川', 3, '0938', '741500', '中国,甘肃省,天水市,张家川回族自治县', 106.21600341796875, 34.99580001831055, 'Zhangjiachuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3054, '620600', '武威市', '620000', '武威', 2, '0935', '733000', '中国,甘肃省,武威市', 102.63500213623047, 37.93000030517578, 'Wuwei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3055, '620602', '凉州区', '620600', '凉州', 3, '0935', '733000', '中国,甘肃省,武威市,凉州区', 102.64199829101562, 37.92829895019531, 'Liangzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3056, '620621', '民勤县', '620600', '民勤', 3, '0935', '733300', '中国,甘肃省,武威市,民勤县', 103.08999633789062, 38.624900817871094, 'Minqin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3057, '620622', '古浪县', '620600', '古浪', 3, '0935', '733100', '中国,甘肃省,武威市,古浪县', 102.89199829101562, 37.4650993347168, 'Gulang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3058, '620623', '天祝藏族自治县', '620600', '天祝', 3, '0935', '733200', '中国,甘肃省,武威市,天祝藏族自治县', 103.13600158691406, 36.97710037231445, 'Tianzhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3059, '620700', '张掖市', '620000', '张掖', 2, '0936', '734000', '中国,甘肃省,张掖市', 100.45500183105469, 38.932899475097656, 'Zhangye'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3060, '620702', '甘州区', '620700', '甘州', 3, '0936', '734000', '中国,甘肃省,张掖市,甘州区', 100.4530029296875, 38.929500579833984, 'Ganzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3061, '620721', '肃南裕固族自治县', '620700', '肃南', 3, '0936', '734400', '中国,甘肃省,张掖市,肃南裕固族自治县', 99.61409759521484, 38.837799072265625, 'Sunan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3062, '620722', '民乐县', '620700', '民乐', 3, '0936', '734500', '中国,甘肃省,张掖市,民乐县', 100.81099700927734, 38.43479919433594, 'Minle'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3063, '620723', '临泽县', '620700', '临泽', 3, '0936', '734200', '中国,甘肃省,张掖市,临泽县', 100.16400146484375, 39.15250015258789, 'Linze'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3064, '620724', '高台县', '620700', '高台', 3, '0936', '734300', '中国,甘肃省,张掖市,高台县', 99.81919860839844, 39.378299713134766, 'Gaotai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3065, '620725', '山丹县', '620700', '山丹', 3, '0936', '734100', '中国,甘肃省,张掖市,山丹县', 101.09400177001953, 38.784698486328125, 'Shandan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3066, '620800', '平凉市', '620000', '平凉', 2, '0933', '744000', '中国,甘肃省,平凉市', 106.68499755859375, 35.54280090332031, 'Pingliang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3067, '620802', '崆峒区', '620800', '崆峒', 3, '0933', '744000', '中国,甘肃省,平凉市,崆峒区', 106.67500305175781, 35.542598724365234, 'Kongtong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3068, '620821', '泾川县', '620800', '泾川', 3, '0933', '744300', '中国,甘肃省,平凉市,泾川县', 107.36599731445312, 35.33219909667969, 'Jingchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3069, '620822', '灵台县', '620800', '灵台', 3, '0933', '744400', '中国,甘肃省,平凉市,灵台县', 107.61699676513672, 35.06769943237305, 'Lingtai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3070, '620823', '崇信县', '620800', '崇信', 3, '0933', '744200', '中国,甘肃省,平凉市,崇信县', 107.03700256347656, 35.30339813232422, 'Chongxin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3071, '620824', '华亭县', '620800', '华亭', 3, '0933', '744100', '中国,甘肃省,平凉市,华亭县', 106.65499877929688, 35.218299865722656, 'Huating'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3072, '620825', '庄浪县', '620800', '庄浪', 3, '0933', '744600', '中国,甘肃省,平凉市,庄浪县', 106.03700256347656, 35.20240020751953, 'Zhuanglang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3073, '620826', '静宁县', '620800', '静宁', 3, '0933', '743400', '中国,甘肃省,平凉市,静宁县', 105.72699737548828, 35.519901275634766, 'Jingning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3074, '620900', '酒泉市', '620000', '酒泉', 2, '0937', '735000', '中国,甘肃省,酒泉市', 98.51080322265625, 39.74399948120117, 'Jiuquan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3075, '620902', '肃州区', '620900', '肃州', 3, '0937', '735000', '中国,甘肃省,酒泉市,肃州区', 98.50779724121094, 39.74509811401367, 'Suzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3076, '620921', '金塔县', '620900', '金塔', 3, '0937', '735300', '中国,甘肃省,酒泉市,金塔县', 98.9000015258789, 39.977298736572266, 'Jinta'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3077, '620922', '瓜州县', '620900', '瓜州', 3, '0937', '736100', '中国,甘肃省,酒泉市,瓜州县', 95.78269958496094, 40.515499114990234, 'Guazhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3078, '620923', '肃北蒙古族自治县', '620900', '肃北', 3, '0937', '736300', '中国,甘肃省,酒泉市,肃北蒙古族自治县', 94.87650299072266, 39.51210021972656, 'Subei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3079, '620924', '阿克塞哈萨克族自治县', '620900', '阿克塞', 3, '0937', '736400', '中国,甘肃省,酒泉市,阿克塞哈萨克族自治县', 94.34100341796875, 39.634300231933594, 'Akesai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3080, '620981', '玉门市', '620900', '玉门', 3, '0937', '735200', '中国,甘肃省,酒泉市,玉门市', 97.04540252685547, 40.29169845581055, 'Yumen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3081, '620982', '敦煌市', '620900', '敦煌', 3, '0937', '736200', '中国,甘肃省,酒泉市,敦煌市', 94.6615982055664, 40.1421012878418, 'Dunhuang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3082, '621000', '庆阳市', '620000', '庆阳', 2, '0934', '745000', '中国,甘肃省,庆阳市', 107.63800048828125, 35.73419952392578, 'Qingyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3083, '621002', '西峰区', '621000', '西峰', 3, '0934', '745000', '中国,甘肃省,庆阳市,西峰区', 107.6510009765625, 35.7307014465332, 'Xifeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3084, '621021', '庆城县', '621000', '庆城', 3, '0934', '745100', '中国,甘肃省,庆阳市,庆城县', 107.88300323486328, 36.015098571777344, 'Qingcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3085, '621022', '环县', '621000', '环县', 3, '0934', '745700', '中国,甘肃省,庆阳市,环县', 107.30799865722656, 36.56850051879883, 'Huanxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3086, '621023', '华池县', '621000', '华池', 3, '0934', '745600', '中国,甘肃省,庆阳市,华池县', 107.98899841308594, 36.46110153198242, 'Huachi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3087, '621024', '合水县', '621000', '合水', 3, '0934', '745400', '中国,甘肃省,庆阳市,合水县', 108.0199966430664, 35.81909942626953, 'Heshui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3088, '621025', '正宁县', '621000', '正宁', 3, '0934', '745300', '中国,甘肃省,庆阳市,正宁县', 108.36000061035156, 35.49169921875, 'Zhengning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3089, '621026', '宁县', '621000', '宁县', 3, '0934', '745200', '中国,甘肃省,庆阳市,宁县', 107.92500305175781, 35.5015983581543, 'Ningxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3090, '621027', '镇原县', '621000', '镇原', 3, '0934', '744500', '中国,甘肃省,庆阳市,镇原县', 107.1989974975586, 35.677101135253906, 'Zhenyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3091, '621100', '定西市', '620000', '定西', 2, '0932', '743000', '中国,甘肃省,定西市', 104.6259994506836, 35.5796012878418, 'Dingxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3092, '621102', '安定区', '621100', '安定', 3, '0932', '743000', '中国,甘肃省,定西市,安定区', 104.61100006103516, 35.5806999206543, 'Anding'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3093, '621121', '通渭县', '621100', '通渭', 3, '0932', '743300', '中国,甘肃省,定西市,通渭县', 105.24199676513672, 35.21099853515625, 'Tongwei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3094, '621122', '陇西县', '621100', '陇西', 3, '0932', '748100', '中国,甘肃省,定西市,陇西县', 104.63400268554688, 35.00239944458008, 'Longxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3095, '621123', '渭源县', '621100', '渭源', 3, '0932', '748200', '中国,甘肃省,定西市,渭源县', 104.21399688720703, 35.13650131225586, 'Weiyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3096, '621124', '临洮县', '621100', '临洮', 3, '0932', '730500', '中国,甘肃省,定西市,临洮县', 103.86199951171875, 35.375099182128906, 'Lintao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3097, '621125', '漳县', '621100', '漳县', 3, '0932', '748300', '中国,甘肃省,定西市,漳县', 104.46700286865234, 34.84980010986328, 'Zhangxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3098, '621126', '岷县', '621100', '岷县', 3, '0932', '748400', '中国,甘肃省,定西市,岷县', 104.03800201416016, 34.43439865112305, 'Minxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3099, '621200', '陇南市', '620000', '陇南', 2, '0939', '746000', '中国,甘肃省,陇南市', 104.92900085449219, 33.38859939575195, 'Longnan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3100, '621202', '武都区', '621200', '武都', 3, '0939', '746000', '中国,甘肃省,陇南市,武都区', 104.927001953125, 33.392398834228516, 'Wudu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3101, '621221', '成县', '621200', '成县', 3, '0939', '742500', '中国,甘肃省,陇南市,成县', 105.72599792480469, 33.73929977416992, 'Chengxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3102, '621222', '文县', '621200', '文县', 3, '0939', '746400', '中国,甘肃省,陇南市,文县', 104.68399810791016, 32.94340133666992, 'Wenxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3103, '621223', '宕昌县', '621200', '宕昌', 3, '0939', '748500', '中国,甘肃省,陇南市,宕昌县', 104.39299774169922, 34.047298431396484, 'Dangchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3104, '621224', '康县', '621200', '康县', 3, '0939', '746500', '中国,甘肃省,陇南市,康县', 105.60700225830078, 33.3291015625, 'Kangxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3105, '621225', '西和县', '621200', '西和', 3, '0939', '742100', '中国,甘肃省,陇南市,西和县', 105.3010025024414, 34.01430130004883, 'Xihe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3106, '621226', '礼县', '621200', '礼县', 3, '0939', '742200', '中国,甘肃省,陇南市,礼县', 105.1780014038086, 34.18939971923828, 'Lixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3107, '621227', '徽县', '621200', '徽县', 3, '0939', '742300', '中国,甘肃省,陇南市,徽县', 106.08499908447266, 33.76900100708008, 'Huixian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3108, '621228', '两当县', '621200', '两当', 3, '0939', '742400', '中国,甘肃省,陇南市,两当县', 106.30500030517578, 33.90959930419922, 'Liangdang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3109, '622900', '临夏回族自治州', '620000', '临夏', 2, '0930', '731100', '中国,甘肃省,临夏回族自治州', 103.21199798583984, 35.59939956665039, 'Linxia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3110, '622901', '临夏市', '622900', '临夏', 3, '0930', '731100', '中国,甘肃省,临夏回族自治州,临夏市', 103.20999908447266, 35.59920120239258, 'Linxia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3111, '622921', '临夏县', '622900', '临夏', 3, '0930', '731800', '中国,甘肃省,临夏回族自治州,临夏县', 102.99400329589844, 35.495201110839844, 'Linxia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3112, '622922', '康乐县', '622900', '康乐', 3, '0930', '731500', '中国,甘肃省,临夏回族自治州,康乐县', 103.71099853515625, 35.37220001220703, 'Kangle'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3113, '622923', '永靖县', '622900', '永靖', 3, '0930', '731600', '中国,甘肃省,临夏回族自治州,永靖县', 103.31999969482422, 35.93840026855469, 'Yongjing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3114, '622924', '广河县', '622900', '广河', 3, '0930', '731300', '中国,甘肃省,临夏回族自治州,广河县', 103.56900024414062, 35.48099899291992, 'Guanghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3115, '622925', '和政县', '622900', '和政', 3, '0930', '731200', '中国,甘肃省,临夏回族自治州,和政县', 103.3489990234375, 35.425899505615234, 'Hezheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3116, '622926', '东乡族自治县', '622900', '东乡族', 3, '0930', '731400', '中国,甘肃省,临夏回族自治州,东乡族自治县', 103.3949966430664, 35.66469955444336, 'Dongxiangzu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3117, '622927', '积石山保安族东乡族撒拉族自治县', '622900', '积石山', 3, '0930', '731700', '中国,甘肃省,临夏回族自治州,积石山保安族东乡族撒拉族自治县', 102.8740005493164, 35.71820068359375, 'Jishishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3118, '623000', '甘南藏族自治州', '620000', '甘南', 2, '0941', '747000', '中国,甘肃省,甘南藏族自治州', 102.91100311279297, 34.98640060424805, 'Gannan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3119, '623001', '合作市', '623000', '合作', 3, '0941', '747000', '中国,甘肃省,甘南藏族自治州,合作市', 102.91100311279297, 35.00019836425781, 'Hezuo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3120, '623021', '临潭县', '623000', '临潭', 3, '0941', '747500', '中国,甘肃省,甘南藏族自治州,临潭县', 103.35299682617188, 34.695098876953125, 'Lintan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3121, '623022', '卓尼县', '623000', '卓尼', 3, '0941', '747600', '中国,甘肃省,甘南藏族自治州,卓尼县', 103.50800323486328, 34.58919906616211, 'Zhuoni'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3122, '623023', '舟曲县', '623000', '舟曲', 3, '0941', '746300', '中国,甘肃省,甘南藏族自治州,舟曲县', 104.37200164794922, 33.784698486328125, 'Zhouqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3123, '623024', '迭部县', '623000', '迭部', 3, '0941', '747400', '中国,甘肃省,甘南藏族自治州,迭部县', 103.2229995727539, 34.05619812011719, 'Diebu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3124, '623025', '玛曲县', '623000', '玛曲', 3, '0941', '747300', '中国,甘肃省,甘南藏族自治州,玛曲县', 102.07499694824219, 33.99700164794922, 'Maqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3125, '623026', '碌曲县', '623000', '碌曲', 3, '0941', '747200', '中国,甘肃省,甘南藏族自治州,碌曲县', 102.49199676513672, 34.58869934082031, 'Luqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3126, '623027', '夏河县', '623000', '夏河', 3, '0941', '747100', '中国,甘肃省,甘南藏族自治州,夏河县', 102.52200317382812, 35.204898834228516, 'Xiahe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3127, '630000', '青海省', '100000', '青海', 1, '', '1', '中国,青海省', 101.77899932861328, 36.623199462890625, 'Qinghai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3128, '630100', '西宁市', '630000', '西宁', 2, '0971', '810000', '中国,青海省,西宁市', 101.77899932861328, 36.623199462890625, 'Xining'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3129, '630102', '城东区', '630100', '城东', 3, '0971', '810007', '中国,青海省,西宁市,城东区', 101.80400085449219, 36.599700927734375, 'Chengdong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3130, '630103', '城中区', '630100', '城中', 3, '0971', '810000', '中国,青海省,西宁市,城中区', 101.78399658203125, 36.622798919677734, 'Chengzhong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3131, '630104', '城西区', '630100', '城西', 3, '0971', '810001', '中国,青海省,西宁市,城西区', 101.76599884033203, 36.628299713134766, 'Chengxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3132, '630105', '城北区', '630100', '城北', 3, '0971', '810003', '中国,青海省,西宁市,城北区', 101.76599884033203, 36.65010070800781, 'Chengbei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3133, '630121', '大通回族土族自治县', '630100', '大通', 3, '0971', '810100', '中国,青海省,西宁市,大通回族土族自治县', 101.7020034790039, 36.934898376464844, 'Datong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3134, '630122', '湟中县', '630100', '湟中', 3, '0971', '811600', '中国,青海省,西宁市,湟中县', 101.5719985961914, 36.50080108642578, 'Huangzhong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3135, '630123', '湟源县', '630100', '湟源', 3, '0971', '812100', '中国,青海省,西宁市,湟源县', 101.25599670410156, 36.68239974975586, 'Huangyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3136, '630200', '海东市', '630000', '海东', 2, '0972', '810700', '中国,青海省,海东市', 102.10299682617188, 36.502899169921875, 'Haidong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3137, '630202', '乐都区', '630200', '乐都', 3, '0972', '810700', '中国,青海省,海东市,乐都区', 102.4020004272461, 36.48030090332031, 'Ledu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3138, '630221', '平安县', '630200', '平安', 3, '0972', '810600', '中国,青海省,海东市,平安县', 102.10399627685547, 36.50270080566406, 'Ping\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3139, '630222', '民和回族土族自治县', '630200', '民和', 3, '0972', '810800', '中国,青海省,海东市,民和回族土族自治县', 102.80400085449219, 36.329498291015625, 'Minhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3140, '630223', '互助土族自治县', '630200', '互助', 3, '0972', '810500', '中国,青海省,海东市,互助土族自治县', 101.95700073242188, 36.839900970458984, 'Huzhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3141, '630224', '化隆回族自治县', '630200', '化隆', 3, '0972', '810900', '中国,青海省,海东市,化隆回族自治县', 102.26200103759766, 36.09830093383789, 'Hualong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3142, '630225', '循化撒拉族自治县', '630200', '循化', 3, '0972', '811100', '中国,青海省,海东市,循化撒拉族自治县', 102.48699951171875, 35.847198486328125, 'Xunhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3143, '632200', '海北藏族自治州', '630000', '海北', 2, '0970', '812200', '中国,青海省,海北藏族自治州', 100.9010009765625, 36.95940017700195, 'Haibei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3144, '632221', '门源回族自治县', '632200', '门源', 3, '0970', '810300', '中国,青海省,海北藏族自治州,门源回族自治县', 101.62200164794922, 37.3760986328125, 'Menyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3145, '632222', '祁连县', '632200', '祁连', 3, '0970', '810400', '中国,青海省,海北藏族自治州,祁连县', 100.24600219726562, 38.17900085449219, 'Qilian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3146, '632223', '海晏县', '632200', '海晏', 3, '0970', '812200', '中国,青海省,海北藏族自治州,海晏县', 100.99299621582031, 36.89899826049805, 'Haiyan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3147, '632224', '刚察县', '632200', '刚察', 3, '0970', '812300', '中国,青海省,海北藏族自治州,刚察县', 100.14700317382812, 37.32160186767578, 'Gangcha'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3148, '632300', '黄南藏族自治州', '630000', '黄南', 2, '0973', '811300', '中国,青海省,黄南藏族自治州', 102.0199966430664, 35.5177001953125, 'Huangnan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3149, '632321', '同仁县', '632300', '同仁', 3, '0973', '811300', '中国,青海省,黄南藏族自治州,同仁县', 102.01799774169922, 35.51599884033203, 'Tongren'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3150, '632322', '尖扎县', '632300', '尖扎', 3, '0973', '811200', '中国,青海省,黄南藏族自治州,尖扎县', 102.03399658203125, 35.93949890136719, 'Jianzha'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3151, '632323', '泽库县', '632300', '泽库', 3, '0973', '811400', '中国,青海省,黄南藏族自治州,泽库县', 101.46399688720703, 35.03519821166992, 'Zeku'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3152, '632324', '河南蒙古族自治县', '632300', '河南', 3, '0973', '811500', '中国,青海省,黄南藏族自治州,河南蒙古族自治县', 101.60900115966797, 34.734798431396484, 'Henan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3153, '632500', '海南藏族自治州', '630000', '海南', 2, '0974', '813000', '中国,青海省,海南藏族自治州', 100.62000274658203, 36.280399322509766, 'Hainan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3154, '632521', '共和县', '632500', '共和', 3, '0974', '813000', '中国,青海省,海南藏族自治州,共和县', 100.62000274658203, 36.28409957885742, 'Gonghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3155, '632522', '同德县', '632500', '同德', 3, '0974', '813200', '中国,青海省,海南藏族自治州,同德县', 100.5719985961914, 35.25490188598633, 'Tongde'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3156, '632523', '贵德县', '632500', '贵德', 3, '0974', '811700', '中国,青海省,海南藏族自治州,贵德县', 101.43199920654297, 36.04399871826172, 'Guide'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3157, '632524', '兴海县', '632500', '兴海', 3, '0974', '813300', '中国,青海省,海南藏族自治州,兴海县', 99.9885025024414, 35.590301513671875, 'Xinghai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3158, '632525', '贵南县', '632500', '贵南', 3, '0974', '813100', '中国,青海省,海南藏族自治州,贵南县', 100.74700164794922, 35.586700439453125, 'Guinan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3159, '632600', '果洛藏族自治州', '630000', '果洛', 2, '0975', '814000', '中国,青海省,果洛藏族自治州', 100.24199676513672, 34.47359848022461, 'Golog'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3160, '632621', '玛沁县', '632600', '玛沁', 3, '0975', '814000', '中国,青海省,果洛藏族自治州,玛沁县', 100.23899841308594, 34.477500915527344, 'Maqin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3161, '632622', '班玛县', '632600', '班玛', 3, '0975', '814300', '中国,青海省,果洛藏族自治州,班玛县', 100.73699951171875, 32.932498931884766, 'Banma'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3162, '632623', '甘德县', '632600', '甘德', 3, '0975', '814100', '中国,青海省,果洛藏族自治州,甘德县', 99.90249633789062, 33.96839904785156, 'Gande'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3163, '632624', '达日县', '632600', '达日', 3, '0975', '814200', '中国,青海省,果洛藏族自治州,达日县', 99.65180206298828, 33.75189971923828, 'Dari'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3164, '632625', '久治县', '632600', '久治', 3, '0975', '624700', '中国,青海省,果洛藏族自治州,久治县', 101.48300170898438, 33.429901123046875, 'Jiuzhi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3165, '632626', '玛多县', '632600', '玛多', 3, '0975', '813500', '中国,青海省,果洛藏族自治州,玛多县', 98.20999908447266, 34.91569900512695, 'Maduo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3166, '632700', '玉树藏族自治州', '630000', '玉树', 2, '0976', '815000', '中国,青海省,玉树藏族自治州', 97.00849914550781, 33.00400161743164, 'Yushu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3167, '632701', '玉树市', '632700', '玉树', 3, '0976', '815000', '中国,青海省,玉树藏族自治州,玉树市', 97.00879669189453, 33.00389862060547, 'Yushu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3168, '632722', '杂多县', '632700', '杂多', 3, '0976', '815300', '中国,青海省,玉树藏族自治州,杂多县', 95.29859924316406, 32.8931999206543, 'Zaduo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3169, '632723', '称多县', '632700', '称多', 3, '0976', '815100', '中国,青海省,玉树藏族自治州,称多县', 97.10790252685547, 33.36899948120117, 'Chenduo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3170, '632724', '治多县', '632700', '治多', 3, '0976', '815400', '中国,青海省,玉树藏族自治州,治多县', 95.6156997680664, 33.85279846191406, 'Zhiduo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3171, '632725', '囊谦县', '632700', '囊谦', 3, '0976', '815200', '中国,青海省,玉树藏族自治州,囊谦县', 96.47750091552734, 32.2036018371582, 'Nangqian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3172, '632726', '曲麻莱县', '632700', '曲麻莱', 3, '0976', '815500', '中国,青海省,玉树藏族自治州,曲麻莱县', 95.79759979248047, 34.1260986328125, 'Qumalai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3173, '632800', '海西蒙古族藏族自治州', '630000', '海西', 2, '0977', '817000', '中国,青海省,海西蒙古族藏族自治州', 97.37079620361328, 37.374698638916016, 'Haixi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3174, '632801', '格尔木市', '632800', '格尔木', 3, '0977', '816000', '中国,青海省,海西蒙古族藏族自治州,格尔木市', 94.9032974243164, 36.402400970458984, 'Geermu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3175, '632802', '德令哈市', '632800', '德令哈', 3, '0977', '817000', '中国,青海省,海西蒙古族藏族自治州,德令哈市', 97.36080169677734, 37.36949920654297, 'Delingha'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3176, '632821', '乌兰县', '632800', '乌兰', 3, '0977', '817100', '中国,青海省,海西蒙古族藏族自治州,乌兰县', 98.48200225830078, 36.93470001220703, 'Wulan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3177, '632822', '都兰县', '632800', '都兰', 3, '0977', '816100', '中国,青海省,海西蒙古族藏族自治州,都兰县', 98.09230041503906, 36.301300048828125, 'Dulan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3178, '632823', '天峻县', '632800', '天峻', 3, '0977', '817200', '中国,青海省,海西蒙古族藏族自治州,天峻县', 99.02449798583984, 37.30329895019531, 'Tianjun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3179, '640000', '宁夏', '100000', '宁夏', 1, '', '1', '中国,宁夏回族自治区', 106.27799987792969, 38.466400146484375, 'Ningxia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3180, '640100', '银川市', '640000', '银川', 2, '0951', '750004', '中国,宁夏回族自治区,银川市', 106.27799987792969, 38.466400146484375, 'Yinchuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3181, '640104', '兴庆区', '640100', '兴庆', 3, '0951', '750001', '中国,宁夏回族自治区,银川市,兴庆区', 106.28900146484375, 38.473899841308594, 'Xingqing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3182, '640105', '西夏区', '640100', '西夏', 3, '0951', '750021', '中国,宁夏回族自治区,银川市,西夏区', 106.1500015258789, 38.49140167236328, 'Xixia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3183, '640106', '金凤区', '640100', '金凤', 3, '0951', '750011', '中国,宁夏回族自治区,银川市,金凤区', 106.24299621582031, 38.472900390625, 'Jinfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3184, '640121', '永宁县', '640100', '永宁', 3, '0951', '750100', '中国,宁夏回族自治区,银川市,永宁县', 106.25199890136719, 38.27560043334961, 'Yongning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3185, '640122', '贺兰县', '640100', '贺兰', 3, '0951', '750200', '中国,宁夏回族自治区,银川市,贺兰县', 106.3499984741211, 38.55440139770508, 'Helan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3186, '640181', '灵武市', '640100', '灵武', 3, '0951', '750004', '中国,宁夏回族自治区,银川市,灵武市', 106.33999633789062, 38.102699279785156, 'Lingwu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3187, '640200', '石嘴山市', '640000', '石嘴山', 2, '0952', '753000', '中国,宁夏回族自治区,石嘴山市', 106.3759994506836, 39.013301849365234, 'Shizuishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3188, '640202', '大武口区', '640200', '大武口', 3, '0952', '753000', '中国,宁夏回族自治区,石嘴山市,大武口区', 106.37699890136719, 39.012298583984375, 'Dawukou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3189, '640205', '惠农区', '640200', '惠农', 3, '0952', '753600', '中国,宁夏回族自治区,石嘴山市,惠农区', 106.71099853515625, 39.131900787353516, 'Huinong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3190, '640221', '平罗县', '640200', '平罗', 3, '0952', '753400', '中国,宁夏回族自治区,石嘴山市,平罗县', 106.54499816894531, 38.904300689697266, 'Pingluo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3191, '640300', '吴忠市', '640000', '吴忠', 2, '0953', '751100', '中国,宁夏回族自治区,吴忠市', 106.1989974975586, 37.98619842529297, 'Wuzhong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3192, '640302', '利通区', '640300', '利通', 3, '0953', '751100', '中国,宁夏回族自治区,吴忠市,利通区', 106.2030029296875, 37.98509979248047, 'Litong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3193, '640303', '红寺堡区', '640300', '红寺堡', 3, '0953', '751900', '中国,宁夏回族自治区,吴忠市,红寺堡区', 106.197998046875, 37.997501373291016, 'Hongsibao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3194, '640323', '盐池县', '640300', '盐池', 3, '0953', '751500', '中国,宁夏回族自治区,吴忠市,盐池县', 107.40699768066406, 37.78329849243164, 'Yanchi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3195, '640324', '同心县', '640300', '同心', 3, '0953', '751300', '中国,宁夏回族自治区,吴忠市,同心县', 105.91400146484375, 36.981201171875, 'Tongxin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3196, '640381', '青铜峡市', '640300', '青铜峡', 3, '0953', '751600', '中国,宁夏回族自治区,吴忠市,青铜峡市', 106.07499694824219, 38.02000045776367, 'Qingtongxia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3197, '640400', '固原市', '640000', '固原', 2, '0954', '756000', '中国,宁夏回族自治区,固原市', 106.28500366210938, 36.004600524902344, 'Guyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3198, '640402', '原州区', '640400', '原州', 3, '0954', '756000', '中国,宁夏回族自治区,固原市,原州区', 106.28800201416016, 36.003700256347656, 'Yuanzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3199, '640422', '西吉县', '640400', '西吉', 3, '0954', '756200', '中国,宁夏回族自治区,固原市,西吉县', 105.73100280761719, 35.96620178222656, 'Xiji'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3200, '640423', '隆德县', '640400', '隆德', 3, '0954', '756300', '中国,宁夏回族自治区,固原市,隆德县', 106.1240005493164, 35.6171989440918, 'Longde'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3201, '640424', '泾源县', '640400', '泾源', 3, '0954', '756400', '中国,宁夏回族自治区,固原市,泾源县', 106.33899688720703, 35.490699768066406, 'Jingyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3202, '640425', '彭阳县', '640400', '彭阳', 3, '0954', '756500', '中国,宁夏回族自治区,固原市,彭阳县', 106.6449966430664, 35.850799560546875, 'Pengyang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3203, '640500', '中卫市', '640000', '中卫', 2, '0955', '751700', '中国,宁夏回族自治区,中卫市', 105.19000244140625, 37.51490020751953, 'Zhongwei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3204, '640502', '沙坡头区', '640500', '沙坡头', 3, '0955', '755000', '中国,宁夏回族自治区,中卫市,沙坡头区', 105.19000244140625, 37.510398864746094, 'Shapotou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3205, '640521', '中宁县', '640500', '中宁', 3, '0955', '751200', '中国,宁夏回族自治区,中卫市,中宁县', 105.68499755859375, 37.49150085449219, 'Zhongning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3206, '640522', '海原县', '640500', '海原', 3, '0955', '751800', '中国,宁夏回族自治区,中卫市,海原县', 105.64700317382812, 36.564998626708984, 'Haiyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3207, '650000', '新疆', '100000', '新疆', 1, '', '1', '中国,新疆维吾尔自治区', 87.6176986694336, 43.79280090332031, 'Xinjiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3208, '650100', '乌鲁木齐市', '650000', '乌鲁木齐', 2, '0991', '830002', '中国,新疆维吾尔自治区,乌鲁木齐市', 87.6176986694336, 43.79280090332031, 'Urumqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3209, '650102', '天山区', '650100', '天山', 3, '0991', '830002', '中国,新疆维吾尔自治区,乌鲁木齐市,天山区', 87.63169860839844, 43.79439926147461, 'Tianshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3210, '650103', '沙依巴克区', '650100', '沙依巴克', 3, '0991', '830000', '中国,新疆维吾尔自治区,乌鲁木齐市,沙依巴克区', 87.597900390625, 43.80120086669922, 'Shayibake'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3211, '650104', '新市区', '650100', '新市', 3, '0991', '830011', '中国,新疆维吾尔自治区,乌鲁木齐市,新市区', 87.5740966796875, 43.84349822998047, 'Xinshi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3212, '650105', '水磨沟区', '650100', '水磨沟', 3, '0991', '830017', '中国,新疆维吾尔自治区,乌鲁木齐市,水磨沟区', 87.64250183105469, 43.83250045776367, 'Shuimogou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3213, '650106', '头屯河区', '650100', '头屯河', 3, '0991', '830022', '中国,新疆维吾尔自治区,乌鲁木齐市,头屯河区', 87.29139709472656, 43.85490036010742, 'Toutunhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3214, '650107', '达坂城区', '650100', '达坂城', 3, '0991', '830039', '中国,新疆维吾尔自治区,乌鲁木齐市,达坂城区', 88.30699920654297, 43.358001708984375, 'Dabancheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3215, '650109', '米东区', '650100', '米东', 3, '0991', '830019', '中国,新疆维吾尔自治区,乌鲁木齐市,米东区', 87.68579864501953, 43.9473991394043, 'Midong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3216, '650121', '乌鲁木齐县', '650100', '乌鲁木齐', 3, '0991', '830063', '中国,新疆维吾尔自治区,乌鲁木齐市,乌鲁木齐县', 87.4094009399414, 43.47119903564453, 'Wulumuqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3217, '650200', '克拉玛依市', '650000', '克拉玛依', 2, '0990', '834000', '中国,新疆维吾尔自治区,克拉玛依市', 84.8739013671875, 45.59590148925781, 'Karamay'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3218, '650202', '独山子区', '650200', '独山子', 3, '0992', '834021', '中国,新疆维吾尔自治区,克拉玛依市,独山子区', 84.88670349121094, 44.32870101928711, 'Dushanzi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3219, '650203', '克拉玛依区', '650200', '克拉玛依', 3, '0990', '834000', '中国,新疆维吾尔自治区,克拉玛依市,克拉玛依区', 84.86229705810547, 45.59090042114258, 'Kelamayi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3220, '650204', '白碱滩区', '650200', '白碱滩', 3, '0990', '834008', '中国,新疆维吾尔自治区,克拉玛依市,白碱滩区', 85.13240051269531, 45.68769836425781, 'Baijiantan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3221, '650205', '乌尔禾区', '650200', '乌尔禾', 3, '0990', '834012', '中国,新疆维吾尔自治区,克拉玛依市,乌尔禾区', 85.69139862060547, 46.0900993347168, 'Wuerhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3222, '652100', '吐鲁番地区', '650000', '吐鲁番', 2, '0995', '838000', '中国,新疆维吾尔自治区,吐鲁番地区', 89.18409729003906, 42.947601318359375, 'Turpan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3223, '652101', '吐鲁番市', '652100', '吐鲁番', 3, '0995', '838000', '中国,新疆维吾尔自治区,吐鲁番地区,吐鲁番市', 89.18579864501953, 42.93510055541992, 'Tulufan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3224, '652122', '鄯善县', '652100', '鄯善', 3, '0995', '838200', '中国,新疆维吾尔自治区,吐鲁番地区,鄯善县', 90.21399688720703, 42.86349868774414, 'Shanshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3225, '652123', '托克逊县', '652100', '托克逊', 3, '0995', '838100', '中国,新疆维吾尔自治区,吐鲁番地区,托克逊县', 88.658203125, 42.792301177978516, 'Tuokexun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3226, '652200', '哈密地区', '650000', '哈密', 2, '0902', '839000', '中国,新疆维吾尔自治区,哈密地区', 93.51319885253906, 42.83319854736328, 'Hami'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3227, '652201', '哈密市', '652200', '哈密', 3, '0902', '839000', '中国,新疆维吾尔自治区,哈密地区,哈密市', 93.5145034790039, 42.82699966430664, 'Hami'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3228, '652222', '巴里坤哈萨克自治县', '652200', '巴里坤', 3, '0902', '839200', '中国,新疆维吾尔自治区,哈密地区,巴里坤哈萨克自治县', 93.01239776611328, 43.59989929199219, 'Balikun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3229, '652223', '伊吾县', '652200', '伊吾', 3, '0902', '839300', '中国,新疆维吾尔自治区,哈密地区,伊吾县', 94.69400024414062, 43.253700256347656, 'Yiwu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3230, '652300', '昌吉回族自治州', '650000', '昌吉', 2, '0994', '831100', '中国,新疆维吾尔自治区,昌吉回族自治州', 87.30400085449219, 44.01459884643555, 'Changji'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3231, '652301', '昌吉市', '652300', '昌吉', 3, '0994', '831100', '中国,新疆维吾尔自治区,昌吉回族自治州,昌吉市', 87.30249786376953, 44.012699127197266, 'Changji'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3232, '652302', '阜康市', '652300', '阜康', 3, '0994', '831500', '中国,新疆维吾尔自治区,昌吉回族自治州,阜康市', 87.98529815673828, 44.15840148925781, 'Fukang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3233, '652323', '呼图壁县', '652300', '呼图壁', 3, '0994', '831200', '中国,新疆维吾尔自治区,昌吉回族自治州,呼图壁县', 86.8989028930664, 44.18980026245117, 'Hutubi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3234, '652324', '玛纳斯县', '652300', '玛纳斯', 3, '0994', '832200', '中国,新疆维吾尔自治区,昌吉回族自治州,玛纳斯县', 86.2145004272461, 44.30440139770508, 'Manasi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3235, '652325', '奇台县', '652300', '奇台', 3, '0994', '831800', '中国,新疆维吾尔自治区,昌吉回族自治州,奇台县', 89.59320068359375, 44.02220153808594, 'Qitai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3236, '652327', '吉木萨尔县', '652300', '吉木萨尔', 3, '0994', '831700', '中国,新疆维吾尔自治区,昌吉回族自治州,吉木萨尔县', 89.18080139160156, 44.0004997253418, 'Jimusaer'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3237, '652328', '木垒哈萨克自治县', '652300', '木垒', 3, '0994', '831900', '中国,新疆维吾尔自治区,昌吉回族自治州,木垒哈萨克自治县', 90.28900146484375, 43.83509826660156, 'Mulei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3238, '652700', '博尔塔拉蒙古自治州', '650000', '博尔塔拉', 2, '0909', '833400', '中国,新疆维吾尔自治区,博尔塔拉蒙古自治州', 82.07479858398438, 44.90330123901367, 'Bortala'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3239, '652701', '博乐市', '652700', '博乐', 3, '0909', '833400', '中国,新疆维吾尔自治区,博尔塔拉蒙古自治州,博乐市', 82.07129669189453, 44.9005012512207, 'Bole'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3240, '652702', '阿拉山口市', '652700', '阿拉山口', 3, '0909', '833400', '中国,新疆维吾尔自治区,博尔塔拉蒙古自治州,阿拉山口市', 82.56770324707031, 45.17060089111328, 'Alashankou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3241, '652722', '精河县', '652700', '精河', 3, '0909', '833300', '中国,新疆维吾尔自治区,博尔塔拉蒙古自治州,精河县', 82.89420318603516, 44.60770034790039, 'Jinghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3242, '652723', '温泉县', '652700', '温泉', 3, '0909', '833500', '中国,新疆维吾尔自治区,博尔塔拉蒙古自治州,温泉县', 81.03130340576172, 44.97370147705078, 'Wenquan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3243, '652800', '巴音郭楞蒙古自治州', '650000', '巴音郭楞', 2, '0996', '841000', '中国,新疆维吾尔自治区,巴音郭楞蒙古自治州', 86.1510009765625, 41.76860046386719, 'Bayingol'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3244, '652801', '库尔勒市', '652800', '库尔勒', 3, '0996', '841000', '中国,新疆维吾尔自治区,巴音郭楞蒙古自治州,库尔勒市', 86.1552963256836, 41.76599884033203, 'Kuerle'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3245, '652822', '轮台县', '652800', '轮台', 3, '0996', '841600', '中国,新疆维吾尔自治区,巴音郭楞蒙古自治州,轮台县', 84.26100158691406, 41.77640151977539, 'Luntai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3246, '652823', '尉犁县', '652800', '尉犁', 3, '0996', '841500', '中国,新疆维吾尔自治区,巴音郭楞蒙古自治州,尉犁县', 86.25900268554688, 41.336299896240234, 'Yuli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3247, '652824', '若羌县', '652800', '若羌', 3, '0996', '841800', '中国,新疆维吾尔自治区,巴音郭楞蒙古自治州,若羌县', 88.16809844970703, 39.01789855957031, 'Ruoqiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3248, '652825', '且末县', '652800', '且末', 3, '0996', '841900', '中国,新疆维吾尔自治区,巴音郭楞蒙古自治州,且末县', 85.52970123291016, 38.145301818847656, 'Qiemo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3249, '652826', '焉耆回族自治县', '652800', '焉耆', 3, '0996', '841100', '中国,新疆维吾尔自治区,巴音郭楞蒙古自治州,焉耆回族自治县', 86.57440185546875, 42.058998107910156, 'Yanqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3250, '652827', '和静县', '652800', '和静', 3, '0996', '841300', '中国,新疆维吾尔自治区,巴音郭楞蒙古自治州,和静县', 86.39610290527344, 42.31840133666992, 'Hejing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3251, '652828', '和硕县', '652800', '和硕', 3, '0996', '841200', '中国,新疆维吾尔自治区,巴音郭楞蒙古自治州,和硕县', 86.86389923095703, 42.26810073852539, 'Heshuo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3252, '652829', '博湖县', '652800', '博湖', 3, '0996', '841400', '中国,新疆维吾尔自治区,巴音郭楞蒙古自治州,博湖县', 86.63330078125, 41.980098724365234, 'Bohu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3253, '652900', '阿克苏地区', '650000', '阿克苏', 2, '0997', '843000', '中国,新疆维吾尔自治区,阿克苏地区', 80.26509857177734, 41.17070007324219, 'Aksu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3254, '652901', '阿克苏市', '652900', '阿克苏', 3, '0997', '843000', '中国,新疆维吾尔自治区,阿克苏地区,阿克苏市', 80.26339721679688, 41.16749954223633, 'Akesu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3255, '652922', '温宿县', '652900', '温宿', 3, '0997', '843100', '中国,新疆维吾尔自治区,阿克苏地区,温宿县', 80.24169921875, 41.276798248291016, 'Wensu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3256, '652923', '库车县', '652900', '库车', 3, '0997', '842000', '中国,新疆维吾尔自治区,阿克苏地区,库车县', 82.96209716796875, 41.717899322509766, 'Kuche'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3257, '652924', '沙雅县', '652900', '沙雅', 3, '0997', '842200', '中国,新疆维吾尔自治区,阿克苏地区,沙雅县', 82.78130340576172, 41.224998474121094, 'Shaya'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3258, '652925', '新和县', '652900', '新和', 3, '0997', '842100', '中国,新疆维吾尔自治区,阿克苏地区,新和县', 82.6104965209961, 41.549598693847656, 'Xinhe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3259, '652926', '拜城县', '652900', '拜城', 3, '0997', '842300', '中国,新疆维吾尔自治区,阿克苏地区,拜城县', 81.87560272216797, 41.79800033569336, 'Baicheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3260, '652927', '乌什县', '652900', '乌什', 3, '0997', '843400', '中国,新疆维吾尔自治区,阿克苏地区,乌什县', 79.22940063476562, 41.2156982421875, 'Wushi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3261, '652928', '阿瓦提县', '652900', '阿瓦提', 3, '0997', '843200', '中国,新疆维吾尔自治区,阿克苏地区,阿瓦提县', 80.3833999633789, 40.63930130004883, 'Awati'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3262, '652929', '柯坪县', '652900', '柯坪', 3, '0997', '843600', '中国,新疆维吾尔自治区,阿克苏地区,柯坪县', 79.04750061035156, 40.50590133666992, 'Keping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3263, '653000', '克孜勒苏柯尔克孜自治州', '650000', '克孜勒苏', 2, '0908', '845350', '中国,新疆维吾尔自治区,克孜勒苏柯尔克孜自治州', 76.17279815673828, 39.713401794433594, 'Kizilsu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3264, '653001', '阿图什市', '653000', '阿图什', 3, '0908', '845350', '中国,新疆维吾尔自治区,克孜勒苏柯尔克孜自治州,阿图什市', 76.16829681396484, 39.71609878540039, 'Atushi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3265, '653022', '阿克陶县', '653000', '阿克陶', 3, '0908', '845550', '中国,新疆维吾尔自治区,克孜勒苏柯尔克孜自治州,阿克陶县', 75.9468994140625, 39.14889907836914, 'Aketao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3266, '653023', '阿合奇县', '653000', '阿合奇', 3, '0997', '843500', '中国,新疆维吾尔自治区,克孜勒苏柯尔克孜自治州,阿合奇县', 78.44850158691406, 40.93949890136719, 'Aheqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3267, '653024', '乌恰县', '653000', '乌恰', 3, '0908', '845450', '中国,新疆维吾尔自治区,克孜勒苏柯尔克孜自治州,乌恰县', 75.2583999633789, 39.71979904174805, 'Wuqia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3268, '653100', '喀什地区', '650000', '喀什', 2, '0998', '844000', '中国,新疆维吾尔自治区,喀什地区', 75.98909759521484, 39.46770095825195, 'Kashgar'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3269, '653101', '喀什市', '653100', '喀什', 3, '0998', '844000', '中国,新疆维吾尔自治区,喀什地区,喀什市', 75.9937973022461, 39.46770095825195, 'Kashi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3270, '653121', '疏附县', '653100', '疏附', 3, '0998', '844100', '中国,新疆维吾尔自治区,喀什地区,疏附县', 75.86029815673828, 39.375301361083984, 'Shufu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3271, '653122', '疏勒县', '653100', '疏勒', 3, '0998', '844200', '中国,新疆维吾尔自治区,喀什地区,疏勒县', 76.05400085449219, 39.40620040893555, 'Shule'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3272, '653123', '英吉沙县', '653100', '英吉沙', 3, '0998', '844500', '中国,新疆维吾尔自治区,喀什地区,英吉沙县', 76.17569732666016, 38.9296989440918, 'Yingjisha'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3273, '653124', '泽普县', '653100', '泽普', 3, '0998', '844800', '中国,新疆维吾尔自治区,喀什地区,泽普县', 77.27140045166016, 38.18939971923828, 'Zepu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3274, '653125', '莎车县', '653100', '莎车', 3, '0998', '844700', '中国,新疆维吾尔自治区,喀什地区,莎车县', 77.24320220947266, 38.41600036621094, 'Shache'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3275, '653126', '叶城县', '653100', '叶城', 3, '0998', '844900', '中国,新疆维吾尔自治区,喀什地区,叶城县', 77.4166030883789, 37.883201599121094, 'Yecheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3276, '653127', '麦盖提县', '653100', '麦盖提', 3, '0998', '844600', '中国,新疆维吾尔自治区,喀什地区,麦盖提县', 77.64219665527344, 38.89659881591797, 'Maigaiti'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3277, '653128', '岳普湖县', '653100', '岳普湖', 3, '0998', '844400', '中国,新疆维吾尔自治区,喀什地区,岳普湖县', 76.77230072021484, 39.235599517822266, 'Yuepuhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3278, '653129', '伽师县', '653100', '伽师', 3, '0998', '844300', '中国,新疆维吾尔自治区,喀什地区,伽师县', 76.72370147705078, 39.487998962402344, 'Jiashi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3279, '653130', '巴楚县', '653100', '巴楚', 3, '0998', '843800', '中国,新疆维吾尔自治区,喀什地区,巴楚县', 78.54889678955078, 39.785499572753906, 'Bachu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3280, '653131', '塔什库尔干塔吉克自治县', '653100', '塔什库尔干塔吉克', 3, '0998', '845250', '中国,新疆维吾尔自治区,喀什地区,塔什库尔干塔吉克自治县', 75.23200225830078, 37.778900146484375, 'Tashikuergantajike'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3281, '653200', '和田地区', '650000', '和田', 2, '0903', '848000', '中国,新疆维吾尔自治区,和田地区', 79.92530059814453, 37.11069869995117, 'Hotan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3282, '653201', '和田市', '653200', '和田市', 3, '0903', '848000', '中国,新疆维吾尔自治区,和田地区,和田市', 79.91349792480469, 37.112098693847656, 'Hetianshi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3283, '653221', '和田县', '653200', '和田县', 3, '0903', '848000', '中国,新疆维吾尔自治区,和田地区,和田县', 79.82869720458984, 37.08919906616211, 'Hetianxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3284, '653222', '墨玉县', '653200', '墨玉', 3, '0903', '848100', '中国,新疆维吾尔自治区,和田地区,墨玉县', 79.74030303955078, 37.272499084472656, 'Moyu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3285, '653223', '皮山县', '653200', '皮山', 3, '0903', '845150', '中国,新疆维吾尔自治区,和田地区,皮山县', 78.28119659423828, 37.62009811401367, 'Pishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3286, '653224', '洛浦县', '653200', '洛浦', 3, '0903', '848200', '中国,新疆维吾尔自治区,和田地区,洛浦县', 80.1854019165039, 37.07360076904297, 'Luopu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3287, '653225', '策勒县', '653200', '策勒', 3, '0903', '848300', '中国,新疆维吾尔自治区,和田地区,策勒县', 80.80999755859375, 36.9984016418457, 'Cele'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3288, '653226', '于田县', '653200', '于田', 3, '0903', '848400', '中国,新疆维吾尔自治区,和田地区,于田县', 81.66719818115234, 36.854000091552734, 'Yutian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3289, '653227', '民丰县', '653200', '民丰', 3, '0903', '848500', '中国,新疆维吾尔自治区,和田地区,民丰县', 82.68440246582031, 37.065799713134766, 'Minfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3290, '654000', '伊犁哈萨克自治州', '650000', '伊犁', 2, '0999', '835100', '中国,新疆维吾尔自治区,伊犁哈萨克自治州', 81.31790161132812, 43.92190170288086, 'Ili'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3291, '654002', '伊宁市', '654000', '伊宁', 3, '0999', '835000', '中国,新疆维吾尔自治区,伊犁哈萨克自治州,伊宁市', 81.32929992675781, 43.912899017333984, 'Yining'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3292, '654003', '奎屯市', '654000', '奎屯', 3, '0992', '833200', '中国,新疆维吾尔自治区,伊犁哈萨克自治州,奎屯市', 84.90229797363281, 44.42499923706055, 'Kuitun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3293, '654004', '霍尔果斯市', '654000', '霍尔果斯', 3, '0999', '835221', '中国,新疆维吾尔自治区,伊犁哈萨克自治州,霍尔果斯市', 80.41819763183594, 44.2057991027832, 'Huoerguosi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3294, '654021', '伊宁县', '654000', '伊宁', 3, '0999', '835100', '中国,新疆维吾尔自治区,伊犁哈萨克自治州,伊宁县', 81.52760314941406, 43.978599548339844, 'Yining'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3295, '654022', '察布查尔锡伯自治县', '654000', '察布查尔锡伯', 3, '0999', '835300', '中国,新疆维吾尔自治区,伊犁哈萨克自治州,察布查尔锡伯自治县', 81.14959716796875, 43.8401985168457, 'Chabuchaerxibo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3296, '654023', '霍城县', '654000', '霍城', 3, '0999', '835200', '中国,新疆维吾尔自治区,伊犁哈萨克自治州,霍城县', 80.87830352783203, 44.05329895019531, 'Huocheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3297, '654024', '巩留县', '654000', '巩留', 3, '0999', '835400', '中国,新疆维吾尔自治区,伊犁哈萨克自治州,巩留县', 82.22850036621094, 43.48429870605469, 'Gongliu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3298, '654025', '新源县', '654000', '新源', 3, '0999', '835800', '中国,新疆维吾尔自治区,伊犁哈萨克自治州,新源县', 83.26090240478516, 43.42839813232422, 'Xinyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3299, '654026', '昭苏县', '654000', '昭苏', 3, '0999', '835600', '中国,新疆维吾尔自治区,伊犁哈萨克自治州,昭苏县', 81.13069915771484, 43.15829849243164, 'Zhaosu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3300, '654027', '特克斯县', '654000', '特克斯', 3, '0999', '835500', '中国,新疆维吾尔自治区,伊犁哈萨克自治州,特克斯县', 81.83999633789062, 43.219398498535156, 'Tekesi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3301, '654028', '尼勒克县', '654000', '尼勒克', 3, '0999', '835700', '中国,新疆维吾尔自治区,伊犁哈萨克自治州,尼勒克县', 82.51180267333984, 43.79899978637695, 'Nileke'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3302, '654200', '塔城地区', '650000', '塔城', 2, '0901', '834700', '中国,新疆维吾尔自治区,塔城地区', 82.98570251464844, 46.746299743652344, 'Qoqek'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3303, '654201', '塔城市', '654200', '塔城', 3, '0901', '834700', '中国,新疆维吾尔自治区,塔城地区,塔城市', 82.97889709472656, 46.74850082397461, 'Tacheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3304, '654202', '乌苏市', '654200', '乌苏', 3, '0992', '833000', '中国,新疆维吾尔自治区,塔城地区,乌苏市', 84.68260192871094, 44.43730163574219, 'Wusu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3305, '654221', '额敏县', '654200', '额敏', 3, '0901', '834600', '中国,新疆维吾尔自治区,塔城地区,额敏县', 83.62870025634766, 46.52840042114258, 'Emin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3306, '654223', '沙湾县', '654200', '沙湾', 3, '0993', '832100', '中国,新疆维吾尔自治区,塔城地区,沙湾县', 85.61930084228516, 44.33140182495117, 'Shawan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3307, '654224', '托里县', '654200', '托里', 3, '0901', '834500', '中国,新疆维吾尔自治区,塔城地区,托里县', 83.60590362548828, 45.93619918823242, 'Tuoli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3308, '654225', '裕民县', '654200', '裕民', 3, '0901', '834800', '中国,新疆维吾尔自治区,塔城地区,裕民县', 82.98999786376953, 46.203800201416016, 'Yumin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3309, '654226', '和布克赛尔蒙古自治县', '654200', '和布克赛尔', 3, '0990', '834400', '中国,新疆维吾尔自治区,塔城地区,和布克赛尔蒙古自治县', 85.72660064697266, 46.79359817504883, 'Hebukesaier'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3310, '654300', '阿勒泰地区', '650000', '阿勒泰', 2, '0906', '836500', '中国,新疆维吾尔自治区,阿勒泰地区', 88.13960266113281, 47.8484001159668, 'Altay'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3311, '654301', '阿勒泰市', '654300', '阿勒泰', 3, '0906', '836500', '中国,新疆维吾尔自治区,阿勒泰地区,阿勒泰市', 88.13909912109375, 47.83169937133789, 'Aletai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3312, '654321', '布尔津县', '654300', '布尔津', 3, '0906', '836600', '中国,新疆维吾尔自治区,阿勒泰地区,布尔津县', 86.85749816894531, 47.700599670410156, 'Buerjin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3313, '654322', '富蕴县', '654300', '富蕴', 3, '0906', '836100', '中国,新疆维吾尔自治区,阿勒泰地区,富蕴县', 89.52680206298828, 46.99440002441406, 'Fuyun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3314, '654323', '福海县', '654300', '福海', 3, '0906', '836400', '中国,新疆维吾尔自治区,阿勒泰地区,福海县', 87.49510192871094, 47.110599517822266, 'Fuhai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3315, '654324', '哈巴河县', '654300', '哈巴河', 3, '0906', '836700', '中国,新疆维吾尔自治区,阿勒泰地区,哈巴河县', 86.4208984375, 48.06050109863281, 'Habahe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3316, '654325', '青河县', '654300', '青河', 3, '0906', '836200', '中国,新疆维吾尔自治区,阿勒泰地区,青河县', 90.38300323486328, 46.67380142211914, 'Qinghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3317, '654326', '吉木乃县', '654300', '吉木乃', 3, '0906', '836800', '中国,新疆维吾尔自治区,阿勒泰地区,吉木乃县', 85.87809753417969, 47.43360137939453, 'Jimunai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3318, '659000', '直辖县级', '650000', ' ', 2, '', '', '中国,新疆维吾尔自治区,直辖县级', 91.1322021484375, 29.660400390625, ''); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3319, '659001', '石河子市', '659000', '石河子', 3, '0993', '832000', '中国,新疆维吾尔自治区,直辖县级,石河子市', 86.04109954833984, 44.30590057373047, 'Shihezi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3320, '659002', '阿拉尔市', '659000', '阿拉尔', 3, '0997', '843300', '中国,新疆维吾尔自治区,直辖县级,阿拉尔市', 81.28589630126953, 40.541900634765625, 'Aral'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3321, '659003', '图木舒克市', '659000', '图木舒克', 3, '0998', '843806', '中国,新疆维吾尔自治区,直辖县级,图木舒克市', 79.0780029296875, 39.8672981262207, 'Tumxuk'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3322, '659004', '五家渠市', '659000', '五家渠', 3, '0994', '831300', '中国,新疆维吾尔自治区,直辖县级,五家渠市', 87.52690124511719, 44.16740036010742, 'Wujiaqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3323, '659005', '北屯市', '659000', '北屯', 3, '0906', '836000', '中国,新疆维吾尔自治区,直辖县级,北屯市', 87.80850219726562, 47.362300872802734, 'Beitun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3324, '659006', '铁门关市', '659000', '铁门关', 3, '0906', '836000', '中国,新疆维吾尔自治区,直辖县级,铁门关市', 86.1947021484375, 41.81100082397461, 'Tiemenguan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3325, '659007', '双河市', '659000', '双河', 3, '0909', '833408', '中国,新疆维吾尔自治区,直辖县级,双河市', 91.1322021484375, 29.660400390625, 'Shuanghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3326, '-710000', '台湾', '-100000', '台湾', 1, '', '1', '中国,台湾', 121.50900268554688, 25.044300079345703, 'Taiwan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3327, '710100', '台北市', '710000', '台北', 2, '02', '1', '中国,台湾,台北市', 121.56500244140625, 25.037799835205078, 'Taipei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3328, '710101', '松山区', '710100', '松山', 3, '02', '105', '中国,台湾,台北市,松山区', 121.5770034790039, 25.049699783325195, 'Songshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3329, '710102', '信义区', '710100', '信义', 3, '02', '110', '中国,台湾,台北市,信义区', 121.7509994506836, 25.1294002532959, 'Xinyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3330, '710103', '大安区', '710100', '大安', 3, '02', '106', '中国,台湾,台北市,大安区', 121.53500366210938, 25.026399612426758, 'Da\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3331, '710104', '中山区', '710100', '中山', 3, '02', '104', '中国,台湾,台北市,中山区', 121.53299713134766, 25.06439971923828, 'Zhongshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3332, '710105', '中正区', '710100', '中正', 3, '02', '100', '中国,台湾,台北市,中正区', 121.51799774169922, 25.032400131225586, 'Zhongzheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3333, '710106', '大同区', '710100', '大同', 3, '02', '103', '中国,台湾,台北市,大同区', 121.51599884033203, 25.06599998474121, 'Datong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3334, '710107', '万华区', '710100', '万华', 3, '02', '108', '中国,台湾,台北市,万华区', 121.4990005493164, 25.03190040588379, 'Wanhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3335, '710108', '文山区', '710100', '文山', 3, '02', '116', '中国,台湾,台北市,文山区', 121.56999969482422, 24.98979949951172, 'Wenshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3336, '710109', '南港区', '710100', '南港', 3, '02', '115', '中国,台湾,台北市,南港区', 121.60700225830078, 25.05470085144043, 'Nangang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3337, '710110', '内湖区', '710100', '内湖', 3, '02', '114', '中国,台湾,台北市,内湖区', 121.58899688720703, 25.069700241088867, 'Nahu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3338, '710111', '士林区', '710100', '士林', 3, '02', '111', '中国,台湾,台北市,士林区', 121.5199966430664, 25.09280014038086, 'Shilin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3339, '710112', '北投区', '710100', '北投', 3, '02', '112', '中国,台湾,台北市,北投区', 121.5009994506836, 25.132400512695312, 'Beitou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3340, '710200', '高雄市', '710000', '高雄', 2, '07', '8', '中国,台湾,高雄市', 120.31199645996094, 22.620899200439453, 'Kaohsiung'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3341, '710201', '盐埕区', '710200', '盐埕', 3, '07', '803', '中国,台湾,高雄市,盐埕区', 120.28700256347656, 22.62470054626465, 'Yancheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3342, '710202', '鼓山区', '710200', '鼓山', 3, '07', '804', '中国,台湾,高雄市,鼓山区', 120.28099822998047, 22.63680076599121, 'Gushan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3343, '710203', '左营区', '710200', '左营', 3, '07', '813', '中国,台湾,高雄市,左营区', 120.29499816894531, 22.690099716186523, 'Zuoying'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3344, '710204', '楠梓区', '710200', '楠梓', 3, '07', '811', '中国,台湾,高雄市,楠梓区', 120.32599639892578, 22.7283992767334, 'Nanzi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3345, '710205', '三民区', '710200', '三民', 3, '07', '807', '中国,台湾,高雄市,三民区', 120.30000305175781, 22.6476993560791, 'Sanmin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3346, '710206', '新兴区', '710200', '新兴', 3, '07', '800', '中国,台湾,高雄市,新兴区', 120.30999755859375, 22.631099700927734, 'Xinxing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3347, '710207', '前金区', '710200', '前金', 3, '07', '801', '中国,台湾,高雄市,前金区', 120.29399871826172, 22.627399444580078, 'Qianjin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3348, '710208', '苓雅区', '710200', '苓雅', 3, '07', '802', '中国,台湾,高雄市,苓雅区', 120.31199645996094, 22.62179946899414, 'Lingya'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3349, '710209', '前镇区', '710200', '前镇', 3, '07', '806', '中国,台湾,高雄市,前镇区', 120.31900024414062, 22.58639907836914, 'Qianzhen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3350, '710210', '旗津区', '710200', '旗津', 3, '07', '805', '中国,台湾,高雄市,旗津区', 120.28399658203125, 22.590599060058594, 'Qijin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3351, '710211', '小港区', '710200', '小港', 3, '07', '812', '中国,台湾,高雄市,小港区', 120.33799743652344, 22.565399169921875, 'Xiaogang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3352, '710212', '凤山区', '710200', '凤山', 3, '07', '830', '中国,台湾,高雄市,凤山区', 120.35700225830078, 22.62689971923828, 'Fengshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3353, '710213', '林园区', '710200', '林园', 3, '07', '832', '中国,台湾,高雄市,林园区', 120.39600372314453, 22.50149917602539, 'Linyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3354, '710214', '大寮区', '710200', '大寮', 3, '07', '831', '中国,台湾,高雄市,大寮区', 120.3949966430664, 22.60540008544922, 'Daliao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3355, '710215', '大树区', '710200', '大树', 3, '07', '840', '中国,台湾,高雄市,大树区', 120.43299865722656, 22.69339942932129, 'Dashu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3356, '710216', '大社区', '710200', '大社', 3, '07', '815', '中国,台湾,高雄市,大社区', 120.34700012207031, 22.729999542236328, 'Dashe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3357, '710217', '仁武区', '710200', '仁武', 3, '07', '814', '中国,台湾,高雄市,仁武区', 120.3479995727539, 22.701900482177734, 'Renwu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3358, '710218', '鸟松区', '710200', '鸟松', 3, '07', '833', '中国,台湾,高雄市,鸟松区', 120.36399841308594, 22.659299850463867, 'Niaosong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3359, '710219', '冈山区', '710200', '冈山', 3, '07', '820', '中国,台湾,高雄市,冈山区', 120.2959976196289, 22.79680061340332, 'Gangshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3360, '710220', '桥头区', '710200', '桥头', 3, '07', '825', '中国,台湾,高雄市,桥头区', 120.30599975585938, 22.75749969482422, 'Qiaotou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3361, '710221', '燕巢区', '710200', '燕巢', 3, '07', '824', '中国,台湾,高雄市,燕巢区', 120.36199951171875, 22.793399810791016, 'Yanchao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3362, '710222', '田寮区', '710200', '田寮', 3, '07', '823', '中国,台湾,高雄市,田寮区', 120.36000061035156, 22.869300842285156, 'Tianliao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3363, '710223', '阿莲区', '710200', '阿莲', 3, '07', '822', '中国,台湾,高雄市,阿莲区', 120.3270034790039, 22.883699417114258, 'Alian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3364, '710224', '路竹区', '710200', '路竹', 3, '07', '821', '中国,台湾,高雄市,路竹区', 120.26200103759766, 22.85689926147461, 'Luzhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3365, '710225', '湖内区', '710200', '湖内', 3, '07', '829', '中国,台湾,高雄市,湖内区', 120.21199798583984, 22.908199310302734, 'Huna'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3366, '710226', '茄萣区', '710200', '茄萣', 3, '07', '852', '中国,台湾,高雄市,茄萣区', 120.18299865722656, 22.906600952148438, 'Qieding'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3367, '710227', '永安区', '710200', '永安', 3, '07', '828', '中国,台湾,高雄市,永安区', 120.2249984741211, 22.818599700927734, 'Yong\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3368, '710228', '弥陀区', '710200', '弥陀', 3, '07', '827', '中国,台湾,高雄市,弥陀区', 120.24700164794922, 22.782899856567383, 'Mituo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3369, '710229', '梓官区', '710200', '梓官', 3, '07', '826', '中国,台湾,高雄市,梓官区', 120.26699829101562, 22.760499954223633, 'Ziguan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3370, '710230', '旗山区', '710200', '旗山', 3, '07', '842', '中国,台湾,高雄市,旗山区', 120.48400115966797, 22.888500213623047, 'Qishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3371, '710231', '美浓区', '710200', '美浓', 3, '07', '843', '中国,台湾,高雄市,美浓区', 120.54199981689453, 22.897899627685547, 'Meinong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3372, '710232', '六龟区', '710200', '六龟', 3, '07', '844', '中国,台湾,高雄市,六龟区', 120.63300323486328, 22.997900009155273, 'Liugui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3373, '710233', '甲仙区', '710200', '甲仙', 3, '07', '847', '中国,台湾,高雄市,甲仙区', 120.59100341796875, 23.084699630737305, 'Jiaxian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3374, '710234', '杉林区', '710200', '杉林', 3, '07', '846', '中国,台湾,高雄市,杉林区', 120.53900146484375, 22.970699310302734, 'Shanlin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3375, '710235', '内门区', '710200', '内门', 3, '07', '845', '中国,台湾,高雄市,内门区', 120.46199798583984, 22.94339942932129, 'Namen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3376, '710236', '茂林区', '710200', '茂林', 3, '07', '851', '中国,台湾,高雄市,茂林区', 120.66300201416016, 22.886199951171875, 'Maolin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3377, '710237', '桃源区', '710200', '桃源', 3, '07', '848', '中国,台湾,高雄市,桃源区', 120.76000213623047, 23.159099578857422, 'Taoyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3378, '710238', '那玛夏区', '710200', '那玛夏', 3, '07', '849', '中国,台湾,高雄市,那玛夏区', 120.69300079345703, 23.216999053955078, 'Namaxia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3379, '710300', '基隆市', '710000', '基隆', 2, '02', '2', '中国,台湾,基隆市', 121.74600219726562, 25.130699157714844, 'Keelung'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3380, '710301', '中正区', '710300', '中正', 3, '02', '202', '中国,台湾,基隆市,中正区', 121.51799774169922, 25.032400131225586, 'Zhongzheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3381, '710302', '七堵区', '710300', '七堵', 3, '02', '206', '中国,台湾,基隆市,七堵区', 121.71299743652344, 25.095699310302734, 'Qidu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3382, '710303', '暖暖区', '710300', '暖暖', 3, '02', '205', '中国,台湾,基隆市,暖暖区', 121.73600006103516, 25.09980010986328, 'Nuannuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3383, '710304', '仁爱区', '710300', '仁爱', 3, '02', '200', '中国,台湾,基隆市,仁爱区', 121.74099731445312, 25.127500534057617, 'Renai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3384, '710305', '中山区', '710300', '中山', 3, '02', '203', '中国,台湾,基隆市,中山区', 121.73899841308594, 25.134000778198242, 'Zhongshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3385, '710306', '安乐区', '710300', '安乐', 3, '02', '204', '中国,台湾,基隆市,安乐区', 121.7229995727539, 25.120899200439453, 'Anle'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3386, '710307', '信义区', '710300', '信义', 3, '02', '201', '中国,台湾,基隆市,信义区', 121.7509994506836, 25.1294002532959, 'Xinyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3387, '710400', '台中市', '710000', '台中', 2, '04', '4', '中国,台湾,台中市', 120.67900085449219, 24.138599395751953, 'Taichung'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3388, '710401', '中区', '710400', '中区', 3, '04', '400', '中国,台湾,台中市,中区', 120.68000030517578, 24.143800735473633, 'Zhongqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3389, '710402', '东区', '710400', '东区', 3, '04', '401', '中国,台湾,台中市,东区', 120.7040023803711, 24.136600494384766, 'Dongqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3390, '710403', '南区', '710400', '南区', 3, '04', '402', '中国,台湾,台中市,南区', 120.18900299072266, 22.960899353027344, 'Nanqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3391, '710404', '西区', '710400', '西区', 3, '04', '403', '中国,台湾,台中市,西区', 120.6709976196289, 24.141399383544922, 'Xiqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3392, '710405', '北区', '710400', '北区', 3, '04', '404', '中国,台湾,台中市,北区', 120.68199920654297, 24.166000366210938, 'Beiqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3393, '710406', '西屯区', '710400', '西屯', 3, '04', '407', '中国,台湾,台中市,西屯区', 120.63999938964844, 24.181299209594727, 'Xitun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3394, '710407', '南屯区', '710400', '南屯', 3, '04', '408', '中国,台湾,台中市,南屯区', 120.64299774169922, 24.1382999420166, 'Nantun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3395, '710408', '北屯区', '710400', '北屯', 3, '04', '406', '中国,台湾,台中市,北屯区', 120.68599700927734, 24.182199478149414, 'Beitun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3396, '710409', '丰原区', '710400', '丰原', 3, '04', '420', '中国,台湾,台中市,丰原区', 120.71800231933594, 24.24220085144043, 'Fengyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3397, '710410', '东势区', '710400', '东势', 3, '04', '423', '中国,台湾,台中市,东势区', 120.8280029296875, 24.25860023498535, 'Dongshi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3398, '710411', '大甲区', '710400', '大甲', 3, '04', '437', '中国,台湾,台中市,大甲区', 120.62200164794922, 24.348899841308594, 'Dajia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3399, '710412', '清水区', '710400', '清水', 3, '04', '436', '中国,台湾,台中市,清水区', 120.55999755859375, 24.268699645996094, 'Qingshui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3400, '710413', '沙鹿区', '710400', '沙鹿', 3, '04', '433', '中国,台湾,台中市,沙鹿区', 120.56600189208984, 24.23349952697754, 'Shalu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3401, '710414', '梧栖区', '710400', '梧栖', 3, '04', '435', '中国,台湾,台中市,梧栖区', 120.53199768066406, 24.2549991607666, 'Wuqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3402, '710415', '后里区', '710400', '后里', 3, '04', '421', '中国,台湾,台中市,后里区', 120.71099853515625, 24.304899215698242, 'Houli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3403, '710416', '神冈区', '710400', '神冈', 3, '04', '429', '中国,台湾,台中市,神冈区', 120.66200256347656, 24.25779914855957, 'Shengang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3404, '710417', '潭子区', '710400', '潭子', 3, '04', '427', '中国,台湾,台中市,潭子区', 120.70500183105469, 24.20949935913086, 'Tanzi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3405, '710418', '大雅区', '710400', '大雅', 3, '04', '428', '中国,台湾,台中市,大雅区', 120.64800262451172, 24.22920036315918, 'Daya'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3406, '710419', '新社区', '710400', '新社', 3, '04', '426', '中国,台湾,台中市,新社区', 120.80999755859375, 24.234100341796875, 'Xinshe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3407, '710420', '石冈区', '710400', '石冈', 3, '04', '422', '中国,台湾,台中市,石冈区', 120.77999877929688, 24.274999618530273, 'Shigang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3408, '710421', '外埔区', '710400', '外埔', 3, '04', '438', '中国,台湾,台中市,外埔区', 120.65399932861328, 24.332000732421875, 'Waipu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3409, '710422', '大安区', '710400', '大安', 3, '04', '439', '中国,台湾,台中市,大安区', 120.58699798583984, 24.346099853515625, 'Da\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3410, '710423', '乌日区', '710400', '乌日', 3, '04', '414', '中国,台湾,台中市,乌日区', 120.6240005493164, 24.10449981689453, 'Wuri'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3411, '710424', '大肚区', '710400', '大肚', 3, '04', '432', '中国,台湾,台中市,大肚区', 120.54100036621094, 24.15369987487793, 'Dadu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3412, '710425', '龙井区', '710400', '龙井', 3, '04', '434', '中国,台湾,台中市,龙井区', 120.5459976196289, 24.192699432373047, 'Longjing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3413, '710426', '雾峰区', '710400', '雾峰', 3, '04', '413', '中国,台湾,台中市,雾峰区', 120.69999694824219, 24.061500549316406, 'Wufeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3414, '710427', '太平区', '710400', '太平', 3, '04', '411', '中国,台湾,台中市,太平区', 120.71900177001953, 24.12649917602539, 'Taiping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3415, '710428', '大里区', '710400', '大里', 3, '04', '412', '中国,台湾,台中市,大里区', 120.6780014038086, 24.09939956665039, 'Dali'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3416, '710429', '和平区', '710400', '和平', 3, '04', '424', '中国,台湾,台中市,和平区', 120.88300323486328, 24.174800872802734, 'Heping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3417, '710500', '台南市', '710000', '台南', 2, '06', '7', '中国,台湾,台南市', 120.27899932861328, 23.172500610351562, 'Tainan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3418, '710501', '东区', '710500', '东区', 3, '06', '701', '中国,台湾,台南市,东区', 120.2239990234375, 22.980100631713867, 'Dongqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3419, '710502', '南区', '710500', '南区', 3, '06', '702', '中国,台湾,台南市,南区', 120.18900299072266, 22.960899353027344, 'Nanqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3420, '710504', '北区', '710500', '北区', 3, '06', '704', '中国,台湾,台南市,北区', 120.68199920654297, 24.166000366210938, 'Beiqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3421, '710506', '安南区', '710500', '安南', 3, '06', '709', '中国,台湾,台南市,安南区', 120.18499755859375, 23.047199249267578, 'Annan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3422, '710507', '安平区', '710500', '安平', 3, '06', '708', '中国,台湾,台南市,安平区', 120.16699981689453, 23.00079917907715, 'Anping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3423, '710508', '中西区', '710500', '中西', 3, '06', '700', '中国,台湾,台南市,中西区', 120.20600128173828, 22.99220085144043, 'Zhongxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3424, '710509', '新营区', '710500', '新营', 3, '06', '730', '中国,台湾,台南市,新营区', 120.31700134277344, 23.310300827026367, 'Xinying'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3425, '710510', '盐水区', '710500', '盐水', 3, '06', '737', '中国,台湾,台南市,盐水区', 120.26599884033203, 23.319799423217773, 'Yanshui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3426, '710511', '白河区', '710500', '白河', 3, '06', '732', '中国,台湾,台南市,白河区', 120.41600036621094, 23.351200103759766, 'Baihe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3427, '710512', '柳营区', '710500', '柳营', 3, '06', '736', '中国,台湾,台南市,柳营区', 120.31099700927734, 23.278099060058594, 'Liuying'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3428, '710513', '后壁区', '710500', '后壁', 3, '06', '731', '中国,台湾,台南市,后壁区', 120.36299896240234, 23.36669921875, 'Houbi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3429, '710514', '东山区', '710500', '东山', 3, '06', '733', '中国,台湾,台南市,东山区', 120.40399932861328, 23.326099395751953, 'Dongshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3430, '710515', '麻豆区', '710500', '麻豆', 3, '06', '721', '中国,台湾,台南市,麻豆区', 120.24800109863281, 23.181699752807617, 'Madou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3431, '710516', '下营区', '710500', '下营', 3, '06', '735', '中国,台湾,台南市,下营区', 120.26399993896484, 23.23539924621582, 'Xiaying'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3432, '710517', '六甲区', '710500', '六甲', 3, '06', '734', '中国,台湾,台南市,六甲区', 120.3479995727539, 23.23189926147461, 'Liujia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3433, '710518', '官田区', '710500', '官田', 3, '06', '720', '中国,台湾,台南市,官田区', 120.31400299072266, 23.194700241088867, 'Guantian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3434, '710519', '大内区', '710500', '大内', 3, '06', '742', '中国,台湾,台南市,大内区', 120.3489990234375, 23.11949920654297, 'Dana'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3435, '710520', '佳里区', '710500', '佳里', 3, '06', '722', '中国,台湾,台南市,佳里区', 120.177001953125, 23.16510009765625, 'Jiali'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3436, '710521', '学甲区', '710500', '学甲', 3, '06', '726', '中国,台湾,台南市,学甲区', 120.18000030517578, 23.2322998046875, 'Xuejia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3437, '710522', '西港区', '710500', '西港', 3, '06', '723', '中国,台湾,台南市,西港区', 120.2040023803711, 23.12310028076172, 'Xigang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3438, '710523', '七股区', '710500', '七股', 3, '06', '724', '中国,台湾,台南市,七股区', 120.13999938964844, 23.140499114990234, 'Qigu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3439, '710524', '将军区', '710500', '将军', 3, '06', '725', '中国,台湾,台南市,将军区', 120.15699768066406, 23.199499130249023, 'Jiangjun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3440, '710525', '北门区', '710500', '北门', 3, '06', '727', '中国,台湾,台南市,北门区', 120.1259994506836, 23.267099380493164, 'Beimen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3441, '710526', '新化区', '710500', '新化', 3, '06', '712', '中国,台湾,台南市,新化区', 120.31099700927734, 23.03849983215332, 'Xinhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3442, '710527', '善化区', '710500', '善化', 3, '06', '741', '中国,台湾,台南市,善化区', 120.2969970703125, 23.132299423217773, 'Shanhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3443, '710528', '新市区', '710500', '新市', 3, '06', '744', '中国,台湾,台南市,新市区', 120.29499816894531, 23.07900047302246, 'Xinshi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3444, '710529', '安定区', '710500', '安定', 3, '06', '745', '中国,台湾,台南市,安定区', 120.23699951171875, 23.12150001525879, 'Anding'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3445, '710530', '山上区', '710500', '山上', 3, '06', '743', '中国,台湾,台南市,山上区', 120.35299682617188, 23.103200912475586, 'Shanshang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3446, '710531', '玉井区', '710500', '玉井', 3, '06', '714', '中国,台湾,台南市,玉井区', 120.45999908447266, 23.123899459838867, 'Yujing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3447, '710532', '楠西区', '710500', '楠西', 3, '06', '715', '中国,台湾,台南市,楠西区', 120.48500061035156, 23.173500061035156, 'Nanxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3448, '710533', '南化区', '710500', '南化', 3, '06', '716', '中国,台湾,台南市,南化区', 120.47699737548828, 23.042600631713867, 'Nanhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3449, '710534', '左镇区', '710500', '左镇', 3, '06', '713', '中国,台湾,台南市,左镇区', 120.40699768066406, 23.058000564575195, 'Zuozhen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3450, '710535', '仁德区', '710500', '仁德', 3, '06', '717', '中国,台湾,台南市,仁德区', 120.25199890136719, 22.972200393676758, 'Rende'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3451, '710536', '归仁区', '710500', '归仁', 3, '06', '711', '中国,台湾,台南市,归仁区', 120.29399871826172, 22.967100143432617, 'Guiren'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3452, '710537', '关庙区', '710500', '关庙', 3, '06', '718', '中国,台湾,台南市,关庙区', 120.3280029296875, 22.962900161743164, 'Guanmiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3453, '710538', '龙崎区', '710500', '龙崎', 3, '06', '719', '中国,台湾,台南市,龙崎区', 120.36100006103516, 22.965700149536133, 'Longqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3454, '710539', '永康区', '710500', '永康', 3, '06', '710', '中国,台湾,台南市,永康区', 120.25700378417969, 23.026100158691406, 'Yongkang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3455, '710600', '新竹市', '710000', '新竹', 2, '03', '3', '中国,台湾,新竹市', 120.96900177001953, 24.806699752807617, 'Hsinchu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3456, '710601', '东区', '710600', '东区', 3, '03', '300', '中国,台湾,新竹市,东区', 120.97000122070312, 24.801300048828125, 'Dongqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3457, '710602', '北区', '710600', '北区', 3, '03', '', '中国,台湾,新竹市,北区', 120.68199920654297, 24.166000366210938, 'Beiqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3458, '710603', '香山区', '710600', '香山', 3, '03', '', '中国,台湾,新竹市,香山区', 120.95700073242188, 24.76889991760254, 'Xiangshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3459, '710700', '嘉义市', '710000', '嘉义', 2, '05', '6', '中国,台湾,嘉义市', 120.4530029296875, 23.481599807739258, 'Chiayi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3460, '710701', '东区', '710700', '东区', 3, '05', '600', '中国,台湾,嘉义市,东区', 120.45800018310547, 23.4862003326416, 'Dongqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3461, '710702', '西区', '710700', '西区', 3, '05', '600', '中国,台湾,嘉义市,西区', 120.43699645996094, 23.472999572753906, 'Xiqu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3462, '710800', '新北市', '710000', '新北', 2, '02', '2', '中国,台湾,新北市', 121.46600341796875, 25.012399673461914, 'New Taipei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3463, '710801', '板桥区', '710800', '板桥', 3, '02', '220', '中国,台湾,新北市,板桥区', 121.45899963378906, 25.009599685668945, 'Banqiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3464, '710802', '三重区', '710800', '三重', 3, '02', '241', '中国,台湾,新北市,三重区', 121.48799896240234, 25.061500549316406, 'Sanzhong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3465, '710803', '中和区', '710800', '中和', 3, '02', '235', '中国,台湾,新北市,中和区', 121.4990005493164, 24.999399185180664, 'Zhonghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3466, '710804', '永和区', '710800', '永和', 3, '02', '234', '中国,台湾,新北市,永和区', 121.51399993896484, 25.00779914855957, 'Yonghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3467, '710805', '新庄区', '710800', '新庄', 3, '02', '242', '中国,台湾,新北市,新庄区', 121.44999694824219, 25.035900115966797, 'Xinzhuang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3468, '710806', '新店区', '710800', '新店', 3, '02', '231', '中国,台湾,新北市,新店区', 121.54199981689453, 24.967599868774414, 'Xindian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3469, '710807', '树林区', '710800', '树林', 3, '02', '238', '中国,台湾,新北市,树林区', 121.4209976196289, 24.990699768066406, 'Shulin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3470, '710808', '莺歌区', '710800', '莺歌', 3, '02', '239', '中国,台湾,新北市,莺歌区', 121.3550033569336, 24.955400466918945, 'Yingge'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3471, '710809', '三峡区', '710800', '三峡', 3, '02', '237', '中国,台湾,新北市,三峡区', 121.36900329589844, 24.93429946899414, 'Sanxia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3472, '710810', '淡水区', '710800', '淡水', 3, '02', '251', '中国,台湾,新北市,淡水区', 121.44100189208984, 25.16950035095215, 'Danshui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3473, '710811', '汐止区', '710800', '汐止', 3, '02', '221', '中国,台湾,新北市,汐止区', 121.62899780273438, 25.062999725341797, 'Xizhi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3474, '710812', '瑞芳区', '710800', '瑞芳', 3, '02', '224', '中国,台湾,新北市,瑞芳区', 121.80999755859375, 25.10890007019043, 'Ruifang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3475, '710813', '土城区', '710800', '土城', 3, '02', '236', '中国,台湾,新北市,土城区', 121.44300079345703, 24.972200393676758, 'Tucheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3476, '710814', '芦洲区', '710800', '芦洲', 3, '02', '247', '中国,台湾,新北市,芦洲区', 121.4739990234375, 25.08489990234375, 'Luzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3477, '710815', '五股区', '710800', '五股', 3, '02', '248', '中国,台湾,新北市,五股区', 121.43800354003906, 25.082700729370117, 'Wugu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3478, '710816', '泰山区', '710800', '泰山', 3, '02', '243', '中国,台湾,新北市,泰山区', 121.43099975585938, 25.058900833129883, 'Taishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3479, '710817', '林口区', '710800', '林口', 3, '02', '244', '中国,台湾,新北市,林口区', 121.39199829101562, 25.077499389648438, 'Linkou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3480, '710818', '深坑区', '710800', '深坑', 3, '02', '222', '中国,台湾,新北市,深坑区', 121.61599731445312, 25.002300262451172, 'Shenkeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3481, '710819', '石碇区', '710800', '石碇', 3, '02', '223', '中国,台湾,新北市,石碇区', 121.65899658203125, 24.99169921875, 'Shiding'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3482, '710820', '坪林区', '710800', '坪林', 3, '02', '232', '中国,台湾,新北市,坪林区', 121.71099853515625, 24.937400817871094, 'Pinglin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3483, '710821', '三芝区', '710800', '三芝', 3, '02', '252', '中国,台湾,新北市,三芝区', 121.5009994506836, 25.257999420166016, 'Sanzhi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3484, '710822', '石门区', '710800', '石门', 3, '02', '253', '中国,台湾,新北市,石门区', 121.56800079345703, 25.2903995513916, 'Shimen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3485, '710823', '八里区', '710800', '八里', 3, '02', '249', '中国,台湾,新北市,八里区', 121.39800262451172, 25.146699905395508, 'Bali'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3486, '710824', '平溪区', '710800', '平溪', 3, '02', '226', '中国,台湾,新北市,平溪区', 121.73799896240234, 25.025699615478516, 'Pingxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3487, '710825', '双溪区', '710800', '双溪', 3, '02', '227', '中国,台湾,新北市,双溪区', 121.86599731445312, 25.03339958190918, 'Shuangxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3488, '710826', '贡寮区', '710800', '贡寮', 3, '02', '228', '中国,台湾,新北市,贡寮区', 121.90799713134766, 25.02239990234375, 'Gongliao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3489, '710827', '金山区', '710800', '金山', 3, '02', '208', '中国,台湾,新北市,金山区', 121.63600158691406, 25.221900939941406, 'Jinshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3490, '710828', '万里区', '710800', '万里', 3, '02', '207', '中国,台湾,新北市,万里区', 121.68900299072266, 25.18120002746582, 'Wanli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3491, '710829', '乌来区', '710800', '乌来', 3, '02', '233', '中国,台湾,新北市,乌来区', 121.5510025024414, 24.865299224853516, 'Wulai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3492, '712200', '宜兰县', '710000', '宜兰', 2, '03', '2', '中国,台湾,宜兰县', 121.5, 24.600000381469727, 'Yilan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3493, '712201', '宜兰市', '712200', '宜兰', 3, '03', '260', '中国,台湾,宜兰县,宜兰市', 121.75299835205078, 24.751699447631836, 'Yilan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3494, '712221', '罗东镇', '712200', '罗东', 3, '03', '265', '中国,台湾,宜兰县,罗东镇', 121.76699829101562, 24.677000045776367, 'Luodong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3495, '712222', '苏澳镇', '712200', '苏澳', 3, '03', '270', '中国,台湾,宜兰县,苏澳镇', 121.84300231933594, 24.594600677490234, 'Suao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3496, '712223', '头城镇', '712200', '头城', 3, '03', '261', '中国,台湾,宜兰县,头城镇', 121.822998046875, 24.85919952392578, 'Toucheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3497, '712224', '礁溪乡', '712200', '礁溪', 3, '03', '262', '中国,台湾,宜兰县,礁溪乡', 121.76699829101562, 24.82229995727539, 'Jiaoxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3498, '712225', '壮围乡', '712200', '壮围', 3, '03', '263', '中国,台湾,宜兰县,壮围乡', 121.78199768066406, 24.74489974975586, 'Zhuangwei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3499, '712226', '员山乡', '712200', '员山', 3, '03', '264', '中国,台湾,宜兰县,员山乡', 121.72200012207031, 24.74180030822754, 'Yuanshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3500, '712227', '冬山乡', '712200', '冬山', 3, '03', '269', '中国,台湾,宜兰县,冬山乡', 121.79199981689453, 24.63450050354004, 'Dongshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3501, '712228', '五结乡', '712200', '五结', 3, '03', '268', '中国,台湾,宜兰县,五结乡', 121.7979965209961, 24.684600830078125, 'Wujie'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3502, '712229', '三星乡', '712200', '三星', 3, '03', '266', '中国,台湾,宜兰县,三星乡', 121.00299835205078, 23.775299072265625, 'Sanxing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3503, '712230', '大同乡', '712200', '大同', 3, '03', '267', '中国,台湾,宜兰县,大同乡', 121.60600280761719, 24.676000595092773, 'Datong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3504, '712231', '南澳乡', '712200', '南澳', 3, '03', '272', '中国,台湾,宜兰县,南澳乡', 121.80000305175781, 24.46540069580078, 'Nanao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3505, '712300', '桃园县', '710000', '桃园', 2, '03', '3', '中国,台湾,桃园县', 121.08300018310547, 25, 'Taoyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3506, '712301', '桃园市', '712300', '桃园', 3, '03', '330', '中国,台湾,桃园县,桃园市', 121.3010025024414, 24.993799209594727, 'Taoyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3507, '712302', '中坜市', '712300', '中坜', 3, '03', '320', '中国,台湾,桃园县,中坜市', 121.2249984741211, 24.96540069580078, 'Zhongli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3508, '712303', '平镇市', '712300', '平镇', 3, '03', '324', '中国,台湾,桃园县,平镇市', 121.21800231933594, 24.94580078125, 'Pingzhen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3509, '712304', '八德市', '712300', '八德', 3, '03', '334', '中国,台湾,桃园县,八德市', 121.28500366210938, 24.928699493408203, 'Bade'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3510, '712305', '杨梅市', '712300', '杨梅', 3, '03', '326', '中国,台湾,桃园县,杨梅市', 121.14600372314453, 24.90760040283203, 'Yangmei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3511, '712306', '芦竹市', '712300', '芦竹', 3, '03', '338', '中国,台湾,桃园县,芦竹市', 121.29199981689453, 25.045400619506836, 'Luzhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3512, '712321', '大溪镇', '712300', '大溪', 3, '03', '335', '中国,台湾,桃园县,大溪镇', 121.28700256347656, 24.880599975585938, 'Daxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3513, '712324', '大园乡', '712300', '大园', 3, '03', '337', '中国,台湾,桃园县,大园乡', 121.19599914550781, 25.06450080871582, 'Dayuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3514, '712325', '龟山乡', '712300', '龟山', 3, '03', '333', '中国,台湾,桃园县,龟山乡', 121.33799743652344, 24.99250030517578, 'Guishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3515, '712327', '龙潭乡', '712300', '龙潭', 3, '03', '325', '中国,台湾,桃园县,龙潭乡', 121.21600341796875, 24.86389923095703, 'Longtan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3516, '712329', '新屋乡', '712300', '新屋', 3, '03', '327', '中国,台湾,桃园县,新屋乡', 121.10600280761719, 24.972200393676758, 'Xinwu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3517, '712330', '观音乡', '712300', '观音', 3, '03', '328', '中国,台湾,桃园县,观音乡', 121.0780029296875, 25.033300399780273, 'Guanyin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3518, '712331', '复兴乡', '712300', '复兴', 3, '03', '336', '中国,台湾,桃园县,复兴乡', 121.35299682617188, 24.820899963378906, 'Fuxing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3519, '712400', '新竹县', '710000', '新竹', 2, '03', '3', '中国,台湾,新竹县', 121.16000366210938, 24.600000381469727, 'Hsinchu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3520, '712401', '竹北市', '712400', '竹北', 3, '03', '302', '中国,台湾,新竹县,竹北市', 121.00399780273438, 24.83970069885254, 'Zhubei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3521, '712421', '竹东镇', '712400', '竹东', 3, '03', '310', '中国,台湾,新竹县,竹东镇', 121.08599853515625, 24.733600616455078, 'Zhudong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3522, '712422', '新埔镇', '712400', '新埔', 3, '03', '305', '中国,台湾,新竹县,新埔镇', 121.072998046875, 24.824800491333008, 'Xinpu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3523, '712423', '关西镇', '712400', '关西', 3, '03', '306', '中国,台湾,新竹县,关西镇', 121.177001953125, 24.788799285888672, 'Guanxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3524, '712424', '湖口乡', '712400', '湖口', 3, '03', '303', '中国,台湾,新竹县,湖口乡', 121.04399871826172, 24.903900146484375, 'Hukou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3525, '712425', '新丰乡', '712400', '新丰', 3, '03', '304', '中国,台湾,新竹县,新丰乡', 120.98300170898438, 24.899599075317383, 'Xinfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3526, '712426', '芎林乡', '712400', '芎林', 3, '03', '307', '中国,台湾,新竹县,芎林乡', 121.0770034790039, 24.77440071105957, 'Xionglin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3527, '712427', '横山乡', '712400', '横山', 3, '03', '312', '中国,台湾,新竹县,横山乡', 121.11599731445312, 24.720800399780273, 'Hengshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3528, '712428', '北埔乡', '712400', '北埔', 3, '03', '314', '中国,台湾,新竹县,北埔乡', 121.0530014038086, 24.697099685668945, 'Beipu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3529, '712429', '宝山乡', '712400', '宝山', 3, '03', '308', '中国,台湾,新竹县,宝山乡', 120.98600006103516, 24.76099967956543, 'Baoshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3530, '712430', '峨眉乡', '712400', '峨眉', 3, '03', '315', '中国,台湾,新竹县,峨眉乡', 121.01499938964844, 24.686100006103516, 'Emei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3531, '712431', '尖石乡', '712400', '尖石', 3, '03', '313', '中国,台湾,新竹县,尖石乡', 121.197998046875, 24.70439910888672, 'Jianshi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3532, '712432', '五峰乡', '712400', '五峰', 3, '03', '311', '中国,台湾,新竹县,五峰乡', 121.00299835205078, 23.775299072265625, 'Wufeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3533, '712500', '苗栗县', '710000', '苗栗', 2, '037', '3', '中国,台湾,苗栗县', 120.75, 24.5, 'Miaoli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3534, '712501', '苗栗市', '712500', '苗栗', 3, '037', '360', '中国,台湾,苗栗县,苗栗市', 120.81900024414062, 24.561500549316406, 'Miaoli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3535, '712521', '苑里镇', '712500', '苑里', 3, '037', '358', '中国,台湾,苗栗县,苑里镇', 120.64900207519531, 24.441699981689453, 'Yuanli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3536, '712522', '通霄镇', '712500', '通霄', 3, '037', '357', '中国,台湾,苗栗县,通霄镇', 120.677001953125, 24.489099502563477, 'Tongxiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3537, '712523', '竹南镇', '712500', '竹南', 3, '037', '350', '中国,台湾,苗栗县,竹南镇', 120.87300109863281, 24.68549919128418, 'Zhunan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3538, '712524', '头份镇', '712500', '头份', 3, '037', '351', '中国,台湾,苗栗县,头份镇', 120.8949966430664, 24.687999725341797, 'Toufen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3539, '712525', '后龙镇', '712500', '后龙', 3, '037', '356', '中国,台湾,苗栗县,后龙镇', 120.78600311279297, 24.612600326538086, 'Houlong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3540, '712526', '卓兰镇', '712500', '卓兰', 3, '037', '369', '中国,台湾,苗栗县,卓兰镇', 120.822998046875, 24.309499740600586, 'Zhuolan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3541, '712527', '大湖乡', '712500', '大湖', 3, '037', '364', '中国,台湾,苗栗县,大湖乡', 120.86399841308594, 24.422500610351562, 'Dahu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3542, '712528', '公馆乡', '712500', '公馆', 3, '037', '363', '中国,台湾,苗栗县,公馆乡', 120.822998046875, 24.499099731445312, 'Gongguan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3543, '712529', '铜锣乡', '712500', '铜锣', 3, '037', '366', '中国,台湾,苗栗县,铜锣乡', 121.00299835205078, 23.775299072265625, 'Tongluo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3544, '712530', '南庄乡', '712500', '南庄', 3, '037', '353', '中国,台湾,苗栗县,南庄乡', 120.99500274658203, 24.596799850463867, 'Nanzhuang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3545, '712531', '头屋乡', '712500', '头屋', 3, '037', '362', '中国,台湾,苗栗县,头屋乡', 120.84700012207031, 24.574199676513672, 'Touwu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3546, '712532', '三义乡', '712500', '三义', 3, '037', '367', '中国,台湾,苗栗县,三义乡', 120.74199676513672, 24.350299835205078, 'Sanyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3547, '712533', '西湖乡', '712500', '西湖', 3, '037', '368', '中国,台湾,苗栗县,西湖乡', 121.00299835205078, 23.775299072265625, 'Xihu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3548, '712534', '造桥乡', '712500', '造桥', 3, '037', '361', '中国,台湾,苗栗县,造桥乡', 120.86199951171875, 24.637500762939453, 'Zaoqiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3549, '712535', '三湾乡', '712500', '三湾', 3, '037', '352', '中国,台湾,苗栗县,三湾乡', 120.95099639892578, 24.651100158691406, 'Sanwan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3550, '712536', '狮潭乡', '712500', '狮潭', 3, '037', '354', '中国,台湾,苗栗县,狮潭乡', 120.91799926757812, 24.540000915527344, 'Shitan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3551, '712537', '泰安乡', '712500', '泰安', 3, '037', '365', '中国,台湾,苗栗县,泰安乡', 120.90399932861328, 24.44260025024414, 'Tai\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3552, '712700', '彰化县', '710000', '彰化', 2, '04', '5', '中国,台湾,彰化县', 120.41600036621094, 24, 'Changhua'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3553, '712701', '彰化市', '712700', '彰化市', 3, '04', '500', '中国,台湾,彰化县,彰化市', 120.54199981689453, 24.080900192260742, 'Zhanghuashi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3554, '712721', '鹿港镇', '712700', '鹿港', 3, '04', '505', '中国,台湾,彰化县,鹿港镇', 120.43499755859375, 24.056900024414062, 'Lugang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3555, '712722', '和美镇', '712700', '和美', 3, '04', '508', '中国,台湾,彰化县,和美镇', 120.5, 24.11090087890625, 'Hemei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3556, '712723', '线西乡', '712700', '线西', 3, '04', '507', '中国,台湾,彰化县,线西乡', 120.46600341796875, 24.128700256347656, 'Xianxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3557, '712724', '伸港乡', '712700', '伸港', 3, '04', '509', '中国,台湾,彰化县,伸港乡', 120.48400115966797, 24.146099090576172, 'Shengang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3558, '712725', '福兴乡', '712700', '福兴', 3, '04', '506', '中国,台湾,彰化县,福兴乡', 120.44400024414062, 24.04789924621582, 'Fuxing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3559, '712726', '秀水乡', '712700', '秀水', 3, '04', '504', '中国,台湾,彰化县,秀水乡', 120.50299835205078, 24.03529930114746, 'Xiushui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3560, '712727', '花坛乡', '712700', '花坛', 3, '04', '503', '中国,台湾,彰化县,花坛乡', 120.53800201416016, 24.029399871826172, 'Huatan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3561, '712728', '芬园乡', '712700', '芬园', 3, '04', '502', '中国,台湾,彰化县,芬园乡', 120.62899780273438, 24.013700485229492, 'Fenyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3562, '712729', '员林镇', '712700', '员林', 3, '04', '510', '中国,台湾,彰化县,员林镇', 120.57499694824219, 23.958999633789062, 'Yuanlin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3563, '712730', '溪湖镇', '712700', '溪湖', 3, '04', '514', '中国,台湾,彰化县,溪湖镇', 120.47899627685547, 23.962299346923828, 'Xihu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3564, '712731', '田中镇', '712700', '田中', 3, '04', '520', '中国,台湾,彰化县,田中镇', 120.58100128173828, 23.8617000579834, 'Tianzhong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3565, '712732', '大村乡', '712700', '大村', 3, '04', '515', '中国,台湾,彰化县,大村乡', 120.54100036621094, 23.99370002746582, 'Dacun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3566, '712733', '埔盐乡', '712700', '埔盐', 3, '04', '516', '中国,台湾,彰化县,埔盐乡', 120.46399688720703, 24.00029945373535, 'Puyan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3567, '712734', '埔心乡', '712700', '埔心', 3, '04', '513', '中国,台湾,彰化县,埔心乡', 120.54399871826172, 23.952999114990234, 'Puxin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3568, '712735', '永靖乡', '712700', '永靖', 3, '04', '512', '中国,台湾,彰化县,永靖乡', 120.5479965209961, 23.924699783325195, 'Yongjing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3569, '712736', '社头乡', '712700', '社头', 3, '04', '511', '中国,台湾,彰化县,社头乡', 120.58300018310547, 23.896699905395508, 'Shetou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3570, '712737', '二水乡', '712700', '二水', 3, '04', '530', '中国,台湾,彰化县,二水乡', 120.61900329589844, 23.80699920654297, 'Ershui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3571, '712738', '北斗镇', '712700', '北斗', 3, '04', '521', '中国,台湾,彰化县,北斗镇', 120.5199966430664, 23.870899200439453, 'Beidou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3572, '712739', '二林镇', '712700', '二林', 3, '04', '526', '中国,台湾,彰化县,二林镇', 120.3740005493164, 23.899799346923828, 'Erlin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3573, '712740', '田尾乡', '712700', '田尾', 3, '04', '522', '中国,台湾,彰化县,田尾乡', 120.5250015258789, 23.89069938659668, 'Tianwei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3574, '712741', '埤头乡', '712700', '埤头', 3, '04', '523', '中国,台湾,彰化县,埤头乡', 120.46299743652344, 23.891300201416016, 'Pitou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3575, '712742', '芳苑乡', '712700', '芳苑', 3, '04', '528', '中国,台湾,彰化县,芳苑乡', 120.31999969482422, 23.9242000579834, 'Fangyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3576, '712743', '大城乡', '712700', '大城', 3, '04', '527', '中国,台湾,彰化县,大城乡', 120.32099914550781, 23.852399826049805, 'Dacheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3577, '712744', '竹塘乡', '712700', '竹塘', 3, '04', '525', '中国,台湾,彰化县,竹塘乡', 120.427001953125, 23.86009979248047, 'Zhutang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3578, '712745', '溪州乡', '712700', '溪州', 3, '04', '524', '中国,台湾,彰化县,溪州乡', 120.4990005493164, 23.851200103759766, 'Xizhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3579, '712800', '南投县', '710000', '南投', 2, '049', '5', '中国,台湾,南投县', 120.83000183105469, 23.829999923706055, 'Nantou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3580, '712801', '南投市', '712800', '南投市', 3, '049', '540', '中国,台湾,南投县,南投市', 120.68399810791016, 23.90999984741211, 'Nantoushi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3581, '712821', '埔里镇', '712800', '埔里', 3, '049', '545', '中国,台湾,南投县,埔里镇', 120.96499633789062, 23.964799880981445, 'Puli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3582, '712822', '草屯镇', '712800', '草屯', 3, '049', '542', '中国,台湾,南投县,草屯镇', 120.68000030517578, 23.973899841308594, 'Caotun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3583, '712823', '竹山镇', '712800', '竹山', 3, '049', '557', '中国,台湾,南投县,竹山镇', 120.6719970703125, 23.757699966430664, 'Zhushan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3584, '712824', '集集镇', '712800', '集集', 3, '049', '552', '中国,台湾,南投县,集集镇', 120.78399658203125, 23.82900047302246, 'Jiji'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3585, '712825', '名间乡', '712800', '名间', 3, '049', '551', '中国,台湾,南投县,名间乡', 120.7030029296875, 23.83839988708496, 'Mingjian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3586, '712826', '鹿谷乡', '712800', '鹿谷', 3, '049', '558', '中国,台湾,南投县,鹿谷乡', 120.75299835205078, 23.74449920654297, 'Lugu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3587, '712827', '中寮乡', '712800', '中寮', 3, '049', '541', '中国,台湾,南投县,中寮乡', 120.76699829101562, 23.8789005279541, 'Zhongliao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3588, '712828', '鱼池乡', '712800', '鱼池', 3, '049', '555', '中国,台湾,南投县,鱼池乡', 120.93599700927734, 23.896400451660156, 'Yuchi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3589, '712829', '国姓乡', '712800', '国姓', 3, '049', '544', '中国,台湾,南投县,国姓乡', 120.85900115966797, 24.042299270629883, 'Guoxing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3590, '712830', '水里乡', '712800', '水里', 3, '049', '553', '中国,台湾,南投县,水里乡', 120.85600280761719, 23.81209945678711, 'Shuili'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3591, '712831', '信义乡', '712800', '信义', 3, '049', '556', '中国,台湾,南投县,信义乡', 120.8550033569336, 23.699899673461914, 'Xinyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3592, '712832', '仁爱乡', '712800', '仁爱', 3, '049', '546', '中国,台湾,南投县,仁爱乡', 121.13400268554688, 24.02440071105957, 'Renai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3593, '712900', '云林县', '710000', '云林', 2, '05', '6', '中国,台湾,云林县', 120.25, 23.75, 'Yunlin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3594, '712901', '斗六市', '712900', '斗六', 3, '05', '640', '中国,台湾,云林县,斗六市', 120.5270004272461, 23.69770050048828, 'Douliu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3595, '712921', '斗南镇', '712900', '斗南', 3, '05', '630', '中国,台湾,云林县,斗南镇', 120.47899627685547, 23.67970085144043, 'Dounan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3596, '712922', '虎尾镇', '712900', '虎尾', 3, '05', '632', '中国,台湾,云林县,虎尾镇', 120.44499969482422, 23.708200454711914, 'Huwei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3597, '712923', '西螺镇', '712900', '西螺', 3, '05', '648', '中国,台湾,云林县,西螺镇', 120.46600341796875, 23.79800033569336, 'Xiluo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3598, '712924', '土库镇', '712900', '土库', 3, '05', '633', '中国,台湾,云林县,土库镇', 120.39299774169922, 23.677799224853516, 'Tuku'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3599, '712925', '北港镇', '712900', '北港', 3, '05', '651', '中国,台湾,云林县,北港镇', 120.302001953125, 23.57550048828125, 'Beigang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3600, '712926', '古坑乡', '712900', '古坑', 3, '05', '646', '中国,台湾,云林县,古坑乡', 120.56199645996094, 23.64259910583496, 'Gukeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3601, '712927', '大埤乡', '712900', '大埤', 3, '05', '631', '中国,台湾,云林县,大埤乡', 120.43099975585938, 23.64590072631836, 'Dapi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3602, '712928', '莿桐乡', '712900', '莿桐', 3, '05', '647', '中国,台湾,云林县,莿桐乡', 120.50199890136719, 23.760799407958984, 'Citong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3603, '712929', '林内乡', '712900', '林内', 3, '05', '643', '中国,台湾,云林县,林内乡', 120.61100006103516, 23.758699417114258, 'Linna'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3604, '712930', '二仑乡', '712900', '二仑', 3, '05', '649', '中国,台湾,云林县,二仑乡', 120.41500091552734, 23.771299362182617, 'Erlun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3605, '712931', '仑背乡', '712900', '仑背', 3, '05', '637', '中国,台湾,云林县,仑背乡', 120.35399627685547, 23.758800506591797, 'Lunbei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3606, '712932', '麦寮乡', '712900', '麦寮', 3, '05', '638', '中国,台湾,云林县,麦寮乡', 120.25199890136719, 23.753799438476562, 'Mailiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3607, '712933', '东势乡', '712900', '东势', 3, '05', '635', '中国,台湾,云林县,东势乡', 120.25299835205078, 23.674699783325195, 'Dongshi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3608, '712934', '褒忠乡', '712900', '褒忠', 3, '05', '634', '中国,台湾,云林县,褒忠乡', 120.30999755859375, 23.69420051574707, 'Baozhong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3609, '712935', '台西乡', '712900', '台西', 3, '05', '636', '中国,台湾,云林县,台西乡', 120.19599914550781, 23.702800750732422, 'Taixi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3610, '712936', '元长乡', '712900', '元长', 3, '05', '655', '中国,台湾,云林县,元长乡', 120.31500244140625, 23.649499893188477, 'Yuanchang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3611, '712937', '四湖乡', '712900', '四湖', 3, '05', '654', '中国,台湾,云林县,四湖乡', 120.22599792480469, 23.637699127197266, 'Sihu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3612, '712938', '口湖乡', '712900', '口湖', 3, '05', '653', '中国,台湾,云林县,口湖乡', 120.18499755859375, 23.582399368286133, 'Kouhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3613, '712939', '水林乡', '712900', '水林', 3, '05', '652', '中国,台湾,云林县,水林乡', 120.24600219726562, 23.572599411010742, 'Shuilin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3614, '713000', '嘉义县', '710000', '嘉义', 2, '05', '6', '中国,台湾,嘉义县', 120.30000305175781, 23.5, 'Chiayi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3615, '713001', '太保市', '713000', '太保', 3, '05', '612', '中国,台湾,嘉义县,太保市', 120.33300018310547, 23.4596004486084, 'Taibao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3616, '713002', '朴子市', '713000', '朴子', 3, '05', '613', '中国,台湾,嘉义县,朴子市', 120.24700164794922, 23.46500015258789, 'Puzi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3617, '713023', '布袋镇', '713000', '布袋', 3, '05', '625', '中国,台湾,嘉义县,布袋镇', 120.16699981689453, 23.378000259399414, 'Budai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3618, '713024', '大林镇', '713000', '大林', 3, '05', '622', '中国,台湾,嘉义县,大林镇', 120.47100067138672, 23.60379981994629, 'Dalin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3619, '713025', '民雄乡', '713000', '民雄', 3, '05', '621', '中国,台湾,嘉义县,民雄乡', 120.42900085449219, 23.55150032043457, 'Minxiong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3620, '713026', '溪口乡', '713000', '溪口', 3, '05', '623', '中国,台湾,嘉义县,溪口乡', 120.39399719238281, 23.60219955444336, 'Xikou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3621, '713027', '新港乡', '713000', '新港', 3, '05', '616', '中国,台湾,嘉义县,新港乡', 120.3479995727539, 23.551799774169922, 'Xingang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3622, '713028', '六脚乡', '713000', '六脚', 3, '05', '615', '中国,台湾,嘉义县,六脚乡', 120.29100036621094, 23.493900299072266, 'Liujiao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3623, '713029', '东石乡', '713000', '东石', 3, '05', '614', '中国,台湾,嘉义县,东石乡', 120.15399932861328, 23.459199905395508, 'Dongshi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3624, '713030', '义竹乡', '713000', '义竹', 3, '05', '624', '中国,台湾,嘉义县,义竹乡', 120.24299621582031, 23.336299896240234, 'Yizhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3625, '713031', '鹿草乡', '713000', '鹿草', 3, '05', '611', '中国,台湾,嘉义县,鹿草乡', 120.30799865722656, 23.41080093383789, 'Lucao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3626, '713032', '水上乡', '713000', '水上', 3, '05', '608', '中国,台湾,嘉义县,水上乡', 120.39800262451172, 23.4281005859375, 'Shuishang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3627, '713033', '中埔乡', '713000', '中埔', 3, '05', '606', '中国,台湾,嘉义县,中埔乡', 120.52300262451172, 23.425100326538086, 'Zhongpu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3628, '713034', '竹崎乡', '713000', '竹崎', 3, '05', '604', '中国,台湾,嘉义县,竹崎乡', 120.5510025024414, 23.5231990814209, 'Zhuqi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3629, '713035', '梅山乡', '713000', '梅山', 3, '05', '603', '中国,台湾,嘉义县,梅山乡', 120.55699920654297, 23.58489990234375, 'Meishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3630, '713036', '番路乡', '713000', '番路', 3, '05', '602', '中国,台湾,嘉义县,番路乡', 120.55500030517578, 23.465200424194336, 'Fanlu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3631, '713037', '大埔乡', '713000', '大埔', 3, '05', '607', '中国,台湾,嘉义县,大埔乡', 120.59400177001953, 23.29669952392578, 'Dapu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3632, '713038', '阿里山乡', '713000', '阿里山', 3, '05', '605', '中国,台湾,嘉义县,阿里山乡', 120.73300170898438, 23.468000411987305, 'Alishan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3633, '713300', '屏东县', '710000', '屏东', 2, '08', '9', '中国,台湾,屏东县', 120.48799896240234, 22.68280029296875, 'Pingtung'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3634, '713301', '屏东市', '713300', '屏东', 3, '08', '900', '中国,台湾,屏东县,屏东市', 120.48799896240234, 22.669700622558594, 'Pingdong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3635, '713321', '潮州镇', '713300', '潮州', 3, '08', '920', '中国,台湾,屏东县,潮州镇', 120.54299926757812, 22.550500869750977, 'Chaozhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3636, '713322', '东港镇', '713300', '东港', 3, '08', '928', '中国,台湾,屏东县,东港镇', 120.4540023803711, 22.46660041809082, 'Donggang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3637, '713323', '恒春镇', '713300', '恒春', 3, '08', '946', '中国,台湾,屏东县,恒春镇', 120.74500274658203, 22.002399444580078, 'Hengchun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3638, '713324', '万丹乡', '713300', '万丹', 3, '08', '913', '中国,台湾,屏东县,万丹乡', 120.48500061035156, 22.589799880981445, 'Wandan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3639, '713325', '长治乡', '713300', '长治', 3, '08', '908', '中国,台湾,屏东县,长治乡', 120.52799987792969, 22.677099227905273, 'Changzhi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3640, '713326', '麟洛乡', '713300', '麟洛', 3, '08', '909', '中国,台湾,屏东县,麟洛乡', 120.5270004272461, 22.65060043334961, 'Linluo'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3641, '713327', '九如乡', '713300', '九如', 3, '08', '904', '中国,台湾,屏东县,九如乡', 120.48999786376953, 22.73979949951172, 'Jiuru'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3642, '713328', '里港乡', '713300', '里港', 3, '08', '905', '中国,台湾,屏东县,里港乡', 120.49400329589844, 22.779199600219727, 'Ligang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3643, '713329', '盐埔乡', '713300', '盐埔', 3, '08', '907', '中国,台湾,屏东县,盐埔乡', 120.572998046875, 22.75480079650879, 'Yanpu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3644, '713330', '高树乡', '713300', '高树', 3, '08', '906', '中国,台湾,屏东县,高树乡', 120.5999984741211, 22.826799392700195, 'Gaoshu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3645, '713331', '万峦乡', '713300', '万峦', 3, '08', '923', '中国,台湾,屏东县,万峦乡', 120.56600189208984, 22.57200050354004, 'Wanluan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3646, '713332', '内埔乡', '713300', '内埔', 3, '08', '912', '中国,台湾,屏东县,内埔乡', 120.56700134277344, 22.61199951171875, 'Napu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3647, '713333', '竹田乡', '713300', '竹田', 3, '08', '911', '中国,台湾,屏东县,竹田乡', 120.54399871826172, 22.584699630737305, 'Zhutian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3648, '713334', '新埤乡', '713300', '新埤', 3, '08', '925', '中国,台湾,屏东县,新埤乡', 120.55000305175781, 22.469999313354492, 'Xinpi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3649, '713335', '枋寮乡', '713300', '枋寮', 3, '08', '940', '中国,台湾,屏东县,枋寮乡', 120.59300231933594, 22.3656005859375, 'Fangliao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3650, '713336', '新园乡', '713300', '新园', 3, '08', '932', '中国,台湾,屏东县,新园乡', 120.46199798583984, 22.54400062561035, 'Xinyuan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3651, '713337', '崁顶乡', '713300', '崁顶', 3, '08', '924', '中国,台湾,屏东县,崁顶乡', 120.51499938964844, 22.514799118041992, 'Kanding'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3652, '713338', '林边乡', '713300', '林边', 3, '08', '927', '中国,台湾,屏东县,林边乡', 120.51499938964844, 22.43400001525879, 'Linbian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3653, '713339', '南州乡', '713300', '南州', 3, '08', '926', '中国,台湾,屏东县,南州乡', 120.51000213623047, 22.49020004272461, 'Nanzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3654, '713340', '佳冬乡', '713300', '佳冬', 3, '08', '931', '中国,台湾,屏东县,佳冬乡', 120.552001953125, 22.417699813842773, 'Jiadong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3655, '713341', '琉球乡', '713300', '琉球', 3, '08', '929', '中国,台湾,屏东县,琉球乡', 120.36900329589844, 22.34239959716797, 'Liuqiu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3656, '713342', '车城乡', '713300', '车城', 3, '08', '944', '中国,台湾,屏东县,车城乡', 120.71099853515625, 22.072099685668945, 'Checheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3657, '713343', '满州乡', '713300', '满州', 3, '08', '947', '中国,台湾,屏东县,满州乡', 120.83899688720703, 22.02090072631836, 'Manzhou'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3658, '713344', '枋山乡', '713300', '枋山', 3, '08', '941', '中国,台湾,屏东县,枋山乡', 120.65599822998047, 22.260299682617188, 'Fangshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3659, '713345', '三地门乡', '713300', '三地门', 3, '08', '901', '中国,台湾,屏东县,三地门乡', 120.65399932861328, 22.713899612426758, 'Sandimen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3660, '713346', '雾台乡', '713300', '雾台', 3, '08', '902', '中国,台湾,屏东县,雾台乡', 120.73200225830078, 22.74489974975586, 'Wutai'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3661, '713347', '玛家乡', '713300', '玛家', 3, '08', '903', '中国,台湾,屏东县,玛家乡', 120.64399719238281, 22.70669937133789, 'Majia'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3662, '713348', '泰武乡', '713300', '泰武', 3, '08', '921', '中国,台湾,屏东县,泰武乡', 120.63300323486328, 22.591800689697266, 'Taiwu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3663, '713349', '来义乡', '713300', '来义', 3, '08', '922', '中国,台湾,屏东县,来义乡', 120.63400268554688, 22.52589988708496, 'Laiyi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3664, '713350', '春日乡', '713300', '春日', 3, '08', '942', '中国,台湾,屏东县,春日乡', 120.62899780273438, 22.37070083618164, 'Chunri'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3665, '713351', '狮子乡', '713300', '狮子', 3, '08', '943', '中国,台湾,屏东县,狮子乡', 120.70500183105469, 22.201900482177734, 'Shizi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3666, '713352', '牡丹乡', '713300', '牡丹', 3, '08', '945', '中国,台湾,屏东县,牡丹乡', 120.7699966430664, 22.125699996948242, 'Mudan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3667, '713400', '台东县', '710000', '台东', 2, '089', '9', '中国,台湾,台东县', 120.91600036621094, 23, 'Taitung'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3668, '713401', '台东市', '713400', '台东', 3, '089', '950', '中国,台湾,台东县,台东市', 121.14600372314453, 22.756000518798828, 'Taidong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3669, '713421', '成功镇', '713400', '成功', 3, '089', '961', '中国,台湾,台东县,成功镇', 121.37999725341797, 23.100200653076172, 'Chenggong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3670, '713422', '关山镇', '713400', '关山', 3, '089', '956', '中国,台湾,台东县,关山镇', 121.16300201416016, 23.047399520874023, 'Guanshan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3671, '713423', '卑南乡', '713400', '卑南', 3, '089', '954', '中国,台湾,台东县,卑南乡', 121.08399963378906, 22.785999298095703, 'Beinan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3672, '713424', '鹿野乡', '713400', '鹿野', 3, '089', '955', '中国,台湾,台东县,鹿野乡', 121.13600158691406, 22.913999557495117, 'Luye'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3673, '713425', '池上乡', '713400', '池上', 3, '089', '958', '中国,台湾,台东县,池上乡', 121.21499633789062, 23.122400283813477, 'Chishang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3674, '713426', '东河乡', '713400', '东河', 3, '089', '959', '中国,台湾,台东县,东河乡', 121.30000305175781, 22.969900131225586, 'Donghe'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3675, '713427', '长滨乡', '713400', '长滨', 3, '089', '962', '中国,台湾,台东县,长滨乡', 121.4520034790039, 23.315000534057617, 'Changbin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3676, '713428', '太麻里乡', '713400', '太麻里', 3, '089', '963', '中国,台湾,台东县,太麻里乡', 121.00700378417969, 22.615400314331055, 'Taimali'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3677, '713429', '大武乡', '713400', '大武', 3, '089', '965', '中国,台湾,台东县,大武乡', 120.88999938964844, 22.33989906311035, 'Dawu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3678, '713430', '绿岛乡', '713400', '绿岛', 3, '089', '951', '中国,台湾,台东县,绿岛乡', 121.49299621582031, 22.661699295043945, 'Lvdao'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3679, '713431', '海端乡', '713400', '海端', 3, '089', '957', '中国,台湾,台东县,海端乡', 121.1719970703125, 23.10110092163086, 'Haiduan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3680, '713432', '延平乡', '713400', '延平', 3, '089', '953', '中国,台湾,台东县,延平乡', 121.08399963378906, 22.90239906311035, 'Yanping'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3681, '713433', '金峰乡', '713400', '金峰', 3, '089', '964', '中国,台湾,台东县,金峰乡', 120.97100067138672, 22.595500946044922, 'Jinfeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3682, '713434', '达仁乡', '713400', '达仁', 3, '089', '966', '中国,台湾,台东县,达仁乡', 120.88400268554688, 22.29490089416504, 'Daren'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3683, '713435', '兰屿乡', '713400', '兰屿', 3, '089', '952', '中国,台湾,台东县,兰屿乡', 121.53199768066406, 22.056699752807617, 'Lanyu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3684, '713500', '花莲县', '710000', '花莲', 2, '03', '9', '中国,台湾,花莲县', 121.30000305175781, 23.829999923706055, 'Hualien'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3685, '713501', '花莲市', '713500', '花莲', 3, '03', '970', '中国,台湾,花莲县,花莲市', 121.60700225830078, 23.982099533081055, 'Hualian'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3686, '713521', '凤林镇', '713500', '凤林', 3, '03', '975', '中国,台湾,花莲县,凤林镇', 121.4520034790039, 23.744600296020508, 'Fenglin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3687, '713522', '玉里镇', '713500', '玉里', 3, '03', '981', '中国,台湾,花莲县,玉里镇', 121.31600189208984, 23.33650016784668, 'Yuli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3688, '713523', '新城乡', '713500', '新城', 3, '03', '971', '中国,台湾,花莲县,新城乡', 121.64099884033203, 24.12809944152832, 'Xincheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3689, '713524', '吉安乡', '713500', '吉安', 3, '03', '973', '中国,台湾,花莲县,吉安乡', 121.56800079345703, 23.961599349975586, 'Ji\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3690, '713525', '寿丰乡', '713500', '寿丰', 3, '03', '974', '中国,台湾,花莲县,寿丰乡', 121.50900268554688, 23.87070083618164, 'Shoufeng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3691, '713526', '光复乡', '713500', '光复', 3, '03', '976', '中国,台湾,花莲县,光复乡', 121.4229965209961, 23.669099807739258, 'Guangfu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3692, '713527', '丰滨乡', '713500', '丰滨', 3, '03', '977', '中国,台湾,花莲县,丰滨乡', 121.51899719238281, 23.59709930419922, 'Fengbin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3693, '713528', '瑞穗乡', '713500', '瑞穗', 3, '03', '978', '中国,台湾,花莲县,瑞穗乡', 121.3759994506836, 23.49679946899414, 'Ruisui'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3694, '713529', '富里乡', '713500', '富里', 3, '03', '983', '中国,台湾,花莲县,富里乡', 121.25, 23.18000030517578, 'Fuli'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3695, '713530', '秀林乡', '713500', '秀林', 3, '03', '972', '中国,台湾,花莲县,秀林乡', 121.62000274658203, 24.116600036621094, 'Xiulin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3696, '713531', '万荣乡', '713500', '万荣', 3, '03', '979', '中国,台湾,花莲县,万荣乡', 121.40699768066406, 23.715299606323242, 'Wanrong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3697, '713532', '卓溪乡', '713500', '卓溪', 3, '03', '982', '中国,台湾,花莲县,卓溪乡', 121.3030014038086, 23.346399307250977, 'Zhuoxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3698, '713600', '澎湖县', '710000', '澎湖', 2, '06', '8', '中国,台湾,澎湖县', 119.56600189208984, 23.569700241088867, 'Penghu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3699, '713601', '马公市', '713600', '马公', 3, '06', '880', '中国,台湾,澎湖县,马公市', 119.56600189208984, 23.565799713134766, 'Magong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3700, '713621', '湖西乡', '713600', '湖西', 3, '06', '885', '中国,台湾,澎湖县,湖西乡', 119.66000366210938, 23.58340072631836, 'Huxi'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3701, '713622', '白沙乡', '713600', '白沙', 3, '06', '884', '中国,台湾,澎湖县,白沙乡', 119.5979995727539, 23.666099548339844, 'Baisha'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3702, '713623', '西屿乡', '713600', '西屿', 3, '06', '881', '中国,台湾,澎湖县,西屿乡', 119.50700378417969, 23.600799560546875, 'Xiyu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3703, '713624', '望安乡', '713600', '望安', 3, '06', '882', '中国,台湾,澎湖县,望安乡', 119.5009994506836, 23.357500076293945, 'Wang\'an'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3704, '713625', '七美乡', '713600', '七美', 3, '06', '883', '中国,台湾,澎湖县,七美乡', 119.42400360107422, 23.20599937438965, 'Qimei'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3705, '713700', '金门县', '710000', '金门', 2, '082', '8', '中国,台湾,金门县', 118.31700134277344, 24.43269920349121, 'Jinmen'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3706, '713701', '金城镇', '713700', '金城', 3, '082', '893', '中国,台湾,金门县,金城镇', 118.31700134277344, 24.41670036315918, 'Jincheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3707, '713702', '金湖镇', '713700', '金湖', 3, '082', '891', '中国,台湾,金门县,金湖镇', 118.41999816894531, 24.438600540161133, 'Jinhu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3708, '713703', '金沙镇', '713700', '金沙', 3, '082', '890', '中国,台湾,金门县,金沙镇', 118.4280014038086, 24.48110008239746, 'Jinsha'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3709, '713704', '金宁乡', '713700', '金宁', 3, '082', '892', '中国,台湾,金门县,金宁乡', 118.33499908447266, 24.45669937133789, 'Jinning'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3710, '713705', '烈屿乡', '713700', '烈屿', 3, '082', '894', '中国,台湾,金门县,烈屿乡', 118.24700164794922, 24.4330997467041, 'Lieyu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3711, '713706', '乌丘乡', '713700', '乌丘', 3, '082', '896', '中国,台湾,金门县,乌丘乡', 118.31999969482422, 24.434999465942383, 'Wuqiu'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3712, '713800', '连江县', '710000', '连江', 2, '0836', '2', '中国,台湾,连江县', 119.54000091552734, 26.197399139404297, 'Lienchiang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3713, '713801', '南竿乡', '713800', '南竿', 3, '0836', '209', '中国,台湾,连江县,南竿乡', 119.94400024414062, 26.143999099731445, 'Nangan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3714, '713802', '北竿乡', '713800', '北竿', 3, '0836', '210', '中国,台湾,连江县,北竿乡', 120.0009994506836, 26.222000122070312, 'Beigan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3715, '713803', '莒光乡', '713800', '莒光', 3, '0836', '211', '中国,台湾,连江县,莒光乡', 119.94000244140625, 25.976299285888672, 'Juguang'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3716, '713804', '东引乡', '713800', '东引', 3, '0836', '212', '中国,台湾,连江县,东引乡', 120.49400329589844, 26.366199493408203, 'Dongyin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3717, '-810000', '香港特别行政区', '-100000', '香港', 1, '', '1', '中国,香港特别行政区', 114.1729965209961, 22.31999969482422, 'Hong Kong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3718, '-810100', '香港岛', '-810000', '香港岛', 2, '00852', '999077', '中国,香港特别行政区,香港岛', 114.177001953125, 22.266399383544922, 'Hong Kong Island'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3719, '810101', '中西区', '810100', '中西区', 3, '00852', '999077', '中国,香港特别行政区,香港岛,中西区', 114.15399932861328, 22.281999588012695, 'Central and Western District'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3720, '810102', '湾仔区', '810100', '湾仔区', 3, '00852', '999077', '中国,香港特别行政区,香港岛,湾仔区', 114.18299865722656, 22.276399612426758, 'Wan Chai District'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3721, '810103', '东区', '810100', '东区', 3, '00852', '999077', '中国,香港特别行政区,香港岛,东区', 114.25599670410156, 22.262800216674805, 'Eastern District'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3722, '810104', '南区', '810100', '南区', 3, '00852', '999077', '中国,香港特别行政区,香港岛,南区', 114.17400360107422, 22.24679946899414, 'Southern District'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3723, '810200', '九龙', '810000', '九龙', 2, '00852', '999077', '中国,香港特别行政区,九龙', 114.17500305175781, 22.32710075378418, 'Kowloon'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3724, '810201', '油尖旺区', '810200', '油尖旺', 3, '00852', '999077', '中国,香港特别行政区,九龙,油尖旺区', 114.1729965209961, 22.31170082092285, 'Yau Tsim Mong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3725, '810202', '深水埗区', '810200', '深水埗', 3, '00852', '999077', '中国,香港特别行政区,九龙,深水埗区', 114.16699981689453, 22.32819938659668, 'Sham Shui Po'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3726, '810203', '九龙城区', '810200', '九龙城', 3, '00852', '999077', '中国,香港特别行政区,九龙,九龙城区', 114.19499969482422, 22.32670021057129, 'Jiulongcheng'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3727, '810204', '黄大仙区', '810200', '黄大仙', 3, '00852', '999077', '中国,香港特别行政区,九龙,黄大仙区', 114.1989974975586, 22.336299896240234, 'Wong Tai Sin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3728, '810205', '观塘区', '810200', '观塘', 3, '00852', '999077', '中国,香港特别行政区,九龙,观塘区', 114.23100280761719, 22.30940055847168, 'Kwun Tong'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3729, '810300', '新界', '810000', '新界', 2, '00852', '999077', '中国,香港特别行政区,新界', 114.2020034790039, 22.341800689697266, 'New Territories'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3730, '810301', '荃湾区', '810300', '荃湾', 3, '00852', '999077', '中国,香港特别行政区,新界,荃湾区', 114.12300109863281, 22.371000289916992, 'Tsuen Wan'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3731, '810302', '屯门区', '810300', '屯门', 3, '00852', '999077', '中国,香港特别行政区,新界,屯门区', 113.97699737548828, 22.391000747680664, 'Tuen Mun'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3732, '810303', '元朗区', '810300', '元朗', 3, '00852', '999077', '中国,香港特别行政区,新界,元朗区', 114.04000091552734, 22.443300247192383, 'Yuen Long'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3733, '810304', '北区', '810300', '北区', 3, '00852', '999077', '中国,香港特别行政区,新界,北区', 114.14900207519531, 22.49410057067871, 'North District'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3734, '810305', '大埔区', '810300', '大埔', 3, '00852', '999077', '中国,香港特别行政区,新界,大埔区', 114.1719970703125, 22.44569969177246, 'Tai Po'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3735, '810306', '西贡区', '810300', '西贡', 3, '00852', '999077', '中国,香港特别行政区,新界,西贡区', 114.27899932861328, 22.3794002532959, 'Sai Kung'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3736, '810307', '沙田区', '810300', '沙田', 3, '00852', '999077', '中国,香港特别行政区,新界,沙田区', 114.19200134277344, 22.37929916381836, 'Sha Tin'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3737, '810308', '葵青区', '810300', '葵青', 3, '00852', '999077', '中国,香港特别行政区,新界,葵青区', 114.13899993896484, 22.36389923095703, 'Kwai Tsing'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3738, '810309', '离岛区', '810300', '离岛', 3, '00852', '999077', '中国,香港特别行政区,新界,离岛区', 113.94599914550781, 22.2814998626709, 'Outlying Islands'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3739, '820000', '澳门特别行政区', '-100000', '澳门', 1, '', '1', '中国,澳门特别行政区', 113.54900360107422, 22.198999404907227, 'Macau'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3740, '820100', '澳门半岛', '-820000', '澳门半岛', 2, '00853', '999078', '中国,澳门特别行政区,澳门半岛', 113.54900360107422, 22.19879913330078, 'MacauPeninsula'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3741, '820101', '花地玛堂区', '820100', '花地玛堂区', 3, '00853', '999078', '中国,澳门特别行政区,澳门半岛,花地玛堂区', 113.552001953125, 22.208099365234375, 'Nossa Senhora de Fatima'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3742, '820102', '圣安多尼堂区', '820100', '圣安多尼堂区', 3, '00853', '999078', '中国,澳门特别行政区,澳门半岛,圣安多尼堂区', 113.56400299072266, 22.12380027770996, 'Santo Antonio'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3743, '820103', '大堂区', '820100', '大堂', 3, '00853', '999078', '中国,澳门特别行政区,澳门半岛,大堂区', 113.5530014038086, 22.188400268554688, 'Sé'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3744, '820104', '望德堂区', '820100', '望德堂区', 3, '00853', '999078', '中国,澳门特别行政区,澳门半岛,望德堂区', 113.5510025024414, 22.19409942626953, 'Sao Lazaro'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3745, '820105', '风顺堂区', '820100', '风顺堂区', 3, '00853', '999078', '中国,澳门特别行政区,澳门半岛,风顺堂区', 113.54199981689453, 22.187400817871094, 'Sao Lourenco'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3746, '820200', '氹仔岛', '820000', '氹仔岛', 2, '00853', '999078', '中国,澳门特别行政区,氹仔岛', 113.5780029296875, 22.15679931640625, 'Taipa'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3747, '820201', '嘉模堂区', '820200', '嘉模堂区', 3, '00853', '999078', '中国,澳门特别行政区,氹仔岛,嘉模堂区', 113.56500244140625, 22.14900016784668, 'Our Lady Of Carmel\'s Parish'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3748, '820300', '路环岛', '820000', '路环岛', 2, '00853', '999078', '中国,澳门特别行政区,路环岛', 113.56500244140625, 22.116199493408203, 'Coloane'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3749, '820301', '圣方济各堂区', '820300', '圣方济各堂区', 3, '00853', '999078', '中国,澳门特别行政区,路环岛,圣方济各堂区', 113.55999755859375, 22.12350082397461, 'St Francis Xavier\'s Parish'); +INSERT INTO `sysregion` (`Id`, `Code`, `Name`, `Pid`, `ShortName`, `Level`, `CityCode`, `ZipCode`, `MergerName`, `Lng`, `Lat`, `PinYin`) VALUES (3750, '900000', '钓鱼岛', '-100000', '钓鱼岛', 1, '', '1', '中国,钓鱼岛', 123.47799682617188, 25.742399215698242, 'DiaoyuDao'); diff --git a/Admin.NET/Admin.NET.Application/Const/ApplicationConst.cs b/Admin.NET/Admin.NET.Application/Const/ApplicationConst.cs new file mode 100644 index 0000000..75b82d7 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Const/ApplicationConst.cs @@ -0,0 +1,23 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Application; + +/// +/// 业务应用相关常量 +/// +public class ApplicationConst +{ + /// + /// API分组名称 + /// + //public const string GroupName = "xxx业务应用"; + + public const string ZYGroupName = "志愿业务应用"; + + public const string CPGroupName = "志愿业务应用"; + +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/GlobalUsings.cs b/Admin.NET/Admin.NET.Application/GlobalUsings.cs new file mode 100644 index 0000000..7dd6739 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/GlobalUsings.cs @@ -0,0 +1,22 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +global using Admin.NET.Core; +global using Furion; +global using Furion.DependencyInjection; +global using Furion.DynamicApiController; +global using Furion.FriendlyException; +global using Mapster; +global using Microsoft.AspNetCore.Authorization; +global using Microsoft.AspNetCore.Mvc; +global using Microsoft.Extensions.DependencyInjection; +global using SqlSugar; +global using System; +global using System.Collections.Generic; +global using System.ComponentModel; +global using System.ComponentModel.DataAnnotations; +global using System.Threading.Tasks; +global using System.Linq; \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/OpenApi/DemoOpenApi.cs b/Admin.NET/Admin.NET.Application/OpenApi/DemoOpenApi.cs new file mode 100644 index 0000000..22b91b3 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/OpenApi/DemoOpenApi.cs @@ -0,0 +1,28 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Application; + +///// +///// 示例开放接口 +///// +//[ApiDescriptionSettings("开放接口", Name = "Demo", Order = 100)] +//[Authorize(AuthenticationSchemes = SignatureAuthenticationDefaults.AuthenticationScheme)] +//public class DemoOpenApi : IDynamicApiController +//{ +// private readonly UserManager _userManager; + +// public DemoOpenApi(UserManager userManager) +// { +// _userManager = userManager; +// } + +// [HttpGet("helloWord")] +// public Task HelloWord() +// { +// return Task.FromResult($"Hello word. {_userManager.Account}"); +// } +//} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/Service/BusBatchBase/BusBatchBaseService.cs b/Admin.NET/Admin.NET.Application/Service/BusBatchBase/BusBatchBaseService.cs new file mode 100644 index 0000000..68dae52 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/BusBatchBase/BusBatchBaseService.cs @@ -0,0 +1,238 @@ +using Admin.NET.Core.Service; +using Microsoft.AspNetCore.Http; +using Microsoft.CodeAnalysis.CSharp.Syntax; +namespace Admin.NET.Application; +/// +/// 基础批次表服务 +/// +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 100)] +public class BusBatchBaseService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _rep; + public BusBatchBaseService(SqlSugarRepository rep) + { + _rep = rep; + } + + /// + /// 分页查询基础批次表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Page")] + public async Task> Page(BusBatchBaseInput input) + { + var query = _rep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => + u.ProvinceCode.Contains(input.SearchKey.Trim()) + || u.ProvinceName.Contains(input.SearchKey.Trim()) + || u.Batch.Contains(input.SearchKey.Trim()) + || u.Course.Contains(input.SearchKey.Trim()) + || u.BatchType.Contains(input.SearchKey.Trim()) + || u.PressureRange.Contains(input.SearchKey.Trim()) + ) + .WhereIF(!string.IsNullOrWhiteSpace(input.ProvinceCode), u => u.ProvinceCode.Contains(input.ProvinceCode.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.ProvinceName), u => u.ProvinceName.Contains(input.ProvinceName.Trim())) + .WhereIF(input.Year > 0, u => u.Year == input.Year) + .WhereIF(!string.IsNullOrWhiteSpace(input.Batch), u => u.Batch.Contains(input.Batch.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Course), u => u.Course.Contains(input.Course.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.BatchType), u => u.BatchType.Contains(input.BatchType.Trim())) + .WhereIF(input.Score > 0, u => u.Score == input.Score) + .WhereIF(input.PressureScore > 0, u => u.PressureScore == input.PressureScore) + .WhereIF(!string.IsNullOrWhiteSpace(input.PressureRange), u => u.PressureRange.Contains(input.PressureRange.Trim())) + + // 只进行一次 LEFT JOIN,避免重复 + .LeftJoin((u, p) => u.ProvinceCode == p.ProvinceCode) + + // 去重,避免重复数据 + .Distinct() + + // 按创建时间排序 + .OrderBy(u => u.CreateTime) + + // 选择需要的字段 + .Select((u, p) => new BusBatchBaseOutput + { + Id = u.Id, + ProvinceCode = u.ProvinceCode, + ProvinceCodeProvinceCode = p.ProvinceCode, + ProvinceName = u.ProvinceName, + ProvinceNameProvinceName = p.ProvinceName, + Year = u.Year, + Batch = u.Batch, + Course = u.Course, + BatchType = u.BatchType, + Score = u.Score, + PressureScore = u.PressureScore, + PressureRange = u.PressureRange, + CreateTime = u.CreateTime, + UpdateTime = u.UpdateTime, + CreateUserId = u.CreateUserId, + CreateUserName = u.CreateUserName, + UpdateUserId = u.UpdateUserId, + UpdateUserName = u.UpdateUserName, + IsDelete = u.IsDelete, + }); + + return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); + } + + + /// + /// 增加基础批次表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Add")] + public async Task Add(AddBusBatchBaseInput input) + { + var entity = input.Adapt(); + await _rep.InsertAsync(entity); + return entity.Id; + } + + /// + /// 删除基础批次表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Delete")] + public async Task Delete(DeleteBusBatchBaseInput input) + { + var entity = await _rep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + await _rep.FakeDeleteAsync(entity); //假删除 + //await _rep.DeleteAsync(entity); //真删除 + } + + /// + /// 更新基础批次表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Update")] + public async Task Update(UpdateBusBatchBaseInput input) + { + var entity = input.Adapt(); + await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); + } + + /// + /// 获取基础批次表 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "Detail")] + public async Task Detail([FromQuery] QueryByIdBusBatchBaseInput input) + { + return await _rep.GetFirstAsync(u => u.Id == input.Id); + } + + /// + /// 获取基础批次表列表 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "List")] + public async Task> List([FromQuery] BusBatchBaseInput input) + { + return await _rep.AsQueryable().Select().ToListAsync(); + } + + /// + /// 获取省份Code列表 + /// + /// + /// + [ApiDescriptionSettings(Name = "BusBatchBaseProvinceCodeDropdown"), HttpGet] + public async Task BusBatchBaseProvinceCodeDropdown() + { + return await _rep.Context.Queryable() + .Select(u => new + { + Label = u.Code, + Value = u.Code + } + ).ToListAsync(); + } + /// + /// 获取省份列表 + /// + /// + /// + [ApiDescriptionSettings(Name = "BusBatchBaseProvinceNameDropdown"), HttpGet] + public async Task BusBatchBaseProvinceNameDropdown() + { + return await _rep.Context.Queryable() + .Select(u => new + { + Label = u.Name, + Value = u.Name + } + ).ToListAsync(); + } + + + + /// + /// 根据省份code和批次类型获取批次信息 + /// + /// + /// + [HttpGet] + [AllowAnonymous] + [ApiDescriptionSettings(Name = "batch")] + public async Task Batch([FromQuery] BusBatchRequestDTO requestDTO) + { + if (string.IsNullOrWhiteSpace(requestDTO.LocationCode)) + throw Oops.Oh("locationCode 不能为空"); + + if (string.IsNullOrWhiteSpace(requestDTO.Course)) + { + requestDTO.Course = "综合"; + } + else + { + if (requestDTO.LocationCode == "510000" || requestDTO.LocationCode == "410000") + { + requestDTO.Course = requestDTO.Course.Contains("物") ? "理科" : "文科"; + } + else + { + requestDTO.Course = requestDTO.Course.Contains("物") ? "物理类" : "历史类"; + } + } + var result = new ProvinceBatchResultDto(); + var query = await _rep.AsQueryable().Where(e => e.ProvinceCode == requestDTO.LocationCode) + .Where(e => e.Course == requestDTO.Course) + .Select().ToListAsync(); + + result.Year = query.FirstOrDefault() != null ? query.FirstOrDefault().Year : 0; + result.ProvinceCode = query.FirstOrDefault() != null ? query.FirstOrDefault().ProvinceCode : ""; + result.ProvinceName = query.FirstOrDefault() != null ? query.FirstOrDefault().ProvinceName : ""; + result.MinScore = query.FirstOrDefault() != null ? query.FirstOrDefault().MinScore : 0; + result.MaxScore = query.FirstOrDefault() != null ? query.FirstOrDefault().MaxScore : 0; + result.batches = query.Select(s => new ProvinceBatchItem() + { + Batch = s.Batch, + Year = s.Year, + BatchType = s.BatchType, + Course = s.Course, + Score = s.Score, + PressureScore = s.PressureScore, + PressureRange = s.PressureRange, + }).ToList(); + + return result; + } + + + + +} + diff --git a/Admin.NET/Admin.NET.Application/Service/BusBatchBase/Dto/BusBatchBaseDto.cs b/Admin.NET/Admin.NET.Application/Service/BusBatchBase/Dto/BusBatchBaseDto.cs new file mode 100644 index 0000000..3361a63 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/BusBatchBase/Dto/BusBatchBaseDto.cs @@ -0,0 +1,103 @@ +namespace Admin.NET.Application; + + /// + /// 基础批次表输出参数 + /// + public class BusBatchBaseDto + { + /// + /// 省份Code + /// + public string ProvinceCodeProvinceCode { get; set; } + + /// + /// 省份 + /// + public string ProvinceNameProvinceName { get; set; } + + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 省份Code + /// + public string ProvinceCode { get; set; } + + /// + /// 省份 + /// + public string ProvinceName { get; set; } + + /// + /// 年份 + /// + public int Year { get; set; } + + /// + /// 批次名称 + /// + public string Batch { get; set; } + + /// + /// 类型 + /// + public string Course { get; set; } + + /// + /// 批次类型 + /// + public string BatchType { get; set; } + + /// + /// 批次分 + /// + public int Score { get; set; } + + /// + /// 压力分 + /// + public int PressureScore { get; set; } + + /// + /// 压力分区间 + /// + public string PressureRange { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + + } diff --git a/Admin.NET/Admin.NET.Application/Service/BusBatchBase/Dto/BusBatchBaseInput.cs b/Admin.NET/Admin.NET.Application/Service/BusBatchBase/Dto/BusBatchBaseInput.cs new file mode 100644 index 0000000..fa57f07 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/BusBatchBase/Dto/BusBatchBaseInput.cs @@ -0,0 +1,263 @@ +using Admin.NET.Core; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application; + +/// +/// 基础批次表基础输入参数 +/// +public class BusBatchBaseBaseInput +{ + /// + /// 省份Code + /// + public virtual string ProvinceCode { get; set; } + + /// + /// 省份 + /// + public virtual string ProvinceName { get; set; } + + /// + /// 年份 + /// + public virtual int Year { get; set; } + + /// + /// 批次名称 + /// + public virtual string Batch { get; set; } + + /// + /// 类型 + /// + public virtual string Course { get; set; } + + /// + /// 批次类型 + /// + public virtual string BatchType { get; set; } + + /// + /// 批次分 + /// + public virtual int Score { get; set; } + + /// + /// 压力分 + /// + public virtual int PressureScore { get; set; } + + /// + /// 压力分区间 + /// + public virtual string PressureRange { get; set; } + + /// + /// 创建时间 + /// + public virtual DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public virtual DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public virtual long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public virtual string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public virtual long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public virtual string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public virtual bool IsDelete { get; set; } + +} + + + + +/// +/// 基础批次表分页查询输入参数 +/// +public class BusBatchBaseInput : BasePageInput +{ + /// + /// 关键字查询 + /// + public string? SearchKey { get; set; } + + /// + /// 省份Code + /// + public string? ProvinceCode { get; set; } + + /// + /// 省份 + /// + public string? ProvinceName { get; set; } + + /// + /// 年份 + /// + public int? Year { get; set; } + + /// + /// 批次名称 + /// + public string? Batch { get; set; } + + /// + /// 类型 + /// + public string? Course { get; set; } + + /// + /// 批次类型 + /// + public string? BatchType { get; set; } + + /// + /// 批次分 + /// + public int? Score { get; set; } + + /// + /// 压力分 + /// + public int? PressureScore { get; set; } + + /// + /// 压力分区间 + /// + public string? PressureRange { get; set; } + +} + + +/// +/// +/// +public class BusBatchRequestDTO +{ + /// + /// + /// + public string LocationCode { get; set; } + + /// + /// + /// + public string Course { get; set; } + +} + +/// +/// 基础批次表增加输入参数 +/// +public class AddBusBatchBaseInput : BusBatchBaseBaseInput +{ + /// + /// 省份Code + /// + [Required(ErrorMessage = "省份Code不能为空")] + public override string ProvinceCode { get; set; } + + /// + /// 省份 + /// + [Required(ErrorMessage = "省份不能为空")] + public override string ProvinceName { get; set; } + + /// + /// 年份 + /// + [Required(ErrorMessage = "年份不能为空")] + public override int Year { get; set; } + + /// + /// 批次名称 + /// + [Required(ErrorMessage = "批次名称不能为空")] + public override string Batch { get; set; } + + /// + /// 类型 + /// + [Required(ErrorMessage = "类型不能为空")] + public override string Course { get; set; } + + /// + /// 批次类型 + /// + [Required(ErrorMessage = "批次类型不能为空")] + public override string BatchType { get; set; } + + /// + /// 批次分 + /// + [Required(ErrorMessage = "批次分不能为空")] + public override int Score { get; set; } + + /// + /// 压力分 + /// + [Required(ErrorMessage = "压力分不能为空")] + public override int PressureScore { get; set; } + + /// + /// 压力分区间 + /// + public override string PressureRange { get; set; } + + /// + /// 软删除 + /// + [Required(ErrorMessage = "软删除不能为空")] + public override bool IsDelete { get; set; } + +} + +/// +/// 基础批次表删除输入参数 +/// +public class DeleteBusBatchBaseInput : BaseIdInput +{ +} + +/// +/// 基础批次表更新输入参数 +/// +public class UpdateBusBatchBaseInput : BusBatchBaseBaseInput +{ + /// + /// 主键Id + /// + [Required(ErrorMessage = "主键Id不能为空")] + public long Id { get; set; } + +} + +/// +/// 基础批次表主键查询输入参数 +/// +public class QueryByIdBusBatchBaseInput : DeleteBusBatchBaseInput +{ + +} diff --git a/Admin.NET/Admin.NET.Application/Service/BusBatchBase/Dto/BusBatchBaseOutput.cs b/Admin.NET/Admin.NET.Application/Service/BusBatchBase/Dto/BusBatchBaseOutput.cs new file mode 100644 index 0000000..995901a --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/BusBatchBase/Dto/BusBatchBaseOutput.cs @@ -0,0 +1,149 @@ +namespace Admin.NET.Application; + +/// +/// 基础批次表输出参数 +/// +public class BusBatchBaseOutput +{ + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 省份Code + /// + public string ProvinceCode { get; set; } + + /// + /// 省份Code 描述 + /// + public string ProvinceCodeProvinceCode { get; set; } + + /// + /// 省份 + /// + public string ProvinceName { get; set; } + + /// + /// 省份 描述 + /// + public string ProvinceNameProvinceName { get; set; } + + /// + /// 年份 + /// + public int Year { get; set; } + + /// + /// 批次名称 + /// + public string Batch { get; set; } + + /// + /// 类型 + /// + public string Course { get; set; } + + /// + /// 批次类型 + /// + public string BatchType { get; set; } + + /// + /// 批次分 + /// + public int Score { get; set; } + + /// + /// 压力分 + /// + public int PressureScore { get; set; } + + /// + /// 压力分区间 + /// + public string PressureRange { get; set; } + + + /// + /// 批次最低分 + /// + public int MinScore { get; set; } + + /// + /// 批次最高分 + /// + public int MaxScore { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + +} + + + + + + +public class ProvinceBatchResultDto +{ + public string ProvinceCode { get; set; } + public string ProvinceName { get; set; } + public int Year { get; set; } + /// + /// 批次最低分 + /// + public int MinScore { get; set; } + + /// + /// 批次最高分 + /// + public int MaxScore { get; set; } + public List batches { get; set; } +} + +public class ProvinceBatchItem +{ + public int Year { get; set; } + public string Batch { get; set; } + public string Course { get; set; } + public string BatchType { get; set; } + public int Score { get; set; } + public int PressureScore { get; set; } + public string PressureRange { get; set; } +} + + diff --git a/Admin.NET/Admin.NET.Application/Service/BusProduct/BusProductService.cs b/Admin.NET/Admin.NET.Application/Service/BusProduct/BusProductService.cs new file mode 100644 index 0000000..2fbdc91 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/BusProduct/BusProductService.cs @@ -0,0 +1,136 @@ +using Admin.NET.Core.Service; +using Microsoft.AspNetCore.Http; +namespace Admin.NET.Application; +/// +/// 基础产品信息服务 +/// +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 100)] +public class BusProductService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _rep; + public BusProductService(SqlSugarRepository rep) + { + _rep = rep; + } + + /// + /// 分页查询基础产品信息 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Page")] + public async Task> Page(BusProductInput input) + { + var query = _rep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => + u.Name.Contains(input.SearchKey.Trim()) + || u.Image.Contains(input.SearchKey.Trim()) + || u.Summary.Contains(input.SearchKey.Trim()) + ) + .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Image), u => u.Image.Contains(input.Image.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Summary), u => u.Summary.Contains(input.Summary.Trim())) + //处理外键和TreeSelector相关字段的连接 + .OrderBy(u => u.CreateTime) + .Select((u) => new BusProductOutput + { + Id = u.Id, + Name = u.Name, + Price = u.Price, + Image = u.Image, + Summary = u.Summary, + CreateTime = u.CreateTime, + UpdateTime = u.UpdateTime, + CreateUserId = u.CreateUserId, + CreateUserName = u.CreateUserName, + UpdateUserId = u.UpdateUserId, + UpdateUserName = u.UpdateUserName, + IsDelete = u.IsDelete, + }); + //.Mapper(c => c.ImageAttachment, c => c.Image) + return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 增加基础产品信息 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Add")] + public async Task Add(AddBusProductInput input) + { + var entity = input.Adapt(); + await _rep.InsertAsync(entity); + return entity.Id; + } + + /// + /// 删除基础产品信息 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Delete")] + public async Task Delete(DeleteBusProductInput input) + { + var entity = await _rep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + await _rep.FakeDeleteAsync(entity); //假删除 + //await _rep.DeleteAsync(entity); //真删除 + } + + /// + /// 更新基础产品信息 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Update")] + public async Task Update(UpdateBusProductInput input) + { + var entity = input.Adapt(); + await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); + } + + /// + /// 获取基础产品信息 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "Detail")] + public async Task Detail([FromQuery] QueryByIdBusProductInput input) + { + return await _rep.GetFirstAsync(u => u.Id == input.Id); + } + + /// + /// 获取基础产品信息列表 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "List")] + public async Task> List([FromQuery] BusProductInput input) + { + return await _rep.AsQueryable().Select().ToListAsync(); + } + + + /// + /// 上传产品图片 + /// + /// + /// + [ApiDescriptionSettings(Name = "UploadImage"), HttpPost] + public async Task UploadImage([Required] IFormFile file) + { + var service = App.GetRequiredService(); + return await service.UploadFile(file, "upload/Image"); + } + + + +} + diff --git a/Admin.NET/Admin.NET.Application/Service/BusProduct/Dto/BusProductDto.cs b/Admin.NET/Admin.NET.Application/Service/BusProduct/Dto/BusProductDto.cs new file mode 100644 index 0000000..f546f2b --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/BusProduct/Dto/BusProductDto.cs @@ -0,0 +1,68 @@ +namespace Admin.NET.Application; + + /// + /// 基础产品信息输出参数 + /// + public class BusProductDto + { + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 产品名称 + /// + public string Name { get; set; } + + /// + /// 产品单价 + /// + public decimal Price { get; set; } + + /// + /// 产品图片 + /// + public string? Image { get; set; } + + /// + /// 产品简介 + /// + public string? Summary { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + + } diff --git a/Admin.NET/Admin.NET.Application/Service/BusProduct/Dto/BusProductInput.cs b/Admin.NET/Admin.NET.Application/Service/BusProduct/Dto/BusProductInput.cs new file mode 100644 index 0000000..26156f8 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/BusProduct/Dto/BusProductInput.cs @@ -0,0 +1,151 @@ +using Admin.NET.Core; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application; + + /// + /// 基础产品信息基础输入参数 + /// + public class BusProductBaseInput + { + /// + /// 产品名称 + /// + public virtual string Name { get; set; } + + /// + /// 产品单价 + /// + public virtual decimal Price { get; set; } + + /// + /// 产品图片 + /// + public virtual string? Image { get; set; } + + /// + /// 产品简介 + /// + public virtual string? Summary { get; set; } + + /// + /// 创建时间 + /// + public virtual DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public virtual DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public virtual long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public virtual string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public virtual long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public virtual string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public virtual bool IsDelete { get; set; } + + } + + /// + /// 基础产品信息分页查询输入参数 + /// + public class BusProductInput : BasePageInput + { + /// + /// 关键字查询 + /// + public string? SearchKey { get; set; } + + /// + /// 产品名称 + /// + public string? Name { get; set; } + + /// + /// 产品单价 + /// + public decimal? Price { get; set; } + + /// + /// 产品图片 + /// + public string? Image { get; set; } + + /// + /// 产品简介 + /// + public string? Summary { get; set; } + + } + + /// + /// 基础产品信息增加输入参数 + /// + public class AddBusProductInput : BusProductBaseInput + { + /// + /// 产品名称 + /// + [Required(ErrorMessage = "产品名称不能为空")] + public override string Name { get; set; } + + /// + /// 产品单价 + /// + [Required(ErrorMessage = "产品单价不能为空")] + public override decimal Price { get; set; } + + /// + /// 软删除 + /// + [Required(ErrorMessage = "软删除不能为空")] + public override bool IsDelete { get; set; } + + } + + /// + /// 基础产品信息删除输入参数 + /// + public class DeleteBusProductInput : BaseIdInput + { + } + + /// + /// 基础产品信息更新输入参数 + /// + public class UpdateBusProductInput : BusProductBaseInput + { + /// + /// 主键Id + /// + [Required(ErrorMessage = "主键Id不能为空")] + public long Id { get; set; } + + } + + /// + /// 基础产品信息主键查询输入参数 + /// + public class QueryByIdBusProductInput : DeleteBusProductInput + { + + } diff --git a/Admin.NET/Admin.NET.Application/Service/BusProduct/Dto/BusProductOutput.cs b/Admin.NET/Admin.NET.Application/Service/BusProduct/Dto/BusProductOutput.cs new file mode 100644 index 0000000..a6b6a11 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/BusProduct/Dto/BusProductOutput.cs @@ -0,0 +1,71 @@ +namespace Admin.NET.Application; + +/// +/// 基础产品信息输出参数 +/// +public class BusProductOutput +{ + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 产品名称 + /// + public string Name { get; set; } + + /// + /// 产品单价 + /// + public decimal Price { get; set; } + + /// + /// 产品图片 + /// + public string? Image { get; set; } + public SysFile ImageAttachment { get; set; } + + /// + /// 产品简介 + /// + public string? Summary { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + + } + + diff --git a/Admin.NET/Admin.NET.Application/Service/BusProvinceInitialization/BusProvinceInitializationService.cs b/Admin.NET/Admin.NET.Application/Service/BusProvinceInitialization/BusProvinceInitializationService.cs new file mode 100644 index 0000000..6b32ebb --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/BusProvinceInitialization/BusProvinceInitializationService.cs @@ -0,0 +1,65 @@ +using Admin.NET.Core.Service; +using Microsoft.AspNetCore.Http; +namespace Admin.NET.Application; +/// +/// 各省份政策初始化表服务 +/// +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 800)] +public class BusProvinceInitializationService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _rep; + public BusProvinceInitializationService(SqlSugarRepository rep) + { + _rep = rep; + } + + + + + /// + /// 获取各省份政策初始化表列表 + /// + /// + [HttpGet] + [AllowAnonymous] + [ApiDescriptionSettings(Name = "List")] + public async Task> List() + { + int currentYear = DateTime.Now.Year; + var response = new List(); + var query = await _rep.AsQueryable().Where(e => e.IsDelete == false).Select().ToListAsync(); + query.ForEach(a => + { + + response.Add(new ProvinceInitializationOutputDto() + { + Allscore = a.Allscore, + Code = a.Code, + Policy = a.Policy, + Provincename = a.Provincename, + lizations = GenerateLizations(currentYear) + + }); + }); + return response; + } + + private static List GenerateLizations(int currentYear) + { + string[] chineseNumbers = { "一", "二", "三"}; + return Enumerable.Range(0, 3) + .Select(i => new Lization + { + Name = $"{currentYear + i}(现高{chineseNumbers[2 - i]})", + + Code = currentYear + i + }) + .ToList(); + } + + + + + +} + diff --git a/Admin.NET/Admin.NET.Application/Service/BusProvinceInitialization/Dto/BusProvinceInitializationDto.cs b/Admin.NET/Admin.NET.Application/Service/BusProvinceInitialization/Dto/BusProvinceInitializationDto.cs new file mode 100644 index 0000000..719d686 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/BusProvinceInitialization/Dto/BusProvinceInitializationDto.cs @@ -0,0 +1,68 @@ +namespace Admin.NET.Application; + + /// + /// 各省份政策初始化表输出参数 + /// + public class BusProvinceInitializationDto + { + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 省份Code + /// + public string? code { get; set; } + + /// + /// 省份名称 + /// + public string? provincename { get; set; } + + /// + /// 政策类型 + /// + public int? policy { get; set; } + + /// + /// 省份总分 + /// + public int? allscore { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + + } diff --git a/Admin.NET/Admin.NET.Application/Service/BusProvinceInitialization/Dto/BusProvinceInitializationInput.cs b/Admin.NET/Admin.NET.Application/Service/BusProvinceInitialization/Dto/BusProvinceInitializationInput.cs new file mode 100644 index 0000000..daeeca7 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/BusProvinceInitialization/Dto/BusProvinceInitializationInput.cs @@ -0,0 +1,139 @@ +using Admin.NET.Core; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application; + + /// + /// 各省份政策初始化表基础输入参数 + /// + public class BusProvinceInitializationBaseInput + { + /// + /// 省份Code + /// + public virtual string? code { get; set; } + + /// + /// 省份名称 + /// + public virtual string? provincename { get; set; } + + /// + /// 政策类型 + /// + public virtual int? policy { get; set; } + + /// + /// 省份总分 + /// + public virtual int? allscore { get; set; } + + /// + /// 创建时间 + /// + public virtual DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public virtual DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public virtual long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public virtual string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public virtual long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public virtual string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public virtual bool IsDelete { get; set; } + + } + + /// + /// 各省份政策初始化表分页查询输入参数 + /// + public class BusProvinceInitializationInput : BasePageInput + { + /// + /// 关键字查询 + /// + public string? SearchKey { get; set; } + + /// + /// 省份Code + /// + public string? code { get; set; } + + /// + /// 省份名称 + /// + public string? provincename { get; set; } + + /// + /// 政策类型 + /// + public int? policy { get; set; } + + /// + /// 省份总分 + /// + public int? allscore { get; set; } + + } + + /// + /// 各省份政策初始化表增加输入参数 + /// + public class AddBusProvinceInitializationInput : BusProvinceInitializationBaseInput + { + /// + /// 软删除 + /// + [Required(ErrorMessage = "软删除不能为空")] + public override bool IsDelete { get; set; } + + } + + /// + /// 各省份政策初始化表删除输入参数 + /// + public class DeleteBusProvinceInitializationInput : BaseIdInput + { + } + + /// + /// 各省份政策初始化表更新输入参数 + /// + public class UpdateBusProvinceInitializationInput : BusProvinceInitializationBaseInput + { + /// + /// 主键Id + /// + [Required(ErrorMessage = "主键Id不能为空")] + public long Id { get; set; } + + } + + /// + /// 各省份政策初始化表主键查询输入参数 + /// + public class QueryByIdBusProvinceInitializationInput : DeleteBusProvinceInitializationInput + { + + } diff --git a/Admin.NET/Admin.NET.Application/Service/BusProvinceInitialization/Dto/BusProvinceInitializationOutput.cs b/Admin.NET/Admin.NET.Application/Service/BusProvinceInitialization/Dto/BusProvinceInitializationOutput.cs new file mode 100644 index 0000000..836445e --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/BusProvinceInitialization/Dto/BusProvinceInitializationOutput.cs @@ -0,0 +1,101 @@ +namespace Admin.NET.Application; + +/// +/// 各省份政策初始化表输出参数 +/// +public class BusProvinceInitializationOutput +{ + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 省份Code + /// + public string? Code { get; set; } + + /// + /// 省份名称 + /// + public string? Provincename { get; set; } + + /// + /// 政策类型 + /// + public int? Policy { get; set; } + + /// + /// 省份总分 + /// + public int? Allscore { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + +} + +public class ProvinceInitializationOutputDto +{ + /// + /// 省份Code + /// + public string? Code { get; set; } + + /// + /// 省份名称 + /// + public string? Provincename { get; set; } + + /// + /// 政策类型 + /// + public int? Policy { get; set; } + + /// + /// 省份总分 + /// + public int? Allscore { get; set; } + + public List lizations { get; set; } + + +} + +public class Lization +{ + public string Name { get; set; }// "2025(现高三)", + public int Code { get; set; }// 2025 +} diff --git a/Admin.NET/Admin.NET.Application/Service/BusVipCardInfo/BusVipCardInfoService.cs b/Admin.NET/Admin.NET.Application/Service/BusVipCardInfo/BusVipCardInfoService.cs new file mode 100644 index 0000000..bfb4572 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/BusVipCardInfo/BusVipCardInfoService.cs @@ -0,0 +1,231 @@ +using Admin.NET.Core.Service; +using Microsoft.AspNetCore.Http; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Minio.DataModel; +using OfficeOpenXml.FormulaParsing.Excel.Functions.Math; +namespace Admin.NET.Application; +/// +/// Vip卡生成服务 +/// +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 100)] +public class BusVipCardInfoService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _rep; + private readonly SqlSugarRepository _dictdata; + public BusVipCardInfoService(SqlSugarRepository rep, SqlSugarRepository _dictrep) + { + _rep = rep; + _dictdata = _dictrep; + } + + /// + /// 分页查询Vip卡生成 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Page")] + public async Task> Page(BusVipCardInfoInput input) + { + var query = _rep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => + u.Code.Contains(input.SearchKey.Trim()) + || u.Pwd.Contains(input.SearchKey.Trim()) + ) + .WhereIF(!string.IsNullOrWhiteSpace(input.Code), u => u.Code.Contains(input.Code.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Pwd), u => u.Pwd.Contains(input.Pwd.Trim())) + .WhereIF(input.IsBind > 0, u => u.IsBind == input.IsBind) + .WhereIF(input.Day > 0, u => u.Day == input.Day) + .WhereIF(input.CardTypeId > 0, u => u.CardTypeId == input.CardTypeId) + //处理外键和TreeSelector相关字段的连接 + .LeftJoin((u, cardtypeid) => u.CardTypeId == cardtypeid.Id) + .OrderBy(u => u.CreateTime) + .Select((u, cardtypeid) => new BusVipCardInfoOutput + { + Id = u.Id, + Code = u.Code, + Pwd = u.Pwd, + IsBind = u.IsBind, + Day = u.Day, + EndTime = u.EndTime, + Money = u.Money, + CardTypeId = u.CardTypeId, + CardTypeIdName = cardtypeid.Name, + TenantId = u.TenantId, + CreateTime = u.CreateTime, + UpdateTime = u.UpdateTime, + CreateUserId = u.CreateUserId, + CreateUserName = u.CreateUserName, + UpdateUserId = u.UpdateUserId, + UpdateUserName = u.UpdateUserName, + IsDelete = u.IsDelete, + }); + if (input.EndTimeRange != null && input.EndTimeRange.Count > 0) + { + DateTime? start = input.EndTimeRange[0]; + query = query.WhereIF(start.HasValue, u => u.EndTime > start); + if (input.EndTimeRange.Count > 1 && input.EndTimeRange[1].HasValue) + { + var end = input.EndTimeRange[1].Value.AddDays(1); + query = query.Where(u => u.EndTime < end); + } + } + return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 增加Vip卡生成 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Add")] + public async Task Add(AddBusVipCardInfoInput input) + { + var entity = input.Adapt(); + await _rep.InsertAsync(entity); + return entity.Id; + } + + /// + /// 删除Vip卡生成 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Delete")] + public async Task Delete(DeleteBusVipCardInfoInput input) + { + var entity = await _rep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + await _rep.FakeDeleteAsync(entity); //假删除 + //await _rep.DeleteAsync(entity); //真删除 + } + + /// + /// 更新Vip卡生成 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Update")] + public async Task Update(UpdateBusVipCardInfoInput input) + { + var entity = input.Adapt(); + await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); + } + + /// + /// 获取Vip卡生成 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "Detail")] + public async Task Detail([FromQuery] QueryByIdBusVipCardInfoInput input) + { + return await _rep.GetFirstAsync(u => u.Id == input.Id); + } + + /// + /// 获取Vip卡生成列表 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "List")] + public async Task> List([FromQuery] BusVipCardInfoInput input) + { + return await _rep.AsQueryable().Select().ToListAsync(); + } + + /// + /// 获取卡类型Id列表 + /// + /// + /// + [ApiDescriptionSettings(Name = "SysDictDataCardTypeIdDropdown"), HttpGet] + public async Task SysDictDataCardTypeIdDropdown() + { + return await _rep.Context.Queryable().Where(e => e.DictTypeId == 656829828702277) + .Select(u => new + { + Label = u.Name, + Value = u.Id + } + ).ToListAsync(); + } + + + /// + /// 批量生成卡号(只可以生成高三的一年卡) + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "GenerateVipCards")] + public async Task GenerateVipCards([FromBody] GenrateVipCardRequestDto genrate) + { + + if (genrate.Count <= 0 || string.IsNullOrWhiteSpace(genrate.Prefix)) + { + throw Oops.Oh("参数无效"); + } + + var cardtypeInfo = await _dictdata.AsQueryable().Where(e => e.Id == genrate.CardTypeId).FirstAsync(); + if (cardtypeInfo == null) + throw Oops.Oh("卡类型无效"); + + var random = new Random(); + var generatedCards = new List(); + + // 1. 查询数据库中已有的卡号,放入 HashSet + var existingCodes = new HashSet(await _rep.AsQueryable().Select(c => c.Code) + .ToListAsync()); + // 计算卡号有效期,统一截止至当年8月31日 + DateTime now = DateTime.UtcNow; + DateTime expiryDate = new DateTime(now.Year, 8, 31, 23, 59, 59); + if (now > expiryDate) // 如果当前时间已过8月31日,则设置为下一年的8月31日 + { + expiryDate = expiryDate.AddYears(1); + } + + + while (generatedCards.Count < genrate.Count) + { + var newCodes = new HashSet(); + + // 2. 一次性生成 count * 2 个随机卡号,避免频繁检查 + while (newCodes.Count < genrate.Count * 2) + { + string cardNumber = genrate.Prefix + random.Next(100000, 999999); // 6 位随机数 + if (!existingCodes.Contains(cardNumber)) // 只添加不重复的 + { + newCodes.Add(cardNumber); + } + } + + // 3. 过滤掉已经在数据库中的卡号 + var uniqueNewCodes = newCodes.Except(existingCodes).Take(genrate.Count - generatedCards.Count).ToList(); + + // 4. 生成卡信息 + generatedCards.AddRange(uniqueNewCodes.Select(cardNumber => new BusVipCardInfo + { + Code = cardNumber, + Pwd = random.Next(100000, 999999).ToString(), + IsBind = 0, + Day = (expiryDate - now).Days, // 剩余天数 + EndTime = expiryDate, + Money = decimal.Parse(cardtypeInfo.Code), + CardTypeId = genrate.CardTypeId, + })); + } + // 6. 批量插入数据库 + await _rep.InsertRangeAsync(generatedCards); + + return generatedCards; + } + + + + +} + diff --git a/Admin.NET/Admin.NET.Application/Service/BusVipCardInfo/Dto/BusVipCardInfoDto.cs b/Admin.NET/Admin.NET.Application/Service/BusVipCardInfo/Dto/BusVipCardInfoDto.cs new file mode 100644 index 0000000..8f7bae2 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/BusVipCardInfo/Dto/BusVipCardInfoDto.cs @@ -0,0 +1,93 @@ +namespace Admin.NET.Application; + + /// + /// Vip卡生成输出参数 + /// + public class BusVipCardInfoDto + { + /// + /// 卡类型Id + /// + public string? CardTypeIdName { get; set; } + + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 卡号 + /// + public string? Code { get; set; } + + /// + /// 卡密码 + /// + public string? Pwd { get; set; } + + /// + /// 是否绑定 + /// + public int IsBind { get; set; } + + /// + /// 卡号有效时间 + /// + public int Day { get; set; } + + /// + /// 到期时间 + /// + public DateTime EndTime { get; set; } + + /// + /// 金额 + /// + public decimal Money { get; set; } + + /// + /// 卡类型Id + /// + public long CardTypeId { get; set; } + + /// + /// 租户Id + /// + public long? TenantId { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + + } diff --git a/Admin.NET/Admin.NET.Application/Service/BusVipCardInfo/Dto/BusVipCardInfoInput.cs b/Admin.NET/Admin.NET.Application/Service/BusVipCardInfo/Dto/BusVipCardInfoInput.cs new file mode 100644 index 0000000..ad94957 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/BusVipCardInfo/Dto/BusVipCardInfoInput.cs @@ -0,0 +1,223 @@ +using Admin.NET.Core; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application; + +/// +/// Vip卡生成基础输入参数 +/// +public class BusVipCardInfoBaseInput +{ + /// + /// 卡号 + /// + public virtual string? Code { get; set; } + + /// + /// 卡密码 + /// + public virtual string? Pwd { get; set; } + + /// + /// 是否绑定 + /// + public virtual int IsBind { get; set; } + + /// + /// 卡号有效时间 + /// + public virtual int Day { get; set; } + + /// + /// 到期时间 + /// + public virtual DateTime EndTime { get; set; } + + /// + /// 金额 + /// + public virtual decimal Money { get; set; } + + /// + /// 卡类型Id + /// + public virtual long CardTypeId { get; set; } + + /// + /// 租户Id + /// + public virtual long? TenantId { get; set; } + + /// + /// 创建时间 + /// + public virtual DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public virtual DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public virtual long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public virtual string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public virtual long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public virtual string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public virtual bool IsDelete { get; set; } + +} + +public class GenrateVipCardRequestDto +{ + /// + ///卡号数量 + /// + public int Count { get; set; } + + public long CardTypeId { get; set; } + /// + /// 卡号前缀 + /// + public string Prefix { get; set; } + +} + +/// +/// Vip卡生成分页查询输入参数 +/// +public class BusVipCardInfoInput : BasePageInput +{ + /// + /// 关键字查询 + /// + public string? SearchKey { get; set; } + + /// + /// 卡号 + /// + public string? Code { get; set; } + + /// + /// 卡密码 + /// + public string? Pwd { get; set; } + + /// + /// 是否绑定 + /// + public int? IsBind { get; set; } + + /// + /// 卡号有效时间 + /// + public int? Day { get; set; } + + /// + /// 到期时间 + /// + public DateTime? EndTime { get; set; } + + /// + /// 到期时间范围 + /// + public List EndTimeRange { get; set; } + /// + /// 金额 + /// + public decimal? Money { get; set; } + + /// + /// 卡类型Id + /// + public long? CardTypeId { get; set; } + +} + +/// +/// Vip卡生成增加输入参数 +/// +public class AddBusVipCardInfoInput : BusVipCardInfoBaseInput +{ + /// + /// 是否绑定 + /// + [Required(ErrorMessage = "是否绑定不能为空")] + public override int IsBind { get; set; } + + /// + /// 卡号有效时间 + /// + [Required(ErrorMessage = "卡号有效时间不能为空")] + public override int Day { get; set; } + + /// + /// 到期时间 + /// + [Required(ErrorMessage = "到期时间不能为空")] + public override DateTime EndTime { get; set; } + + /// + /// 金额 + /// + [Required(ErrorMessage = "金额不能为空")] + public override decimal Money { get; set; } + + /// + /// 卡类型Id + /// + [Required(ErrorMessage = "卡类型Id不能为空")] + public override long CardTypeId { get; set; } + + /// + /// 软删除 + /// + [Required(ErrorMessage = "软删除不能为空")] + public override bool IsDelete { get; set; } + +} + +/// +/// Vip卡生成删除输入参数 +/// +public class DeleteBusVipCardInfoInput : BaseIdInput +{ +} + +/// +/// Vip卡生成更新输入参数 +/// +public class UpdateBusVipCardInfoInput : BusVipCardInfoBaseInput +{ + /// + /// 主键Id + /// + [Required(ErrorMessage = "主键Id不能为空")] + public long Id { get; set; } + +} + +/// +/// Vip卡生成主键查询输入参数 +/// +public class QueryByIdBusVipCardInfoInput : DeleteBusVipCardInfoInput +{ + +} diff --git a/Admin.NET/Admin.NET.Application/Service/BusVipCardInfo/Dto/BusVipCardInfoOutput.cs b/Admin.NET/Admin.NET.Application/Service/BusVipCardInfo/Dto/BusVipCardInfoOutput.cs new file mode 100644 index 0000000..f59f941 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/BusVipCardInfo/Dto/BusVipCardInfoOutput.cs @@ -0,0 +1,95 @@ +namespace Admin.NET.Application; + +/// +/// Vip卡生成输出参数 +/// +public class BusVipCardInfoOutput +{ + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 卡号 + /// + public string? Code { get; set; } + + /// + /// 卡密码 + /// + public string? Pwd { get; set; } + + /// + /// 是否绑定 + /// + public int IsBind { get; set; } + + /// + /// 卡号有效时间 + /// + public int Day { get; set; } + + /// + /// 到期时间 + /// + public DateTime EndTime { get; set; } + + /// + /// 金额 + /// + public decimal Money { get; set; } + + /// + /// 卡类型Id + /// + public long CardTypeId { get; set; } + + /// + /// 卡类型Id 描述 + /// + public string? CardTypeIdName { get; set; } + + /// + /// 租户Id + /// + public long? TenantId { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + + } + + diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusClassInfo/BusClassInfoService.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusClassInfo/BusClassInfoService.cs new file mode 100644 index 0000000..d03bc29 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusClassInfo/BusClassInfoService.cs @@ -0,0 +1,137 @@ +using Admin.NET.Core; +using Furion.DatabaseAccessor; +using Furion.DependencyInjection; +using Furion.DynamicApiController; +using Furion.FriendlyException; +using Mapster; +using Microsoft.AspNetCore.Mvc; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// 班级表服务 + /// + [ApiDescriptionSettings(ApplicationConst.CPGroupName, Name = "BusClassInfo", Order = 100)] + public class BusClassInfoService : IDynamicApiController, ITransient + { + private readonly SqlSugarRepository _busClassInfoRep; + private readonly SqlSugarRepository _busGradeRep; + private readonly UserManager _userManager; + public BusClassInfoService( + SqlSugarRepository busGradeRep, + SqlSugarRepository busClassInfoRep, UserManager userManager) + { + _busGradeRep = busGradeRep; + _busClassInfoRep = busClassInfoRep; + _userManager = userManager; + } + + /// + /// 分页查询班级表 + /// + /// + /// + [HttpGet("page")] + public async Task> Page([FromQuery] BusClassInfoInput input) + { + var busClassInfos = await _busClassInfoRep.AsQueryable() + .WhereIF(input.GradeId > 0, u => u.GradeId == input.GradeId) + .WhereIF(!string.IsNullOrEmpty(input.Name), u => u.Name == input.Name) + .WhereIF(!string.IsNullOrEmpty(input.NumberCode), u => u.NumberCode == input.NumberCode) + //.Where(u => u.Sort == input.Sort) + .Where(u => u.TenantId == _userManager.TenantId) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .Select(s => new BusClassInfoOutput() + { + GradeId = s.GradeId, + Name = s.Name, + NumberCode = s.NumberCode, + Sort = s.Sort, + TenantId = s.TenantId.Value, + Id = s.Id + }) + .ToPagedListAsync(input.Page, input.PageSize); + + return busClassInfos; + } + + /// + /// 增加班级表 + /// + /// + /// + [HttpPost("add")] + public async Task Add(AddBusClassInfoInput input) + { + + var busClassInfo = input.Adapt(); + busClassInfo.TenantId = _userManager.TenantId; + await _busClassInfoRep.InsertAsync(busClassInfo); + } + + /// + /// 删除班级表 + /// + /// + /// + [HttpPost("delete")] + public async Task Delete(DeleteBusClassInfoInput input) + { + var busClassInfo = await _busClassInfoRep.AsQueryable().FirstAsync(u => u.Id == input.Id); + await _busClassInfoRep.FakeDeleteAsync(busClassInfo); + } + + /// + /// 更新班级表 + /// + /// + /// + [HttpPost("edit")] + public async Task Update(UpdateBusClassInfoInput input) + { + var isExist = await _busClassInfoRep.AsQueryable().AnyAsync(u => u.Id == input.Id); + if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3000); + + var busClassInfo = input.Adapt(); + await _busClassInfoRep.UpdateAsync(busClassInfo); + } + + /// + /// 获取班级表 + /// + /// + /// + [HttpGet("detail")] + public async Task Get([FromQuery] QueryeBusClassInfoInput input) + { + return (await _busClassInfoRep.AsQueryable().FirstAsync(u => u.Id == input.Id)).Adapt(); + } + + /// + /// 获取班级表列表 + /// + /// + /// + [HttpGet("list")] + public async Task> List([FromQuery] BusClassInfoInput input) + { + return await _busClassInfoRep.AsQueryable().Select().ToListAsync(); + } + + /// + /// 获取BusGrade列表 + /// + /// + [HttpGet("fkBusGrade")] + public async Task FkBusGradeList() + { + var list = await _busGradeRep.AsQueryable().ToListAsync(); + return list.Select(e => new { Code = e.Id, Name = e.Name }); + } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusClassInfo/Dto/BusClassInfoDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusClassInfo/Dto/BusClassInfoDto.cs new file mode 100644 index 0000000..f312178 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusClassInfo/Dto/BusClassInfoDto.cs @@ -0,0 +1,46 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 班级表输出参数 + /// + public class BusClassInfoDto + { + /// + /// 年级 + /// + public string BusGradeName { get; set; } + + /// + /// 年级 + /// + public long GradeId { get; set; } + + /// + /// 班级名称 + /// + public string Name { get; set; } + + /// + /// 班级编号 + /// + public string NumberCode { get; set; } + + /// + /// 数据排序 + /// + public int Sort { get; set; } + + /// + /// 租户id + /// + public long TenantId { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusClassInfo/Dto/BusClassInfoInput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusClassInfo/Dto/BusClassInfoInput.cs new file mode 100644 index 0000000..7fa1159 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusClassInfo/Dto/BusClassInfoInput.cs @@ -0,0 +1,61 @@ +using Admin.NET.Core; +using System; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application +{ + /// + /// 班级表输入参数 + /// + public class BusClassInfoInput : BasePageInput + { + /// + /// 年级 + /// + public virtual long GradeId { get; set; } + + /// + /// 班级名称 + /// + public virtual string Name { get; set; } + + /// + /// 班级编号 + /// + public virtual string NumberCode { get; set; } + + /// + /// 数据排序 + /// + public virtual int Sort { get; set; } + + /// + /// 租户id + /// + public virtual long TenantId { get; set; } + + } + + public class AddBusClassInfoInput : BusClassInfoInput + { + } + + public class DeleteBusClassInfoInput : BaseIdInput + { + } + + public class UpdateBusClassInfoInput : BusClassInfoInput + { + /// + /// Id主键 + /// + [Required(ErrorMessage = "Id主键不能为空")] + public long Id { get; set; } + + } + + public class QueryeBusClassInfoInput : BaseIdInput + { + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusClassInfo/Dto/BusClassInfoOutput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusClassInfo/Dto/BusClassInfoOutput.cs new file mode 100644 index 0000000..4c7bfe5 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusClassInfo/Dto/BusClassInfoOutput.cs @@ -0,0 +1,41 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 班级表输出参数 + /// + public class BusClassInfoOutput + { + /// + /// 年级 + /// + public long GradeId { get; set; } + + /// + /// 班级名称 + /// + public string Name { get; set; } + + /// + /// 班级编号 + /// + public string NumberCode { get; set; } + + /// + /// 数据排序 + /// + public int Sort { get; set; } + + /// + /// 租户id + /// + public long TenantId { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusCustomMapReport/BusCustomMapReportService.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusCustomMapReport/BusCustomMapReportService.cs new file mode 100644 index 0000000..5535794 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusCustomMapReport/BusCustomMapReportService.cs @@ -0,0 +1,120 @@ +using Admin.NET.Core; +using Furion.DatabaseAccessor; +using Furion.DependencyInjection; +using Furion.DynamicApiController; +using Furion.FriendlyException; +using Mapster; +using Microsoft.AspNetCore.Mvc; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// 用户做题进度服务 + /// + [ApiDescriptionSettings("测评服务", Name = "BusCustomMapReport", Order = 100)] + + public class BusCustomMapReportService : IDynamicApiController, ITransient + { + private readonly SqlSugarRepository _busCustomMapReportRep; + + public BusCustomMapReportService( + SqlSugarRepository busCustomMapReportRep + ) + { + _busCustomMapReportRep = busCustomMapReportRep; + } + + /// + /// 分页查询用户做题进度 + /// + /// + /// + [HttpGet("page")] + public async Task> Page([FromQuery] BusCustomMapReportInput input) + { + var busCustomMapReports = await _busCustomMapReportRep.AsQueryable() + .Where(u => u.CustomId == input.CustomId) + .Where(u => u.Status == input.Status) + .Where(u => u.Proccess == input.Proccess) + .Where(u => u.Sort == input.Sort) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .Select(s => new BusCustomMapReportOutput + { + CustomId = s.CustomId, + Id = s.Id, + Proccess = s.Proccess, + Sort = s.Sort, + Status = s.Status + }) + .OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); + + return busCustomMapReports; + } + + /// + /// 增加用户做题进度 + /// + /// + /// + [HttpPost("add")] + public async Task Add(AddBusCustomMapReportInput input) + { + var busCustomMapReport = input.Adapt(); + await _busCustomMapReportRep.InsertAsync(busCustomMapReport); + } + + /// + /// 删除用户做题进度 + /// + /// + /// + [HttpPost("delete")] + public async Task Delete(DeleteBusCustomMapReportInput input) + { + var busCustomMapReport = await _busCustomMapReportRep.AsQueryable().FirstAsync(u => u.Id == input.Id); + await _busCustomMapReportRep.FakeDeleteAsync(busCustomMapReport); + } + + /// + /// 更新用户做题进度 + /// + /// + /// + [HttpPost("edit")] + public async Task Update(UpdateBusCustomMapReportInput input) + { + var isExist = await _busCustomMapReportRep.AsQueryable().AnyAsync(u => u.Id == input.Id); + if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3000); + + var busCustomMapReport = input.Adapt(); + await _busCustomMapReportRep.UpdateAsync(busCustomMapReport); + } + + /// + /// 获取用户做题进度 + /// + /// + /// + [HttpGet("detail")] + public async Task Get([FromQuery] QueryeBusCustomMapReportInput input) + { + return (await _busCustomMapReportRep.AsQueryable().FirstAsync(u => u.Id == input.Id)).Adapt(); + } + + /// + /// 获取用户做题进度列表 + /// + /// + /// + [HttpGet("list")] + public async Task> List([FromQuery] BusCustomMapReportInput input) + { + return await _busCustomMapReportRep.AsQueryable().Select().ToListAsync(); + } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusCustomMapReport/Dto/BusCustomMapReportDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusCustomMapReport/Dto/BusCustomMapReportDto.cs new file mode 100644 index 0000000..cf39930 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusCustomMapReport/Dto/BusCustomMapReportDto.cs @@ -0,0 +1,36 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 用户做题进度输出参数 + /// + public class BusCustomMapReportDto + { + /// + /// CustomId + /// + public long CustomId { get; set; } + + /// + /// 状态 + /// + public int Status { get; set; } + + /// + /// 进度Id + /// + public int Proccess { get; set; } + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusCustomMapReport/Dto/BusCustomMapReportInput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusCustomMapReport/Dto/BusCustomMapReportInput.cs new file mode 100644 index 0000000..58c98fc --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusCustomMapReport/Dto/BusCustomMapReportInput.cs @@ -0,0 +1,56 @@ +using Admin.NET.Core; +using System; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application +{ + /// + /// 用户做题进度输入参数 + /// + public class BusCustomMapReportInput : BasePageInput + { + /// + /// CustomId + /// + public virtual long CustomId { get; set; } + + /// + /// 状态 + /// + public virtual int Status { get; set; } + + /// + /// 进度Id + /// + public virtual int Proccess { get; set; } + + /// + /// Sort排序 + /// + public virtual int Sort { get; set; } + + } + + public class AddBusCustomMapReportInput : BusCustomMapReportInput + { + } + + public class DeleteBusCustomMapReportInput : BaseIdInput + { + } + + public class UpdateBusCustomMapReportInput : BusCustomMapReportInput + { + /// + /// Id主键 + /// + [Required(ErrorMessage = "Id主键不能为空")] + public long Id { get; set; } + + } + + public class QueryeBusCustomMapReportInput : BaseIdInput + { + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusCustomMapReport/Dto/BusCustomMapReportOutput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusCustomMapReport/Dto/BusCustomMapReportOutput.cs new file mode 100644 index 0000000..efc54f0 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusCustomMapReport/Dto/BusCustomMapReportOutput.cs @@ -0,0 +1,36 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 用户做题进度输出参数 + /// + public class BusCustomMapReportOutput + { + /// + /// CustomId + /// + public long CustomId { get; set; } + + /// + /// 状态 + /// + public int Status { get; set; } + + /// + /// 进度Id + /// + public int Proccess { get; set; } + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusCustomMenus/BusCustomMenusService.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusCustomMenus/BusCustomMenusService.cs new file mode 100644 index 0000000..10ec8c8 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusCustomMenus/BusCustomMenusService.cs @@ -0,0 +1,148 @@ +using Admin.NET.Core; +using Furion.DatabaseAccessor; +using Furion.DependencyInjection; +using Furion.DynamicApiController; +using Furion.FriendlyException; +using Mapster; +using Microsoft.AspNetCore.Mvc; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// 学生菜单服务 + /// + [ApiDescriptionSettings("测评服务", Name = "BusCustomMenus", Order = 100)] + public class BusCustomMenusService : IDynamicApiController, ITransient + { + private readonly SqlSugarRepository _busCustomMenusRep; + private readonly SqlSugarRepository _sysDictDataRep; + private readonly UserManager _userManager; + + /// + /// + /// + /// + /// + /// + public BusCustomMenusService( + SqlSugarRepository sysDictDataRep, + SqlSugarRepository busCustomMenusRep, + UserManager userManager + ) + { + _sysDictDataRep = sysDictDataRep; + _busCustomMenusRep = busCustomMenusRep; + _userManager = userManager; + } + + /// + /// 分页查询学生菜单 + /// + /// + /// + [HttpGet("page")] + public async Task> Page([FromQuery] BusCustomMenusInput input) + { + var busCustomMenuss = await _busCustomMenusRep.AsQueryable() + .WhereIF(input.RootId > 0, u => u.RootId == input.RootId) + .WhereIF(input.UrlType.HasValue, u => u.UrlType == input.UrlType) + .WhereIF(!string.IsNullOrEmpty(input.MenuName), u => u.MenuName == input.MenuName) + .WhereIF(!string.IsNullOrEmpty(input.Icon), u => u.Icon == input.Icon) + .WhereIF(!string.IsNullOrEmpty(input.Url), u => u.Url == input.Url) + // .Where(u => u.Sort == input.Sort) + .Where(u => u.TenantId == _userManager.TenantId) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .OrderBuilder(input) + .Select(s => new BusCustomMenusOutput() + { + Icon = s.Icon, + Id = s.Id, + MenuName = s.MenuName, + RootId = s.RootId, + Sort = s.Sort, + Url = s.Url, + UrlType = s.UrlType + }) + .ToPagedListAsync(input.Page, input.PageSize); + + return busCustomMenuss; + } + + /// + /// 增加学生菜单 + /// + /// + /// + [HttpPost("add")] + public async Task Add(AddBusCustomMenusInput input) + { + var busCustomMenus = input.Adapt(); + await _busCustomMenusRep.InsertAsync(busCustomMenus); + } + + /// + /// 删除学生菜单 + /// + /// + /// + [HttpPost("delete")] + public async Task Delete(DeleteBusCustomMenusInput input) + { + var busCustomMenus = await _busCustomMenusRep.AsQueryable().FirstAsync(u => u.Id == input.Id); + await _busCustomMenusRep.FakeDeleteAsync(busCustomMenus); + } + + /// + /// 更新学生菜单 + /// + /// + /// + [HttpPost("edit")] + public async Task Update(UpdateBusCustomMenusInput input) + { + var isExist = await _busCustomMenusRep.AsQueryable().AnyAsync(u => u.Id == input.Id); + if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3000); + + var busCustomMenus = input.Adapt(); + await _busCustomMenusRep.UpdateAsync(busCustomMenus); + } + + /// + /// 获取学生菜单 + /// + /// + /// + [HttpGet("detail")] + public async Task Get([FromQuery] QueryeBusCustomMenusInput input) + { + return (await _busCustomMenusRep.AsQueryable().FirstAsync(u => u.Id == input.Id)).Adapt(); + } + + /// + /// 获取学生菜单列表 + /// + /// + /// + [HttpGet("list")] + public async Task> List([FromQuery] BusCustomMenusInput input) + { + return await _busCustomMenusRep.AsQueryable().Select().ToListAsync(); + } + + /// + /// 获取SysDictData列表 + /// + /// + [HttpGet("fkSysDictData")] + public async Task FkSysDictDataList() + { + var list = await _sysDictDataRep.AsQueryable().ToListAsync(); + return list.Select(e => new { Code = e.Id, Name = e.Value }); + } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusCustomMenus/Dto/BusCustomMenusDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusCustomMenus/Dto/BusCustomMenusDto.cs new file mode 100644 index 0000000..7a22d80 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusCustomMenus/Dto/BusCustomMenusDto.cs @@ -0,0 +1,56 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 学生菜单输出参数 + /// + public class BusCustomMenusDto + { + /// + /// 根菜单 + /// + public string SysDictDataValue { get; set; } + + /// + /// 根菜单 + /// + public long RootId { get; set; } + + /// + /// 链接类型 + /// + public int UrlType { get; set; } + + /// + /// 菜单名称 + /// + public string MenuName { get; set; } + + /// + /// 菜单icon + /// + public string Icon { get; set; } + + /// + /// 路由地址 + /// + public string Url { get; set; } + + /// + /// 数据排序 + /// + public int Sort { get; set; } + + /// + /// 租户id + /// + public long TenantId { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusCustomMenus/Dto/BusCustomMenusInput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusCustomMenus/Dto/BusCustomMenusInput.cs new file mode 100644 index 0000000..1ff32c6 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusCustomMenus/Dto/BusCustomMenusInput.cs @@ -0,0 +1,71 @@ +using Admin.NET.Core; +using System; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application +{ + /// + /// 学生菜单输入参数 + /// + public class BusCustomMenusInput : BasePageInput + { + /// + /// 根菜单 + /// + public virtual long RootId { get; set; } + + /// + /// 链接类型 + /// + public virtual int? UrlType { get; set; } + + /// + /// 菜单名称 + /// + public virtual string MenuName { get; set; } + + /// + /// 菜单icon + /// + public virtual string Icon { get; set; } + + /// + /// 路由地址 + /// + public virtual string Url { get; set; } + + /// + /// 数据排序 + /// + public virtual int Sort { get; set; } + + /// + /// 租户id + /// + public virtual long TenantId { get; set; } + + } + + public class AddBusCustomMenusInput : BusCustomMenusInput + { + } + + public class DeleteBusCustomMenusInput : BaseIdInput + { + } + + public class UpdateBusCustomMenusInput : BusCustomMenusInput + { + /// + /// Id主键 + /// + [Required(ErrorMessage = "Id主键不能为空")] + public long Id { get; set; } + + } + + public class QueryeBusCustomMenusInput : BaseIdInput + { + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusCustomMenus/Dto/BusCustomMenusOutput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusCustomMenus/Dto/BusCustomMenusOutput.cs new file mode 100644 index 0000000..32d027f --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusCustomMenus/Dto/BusCustomMenusOutput.cs @@ -0,0 +1,51 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 学生菜单输出参数 + /// + public class BusCustomMenusOutput + { + /// + /// 根菜单 + /// + public long RootId { get; set; } + + /// + /// 链接类型 + /// + public int UrlType { get; set; } + + /// + /// 菜单名称 + /// + public string MenuName { get; set; } + + /// + /// 菜单icon + /// + public string Icon { get; set; } + + /// + /// 路由地址 + /// + public string Url { get; set; } + + /// + /// 数据排序 + /// + public int Sort { get; set; } + + /// + /// 租户id + /// + public long TenantId { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusFeedback/BusFeedbackService.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusFeedback/BusFeedbackService.cs new file mode 100644 index 0000000..e49165a --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusFeedback/BusFeedbackService.cs @@ -0,0 +1,122 @@ +using Admin.NET.Core; +using Furion.DatabaseAccessor; + +using Furion.DependencyInjection; +using Furion.DynamicApiController; +using Furion.FriendlyException; +using Mapster; +using Microsoft.AspNetCore.Mvc; + +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// 意见反馈表服务 + /// + [ApiDescriptionSettings("测评服务", Name = "BusFeedback", Order = 100)] + public class BusFeedbackService : IDynamicApiController, ITransient + { + private readonly SqlSugarRepository _busFeedbackRep; + private readonly SqlSugarRepository _busStudentsRep; + public BusFeedbackService( + SqlSugarRepository busFeedbackRep, SqlSugarRepository busStudentsRep + ) + { + _busFeedbackRep = busFeedbackRep; + _busStudentsRep = busStudentsRep; + } + + /// + /// 分页查询意见反馈表 + /// + /// + /// + [HttpGet("page")] + public async Task> Page([FromQuery] BusFeedbackInput input) + { + var busFeedbacks = await _busFeedbackRep.AsQueryable() + .Where(u => u.Type == input.Type) + //.Where(u => u.FamilyId == input.FamilyId) + .WhereIF(!string.IsNullOrEmpty(input.Context), u => u.Context == input.Context) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .OrderBuilder(input) + .Select(s => new BusFeedbackOutput() + { + Type = s.Type, + FamilyId = s.FamilyId, + Context = s.Context, + Id = s.Id + }).ToPagedListAsync(input.Page, input.PageSize); + + return busFeedbacks; + } + + /// + /// 增加意见反馈表 + /// + /// + /// + [HttpPost("add")] + public async Task Add(AddBusFeedbackInput input) + { + var framilyInfo = await _busStudentsRep.AsQueryable().FirstAsync(c => c.Uuid == input.UuId); + var busFeedback = input.Adapt(); + busFeedback.FamilyId = framilyInfo.Id; + await _busFeedbackRep.InsertAsync(busFeedback); + } + + /// + /// 删除意见反馈表 + /// + /// + /// + [HttpPost("delete")] + public async Task Delete(DeleteBusFeedbackInput input) + { + var busFeedback = await _busFeedbackRep.AsQueryable().FirstAsync(u => u.Id == input.Id); + await _busFeedbackRep.FakeDeleteAsync(busFeedback); + } + + /// + /// 更新意见反馈表 + /// + /// + /// + [HttpPost("edit")] + public async Task Update(UpdateBusFeedbackInput input) + { + var isExist = await _busFeedbackRep.AsQueryable().AnyAsync(u => u.Id == input.Id); + if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3000); + + var busFeedback = input.Adapt(); + await _busFeedbackRep.UpdateAsync(busFeedback); + } + + /// + /// 获取意见反馈表 + /// + /// + /// + [HttpGet("detail")] + public async Task Get([FromQuery] QueryeBusFeedbackInput input) + { + return (await _busFeedbackRep.AsQueryable().FirstAsync(u => u.Id == input.Id)).Adapt(); + } + + /// + /// 获取意见反馈表列表 + /// + /// + /// + [HttpGet("list")] + public async Task> List([FromQuery] BusFeedbackInput input) + { + return await _busFeedbackRep.AsQueryable().Select().ToListAsync(); + } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusFeedback/Dto/BusFeedbackDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusFeedback/Dto/BusFeedbackDto.cs new file mode 100644 index 0000000..738282e --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusFeedback/Dto/BusFeedbackDto.cs @@ -0,0 +1,31 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 意见反馈表输出参数 + /// + public class BusFeedbackDto + { + /// + /// 意见类型 + /// + public int Type { get; set; } + + /// + /// 家长Id + /// + public long FamilyId { get; set; } + + /// + /// 意见内容 + /// + public string Context { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusFeedback/Dto/BusFeedbackInput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusFeedback/Dto/BusFeedbackInput.cs new file mode 100644 index 0000000..1565840 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusFeedback/Dto/BusFeedbackInput.cs @@ -0,0 +1,51 @@ +using Admin.NET.Core; +using System; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application +{ + /// + /// 意见反馈表输入参数 + /// + public class BusFeedbackInput : BasePageInput + { + /// + /// 意见类型(0 升学路径问题,1 测试结果理解问题,2 系统bug,3 其他问题) + /// + public virtual int Type { get; set; } + + /// + /// 家长Id + /// + public virtual string UuId { get; set; } + + /// + /// 意见内容 + /// + public virtual string Context { get; set; } + + } + + public class AddBusFeedbackInput : BusFeedbackInput + { + } + + public class DeleteBusFeedbackInput : BaseIdInput + { + } + + public class UpdateBusFeedbackInput : BusFeedbackInput + { + /// + /// Id主键 + /// + [Required(ErrorMessage = "Id主键不能为空")] + public long Id { get; set; } + + } + + public class QueryeBusFeedbackInput : BaseIdInput + { + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusFeedback/Dto/BusFeedbackOutput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusFeedback/Dto/BusFeedbackOutput.cs new file mode 100644 index 0000000..ce0fc0e --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusFeedback/Dto/BusFeedbackOutput.cs @@ -0,0 +1,31 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 意见反馈表输出参数 + /// + public class BusFeedbackOutput + { + /// + /// 意见类型 + /// + public int Type { get; set; } + + /// + /// 家长Id + /// + public long FamilyId { get; set; } + + /// + /// 意见内容 + /// + public string Context { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusFramilyMapStudents/BusFramilyMapStudentsService.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusFramilyMapStudents/BusFramilyMapStudentsService.cs new file mode 100644 index 0000000..f85f6a7 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusFramilyMapStudents/BusFramilyMapStudentsService.cs @@ -0,0 +1,238 @@ +using Admin.NET.Core; +using Flurl.Http; +using Furion.DatabaseAccessor; + +using Furion.DependencyInjection; +using Furion.DynamicApiController; +using Furion.FriendlyException; +using Mapster; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc; + +using Microsoft.Extensions.Configuration; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// 家庭关联学生表服务 + /// + [ApiDescriptionSettings("测评服务", Name = "BusFramilyMapStudents", Order = 100)] + [Route("api/[Controller]")] + public class BusFramilyMapStudentsService : IDynamicApiController, ITransient + { + private readonly SqlSugarRepository _busFramilyMapStudentsRep; + private readonly SqlSugarRepository _studentsfamily; + private readonly IConfiguration _configuration; + + /// + /// + /// + /// + /// + /// + public BusFramilyMapStudentsService( + SqlSugarRepository busFramilyMapStudentsRep, IConfiguration configuration, SqlSugarRepository studentsfamily + ) + { + _busFramilyMapStudentsRep = busFramilyMapStudentsRep; + _configuration = configuration; + _studentsfamily = studentsfamily; + } + + + + + /// + /// 分页查询家庭关联学生表 + /// + /// + /// + [HttpGet("page")] + public async Task> Page([FromQuery] BusFramilyMapStudentsInput input) + { + var busFramilyMapStudentss = await _busFramilyMapStudentsRep.AsQueryable() + .Where(u => u.FramilyId == input.FramilyId) + .Where(u => u.StudentId == input.StudentId) + .WhereIF(!string.IsNullOrEmpty(input.BarCode), u => u.BarCode == input.BarCode) + .WhereIF(!string.IsNullOrEmpty(input.StudentName), u => u.StudentName == input.StudentName) + .WhereIF(!string.IsNullOrEmpty(input.SchoolName), u => u.SchoolName == input.SchoolName) + .WhereIF(!string.IsNullOrEmpty(input.GradeName), u => u.GradeName == input.GradeName) + .WhereIF(!string.IsNullOrEmpty(input.ClassName), u => u.ClassName == input.ClassName) + .Where(u => u.Sort == input.Sort) + .Where(u => u.TenantId == input.TenantId) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .OrderBuilder(input) + .Select(s => new BusFramilyMapStudentsOutput() + { + BarCode = s.BarCode, + StudentName = s.StudentName, + SchoolName = s.SchoolName, + GradeName = s.GradeName, + ClassName = s.ClassName, + Gender = s.Gender, + Sort = s.Sort, + TenantId = s.TenantId.Value, + Id = s.Id, + IsDefault = s.IsDefault + }) + .ToPagedListAsync(input.Page, input.PageSize); + + return busFramilyMapStudentss; + } + + + + /// + /// 获取远端用户信息 + /// + /// + /// + [HttpGet] + public async Task SeachStudentInfo([FromQuery] BusSeachStudentInfoInputDto inputDto) + { + string key = "3c1cbc3f546eda35168c3aa3cb91780fbe703f0996c6d123ea96dc85c70bbc0a8e70006ae6b35eb3962ad057f41a1690"; + var ulrs = _configuration["WebApi:url"].ToString() + "/UserCenters/GetFramilyMapCenter"; + var flurlResponse = await ulrs.PostJsonAsync(new BusSeachStudentInfoInputDto { Key = key, CardID = inputDto.CardID, UserName = inputDto.UserName }); + var result = await flurlResponse.GetJsonAsync(); + if (result.Result == null) + { + throw Oops.Oh("未查询到该学生信息"); + } + return result.Result; + } + + + /// + /// 增加家庭关联学生表 + /// + /// + /// + [HttpPost("add")] + public async Task Add(AddBusFramilyMapStudentsInput input) + { + var framilyInfo = await _studentsfamily.AsQueryable().FirstAsync(c => c.Uuid == input.UuId); + var busFramilyMapStudents = input.Adapt(); + busFramilyMapStudents.IsDefault = true; + busFramilyMapStudents.FramilyId = framilyInfo.Id; + var anyinfo = await _busFramilyMapStudentsRep.AsQueryable().AnyAsync(c => c.FramilyId == framilyInfo.Id && c.StudentId == input.StudentId); + if (!anyinfo) + { + var oldlist = await _busFramilyMapStudentsRep.AsQueryable().Where(c => c.FramilyId == framilyInfo.Id).ToListAsync(); + oldlist.ForEach(c => + { + c.IsDefault = false; + }); + _busFramilyMapStudentsRep.UpdateRange(oldlist); + await _busFramilyMapStudentsRep.InsertAsync(busFramilyMapStudents); + framilyInfo.framilyRole = input.FramilyRole; + await _studentsfamily.UpdateAsync(framilyInfo); + } + else + throw Oops.Oh("绑定关系已存在"); + } + + + + /// + /// 切换默认孩子数据 + /// + /// + /// + [HttpPost("changedefault")] + public async Task ChangeDefault(ChangeDefaultChildrenInput input) + { + var framilyInfo = await _studentsfamily.AsQueryable().FirstAsync(c => c.Uuid == input.UuId); + var oldlist = await _busFramilyMapStudentsRep.AsQueryable().Where(c => c.FramilyId == framilyInfo.Id).ToListAsync(); + oldlist.ForEach(c => + { + c.IsDefault = false; + }); + _busFramilyMapStudentsRep.UpdateRange(oldlist); + var defaultmodel = await _busFramilyMapStudentsRep.AsQueryable().FirstAsync(c => c.FramilyId == framilyInfo.Id && c.StudentId == input.StudentId); + defaultmodel.IsDefault = true; + await _busFramilyMapStudentsRep.UpdateAsync(defaultmodel); + } + + + /// + /// 删除家庭关联学生表 + /// + /// + /// + [HttpPost("delete")] + public async Task Delete(DeleteBusFramilyMapStudentsInput input) + { + var busFramilyMapStudents = await _busFramilyMapStudentsRep.AsQueryable().FirstAsync(u => u.Id == input.Id); + await _busFramilyMapStudentsRep.FakeDeleteAsync(busFramilyMapStudents); + } + + /// + /// 更新家庭关联学生表 + /// + /// + /// + [HttpPost("edit")] + public async Task Update(UpdateBusFramilyMapStudentsInput input) + { + var isExist = await _busFramilyMapStudentsRep.AsQueryable().AnyAsync(u => u.Id == input.Id); + if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3000); + + var busFramilyMapStudents = input.Adapt(); + await _busFramilyMapStudentsRep.UpdateAsync(busFramilyMapStudents); + } + + /// + /// 获取家庭关联学生表 + /// + /// + /// + [HttpGet("detail")] + public async Task Get([FromQuery] QueryeBusFramilyMapStudentsInput input) + { + return (await _busFramilyMapStudentsRep.AsQueryable().FirstAsync(u => u.Id == input.Id)).Adapt(); + } + + /// + /// 获取家庭关联学生表列表 + /// + /// + /// + [HttpGet("list")] + public async Task> List([FromQuery] BusFramilyMapStudentsInput input) + { + var framilyInfo = await _studentsfamily.AsQueryable().FirstAsync(c => c.Uuid == input.UuId); + var list = await _busFramilyMapStudentsRep.AsQueryable().Where(c => c.FramilyId == framilyInfo.Id). + Select(s => new BusFramilyMapStudentsOutput() + { + FmailyRole = framilyInfo.framilyRole.GetDescription(), + StudentId = s.StudentId, + BarCode = s.BarCode, + StudentName = s.StudentName, + SchoolName = s.SchoolName, + GradeName = s.GradeName, + ClassName = s.ClassName, + Gender = s.Gender, + Sort = s.Sort, + TenantId = s.TenantId.Value, + Id = s.Id, + IsDefault = s.IsDefault + }) + .ToListAsync(); + //list.ForEach(c => + //{ + // c.FmailyRole = EnumUtil.GetDescription(framilyInfo.framilyRole); + //}); + if (list.Count() <= 0) + { + throw Oops.Oh(ErrorCodeEnum.D1002); + } + return list; + } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusFramilyMapStudents/Dto/BusFramilyMapStudentsDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusFramilyMapStudents/Dto/BusFramilyMapStudentsDto.cs new file mode 100644 index 0000000..9689aee --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusFramilyMapStudents/Dto/BusFramilyMapStudentsDto.cs @@ -0,0 +1,61 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 家庭关联学生表输出参数 + /// + public class BusFramilyMapStudentsDto + { + /// + /// 家庭Id + /// + public long FramilyId { get; set; } + + /// + /// 学生Id + /// + public Guid StudentId { get; set; } + + /// + /// 学生学号 + /// + public string BarCode { get; set; } + + /// + /// 学生姓名 + /// + public string StudentName { get; set; } + + /// + /// 学校名称 + /// + public string SchoolName { get; set; } + + /// + /// 学生年级 + /// + public string GradeName { get; set; } + + /// + /// 学生班级 + /// + public string ClassName { get; set; } + + /// + /// 数据排序 + /// + public int Sort { get; set; } + + /// + /// 租户id + /// + public long TenantId { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusFramilyMapStudents/Dto/BusFramilyMapStudentsInput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusFramilyMapStudents/Dto/BusFramilyMapStudentsInput.cs new file mode 100644 index 0000000..acefd06 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusFramilyMapStudents/Dto/BusFramilyMapStudentsInput.cs @@ -0,0 +1,110 @@ +using Admin.NET.Core; +using System; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application +{ + /// + /// 家庭关联学生表输入参数 + /// + public class BusFramilyMapStudentsInput : BasePageInput + { + + /// + /// OpenId + /// + public string UuId { get; set; } + /// + /// 家庭Id + /// + public virtual long FramilyId { get; set; } + + + /// + /// 家长身份 + /// + public virtual FramilyRoleEnum FramilyRole { get; set; } + + /// + /// 学生Id + /// + public virtual Guid StudentId { get; set; } + + /// + /// 学生学号 + /// + public virtual string BarCode { get; set; } + + /// + /// 学生姓名 + /// + public virtual string StudentName { get; set; } + + /// + /// 学校名称 + /// + public virtual string SchoolName { get; set; } + + /// + /// 学生年级 + /// + public virtual string GradeName { get; set; } + + /// + /// 学生班级 + /// + public virtual string ClassName { get; set; } + + /// + /// 性别 + /// + public virtual string Gender { get; set; } + + /// + /// 数据排序 + /// + public virtual int Sort { get; set; } + + /// + /// 租户id + /// + public virtual long TenantId { get; set; } + + } + + public class AddBusFramilyMapStudentsInput : BusFramilyMapStudentsInput + { + } + + public class DeleteBusFramilyMapStudentsInput : BaseIdInput + { + } + + public class UpdateBusFramilyMapStudentsInput : BusFramilyMapStudentsInput + { + /// + /// Id主键 + /// + [Required(ErrorMessage = "Id主键不能为空")] + public long Id { get; set; } + + } + + public class QueryeBusFramilyMapStudentsInput : BaseIdInput + { + + } + + + public class ChangeDefaultChildrenInput + { + public string UuId { get; set; } + + /// + /// 学生Id + /// + public virtual Guid StudentId { get; set; } + + } + +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusFramilyMapStudents/Dto/BusFramilyMapStudentsOutput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusFramilyMapStudents/Dto/BusFramilyMapStudentsOutput.cs new file mode 100644 index 0000000..9b34148 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusFramilyMapStudents/Dto/BusFramilyMapStudentsOutput.cs @@ -0,0 +1,76 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 家庭关联学生表输出参数 + /// + public class BusFramilyMapStudentsOutput + { + /// + /// 家庭Id + /// + public long FramilyId { get; set; } + + /// + /// + /// + public string FmailyRole { get; set; } + /// + /// 学生Id + /// + public Guid StudentId { get; set; } + + /// + /// 学生学号 + /// + public string BarCode { get; set; } + + /// + /// 学生姓名 + /// + public string StudentName { get; set; } + + /// + /// 学校名称 + /// + public string SchoolName { get; set; } + + /// + /// 学生年级 + /// + public string GradeName { get; set; } + + /// + /// 学生班级 + /// + public string ClassName { get; set; } + + + /// + /// 性别 + /// + public string Gender { get; set; } + + /// + /// 数据排序 + /// + public int Sort { get; set; } + + /// + /// 租户id + /// + public long TenantId { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + /// + /// 是否默认 + /// + public bool IsDefault { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusFramilyMapStudents/Dto/BusSeachStudentInfoInputDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusFramilyMapStudents/Dto/BusSeachStudentInfoInputDto.cs new file mode 100644 index 0000000..57f1324 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusFramilyMapStudents/Dto/BusSeachStudentInfoInputDto.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// + /// + public class BusSeachStudentInfoInputDto + { + + /// + /// 约定Key(前端无需传值) + /// + public string Key { get; set; } + + /// + /// 学生姓名 + /// + public string UserName { get; set; } + + /// + /// 身份证号(学号) + /// + public string CardID { get; set; } + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusFramilyMapStudents/Dto/BusSeachStudentInfoOutDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusFramilyMapStudents/Dto/BusSeachStudentInfoOutDto.cs new file mode 100644 index 0000000..3040c89 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusFramilyMapStudents/Dto/BusSeachStudentInfoOutDto.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + + + public class BusSeachStudentInfoOutDto + { + public string Code { get; set; } + public string Msg { get; set; } + public BusSeachStudentResult Result { get; set; } + } + + public class BusSeachStudentResult + { + public string StudentId { get; set; } + public string StudentName { get; set; } + public string StudentCode { get; set; } + public string GradeName { get; set; } + + /// + /// + /// + public string Gender { get; set; } + public string ClassName { get; set; } + public string SchoolName { get; set; } + } + + + + +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusGrade/BusGradeService.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusGrade/BusGradeService.cs new file mode 100644 index 0000000..b204fc7 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusGrade/BusGradeService.cs @@ -0,0 +1,123 @@ +using Admin.NET.Core; +using Furion.DatabaseAccessor; + +using Furion.DependencyInjection; +using Furion.DynamicApiController; +using Furion.FriendlyException; +using Mapster; +using Microsoft.AspNetCore.Mvc; + +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// 年级表服务 + /// + [ApiDescriptionSettings("测评服务", Name = "BusGrade", Order = 100)] + public class BusGradeService : IDynamicApiController, ITransient + { + private readonly SqlSugarRepository _busGradeRep; + private readonly UserManager _userManager; + public BusGradeService( + SqlSugarRepository busGradeRep, + UserManager userManager + ) + { + _busGradeRep = busGradeRep; + _userManager = userManager; + } + + /// + /// 分页查询年级表 + /// + /// + /// + [HttpGet("page")] + public async Task> Page([FromQuery] BusGradeInput input) + { + var busGrades = await _busGradeRep.AsQueryable() + .WhereIF(!string.IsNullOrEmpty(input.Name), u => u.Name == input.Name) + .WhereIF(!string.IsNullOrEmpty(input.NumberCode), u => u.NumberCode == input.NumberCode) + .Where(u => u.TenantId == _userManager.TenantId) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .OrderBuilder(input) + .Select(s => new BusGradeOutput() + { + Name = s.Name, + NumberCode = s.NumberCode, + Sort = s.Sort, + TenantId = s.TenantId.Value, + Id = s.Id + }) + .ToPagedListAsync(input.Page, input.PageSize); + + return busGrades; + } + + /// + /// 增加年级表 + /// + /// + /// + [HttpPost("add")] + public async Task Add(AddBusGradeInput input) + { + var busGrade = input.Adapt(); + await _busGradeRep.InsertAsync(busGrade); + } + + /// + /// 删除年级表 + /// + /// + /// + [HttpPost("delete")] + public async Task Delete(DeleteBusGradeInput input) + { + var busGrade = await _busGradeRep.AsQueryable().FirstAsync(u => u.Id == input.Id); + await _busGradeRep.FakeDeleteAsync(busGrade); + } + + /// + /// 更新年级表 + /// + /// + /// + [HttpPost("edit")] + public async Task Update(UpdateBusGradeInput input) + { + var isExist = await _busGradeRep.AsQueryable().AnyAsync(u => u.Id == input.Id); + if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3000); + + var busGrade = input.Adapt(); + await _busGradeRep.UpdateAsync(busGrade); + } + + /// + /// 获取年级表 + /// + /// + /// + [HttpGet("detail")] + public async Task Get([FromQuery] QueryeBusGradeInput input) + { + return (await _busGradeRep.AsQueryable().FirstAsync(u => u.Id == input.Id)).Adapt(); + } + + /// + /// 获取年级表列表 + /// + /// + /// + [HttpGet("list")] + public async Task> List([FromQuery] BusGradeInput input) + { + return await _busGradeRep.AsQueryable().Select().ToListAsync(); + } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusGrade/Dto/BusGradeDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusGrade/Dto/BusGradeDto.cs new file mode 100644 index 0000000..7c648ba --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusGrade/Dto/BusGradeDto.cs @@ -0,0 +1,36 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 年级表输出参数 + /// + public class BusGradeDto + { + /// + /// 年级名称 + /// + public string Name { get; set; } + + /// + /// 年级编号 + /// + public string NumberCode { get; set; } + + /// + /// 数据排序 + /// + public int Sort { get; set; } + + /// + /// 租户id + /// + public long TenantId { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusGrade/Dto/BusGradeInput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusGrade/Dto/BusGradeInput.cs new file mode 100644 index 0000000..4ed586c --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusGrade/Dto/BusGradeInput.cs @@ -0,0 +1,56 @@ +using Admin.NET.Core; +using System; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application +{ + /// + /// 年级表输入参数 + /// + public class BusGradeInput : BasePageInput + { + /// + /// 年级名称 + /// + public virtual string Name { get; set; } + + /// + /// 年级编号 + /// + public virtual string NumberCode { get; set; } + + /// + /// 数据排序 + /// + public virtual int Sort { get; set; } + + /// + /// 租户id + /// + public virtual long TenantId { get; set; } + + } + + public class AddBusGradeInput : BusGradeInput + { + } + + public class DeleteBusGradeInput : BaseIdInput + { + } + + public class UpdateBusGradeInput : BusGradeInput + { + /// + /// Id主键 + /// + [Required(ErrorMessage = "Id主键不能为空")] + public long Id { get; set; } + + } + + public class QueryeBusGradeInput : BaseIdInput + { + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusGrade/Dto/BusGradeOutput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusGrade/Dto/BusGradeOutput.cs new file mode 100644 index 0000000..21649c7 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusGrade/Dto/BusGradeOutput.cs @@ -0,0 +1,36 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 年级表输出参数 + /// + public class BusGradeOutput + { + /// + /// 年级名称 + /// + public string Name { get; set; } + + /// + /// 年级编号 + /// + public string NumberCode { get; set; } + + /// + /// 数据排序 + /// + public int Sort { get; set; } + + /// + /// 租户id + /// + public long TenantId { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusMajorType/BusMajorTypeService.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusMajorType/BusMajorTypeService.cs new file mode 100644 index 0000000..cdad174 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusMajorType/BusMajorTypeService.cs @@ -0,0 +1,122 @@ +using Admin.NET.Core; +using Furion.DatabaseAccessor; + +using Furion.DependencyInjection; +using Furion.DynamicApiController; +using Furion.FriendlyException; +using Mapster; +using Microsoft.AspNetCore.Mvc; + +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// 专业大类服务 + /// + [ApiDescriptionSettings("测评服务", Name = "BusMajorType", Order = 100)] + public class BusMajorTypeService : IDynamicApiController, ITransient + { + private readonly SqlSugarRepository _busMajorTypeRep; + + public BusMajorTypeService( + SqlSugarRepository busMajorTypeRep + ) + { + _busMajorTypeRep = busMajorTypeRep; + } + + /// + /// 分页查询专业大类 + /// + /// + /// + [HttpGet("page")] + public async Task> Page([FromQuery] BusMajorTypeInput input) + { + var busMajorTypes = await _busMajorTypeRep.AsQueryable() + .WhereIF(!string.IsNullOrEmpty(input.Code), u => u.Code == input.Code) + .WhereIF(!string.IsNullOrEmpty(input.Name), u => u.Name == input.Name) + .Where(u => u.Type == input.Type) + //.Where(u => u.Sort == input.Sort) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .OrderBuilder(input) + .Select(s => new BusMajorTypeOutput() + { + Code = s.Code, + Name = s.Name, + Type = s.Type, + Sort = s.Sort, + Id = s.Id + }) + .ToPagedListAsync(input.Page, input.PageSize); + + return busMajorTypes; + } + + /// + /// 增加专业大类 + /// + /// + /// + [HttpPost("add")] + public async Task Add(AddBusMajorTypeInput input) + { + var busMajorType = input.Adapt(); + await _busMajorTypeRep.InsertAsync(busMajorType); + } + + /// + /// 删除专业大类 + /// + /// + /// + [HttpPost("delete")] + public async Task Delete(DeleteBusMajorTypeInput input) + { + var busMajorType = await _busMajorTypeRep.AsQueryable().FirstAsync(u => u.Id == input.Id); + await _busMajorTypeRep.FakeDeleteAsync(busMajorType); + } + + /// + /// 更新专业大类 + /// + /// + /// + [HttpPost("edit")] + public async Task Update(UpdateBusMajorTypeInput input) + { + var isExist = await _busMajorTypeRep.AsQueryable().AnyAsync(u => u.Id == input.Id); + if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3000); + + var busMajorType = input.Adapt(); + await _busMajorTypeRep.UpdateAsync(busMajorType); + } + + /// + /// 获取专业大类 + /// + /// + /// + [HttpGet("detail")] + public async Task Get([FromQuery] QueryeBusMajorTypeInput input) + { + return (await _busMajorTypeRep.AsQueryable().FirstAsync(u => u.Id == input.Id)).Adapt(); + } + + /// + /// 获取专业大类列表 + /// + /// + /// + [HttpGet("list")] + public async Task> List([FromQuery] BusMajorTypeInput input) + { + return await _busMajorTypeRep.AsQueryable().Select().ToListAsync(); + } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusMajorType/Dto/BusMajorTypeDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusMajorType/Dto/BusMajorTypeDto.cs new file mode 100644 index 0000000..899f3bc --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusMajorType/Dto/BusMajorTypeDto.cs @@ -0,0 +1,36 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 专业大类输出参数 + /// + public class BusMajorTypeDto + { + /// + /// 专业编号 + /// + public string Code { get; set; } + + /// + /// 专业名称 + /// + public string Name { get; set; } + + /// + /// 类型 + /// + public int Type { get; set; } + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusMajorType/Dto/BusMajorTypeInput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusMajorType/Dto/BusMajorTypeInput.cs new file mode 100644 index 0000000..2efc884 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusMajorType/Dto/BusMajorTypeInput.cs @@ -0,0 +1,56 @@ +using Admin.NET.Core; +using System; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application +{ + /// + /// 专业大类输入参数 + /// + public class BusMajorTypeInput : BasePageInput + { + /// + /// 专业编号 + /// + public virtual string Code { get; set; } + + /// + /// 专业名称 + /// + public virtual string Name { get; set; } + + /// + /// 类型 + /// + public virtual int Type { get; set; } + + /// + /// Sort排序 + /// + public virtual int Sort { get; set; } + + } + + public class AddBusMajorTypeInput : BusMajorTypeInput + { + } + + public class DeleteBusMajorTypeInput : BaseIdInput + { + } + + public class UpdateBusMajorTypeInput : BusMajorTypeInput + { + /// + /// Id主键 + /// + [Required(ErrorMessage = "Id主键不能为空")] + public long Id { get; set; } + + } + + public class QueryeBusMajorTypeInput : BaseIdInput + { + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusMajorType/Dto/BusMajorTypeOutput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusMajorType/Dto/BusMajorTypeOutput.cs new file mode 100644 index 0000000..04cb92e --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusMajorType/Dto/BusMajorTypeOutput.cs @@ -0,0 +1,36 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 专业大类输出参数 + /// + public class BusMajorTypeOutput + { + /// + /// 专业编号 + /// + public string Code { get; set; } + + /// + /// 专业名称 + /// + public string Name { get; set; } + + /// + /// 类型 + /// + public int Type { get; set; } + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusMenuMapScale/BusMenuMapScaleService.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusMenuMapScale/BusMenuMapScaleService.cs new file mode 100644 index 0000000..f4c81f2 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusMenuMapScale/BusMenuMapScaleService.cs @@ -0,0 +1,119 @@ +using Admin.NET.Core; +using Furion.DatabaseAccessor; + +using Furion.DependencyInjection; +using Furion.DynamicApiController; +using Furion.FriendlyException; +using Mapster; +using Microsoft.AspNetCore.Mvc; + +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// 菜单关联量表服务 + /// + [ApiDescriptionSettings("测评服务", Name = "BusMenuMapScale", Order = 100)] + public class BusMenuMapScaleService : IDynamicApiController, ITransient + { + private readonly SqlSugarRepository _busMenuMapScaleRep; + + public BusMenuMapScaleService( + SqlSugarRepository busMenuMapScaleRep + ) + { + _busMenuMapScaleRep = busMenuMapScaleRep; + } + + /// + /// 分页查询菜单关联量表 + /// + /// + /// + [HttpGet("page")] + public async Task> Page([FromQuery] BusMenuMapScaleInput input) + { + var busMenuMapScales = await _busMenuMapScaleRep.AsQueryable() + .Where(u => u.MenuId == input.MenuId) + .Where(u => u.ScaleId == input.ScaleId) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .OrderBuilder(input) + .Select(s => new BusMenuMapScaleOutput() + { + MenuId = s.MenuId, + ScaleId = s.ScaleId, + Id = s.Id + + }) + .ToPagedListAsync(input.Page, input.PageSize); + + return busMenuMapScales; + } + + /// + /// 增加菜单关联量表 + /// + /// + /// + [HttpPost("add")] + public async Task Add(AddBusMenuMapScaleInput input) + { + var busMenuMapScale = input.Adapt(); + await _busMenuMapScaleRep.InsertAsync(busMenuMapScale); + } + + /// + /// 删除菜单关联量表 + /// + /// + /// + [HttpPost("delete")] + public async Task Delete(DeleteBusMenuMapScaleInput input) + { + var busMenuMapScale = await _busMenuMapScaleRep.AsQueryable().FirstAsync(u => u.Id == input.Id); + await _busMenuMapScaleRep.FakeDeleteAsync(busMenuMapScale); + } + + /// + /// 更新菜单关联量表 + /// + /// + /// + [HttpPost("edit")] + public async Task Update(UpdateBusMenuMapScaleInput input) + { + var isExist = await _busMenuMapScaleRep.AsQueryable().AnyAsync(u => u.Id == input.Id); + if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3000); + + var busMenuMapScale = input.Adapt(); + await _busMenuMapScaleRep.UpdateAsync(busMenuMapScale); + } + + /// + /// 获取菜单关联量表 + /// + /// + /// + [HttpGet("detail")] + public async Task Get([FromQuery] QueryeBusMenuMapScaleInput input) + { + return (await _busMenuMapScaleRep.AsQueryable().FirstAsync(u => u.Id == input.Id)).Adapt(); + } + + /// + /// 获取菜单关联量表列表 + /// + /// + /// + [HttpGet("list")] + public async Task> List([FromQuery] BusMenuMapScaleInput input) + { + return await _busMenuMapScaleRep.AsQueryable().Select().ToListAsync(); + } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusMenuMapScale/Dto/BusMenuMapScaleDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusMenuMapScale/Dto/BusMenuMapScaleDto.cs new file mode 100644 index 0000000..bc722c1 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusMenuMapScale/Dto/BusMenuMapScaleDto.cs @@ -0,0 +1,26 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 菜单关联量表输出参数 + /// + public class BusMenuMapScaleDto + { + /// + /// + /// + public long MenuId { get; set; } + + /// + /// + /// + public long ScaleId { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusMenuMapScale/Dto/BusMenuMapScaleInput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusMenuMapScale/Dto/BusMenuMapScaleInput.cs new file mode 100644 index 0000000..3ce1d77 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusMenuMapScale/Dto/BusMenuMapScaleInput.cs @@ -0,0 +1,46 @@ +using Admin.NET.Core; +using System; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application +{ + /// + /// 菜单关联量表输入参数 + /// + public class BusMenuMapScaleInput : BasePageInput + { + /// + /// + /// + public virtual long MenuId { get; set; } + + /// + /// + /// + public virtual long ScaleId { get; set; } + + } + + public class AddBusMenuMapScaleInput : BusMenuMapScaleInput + { + } + + public class DeleteBusMenuMapScaleInput : BaseIdInput + { + } + + public class UpdateBusMenuMapScaleInput : BusMenuMapScaleInput + { + /// + /// Id主键 + /// + [Required(ErrorMessage = "Id主键不能为空")] + public long Id { get; set; } + + } + + public class QueryeBusMenuMapScaleInput : BaseIdInput + { + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusMenuMapScale/Dto/BusMenuMapScaleOutput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusMenuMapScale/Dto/BusMenuMapScaleOutput.cs new file mode 100644 index 0000000..68bc31a --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusMenuMapScale/Dto/BusMenuMapScaleOutput.cs @@ -0,0 +1,26 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 菜单关联量表输出参数 + /// + public class BusMenuMapScaleOutput + { + /// + /// + /// + public long MenuId { get; set; } + + /// + /// + /// + public long ScaleId { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusProvince/BusProvinceService.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusProvince/BusProvinceService.cs new file mode 100644 index 0000000..6aedc4e --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusProvince/BusProvinceService.cs @@ -0,0 +1,121 @@ +using Admin.NET.Core; +using Furion.DatabaseAccessor; + +using Furion.DependencyInjection; +using Furion.DynamicApiController; +using Furion.FriendlyException; +using Mapster; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// 省份管理服务 + /// + [ApiDescriptionSettings("测评服务", Name = "BusProvince", Order = 100)] + public class BusProvinceService : IDynamicApiController, ITransient + { + private readonly SqlSugarRepository _busProvinceRep; + + public BusProvinceService( + SqlSugarRepository busProvinceRep + ) + { + _busProvinceRep = busProvinceRep; + } + + /// + /// 分页查询省份管理 + /// + /// + /// + [HttpGet("page")] + public async Task> Page([FromQuery] BusProvinceInput input) + { + var busProvinces = await _busProvinceRep.AsQueryable() + .WhereIF(!string.IsNullOrEmpty(input.Code), u => u.Code == input.Code) + .WhereIF(!string.IsNullOrEmpty(input.Name), u => u.Name == input.Name) + //.Where(u => u.Sort == input.Sort) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .OrderBuilder(input) + .Select(s => new BusProvinceOutput() + { + Code = s.Code, + Name = s.Name, + Sort = s.Sort, + Id = s.Id + }) + .ToPagedListAsync(input.Page, input.PageSize); + + return busProvinces; + } + + /// + /// 增加省份管理 + /// + /// + /// + [HttpPost("add")] + public async Task Add(AddBusProvinceInput input) + { + var busProvince = input.Adapt(); + await _busProvinceRep.InsertAsync(busProvince); + } + + /// + /// 删除省份管理 + /// + /// + /// + [HttpPost("delete")] + public async Task Delete(DeleteBusProvinceInput input) + { + var busProvince = await _busProvinceRep.AsQueryable().FirstAsync(u => u.Id == input.Id); + await _busProvinceRep.FakeDeleteAsync(busProvince); + } + + /// + /// 更新省份管理 + /// + /// + /// + [HttpPost("edit")] + public async Task Update(UpdateBusProvinceInput input) + { + var isExist = await _busProvinceRep.AsQueryable().AnyAsync(u => u.Id == input.Id); + if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3000); + + var busProvince = input.Adapt(); + await _busProvinceRep.UpdateAsync(busProvince); + } + + /// + /// 获取省份管理 + /// + /// + /// + [HttpGet("detail")] + public async Task Get([FromQuery] QueryeBusProvinceInput input) + { + return (await _busProvinceRep.AsQueryable().FirstAsync(u => u.Id == input.Id)).Adapt(); + } + + /// + /// 获取省份管理列表 + /// + /// + /// + [HttpGet("list")] + public async Task> List([FromQuery] BusProvinceInput input) + { + return await _busProvinceRep.AsQueryable().Select().ToListAsync(); + } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusProvince/Dto/BusProvinceDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusProvince/Dto/BusProvinceDto.cs new file mode 100644 index 0000000..bbcebac --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusProvince/Dto/BusProvinceDto.cs @@ -0,0 +1,31 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 省份管理输出参数 + /// + public class BusProvinceDto + { + /// + /// 省份编号 + /// + public string Code { get; set; } + + /// + /// 省份名称 + /// + public string Name { get; set; } + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusProvince/Dto/BusProvinceInput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusProvince/Dto/BusProvinceInput.cs new file mode 100644 index 0000000..8ee4670 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusProvince/Dto/BusProvinceInput.cs @@ -0,0 +1,51 @@ +using Admin.NET.Core; +using System; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application +{ + /// + /// 省份管理输入参数 + /// + public class BusProvinceInput : BasePageInput + { + /// + /// 省份编号 + /// + public virtual string Code { get; set; } + + /// + /// 省份名称 + /// + public virtual string Name { get; set; } + + /// + /// Sort排序 + /// + public virtual int Sort { get; set; } + + } + + public class AddBusProvinceInput : BusProvinceInput + { + } + + public class DeleteBusProvinceInput : BaseIdInput + { + } + + public class UpdateBusProvinceInput : BusProvinceInput + { + /// + /// Id主键 + /// + [Required(ErrorMessage = "Id主键不能为空")] + public long Id { get; set; } + + } + + public class QueryeBusProvinceInput : BaseIdInput + { + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusProvince/Dto/BusProvinceOutput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusProvince/Dto/BusProvinceOutput.cs new file mode 100644 index 0000000..5ec993f --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusProvince/Dto/BusProvinceOutput.cs @@ -0,0 +1,31 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 省份管理输出参数 + /// + public class BusProvinceOutput + { + /// + /// 省份编号 + /// + public string Code { get; set; } + + /// + /// 省份名称 + /// + public string Name { get; set; } + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/BusScaleService.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/BusScaleService.cs new file mode 100644 index 0000000..629202b --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/BusScaleService.cs @@ -0,0 +1,2059 @@ +using Admin.NET.Core; +using Elastic.Transport; +using Furion.DatabaseAccessor; + +using Furion.DataValidation; +using Furion.DependencyInjection; +using Furion.DynamicApiController; +using Furion.FriendlyException; +using iText.Signatures.Validation.Report; +using Mapster; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using MongoDB.Driver.Linq; +using Newtonsoft.Json; +using OfficeOpenXml.ConditionalFormatting; +using RazorEngine.Compilation.ImpromptuInterface.Optimization; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Text; +using System.Text.Json; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// 量表类型表服务 + /// + [ApiDescriptionSettings("测评服务", Name = "BusScale", Order = 100)] + public class BusScaleService : IDynamicApiController, ITransient + { + private readonly SqlSugarRepository _busScaleRep; + private readonly SqlSugarRepository _busScaleQuestionsRep; + private readonly SqlSugarRepository _busmenMapScaleRep; + private readonly SqlSugarRepository _dictdataRep; + private readonly SqlSugarRepository _studentScaleResultsRep; + private readonly SqlSugarRepository _custommapreportRep; + private readonly SqlSugarRepository _customexplainRep; + + private readonly SqlSugarRepository _ScaleDescriptionRep; + + private readonly UserManager _userManager; + private readonly SqlSugarRepository _hldtagmapprorep; + + private readonly SqlSugarRepository _bustagmappersonrep; + + + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public BusScaleService( + SqlSugarRepository busScaleRep, + SqlSugarRepository _ScaleQuestionRep, + SqlSugarRepository menMapScaleRep, + SqlSugarRepository dictdataRep, + SqlSugarRepository studentScaleResultsRep, + SqlSugarRepository custommapreportRep, + SqlSugarRepository customexplainRep, + SqlSugarRepository scaleDescriptionRep, + UserManager userManager, SqlSugarRepository hldtagmapprorep, SqlSugarRepository bustagmappersonrep + ) + { + _busScaleRep = busScaleRep; + _busScaleQuestionsRep = _ScaleQuestionRep; + _busmenMapScaleRep = menMapScaleRep; + _dictdataRep = dictdataRep; + _studentScaleResultsRep = studentScaleResultsRep; + _custommapreportRep = custommapreportRep; + _customexplainRep = customexplainRep; + _ScaleDescriptionRep = scaleDescriptionRep; + _userManager = userManager; + _hldtagmapprorep = hldtagmapprorep; + _bustagmappersonrep = bustagmappersonrep; + + } + + + /// + /// 分页查询量表类型表 + /// + /// + /// + [HttpGet("page")] + public async Task> Page([FromQuery] BusScaleInput input) + { + var busScales = await _busScaleRep.AsQueryable() + .WhereIF(!string.IsNullOrEmpty(input.Name), u => u.Name == input.Name) + .WhereIF(input.QuestionsType.HasValue, u => u.QuestionsType == input.QuestionsType) + .WhereIF(!string.IsNullOrEmpty(input.Summary), u => u.Summary == input.Summary) + .WhereIF(!string.IsNullOrEmpty(input.Pic), u => u.Pic == input.Pic) + //.Where(u => u.Sort == input.Sort) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .OrderBuilder(input) + .Select(s => new BusScaleOutput() + { + Name = s.Name, + QuestionsType = s.QuestionsType, + Summary = s.Summary, + Status = s.Status, + Pic = s.Pic, + Sort = s.Sort, + Id = s.Id + }) + .ToPagedListAsync(input.Page, input.PageSize); + + return busScales; + } + + /// + /// 增加量表类型表 + /// + /// + /// + [HttpPost("add")] + public async Task Add(AddBusScaleInput input) + { + var busScale = input.Adapt(); + await _busScaleRep.InsertAsync(busScale); + } + + /// + /// 删除量表类型表 + /// + /// + /// + [HttpPost("delete")] + public async Task Delete(DeleteBusScaleInput input) + { + var busScale = await _busScaleRep.AsQueryable().FirstAsync(u => u.Id == input.Id); + await _busScaleRep.FakeDeleteAsync(busScale); + } + + /// + /// 更新量表类型表 + /// + /// + /// + [HttpPost("edit")] + public async Task Update(UpdateBusScaleInput input) + { + var isExist = await _busScaleRep.AsQueryable().AnyAsync(u => u.Id == input.Id); + if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3000); + + var busScale = input.Adapt(); + await _busScaleRep.UpdateAsync(busScale); + } + + /// + /// 获取量表类型表 + /// + /// + /// + [HttpGet("detail")] + public async Task Get([FromQuery] QueryeBusScaleInput input) + { + return (await _busScaleRep.AsQueryable().FirstAsync(u => u.Id == input.Id)).Adapt(); + } + + /// + /// 获取量表类型表列表 + /// + /// + /// + [HttpGet("list")] + [AllowAnonymous] + public async Task> List([FromQuery] BusByMenuInput input) + { + if (input.MenuId <= 0) + { + throw Oops.Oh(ErrorCodeEnum.D1016); + } + var result = await _busmenMapScaleRep.AsQueryable().Where(e => e.MenuId == input.MenuId && e.IsDelete == false).Select(s => s.ScaleId).ToListAsync(); + return await _busScaleRep.AsQueryable().Where(e => e.IsDelete == false && result.Contains(e.Id)).Select(e => new BusScaleOutput() + { + + Name = e.Name, + QuestionsType = e.QuestionsType, + MinImg = e.MinImg, + Summary = e.Summary, + Status = e.Status, + Pic = e.Pic, + Sort = e.Sort, + Id = e.Id + }).ToListAsync(); + } + + + + /// + /// 留学问卷试题获取 + /// + /// + /// + [HttpGet("getbusscalestudy")] + public async Task> GetBusScaleStudy([FromQuery] BusScaleRequestDTO requestDTO) + { + var scaleresult = new List(); + var diclist = await _dictdataRep.AsQueryable().Where(e => e.DictTypeId == 341341177155653).ToListAsync(); + var query = await _busScaleQuestionsRep.AsQueryable().Where(e => e.ScaleId == requestDTO.ScaleId && e.IsDelete == false).ToListAsync(); + var list = new List(); + query.ForEach(a => + { + list.Add(JsonConvert.DeserializeObject(a.Context)); + }); + diclist.ForEach(a => + { + int code = int.Parse(a.Code); + var item = new BusScaleStudyBroadResponseDTO() + { + TitleName = a.Value, + busScaleStudies = list.Where(e => e.type == code).ToList() + }; + scaleresult.Add(item); + }); + return scaleresult; + } + + + + + /// + /// 根据用户Id获取试题进度 + /// + /// + /// + [HttpGet("getcustommaproccess")] + public async Task GetCustomMapProccess([FromQuery] CustomMapProccessRequestDTO requestDTO) + { + var res = new CustomMapProccessDTO(); + var dicdata = await _dictdataRep.AsQueryable().Where(e => e.DictTypeId == 341857672892485).ToListAsync(); + res.mapProccesses = dicdata.Select(s => new MapProccessDTO() { Name = s.Value, Status = 0, ScaleId = long.Parse(s.Code), Sort = s.OrderNo }).ToList(); + + var scaldescription = await _ScaleDescriptionRep.AsQueryable().Where(e => res.mapProccesses.Select(s => s.ScaleId).Contains(e.ScaleId)).ToListAsync(); + + var custommapreport = await _custommapreportRep.AsQueryable().Where(e => e.IsDelete == false && e.CustomId == requestDTO.CustomId && e.Status == 0).ToListAsync(); + if (!custommapreport.Any()) + { + await _custommapreportRep.InsertAsync(new BusCustomMapReport() + { + // CreateTime = DateTime.Now, + CreateUserId = _userManager.UserId, + CreateUserName = _userManager.Account, + CustomId = requestDTO.CustomId, + Proccess = 1, + Status = 0 + }); + res.ScaleId = dicdata.FirstOrDefault(s => s.OrderNo == 1).Code; + long scaleId = long.Parse(res.ScaleId); + res.Description = (await _busScaleRep.GetFirstAsync(e => e.Id == scaleId)).Summary; + res.mapProccesses.ForEach(a => + { + a.Application = scaldescription.FirstOrDefault(s => s.ScaleId == a.ScaleId).Application; + a.Notice = scaldescription.FirstOrDefault(s => s.ScaleId == a.ScaleId).Notice; + a.UsesTime = scaldescription.FirstOrDefault(s => s.ScaleId == a.ScaleId).UsesTime; + a.Introduce = scaldescription.FirstOrDefault(s => s.ScaleId == a.ScaleId).Introduce; + a.Status = 0; + }); + } + else + { + var customsort = custommapreport.FirstOrDefault().Proccess; + res.mapProccesses.ForEach(a => + { + a.Status = a.Sort < customsort ? 1 : 0; + a.Application = scaldescription.FirstOrDefault(s => s.ScaleId == a.ScaleId).Application; + a.Notice = scaldescription.FirstOrDefault(s => s.ScaleId == a.ScaleId).Notice; + a.UsesTime = scaldescription.FirstOrDefault(s => s.ScaleId == a.ScaleId).UsesTime; + a.Introduce = scaldescription.FirstOrDefault(s => s.ScaleId == a.ScaleId).Introduce; + }); + res.ScaleId = dicdata.FirstOrDefault(s => s.OrderNo == customsort).Code; + long scaleId = long.Parse(res.ScaleId); + res.Description = (await _busScaleRep.GetFirstAsync(e => e.Id == scaleId)).Summary; + } + return res; + + } + + + /// + /// 根据量表类型Id获取量表试题内容 + /// + /// + /// + [HttpGet("getscalequestions")] + public async Task GetScaleQuestions([FromQuery] BusScaleRequestDTO requestDTO) + { + // int k = 0; + try + { + var scaleresult = new BusScaleResponseDTO(); + var single = await _busScaleRep.GetFirstAsync(r => r.Id == requestDTO.ScaleId); + var query = await _busScaleQuestionsRep.AsQueryable().Where(e => e.ScaleId == requestDTO.ScaleId && e.IsDelete == false).ToListAsync(); + var qlist = new List(); + query.ForEach(c => + { + // k++; + // var newmodel = new ScaleQuestions() { answer = c.Context }; + var newmodel = JsonConvert.DeserializeObject(c.Context); + newmodel.sort = c.Sort; + newmodel.type = newmodel.answer.FirstOrDefault().tag; + qlist.Add(newmodel); + }); + // scaleresult.Description = single.Summary; + scaleresult.scaleQuestions = qlist; + scaleresult.Go = single.Name.Contains("职业锚价值观") ? 1 : 0;//迎合前端给特例 + scaleresult.QuestionsType = single.QuestionsType; + return scaleresult; + } + catch (Exception ex) + { + throw Oops.Oh(ex); + } + } + + + + + /// + /// 获取量表描述 + /// + /// + /// + [HttpGet("GetBusScaleDescription")] + public async Task GetBusScaleDescription([FromQuery] BusScaleDescriptionRequestDTO requestDTO) + { + var res = new BusScaleDescriptionResponseDto(); + res.busScaleDescriptions = await _ScaleDescriptionRep.AsQueryable() + .Where(e => e.ScaleId == requestDTO.ScaleId) + .Select(s => new BusScaleDescriptionDto() + { + Title = s.Title, + Application = s.Application, + Introduce = s.Introduce, + Notice = s.Notice, + ScaleId = s.ScaleId, + UsesTime = s.UsesTime, + Sort = s.Sort + }).ToListAsync(); + return res; + + } + + + /// + /// 量表试题保存集合 + /// + /// + /// + [HttpPost("CustomBusScale")] + public async Task CustomBusScale(CustomBusScaleRequestDTO scaleRequestDTO) + { + var result = new CustomBusScaleDto(); + var newpp = new BusScaleResult(); + var scalTotals = new List(); + var models = new BusStudentScaleResults() + { + CreateUserId = _userManager.UserId, + CreateTime = DateTime.Now, + CreateUserName = _userManager.Account, + SysOauthUserId = _userManager.UserId, + ScaleId = scaleRequestDTO.ScaleId, + TenantId = _userManager.TenantId, + // Type = -1, + // Result = JsonConvert.SerializeObject(newpp) + }; + var single = new BusCustomMapReport(); + + + switch (scaleRequestDTO.ScaleId) + { + case 339914746081349:// 兴趣测评[Holland] + var jsons = JsonConvert.DeserializeObject>(scaleRequestDTO.Inputs.ToString()).GroupBy(s => new { name = s.name }).Select(s => new ScalListItem() { name = s.Key.name, value = s.Sum(c => c.value) }).OrderByDescending(c => c.value).ToList(); + int i = 0; + jsons.ForEach(a => + { + i++; + if (i <= 3) + { + newpp.Result += a.name; + } + }); + newpp.scalLists = jsons; + models.Result = JsonConvert.SerializeObject(newpp); + + single = await _custommapreportRep.AsQueryable().FirstAsync(e => e.CustomId == scaleRequestDTO.CustomId && e.Status == 0 && e.IsDelete == false); + single.Proccess = 2; + + break; + case 339916661030981://性格测评[MBTI] + + //E-I S-N T-F J-P + var mbtilist = JsonConvert.DeserializeObject>(scaleRequestDTO.Inputs.ToString()).GroupBy(s => new { name = s.name }) + .Select(s => new ScalListItem() { name = s.Key.name, value = s.Sum(c => c.value) }).ToList(); + var taglist = "ESTJ"; + for (var k = 0; k < taglist.Length; k++) + { + + switch (taglist[k].ToString()) + { + case "E": + newpp.Result += mbtilist.FirstOrDefault(e => e.name == taglist[k].ToString()).value > mbtilist.FirstOrDefault(e => e.name == "I").value ? "E" : "I"; + break; + case "S": + newpp.Result += mbtilist.FirstOrDefault(e => e.name == taglist[k].ToString()).value > mbtilist.FirstOrDefault(e => e.name == "N").value ? "S" : "N"; + break; + case "T": + newpp.Result += mbtilist.FirstOrDefault(e => e.name == taglist[k].ToString()).value > mbtilist.FirstOrDefault(e => e.name == "F").value ? "T" : "F"; + break; + case "J": + newpp.Result += mbtilist.FirstOrDefault(e => e.name == taglist[k].ToString()).value > mbtilist.FirstOrDefault(e => e.name == "P").value ? "J" : "P"; + break; + } + + } + newpp.scalLists = mbtilist; + models.Result = JsonConvert.SerializeObject(newpp); + single = await _custommapreportRep.AsQueryable().FirstAsync(e => e.CustomId == scaleRequestDTO.CustomId && e.Status == 0 && e.IsDelete == false); + single.Proccess = 3; + break; + case 339916993155141://能力测评[MIDAS] + //Y(语言智能) R(人际智能) D(运动智能) Z(自然智能) K(空间智能) S(数理智能) L(音乐智能) N(内省智能) + var midaslist = JsonConvert.DeserializeObject>(scaleRequestDTO.Inputs.ToString()).GroupBy(s => new { name = s.name }) + .Select(s => new ScalListItem() { name = s.Key.name, value = s.Sum(c => c.value) }).ToList(); + var scalLists = new List(); + midaslist.ForEach(a => + { + var item = new ScalListItem(); + switch (a.name) + { + case "Y": + item.value = a.value; + item.name = a.name; + item.type = "言语语言智能"; + break; + case "R": + item.value = a.value; + item.name = a.name; + item.type = "人际交往智能"; + break; + case "D": + item.value = a.value; + item.name = a.name; + item.type = "身体动觉智能"; + break; + case "Z": + item.value = a.value; + item.name = a.name; + item.type = "自然观察智能"; + break; + case "K": + item.value = a.value; + item.name = a.name; + item.type = "视觉空间智能"; + break; + case "S": + item.value = a.value; + item.name = a.name; + item.type = "逻辑数理智能"; + break; + case "L": + item.value = a.value; + item.name = a.name; + item.type = "音乐节奏智能"; + break; + case "N": + item.value = a.value; + item.name = a.name; + item.type = "自知自省智能"; + break; + } + + scalLists.Add(item); + }); + newpp.scalLists = scalLists; + models.Result = JsonConvert.SerializeObject(newpp); + + single = await _custommapreportRep.AsQueryable().FirstAsync(e => e.CustomId == scaleRequestDTO.CustomId && e.Status == 0 && e.IsDelete == false); + single.Proccess = 4; + break; + case 339917685502021://职业锚价值观[Career Anchors] + + var careeranchors = JsonConvert.DeserializeObject>(scaleRequestDTO.Inputs.ToString()).GroupBy(s => new { name = s.name }) + .Select(s => new ScalListItem() { name = s.Key.name, value = s.Sum(c => c.value) }).ToList(); + careeranchors.ForEach(a => + { + a.value = a.value == 6 ? a.value + 4 : a.value; + }); + newpp.scalLists = careeranchors; + newpp.Tag = string.Join("+", careeranchors.OrderByDescending(item => item.value).Take(2).Select(s => s.name).ToList()); + models.Type = -1; + models.Result = JsonConvert.SerializeObject(newpp); + + single = await _custommapreportRep.AsQueryable().FirstAsync(e => e.CustomId == scaleRequestDTO.CustomId && e.Status == 0 && e.IsDelete == false); + single.Proccess = 5; + single.Status = 1; + break; + case 339926224392261://学习拖延 + + + break; + case 339926358470725://厌学情绪评估 + + break; + case 339926424055877://学习风格 + var fengge = JsonConvert.DeserializeObject>(scaleRequestDTO.Inputs.ToString()).GroupBy(s => new { name = s.name }) + .Select(s => new ScalListItem() { name = s.Key.name, value = s.Sum(c => c.value) }).ToList(); + var fglist = new List(); + fengge.ForEach(a => + { + var item = new ScalListItem();//A=冲动型或灵感型;P=务实型或实用型;R=沉思型或反思型;T=为理论型 + switch (a.name) + { + case "A": + item.value = a.value; + item.name = a.name; + item.type = "冲动型或灵感型"; + break; + case "P": + item.value = a.value; + item.name = a.name; + item.type = "务实型或实用型"; + break; + case "R": + item.value = a.value; + item.name = a.name; + item.type = "沉思型或反思型"; + break; + case "T": + item.value = a.value; + item.name = a.name; + item.type = "理论型"; + break; + } + fglist.Add(item); + }); + newpp.scalLists = fglist; + models.Type = 4; + models.Title = "学习风格"; + models.Result = JsonConvert.SerializeObject(newpp); + break; + case 339926523736133://学生考试焦虑 + scalTotals = JsonConvert.DeserializeObject>(scaleRequestDTO.Inputs.ToString()); + models.Type = 1; + models.Title = "考试焦虑"; + models.Result = JsonConvert.SerializeObject(scalTotals); + break; + case 339926607917125://学习技能 + scalTotals = JsonConvert.DeserializeObject>(scaleRequestDTO.Inputs.ToString()); + models.Type = 1; + models.Title = "学习技能"; + models.Result = JsonConvert.SerializeObject(scalTotals); + break; + case 340506604851269://SAS焦虑测评 + scalTotals = JsonConvert.DeserializeObject>(scaleRequestDTO.Inputs.ToString()); + models.Type = 1; + models.Title = "焦虑自评"; + models.Result = JsonConvert.SerializeObject(scalTotals); + + break; + case 340506680250437://SDS抑郁测评 + scalTotals = JsonConvert.DeserializeObject>(scaleRequestDTO.Inputs.ToString()); + models.Type = 1; + models.Title = "抑郁自评"; + models.Result = JsonConvert.SerializeObject(scalTotals); + break; + case 340506852511813://中学生心理健康诊断自评(MHT) + var mhtlist = JsonConvert.DeserializeObject>(scaleRequestDTO.Inputs.ToString()).GroupBy(s => new { name = s.name }) + .Select(s => new ScalListItem() { name = s.Key.name, value = s.Sum(c => c.value) }).ToList(); + var mht = new List(); + mhtlist.ForEach(a => + { + var item = new ScalListItem();// + switch (a.name) + { + case "A": + item.value = a.value; + item.name = a.name; + item.type = "学习焦虑"; + break; + case "B": + item.value = a.value; + item.name = a.name; + item.type = "对人焦虑"; + break; + case "C": + item.value = a.value; + item.name = a.name; + item.type = "孤独倾向"; + break; + case "D": + item.value = a.value; + item.name = a.name; + item.type = "自责倾向"; + break; + case "E": + item.value = a.value; + item.name = a.name; + item.type = "过敏倾向"; + break; + case "F": + item.value = a.value; + item.name = a.name; + item.type = "身体症状"; + break; + case "G": + item.value = a.value; + item.name = a.name; + item.type = "恐怖倾向"; + break; + case "H": + item.value = a.value; + item.name = a.name; + item.type = "冲动倾向"; + break; + case "X": + item.value = a.value; + item.name = a.name; + item.type = "效度"; + break; + } + mht.Add(item); + }); + newpp.scalLists = mht; + models.Type = 1; + models.Title = "中学生心理健康诊断自评"; + models.Result = JsonConvert.SerializeObject(newpp); + break; + case 340507046379589://留学需求调研 + models.Type = -2; + models.Title = "留学咨询"; + models.Result = JsonConvert.SerializeObject(scaleRequestDTO.Inputs); + break; + } + + + await _studentScaleResultsRep.InsertAsync(models); + result.Id = models.Id; + if (single != null) + { + single.UpdateTime = DateTime.Now; + switch (single.Proccess) + { + + case 2: + single.HId = models.Id; + break; + case 3: + single.MId = models.Id; + break; + case 4: + single.NId = models.Id; + break; + case 5: + single.JId = models.Id; + break; + } + single.UpdateUserId = _userManager.UserId; + single.UpdateUserName = _userManager.Account; + _custommapreportRep.Update(single); + result.ReportId = single.Id; + } + result.ScaleId = scaleRequestDTO.ScaleId; + return result; + } + + + + + /// + /// 量表试题保存集合V2 + /// type=0 兴趣测评报告 + ///=1 性格测评报告 + ///=2 能力测评 + ///=3 学生考试考虑 + ///=4 学习风格 + ///=5 学习技能 + ///=6 SAS + ///=7 SDS + ///=8 SCL-90 + ///=9 MHT + ///=-1 价值观 + ///=-2 留学咨询 + /// + /// + /// + [HttpPost("CustomBusScale/v2")] + public async Task CustomBusScaleV2(CustomBusScaleRequestDTO scaleRequestDTO) + { + var result = new CustomBusScaleDto(); + var newpp = new BusScaleResult(); + var scalTotals = new List(); + var models = new BusStudentScaleResults() + { + CreateUserId = _userManager.UserId, + CreateTime = DateTime.Now, + CreateUserName = _userManager.Account, + SysOauthUserId = _userManager.UserId, + ScaleId = scaleRequestDTO.ScaleId, + TenantId = _userManager.TenantId, + // Type = -1, + // Result = JsonConvert.SerializeObject(newpp) + }; + // var single = new BusCustomMapReport(); + + + switch (scaleRequestDTO.ScaleId) + { + case 339914746081349:// 兴趣测评[Holland] + var jsons = scaleRequestDTO.Inputs.GroupBy(s => new { name = s.name }).Select(s => new ScalListItem() { name = s.Key.name, value = s.Sum(c => c.value) }).OrderByDescending(c => c.value).ToList(); + int i = 0; + jsons.ForEach(a => + { + i++; + if (i <= 3) + { + newpp.Result += a.name; + } + }); + newpp.scalLists = jsons; + models.Title = "兴趣测评"; + models.Type = 0; + models.Result = JsonConvert.SerializeObject(newpp); + + //single = await _custommapreportRep.AsQueryable().FirstAsync(e => e.CustomId == scaleRequestDTO.CustomId && e.Status == 0 && e.IsDelete == false); + //single.Proccess = 2; + + break; + case 339916661030981://性格测评[MBTI] + + //E-I S-N T-F J-P + var mbtilist = scaleRequestDTO.Inputs.GroupBy(s => new { name = s.name }) + .Select(s => new ScalListItem() { name = s.Key.name, value = s.Sum(c => c.value) }).ToList(); + var taglist = "ESTJ"; + for (var k = 0; k < taglist.Length; k++) + { + + switch (taglist[k].ToString()) + { + case "E": + newpp.Result += mbtilist.FirstOrDefault(e => e.name == taglist[k].ToString()).value > mbtilist.FirstOrDefault(e => e.name == "I").value ? "E" : "I"; + break; + case "S": + newpp.Result += mbtilist.FirstOrDefault(e => e.name == taglist[k].ToString()).value > mbtilist.FirstOrDefault(e => e.name == "N").value ? "S" : "N"; + break; + case "T": + newpp.Result += mbtilist.FirstOrDefault(e => e.name == taglist[k].ToString()).value > mbtilist.FirstOrDefault(e => e.name == "F").value ? "T" : "F"; + break; + case "J": + newpp.Result += mbtilist.FirstOrDefault(e => e.name == taglist[k].ToString()).value > mbtilist.FirstOrDefault(e => e.name == "P").value ? "J" : "P"; + break; + } + + } + newpp.scalLists = mbtilist; + models.Title = "性格测评"; + models.Type = 1; + models.Result = JsonConvert.SerializeObject(newpp); + // single = await _custommapreportRep.AsQueryable().FirstAsync(e => e.CustomId == scaleRequestDTO.CustomId && e.Status == 0 && e.IsDelete == false); + // single.Proccess = 3; + break; + case 339916993155141://能力测评[MIDAS] + //Y(语言智能) R(人际智能) D(运动智能) Z(自然智能) K(空间智能) S(数理智能) L(音乐智能) N(内省智能) + var midaslist = scaleRequestDTO.Inputs.GroupBy(s => new { name = s.name }) + .Select(s => new ScalListItem() { name = s.Key.name, value = s.Sum(c => c.value) }).ToList(); + var scalLists = new List(); + midaslist.ForEach(a => + { + var item = new ScalListItem(); + switch (a.name) + { + case "Y": + item.value = a.value; + item.name = a.name; + item.type = "言语语言智能"; + break; + case "R": + item.value = a.value; + item.name = a.name; + item.type = "人际交往智能"; + break; + case "D": + item.value = a.value; + item.name = a.name; + item.type = "身体动觉智能"; + break; + case "Z": + item.value = a.value; + item.name = a.name; + item.type = "自然观察智能"; + break; + case "K": + item.value = a.value; + item.name = a.name; + item.type = "视觉空间智能"; + break; + case "S": + item.value = a.value; + item.name = a.name; + item.type = "逻辑数理智能"; + break; + case "L": + item.value = a.value; + item.name = a.name; + item.type = "音乐节奏智能"; + break; + case "N": + item.value = a.value; + item.name = a.name; + item.type = "自知自省智能"; + break; + } + + scalLists.Add(item); + }); + newpp.scalLists = scalLists; + models.Title = "能力测评"; + models.Type = 2; + models.Result = JsonConvert.SerializeObject(newpp); + + // single = await _custommapreportRep.AsQueryable().FirstAsync(e => e.CustomId == scaleRequestDTO.CustomId && e.Status == 0 && e.IsDelete == false); + // single.Proccess = 4; + break; + case 339917685502021://职业锚价值观[Career Anchors] + + var careeranchors = scaleRequestDTO.Inputs.GroupBy(s => new { name = s.name }) + .Select(s => new ScalListItem() { name = s.Key.name, value = s.Sum(c => c.value) }).ToList(); + careeranchors.ForEach(a => + { + a.value = a.value == 6 ? a.value + 4 : a.value; + }); + newpp.scalLists = careeranchors; + // 排序并取前两个元素,然后提取 name 字段,最后用 + 连接成字符串 + newpp.Tag = string.Join("+", careeranchors.OrderByDescending(item => item.value).Take(2).Select(s => s.name)); + models.Type = -1; + models.Title = "职业价值观"; + models.Result = JsonConvert.SerializeObject(newpp); + + // single = await _custommapreportRep.AsQueryable().FirstAsync(e => e.CustomId == scaleRequestDTO.CustomId && e.Status == 0 && e.IsDelete == false); + // single.Proccess = 5; + // single.Status = 1; + break; + case 339926224392261://学习拖延 + + + break; + case 339926358470725://厌学情绪评估 + + break; + case 339926424055877://学习风格 + var fengge = scaleRequestDTO.Inputs.GroupBy(s => new { name = s.name }) + .Select(s => new ScalListItem() { name = s.Key.name, value = s.Sum(c => c.value) }).ToList(); + var fglist = new List(); + fengge.ForEach(a => + { + var item = new ScalListItem();//A=冲动型或灵感型;P=务实型或实用型;R=沉思型或反思型;T=为理论型 + switch (a.name) + { + case "A": + item.value = a.value; + item.name = a.name; + item.type = "冲动型或灵感型"; + break; + case "P": + item.value = a.value; + item.name = a.name; + item.type = "务实型或实用型"; + break; + case "R": + item.value = a.value; + item.name = a.name; + item.type = "沉思型或反思型"; + break; + case "T": + item.value = a.value; + item.name = a.name; + item.type = "理论型"; + break; + } + fglist.Add(item); + }); + newpp.scalLists = fglist; + models.Type = 4; + models.Title = "学习风格"; + models.Result = JsonConvert.SerializeObject(newpp); + break; + case 339926523736133://学生考试焦虑 + scalTotals = new List { new ScalTotals() { Total = scaleRequestDTO.Inputs.First().value } }; + models.Type = 3; + models.Title = "考试焦虑"; + models.Result = JsonConvert.SerializeObject(scalTotals); + break; + case 339926607917125://学习技能 + scalTotals = new List { new ScalTotals() { Total = scaleRequestDTO.Inputs.First().value } }; + models.Type = 5; + models.Title = "学习技能"; + models.Result = JsonConvert.SerializeObject(scalTotals); + break; + case 340506604851269://SAS焦虑测评 + scalTotals = new List { new ScalTotals() { Total = scaleRequestDTO.Inputs.First().value } }; + models.Type = 6; + models.Title = "焦虑自评"; + models.Result = JsonConvert.SerializeObject(scalTotals); + + break; + case 340506680250437://SDS抑郁测评 + scalTotals = new List { new ScalTotals() { Total = scaleRequestDTO.Inputs.First().value } }; + models.Type = 7; + models.Title = "抑郁自评"; + models.Result = JsonConvert.SerializeObject(scalTotals); + break; + case 340506852511813://中学生心理健康诊断自评(MHT) + var mhtlist = scaleRequestDTO.Inputs.GroupBy(s => new { name = s.name }) + .Select(s => new ScalListItem() { name = s.Key.name, value = s.Sum(c => c.value) }).ToList(); + var mht = new List(); + mhtlist.ForEach(a => + { + var item = new ScalListItem();// + switch (a.name) + { + case "A": + item.value = a.value; + item.name = a.name; + item.type = "学习焦虑"; + break; + case "B": + item.value = a.value; + item.name = a.name; + item.type = "对人焦虑"; + break; + case "C": + item.value = a.value; + item.name = a.name; + item.type = "孤独倾向"; + break; + case "D": + item.value = a.value; + item.name = a.name; + item.type = "自责倾向"; + break; + case "E": + item.value = a.value; + item.name = a.name; + item.type = "过敏倾向"; + break; + case "F": + item.value = a.value; + item.name = a.name; + item.type = "身体症状"; + break; + case "G": + item.value = a.value; + item.name = a.name; + item.type = "恐怖倾向"; + break; + case "H": + item.value = a.value; + item.name = a.name; + item.type = "冲动倾向"; + break; + case "X": + item.value = a.value; + item.name = a.name; + item.type = "效度"; + break; + } + mht.Add(item); + }); + newpp.scalLists = mht; + models.Type = 9; + models.Title = "中学生心理健康诊断自评"; + models.Result = JsonConvert.SerializeObject(newpp); + break; + case 340507046379589://留学需求调研 + models.Type = -2; + models.Title = "留学咨询"; + models.Result = JsonConvert.SerializeObject(scaleRequestDTO.Inputs); + break; + } + await _studentScaleResultsRep.InsertAsync(models); + ////result.Id = models.Id; + ////if (single != null) + ////{ + //// single.UpdateTime = DateTime.Now; + //// switch (single.Proccess) + //// { + + //// case 2: + //// single.HId = models.Id; + //// break; + //// case 3: + //// single.MId = models.Id; + //// break; + //// case 4: + //// single.NId = models.Id; + //// break; + //// case 5: + //// single.JId = models.Id; + //// break; + //// } + //// single.UpdateUserId = _userManager.UserId; + //// single.UpdateUserName = _userManager.Account; + //// _custommapreportRep.Update(single); + //// result.ReportId = single.Id; + ////} + result.ScaleId = scaleRequestDTO.ScaleId; + return new CustomBusScaleV2Dto() + { + Type = models.Type, + ReportId = models.Id, + }; + } + + + + + /// + /// 根据标签获取专业组 + /// + /// + /// + [HttpGet("getTagMapPro")] + public async Task> GetMapTag([FromQuery] string tag) + { + // var tags = UtilGetPermutations.GetPermutations(tag); + var taglist = await _hldtagmapprorep.AsQueryable().Where(e => e.Tag.Contains(tag)).Select().ToListAsync(); + return taglist; + + } + + /// + /// 标签性格代表人物 + /// + /// + /// + [HttpGet("getTagMapPerson")] + public async Task> GetTagMapPerson([FromQuery] string tag) + { + //var tags = UtilGetPermutations.GetPermutations(tag); + var taglist = await _bustagmappersonrep.AsQueryable().Where(e => tag.Contains(e.Tag)).Select().ToListAsync(); + return taglist; + + } + + + /// + /// 获取我的报告列表 + /// + /// + /// + [HttpGet("GetBusCustomReports")] + public async Task GetBusCustomReports([FromQuery] BusCustomReportRequestDTO requestDTO) + { + var report = new BusCustomReportsList(); + var list = new List(); + var comphas = await _custommapreportRep.AsQueryable().Where(e => e.IsDelete == false && e.Status == 1 && e.CustomId == requestDTO.CustomId).ToListAsync(); + list = comphas.Select(s => new CustomReports() { CreateTime = s.CreateTime.Value, ReportsId = s.Id, RoleName = "学生", Title = "综合报告", Type = 0 }).ToList(); + var queryreports = await _studentScaleResultsRep.AsQueryable().Where(e => e.Type >= 0 && e.SysOauthUserId == requestDTO.CustomId).ToListAsync(); + if (queryreports.Any()) + { + list.AddRange(queryreports.Select(s => new CustomReports() + { + Type = s.Type, + CreateTime = s.CreateTime.Value, + ReportsId = s.Id, + RoleName = "学生", + Title = s.Title + }).ToList()); + } + report.customReports = list.OrderByDescending(s => s.CreateTime).ToList(); + return report; + } + + + /// + /// 获取我的报告列表V2 + /// + /// + /// + [HttpGet("GetBusCustomReports/v2")] + public async Task GetBusCustomReportsV2([FromQuery] BusCustomReportRequestDTO requestDTO) + { + var report = new BusCustomReportsList(); + var list = new List(); + //var comphas = await _custommapreportRep.AsQueryable().Where(e => e.IsDelete == false && e.Status == 1 && e.CustomId == requestDTO.CustomId).ToListAsync(); + //list = comphas.Select(s => new CustomReports() { CreateTime = s.CreateTime.Value, ReportsId = s.Id, RoleName = "学生", Title = "综合报告", Type = 0 }).ToList(); + var queryreports = await _studentScaleResultsRep.AsQueryable().Where(e => e.SysOauthUserId == requestDTO.CustomId).ToListAsync(); + if (queryreports.Any()) + { + list.AddRange(queryreports.Select(s => new CustomReports() + { + Type = s.Type, + CreateTime = s.CreateTime.Value, + ReportsId = s.Id, + RoleName = "学生", + Title = s.Title + }).ToList()); + } + report.customReports = list.OrderByDescending(s => s.CreateTime).ToList(); + return report; + } + + + + + + + + /// + /// 获取综合报告所需ID + /// + /// + /// + [HttpGet("GetReportMapIds")] + public async Task GetReportMapIds([FromQuery] BusReportMapIdsRequestDto requestDto) + { + var result = new BusReportMapIdsDto(); + var query = await _custommapreportRep.AsQueryable().AnyAsync(e => e.IsDelete == false && e.Id == requestDto.ReportId); + if (query) + { + var customrep = await _custommapreportRep.GetFirstAsync(r => r.Id == requestDto.ReportId); + result.HId = customrep.HId; + result.JId = customrep.JId; + result.MId = customrep.MId; + result.NId = customrep.NId; + result.Proccess = customrep.Proccess; + } + return result; + + } + + + + /// + /// 霍兰德报告 + /// + /// + /// + [HttpGet("GetHollandDimension")] + public async Task GetHollandDimension([FromQuery] BusReportsRequestDto requestDto) + { + var res = new HollandDimension(); + var replistitem = new List(); + string PinTitle = string.Empty; + var holland = await _studentScaleResultsRep.GetFirstAsync(r => r.Id == requestDto.ScaleId); + var picinfo = JsonConvert.DeserializeObject(holland.Result); + var explainholland = await _customexplainRep.AsQueryable().Where(e => e.ScaleId == 339914746081349).ToListAsync(); + var max = picinfo.scalLists.Select(s => s.value).Max() + 1; + for (var i = 0; i < picinfo.Result.Length; i++) + { + var scalemodel = explainholland.FirstOrDefault(s => s.Tag == picinfo.Result[i].ToString()); + PinTitle += "+" + scalemodel.Title; + replistitem.Add(new ReportItem() + { + Title = scalemodel.Title, + Description = scalemodel.Description, + Features = scalemodel.Features, + MainDomain = scalemodel.MainDomain, + Major = scalemodel.Major, + Occupation = scalemodel.Occupation, + Resolving = scalemodel.Resolving, + Tag = scalemodel.Tag, + Traits = scalemodel.Traits, + University = scalemodel.University + }); + } + res = new HollandDimension() + { + picCharts = new PicChart() + { + indicator = picinfo.scalLists.Select(s => new Indicat() { Name = s.name, Max = max }).ToList(), + radars = picinfo.scalLists.Select(s => s.value).ToList() + }, + Title = picinfo.Result + "(" + PinTitle + ")", + reportItems = replistitem, + HTag = picinfo.Result, + Description = string.Join(",", explainholland.Select(s => s.Description).ToList()), + }; + + return res; + } + + + + /// + /// 获取MBTI报告 + /// + /// + /// + [HttpGet("GetMBTIDimension")] + public async Task GetMBTIDimension([FromQuery] BusReportsRequestDto requestDto) + { + var bTIDimension = new MBTIDimension(); + var mbtiinfo = await _studentScaleResultsRep.AsQueryable().AnyAsync(a => a.Id == requestDto.ScaleId); + if (mbtiinfo) + { + var explainmbti = await _customexplainRep.AsQueryable().Where(e => e.ScaleId == 339916661030981).ToListAsync(); + var mbit = await _studentScaleResultsRep.GetFirstAsync(r => r.Id == requestDto.ScaleId); + var mbtiresult = JsonConvert.DeserializeObject(mbit.Result); + var mbtitag = explainmbti.FirstOrDefault(s => s.Tag == mbtiresult.Result.Trim()); + var newlist = new List(); + var oldlist = new List(); + mbtiresult.scalLists.ForEach(a => + { + string tagname = string.Format("({0}){1}", + a.name == "E" ? "外向" : + a.name == "S" ? "感觉" : + a.name == "T" ? "思考" : + a.name == "J" ? "判断" : + a.name == "I" ? "内向" : + a.name == "N" ? "直觉" : + a.name == "F" ? "情感" : + a.name == "P" ? "知觉" : "", a.name); + + switch (a.name) + { + case "E": + case "S": + case "T": + case "J": + // a.value = a.value - 10; + + newlist.Add(new ScalListItem() { name = tagname, value = a.value }); + break; + } + switch (a.name) + { + case "I": + case "N": + case "F": + case "P": + oldlist.Add(new ScalListItem() { name = tagname, value = a.value }); + break; + } + + }); + newlist.AddRange(oldlist); + bTIDimension = new MBTIDimension() + { + Title = mbtiresult.Result + "(" + mbtitag.Title + ")", + reportItem = new ReportItem() + { + Title = mbtitag.Title, + Tag = mbtitag.Tag, + Description = mbtitag.Description, + Features = mbtitag.Features, + MainDomain = mbtitag.MainDomain, + Major = mbtitag.Major, + Occupation = mbtitag.Occupation, + Resolving = mbtitag.Resolving, + Traits = mbtitag.Traits, + University = mbtitag.University + }, + + linChart = new LinChart() + { + Name = newlist.Select(s => s.name).ToList(), + Value = newlist.Select(s => (double)s.value).ToList() + }, + Description = mbtitag.Resolving + mbtitag.Description + mbtitag.Traits.Replace("他们", ""), + }; + + } + return bTIDimension; + } + + + /// + /// 获取能力维度报告 + /// + /// + /// + [HttpGet("GetAbilityDimension")] + public async Task GetAbilityDimension([FromQuery] BusReportsRequestDto requestDto) + { + var abilityDimension = new AbilityDimension(); + + var nengliinfo = await _studentScaleResultsRep.AsQueryable().AnyAsync(a => a.Id == requestDto.ScaleId); + if (nengliinfo) + { + var explainnengli = await _customexplainRep.AsQueryable().Where(e => e.ScaleId == 339916993155141).ToListAsync(); + var nengli = await _studentScaleResultsRep.GetFirstAsync(r => r.Id == requestDto.ScaleId); + var ngresult = JsonConvert.DeserializeObject(nengli.Result); + var sysdicdata = await _dictdataRep.AsQueryable().Where(e => e.DictTypeId == 342316563505221).ToListAsync(); + + var replist = new List(); + explainnengli.ForEach(o => + { + replist.Add(new ReportItem() + { + Score = ngresult.scalLists.FirstOrDefault(e => e.type == o.Title).value, + Title = o.Title, + Description = o.Description, + Features = o.Features, + MainDomain = o.MainDomain, + Major = o.Major, + Occupation = o.Occupation, + Resolving = o.Resolving, + Traits = o.Traits, + University = o.University, + }); + }); + //Y(语言智能) R(人际智能) D(运动智能) Z(自然智能) K(空间智能) S(数理智能) L(音乐智能) N(内省智能)+分数 + abilityDimension = new AbilityDimension() + { + reportItems = replist, + linChart = new List() + { + new LinChart() + { + Name = ngresult.scalLists.Select(s => s.name).ToList(), + Value = ngresult.scalLists.Select(s => (double)s.value).ToList() + }, + new LinChart() + { + Name=sysdicdata.Select(S=>S.Value).ToList(), + Value=sysdicdata.Select(S=>double.Parse(S.Remark)).ToList() + + } + + } + }; + + abilityDimension.Title = string.Empty; + if (ngresult.scalLists.Any(e => e.value > 50)) + { + abilityDimension.Title += string.Format("你的优势能力:{0}", string.Join(",", ngresult.scalLists.Where(e => e.value > 50).Select(s => s.type).ToList())); + } + if (ngresult.scalLists.Any(e => e.value <= 20)) + { + abilityDimension.Title += string.Format("你的弱势能力:{0}", string.Join(",", ngresult.scalLists.Where(e => e.value <= 20).Select(s => s.type).ToList())); + } + + ngresult.scalLists.ForEach(a => + { + //var status = sysdicdata.Where(e => e.Value == a.name); + //if (status.Any()) + //{ + // var titles = status.FirstOrDefault(s => s.Value == a.name); + // abilityDimension.Title += a.value >= double.Parse(titles.Remark) ? titles.Value.Replace("智能", "") : a.name.Replace("智能", ""); + + //} + string nltag = string.Empty; + if (a.value <= 20) + { + nltag = "低弱"; + } + if (a.value > 20 && a.value < 31) + { + nltag = "中下"; + } + if (a.value >= 31 && a.value <= 50) + { + nltag = "中上"; + } + if (a.value > 50) + { + nltag = "优秀"; + } + + if (a.value <= 30) + { + + switch (a.type) + { + case "言语语言智能": + abilityDimension.Description += string.Format("您的{0}属于{1},建议多{2}", a.type, nltag, "阅读文学作品,学讲故事,学习外语 "); + break; + case "逻辑数理智能": + abilityDimension.Description += string.Format("您的{0}属于{1},建议多{2}", a.type, nltag, "学习心算,多玩一些推理游戏 "); + break; + case "视觉空间智能": + abilityDimension.Description += string.Format("您的{0}属于{1},建议多{2}", a.type, nltag, "学习绘画,经常装配物件(如玩具、积木等) "); + break; + case "身体动觉智能": + abilityDimension.Description += string.Format("您的{0}属于{1},建议{2}", a.type, nltag, "经常运动,尝试表演或舞蹈 "); + break; + case "音乐节奏智能": + abilityDimension.Description += string.Format("您的{0}属于{1},建议多{2}", a.type, nltag, "学习乐器,经常听音乐,尝试唱歌 "); + break; + case "人际交往智能": + abilityDimension.Description += string.Format("您的{0}属于{1},建议多{2}", a.type, nltag, "经常参加聚会,掌握倾听技巧,增强同理心 "); + break; + case "自知自省智能": + abilityDimension.Description += string.Format("您的{0}属于{1},建议多{2}", a.type, nltag, "尝试写日记(以心得体会为主),制定自我发展计划,偶尔做一些白日梦 "); + break; + case "自然观察智能": + abilityDimension.Description += string.Format("您的{0}属于{1},建议多{2}", a.type, nltag, "尝试郊游或参观博物馆,尝试种植花草或抚养宠物 "); + break; + } + } + + }); + } + return abilityDimension; + } + + + + + /// + /// 获取职业锚维度报告 + /// + /// + /// + [HttpGet("GetOpinionAbout")] + public async Task GetOpinionAbout([FromQuery] BusReportsRequestDto requestDto) + { + var opinionAbout = new OpinionAboutValue(); + var zhiyemao = await _studentScaleResultsRep.AsQueryable().AnyAsync(a => a.Id == requestDto.ScaleId); + if (zhiyemao) + { + + var zhiyemaoinfo = await _customexplainRep.AsQueryable().Where(e => e.ScaleId == 339917685502021).ToListAsync(); + var zhiye = await _studentScaleResultsRep.GetFirstAsync(r => r.Id == requestDto.ScaleId); + var zyresult = JsonConvert.DeserializeObject(zhiye.Result); + // var mbtitag = zhiyemaoinfo.FirstOrDefault(s => s.Tag == zyresult.Result.Trim()); + var replist = new List(); + var openinfo = new List(); + zhiyemaoinfo.ForEach(a => + { + replist.Add(new ReportItem() + { + Tag = "(" + a.Tag + ")" + zhiyemaoinfo.FirstOrDefault(s => s.Tag == a.Tag).Title, + Description = a.Resolving, + Features = a.Features, + MainDomain = a.MainDomain, + Major = a.Major, + Title = a.Title, + Traits = a.Traits + }); + }); + zyresult.scalLists.ForEach(a => + { + + a.name = zhiyemaoinfo.FirstOrDefault(s => s.Tag == a.name).Title + "(" + a.name + ")"; + }); + int max = zyresult.scalLists.Max(s => s.value) + 1; + opinionAbout = new OpinionAboutValue() + { + reportItems = replist, + opinionItems = zyresult.scalLists.Select(s => new OpinionItem() { Max = max, Name = s.name, Value = s.value }).ToList(), + picCharts = new PicChart() + { + indicator = zyresult.scalLists.Select(s => new Indicat() { Max = max, Name = s.name }).ToList(), + radars = zyresult.scalLists.Select(s => s.value).ToList() + } + }; + opinionAbout.Tag = zyresult.Tag; + opinionAbout.Description += "价值观描述:"; + var deslist = zyresult.scalLists.OrderByDescending(s => s.value).Take(2).ToList(); + deslist.ForEach(a => + { + opinionAbout.Description += zhiyemaoinfo.FirstOrDefault(s => a.name.Contains(s.Tag)).Description.Replace("他们", ""); + + }); + + } + return opinionAbout; + } + + + /// + /// 获取学习风格结果 + /// + /// + /// + [HttpGet("GetStudyStyle")] + public async Task GetStudyStyle([FromQuery] BusReportsRequestDto requestDto) + { + var styleinfo = new StudyStyleResponseDTO(); + var styleresult = await _studentScaleResultsRep.AsQueryable().AnyAsync(a => a.Id == requestDto.ScaleId); + if (styleresult) + { + var stylecustomer = await _customexplainRep.AsQueryable().Where(e => e.ScaleId == 339926424055877).ToListAsync(); + var stylequery = await _studentScaleResultsRep.GetFirstAsync(r => r.Id == requestDto.ScaleId); + var stylerecover = JsonConvert.DeserializeObject(stylequery.Result); + var replist = new List(); + stylecustomer.ForEach(a => + { + replist.Add(new ReportItem() + { + Tag = "(" + a.Tag + ")" + stylecustomer.FirstOrDefault(s => s.Tag == a.Tag).Title, + Description = a.Description, + Features = a.Features, + MainDomain = a.MainDomain, + Major = a.Major, + Title = a.Title, + Traits = a.Traits + }); + }); + styleinfo.UserName = _userManager.RealName; + styleinfo.Description = @"你追求事物的内在含义并习惯亲身体验;你善于通过听和与人分享思想来学习;你喜欢与人沟通;你善于从多个角度观察问题并形成自己独特的观点"; + + styleinfo.TestTime = stylequery.CreateTime.Value; + styleinfo.reportItems = replist; + int max = stylerecover.scalLists.Max(s => s.value) + 1; + styleinfo.picCharts = new PicChart() + { + indicator = stylerecover.scalLists.Select(s => new Indicat() { Max = max, Name = s.name }).ToList(), + radars = stylerecover.scalLists.Select(s => s.value).ToList() + }; + var scalinfo = new List(); + var styletypes = new List(); + stylerecover.scalLists.ForEach(a => + { + string type = string.Empty; + switch (a.name) + { + + case "A": + type = "冲动型"; + break; + case "P": + type = "务实型"; + styletypes.Add(new StudyStyleTables() { Type = "风格1", Score = a.value + stylerecover.scalLists.FirstOrDefault(s => s.name == "R").value }); + styletypes.Add(new StudyStyleTables() { Type = "风格2", Score = a.value + stylerecover.scalLists.FirstOrDefault(s => s.name == "A").value }); + break; + case "R": + type = "反思型"; + break; + case "T": + type = "理论型"; + styletypes.Add(new StudyStyleTables() { Type = "风格3", Score = a.value + stylerecover.scalLists.FirstOrDefault(s => s.name == "R").value }); + styletypes.Add(new StudyStyleTables() { Type = "风格4", Score = a.value + stylerecover.scalLists.FirstOrDefault(s => s.name == "A").value }); + break; + + } + scalinfo.Add(new StudyStyleTables() + { + Type = type, + Score = a.value, + Description = a.value <= 15 ? "低偏好" : a.value >= 16 && a.value <= 35 ? "中等偏好" : a.value >= 36 && a.value <= 44 ? "强烈偏好" : "非常强烈偏好" + }); + }); + styleinfo.studyStyles = scalinfo; + var maxstyles = styletypes.OrderByDescending(s => s.Score).FirstOrDefault(); + var styleresults = new StudyStyleResult(); + switch (maxstyles.Type) + { + case "风格1": + styleresults.Advantage = "富于创造力和想像力"; + styleresults.Seek = "重大项目中的自我成长和团队精神"; + styleresults.SuitableOccupation = "为什么?为什么不?"; + styleresults.FavoriteQuestions = "咨询、人事关系"; + break; + case "风格2": + styleresults.Advantage = "创造概念和模式"; + styleresults.Seek = "自我满足和智力认同."; + styleresults.SuitableOccupation = "什么?"; + styleresults.FavoriteQuestions = "基础科学研究, 规划研究部"; + + break; + case "风格3": + styleresults.Advantage = "喜好实践"; + styleresults.Seek = "现实和将来的一致性"; + styleresults.SuitableOccupation = "怎么做?"; + styleresults.FavoriteQuestions = "工程师,外科医生,护士,技工"; + + break; + case "风格4": + styleresults.Advantage = "执行能力强"; + styleresults.Seek = "把事情做成"; + styleresults.SuitableOccupation = "能变成什么样?"; + styleresults.FavoriteQuestions = "市场,销售"; + break; + } + styleinfo.studyStyleResult = styleresults; + } + return styleinfo; + } + + + /// + /// 获取部分报告 + /// + /// + /// + [HttpGet("GetBusComprehensive")] + public async Task GetBusComprehensive([FromQuery] BusComprehensiveReportRequestDTO requestDTO) + { + var res = new BusComprehensiveReportDTO(); + var query = await _custommapreportRep.GetFirstAsync(r => r.Id == requestDTO.ReportId); + var replistitem = new List(); + string PinTitle = string.Empty; + #region 霍兰德++++++++++++++ + var holland = await _studentScaleResultsRep.GetFirstAsync(r => r.Id == query.HId); + var picinfo = JsonConvert.DeserializeObject(holland.Result); + var explainholland = await _customexplainRep.AsQueryable().Where(e => e.ScaleId == 339914746081349).ToListAsync(); + + for (var i = 0; i <= picinfo.Result.Length; i++) + { + var scalemodel = explainholland.FirstOrDefault(s => s.Tag == picinfo.Result[i].ToString()); + PinTitle += "+" + scalemodel.Title; + replistitem.Add(new ReportItem() + { + Title = scalemodel.Title, + Description = scalemodel.Description, + Features = scalemodel.Features, + MainDomain = scalemodel.MainDomain, + Major = scalemodel.Major, + Occupation = scalemodel.Occupation, + Resolving = scalemodel.Resolving, + Tag = scalemodel.Tag, + Traits = scalemodel.Traits, + University = scalemodel.University + }); + } + res.hollandDimension = new HollandDimension() + { + picCharts = new PicChart() + { + indicator = picinfo.scalLists.Select(s => new Indicat() { Name = s.name, Max = 45 }).ToList(), + radars = picinfo.scalLists.Select(s => s.value).ToList() + }, + Title = holland.Result + "(" + PinTitle + ")", + reportItems = replistitem + }; + + #endregion 霍兰德+++++++++++++++++ + + + #region MBTI++++++++++++++++++++ + var mbtiinfo = await _studentScaleResultsRep.AsQueryable().AnyAsync(a => a.Id == query.MId); + if (mbtiinfo) + { + var explainmbti = await _customexplainRep.AsQueryable().Where(e => e.ScaleId == 339916661030981).ToListAsync(); + var mbit = await _studentScaleResultsRep.GetFirstAsync(r => r.Id == query.MId); + var mbtiresult = JsonConvert.DeserializeObject(mbit.Result); + var mbtitag = explainmbti.FirstOrDefault(s => s.Tag == mbtiresult.Result.Trim()); + res.bTIDimension = new MBTIDimension() + { + Title = mbtiresult.Result + "(" + mbtitag.Title + ")", + reportItem = new ReportItem() + { + Title = mbtitag.Title, + Tag = mbtitag.Tag, + Description = mbtitag.Description, + Features = mbtitag.Features, + MainDomain = mbtitag.MainDomain, + Major = mbtitag.Major, + Occupation = mbtitag.Occupation, + Resolving = mbtitag.Resolving, + Traits = mbtitag.Traits, + University = mbtitag.University + }, + linChart = new LinChart() + { + Name = mbtiresult.scalLists.Select(s => s.name).ToList(), + Value = mbtiresult.scalLists.Select(s => (double)s.value).ToList() + } + }; + } + + #endregion MBTI++++++++++++++++++++++ + + + + #region 能力维度++++++++++++++++++++++++ + //var nengliinfo = await _studentScaleResultsRep.AsQueryable().AnyAsync(a => a.Id == query.NId); + //if (nengliinfo) + //{ + // var explainnengli = await _customexplainRep.AsQueryable().Where(e => e.ScaleId == 339916993155141).ToListAsync(); + // var nengli = await _studentScaleResultsRep.FindAsync(query.NId); + // var ngresult = JsonConvert.DeserializeObject(nengli.Result); + // var mbtitag = explainnengli.FirstOrDefault(s => s.Tag == ngresult.Result.Trim()); + // var replist = new List(); + // explainnengli.ForEach(o => + // { + // replist.Add(new ReportItem() + // { + // Title = o.Title, + // Description = o.Description, + // Features = o.Features, + // MainDomain = o.MainDomain, + // Major = o.Major, + // Occupation = o.Occupation, + // Resolving = o.Resolving, + // Traits = o.Traits, + // University = o.University, + // }); + // }); + + // res.abilityDimension = new AbilityDimension() + // { + // reportItems = replist, + // linChart = new LinChart() + // { + // Name = ngresult.scalLists.Select(s => s.name).ToList(), + // Value = ngresult.scalLists.Select(s => (double)s.value).ToList() + // } + + + + // }; + + + + + //} + + #endregion ++++++++++++++++++++++++++++ + + #region 职业锚+++++++++++++++++++++++++ + + var zhiyemao = await _studentScaleResultsRep.AsQueryable().AnyAsync(a => a.Id == query.JId); + if (zhiyemao) + { + var zhiyemaoinfo = await _customexplainRep.AsQueryable().Where(e => e.ScaleId == 339917685502021).ToListAsync(); + var zhiye = await _studentScaleResultsRep.GetFirstAsync(r => r.Id == query.NId); + var zyresult = JsonConvert.DeserializeObject(zhiye.Result); + var mbtitag = zhiyemaoinfo.FirstOrDefault(s => s.Tag == zyresult.Result.Trim()); + res.opinionAbout = new OpinionAboutValue() + { + + + + }; + + + } + + #endregion ++++++++++++++++++++++++++++ + + + + + + + + + return res; + } + + + + /// + ///获取报告关键词 + ///type=0 兴趣测评报告 + ///=1 性格测评报告 + ///=2 能力测评 + ///=3 学生考试考虑 + ///=4 学习风格 + ///=5 学习技能 + ///=6 SAS + ///=7 SDS + ///=8 SCL-90 + ///=9 MHT + ///=-1 价值观 + ///=-2 留学咨询 + /// + /// + /// + [HttpGet("GetBusAIReportKeyWord")] + public async Task GetBusAIReportKeyWord([FromQuery] ReportAIPrompt prompt) + { + StringBuilder description = new StringBuilder(); + description.Append("我的"); + var result = await _studentScaleResultsRep.GetFirstAsync(r => r.Id == prompt.Id); + if (result == null) + throw Oops.Oh("未找到该报告"); + + switch (prompt.Type) + { + case 0: + var jons = JsonConvert.DeserializeObject(result.Result); + string hladstr = string.Empty; + jons.scalLists.ForEach(c => + { + hladstr += $"标签:{c.name}得分为:{c.value}"; + }); + description.Append($"霍兰德测评标签是{jons.Result},{hladstr}"); + break; + case 1: + + var mbtiresult = JsonConvert.DeserializeObject(result.Result); + string jsstr = string.Empty; + mbtiresult.scalLists.ForEach(c => + { + jsstr += $"标签:{c.name}得分为:{c.value}"; + }); + description.Append($"MBTI测评标签是{mbtiresult.Result};{jsstr}"); + break; + case 2: + var dyzn = JsonConvert.DeserializeObject(result.Result); + string dyznstr = string.Empty; + dyzn.scalLists.ForEach(c => + { + dyznstr = $"标签({c.type}):{c.name}得分为:{c.value}"; + }); + description.Append($"多元智能测评结果是{dyznstr}"); + break; + case 3: + var ksjl = JsonConvert.DeserializeObject>(result.Result); + description.Append($"学生考试焦虑测评分数是:{ksjl.First().Total}"); + break; + case 4: + description.Append($"学习风格测评结果是{result.Result.ToJson()}"); + break; + case 5: + var xxjn = JsonConvert.DeserializeObject>(result.Result).FirstOrDefault(); + description.Append($"学习技能测评得分是{xxjn.Total}"); + break; + case 6: + var sas = JsonConvert.DeserializeObject>(result.Result); + description.Append($"SAS焦虑测评分数是{sas.First().Total}"); + break; + case 7: + var sds = JsonConvert.DeserializeObject>(result.Result); + description.Append($"SDS抑郁测测评分数是{sds.First().Total}"); + break; + case 8: + var scl = JsonConvert.DeserializeObject>(result.Result); + description.Append($"SCL-90测测评分数是{scl.First().Total}"); + break; + } + description.Append(",可以帮我分析一下给出的结果,给我一些好的建议吗?"); + return description.ToString(); + } + + + + /// + /// 获取学生量表结果值匹配解释 + /// + /// + [HttpGet("GetCustomScaleExplains")] + public async Task GetCustomScaleExplains([FromQuery] BusCustomScaleExplainRequestDTO busCustom) + { + var result = new BusCustomScaleExplainDTO(); + var single = await _studentScaleResultsRep.GetFirstAsync(r => r.Id == busCustom.CustomScaleId); + result.Title = single.Title; + result.TestTime = single.CreateTime.Value; + result.CustomName = _userManager.RealName; + switch (single.ScaleId) + { + case 339914746081349:// 兴趣测评[Holland] + + break; + case 339916661030981://性格测评[MBTI] + + break; + case 339916993155141://能力测评[MIDAS] + + break; + + case 339917685502021://职业锚价值观[Career Anchors] + + break; + case 339926224392261://学习拖延 + + + break; + case 339926358470725://厌学情绪评估 + + break; + + case 339926424055877://学习风格 + string tagdesc = "{\"tags\":[{\"name\":\"冲动型或灵感型\",\"code\":\"A\",\"features\":[\"反应快但精确性差\",\"急于求成,缺乏全面分析\",\"乐于交往但易自我中心\",\"宏观思考有优势\",\"阅读困难,易伴学习能力缺失\"],\"learning_performance\":[\"挑战新经验但易厌倦实施过程\",\"群体交往中试图成为中心\",\"复杂问题解决易片面化\"],\"notes\":\"低偏好者需尝试新鲜事物,培养整体视角\"},{\"name\":\"务实型或实用型\",\"code\":\"P\",\"features\":[\"渴望验证新想法的可行性\",\"脚踏实地,实用主义导向\",\"对做事技巧感兴趣\",\"对重复讨论易急躁\"],\"learning_performance\":[\"热衷实践验证\",\"偏好榜样示范学习\",\"重视外部有效性\"],\"notes\":\"低偏好者需加强范例学习,增加实践参与\"},{\"name\":\"沉思型或反思型\",\"code\":\"R\",\"features\":[\"反应慢但精确性高\",\"注重质量胜过速度\",\"细节加工策略\",\"复杂问题表现突出\"],\"learning_performance\":[\"阅读/记忆/推理能力强\",\"偏好观察后发言\",\"行为低调从容\"],\"notes\":\"低偏好者需培养反思习惯,强化经验总结\"},{\"name\":\"理论型\",\"code\":\"T\",\"features\":[\"系统化理论构建能力\",\"逻辑性强,追求完美\",\"冷静客观的分析倾向\"],\"learning_performance\":[\"关注原理与规律\",\"拒绝主观判断\",\"追求确定性\"],\"notes\":\"低偏好者需加强基础理论积累,关注行业新规\"}]}"; + string style01 = "{\"tags\":[{\"title\":\"个人特质\",\"items\":[{\"title\":\"内在追求\",\"desc\":\"追求事物的内在含义并习惯亲身体验\"},{\"title\":\"学习方式\",\"desc\":\"善于通过听和与人分享思想来学习\"},{\"title\":\"沟通倾向\",\"desc\":\"喜欢与人沟通\"},{\"title\":\"思维特征\",\"desc\":\"善于从多个角度观察问题并形成独特观点\"}]},{\"title\":\"核心优势\",\"items\":[{\"title\":\"创造力\",\"desc\":\"富于创造力和想象力\"},{\"title\":\"职业追求\",\"desc\":\"在重大项目中追求自我成长和团队精神\"}]},{\"title\":\"典型提问\",\"items\":[{\"title\":\"探索本质\",\"desc\":\"最爱问:为什么?为什么不?\"}]},{\"title\":\"职业适配\",\"items\":[{\"title\":\"适合领域\",\"desc\":\"咨询、人事关系\"}]},{\"title\":\"策略偏好\",\"items\":[{\"title\":\"计划性\",\"desc\":\"预先计划和组织\"},{\"title\":\"反思性\",\"desc\":\"适时反思\"},{\"title\":\"自我管理\",\"desc\":\"自我管理\"},{\"title\":\"自我认知\",\"desc\":\"尊重自我评价\"},{\"title\":\"团队协作\",\"desc\":\"团队精神\"},{\"title\":\"集体智慧\",\"desc\":\"集体讨论\"},{\"title\":\"逻辑推理\",\"desc\":\"演绎推理\"}]}]}"; + string style02 = "{\"tags\":[{\"title\":\"认知特质\",\"items\":[{\"title\":\"实证导向\",\"desc\":\"注重客观依据(实证)\"},{\"title\":\"思维学习方式\",\"desc\":\"善于通过分析和思考来学习\"},{\"title\":\"抽象学习偏好\",\"desc\":\"喜欢抽象概念并勤于学习\"},{\"title\":\"专家依赖倾向\",\"desc\":\"更愿意听从专家的意见而行事\"}]},{\"title\":\"核心能力\",\"items\":[{\"title\":\"模式构建\",\"desc\":\"创造概念和模式\"}]},{\"title\":\"价值追求\",\"items\":[{\"title\":\"内在驱动\",\"desc\":\"追求自我满足和智力认同\"}]},{\"title\":\"认知倾向\",\"items\":[{\"title\":\"本质探究\",\"desc\":\"最爱问:什么?\"}]},{\"title\":\"职业适配\",\"items\":[{\"title\":\"研究领域\",\"desc\":\"基础科学研究, 规划研究部\"}]},{\"title\":\"策略偏好\",\"items\":[{\"title\":\"计划性\",\"desc\":\"预先计划和组织\"},{\"title\":\"指导性\",\"desc\":\"指导他人工作\"},{\"title\":\"记录系统\",\"desc\":\"完备的记录(笔记、文档)\"},{\"title\":\"自我验证\",\"desc\":\"自我检查(测试)\"},{\"title\":\"专家咨询\",\"desc\":\"征询专家意见\"},{\"title\":\"建构性研究\",\"desc\":\"建构性研究\"}]}]}"; + string style03 = "{\"tags\":[{\"title\":\"行动导向\",\"items\":[{\"title\":\"明确性需求\",\"desc\":\"非常希望知道自己具体应该做什么和怎么做\"},{\"title\":\"实践学习法\",\"desc\":\"在实践中检验理论从而完成自我学习\"},{\"title\":\"实例抽象化\",\"desc\":\"习惯通过实例来构造抽象概念\"},{\"title\":\"实践偏好\",\"desc\":\"喜欢动手实践和解决实际问题\"}]},{\"title\":\"核心能力\",\"items\":[{\"title\":\"实践专长\",\"desc\":\"喜好实践\"}]},{\"title\":\"价值追求\",\"items\":[{\"title\":\"现实一致性\",\"desc\":\"追求现实和将来的一致性\"}]},{\"title\":\"认知倾向\",\"items\":[{\"title\":\"行动探究\",\"desc\":\"最爱问:怎么做?\"}]},{\"title\":\"职业适配\",\"items\":[{\"title\":\"实践型职业\",\"desc\":\"工程师, 外科医生, 护士,技工\"}]},{\"title\":\"策略偏好\",\"items\":[{\"title\":\"实践优先\",\"desc\":\"实践工作\"},{\"title\":\"执行导向\",\"desc\":\"项目执行\"},{\"title\":\"自我评估\",\"desc\":\"自我评价\"},{\"title\":\"实验验证\",\"desc\":\"实验\"},{\"title\":\"逻辑推理\",\"desc\":\"演绎推理\"}]}]}"; + string style04 = "{\"tags\":[{\"title\":\"探索特质\",\"items\":[{\"title\":\"功能探索欲\",\"desc\":\"希望知道当前物件的功能\"},{\"title\":\"试错学习法\",\"desc\":\"通常通过尝试、错误、再尝试的自我发现中学习\"},{\"title\":\"应变适应力\",\"desc\":\"喜欢变化,应变能力强,喜欢冒险\"},{\"title\":\"社交倾向\",\"desc\":\"容易与人相处,有时热心过头\"},{\"title\":\"直觉判断力\",\"desc\":\"往往不通过推理凭直觉就能做出正确的判断\"}]},{\"title\":\"核心能力\",\"items\":[{\"title\":\"执行专长\",\"desc\":\"执行能力强\"}]},{\"title\":\"价值追求\",\"items\":[{\"title\":\"结果导向\",\"desc\":\"追求把事情做成\"}]},{\"title\":\"认知倾向\",\"items\":[{\"title\":\"可能性探究\",\"desc\":\"最爱问:能变成什么样?\"}]},{\"title\":\"职业适配\",\"items\":[{\"title\":\"动态型职业\",\"desc\":\"市场, 销售\"}]},{\"title\":\"策略偏好\",\"items\":[{\"title\":\"执行导向\",\"desc\":\"具体项目执行\"},{\"title\":\"短期规划\",\"desc\":\"建立短期目标\"},{\"title\":\"人际互动\",\"desc\":\"与教师和同学互动\"},{\"title\":\"体能活动\",\"desc\":\"体力活动\"},{\"title\":\"环境变换\",\"desc\":\"学习环境和内容的变换\"},{\"title\":\"自主工作\",\"desc\":\"独立工作\"}]}]}"; + var xxfg = JsonConvert.DeserializeObject(single.Result); + result.Result = xxfg.scalLists.Select(s => new xxfgItem() + { + name = s.name, + type = s.type, + value = s.value, + desc = s.value <= 10 ? "低偏好" : s.value >= 11 && s.value <= 25 ? "中等偏好" : s.value >= 26 && s.value <= 40 ? "强烈偏好" : "非常强烈偏好" + }).ToJson(); + var stylevalue = FindMaxCombination(xxfg.scalLists); + var tagparse = JsonConvert.DeserializeObject(tagdesc); + switch (stylevalue) + { + case 1: + result.TagName = "务实型(P)+反思型(R)"; + result.Suggestions = style01; + result.Description = tagparse.tags.Where(e => e.code == "P" || e.code == "R").ToJson(); + break; + case 2: + result.TagName = "反思型(R)+理论型(T)"; + result.Suggestions = style02; + result.Description = tagparse.tags.Where(e => e.code == "T" || e.code == "R").ToJson(); + break; + case 3: + result.TagName = "理论型(T)+冲动型(A)"; + result.Suggestions = style03; + result.Description = tagparse.tags.Where(e => e.code == "T" || e.code == "A").ToJson(); + break; + case 4: + result.TagName = "冲动型(A)+务实型(P)"; + result.Suggestions = style04; + result.Description = tagparse.tags.Where(e => e.code == "P" || e.code == "A").ToJson(); + break; + } + + break; + case 339926523736133://学生考试焦虑 + var ksjl = JsonConvert.DeserializeObject>(single.Result).FirstOrDefault(); + result.Total = ksjl.Total.ToString(); + + if (ksjl.Total < 12) + { + result.TagName = "低考试焦虑水平"; + result.Description = "你的考试焦虑水平较低,展现出对考试的良好适应能力。你能以平稳的心态面对考试,不易受紧张情绪干扰,这种状态有助于你在考试中正常甚至超常发挥。建议继续保持对学习的专注和对考试的合理认知,避免因过度放松而忽视备考细节。"; + + result.Suggestions = "[{\"title\":\"考试减压技巧\",\"items\":[{\"title\":\"维持日常节奏\",\"description\":\"考前无需刻意改变作息,按平时的学习习惯复习,避免因 “过度准备” 产生额外压力。\"},{\"title\":\"积极心理暗示\",\"description\":\"偶尔提醒自己 “按步骤做好准备即可,结果顺其自然”,强化 “努力大于结果” 的心态。\"},{\"title\":\"适度身体放松\",\"description\":\"考前 1 天可进行轻度运动(如散步、瑜伽),或听轻音乐,但避免剧烈运动或熬夜。\"}]},{\"title\":\"应试技巧\",\"items\":[{\"title\":\"目标拆解\",\"description\":\"将考试目标细化为 '每道题认真读题' '合理分配答题时间' 等具体行动,而非纠结于 '必须考高分'\"},{\"title\":\"细节检查\",\"description\":\"发卷后先浏览全卷,标记难题题号,按 '先易后难' 顺序答题,避免因个别题目卡壳影响整体节奏。\"},{\"title\":\"考完即止\",\"description\":\"一科结束后不与他人对答案,专注下一科备考,避免因局部失误影响后续心态\"}]}]"; + } + if (ksjl.Total >= 12 && ksjl.Total <= 20) + { + result.TagName = "中等考试焦虑水平"; + result.Description = "你的考试焦虑处于中等水平,这是多数人面对重要考试时的正常反应。适度的焦虑能提升你的备考动力,但需注意避免过度放大考试的重要性,导致紧张情绪干扰发挥。通过针对性的调整策略,你可以将焦虑转化为积极的应试状态。"; + result.Suggestions = "[{\"title\":\"考试减压技巧\",\"items\":[{\"title\":\"认知矫正训练\",\"description\":\"记录考前负面想法:用理性思维反驳(如:一次考试不能定义我的能力,我平时的积累才是基础)。|写下过去 3 次考试中做得好的细节(如'数学应用题步骤清晰'),增强自我效能感。\"},{\"title\":\"生理放松法\",\"items\":[{\"title\":\"4-7-8 呼吸法\",\"description\":\"吸气 4 秒→屏息 7 秒→呼气 8 秒,重复 3-5 次,快速平复紧张情绪。\"},{\"title\":\"身体扫描\",\"description\":\"考前一晚躺在床上,从脚趾到头顶逐部位有意识地放松,改善睡眠质量。\"}]},{\"title\":\"时间管理策略\",\"items\":[{\"title\":\"番茄工作法\",\"description\":\"用 '番茄工作法' 复习(25 分钟专注 + 5 分钟休息),避免长时间高强度学习导致疲劳累积。','考前 3 天制定 '倒计时计划',明确每天复习内容(如 '第一天:梳理物理公式;第二天:限时做英语阅读'),减少不确定性带来的焦虑。\"}]}]}]"; + } + if (ksjl.Total > 20) + { + result.TagName = "较高考试焦虑水平"; + result.Description = "你的考试焦虑水平较高,过度的紧张情绪已可能对学习效率和考试表现产生明显影响。请接纳这种状态的合理性(焦虑是对重要目标的自然反应),但不必被其控制。通过科学的干预方法和持续练习,你完全可以逐步降低焦虑对自己的困扰。"; + result.Suggestions = "[{\"title\":\"深层认知调整\",\"items\":[{\"title\":\"考试≠威胁\",\"description\":\" 重构:用具体证据反驳 '灾难化思维'。例如:若担心 '考不好就考不上大学',可列出 '过去1年中,我通过努力提升了XX科目成绩'等事实,弱化 '一次考试决定命运”的绝对化认知。', '设定 '合理期待':将目标调整为 '比上次进步10分''完成80%的题目并保证正确率',而非不切实际的高标准。\"}]},{\"title\":\"专业放松训练\",\"items\":[{\"title\":\"正念冥想\",\"description\":\"每天花10分钟专注于呼吸或身体感受,当杂念出现时,不评判地将注意力拉回当下(可使用 '潮汐''Headspace'等APP辅助)。\"},{\"title\":\"渐进式肌肉放松\",\"description\":\"从手部开始,逐组肌肉先紧绷5秒再放松10秒,体验紧张 - 放松的差异,降低身体紧绷感。\"}]},{\"title\":\"环境与行为干预\",\"items\":[{\"title\":\"专注于自己的复习节奏\",\"description\":\"考前1周避免接触引发焦虑的外界刺激(如他人的 '考前抱怨''成绩攀比')。', '若 '临时抱佛脚”导致熬夜和疲惫,可尝试' \"},{\"title\":\"分段复习法\",\"description\":\"每天固定3个1小时高效时段(如早8-9点、下午3-4点、晚7-8点),配合充足睡眠(保证7小时以上)。\"}]},{\"title\":\"分阶段备考策略\",\"items\":[{\"title\":\"基础阶段(考前2-4周)\",\"description\":\"以课本和笔记为主,确保掌握80%的基础知识点,放弃偏题怪题,建立 '保底信心'。\"},{\"title\":\"强化阶段(考前1周)\",\"description\":\"用真题进行模拟考试,严格限时,熟悉考试流程(如发卷时间、填答题卡节奏),减少考场陌生感。\"},{\"title\":\"冲刺阶段(考前3天)\",\"description\":\"复习 '错题本'和 '知识点卡片',不学习新内容,避免增加认知负荷。\"}]},{\"title\":\"考场应急方案\",\"items\":[{\"title\":\"步骤分策略\",\"description\":\"若发卷后心跳加速、大脑空白,可先在草稿纸写 '我现在有点紧张,这很正常,做3次深呼吸就会好',通过书写疏导情绪。', '遇到完全不会的题目,采用 '步骤分策略':写下相关公式或已知条件,避免空白卷,同时暗示自己 '这题占分不多,其他题目做好更重要'。\"}]},{\"title\":\"长期心态建设\",\"items\":[{\"title\":\"平时增加暴露练习\",\"description\":\"主动参加小型测试或在课堂上发言,逐步适应 '被评价'的场景,降低对考试的敏感度。', '若自我调节困难,及时寻求帮助:向信任的老师、家长或心理咨询师倾诉,必要时接受专业心理干预(如系统脱敏法)。\"}]}]"; + + } + result.Result = single.Result; + break; + case 339926607917125://学习技能 + var xxjn = JsonConvert.DeserializeObject>(single.Result).FirstOrDefault(); + if (xxjn.Total < 137) + { + if (xxjn.Total < 80) + { + result.TagName = "学习技能水平很差"; + } + if (xxjn.Total >= 80 && xxjn.Total <= 104) + { + result.TagName = "学习技能水平较差"; + } + if (xxjn.Total >= 105 && xxjn.Total <= 136) + { + result.TagName = "学习技能水平一般"; + } + result.Description = "你的学习技能水平较差,可能在学习方法、时间管理、情绪调节等方面存在一定的不足。建议你可以通过一些学习技巧和方法来提升自己的学习能力,比如制定合理的学习计划、掌握有效的记忆方法、培养良好的学习习惯等。"; + result.Suggestions = "{\"succestions\":[{\"title\":\"改进学习方法建议\",\"items\":[{\"title\":\"预习\",\"description\":\"用快速略读法事先预习极多次, 但不要求完全懂\"},{\"title\":\"上课\",\"description\":\"(a) 用专心放轻松的方法听讲, 保持灵敏的心去听, 不主动要求自己全部听懂。(b) 除非特殊状况, 一定要作笔记, 笔记愈整洁明晰愈好(不要为了省钱将笔记记得密密麻麻的), 以利日后快、 慢速的复习。(c) 在老师停顿或转身抄黑板的时候, 迅速回想(最好口中默念出来) 老师刚刚讲的重点, 此种回想又可以叫潜意识迅速转极多次以消化之\"},{\"title\":\"家中复习\",\"description\":\"复习功课的第一步骤, 也是先快速略读多次, 有空的时候作一次详读之后(此时要在课本、 笔记上划出重点), 再多花一点时间回想上课的重点。 若因为晚上补习没有足够时间, 虽可以省掉详读, 但略读和回想一定要作。 记住不论如何忙, 最多三、 五天一定要将老师教过的部份, 作过一次详读(没有时间的话, 至少要作快速详读)\"},{\"title\":\"做作业\",\"description\":\"做作业之前( 必要时可以找一本比较完整的参考书来做, 其作业题通常比课本多很多), 要确定有没有先回想重点\"},{\"title\":\"复习以前的功课\",\"description\":\"每隔三五天最好翻开笔记本, 迅速的略读前一两个星期的功课。 有空的话, 将笔记本上划重点的部份出声念一遍\"},{\"title\":\"考前复习\",\"description\":\"和家中复习那一项差不多, 但要找出时间, 针对笔记上的重点发出声音教给一个假想的人或同学。 同时也要找一些例题和具有代表性的习题, 教一教这个假想人\"},{\"title\":\"考前猜题\",\"description\":\"想象自己是老师, 出一些与重点有关的题目。 不一定要真的去作出来(因为是自己出的题目, 若题目合理则本来就会做), 但可以将这一些题目和课本互相印证, 找出某几课中的真正重点和如何应用这些重点\"},{\"title\":\"考前保持最佳状态\",\"description\":\"(a) 考前做一些有代表性的例题和习题, 从这一些题目中回想重点, 回想时若发现忘了重点, 翻开笔记看一看那一部份重点就可。(b) 将笔记上的重点(或整理出的重点) 重复多次地看, 虽然不耐烦了还要再看, 过度50 %\"}]}]}"; + } + if (xxjn.Total >= 137 && xxjn.Total <= 160) + { + result.TagName = "学习技能较好"; + result.Description = "您在学习技能方面表现出色,展现出较强的自主学习能力、良好的学习习惯和高效的学习策略。能够主动规划学习任务,善于运用多种方法理解和巩固知识,在课堂内外表现出积极的参与度和问题解决能力,对学习过程有清晰的认知和调控能力。"; + result.Suggestions = "{\"succestions\":[{\"title\":\"优势分析\",\"items\":[{\"title\":\"主动学习意识强\",\"description\":\"善于标记重点、归纳知识、主动提问,对学习内容有深入探究的意愿,例如在阅读和听讲时能提出个人观点,重视预习和复习,积极通过参考书、请教他人等方式解决问题\"},{\"title\":\"学习策略科学\",\"description\":\"能根据任务调整学习方法,合理规划时间(如考前计划复习),注重通过练习、总结图表等方式强化记忆和理解,善于在实践中应用知识(如实验操作有条理、联系生活实际)\"},{\"title\":\"自我管理能力突出\",\"description\":\"面对学习压力或疲劳时,能有效维持注意力、克服紧张情绪,及时调整状态,保持较高的学习效率\"},{\"title\":\"合作与反思能力良好\",\"description\":\"在交流中善于吸收他人经验,受挫时能分析原因、持续改进,形成良性学习循环\"}]},{\"title\":\"提升建议\",\"items\":[{\"title\":\"深化学习深度\",\"description\":[\"对已掌握的知识尝试跨学科整合,例如在学习专业内容时主动联系其他学科的原理或方法,培养综合思维\",\"针对公式、定理等,不仅满足于熟练运用,尝试探究其推导过程和底层逻辑,提升知识迁移能力\"]},{\"title\":\"优化时间管理\",\"description\":[\"制定更细致的长期学习计划,例如按月或学期规划拓展阅读、实践项目等,避免局限于课堂和作业\",\"针对“提前做好准备”的习惯,可尝试制定应急预案(如突发任务时的时间分配策略),增强计划灵活性\"]},{\"title\":\"强化输出与实践\",\"description\":[\"定期通过写作、讲解(如向他人分享学习心得)等方式输出知识,检验理解的完整性,例如将归纳的要点转化为思维导图或小论文\",\"积极参与课外实践(如小调查、实验设计),将理论知识与实际问题结合,提升解决复杂问题的能力\"]}]}]}"; + } + if (xxjn.Total >= 161) + { + result.TagName = "学习技能优秀"; + result.Suggestions = "{\"succestions\":[{\"title\":\"进阶建议\",\"items\":[{\"title\":\"发挥引领作用\",\"description\":[\"主动分享学习经验,例如组织学习小组、撰写学习技巧总结,在帮助他人的过程中深化自身理解\",\"针对“喜欢进一步思考或探究”的优势,可尝试参与科研小项目或学术讨论,培养创新思维\"]},{\"title\":\"培养全局视野\",\"description\":[\"从“掌握知识”向“构建知识体系”升级,梳理学科内的逻辑框架和不同学科间的联系,形成系统化认知\",\"关注学习目标与长期发展的关联,例如明确专业相关知识的实际应用场景,增强学习的目的性和内驱力\"]},{\"title\":\"突破舒适区\",\"description\":[\"挑战跨专业或难度较高的学习任务(如阅读非专业领域的经典著作),拓宽知识面和思维边界\",\"在解决难题时,尝试先独立探索多种解法,再对比他人思路,避免依赖现有方法,培养批判性思维\"]},{\"title\":\"保持反思与迭代\",\"description\":[\"建立学习日志,定期记录学习策略的效果和改进方向,例如每周总结一次“高效/低效学习时段”及原因\",\"关注认知科学或学习心理学知识,科学优化学习习惯,例如利用记忆曲线调整复习频率,提升学习效能\"]}]}]}"; + } + + result.Total = xxjn.Total.ToString(); + result.Result = single.Result; + + break; + case 340506604851269://SAS焦虑测评 + + var sas = JsonConvert.DeserializeObject>(single.Result).FirstOrDefault(); + if (sas.Total < 50) + { + result.TagName = "无焦虑情况"; + result.Description = "如果你的 SAS 焦虑量表得分显示无焦虑,那真的很棒!这意味着在目前阶段,你能够很好地应对学习和生活中的各种挑战,心态平稳且积极。日常的小烦恼不太会影响到你,能保持良好的情绪状态去享受校园时光,和同学愉快相处,专注投入到学习里。继续保持这样乐观向上的生活态度哦,未来也一定能轻松应对各种状况。"; + } + if (sas.Total >= 50 && sas.Total <= 59) + { + result.TagName = "可能轻度焦虑"; + result.Description = "当量表结果是轻度焦虑时,先别太紧张,这在高中生里其实挺常见的。它可能表示最近的学习任务、考试压力,或者和同学、老师的关系等,给你带来了一些小小的困扰,让你偶尔会感到有些不安。不过这种焦虑程度并不会对你的日常生活和学习造成严重阻碍。你可以尝试在课余时间多参加一些自己喜欢的活动,比如听音乐、运动一下,找朋友倾诉倾诉,把这些小烦恼释放出去,很快就能恢复活力满满的状态啦。"; + } + if (sas.Total > 59 && sas.Total <= 69) + { + result.TagName = "可能中度焦虑"; + result.Description = "若是处于中度焦虑水平,说明你可能在一段时间内承受了较多的压力,这些压力已经开始比较明显地影响到你的情绪和状态了。或许你在学习时难以集中注意力,睡眠质量也有所下降,心情常常感到烦躁。别担心,这是身体在提醒你需要重视当下的状况,调整一下节奏了。建议你可以和老师、家长沟通沟通,让他们了解你的感受,同时制定一个合理的学习和休息计划,给自己留出足够的放松时间,也可以考虑找学校的心理老师聊聊,他们能给你更专业的建议,帮助你缓解焦虑。"; + } + if (sas.Total >= 70) + { + result.TagName = "可能重度焦虑"; + result.Title = "要是量表结果显示重度焦虑,这真的很不容易,你一定在经历一段特别艰难的时期。这种程度的焦虑可能已经严重干扰到你的日常生活,比如日常的学习对你来说变得非常困难,食欲、睡眠都受到很大影响,情绪上常常处于低落、紧张的状态。请你一定要重视起来,不要一个人默默承受。立刻寻求专业帮助,比如去看心理医生,他们会根据你的具体情况提供专业的治疗方案。同时,告诉身边信任的人,无论是家人还是朋友,他们都会给予你关心和支持,陪你一起度过这个难关,你并不孤单。"; + } + result.Total = sas.Total.ToString(); + result.Result = single.Result; + break; + case 340506680250437://SDS抑郁测评 + var sds = JsonConvert.DeserializeObject>(single.Result).FirstOrDefault(); + double count = Math.Round(sds.Total * 1.25, 2, MidpointRounding.AwayFromZero); + if (count < 53) + { + result.TagName = "无抑郁情况"; + result.Description = "倘若你的 SDS 抑郁量表得分表明无抑郁,这简直太棒啦!这表明现阶段你能从容应对高中生活里的风风雨雨,始终保持积极乐观的心态。在校园中,无论是繁重的课业,还是和同学间的小摩擦,都无法动摇你内心的阳光。你尽情享受着和小伙伴们的欢声笑语,全神贯注地投入学习,对未来充满了无限憧憬。希望你能一直将这份积极向上的生活态度延续下去,未来不管遇到什么,都能勇敢无畏、轻松化解。"; + } + if (count > 53 && count <= 61) + { + result.TagName = "可能轻度抑郁"; + result.Description = "当量表结果显示为轻度抑郁时,先别慌,在高中生群体里,这种情况并不少见。这可能意味着近期学习的压力、和朋友闹别扭,又或是家庭里一些小状况,给你的心情蒙上了一层薄薄的阴霾,让你偶尔会陷入情绪的低谷,感到有些沮丧。不过,这种程度的抑郁还不足以严重干扰你的日常生活与学习。你不妨在课余时间去操场跑跑步,让汗水带走烦恼;或是戴上耳机,沉浸在自己喜欢的音乐世界里;也可以跟知心好友坦诚倾诉,把心里的不愉快一股脑倒出来。相信通过这些方式,你很快就能重新找回往日的活力与快乐。"; + } + if (count > 61 && count <= 71) + { + result.TagName = "可能中度抑郁"; + result.Description = "要是处于中度抑郁状态,那就说明在过去的一段时间里,你承受了较大的压力,这些压力已经在明显地影响你的情绪和生活状态了。或许你会发现,学习时难以集中精力,原本轻松的题目如今也变得棘手起来;晚上躺在床上,翻来覆去难以入眠,睡眠质量大不如前;平日里,心情总是莫名地低落、烦躁,对很多曾经感兴趣的事情都提不起劲。别害怕,这其实是身体在向你发出信号,提醒你要关注当下的状态,及时做出调整。你可以试着跟老师、父母好好聊聊,让他们知晓你的内心感受,大家一起制定一个科学合理的学习和休息计划,保证自己有充足的放松时间。另外,学校的心理老师也是很好的倾诉对象,他们有着专业的知识和丰富的经验,能给你提供有效的建议,助你走出这片情绪的迷雾。"; + } + if (count >= 72) + { + result.TagName = "可能重度抑郁"; + result.Description = "如果量表结果显示重度抑郁,你真的太不容易了,此刻的你一定正深陷困境,承受着巨大的痛苦。这种程度的抑郁已经严重扰乱了你的日常生活,学习对你而言可能成了难以逾越的高山,每一个字、每一道题都仿佛在眼前模糊不清;食欲变得极其不稳定,要么毫无胃口,要么暴饮暴食;夜晚更是被失眠紧紧纠缠,黑暗中只剩无尽的孤独与绝望,情绪时刻被低落、紧张笼罩。请你务必高度重视起来,千万不要独自默默忍受这份痛苦。立即寻求专业的帮助,比如前往医院,找专业的心理医生进行诊断和治疗,他们会依据你的实际情况,量身定制专属的治疗方案。同时,勇敢地向身边信任的人敞开心扉,无论是父母温暖的怀抱,还是朋友坚定的陪伴,他们都会给予你最真挚的关心与支持,陪你一步步熬过这段至暗时光,你从来都不是一个人在战斗。"; + } + result.Total = count.ToString(); + result.Result = single.Result; + break; + case 340506852511813://中学生心理健康诊断自评(MHT) + + break; + + case 340507046379589://留学需求调研 + break; + } + + return result; + } + + + [NonAction] + private int FindMaxCombination(List data) + { + // 通过Name获取值(更直观) + var typeDict = data.ToDictionary(d => d.name, d => d.value); + + // 计算组合值 + int combo1 = typeDict["T"] + typeDict["A"]; // 理论型 + 冲动型 + int combo2 = typeDict["A"] + typeDict["P"]; // 冲动型 + 务实型 + int combo3 = typeDict["P"] + typeDict["R"]; // 务实型 + 沉思型 + int combo4 = typeDict["R"] + typeDict["T"]; // 沉思型 + 理论型 + + // 找出最大值 + int max = Math.Max(Math.Max(combo1, combo2), Math.Max(combo3, combo4)); + + //return (combo1 == max ? "理论型+冲动型" : + // combo2 == max ? "冲动型+务实型" : + // combo3 == max ? "务实型+沉思型" : "沉思型+理论型"); + return (combo1 == max ? 3 : + combo2 == max ? 4 : + combo3 == max ? 1 : 2); + } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusByMenuInput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusByMenuInput.cs new file mode 100644 index 0000000..5ca0425 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusByMenuInput.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + + /// + /// + /// + public class BusByMenuInput + { + public long MenuId { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusComprehensiveReportDTO.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusComprehensiveReportDTO.cs new file mode 100644 index 0000000..fdd65eb --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusComprehensiveReportDTO.cs @@ -0,0 +1,245 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + + /// + /// + /// + public class BusComprehensiveReportRequestDTO + { + /// + /// + /// + public long CustomId { get; set; } + + /// + /// 报告关联Id + /// + public long ReportId { get; set; } + + } + + + /// + /// 综合报告 + /// + public class BusComprehensiveReportDTO + { + + /// + /// + /// + public HollandDimension hollandDimension { get; set; } + + + /// + /// + /// + public MBTIDimension bTIDimension { get; set; } + + + + /// + /// + /// + public AbilityDimension abilityDimension { get; set; } + + + /// + /// + /// + public OpinionAboutValue opinionAbout { get; set; } + + + + } + + /// + /// + /// + public class HollandDimension + { + public string HTag { get; set; } + /// + /// + /// + public string Title { get; set; } + + /// + /// + /// + public string Description { get; set; } + + /// + /// + /// + public PicChart picCharts { get; set; } + + /// + /// + /// + public List reportItems { get; set; } + } + + + + /// + /// + /// + public class MBTIDimension + { + public string Title { get; set; } + + public string Description { get; set; } + + /// + /// + /// + public LinChart linChart { get; set; } + + /// + /// + /// + public ReportItem reportItem { get; set; } + } + + + + + public class AbilityDimension + { + public string Title { get; set; } + + public string Description { get; set; } + /// + /// + /// + public List linChart { get; set; } + + /// + /// + /// + public List reportItems { get; set; } + } + + + + public class OpinionAboutValue + { + /// + /// + /// + //public string TestTime { get; set; } + /// + /// + /// + public string Description { get; set; } + + /// + /// + /// + public PicChart picCharts { get; set; } + + public string Tag { get; set; } + public List reportItems { get; set; } + + public List opinionItems { get; set; } + + } + + + public class LinChart + { + public List Name { get; set; } + + public List Value { get; set; } + + + } + + public class Indicat + { + public string Name { get; set; } + + public int Max { get; set; } + } + public class PicChart + { + public List indicator { get; set; } + public List radars { get; set; } + } + + + public class ReportItem + { + public int Score { get; set; } + /// + /// 标签 + /// + public string Tag { get; set; } + + /// + /// 标签名称 + /// + public string Title { get; set; } + + /// + /// 标签描述 + /// + public string Description { get; set; } + + /// + /// 标签解析 + /// + public string Resolving { get; set; } + + /// + /// 性格特质 + /// + public string Traits { get; set; } + + /// + /// 主要特征 + /// + public string Features { get; set; } + + /// + /// + /// + public string MainDomain { get; set; } + + /// + /// 职业 + /// + public string Occupation { get; set; } + + /// + /// 专业 + /// + public string Major { get; set; } + + /// + /// 院校 + /// + public string University { get; set; } + + } + + + public class OpinionItem + { + public string Name { get; set; } + + public int Value { get; set; } + + public int Max { get; set; } + + + } + +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusCustomReportsList.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusCustomReportsList.cs new file mode 100644 index 0000000..e488f19 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusCustomReportsList.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// + /// + public class BusCustomReportsList + { + /// + /// + /// + public List customReports { get; set; } + + } + + /// + /// + /// + public class BusCustomReportRequestDTO + { + /// + /// + /// + public long CustomId { get; set; } + + } + public class CustomReports + { + public long ReportsId { get; set; } + public string Title { get; set; } + + public int Type { get; set; } + public string RoleName { get; set; } + + public DateTimeOffset CreateTime { get; set; } + + + } + +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusCustomScaleExplainDTO.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusCustomScaleExplainDTO.cs new file mode 100644 index 0000000..dff111b --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusCustomScaleExplainDTO.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + + + /// + /// + /// + public class BusCustomScaleExplainRequestDTO + { + + /// + /// + /// + public long CustomScaleId { get; set; } + + } + + /// + /// + /// + public class BusCustomScaleExplainDTO + { + /// + /// + /// + public string CustomName { get; set; } + + + /// + /// + /// + public DateTimeOffset TestTime { get; set; } + /// + /// + /// + public string Result { get; set; } + + /// + /// + /// + public string Title { get; set; } + + public string Total { get; set; } + + public string TagName { get; set; } + + /// + /// + /// + public string Suggestions { get; set; } + + public string Description { get; set; } + + } + + + +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusReportMapIdsDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusReportMapIdsDto.cs new file mode 100644 index 0000000..0e23433 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusReportMapIdsDto.cs @@ -0,0 +1,64 @@ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + + + /// + /// + /// + public class BusReportMapIdsRequestDto + { + /// + /// + /// + public long ReportId { get; set; } + } + + + /// + /// + /// + public class BusReportsRequestDto + { + + public long ScaleId { get; set; } + } + + + /// + /// + /// + public class BusReportMapIdsDto + { + + public int Proccess { get; set; } + public long HId { get; set; } + public long MId { get; set; } + public long NId { get; set; } + + public long JId { get; set; } + + + } + + public class ReportAIPrompt + { + /// + /// 量表类型 + /// + public int Type { get; set; } + + /// + /// 报告ID + /// + public long Id { get; set; } + + } + +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusScaleDescriptionResponseDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusScaleDescriptionResponseDto.cs new file mode 100644 index 0000000..1d294b5 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusScaleDescriptionResponseDto.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + + public class BusScaleDescriptionRequestDTO + { + public long ScaleId { get; set; } + + } + + /// + /// + /// + public class BusScaleDescriptionResponseDto + { + public List busScaleDescriptions { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusScaleDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusScaleDto.cs new file mode 100644 index 0000000..7438213 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusScaleDto.cs @@ -0,0 +1,41 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 量表类型表输出参数 + /// + public class BusScaleDto + { + /// + /// 量表类型名称 + /// + public string Name { get; set; } + + /// + /// 单选多选 + /// + public int QuestionsType { get; set; } + + /// + /// 量表简介 + /// + public string Summary { get; set; } + + /// + /// 量表海报 + /// + public string Pic { get; set; } + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusScaleInput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusScaleInput.cs new file mode 100644 index 0000000..983dfae --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusScaleInput.cs @@ -0,0 +1,61 @@ +using Admin.NET.Core; +using System; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application +{ + /// + /// 量表类型表输入参数 + /// + public class BusScaleInput : BasePageInput + { + /// + /// 量表类型名称 + /// + public virtual string Name { get; set; } + + /// + /// 单选多选 + /// + public virtual int? QuestionsType { get; set; } + + /// + /// 量表简介 + /// + public virtual string Summary { get; set; } + + /// + /// 量表海报 + /// + public virtual string Pic { get; set; } + + /// + /// Sort排序 + /// + public virtual int Sort { get; set; } + + } + + public class AddBusScaleInput : BusScaleInput + { + } + + public class DeleteBusScaleInput : BaseIdInput + { + } + + public class UpdateBusScaleInput : BusScaleInput + { + /// + /// Id主键 + /// + [Required(ErrorMessage = "Id主键不能为空")] + public long Id { get; set; } + + } + + public class QueryeBusScaleInput : BaseIdInput + { + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusScaleOutput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusScaleOutput.cs new file mode 100644 index 0000000..6170514 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusScaleOutput.cs @@ -0,0 +1,55 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 量表类型表输出参数 + /// + public class BusScaleOutput + { + /// + /// 量表类型名称 + /// + public string Name { get; set; } + + /// + /// 单选多选 + /// + public int QuestionsType { get; set; } + + /// + /// 量表简介 + /// + public string Summary { get; set; } + + + public int Status { get; set; } + + /// + /// 量表海报 + /// + public string Pic { get; set; } + + /// + /// 量表小图 + /// + public string MinImg { get; set; } + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + /// + /// 是否免费 + /// + public bool IsFree { get; set; } = true; + + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusScaleResponseDTO.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusScaleResponseDTO.cs new file mode 100644 index 0000000..2b6a0f5 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/BusScaleResponseDTO.cs @@ -0,0 +1,146 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + + /// + /// + /// + public class BusScaleRequestDTO + { + public long ScaleId { get; set; } + } + + + + + + + + public class Remark + { + public string name { get; set; } + public string value { get; set; } + } + + public class Answers + { + public string name { get; set; } + public string type { get; set; } + public string value { get; set; } + } + + + + /// + /// + /// + public class BusScaleStudyBroadResponseDTO + { + /// + /// + /// + public string TitleName { get; set; } + + /// + /// + /// + public List busScaleStudies { get; set; } + + + } + + /// + /// + /// + public class BusScaleStudyBroadDTO + { + public int type { get; set; } + public string name { get; set; } + public List answer { get; set; } + public Remark remark { get; set; } + } + + + /// + /// 试题 + /// + public class BusScaleResponseDTO + { + /// + /// 量表类型名称 + /// + public string Name { get; set; } + + /// + /// 单选多选 + /// + public int QuestionsType { get; set; } + + public int Go { get; set; } + + public string Description { get; set; } + + /// + /// 试题列表 + /// + public List scaleQuestions { get; set; } + + } + + + /// + /// + /// + public class ScaleQuestions + { + /// + /// + /// + public string title { get; set; } + + /// + /// + /// + public string type { get; set; } = ""; + /// + /// + /// + public int sort { get; set; } + + /// + /// + /// + public int score { get; set; } + + /// + /// + /// + public List answer { get; set; } + } + + + /// + /// + /// + public class Answer + { + public string key { get; set; } = ""; + public string tag { get; set; } = ""; + public string name { get; set; } + + public string value { get; set; } + + public int score { get; set; } + + } + + + + + +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/CustomBusScaleDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/CustomBusScaleDto.cs new file mode 100644 index 0000000..b3ab976 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/CustomBusScaleDto.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + + /// + /// 量表数据保存要求 + /// + public class CustomBusScaleRequestDTO + { + /// + /// + /// + public long CustomId { get; set; } + + /// + /// + /// + public long ScaleId { get; set; } + + + /// + /// + /// + public List Inputs { get; set; } + + } + + public class ScalTotals + { + public int Total { get; set; } + + } + + + public class ScalListItem + { + public string type { get; set; } + public string name { get; set; } + public int value { get; set; } + } + + public class BusScaleResult + { + public string Result { get; set; } + + public string Tag { get; set; } + + public List scalLists { get; set; } + } + public class CustomBusScaleDto + { + public long Id { get; set; } + + public long ScaleId { get; set; } + + /// + /// + /// + public long ReportId { get; set; } + + /// + /// + /// + public DateTimeOffset TestTime { get; set; } + + } + public class CustomBusScaleV2Dto + { + public long ReportId { get; set; } + public int Type{get;set;} + + } + + + public class xxfgItem + { + public string type { get; set; } + public string name { get; set; } + public string desc { get; set; } + public int value { get; set; } + } + + public class xxfgTagbject + { + public List tags { get; set; } + } + + public class Tag + { + public string name { get; set; } + public string code { get; set; } + public List features { get; set; } + public List learning_performance { get; set; } + public string notes { get; set; } + } + + +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/CustomMapProccessDTO.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/CustomMapProccessDTO.cs new file mode 100644 index 0000000..c6be283 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/CustomMapProccessDTO.cs @@ -0,0 +1,64 @@ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + + + + /// + /// + /// + public class CustomMapProccessRequestDTO + { + /// + /// + /// + public long CustomId { get; set; } + + } + + /// + /// + /// + public class CustomMapProccessDTO + { + public List mapProccesses { get; set; } + + public string ScaleId { get; set; } + + public string Description { get; set; } + } + + + /// + /// + /// + public class MapProccessDTO + { + public int Sort { get; set; } + public long ScaleId { get; set; } + public string Name { get; set; } + + + + public string UsesTime { get; set; } + public string Introduce { get; set; } + + public string Application { get; set; } + + + public string Notice { get; set; } + + /// + /// + /// + public int Status { get; set; } + + } + +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/StudyStyleDTO.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/StudyStyleDTO.cs new file mode 100644 index 0000000..8d98444 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScale/Dto/StudyStyleDTO.cs @@ -0,0 +1,104 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + + /// + /// 学习风格 + /// + public class StudyStyleResponseDTO + { + + /// + /// + /// + public string UserName { get; set; } + + /// + /// + /// + public DateTimeOffset TestTime { get; set; } + /// + /// + /// + public string Description { get; set; } + + /// + /// + /// + public PicChart picCharts { get; set; } + + + public List reportItems { get; set; } + + + public List studyStyles { get; set; } + + + + + /// + /// + /// + public StudyStyleResult studyStyleResult { get; set; } + + } + + public class StudyStyleTables + { + + public string Type { get; set; } + + + public int Score { get; set; } + + + public string Description { get; set; } + + } + + + public class StudyStyleResult + { + /// + /// 优点 + /// + public string Advantage { get; set; } + + /// + /// 追求 + /// + public string Seek { get; set; } + + + /// + /// 最爱问 + /// + public string FavoriteQuestions { get; set; } + + /// + /// 适合的职业 + /// + public string SuitableOccupation { get; set; } + + + } + + + /// + /// + /// + public class StudyStyleRequestDto + { + /// + /// + /// + public long ScaleId { get; set; } + + } + +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleDescription/BusScaleDescriptionService.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleDescription/BusScaleDescriptionService.cs new file mode 100644 index 0000000..190b1af --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleDescription/BusScaleDescriptionService.cs @@ -0,0 +1,157 @@ +using Admin.NET.Core; +using Furion.DatabaseAccessor; + +using Furion.DependencyInjection; +using Furion.DynamicApiController; +using Furion.FriendlyException; +using Mapster; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; + +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// 量表描述服务 + /// + [ApiDescriptionSettings("测评服务", Name = "BusScaleDescription", Order = 100)] + [Route("api/[Controller]")] + public class BusScaleDescriptionService : IDynamicApiController, ITransient + { + private readonly SqlSugarRepository _busScaleDescriptionRep; + private readonly UserManager _userManager; + public BusScaleDescriptionService( + SqlSugarRepository busScaleDescriptionRep, + UserManager userManager + ) + { + _busScaleDescriptionRep = busScaleDescriptionRep; + _userManager = userManager; + } + + /// + /// 分页查询量表描述 + /// + /// + /// + [HttpGet("page")] + public async Task> Page([FromQuery] BusScaleDescriptionInput input) + { + var busScaleDescriptions = await _busScaleDescriptionRep.AsQueryable() + .Where(u => u.ScaleId == input.ScaleId) + .WhereIF(!string.IsNullOrEmpty(input.Introduce), u => u.Introduce == input.Introduce) + .WhereIF(!string.IsNullOrEmpty(input.Application), u => u.Application == input.Application) + .WhereIF(!string.IsNullOrEmpty(input.Notice), u => u.Notice == input.Notice) + .Where(u => u.Sort == input.Sort) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .OrderBuilder(input) + .Select(s => new BusScaleDescriptionOutput() + { + Introduce = s.Introduce, + Application = s.Application, + Notice = s.Notice, + Sort = s.Sort, + Id = s.Id + }) + .ToPagedListAsync(input.Page, input.PageSize); + + return busScaleDescriptions; + } + + /// + /// 增加量表描述 + /// + /// + /// + [HttpPost("add")] + public async Task Add(AddBusScaleDescriptionInput input) + { + var busScaleDescription = input.Adapt(); + await _busScaleDescriptionRep.InsertAsync(busScaleDescription); + } + + /// + /// 删除量表描述 + /// + /// + /// + [HttpPost("delete")] + public async Task Delete(DeleteBusScaleDescriptionInput input) + { + var busScaleDescription = await _busScaleDescriptionRep.AsQueryable().FirstAsync(u => u.Id == input.Id); + await _busScaleDescriptionRep.FakeDeleteAsync(busScaleDescription); + } + + /// + /// 更新量表描述 + /// + /// + /// + [HttpPost("edit")] + public async Task Update(UpdateBusScaleDescriptionInput input) + { + var isExist = await _busScaleDescriptionRep.AsQueryable().AnyAsync(u => u.Id == input.Id); + if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3000); + + var busScaleDescription = input.Adapt(); + await _busScaleDescriptionRep.UpdateAsync(busScaleDescription); + } + + /// + /// 获取量表描述 + /// + /// + /// + [HttpGet("detail")] + public async Task Get([FromQuery] QueryeBusScaleDescriptionInput input) + { + return (await _busScaleDescriptionRep.AsQueryable().FirstAsync(u => u.Id == input.Id)).Adapt(); + } + + /// + /// 获取量表描述列表 + /// + /// + /// + [HttpGet("list")] + public async Task> List([FromQuery] BusScaleDescriptionInput input) + { + return await _busScaleDescriptionRep.AsQueryable().Select().ToListAsync(); + } + + + /// + /// 数据导入 + /// + /// + /// + [HttpPost("import")] + public async Task Imports(IFormFile file) + { + var scaledescription = new List(); + var list = InputExcelUtil.InputExcel(file); + for (int i = 0; i < list.Count(); i++) + { + var input = list[i]; + scaledescription.Add(new BusScaleDescription() + { + Application = input.Application, + CreateTime = DateTime.Now, + CreateUserId = _userManager.UserId, + CreateUserName = _userManager.Account, + Introduce = input.Introduce, + Notice = input.Notice, + UsesTime = input.UserTime, + ScaleId = input.ScaleId, + Sort = input.Sort, + IsDelete = false + }); + } + await _busScaleDescriptionRep.InsertRangeAsync(scaledescription); + } + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleDescription/Dto/BusScaleDescriptionDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleDescription/Dto/BusScaleDescriptionDto.cs new file mode 100644 index 0000000..b9b5b50 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleDescription/Dto/BusScaleDescriptionDto.cs @@ -0,0 +1,46 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 量表描述输出参数 + /// + public class BusScaleDescriptionDto + { + + + public string UsesTime { get; set; } + + public string Title { get; set; } + /// + /// ScaleId + /// + public long ScaleId { get; set; } + + /// + /// 介绍 + /// + public string Introduce { get; set; } + + /// + /// 应用 + /// + public string Application { get; set; } + + /// + /// 须知 + /// + public string Notice { get; set; } + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleDescription/Dto/BusScaleDescriptionInput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleDescription/Dto/BusScaleDescriptionInput.cs new file mode 100644 index 0000000..af520e1 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleDescription/Dto/BusScaleDescriptionInput.cs @@ -0,0 +1,61 @@ +using Admin.NET.Core; +using System; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application +{ + /// + /// 量表描述输入参数 + /// + public class BusScaleDescriptionInput : BasePageInput + { + /// + /// ScaleId + /// + public virtual long ScaleId { get; set; } + + /// + /// 介绍 + /// + public virtual string Introduce { get; set; } + + /// + /// 应用 + /// + public virtual string Application { get; set; } + + /// + /// 须知 + /// + public virtual string Notice { get; set; } + + /// + /// Sort排序 + /// + public virtual int Sort { get; set; } + + } + + public class AddBusScaleDescriptionInput : BusScaleDescriptionInput + { + } + + public class DeleteBusScaleDescriptionInput : BaseIdInput + { + } + + public class UpdateBusScaleDescriptionInput : BusScaleDescriptionInput + { + /// + /// Id主键 + /// + [Required(ErrorMessage = "Id主键不能为空")] + public long Id { get; set; } + + } + + public class QueryeBusScaleDescriptionInput : BaseIdInput + { + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleDescription/Dto/BusScaleDescriptionOutput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleDescription/Dto/BusScaleDescriptionOutput.cs new file mode 100644 index 0000000..f8b66aa --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleDescription/Dto/BusScaleDescriptionOutput.cs @@ -0,0 +1,41 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 量表描述输出参数 + /// + public class BusScaleDescriptionOutput + { + /// + /// ScaleId + /// + public long ScaleId { get; set; } + + /// + /// 介绍 + /// + public string Introduce { get; set; } + + /// + /// 应用 + /// + public string Application { get; set; } + + /// + /// 须知 + /// + public string Notice { get; set; } + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleDescription/Dto/ImportScaleDescriptionDTO.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleDescription/Dto/ImportScaleDescriptionDTO.cs new file mode 100644 index 0000000..788048b --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleDescription/Dto/ImportScaleDescriptionDTO.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + + /// + /// + /// + public class ImportScaleDescriptionDTO + { + /// + /// ScaleId + /// + public long ScaleId { get; set; } + + /// + /// 介绍 + /// + public string Introduce { get; set; } + + /// + /// 应用 + /// + public string Application { get; set; } + + /// + /// 须知 + /// + public string Notice { get; set; } + + + /// + /// + /// + public string UserTime { get; set; } + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleExplain/BusScaleExplainService.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleExplain/BusScaleExplainService.cs new file mode 100644 index 0000000..ad14f4a --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleExplain/BusScaleExplainService.cs @@ -0,0 +1,176 @@ +using Admin.NET.Core; +using Furion.DatabaseAccessor; +using Furion.DependencyInjection; +using Furion.DynamicApiController; +using Furion.FriendlyException; +using Mapster; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// 量表结果解释服务 + /// + [ApiDescriptionSettings("测评服务", Name = "BusScaleExplain", Order = 100)] + public class BusScaleExplainService : IDynamicApiController, ITransient + { + private readonly SqlSugarRepository _busScaleExplainRep; + private readonly UserManager _userManager; + /// + /// + /// + /// + public BusScaleExplainService( + SqlSugarRepository busScaleExplainRep, + UserManager userManager + ) + { + _busScaleExplainRep = busScaleExplainRep; + _userManager = userManager; + } + + /// + /// 分页查询量表结果解释 + /// + /// + /// + [HttpGet("page")] + public async Task> Page([FromQuery] BusScaleExplainInput input) + { + var busScaleExplains = await _busScaleExplainRep.AsQueryable() + .Where(u => u.ScaleId == input.ScaleId) + .WhereIF(!string.IsNullOrEmpty(input.Tag), u => u.Tag == input.Tag) + .WhereIF(!string.IsNullOrEmpty(input.Title), u => u.Title == input.Title) + .WhereIF(!string.IsNullOrEmpty(input.Description), u => u.Description == input.Description) + .WhereIF(!string.IsNullOrEmpty(input.Resolving), u => u.Resolving == input.Resolving) + .WhereIF(!string.IsNullOrEmpty(input.Traits), u => u.Traits == input.Traits) + .WhereIF(!string.IsNullOrEmpty(input.Features), u => u.Features == input.Features) + .WhereIF(!string.IsNullOrEmpty(input.Occupation), u => u.Occupation == input.Occupation) + .WhereIF(!string.IsNullOrEmpty(input.Major), u => u.Major == input.Major) + .WhereIF(!string.IsNullOrEmpty(input.University), u => u.University == input.University) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .OrderBuilder(input) + .Select(s => new BusScaleExplainOutput + { + Tag = s.Tag, + Title = s.Title, + Description = s.Description, + Resolving = s.Resolving, + Traits = s.Traits, + Features = s.Features, + Occupation = s.Occupation, + Major = s.Major, + University = s.University, + Id = s.Id + }) + .ToPagedListAsync(input.Page, input.PageSize); + + return busScaleExplains; + } + + /// + /// 增加量表结果解释 + /// + /// + /// + [HttpPost("add")] + public async Task Add(AddBusScaleExplainInput input) + { + var busScaleExplain = input.Adapt(); + await _busScaleExplainRep.InsertAsync(busScaleExplain); + } + + /// + /// 删除量表结果解释 + /// + /// + /// + [HttpPost("delete")] + public async Task Delete(DeleteBusScaleExplainInput input) + { + var busScaleExplain = await _busScaleExplainRep.AsQueryable().FirstAsync(u => u.Id == input.Id); + await _busScaleExplainRep.FakeDeleteAsync(busScaleExplain); + } + + /// + /// 更新量表结果解释 + /// + /// + /// + [HttpPost("edit")] + public async Task Update(UpdateBusScaleExplainInput input) + { + var isExist = await _busScaleExplainRep.AsQueryable().AnyAsync(u => u.Id == input.Id); + if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3000); + + var busScaleExplain = input.Adapt(); + await _busScaleExplainRep.UpdateAsync(busScaleExplain); + } + + /// + /// 获取量表结果解释 + /// + /// + /// + [HttpGet("detail")] + public async Task Get([FromQuery] QueryeBusScaleExplainInput input) + { + return (await _busScaleExplainRep.AsQueryable().FirstAsync(u => u.Id == input.Id)).Adapt(); + } + + /// + /// 获取量表结果解释列表 + /// + /// + /// + [HttpGet("list")] + public async Task> List([FromQuery] BusScaleExplainInput input) + { + return await _busScaleExplainRep.AsQueryable() + .Select().ToListAsync(); + } + + + + /// + /// + /// + /// + /// + [HttpPost("import")] + public async Task Imports(IFormFile file) + { + var list = InputExcelUtil.InputExcel(file); + var scalelist = new List(); + for (int i = 0; i < list.Count(); i++) + { + var item = list[i]; + scalelist.Add(new BusScaleExplain() + { + CreateTime = DateTime.Now, + CreateUserName = _userManager.Account, + CreateUserId = _userManager.UserId, + Description = item.Description, + Features = item.Features, + MainDomain = item.MainDomain, + Major = item.Major, + Occupation = item.Occupation, + Resolving = item.Resolving, + ScaleId = item.ScaleId, + Tag = item.Tag, + Title = item.Title, + Traits = item.Traits, + University = item.University, + }); + } + await _busScaleExplainRep.InsertRangeAsync(scalelist); + } + + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleExplain/Dto/BusScaleExplainDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleExplain/Dto/BusScaleExplainDto.cs new file mode 100644 index 0000000..bd7bc57 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleExplain/Dto/BusScaleExplainDto.cs @@ -0,0 +1,71 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 量表结果解释输出参数 + /// + public class BusScaleExplainDto + { + /// + /// 标签ScaleId + /// + public long ScaleId { get; set; } + + /// + /// 标签 + /// + public string Tag { get; set; } + + /// + /// 标签名称 + /// + public string Title { get; set; } + + /// + /// 标签描述 + /// + public string Description { get; set; } + + /// + /// 标签解析 + /// + public string Resolving { get; set; } + + /// + /// 性格特质 + /// + public string Traits { get; set; } + + /// + /// 主要特征 + /// + public string Features { get; set; } + + /// + /// + /// + public string MainDomain { get; set; } + + /// + /// 职业 + /// + public string Occupation { get; set; } + + /// + /// 专业 + /// + public string Major { get; set; } + + /// + /// 院校 + /// + public string University { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleExplain/Dto/BusScaleExplainInput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleExplain/Dto/BusScaleExplainInput.cs new file mode 100644 index 0000000..e2bd6f0 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleExplain/Dto/BusScaleExplainInput.cs @@ -0,0 +1,86 @@ +using Admin.NET.Core; +using System; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application +{ + /// + /// 量表结果解释输入参数 + /// + public class BusScaleExplainInput : BasePageInput + { + /// + /// 标签ScaleId + /// + public virtual long ScaleId { get; set; } + + /// + /// 标签 + /// + public virtual string Tag { get; set; } + + /// + /// 标签名称 + /// + public virtual string Title { get; set; } + + /// + /// 标签描述 + /// + public virtual string Description { get; set; } + + /// + /// 标签解析 + /// + public virtual string Resolving { get; set; } + + /// + /// 性格特质 + /// + public virtual string Traits { get; set; } + + /// + /// 主要特征 + /// + public virtual string Features { get; set; } + + /// + /// 职业 + /// + public virtual string Occupation { get; set; } + + /// + /// 专业 + /// + public virtual string Major { get; set; } + + /// + /// 院校 + /// + public virtual string University { get; set; } + + } + + public class AddBusScaleExplainInput : BusScaleExplainInput + { + } + + public class DeleteBusScaleExplainInput : BaseIdInput + { + } + + public class UpdateBusScaleExplainInput : BusScaleExplainInput + { + /// + /// Id主键 + /// + [Required(ErrorMessage = "Id主键不能为空")] + public long Id { get; set; } + + } + + public class QueryeBusScaleExplainInput : BaseIdInput + { + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleExplain/Dto/BusScaleExplainOutput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleExplain/Dto/BusScaleExplainOutput.cs new file mode 100644 index 0000000..db3a60d --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleExplain/Dto/BusScaleExplainOutput.cs @@ -0,0 +1,66 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 量表结果解释输出参数 + /// + public class BusScaleExplainOutput + { + /// + /// 标签ScaleId + /// + public long ScaleId { get; set; } + + /// + /// 标签 + /// + public string Tag { get; set; } + + /// + /// 标签名称 + /// + public string Title { get; set; } + + /// + /// 标签描述 + /// + public string Description { get; set; } + + /// + /// 标签解析 + /// + public string Resolving { get; set; } + + /// + /// 性格特质 + /// + public string Traits { get; set; } + + /// + /// 主要特征 + /// + public string Features { get; set; } + + /// + /// 职业 + /// + public string Occupation { get; set; } + + /// + /// 专业 + /// + public string Major { get; set; } + + /// + /// 院校 + /// + public string University { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleExplain/Dto/ScaleExplainImportDTO.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleExplain/Dto/ScaleExplainImportDTO.cs new file mode 100644 index 0000000..dfb51e4 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleExplain/Dto/ScaleExplainImportDTO.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + public class ScaleExplainImportDTO + { + + + /// + /// 标签ScaleId + /// + public long ScaleId { get; set; } + + /// + /// 标签 + /// + public string Tag { get; set; } + + /// + /// 标签名称 + /// + public string Title { get; set; } + + /// + /// 标签描述 + /// + public string Description { get; set; } + + /// + /// 标签解析 + /// + public string Resolving { get; set; } + + /// + /// 性格特质 + /// + public string Traits { get; set; } + + /// + /// 主要特征 + /// + public string Features { get; set; } + + public string MainDomain { get; set; } + + /// + /// 职业 + /// + public string Occupation { get; set; } + + /// + /// 专业 + /// + public string Major { get; set; } + + /// + /// 院校 + /// + public string University { get; set; } + + + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleQuestions/BusScaleQuestionsService.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleQuestions/BusScaleQuestionsService.cs new file mode 100644 index 0000000..3aacc8f --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleQuestions/BusScaleQuestionsService.cs @@ -0,0 +1,160 @@ +using Admin.NET.Core; +using Furion.DatabaseAccessor; +using Furion.DependencyInjection; +using Furion.DynamicApiController; +using Furion.FriendlyException; +using Mapster; +using Microsoft.AspNetCore.Mvc; + +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// 量表试题服务 + /// + [ApiDescriptionSettings("测评服务", Name = "BusScaleQuestions", Order = 100)] + public class BusScaleQuestionsService : IDynamicApiController, ITransient + { + private readonly SqlSugarRepository _busScaleQuestionsRep; + private readonly SqlSugarRepository _busScaleRep; + private readonly UserManager _userManager; + public BusScaleQuestionsService( + SqlSugarRepository busScaleRep, + SqlSugarRepository busScaleQuestionsRep, + UserManager userManager + ) + { + _busScaleRep = busScaleRep; + _busScaleQuestionsRep = busScaleQuestionsRep; + _userManager = userManager; + } + + /// + /// 分页查询量表试题 + /// + /// + /// + [HttpGet("page")] + public async Task> Page([FromQuery] BusScaleQuestionsInput input) + { + var busScaleQuestionss = await _busScaleQuestionsRep.AsQueryable() + .WhereIF(input.ScaleId > 0, u => u.ScaleId == input.ScaleId) + .WhereIF(!string.IsNullOrEmpty(input.Context), u => u.Context == input.Context) + //.Where(u => u.Sort == input.Sort) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .OrderBuilder(input) + .Select(s => new BusScaleQuestionsOutput() + { + Context = s.Context, + Sort = s.Sort, + Id = s.Id + }) + .ToPagedListAsync(input.Page, input.PageSize); + + return busScaleQuestionss; + } + + /// + /// 增加量表试题 + /// + /// + /// + [HttpPost("add")] + public async Task Add(AddBusScaleQuestionsInput input) + { + var busScaleQuestions = input.Adapt(); + await _busScaleQuestionsRep.InsertAsync(busScaleQuestions); + } + + + + /// + /// 批量导入量表数据 + /// + /// + /// + [HttpPost("Buadd")] + public async Task BuAdd(BusAddScaleQuestionsInput input) + { + var busScaleQuestions = new List(); + input.Contexts.ForEach(c => + { + busScaleQuestions.Add(new BusScaleQuestions() + { + Context = c.Contexts, + CreateTime = DateTime.Now, + CreateUserId = _userManager.UserId, + CreateUserName = _userManager.Account, + ScaleId = input.ScaleId, + Sort = c.Sort + }); + }); + await _busScaleQuestionsRep.InsertRangeAsync(busScaleQuestions); + } + + /// + /// 删除量表试题 + /// + /// + /// + [HttpPost("delete")] + public async Task Delete(DeleteBusScaleQuestionsInput input) + { + var busScaleQuestions = await _busScaleQuestionsRep.AsQueryable().FirstAsync(u => u.Id == input.Id); + await _busScaleQuestionsRep.FakeDeleteAsync(busScaleQuestions); + } + + /// + /// 更新量表试题 + /// + /// + /// + [HttpPost("edit")] + public async Task Update(UpdateBusScaleQuestionsInput input) + { + var isExist = await _busScaleQuestionsRep.AsQueryable().AnyAsync(u => u.Id == input.Id); + if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3000); + + var busScaleQuestions = input.Adapt(); + await _busScaleQuestionsRep.UpdateAsync(busScaleQuestions); + } + + /// + /// 获取量表试题 + /// + /// + /// + [HttpGet("detail")] + public async Task Get([FromQuery] QueryeBusScaleQuestionsInput input) + { + return (await _busScaleQuestionsRep.AsQueryable().FirstAsync(u => u.Id == input.Id)).Adapt(); + } + + /// + /// 获取量表试题列表 + /// + /// + /// + [HttpGet("list")] + public async Task> List([FromQuery] BusScaleQuestionsInput input) + { + return await _busScaleQuestionsRep.AsQueryable().Select().ToListAsync(); + } + + /// + /// 获取BusScale列表 + /// + /// + [HttpGet("fkBusScale")] + public async Task FkBusScaleList() + { + var list = await _busScaleRep.AsQueryable().ToListAsync(); + return list.Select(e => new { Code = e.Id, Name = e.Name }); + } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleQuestions/Dto/BusScaleQuestionsDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleQuestions/Dto/BusScaleQuestionsDto.cs new file mode 100644 index 0000000..c7590f5 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleQuestions/Dto/BusScaleQuestionsDto.cs @@ -0,0 +1,36 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 量表试题输出参数 + /// + public class BusScaleQuestionsDto + { + /// + /// 量表类型 + /// + public string BusScaleName { get; set; } + + /// + /// 量表类型 + /// + public long ScaleId { get; set; } + + /// + /// 试题内容 + /// + public string Context { get; set; } + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleQuestions/Dto/BusScaleQuestionsInput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleQuestions/Dto/BusScaleQuestionsInput.cs new file mode 100644 index 0000000..8104576 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleQuestions/Dto/BusScaleQuestionsInput.cs @@ -0,0 +1,80 @@ +using Admin.NET.Core; +using System; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application +{ + /// + /// 量表试题输入参数 + /// + public class BusScaleQuestionsInput : BasePageInput + { + /// + /// 量表类型 + /// + public virtual long ScaleId { get; set; } + + /// + /// 试题内容 + /// + public virtual string Context { get; set; } + + /// + /// Sort排序 + /// + public virtual int Sort { get; set; } + + } + + public class AddBusScaleQuestionsInput : BusScaleQuestionsInput + { + + + } + + + public class BusAddScaleQuestionsInput + { + + + /// + /// 量表类型 + /// + public virtual long ScaleId { get; set; } + + /// + /// + /// + public List Contexts { get; set; } + } + + public class ScaleQuestionItems + { + + /// + /// 量表类型 + /// + public int Sort { get; set; } + + public string Contexts { get; set; } + } + + public class DeleteBusScaleQuestionsInput : BaseIdInput + { + } + + public class UpdateBusScaleQuestionsInput : BusScaleQuestionsInput + { + /// + /// Id主键 + /// + [Required(ErrorMessage = "Id主键不能为空")] + public long Id { get; set; } + + } + + public class QueryeBusScaleQuestionsInput : BaseIdInput + { + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleQuestions/Dto/BusScaleQuestionsOutput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleQuestions/Dto/BusScaleQuestionsOutput.cs new file mode 100644 index 0000000..72cddf3 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusScaleQuestions/Dto/BusScaleQuestionsOutput.cs @@ -0,0 +1,31 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 量表试题输出参数 + /// + public class BusScaleQuestionsOutput + { + /// + /// 量表类型 + /// + public long ScaleId { get; set; } + + /// + /// 试题内容 + /// + public string Context { get; set; } + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialRecruitStudents/BusSpecialRecruitStudentsService.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialRecruitStudents/BusSpecialRecruitStudentsService.cs new file mode 100644 index 0000000..cd61e13 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialRecruitStudents/BusSpecialRecruitStudentsService.cs @@ -0,0 +1,132 @@ +using Admin.NET.Core; +using Furion.DatabaseAccessor; +using Furion.DependencyInjection; +using Furion.DynamicApiController; +using Furion.FriendlyException; +using Mapster; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// 特殊批次招生服务 + /// + [ApiDescriptionSettings("测评服务", Name = "BusSpecialRecruitStudents", Order = 100)] + public class BusSpecialRecruitStudentsService : IDynamicApiController, ITransient + { + private readonly SqlSugarRepository _busSpecialRecruitStudentsRep; + + /// + /// + /// + /// + public BusSpecialRecruitStudentsService( + SqlSugarRepository busSpecialRecruitStudentsRep + ) + { + _busSpecialRecruitStudentsRep = busSpecialRecruitStudentsRep; + } + + /// + /// 分页查询特殊批次招生 + /// + /// + /// + [HttpGet("page")] + [AllowAnonymous] + public async Task> Page([FromQuery] BusSpecialRecruitStudentsInput input) + { + var busSpecialRecruitStudentss = await _busSpecialRecruitStudentsRep.AsQueryable() + .WhereIF(!string.IsNullOrEmpty(input.Title), u => u.Title == input.Title) + .WhereIF(!string.IsNullOrEmpty(input.Pic), u => u.Pic == input.Pic) + .WhereIF(!string.IsNullOrEmpty(input.Summary), u => u.Summary == input.Summary) + .WhereIF(!string.IsNullOrEmpty(input.Url), u => u.Url == input.Url) + //.Where(u => u.Sort == input.Sort) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .OrderBuilder(input) + .Select(s => new BusSpecialRecruitStudentsOutput() + { + Title = s.Title, + Pic = s.Pic, + Summary = s.Summary, + Url = s.Url, + Ico = s.Ico, + Sort = s.Sort, + Id = s.Id + + }) + .ToPagedListAsync(input.Page, input.PageSize); + + return busSpecialRecruitStudentss; + } + + /// + /// 增加特殊批次招生 + /// + /// + /// + [HttpPost("add")] + public async Task Add(AddBusSpecialRecruitStudentsInput input) + { + var busSpecialRecruitStudents = input.Adapt(); + await _busSpecialRecruitStudentsRep.InsertAsync(busSpecialRecruitStudents); + } + + /// + /// 删除特殊批次招生 + /// + /// + /// + [HttpPost("delete")] + public async Task Delete(DeleteBusSpecialRecruitStudentsInput input) + { + var busSpecialRecruitStudents = await _busSpecialRecruitStudentsRep.AsQueryable().FirstAsync(u => u.Id == input.Id); + await _busSpecialRecruitStudentsRep.FakeDeleteAsync(busSpecialRecruitStudents); + } + + /// + /// 更新特殊批次招生 + /// + /// + /// + [HttpPost("edit")] + public async Task Update(UpdateBusSpecialRecruitStudentsInput input) + { + var isExist = await _busSpecialRecruitStudentsRep.AsQueryable().AnyAsync(u => u.Id == input.Id); + if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3000); + + var busSpecialRecruitStudents = input.Adapt(); + await _busSpecialRecruitStudentsRep.UpdateAsync(busSpecialRecruitStudents); + } + + /// + /// 获取特殊批次招生 + /// + /// + /// + [HttpGet("detail")] + [AllowAnonymous] + public async Task Get([FromQuery] QueryeBusSpecialRecruitStudentsInput input) + { + return (await _busSpecialRecruitStudentsRep.AsQueryable().FirstAsync(u => u.Id == input.Id)).Adapt(); + } + + /// + /// 获取特殊批次招生列表 + /// + /// + /// + [HttpGet("list")] + [AllowAnonymous] + public async Task> List([FromQuery] BusSpecialRecruitStudentsInput input) + { + return await _busSpecialRecruitStudentsRep.AsQueryable().Select().ToListAsync(); + } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialRecruitStudents/Dto/BusSpecialRecruitStudentsDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialRecruitStudents/Dto/BusSpecialRecruitStudentsDto.cs new file mode 100644 index 0000000..cfedfff --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialRecruitStudents/Dto/BusSpecialRecruitStudentsDto.cs @@ -0,0 +1,41 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 特殊批次招生输出参数 + /// + public class BusSpecialRecruitStudentsDto + { + /// + /// 招生批次名称 + /// + public string Title { get; set; } + + /// + /// 封面 + /// + public string Pic { get; set; } + + /// + /// 批次描述 + /// + public string Summary { get; set; } + + /// + /// 跳转链接 + /// + public string Url { get; set; } + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialRecruitStudents/Dto/BusSpecialRecruitStudentsInput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialRecruitStudents/Dto/BusSpecialRecruitStudentsInput.cs new file mode 100644 index 0000000..6d75da0 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialRecruitStudents/Dto/BusSpecialRecruitStudentsInput.cs @@ -0,0 +1,61 @@ +using Admin.NET.Core; +using System; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application +{ + /// + /// 特殊批次招生输入参数 + /// + public class BusSpecialRecruitStudentsInput : BasePageInput + { + /// + /// 招生批次名称 + /// + public virtual string Title { get; set; } + + /// + /// 封面 + /// + public virtual string Pic { get; set; } + + /// + /// 批次描述 + /// + public virtual string Summary { get; set; } + + /// + /// 跳转链接 + /// + public virtual string Url { get; set; } + + /// + /// Sort排序 + /// + public virtual int Sort { get; set; } + + } + + public class AddBusSpecialRecruitStudentsInput : BusSpecialRecruitStudentsInput + { + } + + public class DeleteBusSpecialRecruitStudentsInput : BaseIdInput + { + } + + public class UpdateBusSpecialRecruitStudentsInput : BusSpecialRecruitStudentsInput + { + /// + /// Id主键 + /// + [Required(ErrorMessage = "Id主键不能为空")] + public long Id { get; set; } + + } + + public class QueryeBusSpecialRecruitStudentsInput : BaseIdInput + { + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialRecruitStudents/Dto/BusSpecialRecruitStudentsOutput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialRecruitStudents/Dto/BusSpecialRecruitStudentsOutput.cs new file mode 100644 index 0000000..df4aefc --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialRecruitStudents/Dto/BusSpecialRecruitStudentsOutput.cs @@ -0,0 +1,46 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 特殊批次招生输出参数 + /// + public class BusSpecialRecruitStudentsOutput + { + /// + /// 招生批次名称 + /// + public string Title { get; set; } + + /// + /// 封面 + /// + public string Pic { get; set; } + + /// + /// 批次描述 + /// + public string Summary { get; set; } + + /// + /// 跳转链接 + /// + public string Url { get; set; } + + /// + /// Ico + /// + public string Ico { get; set; } + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialistGroup/BusSpecialistGroupService.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialistGroup/BusSpecialistGroupService.cs new file mode 100644 index 0000000..ea42a5f --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialistGroup/BusSpecialistGroupService.cs @@ -0,0 +1,216 @@ +using Admin.NET.Core; +using Admin.NET.Core.Service; +using Furion.DatabaseAccessor; + +using Furion.DependencyInjection; +using Furion.DynamicApiController; +using Furion.FriendlyException; +using Mapster; +using Microsoft.AspNetCore.Mvc; + +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using Microsoft.Extensions.Caching.Distributed; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using System.Threading.Tasks; +using Flurl.Http; + +namespace Admin.NET.Application +{ + /// + /// 专家团队服务 + /// + [ApiDescriptionSettings("测评服务", Name = "BusSpecialistGroup", Order = 100)] + public class BusSpecialistGroupService : IDynamicApiController, ITransient + { + private readonly SqlSugarRepository _busSpecialistGroupRep; + private readonly SysDictDataService _sysDictDataService; + + + /// + /// + /// + /// + /// + public BusSpecialistGroupService( + SqlSugarRepository busSpecialistGroupRep, + SysDictDataService sysDictDataService + ) + { + _busSpecialistGroupRep = busSpecialistGroupRep; + _sysDictDataService = sysDictDataService; + } + + + + /// + /// 获取专业咨询类型 + /// + /// 340820674089029 + /// + [HttpGet("GetType")] + public async Task> GetType([FromQuery] SpecialTypeRequestDTO requestDTO) + { + var result = await _sysDictDataService.GetDictDataListByDictTypeId(requestDTO.TypeId); + return result.Select(s => new SpecialTypeResponseDTO() + { + Name = s.Value, + Code = s.Code + }).ToList(); + } + + + + /// + /// 分页查询专家团队 + /// + /// + /// + [HttpGet("page")] + public async Task> Page([FromQuery] BusSpecialistGroupInput input) + { + var busSpecialistGroups = await _busSpecialistGroupRep.AsQueryable() + .WhereIF(input.MajorType.HasValue, u => u.MajorType == input.MajorType) + .WhereIF(!string.IsNullOrEmpty(input.Name), u => u.Name == input.Name) + //.Where(u => u.Gander == input.Gander) + //.Where(!string.IsNullOrEmpty(input.Pic), u => u.Pic == input.Pic) + .WhereIF(!string.IsNullOrEmpty(input.Phone), u => u.Phone == input.Phone) + .WhereIF(!string.IsNullOrEmpty(input.ServiceExpres), u => u.ServiceExpres == input.ServiceExpres) + .WhereIF(!string.IsNullOrEmpty(input.MajorTag), u => u.MajorTag == input.MajorTag) + .WhereIF(!string.IsNullOrEmpty(input.Summery), u => u.Summery == input.Summery) + .WhereIF(!string.IsNullOrEmpty(input.BusinessScope), u => u.BusinessScope == input.BusinessScope) + .Where(u => u.IsDelete == false) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .OrderBuilder(input) + .Select(s => new BusSpecialistGroupOutput() + { + MajorType = s.MajorType, + Name = s.Name, + Gander = s.Gander, + Pic = s.Pic, + Phone = s.Phone, + ServiceExpres = s.ServiceExpres, + MajorTag = s.MajorTag, + Summery = s.Summery, + BusinessScope = s.BusinessScope, + Sort = s.Sort, + Id = s.Id + + }) + .ToPagedListAsync(input.Page, input.PageSize); + + return busSpecialistGroups; + } + + /// + /// 增加专家团队 + /// + /// + /// + [HttpPost("add")] + public async Task Add(AddBusSpecialistGroupInput input) + { + var busSpecialistGroup = input.Adapt(); + await _busSpecialistGroupRep.InsertAsync(busSpecialistGroup); + } + + /// + /// 删除专家团队 + /// + /// + /// + [HttpPost("delete")] + public async Task Delete(DeleteBusSpecialistGroupInput input) + { + var busSpecialistGroup = await _busSpecialistGroupRep.AsQueryable().FirstAsync(u => u.Id == input.Id); + await _busSpecialistGroupRep.FakeDeleteAsync(busSpecialistGroup); + } + + /// + /// 更新专家团队 + /// + /// + /// + [HttpPost("edit")] + public async Task Update(UpdateBusSpecialistGroupInput input) + { + var isExist = await _busSpecialistGroupRep.AsQueryable().AnyAsync(u => u.Id == input.Id); + if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3000); + + var busSpecialistGroup = input.Adapt(); + await _busSpecialistGroupRep.UpdateAsync(busSpecialistGroup); + } + + /// + /// 获取专家团队 + /// + /// + /// + [HttpGet("detail")] + public async Task Get([FromQuery] QueryeBusSpecialistGroupInput input) + { + return (await _busSpecialistGroupRep.AsQueryable().FirstAsync(u => u.Id == input.Id)).Adapt(); + } + + /// + /// 获取专家团队列表 + /// + /// + /// + [AllowAnonymous] + [HttpGet("list")] + public async Task> List([FromQuery] QueryBusSpecaillistRequestDto input) + { + var query = await _busSpecialistGroupRep.AsQueryable() + .Where(e => e.IsDelete == false) + .WhereIF(input.Code.HasValue, w => w.MajorType == input.Code) + .Select(s => new BusSpeciaItemslistGroupOutput() + { + Name = s.Name, + MajorTag = s.MajorTag, + Gander = s.Gander, + Pic = s.Pic, + Phone = s.Phone, + ServiceExpres = s.ServiceExpres, + Sort = s.Sort, + Id = s.Id, + BusinessScope = s.BusinessScope, + Summary = s.Summery + }).ToListAsync(); + query.ForEach(s => + { + s.MajorTags = s.MajorTag.Split("|").ToList(); + }); + + return query; + } + + + + + + + /// + /// 获取H5产品列表 + /// + /// + [AllowAnonymous] + [HttpGet("speciallist")] + public async Task> GetSpecialList() + { + var replist = new List(); + var list = await "https://kp.ycymedu.com/web/special/get_special_list?cate_id=0&subject_id=0&page=1&limit=16&type=&is_pay=&salesOrder=&scoreOrder=&search=".GetJsonAsync(); + replist = list.data.data; + replist.ForEach(a => + { + + a.url = string.Format("https://kp.ycymedu.com/web/special/details.html?from=special_cate&id={0}", a.id); + }); + return replist; + } + + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialistGroup/Dto/BusSpecialistGroupDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialistGroup/Dto/BusSpecialistGroupDto.cs new file mode 100644 index 0000000..bb680fa --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialistGroup/Dto/BusSpecialistGroupDto.cs @@ -0,0 +1,66 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 专家团队输出参数 + /// + public class BusSpecialistGroupDto + { + /// + /// 专家方向 + /// + public long MajorType { get; set; } + + /// + /// 专家姓名 + /// + public string Name { get; set; } + + /// + /// 专家性别 + /// + public int Gander { get; set; } + + /// + /// 专家头像 + /// + public string Pic { get; set; } + + /// + /// 专家电话 + /// + public string Phone { get; set; } + + /// + /// 从业经验 + /// + public string ServiceExpres { get; set; } + + /// + /// 专业标签 + /// + public string MajorTag { get; set; } + + /// + /// 专家简介 + /// + public string Summery { get; set; } + + /// + /// 咨询领域 + /// + public string BusinessScope { get; set; } + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialistGroup/Dto/BusSpecialistGroupInput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialistGroup/Dto/BusSpecialistGroupInput.cs new file mode 100644 index 0000000..e10b1d2 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialistGroup/Dto/BusSpecialistGroupInput.cs @@ -0,0 +1,97 @@ +using Admin.NET.Core; +using System; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application +{ + /// + /// 专家团队输入参数 + /// + public class BusSpecialistGroupInput : BasePageInput + { + /// + /// 专家方向 + /// + public virtual long? MajorType { get; set; } + + /// + /// 专家姓名 + /// + public virtual string Name { get; set; } + + /// + /// 专家性别 + /// + public virtual int Gander { get; set; } + + /// + /// 专家头像 + /// + public virtual string Pic { get; set; } + + /// + /// 专家电话 + /// + public virtual string Phone { get; set; } + + /// + /// 从业经验 + /// + public virtual string ServiceExpres { get; set; } + + /// + /// 专业标签 + /// + public virtual string MajorTag { get; set; } + + /// + /// 专家简介 + /// + public virtual string Summery { get; set; } + + /// + /// 咨询领域 + /// + public virtual string BusinessScope { get; set; } + + /// + /// Sort排序 + /// + public virtual int Sort { get; set; } + + } + + public class AddBusSpecialistGroupInput : BusSpecialistGroupInput + { + } + + public class DeleteBusSpecialistGroupInput : BaseIdInput + { + } + + public class UpdateBusSpecialistGroupInput : BusSpecialistGroupInput + { + /// + /// Id主键 + /// + [Required(ErrorMessage = "Id主键不能为空")] + public long Id { get; set; } + + } + + public class QueryeBusSpecialistGroupInput : BaseIdInput + { + + } + + /// + /// + /// + public class QueryBusSpecaillistRequestDto + { + /// + /// + /// + public long? Code { get; set; } + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialistGroup/Dto/BusSpecialistGroupOutput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialistGroup/Dto/BusSpecialistGroupOutput.cs new file mode 100644 index 0000000..fae3ead --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialistGroup/Dto/BusSpecialistGroupOutput.cs @@ -0,0 +1,175 @@ +using System; + +namespace Admin.NET.Application +{ + public class BusSpeciaItemslistGroupOutput + { + + /// + /// 专家姓名 + /// + public string Name { get; set; } + + + /// + /// + /// + public string MajorTag { get; set; } + + public List MajorTags { get; set; } + + /// + /// 专家性别 + /// + public int Gander { get; set; } + + /// + /// 专家头像 + /// + public string Pic { get; set; } + + /// + /// 专家电话 + /// + public string Phone { get; set; } + + /// + /// 从业经验 + /// + public string ServiceExpres { get; set; } + + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + + /// + /// Id主键 + /// + public long Id { get; set; } + + /// + /// + /// + public string BusinessScope { get; set; } + + /// + /// 简介 + /// + public string Summary { get; set; } + + } + + + /// + /// 专家团队输出参数 + /// + public class BusSpecialistGroupOutput + { + /// + /// 专家方向 + /// + public long MajorType { get; set; } + + /// + /// 专家姓名 + /// + public string Name { get; set; } + + /// + /// 专家性别 + /// + public int Gander { get; set; } + + /// + /// 专家头像 + /// + public string Pic { get; set; } + + /// + /// 专家电话 + /// + public string Phone { get; set; } + + /// + /// 从业经验 + /// + public string ServiceExpres { get; set; } + + /// + /// 专业标签 + /// + public string MajorTag { get; set; } + + /// + /// 专家简介 + /// + public string Summery { get; set; } + + /// + /// 咨询领域 + /// + public string BusinessScope { get; set; } + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } + + + + + + + + public class SpecialObjectDto + { + public int code { get; set; } + public string msg { get; set; } + + public Data data { get; set; } + public int count { get; set; } + } + + + public class Data + { + public List data { get; set; } + public int count { get; set; } + } + + public class Datum + { + public string browse_count { get; set; } + public string image { get; set; } + public string title { get; set; } + public int type { get; set; } + public int sort { get; set; } + public long sales { get; set; } + public int is_light { get; set; } + public int light_type { get; set; } + public int is_mer_visible { get; set; } + public string money { get; set; } + public string member_money { get; set; } + public int subject_id { get; set; } + public int pay_type { get; set; } + public string[] label { get; set; } + public int id { get; set; } + public int fake_sales { get; set; } + public string add_time { get; set; } + public int count { get; set; } + + public string url { get; set; } + } + + +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialistGroup/Dto/SpecialTypeDTO.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialistGroup/Dto/SpecialTypeDTO.cs new file mode 100644 index 0000000..c1517fe --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusSpecialistGroup/Dto/SpecialTypeDTO.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + public class SpecialTypeResponseDTO + { + public string Code { get; set; } + public string Name { get; set; } + } + + public class SpecialTypeRequestDTO + { + public long TypeId { get; set; } + } + +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentScaleResults/BusStudentScaleResultsService.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentScaleResults/BusStudentScaleResultsService.cs new file mode 100644 index 0000000..1115b8d --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentScaleResults/BusStudentScaleResultsService.cs @@ -0,0 +1,141 @@ +using Admin.NET.Core; +using Furion.DatabaseAccessor; + +using Furion.DependencyInjection; +using Furion.DynamicApiController; +using Furion.FriendlyException; +using Mapster; +using Microsoft.AspNetCore.Mvc; + +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// 学生量表结果表服务 + /// + [ApiDescriptionSettings("测评服务", Name = "BusStudentScaleResults", Order = 100)] + public class BusStudentScaleResultsService : IDynamicApiController, ITransient + { + private readonly SqlSugarRepository _busStudentScaleResultsRep; + private readonly SqlSugarRepository _busScaleRep; + private readonly UserManager _userManager; + + public BusStudentScaleResultsService( + SqlSugarRepository busScaleRep, + SqlSugarRepository busStudentScaleResultsRep, + UserManager userManager + ) + { + _busScaleRep = busScaleRep; + _busStudentScaleResultsRep = busStudentScaleResultsRep; + _userManager = userManager; + } + + /// + /// 分页查询学生量表结果表 + /// + /// + /// + [HttpGet("page")] + public async Task> Page([FromQuery] BusStudentScaleResultsInput input) + { + var busStudentScaleResultss = await _busStudentScaleResultsRep.AsQueryable() + .Where(u => u.SysOauthUserId == input.SysOauthUserId) + .WhereIF(input.ScaleId > 0, u => u.ScaleId == input.ScaleId) + .WhereIF(!string.IsNullOrEmpty(input.Result), u => u.Result == input.Result) + .Where(u => u.TenantId == _userManager.TenantId) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .OrderBuilder(input) + .Select(s => new BusStudentScaleResultsOutput() + { + SysOauthUserId = s.SysOauthUserId, + ScaleId = s.ScaleId, + Result = s.Result, + TenantId = s.TenantId.Value, + Id = s.Id + + + }) + .ToPagedListAsync(input.Page, input.PageSize); + + return busStudentScaleResultss; + } + + /// + /// 增加学生量表结果表 + /// + /// + /// + [HttpPost("add")] + public async Task Add(AddBusStudentScaleResultsInput input) + { + var busStudentScaleResults = input.Adapt(); + await _busStudentScaleResultsRep.InsertAsync(busStudentScaleResults); + } + + /// + /// 删除学生量表结果表 + /// + /// + /// + [HttpPost("delete")] + public async Task Delete(DeleteBusStudentScaleResultsInput input) + { + var busStudentScaleResults = await _busStudentScaleResultsRep.AsQueryable().FirstAsync(u => u.Id == input.Id); + await _busStudentScaleResultsRep.FakeDeleteAsync(busStudentScaleResults); + } + + /// + /// 更新学生量表结果表 + /// + /// + /// + [HttpPost("edit")] + public async Task Update(UpdateBusStudentScaleResultsInput input) + { + var isExist = await _busStudentScaleResultsRep.AsQueryable().AnyAsync(u => u.Id == input.Id); + if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3000); + + var busStudentScaleResults = input.Adapt(); + await _busStudentScaleResultsRep.UpdateAsync(busStudentScaleResults); + } + + /// + /// 获取学生量表结果表 + /// + /// + /// + [HttpGet("detail")] + public async Task Get([FromQuery] QueryeBusStudentScaleResultsInput input) + { + return (await _busStudentScaleResultsRep.AsQueryable().FirstAsync(u => u.Id == input.Id)).Adapt(); + } + + /// + /// 获取学生量表结果表列表 + /// + /// + /// + [HttpGet("list")] + public async Task> List([FromQuery] BusStudentScaleResultsInput input) + { + return await _busStudentScaleResultsRep.AsQueryable().Select().ToListAsync(); + } + + /// + /// 获取BusScale列表 + /// + /// + [HttpGet("fkBusScale")] + public async Task FkBusScaleList() + { + var list = await _busScaleRep.AsQueryable().ToListAsync(); + return list.Select(e => new { Code = e.Id, Name = e.Name }); + } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentScaleResults/Dto/BusStudentScaleResultsDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentScaleResults/Dto/BusStudentScaleResultsDto.cs new file mode 100644 index 0000000..258a47e --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentScaleResults/Dto/BusStudentScaleResultsDto.cs @@ -0,0 +1,41 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 学生量表结果表输出参数 + /// + public class BusStudentScaleResultsDto + { + /// + /// 量表名称 + /// + public string BusScaleName { get; set; } + + /// + /// 学生Id + /// + public long SysOauthUserId { get; set; } + + /// + /// 量表名称 + /// + public long ScaleId { get; set; } + + /// + /// 测试结果 + /// + public string Result { get; set; } + + /// + /// 租户id + /// + public long TenantId { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentScaleResults/Dto/BusStudentScaleResultsInput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentScaleResults/Dto/BusStudentScaleResultsInput.cs new file mode 100644 index 0000000..79da308 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentScaleResults/Dto/BusStudentScaleResultsInput.cs @@ -0,0 +1,56 @@ +using Admin.NET.Core; +using System; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application +{ + /// + /// 学生量表结果表输入参数 + /// + public class BusStudentScaleResultsInput : BasePageInput + { + /// + /// 学生Id + /// + public virtual long SysOauthUserId { get; set; } + + /// + /// 量表名称 + /// + public virtual long ScaleId { get; set; } + + /// + /// 测试结果 + /// + public virtual string Result { get; set; } + + /// + /// 租户id + /// + public virtual long TenantId { get; set; } + + } + + public class AddBusStudentScaleResultsInput : BusStudentScaleResultsInput + { + } + + public class DeleteBusStudentScaleResultsInput : BaseIdInput + { + } + + public class UpdateBusStudentScaleResultsInput : BusStudentScaleResultsInput + { + /// + /// Id主键 + /// + [Required(ErrorMessage = "Id主键不能为空")] + public long Id { get; set; } + + } + + public class QueryeBusStudentScaleResultsInput : BaseIdInput + { + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentScaleResults/Dto/BusStudentScaleResultsOutput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentScaleResults/Dto/BusStudentScaleResultsOutput.cs new file mode 100644 index 0000000..0d358ff --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentScaleResults/Dto/BusStudentScaleResultsOutput.cs @@ -0,0 +1,36 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 学生量表结果表输出参数 + /// + public class BusStudentScaleResultsOutput + { + /// + /// 学生Id + /// + public long SysOauthUserId { get; set; } + + /// + /// 量表名称 + /// + public long ScaleId { get; set; } + + /// + /// 测试结果 + /// + public string Result { get; set; } + + /// + /// 租户id + /// + public long TenantId { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/BusStudentsFramilyService.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/BusStudentsFramilyService.cs new file mode 100644 index 0000000..f30febf --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/BusStudentsFramilyService.cs @@ -0,0 +1,373 @@ +using Admin.NET.Core; +using Admin.NET.Core.Service; +using Elastic.Transport; +using Furion; +using Furion.DatabaseAccessor; + +using Furion.DataEncryption; +using Furion.DependencyInjection; +using Furion.DynamicApiController; +using Furion.FriendlyException; +using Mapster; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; + +using SKIT.FlurlHttpClient.Wechat.Api; +using SKIT.FlurlHttpClient.Wechat.Api.Models; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// 家长信息表服务 + /// + [ApiDescriptionSettings("测评服务", Name = "BusStudentsFramily", Order = 100)] + public class BusStudentsFramilyService : IDynamicApiController, ITransient + { + private readonly SqlSugarRepository _busStudentsFramilyRep; + private readonly IHttpContextAccessor _httpContextAccessor; + private readonly WechatApiClient _wechatApiClient; + private readonly UserManager _userManager; + private readonly SysConfigService _sysConfigService; + + + /// + /// + /// + /// + /// + /// + /// + public BusStudentsFramilyService( + SqlSugarRepository busStudentsFramilyRep, IHttpContextAccessor httpContextAccessor, WechatApiClientFactory wechatApiHttpClient, + UserManager userManager, SysConfigService sysConfigService + ) + { + _busStudentsFramilyRep = busStudentsFramilyRep; + _httpContextAccessor = httpContextAccessor; + _wechatApiClient = wechatApiHttpClient.CreateWxOpenClient(); + _userManager = userManager; + _sysConfigService = sysConfigService; + } + + /// + /// 分页查询家长信息表 + /// + /// + /// + [HttpGet("page")] + public async Task> Page([FromQuery] BusStudentsFramilyInput input) + { + var busStudentsFramilys = await _busStudentsFramilyRep.AsQueryable() + //.Where(!string.IsNullOrEmpty(input.Uuid), u => u.Uuid == input.Uuid) + .WhereIF(!string.IsNullOrEmpty(input.Phone), u => u.Phone == input.Phone) + .WhereIF(!string.IsNullOrEmpty(input.NickName), u => u.NickName == input.NickName) + // .Where(u => u.framilyRole == input.framilyRole) + // .Where(u => u.Sort == input.Sort) + .Where(u => u.TenantId == _userManager.TenantId) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .OrderBuilder(input) + .Select(s => new BusStudentsFramilyOutput() + { + Uuid = s.Uuid, + Phone = s.Phone, + NickName = s.NickName, + framilyRole = s.framilyRole, + Sort = s.Sort, + TenantId = s.TenantId.Value, + Id = s.Id + }) + .ToPagedListAsync(input.Page, input.PageSize); + + return busStudentsFramilys; + } + + /// + /// 增加家长信息表 + /// + /// + /// + [HttpPost("add")] + public async Task Add(AddBusStudentsFramilyInput input) + { + var busStudentsFramily = input.Adapt(); + await _busStudentsFramilyRep.InsertAsync(busStudentsFramily); + } + + /// + /// 删除家长信息表 + /// + /// + /// + [HttpPost("delete")] + public async Task Delete(DeleteBusStudentsFramilyInput input) + { + var busStudentsFramily = await _busStudentsFramilyRep.AsQueryable().FirstAsync(u => u.Id == input.Id); + await _busStudentsFramilyRep.FakeDeleteAsync(busStudentsFramily); + } + + /// + /// 更新家长信息表 + /// + /// + /// + [HttpPost("edit")] + public async Task Update(UpdateBusStudentsFramilyInput input) + { + var isExist = await _busStudentsFramilyRep.AsQueryable().AnyAsync(u => u.Id == input.Id); + if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3000); + + var busStudentsFramily = input.Adapt(); + await _busStudentsFramilyRep.UpdateAsync(busStudentsFramily); + } + + /// + /// 获取家长信息表 + /// + /// + /// + [HttpGet("detail")] + public async Task Get([FromQuery] QueryeBusStudentsFramilyInput input) + { + return (await _busStudentsFramilyRep.AsQueryable().FirstAsync(u => u.Id == input.Id)).Adapt(); + } + + /// + /// 获取家长信息表列表 + /// + /// + /// + [HttpGet("list")] + public async Task> List([FromQuery] BusStudentsFramilyInput input) + { + return await _busStudentsFramilyRep.AsQueryable(). + Select(s => new BusStudentsFramilyOutput() + { + Uuid = s.Uuid, + Phone = s.Phone, + NickName = s.NickName, + framilyRole = s.framilyRole, + Sort = s.Sort, + TenantId = s.TenantId.Value, + Id = s.Id + }) + .ToListAsync(); + } + + + + /// + /// 获取微信openid + /// + /// + /// + [HttpPost("WeChatOauth")] + [AllowAnonymous] + public async Task WeChatOauth(WeChatRequestDto requestDto) + { + var weChatResposeDto = new WeChatResposeDto(); + var reqJsCode2Session = new SnsJsCode2SessionRequest() + { + JsCode = requestDto.Code, + }; + var resCode2Session = await _wechatApiClient.ExecuteSnsJsCode2SessionAsync(reqJsCode2Session); + if (resCode2Session.ErrorCode != (int)WechatReturnCodeEnum.请求成功) + throw Oops.Oh(resCode2Session.ErrorMessage + " " + resCode2Session.ErrorCode); + + var wxUser = new BusStudentsFramily() + { + + Uuid = resCode2Session.OpenId + }; + var any = await _busStudentsFramilyRep.AsQueryable() + .AnyAsync(u => u.Uuid.Equals(resCode2Session.OpenId) && !u.IsDelete); + if (any) + { + wxUser = await _busStudentsFramilyRep.AsQueryable().Where(c => c.Uuid.Equals(resCode2Session.OpenId) && !c.IsDelete) + .FirstAsync(c => c.Uuid == resCode2Session.OpenId && c.TenantId > 0); + } + else + { + wxUser.TenantId = 1300000000001;//默认初始化租户,后期卖给其他机构需定向传值 + // 生成Token令牌 + await _busStudentsFramilyRep.InsertAsync(wxUser); + } + var tokenExpire = await _sysConfigService.GetTokenExpire(); + var accessToken = JWTEncryption.Encrypt(new Dictionary + { + { ClaimConst.UserId, wxUser.Id }, + { ClaimConst.NickName, wxUser.NickName }, + { ClaimConst.LoginMode, LoginModeEnum.APP }, + }, tokenExpire); + // 设置Swagger自动登录 + _httpContextAccessor.HttpContext.SigninToSwagger(accessToken); + + weChatResposeDto.Token = accessToken; + weChatResposeDto.OpenId = resCode2Session.OpenId; + weChatResposeDto.Session_key = resCode2Session.SessionKey; + weChatResposeDto.Id = wxUser.Id; + return weChatResposeDto; + } + + + + + /// + /// 获取用户手机号信息 + /// + /// + /// + [HttpPost] + public async Task GetUserPhonenumber(EnGetPhoneRequestDto dto) + { + bool status = false; + try + { + //var getaccessinfo = WeChatUtil.GetAccess_token(WeChatConst.Appid, WeChatConst.Key); + //var phoneinfo = WeChatUtil.GetUserPhonenumber(getaccessinfo.access_token, JsonUtil.ToJson(new PhoneRequestDto() { code = dto.Code })); + var accessToken = await GetCgibinToken(); + var reqUserPhoneNumber = new WxaBusinessGetUserPhoneNumberRequest() + { + Code = dto.Code, + AccessToken = accessToken, + }; + var resUserPhoneNumber = await _wechatApiClient.ExecuteWxaBusinessGetUserPhoneNumberAsync(reqUserPhoneNumber); + if (resUserPhoneNumber.ErrorCode != (int)WechatReturnCodeEnum.请求成功) + throw Oops.Oh(resUserPhoneNumber.ErrorMessage + " " + resUserPhoneNumber.ErrorCode); + var oauthinfo = await _busStudentsFramilyRep.AsQueryable().FirstAsync(c => c.Uuid == dto.OpenId && c.TenantId > 0); + if (oauthinfo != null) + { + // DingHookHelper.DingTalkHookMessage("SysOauthUserService", string.Format("code:{0};--jsons{1}", dto.Code, JsonUtil.ToJson(phoneinfo))); + oauthinfo.Phone = resUserPhoneNumber.PhoneInfo?.PhoneNumber; + oauthinfo.Avatar = "https://lwpostgradute.oss-cn-hangzhou.aliyuncs.com/defaultAvatarUrl.png"; + oauthinfo.NickName = "家长" + new Random().Next(832468, 999999); + await _busStudentsFramilyRep.UpdateAsync(oauthinfo); + status = true; + } + + } + catch (Exception ex) + { + throw Oops.Oh(ex.Message).StatusCode(200); + } + + return status; + } + + + /// + /// 获取Access_token + /// + private async Task GetCgibinToken() + { + var reqCgibinToken = new CgibinTokenRequest(); + var resCgibinToken = await _wechatApiClient.ExecuteCgibinTokenAsync(reqCgibinToken); + if (resCgibinToken.ErrorCode != (int)WechatReturnCodeEnum.请求成功) + throw Oops.Oh(resCgibinToken.ErrorMessage + " " + resCgibinToken.ErrorCode); + return resCgibinToken.AccessToken; + } + + + + /// + /// 保存用户信息并解密手机号 + /// + /// + /// + //[HttpPost] + ////[AllowAnonymous] + //public async Task EncryptedInfo(EncryptedDto encryptedDto) + //{ + // string phone = string.Empty; + // try + // { + + // var accessToken = await GetCgibinToken(); + // var reqUserPhoneNumber = new WxaBusinessGetUserPhoneNumberRequest() + // { + // Code = encryptedDto.code, + // AccessToken = accessToken, + // }; + // var resUserPhoneNumber = await _wechatApiClient.ExecuteWxaBusinessGetUserPhoneNumberAsync(reqUserPhoneNumber); + // if (resUserPhoneNumber.ErrorCode != (int)WechatReturnCodeEnum.请求成功) + // throw Oops.Oh(resUserPhoneNumber.ErrorMessage + " " + resUserPhoneNumber.ErrorCode); + + // var result = WeChatUtil.Code2Session(WeChatConst.Appid, WeChatConst.Key, encryptedDto.code); + // var any = await _busStudentsFramilyRep.AsQueryable().AnyAsync(c => c.Uuid == encryptedDto.openId && !c.IsDelete); + // if (any) + // { + // var single = await _busStudentsFramilyRep.AsQueryable().FirstAsync(c => c.Uuid == encryptedDto.openId && !c.IsDelete); + // single.Phone = resUserPhoneNumber.PhoneInfo?.PhoneNumber; + // single.Avatar = "https://lwpostgradute.oss-cn-hangzhou.aliyuncs.com/defaultAvatarUrl.png"; + // single.NickName = "家长" + new Random().Next(832468, 999999); + // await _busStudentsFramilyRep.UpdateAsync(single); + // } + // else + // { + // await _busStudentsFramilyRep.InsertAsync(new BusStudentsFramily() + // { + // Avatar = "https://lwpostgradute.oss-cn-hangzhou.aliyuncs.com/defaultAvatarUrl.png", + // // Gender = encryptedDto.gender.ToString(), + // NickName = "家长" + new Random().Next(832468, 999999), + // Phone = resUserPhoneNumber.PhoneInfo?.PhoneNumber, + // TenantId = 1300000000001,//默认初始化租户,后期卖给其他机构需定向传值 + // Uuid = encryptedDto.openId, + // // Source = "小程序" + // }); + + // } + // } + // catch (Exception ex) + // { + // throw Oops.Oh(ex.Message); + // } + + + //} + + + + + /// + /// 清空缓存后下次登录返回用户信息 + /// + /// + /// + [HttpGet("WeChatLogin")] + [AllowAnonymous] + public async Task WeChatLogin([FromQuery] WeChatRequestDto weChatLogin) + { + var user = new WchatOauthDto(); + var reqJsCode2Session = new SnsJsCode2SessionRequest() + { + JsCode = weChatLogin.Code, + }; + var resCode2Session = await _wechatApiClient.ExecuteSnsJsCode2SessionAsync(reqJsCode2Session); + if (resCode2Session.ErrorCode != (int)WechatReturnCodeEnum.请求成功) + throw Oops.Oh(resCode2Session.ErrorMessage + " " + resCode2Session.ErrorCode); + var wxUser = await _busStudentsFramilyRep.AsQueryable() + .Where(u => u.Uuid.Equals(resCode2Session.OpenId) && !u.IsDelete) + .FirstAsync(); + _ = wxUser ?? throw Oops.Oh(ErrorCodeEnum.D1002).StatusCode(200); + user.Id = wxUser.Id; + user.TenantId = wxUser.TenantId.Value; + user.OpenId = wxUser.Uuid; + var tokenExpire = await _sysConfigService.GetTokenExpire(); + var accessToken = JWTEncryption.Encrypt(new Dictionary + { + { ClaimConst.UserId, wxUser.Id }, + { ClaimConst.RealName, wxUser.NickName }, + { ClaimConst.LoginMode, LoginModeEnum.APP }, + }, tokenExpire); + user.AccessToken = accessToken; + return user; + } + + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/Dto/BusStudentsFramilyDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/Dto/BusStudentsFramilyDto.cs new file mode 100644 index 0000000..023cdfb --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/Dto/BusStudentsFramilyDto.cs @@ -0,0 +1,46 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 家长信息表输出参数 + /// + public class BusStudentsFramilyDto + { + /// + /// UUID + /// + public string Uuid { get; set; } + + /// + /// 家长手机号 + /// + public string Phone { get; set; } + + /// + /// 昵称 + /// + public string NickName { get; set; } + + /// + /// 亲属角色 + /// + public FramilyRoleEnum framilyRole { get; set; } + + /// + /// 数据排序 + /// + public int Sort { get; set; } + + /// + /// 租户id + /// + public long TenantId { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/Dto/BusStudentsFramilyInput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/Dto/BusStudentsFramilyInput.cs new file mode 100644 index 0000000..7f99143 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/Dto/BusStudentsFramilyInput.cs @@ -0,0 +1,66 @@ +using Admin.NET.Core; +using System; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application +{ + /// + /// 家长信息表输入参数 + /// + public class BusStudentsFramilyInput : BasePageInput + { + /// + /// UUID + /// + public virtual string Uuid { get; set; } + + /// + /// 家长手机号 + /// + public virtual string Phone { get; set; } + + /// + /// 昵称 + /// + public virtual string NickName { get; set; } + + /// + /// 亲属角色 + /// + public virtual FramilyRoleEnum framilyRole { get; set; } + + /// + /// 数据排序 + /// + public virtual int Sort { get; set; } + + /// + /// 租户id + /// + public virtual long TenantId { get; set; } + + } + + public class AddBusStudentsFramilyInput : BusStudentsFramilyInput + { + } + + public class DeleteBusStudentsFramilyInput : BaseIdInput + { + } + + public class UpdateBusStudentsFramilyInput : BusStudentsFramilyInput + { + /// + /// Id主键 + /// + [Required(ErrorMessage = "Id主键不能为空")] + public long Id { get; set; } + + } + + public class QueryeBusStudentsFramilyInput : BaseIdInput + { + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/Dto/BusStudentsFramilyOutput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/Dto/BusStudentsFramilyOutput.cs new file mode 100644 index 0000000..59a1d85 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/Dto/BusStudentsFramilyOutput.cs @@ -0,0 +1,51 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 家长信息表输出参数 + /// + public class BusStudentsFramilyOutput + { + /// + /// UUID + /// + public string Uuid { get; set; } + + /// + /// 家长手机号 + /// + public string Phone { get; set; } + + /// + /// 昵称 + /// + public string NickName { get; set; } + + /// + /// 亲属角色 + /// + public FramilyRoleEnum framilyRole { get; set; } + + /// + /// 数据排序 + /// + public int Sort { get; set; } + + /// + /// 租户id + /// + public long TenantId { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + /// + /// + /// + public DateTimeOffset? CreatedTime { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/Dto/EncryptedDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/Dto/EncryptedDto.cs new file mode 100644 index 0000000..4c54d40 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/Dto/EncryptedDto.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// + /// + public class EncryptedDto: GetPhoneInfo + { + /// + /// 用户头像 + /// + public string avatarUrl { get; set; } + + public string nickName { get; set; } + + public int gender { get; set; } + + public string phone { get; set; } + + + + } + + + + /// + /// + /// + public class EnGetPhoneRequestDto + { + /// + /// + /// + public string OpenId { get; set; } + + /// + /// + /// + public string Code { get; set; } + + /// + /// 助力好友时传入此值 + /// + public long OrgUserId { get; set; } + + } + + + /// + /// + /// + public class PhoneRequestDto + { + /// + /// + /// + public string code { get; set; } + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/Dto/WchatOauthDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/Dto/WchatOauthDto.cs new file mode 100644 index 0000000..3f854cd --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/Dto/WchatOauthDto.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + + /// + /// + /// + public class WchatOauthDto + { + + /// + /// UUID + /// + public string OpenId { get; set; } + + /// + /// Token + /// + public string AccessToken { get; set; } + + /// + /// 昵称 + /// + public string NickName { get; set; } + + /// + /// 头像 + /// + public string Avatar { get; set; } + + + /// + /// 电话 + /// + public string Phone { get; set; } + + + + /// + /// 租户id + /// + public long TenantId { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/Dto/WeChatOauthinfo.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/Dto/WeChatOauthinfo.cs new file mode 100644 index 0000000..055ca88 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/Dto/WeChatOauthinfo.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// + /// + public class WeChatOauthinfo + { + public string openid { get; set; } + public string session_key { get; set; } + public string unionid { get; set; } + public string errcode { get; set; } + public string errmsg { get; set; } + + } + + + public class UserPhone_Info + { + public int errcode { get; set; } + public string errmsg { get; set; } + public Phone_Info phone_info { get; set; } + } + + public class Phone_Info + { + public string phoneNumber { get; set; } + public string purePhoneNumber { get; set; } + public int countryCode { get; set; } + public Watermark watermark { get; set; } + } + + public class Watermark + { + public int timestamp { get; set; } + public string appid { get; set; } + } + + + public class AccessTokenResult + { + /// + /// 获取到的凭证 + /// + public string? access_token { get; set; } + /// + /// 凭证有效时间,单位:秒。目前是7200秒之内的值。 + /// + public long expires_in { get; set; } + /// + /// 错误码 + /// + public long errcode { get; set; } + /// + /// 错误信息 + /// + public string? errmsg { get; set; } + } + + public class GetPhoneInfo + { + public string encryptedData { get; set; } + + public string iv { get; set; } + + public string openId { get; set; } + + + public string code { get; set; } + public string session_key { get; set; } + } + + public class WeChatModel + { + public string appId { get; set; } + public string nonceStr { get; set; } + public string package { get; set; } + public string signType { get; set; } + public string timeStamp { get; set; } + } + + public class WeChatPayRespose + { + public string appid { get; set; } + public string mchi_id { get; set; } + public string device_info { get; set; } + public string nonce_str { get; set; } + public string sign { get; set; } + public string result_code { get; set; } + public string err_code { get; set; } + public string err_code_des { get; set; } + public string trade_type { get; set; } + public string prepay_id { get; set; } + public string code_url { get; set; } + public string timeStamp { get; set; } + public string orderid { get; set; } + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/Dto/WeChatRequestDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/Dto/WeChatRequestDto.cs new file mode 100644 index 0000000..616da7f --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/Dto/WeChatRequestDto.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// + /// + public class WeChatRequestDto + { + /// + /// + /// + public string Code { get; set; } + + /// + /// + /// + public long TenantId { get; set; } + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/Dto/WeChatResposeDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/Dto/WeChatResposeDto.cs new file mode 100644 index 0000000..a83407f --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsFramily/Dto/WeChatResposeDto.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// + /// + public class WeChatResposeDto + { + /// + /// 用户主键ID + /// + public long Id { get; set; } + /// + /// + /// + public string OpenId { get; set; } + + /// + /// + /// + public string Token { get; set; } + + /// + /// + /// + public long TenantId { get; set; } + + + /// + /// + /// + public string Session_key{ get; set; } + + /// + /// + /// + public string AccessToken { get; set; } + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsReports/BusStudentsReportsService.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsReports/BusStudentsReportsService.cs new file mode 100644 index 0000000..7d1537a --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsReports/BusStudentsReportsService.cs @@ -0,0 +1,173 @@ +using Admin.NET.Core; +using Flurl.Http; +using Furion.DatabaseAccessor; +using Furion.DependencyInjection; +using Furion.DynamicApiController; +using Microsoft.AspNetCore.Components.Forms; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Configuration; +using StackExchange.Redis; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application.Service +{ + /// + /// 学生报告服务 + /// + [ApiDescriptionSettings("测评服务", Name = "BusStudentsReportsService", Order = 100)] + public class BusStudentsReportsService : IDynamicApiController, ITransient + { + + private readonly IConfiguration _configuration; + private readonly SqlSugarRepository _busFramilyMapStudentsRep; + private readonly SqlSugarRepository _busStudentsRep; + private readonly static string SeKey = "3c1cbc3f546eda35168c3aa3cb91780fbe703f0996c6d123ea96dc85c70bbc0a8e70006ae6b35eb3962ad057f41a1690"; + /// + /// + /// + public BusStudentsReportsService(IConfiguration configuration, SqlSugarRepository framilyMapStudentsRep, SqlSugarRepository busStudentsRep) + { + _configuration = configuration; + _busFramilyMapStudentsRep = framilyMapStudentsRep; + _busStudentsRep = busStudentsRep; + } + + + + /// + /// 获取报告列表 + /// + /// + /// + [HttpGet("list")] + public async Task> List([FromQuery] BusStudentsReportsInputDto input) + { + var res = new List(); + var ulrs = _configuration["WebApi:url"].ToString() + "/UserCenters/GetMobileResult"; + var framilyInfo = await _busStudentsRep.AsQueryable().FirstAsync(c => c.Uuid == input.UuId); + var framilysingle = await _busFramilyMapStudentsRep.AsQueryable().SingleAsync(x => x.FramilyId == framilyInfo.Id && x.StudentId.ToString() == input.StudentId); + if (framilysingle == null) + { + return new List() + { + + }; + } + string guid = input.StudentId.ToString().ToUpper(); + var flurlresponse = await ulrs.PostJsonAsync(new MobileStudentsReportsRequestDto { Key = SeKey, Type = input.Type, StudentId = guid }); + var response = await flurlresponse.GetJsonAsync>(); + return response; + } + + + /// + /// 获取生涯报告 + /// + /// + /// + [HttpGet("GetCarrerReport")] + public async Task GetCarrerReport([FromQuery] ReportInputDto inputDto) + { + var ulrs = _configuration["WebApi:url"].ToString() + "/UserCenters/GetCarrerResult"; + var framilyInfo = await _busStudentsRep.AsQueryable().FirstAsync(c => c.Uuid == inputDto.UUID); + var framilysingle = await _busFramilyMapStudentsRep.AsQueryable().SingleAsync(x => x.FramilyId == framilyInfo.Id && x.StudentId.ToString() == inputDto.StudentId); + if (framilysingle == null) + { + return new BusCarrerReports() + { + + }; + } + string guid = inputDto.StudentId.ToString().ToUpper(); + var flurlResponse = await ulrs.PostJsonAsync(new ReportInputDto { Key = SeKey, Type = inputDto.Type, StudentId = guid, ReportId = inputDto.ReportId, CycName = inputDto.CycName }); + var response = await flurlResponse.GetJsonAsync(); + return response; + } + + + + /// + /// 专业定位报告 + /// + /// + /// + [HttpGet("GetMajorPostionResult")] + public async Task GetMajorPostionResult([FromQuery] ReportInputDto inputDto) + { + var ulrs = _configuration["WebApi:url"].ToString() + "/UserCenters/GetMajorPostionResult"; + var framilyInfo = await _busStudentsRep.AsQueryable().FirstAsync(c => c.Uuid == inputDto.UUID); + var framilysingle = await _busFramilyMapStudentsRep.AsQueryable().SingleAsync(x => x.FramilyId == framilyInfo.Id && x.StudentId.ToString() == inputDto.StudentId); + if (framilysingle == null) + { + return new HollandReportDTO() + { + + }; + } + string guid = inputDto.StudentId.ToString().ToUpper(); + var flUrlResponse = await ulrs.PostJsonAsync(new ReportInputDto { Key = SeKey, Type = inputDto.Type, StudentId = guid, ReportId = inputDto.ReportId }); + var response = await flUrlResponse.GetJsonAsync(); + return response; + } + + + + /// + /// 学生发展报告 + /// + /// + /// + [HttpGet("GetStudentDevelopMentResult")] + public async Task GetStudentDevelopMentResult([FromQuery] ReportInputDto inputDto) + { + var ulrs = _configuration["WebApi:url"].ToString() + "/UserCenters/GetStudentDevelopMentResult"; + var framilyInfo = await _busStudentsRep.AsQueryable().FirstAsync(c => c.Uuid == inputDto.UUID); + var framilysingle = await _busFramilyMapStudentsRep.AsQueryable().SingleAsync(x => x.FramilyId == framilyInfo.Id && x.StudentId.ToString() == inputDto.StudentId); + if (framilysingle == null) + { + return new DevelopMentReportDto() + { + + }; + } + string guid = inputDto.StudentId.ToString().ToUpper(); + var flUrlresponse = await ulrs.PostJsonAsync(new ReportInputDto { Key = SeKey, Type = inputDto.Type, StudentId = guid, ReportId = inputDto.ReportId, CycName = inputDto.CycName }); + + var response = await flUrlresponse.GetJsonAsync(); + return response; + } + + + + /// + /// 心理健康报告 + /// + /// + /// + [HttpGet("GetMentalHealthResult")] + public async Task GetMentalHealthResult([FromQuery] ReportInputDto inputDto) + { + var ulrs = _configuration["WebApi:url"].ToString() + "/UserCenters/GetMentalHealthResult"; + var framilyInfo = await _busStudentsRep.AsQueryable().FirstAsync(c => c.Uuid == inputDto.UUID); + var framilysingle = await _busFramilyMapStudentsRep.AsQueryable().SingleAsync(x => x.FramilyId == framilyInfo.Id && x.StudentId.ToString() == inputDto.StudentId); + if (framilysingle == null) + { + return new DevelopMentReportDto() + { + + }; + } + string guid = inputDto.StudentId.ToString().ToUpper(); + var flurResponse = await ulrs.PostJsonAsync(new ReportInputDto { Key = SeKey, Type = inputDto.Type, StudentId = guid, ReportId = inputDto.ReportId, CycName = inputDto.CycName }); + var response = await flurResponse.GetJsonAsync(); + return response; + } + + + } + +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsReports/DTO/BusStudentsReportsInputDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsReports/DTO/BusStudentsReportsInputDto.cs new file mode 100644 index 0000000..064d8d4 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsReports/DTO/BusStudentsReportsInputDto.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + + /// + /// + /// + public class BusStudentsReportsInputDto + { + /// + /// 家长UUID + /// + public string UuId { get; set; } + + /// + ///类型0 生涯,1专业定位 2 学生发展 3 心理健康 + /// + public int Type { get; set; } + + /// + /// + /// + public string StudentId { get; set; } + + + + } + + + /// + /// + /// + public class MobileStudentsReportsRequestDto + { + + /// + /// 0 1 2 3 + /// + public int Type { get; set; } + + /// + /// 约定Key + /// + public string Key { get; set; } + + + /// + /// 学生Id + /// + public string StudentId { get; set; } + + + + } + + + + +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsReports/DTO/BusStudentsReportsOutDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsReports/DTO/BusStudentsReportsOutDto.cs new file mode 100644 index 0000000..ce7e5aa --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsReports/DTO/BusStudentsReportsOutDto.cs @@ -0,0 +1,189 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + + /// + /// + /// + public class BusStudentsReportsOutDto + { + public string Code { get; set; } + public string Msg { get; set; } + public List Result { get; set; } + + + } + + + + /// + /// + /// + public class BusStudentsReportResult + { + public string YD_GradeName { get; set; } + public string YD_ClassName { get; set; } + public string YD_CycleName { get; set; } + public string YD_CycleTimeId { get; set; } + public DateTime YD_CreateDate { get; set; } + } + + /// + /// + /// + public class BaseOutDto + { + public string Code { get; set; } + public bool Success { get; set; } + public string Message { get; set; } + public string MStudentCode { get; set; } + public string url { get; set; } + public int IsHigh { get; set; } + } + + + + + + + + + + + public class BusCarrerReports: BaseOutDto + { + public Evbills evBills { get; set; } + public Resulteval[] resultEvals { get; set; } + public Resultgrow[] resultGrows { get; set; } + + } + + public class Evbills + { + public string Name { get; set; } + public float[] BillDatas { get; set; } + public Billcator[] Billcators { get; set; } + public string[] EvalueLineName { get; set; } + public object categories { get; set; } + public object series { get; set; } + public object Data { get; set; } + } + + public class Billcator + { + public string text { get; set; } + public int max { get; set; } + } + + public class Resulteval + { + public string SmenuName { get; set; } + public string Content { get; set; } + } + + public class Resultgrow + { + public string SmenuName { get; set; } + public object Content { get; set; } + } + + + + + + + /// + /// + /// + public class HollandReportDTO : BaseOutDto + { + public Hollresult[] HollResults { get; set; } + public Hollandinfo HollandInfo { get; set; } + public string CycleName { get; set; } + + } + + public class Hollandinfo + { + public string Interest { get; set; } + public string Specialty { get; set; } + public string LikeSubject { get; set; } + public string LikeCareer { get; set; } + public string TargetUniversity { get; set; } + public bool IsForeign { get; set; } + public string AfterCareer { get; set; } + public string TagResult { get; set; } + public string SelectResult { get; set; } + public string Result { get; set; } + } + + public class Hollresult + { + public int R { get; set; } + public int I { get; set; } + public int A { get; set; } + public int S { get; set; } + public int E { get; set; } + public int C { get; set; } + public string Target { get; set; } + } + + + + + + + /// + /// + /// + public class DevelopMentReportDto + { + public string Code { get; set; } + public string Msg { get; set; } + public List Result { get; set; } + } + public class StudentDevelops + { + public int Code { get; set; } + /// + /// + /// + public string MenuName { get; set; } + + /// + /// + /// + public List intellects { get; set; } + + /// + /// 评价建议 + /// + public string Evaluate { get; set; } + + } + + + public class Result + { + public string MenuName { get; set; } + public Intellect[] intellects { get; set; } + + /// + /// 评价建议 + /// + public string Evaluate { get; set; } + } + + public class Intellect + { + public string name { get; set; } + public double value { get; set; } + } + + +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsReports/DTO/ReportInputDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsReports/DTO/ReportInputDto.cs new file mode 100644 index 0000000..10c95b5 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudentsReports/DTO/ReportInputDto.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + + /// + /// + /// + public class ReportInputDto + { + /// + /// 0 1 2 3 + /// + public int Type { get; set; } + + /// + /// 约定Key + /// + public string Key { get; set; } + + /// + /// + /// + public string ReportId { get; set; } + + + /// + /// + /// + public string UUID { get; set; } + + /// + /// 周期名称 + /// + public string CycName { get; set; } + + /// + /// + /// + public string StudentId { get; set; } + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyYears/BusStudyYearsService.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyYears/BusStudyYearsService.cs new file mode 100644 index 0000000..2739ed0 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyYears/BusStudyYearsService.cs @@ -0,0 +1,125 @@ +using Admin.NET.Core; +using Furion.DatabaseAccessor; +using Furion.DependencyInjection; +using Furion.DynamicApiController; +using Furion.FriendlyException; +using Mapster; +using Microsoft.AspNetCore.Mvc; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// 学年表服务 + /// + [ApiDescriptionSettings("测评服务", Name = "BusStudyYears", Order = 100)] + public class BusStudyYearsService : IDynamicApiController, ITransient + { + private readonly SqlSugarRepository _busStudyYearsRep; + private readonly UserManager _userManager; + public BusStudyYearsService( + SqlSugarRepository busStudyYearsRep, + UserManager userManager + ) + { + _busStudyYearsRep = busStudyYearsRep; + _userManager = userManager; + } + + /// + /// 分页查询学年表 + /// + /// + /// + [HttpGet("page")] + public async Task> Page([FromQuery] BusStudyYearsInput input) + { + var busStudyYearss = await _busStudyYearsRep.AsQueryable() + .WhereIF(!string.IsNullOrEmpty(input.Name), u => u.Name == input.Name) + //.Where(u => u.StartDays == input.StartDays) + //.Where(u => u.EndDays == input.EndDays) + //.Where(u => u.Status == input.Status) + //.Where(u => u.Sort == input.Sort) + .Where(u => u.TenantId == _userManager.TenantId) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .OrderBuilder(input) + .Select(s=>new BusStudyYearsOutput() { + Name=s.Name, + StartDays=s.StartDays, + EndDays=s.EndDays, + Status=s.Status, + Sort=s.Sort, + TenantId=s.TenantId.Value, + Id=s.Id + }) + .ToPagedListAsync(input.Page, input.PageSize); + + return busStudyYearss; + } + + /// + /// 增加学年表 + /// + /// + /// + [HttpPost("add")] + public async Task Add(AddBusStudyYearsInput input) + { + var busStudyYears = input.Adapt(); + await _busStudyYearsRep.InsertAsync(busStudyYears); + } + + /// + /// 删除学年表 + /// + /// + /// + [HttpPost("delete")] + public async Task Delete(DeleteBusStudyYearsInput input) + { + var busStudyYears = await _busStudyYearsRep.AsQueryable().FirstAsync(u => u.Id == input.Id); + await _busStudyYearsRep.FakeDeleteAsync(busStudyYears); + } + + /// + /// 更新学年表 + /// + /// + /// + [HttpPost("edit")] + public async Task Update(UpdateBusStudyYearsInput input) + { + var isExist = await _busStudyYearsRep.AsQueryable().AnyAsync(u => u.Id == input.Id); + if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3000); + + var busStudyYears = input.Adapt(); + await _busStudyYearsRep.UpdateAsync(busStudyYears); + } + + /// + /// 获取学年表 + /// + /// + /// + [HttpGet("detail")] + public async Task Get([FromQuery] QueryeBusStudyYearsInput input) + { + return (await _busStudyYearsRep.AsQueryable().FirstAsync(u => u.Id == input.Id)).Adapt(); + } + + /// + /// 获取学年表列表 + /// + /// + /// + [HttpGet("list")] + public async Task> List([FromQuery] BusStudyYearsInput input) + { + return await _busStudyYearsRep.AsQueryable().Select().ToListAsync(); + } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyYears/Dto/BusStudyYearsDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyYears/Dto/BusStudyYearsDto.cs new file mode 100644 index 0000000..08ee62a --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyYears/Dto/BusStudyYearsDto.cs @@ -0,0 +1,46 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 学年表输出参数 + /// + public class BusStudyYearsDto + { + /// + /// 学年名称 + /// + public string Name { get; set; } + + /// + /// 学年入学时间 + /// + public DateTime StartDays { get; set; } + + /// + /// 学年毕业时间 + /// + public DateTime EndDays { get; set; } + + /// + /// 学年状态 + /// + public int Status { get; set; } + + /// + /// 数据排序 + /// + public int Sort { get; set; } + + /// + /// 租户id + /// + public long TenantId { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyYears/Dto/BusStudyYearsInput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyYears/Dto/BusStudyYearsInput.cs new file mode 100644 index 0000000..53d95d8 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyYears/Dto/BusStudyYearsInput.cs @@ -0,0 +1,66 @@ +using Admin.NET.Core; +using System; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application +{ + /// + /// 学年表输入参数 + /// + public class BusStudyYearsInput : BasePageInput + { + /// + /// 学年名称 + /// + public virtual string Name { get; set; } + + /// + /// 学年入学时间 + /// + public virtual DateTime StartDays { get; set; } + + /// + /// 学年毕业时间 + /// + public virtual DateTime EndDays { get; set; } + + /// + /// 学年状态 + /// + public virtual int Status { get; set; } + + /// + /// 数据排序 + /// + public virtual int Sort { get; set; } + + /// + /// 租户id + /// + public virtual long TenantId { get; set; } + + } + + public class AddBusStudyYearsInput : BusStudyYearsInput + { + } + + public class DeleteBusStudyYearsInput : BaseIdInput + { + } + + public class UpdateBusStudyYearsInput : BusStudyYearsInput + { + /// + /// Id主键 + /// + [Required(ErrorMessage = "Id主键不能为空")] + public long Id { get; set; } + + } + + public class QueryeBusStudyYearsInput : BaseIdInput + { + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyYears/Dto/BusStudyYearsOutput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyYears/Dto/BusStudyYearsOutput.cs new file mode 100644 index 0000000..934c4ee --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyYears/Dto/BusStudyYearsOutput.cs @@ -0,0 +1,46 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 学年表输出参数 + /// + public class BusStudyYearsOutput + { + /// + /// 学年名称 + /// + public string Name { get; set; } + + /// + /// 学年入学时间 + /// + public DateTime StartDays { get; set; } + + /// + /// 学年毕业时间 + /// + public DateTime EndDays { get; set; } + + /// + /// 学年状态 + /// + public int Status { get; set; } + + /// + /// 数据排序 + /// + public int Sort { get; set; } + + /// + /// 租户id + /// + public long TenantId { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyabroadTimeAxis/BusStudyabroadTimeAxisService.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyabroadTimeAxis/BusStudyabroadTimeAxisService.cs new file mode 100644 index 0000000..6d4b995 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyabroadTimeAxis/BusStudyabroadTimeAxisService.cs @@ -0,0 +1,218 @@ +using Admin.NET.Core; +using Furion.DatabaseAccessor; +using Furion.DependencyInjection; +using Furion.DynamicApiController; +using Furion.FriendlyException; +using Mapster; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// 留学时间节点服务 + /// + [ApiDescriptionSettings("测评服务", Name = "BusStudyabroadTimeAxis", Order = 100)] + public class BusStudyabroadTimeAxisService : IDynamicApiController, ITransient + { + private readonly SqlSugarRepository _busStudyabroadTimeAxisRep; + private readonly SqlSugarRepository _bussysDict; + private readonly UserManager _userManager; + public BusStudyabroadTimeAxisService( + SqlSugarRepository busStudyabroadTimeAxisRep, + SqlSugarRepository bussysDict, + UserManager userManager + ) + { + _busStudyabroadTimeAxisRep = busStudyabroadTimeAxisRep; + _bussysDict = bussysDict; + _userManager = userManager; + } + + /// + /// 分页查询留学时间节点 + /// + /// + /// + [HttpGet("page")] + public async Task> Page([FromQuery] BusStudyabroadTimeAxisInput input) + { + var busStudyabroadTimeAxiss = await _busStudyabroadTimeAxisRep.AsQueryable() + .Where(u => u.CountryId == input.CountryId) + .WhereIF(!string.IsNullOrEmpty(input.TimeNode), u => u.TimeNode == input.TimeNode) + .WhereIF(!string.IsNullOrEmpty(input.EventName), u => u.EventName == input.EventName) + .WhereIF(!string.IsNullOrEmpty(input.Description), u => u.Description == input.Description) + .Where(u => u.Sort == input.Sort) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .OrderBuilder(input) + .Select(s => new BusStudyabroadTimeAxisOutput() + { + TimeNode = s.TimeNode, + EventName = s.EventName, + Description = s.Description, + Sort = s.Sort, + Id = s.Id + }) + .ToPagedListAsync(input.Page, input.PageSize); + + return busStudyabroadTimeAxiss; + } + + /// + /// 增加留学时间节点 + /// + /// + /// + [HttpPost("add")] + public async Task Add(AddBusStudyabroadTimeAxisInput input) + { + var busStudyabroadTimeAxis = input.Adapt(); + await _busStudyabroadTimeAxisRep.InsertAsync(busStudyabroadTimeAxis); + } + + /// + /// 删除留学时间节点 + /// + /// + /// + [HttpPost("delete")] + public async Task Delete(DeleteBusStudyabroadTimeAxisInput input) + { + var busStudyabroadTimeAxis = await _busStudyabroadTimeAxisRep.AsQueryable().FirstAsync(u => u.Id == input.Id); + await _busStudyabroadTimeAxisRep.FakeDeleteAsync(busStudyabroadTimeAxis); + } + + /// + /// 更新留学时间节点 + /// + /// + /// + [HttpPost("edit")] + public async Task Update(UpdateBusStudyabroadTimeAxisInput input) + { + var isExist = await _busStudyabroadTimeAxisRep.AsQueryable().AnyAsync(u => u.Id == input.Id); + if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3000); + + var busStudyabroadTimeAxis = input.Adapt(); + await _busStudyabroadTimeAxisRep.UpdateAsync(busStudyabroadTimeAxis); + } + + /// + /// 获取留学时间节点 + /// + /// + /// + [HttpGet("detail")] + public async Task Get([FromQuery] QueryeBusStudyabroadTimeAxisInput input) + { + return (await _busStudyabroadTimeAxisRep.AsQueryable().FirstAsync(u => u.Id == input.Id)).Adapt(); + } + + /// + /// 获取留学时间节点列表 + /// + /// + /// + [HttpGet("list")] + public async Task> List([FromQuery] BusStudyabroadTimeAxisInput input) + { + return await _busStudyabroadTimeAxisRep.AsQueryable().Select(s => new BusStudyabroadTimeAxisOutput() + { + TimeNode = s.TimeNode, + EventName = s.EventName, + Description = s.Description, + Sort = s.Sort, + Id = s.Id + + }).ToListAsync(); + } + + + + /// + /// 导入数据 + /// + /// + /// + [HttpPost("import")] + public async Task Imports(IFormFile file) + { + var list = InputExcelUtil.InputExcel(file); + var replist = new List(); + for (int i = 0; i < list.Count(); i++) + { + var item = list[i]; + replist.Add(new BusStudyabroadTimeAxis() + { + CountryId = 1007, + CreateTime = DateTime.Now, + CreateUserId = _userManager.UserId, + CreateUserName = _userManager.Account, + TimeNode = item.TimeNode, + EventName = item.EventName, + Description = item.Description, + Sort = item.Sort, + }); + } + await _busStudyabroadTimeAxisRep.InsertRangeAsync(replist); + + } + + + + + /// + /// 出国留学国家 + /// + /// + /// + [HttpGet("GetStudyAbroads")] + public async Task> GetStudyAbroads([FromQuery] StudyAbroadRequestDTO requestDTO) + { + var sysdict = await _bussysDict.AsQueryable().Where(e => e.DictTypeId == requestDTO.TypeId).ToListAsync(); + return sysdict.Select(s => new StudyAbroadCountryDTO() + { + Code = s.Code, + Name = s.Value + }).ToList(); + } + + + + /// + /// 获取留学时间轴 + /// + /// + /// + [HttpGet("GetBusStudyAbroadTimeAxes")] + public async Task> GetBusStudyAbroadTimeAxes([FromQuery] BusStudyAbroadTimeAxisRequestDTO axisRequestDTO) + { + var result = new List(); + var sysdict = await _bussysDict.AsQueryable().Where(e => e.DictTypeId == 340876906606661).ToListAsync(); + var query = await _busStudyabroadTimeAxisRep.AsQueryable().Where(e => e.CountryId == axisRequestDTO.CountryId).ToListAsync(); + + var timedict = query.Select(s => s.StartTimeAxis).Distinct().ToList(); + timedict.ForEach(c => + { + result.Add(new BusStudyAbroadTimeAxisResponseDTO() + { + StartTimeAxis = sysdict.FirstOrDefault(e => e.Code == c.ToString()).Value, + busStudyAbroadTimeAxes = query.Where(e => e.StartTimeAxis == c).Select(s => new BusStudyAbroadTimeAxisItems() + { + TimeNode = s.TimeNode, + EventName = s.EventName, + Description = s.Description, + Sort = s.Sort + }).ToList() + }); + }); + return result; + } + + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyabroadTimeAxis/Dto/BusStudyAbroadTimeAxisResponseDTO.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyabroadTimeAxis/Dto/BusStudyAbroadTimeAxisResponseDTO.cs new file mode 100644 index 0000000..4114447 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyabroadTimeAxis/Dto/BusStudyAbroadTimeAxisResponseDTO.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + + + /// + /// + /// + public class BusStudyAbroadTimeAxisRequestDTO + { + public int CountryId { get; set; } + } + + /// + /// + /// + public class BusStudyAbroadTimeAxisResponseDTO + { + /// + /// 入学时间段 + /// + public string StartTimeAxis { get; set; } + + /// + /// 时间节点 + /// + public List busStudyAbroadTimeAxes { get; set; } + + + } + + public class BusStudyAbroadTimeAxisItems + { + /// + /// 时间节点 + /// + public string TimeNode { get; set; } + + /// + /// 时间名称 + /// + public string EventName { get; set; } + + /// + /// 描述 + /// + public string Description { get; set; } + + /// + /// Sort排序 + /// + public int Sort { get; set; } + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyabroadTimeAxis/Dto/BusStudyabroadTimeAxisDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyabroadTimeAxis/Dto/BusStudyabroadTimeAxisDto.cs new file mode 100644 index 0000000..0c595de --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyabroadTimeAxis/Dto/BusStudyabroadTimeAxisDto.cs @@ -0,0 +1,46 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 留学时间节点输出参数 + /// + public class BusStudyabroadTimeAxisDto + { + /// + /// 入学时间Id + /// + public int StartTimeAxis { get; set; } + + /// + /// 国家ID + /// + public int CountryId { get; set; } + + /// + /// 时间节点 + /// + public string TimeNode { get; set; } + + /// + /// 时间名称 + /// + public string EventName { get; set; } + + /// + /// 描述 + /// + public string Description { get; set; } + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyabroadTimeAxis/Dto/BusStudyabroadTimeAxisInput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyabroadTimeAxis/Dto/BusStudyabroadTimeAxisInput.cs new file mode 100644 index 0000000..520af6b --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyabroadTimeAxis/Dto/BusStudyabroadTimeAxisInput.cs @@ -0,0 +1,66 @@ +using Admin.NET.Core; +using System; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application +{ + /// + /// 留学时间节点输入参数 + /// + public class BusStudyabroadTimeAxisInput : BasePageInput + { + /// + /// 入学时间Id + /// + public virtual int StartTimeAxis { get; set; } + + /// + /// 国家ID + /// + public virtual int CountryId { get; set; } + + /// + /// 时间节点 + /// + public virtual string TimeNode { get; set; } + + /// + /// 时间名称 + /// + public virtual string EventName { get; set; } + + /// + /// 描述 + /// + public virtual string Description { get; set; } + + /// + /// Sort排序 + /// + public virtual int Sort { get; set; } + + } + + public class AddBusStudyabroadTimeAxisInput : BusStudyabroadTimeAxisInput + { + } + + public class DeleteBusStudyabroadTimeAxisInput : BaseIdInput + { + } + + public class UpdateBusStudyabroadTimeAxisInput : BusStudyabroadTimeAxisInput + { + /// + /// Id主键 + /// + [Required(ErrorMessage = "Id主键不能为空")] + public long Id { get; set; } + + } + + public class QueryeBusStudyabroadTimeAxisInput : BaseIdInput + { + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyabroadTimeAxis/Dto/BusStudyabroadTimeAxisOutput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyabroadTimeAxis/Dto/BusStudyabroadTimeAxisOutput.cs new file mode 100644 index 0000000..55843e2 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyabroadTimeAxis/Dto/BusStudyabroadTimeAxisOutput.cs @@ -0,0 +1,46 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 留学时间节点输出参数 + /// + public class BusStudyabroadTimeAxisOutput + { + /// + /// 入学时间Id + /// + public int StartTimeAxis { get; set; } + + /// + /// 国家ID + /// + public int CountryId { get; set; } + + /// + /// 时间节点 + /// + public string TimeNode { get; set; } + + /// + /// 时间名称 + /// + public string EventName { get; set; } + + /// + /// 描述 + /// + public string Description { get; set; } + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyabroadTimeAxis/Dto/BusStudyabroadTimeExportDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyabroadTimeAxis/Dto/BusStudyabroadTimeExportDto.cs new file mode 100644 index 0000000..d62d337 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyabroadTimeAxis/Dto/BusStudyabroadTimeExportDto.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + + + /// + /// + /// + public class BusStudyabroadTimeExportDto + { + /// + /// 时间节点 + /// + public virtual string TimeNode { get; set; } + + /// + /// 时间名称 + /// + public virtual string EventName { get; set; } + + /// + /// 描述 + /// + public virtual string Description { get; set; } + + /// + /// Sort排序 + /// + public virtual int Sort { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyabroadTimeAxis/Dto/StudyAbroadCountryDTO.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyabroadTimeAxis/Dto/StudyAbroadCountryDTO.cs new file mode 100644 index 0000000..24eb8ab --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusStudyabroadTimeAxis/Dto/StudyAbroadCountryDTO.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + public class StudyAbroadRequestDTO + { + + /// + /// 340856133152837 + /// + public long TypeId { get; set; } + } + + public class StudyAbroadCountryDTO + { + public string Code { get; set; } + + public string Name { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusTimeAxis/BusTimeAxisService.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusTimeAxis/BusTimeAxisService.cs new file mode 100644 index 0000000..7789425 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusTimeAxis/BusTimeAxisService.cs @@ -0,0 +1,313 @@ +using Admin.NET.Core; +using Furion.DatabaseAccessor; +using Furion.DependencyInjection; +using Furion.DynamicApiController; +using Furion.FriendlyException; +using Mapster; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// 升学规划时间轴服务 + /// + [ApiDescriptionSettings("测评服务", Name = "BusTimeAxis", Order = 100)] + public class BusTimeAxisService : IDynamicApiController, ITransient + { + private readonly SqlSugarRepository _busTimeAxisRep; + private readonly SqlSugarRepository _sysdictdata; + private readonly UserManager _userManager; + + /// + /// + /// + /// + /// + public BusTimeAxisService( + SqlSugarRepository busTimeAxisRep, + SqlSugarRepository sysdictdata, + UserManager userManager + ) + { + _busTimeAxisRep = busTimeAxisRep; + _sysdictdata = sysdictdata; + _userManager = userManager; + } + + /// + /// 分页查询升学规划时间轴 + /// + /// + /// + [HttpGet("page")] + public async Task> Page([FromQuery] BusTimeAxisInput input) + { + var busTimeAxiss = await _busTimeAxisRep.AsQueryable() + .WhereIF(!string.IsNullOrEmpty(input.TimeAxis), u => u.TimeAxis == input.TimeAxis) + // .Where(input.Grade > 0, u => u.Grade == input.Grade) + // .Where(u => u.StudyYear == input.StudyYear) + .WhereIF(!string.IsNullOrEmpty(input.BigTitle), u => u.BigTitle == input.BigTitle) + .WhereIF(!string.IsNullOrEmpty(input.Title), u => u.Title == input.Title) + // .Where(u => u.IsColor == input.IsColor) + .WhereIF(!string.IsNullOrEmpty(input.Summary), u => u.Summary == input.Summary) + .WhereIF(!string.IsNullOrEmpty(input.Url), u => u.Url == input.Url) + // .Where(u => u.Sort == input.Sort) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .OrderBuilder(input) + .Select(s => new BusTimeAxisOutput() + { + TimeAxis = s.TimeAxis, + Grade = s.Grade, + StudyYear = s.StudyYear, + BigTitle = s.BigTitle, + Title = s.Title, + IsColor = s.IsColor, + Summary = s.Summary, + Url = s.Url, + Sort = s.Sort, + Id = s.Id + + }) + .ToPagedListAsync(input.Page, input.PageSize); + + return busTimeAxiss; + } + + /// + /// 增加升学规划时间轴 + /// + /// + /// + [HttpPost("add")] + public async Task Add(AddBusTimeAxisInput input) + { + var busTimeAxis = input.Adapt(); + await _busTimeAxisRep.InsertAsync(busTimeAxis); + } + + /// + /// 删除升学规划时间轴 + /// + /// + /// + [HttpPost("delete")] + public async Task Delete(DeleteBusTimeAxisInput input) + { + var busTimeAxis = await _busTimeAxisRep.AsQueryable().FirstAsync(u => u.Id == input.Id); + await _busTimeAxisRep.FakeDeleteAsync(busTimeAxis); + } + + /// + /// 更新升学规划时间轴 + /// + /// + /// + [HttpPost("edit")] + public async Task Update(UpdateBusTimeAxisInput input) + { + var isExist = await _busTimeAxisRep.AsQueryable().AnyAsync(u => u.Id == input.Id); + if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3000); + + var busTimeAxis = input.Adapt(); + await _busTimeAxisRep.UpdateAsync(busTimeAxis); + } + + /// + /// 获取升学规划时间轴 + /// + /// + /// + [HttpGet("detail")] + public async Task Get([FromQuery] QueryeBusTimeAxisInput input) + { + return (await _busTimeAxisRep.AsQueryable().FirstAsync(u => u.Id == input.Id)).Adapt(); + } + + /// + /// 获取升学规划时间轴列表 + /// + /// + /// + [HttpGet("list")] + public async Task> List([FromQuery] BusTimeAxisInput input) + { + return await _busTimeAxisRep.AsQueryable() + .Select(s => new BusTimeAxisOutput() + { + TimeAxis = s.TimeAxis, + Grade = s.Grade, + StudyYear = s.StudyYear, + BigTitle = s.BigTitle, + Title = s.Title, + IsColor = s.IsColor, + Summary = s.Summary, + Url = s.Url, + Sort = s.Sort, + Id = s.Id + + }).ToListAsync(); + } + + + /// + /// 导入 + /// + /// + /// + [HttpPost("import")] + public async Task ImportCustom(IFormFile file) + { + var list = InputExcelUtil.InputExcel(file); + var res = new List(); + var gradeinfo = await _sysdictdata.AsQueryable().Where(e => e.DictTypeId == 340927002796101).ToListAsync(); + var studyyears = await _sysdictdata.AsQueryable().Where(e => e.DictTypeId == 340927375392837).ToListAsync(); + for (int i = 0; i < list.Count(); i++) + { + var item = list[i]; + res.Add(new BusTimeAxis() + { + Grade = int.Parse(gradeinfo.FirstOrDefault(e => e.Value == item.Grade.Trim()).Code), + BigTitle = item.BigTitle, + CreateTime = DateTime.Now, + CreateUserId = _userManager.UserId, + CreateUserName = _userManager.Account, + IsColor = item.IsColor, + Sort = item.Sort, + StudyYear = int.Parse(studyyears.FirstOrDefault(s => s.Value == item.StudyYear.Trim()).Code), + Summary = item.Summary, + TimeAxis = item.TimeAxis, + Title = "", + Url = "" + }); + } + await _busTimeAxisRep.InsertRangeAsync(res); + } + + + + /// + /// 根据学年级获取时间轴 + /// + /// + /// + [HttpGet("GetCustomTimeAxis")] + public async Task> GetCustomTimeAxis([FromQuery] CustomTimeAxisRequestDto requestDto) + { + var result = new List(); + var gradeinfo = await _sysdictdata.AsQueryable().Where(e => e.DictTypeId == 340927002796101).ToListAsync(); + var studyyears = await _sysdictdata.AsQueryable().Where(e => e.DictTypeId == 340927375392837).ToListAsync(); + var timeaxislist = await _busTimeAxisRep.AsQueryable().ToListAsync(); + + gradeinfo.ForEach(e => + { + int grade = int.Parse(e.Code); + studyyears.Where(e.Value != "高考后", k => k.Value != "高考后").Where(e.Value == "高考后", k => k.Value == "高考后").ToList().ForEach(c => + { + var customtimeaxis = new CustomTimeAxisDTO(); + int code = int.Parse(c.Code); + + var timlist = timeaxislist.Where(o => o.StudyYear == code && o.Grade == grade).ToList(); + if (timlist.Any()) + { + var timeaixs = new List(); + timlist.ForEach(h => + { + var timeaixsitem = new TimeAxisItems(); + timeaixsitem.BigTitle = h.BigTitle; + timeaixsitem.IsColor = h.IsColor; + timeaixsitem.Summary = h.Summary; + timeaixsitem.TimeAxis = h.TimeAxis; + timeaixsitem.Sort = h.Sort; + timeaixs.Add(timeaixsitem); + }); + + switch (e.Value) + { + case "高一": + customtimeaxis.StudyYears = c.Value == "上学期" ? "高一上" : "高一下"; + break; + case "高二": + customtimeaxis.StudyYears = c.Value == "上学期" ? "高二上" : "高二下"; + break; + case "高三": + customtimeaxis.StudyYears = c.Value == "上学期" ? "高三上" : "高三下"; + break; + case "高考后": + customtimeaxis.StudyYears = "高考后"; + break; + } + customtimeaxis.axisItems = timeaixs; + } + customtimeaxis.Title = e.Value == "高一" ? "生涯认知与探索" : e.Value == "高二" ? "探索与决策" : "准备与行动"; + customtimeaxis.GradeName = e.Value; + + result.Add(customtimeaxis); + }); + + + }); + return result; + } + + + + + /// + /// 根据学年级获取时间轴(小程序) + /// + /// + /// + [HttpGet("GetMinProTimeAxis")] + public async Task> GetMinProTimeAxis([FromQuery] CustomTimeAxisRequestDto requestDto) + { + + var result = new List(); + var gradeinfo = await _sysdictdata.AsQueryable().Where(e => e.DictTypeId == 340927002796101 && e.Value == requestDto.GradeName.Trim()).ToListAsync(); + var studyyears = await _sysdictdata.AsQueryable().Where(e => e.DictTypeId == 340927375392837).ToListAsync(); + var timeaxislist = await _busTimeAxisRep.AsQueryable().ToListAsync(); + + gradeinfo.ForEach(e => + { + int grade = int.Parse(e.Code); + //studyyears.Where(e.Value != "高考后", k => k.Value != "高考后").Where(e.Value == "高考后", k => k.Value == "高考后").ToList().ForEach(c => + //{ + var customtimeaxis = new minProgTimeAxisDTO(); + // int code = int.Parse(c.Code); + + var timlist = timeaxislist.Where(o => o.Grade == grade).ToList(); + if (timlist.Any()) + { + var timeaixs = new List(); + timlist.ForEach(h => + { + var timeaixsitem = new TimeAxisItems(); + timeaixsitem.BigTitle = h.BigTitle; + timeaixsitem.IsColor = h.IsColor; + timeaixsitem.Summary = h.Summary; + timeaixsitem.TimeAxis = h.TimeAxis; + timeaixsitem.Sort = h.Sort; + timeaixs.Add(timeaixsitem); + }); + + customtimeaxis.axisItems = timeaixs; + } + customtimeaxis.Title = e.Value == "高一" ? "生涯认知与探索" : e.Value == "高二" ? "探索与决策" : "准备与行动"; + customtimeaxis.GradeName = e.Value; + + result.Add(customtimeaxis); + // }); + + + }); + return result; + + + } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusTimeAxis/Dto/BusTimeAxisDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusTimeAxis/Dto/BusTimeAxisDto.cs new file mode 100644 index 0000000..18665e8 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusTimeAxis/Dto/BusTimeAxisDto.cs @@ -0,0 +1,62 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 升学规划时间轴输出参数 + /// + public class BusTimeAxisDto + { + + /// + /// 时间轴 + /// + public string TimeAxis { get; set; } + + /// + /// 对应年级 + /// + public int Grade { get; set; } + + /// + /// 对应上下学期 + /// + public int StudyYear { get; set; } + + /// + /// 大标题 + /// + public string BigTitle { get; set; } + + /// + /// 小标题 + /// + public string Title { get; set; } + + /// + /// 是否标红 + /// + public int IsColor { get; set; } + + /// + /// 节点描述 + /// + public string Summary { get; set; } + + /// + /// 外部链接 + /// + public string Url { get; set; } + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusTimeAxis/Dto/BusTimeAxisInput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusTimeAxis/Dto/BusTimeAxisInput.cs new file mode 100644 index 0000000..cb74638 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusTimeAxis/Dto/BusTimeAxisInput.cs @@ -0,0 +1,81 @@ +using Admin.NET.Core; +using System; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application +{ + /// + /// 升学规划时间轴输入参数 + /// + public class BusTimeAxisInput : BasePageInput + { + /// + /// 时间轴 + /// + public virtual string TimeAxis { get; set; } + + /// + /// 对应年级 + /// + public virtual int Grade { get; set; } + + /// + /// 对应上下学期 + /// + public virtual int StudyYear { get; set; } + + /// + /// 大标题 + /// + public virtual string BigTitle { get; set; } + + /// + /// 小标题 + /// + public virtual string Title { get; set; } + + /// + /// 是否标红 + /// + public virtual int IsColor { get; set; } + + /// + /// 节点描述 + /// + public virtual string Summary { get; set; } + + /// + /// 外部链接 + /// + public virtual string Url { get; set; } + + /// + /// Sort排序 + /// + public virtual int Sort { get; set; } + + } + + public class AddBusTimeAxisInput : BusTimeAxisInput + { + } + + public class DeleteBusTimeAxisInput : BaseIdInput + { + } + + public class UpdateBusTimeAxisInput : BusTimeAxisInput + { + /// + /// Id主键 + /// + [Required(ErrorMessage = "Id主键不能为空")] + public long Id { get; set; } + + } + + public class QueryeBusTimeAxisInput : BaseIdInput + { + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusTimeAxis/Dto/BusTimeAxisOutDTO.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusTimeAxis/Dto/BusTimeAxisOutDTO.cs new file mode 100644 index 0000000..2efa9bd --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusTimeAxis/Dto/BusTimeAxisOutDTO.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + + public class BusTimeAxisOutDTO + { + + /// + /// 对应年级 + /// + public string Grade { get; set; } + + /// + /// 对应上下学期 + /// + public string StudyYear { get; set; } + + /// + /// 时间轴 + /// + public string TimeAxis { get; set; } + + /// + /// 大标题 + /// + public string BigTitle { get; set; } + + ///// + ///// 小标题 + ///// + //public string Title { get; set; } + + /// + /// 节点描述 + /// + public string Summary { get; set; } + + + /// + /// 是否标红 + /// + public int IsColor { get; set; } + + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusTimeAxis/Dto/BusTimeAxisOutput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusTimeAxis/Dto/BusTimeAxisOutput.cs new file mode 100644 index 0000000..96c9624 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusTimeAxis/Dto/BusTimeAxisOutput.cs @@ -0,0 +1,61 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 升学规划时间轴输出参数 + /// + public class BusTimeAxisOutput + { + /// + /// 时间轴 + /// + public string TimeAxis { get; set; } + + /// + /// 对应年级 + /// + public int Grade { get; set; } + + /// + /// 对应上下学期 + /// + public int StudyYear { get; set; } + + /// + /// 大标题 + /// + public string BigTitle { get; set; } + + /// + /// 小标题 + /// + public string Title { get; set; } + + /// + /// 是否标红 + /// + public int IsColor { get; set; } + + /// + /// 节点描述 + /// + public string Summary { get; set; } + + /// + /// 外部链接 + /// + public string Url { get; set; } + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusTimeAxis/Dto/CustomTimeAxisDTO.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusTimeAxis/Dto/CustomTimeAxisDTO.cs new file mode 100644 index 0000000..03561a0 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusTimeAxis/Dto/CustomTimeAxisDTO.cs @@ -0,0 +1,137 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + + + /// + /// 传入参数 + /// + public class CustomTimeAxisRequestDto + { + public string GradeName { get; set; } + + } + + /// + /// + /// + public class CustomTimeAxisDTO + { + public string Title { get; set; } + public string GradeName { get; set; } + + public string StudyYears { get; set; } + + public List axisItems { get; set; } + } + + + /// + /// + /// + public class minProgTimeAxisDTO + { + /// + /// + /// + public string Title { get; set; } + + /// + /// + /// + public string GradeName { get; set; } + + + /// + /// + /// + public List axisItems { get; set; } + } + + + public class TimeAxisItems + { + + /// + /// 时间轴 + /// + public string TimeAxis { get; set; } + + /// + /// 大标题 + /// + public string BigTitle { get; set; } + + ///// + ///// 小标题 + ///// + //public string Title { get; set; } + + /// + /// 节点描述 + /// + public string Summary { get; set; } + + + /// + /// 是否标红 + /// + public int IsColor { get; set; } + + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + // public List timeAxes { get; set; } + + } + + /// + /// + /// + public class TimeAxisItem + { + + + /// + /// 时间轴 + /// + public string TimeAxis { get; set; } + + /// + /// 大标题 + /// + public string BigTitle { get; set; } + + ///// + ///// 小标题 + ///// + //public string Title { get; set; } + + /// + /// 节点描述 + /// + public string Summary { get; set; } + + + /// + /// 是否标红 + /// + public int IsColor { get; set; } + + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + } + +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusUniversityInfo/BusUniversityInfoService.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusUniversityInfo/BusUniversityInfoService.cs new file mode 100644 index 0000000..512a920 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusUniversityInfo/BusUniversityInfoService.cs @@ -0,0 +1,130 @@ +using Admin.NET.Core; +using Furion.DatabaseAccessor; +using Furion.DependencyInjection; +using Furion.DynamicApiController; +using Furion.FriendlyException; +using Mapster; +using Microsoft.AspNetCore.Mvc; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + /// + /// 高校基础信息服务 + /// + [ApiDescriptionSettings("测评服务", Name = "BusUniversityInfo", Order = 100)] + public class BusUniversityInfoService : IDynamicApiController, ITransient + { + private readonly SqlSugarRepository _busUniversityInfoRep; + + public BusUniversityInfoService( + SqlSugarRepository busUniversityInfoRep + ) + { + _busUniversityInfoRep = busUniversityInfoRep; + } + + /// + /// 分页查询高校基础信息 + /// + /// + /// + [HttpGet("page")] + public async Task> Page([FromQuery] BusUniversityInfoInput input) + { + var busUniversityInfos = await _busUniversityInfoRep.AsQueryable() + .WhereIF(!string.IsNullOrEmpty(input.Name), u => u.Name == input.Name) + .WhereIF(!string.IsNullOrEmpty(input.Logo), u => u.Logo == input.Logo) + .Where(u => u.ProvinceId == input.ProvinceId) + .Where(u => u.ZgManageId == input.ZgManageId) + .Where(u => u.Levels == input.Levels) + .WhereIF(!string.IsNullOrEmpty(input.Specific), u => u.Specific == input.Specific) + .Where(u => u.UniversityType == input.UniversityType) + .Where(u => u.Rank == input.Rank) + //.Where(u => u.Sort == input.Sort) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .OrderBuilder(input) + .Select(s => new BusUniversityInfoOutput + { + Name = s.Name, + Logo = s.Logo, + ProvinceId = s.ProvinceId, + ZgManageId = s.ZgManageId, + Levels = s.Levels, + Specific = s.Specific, + UniversityType = s.UniversityType, + Rank = s.Rank, + Sort = s.Sort, + Id = s.Id + }) + .ToPagedListAsync(input.Page, input.PageSize); + + return busUniversityInfos; + } + + /// + /// 增加高校基础信息 + /// + /// + /// + [HttpPost("add")] + public async Task Add(AddBusUniversityInfoInput input) + { + var busUniversityInfo = input.Adapt(); + await _busUniversityInfoRep.InsertAsync(busUniversityInfo); + } + + /// + /// 删除高校基础信息 + /// + /// + /// + [HttpPost("delete")] + public async Task Delete(DeleteBusUniversityInfoInput input) + { + var busUniversityInfo = await _busUniversityInfoRep.AsQueryable().FirstAsync(u => u.Id == input.Id); + await _busUniversityInfoRep.FakeDeleteAsync(busUniversityInfo); + } + + /// + /// 更新高校基础信息 + /// + /// + /// + [HttpPost("edit")] + public async Task Update(UpdateBusUniversityInfoInput input) + { + var isExist = await _busUniversityInfoRep.AsQueryable().AnyAsync(u => u.Id == input.Id); + if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3000); + + var busUniversityInfo = input.Adapt(); + await _busUniversityInfoRep.UpdateAsync(busUniversityInfo); + } + + /// + /// 获取高校基础信息 + /// + /// + /// + [HttpGet("detail")] + public async Task Get([FromQuery] QueryeBusUniversityInfoInput input) + { + return (await _busUniversityInfoRep.AsQueryable().FirstAsync(u => u.Id == input.Id)).Adapt(); + } + + /// + /// 获取高校基础信息列表 + /// + /// + /// + [HttpGet("list")] + public async Task> List([FromQuery] BusUniversityInfoInput input) + { + return await _busUniversityInfoRep.AsQueryable().Select().ToListAsync(); + } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusUniversityInfo/Dto/BusUniversityInfoDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusUniversityInfo/Dto/BusUniversityInfoDto.cs new file mode 100644 index 0000000..b188d1c --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusUniversityInfo/Dto/BusUniversityInfoDto.cs @@ -0,0 +1,61 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 高校基础信息输出参数 + /// + public class BusUniversityInfoDto + { + /// + /// 高校名称 + /// + public string Name { get; set; } + + /// + /// LOGO + /// + public string Logo { get; set; } + + /// + /// 省份Id + /// + public long ProvinceId { get; set; } + + /// + /// 教育主管部门Id + /// + public long ZgManageId { get; set; } + + /// + /// 办学层次 + /// + public int Levels { get; set; } + + /// + /// 办学特征 + /// + public string Specific { get; set; } + + /// + /// 院校类型 + /// + public int UniversityType { get; set; } + + /// + /// 排名 + /// + public int Rank { get; set; } + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusUniversityInfo/Dto/BusUniversityInfoInput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusUniversityInfo/Dto/BusUniversityInfoInput.cs new file mode 100644 index 0000000..65744f8 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusUniversityInfo/Dto/BusUniversityInfoInput.cs @@ -0,0 +1,81 @@ +using Admin.NET.Core; +using System; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application +{ + /// + /// 高校基础信息输入参数 + /// + public class BusUniversityInfoInput : BasePageInput + { + /// + /// 高校名称 + /// + public virtual string Name { get; set; } + + /// + /// LOGO + /// + public virtual string Logo { get; set; } + + /// + /// 省份Id + /// + public virtual long ProvinceId { get; set; } + + /// + /// 教育主管部门Id + /// + public virtual long ZgManageId { get; set; } + + /// + /// 办学层次 + /// + public virtual int Levels { get; set; } + + /// + /// 办学特征 + /// + public virtual string Specific { get; set; } + + /// + /// 院校类型 + /// + public virtual int UniversityType { get; set; } + + /// + /// 排名 + /// + public virtual int Rank { get; set; } + + /// + /// Sort排序 + /// + public virtual int Sort { get; set; } + + } + + public class AddBusUniversityInfoInput : BusUniversityInfoInput + { + } + + public class DeleteBusUniversityInfoInput : BaseIdInput + { + } + + public class UpdateBusUniversityInfoInput : BusUniversityInfoInput + { + /// + /// Id主键 + /// + [Required(ErrorMessage = "Id主键不能为空")] + public long Id { get; set; } + + } + + public class QueryeBusUniversityInfoInput : BaseIdInput + { + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/BusUniversityInfo/Dto/BusUniversityInfoOutput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/BusUniversityInfo/Dto/BusUniversityInfoOutput.cs new file mode 100644 index 0000000..ef792f9 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/BusUniversityInfo/Dto/BusUniversityInfoOutput.cs @@ -0,0 +1,61 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 高校基础信息输出参数 + /// + public class BusUniversityInfoOutput + { + /// + /// 高校名称 + /// + public string Name { get; set; } + + /// + /// LOGO + /// + public string Logo { get; set; } + + /// + /// 省份Id + /// + public long ProvinceId { get; set; } + + /// + /// 教育主管部门Id + /// + public long ZgManageId { get; set; } + + /// + /// 办学层次 + /// + public int Levels { get; set; } + + /// + /// 办学特征 + /// + public string Specific { get; set; } + + /// + /// 院校类型 + /// + public int UniversityType { get; set; } + + /// + /// 排名 + /// + public int Rank { get; set; } + + /// + /// Sort排序 + /// + public int Sort { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/Dto/CasdoorUserInfoDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/Dto/CasdoorUserInfoDto.cs new file mode 100644 index 0000000..9ae228a --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/Dto/CasdoorUserInfoDto.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application.Service +{ + public class CasdoorUserInfoDto + { + public string address { get; set; } + public string aud { get; set; } + public string email { get; set; } + public string[] groups { get; set; } + public string iss { get; set; } + public string name { get; set; } + public string phone { get; set; } + public string picture { get; set; } + public string preferred_username { get; set; } + public string sub { get; set; } + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/Dto/CustomExcelInputDTO.cs b/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/Dto/CustomExcelInputDTO.cs new file mode 100644 index 0000000..a97af91 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/Dto/CustomExcelInputDTO.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + + /// + /// 学生导入信息 + /// + public class CustomExcelInputDTO + { + /// + /// 昵称(姓名) + /// + public string NickName { get; set; } + + /// + /// 账号 + /// + public string UserCode { get; set; } + + /// + /// 性别 + /// + public string Gender { get; set; } + + /// + /// 电话 + /// + public string Phone { get; set; } + + /// + /// 邮箱 + /// + public string Email { get; set; } + + /// + /// 所在年级 + /// + public string GradeName { get; set; } + /// + /// 所在班级 + /// + public string ClassName { get; set; } + + /// + /// 所在学年 + /// + public string StudyYears { get; set; } + + + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/Dto/CustomMenusDTO.cs b/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/Dto/CustomMenusDTO.cs new file mode 100644 index 0000000..4049adf --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/Dto/CustomMenusDTO.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + + /// + /// 客户端菜单 + /// + public class CustomMenusDTO + { + public List rootMenus { get; set; } + } + + public class RootMenu + { + public string Code { get; set; } + + public string Name { get; set; } + + // public int Type { get; set; } + + public string Url { get; set; } + + public List customMenus { get; set; } + + + /// + /// 链接类型0内部,1外部 + /// + public int Type { get; set; } + + } + + public class CustomMenuRequestDTO + { + public long TenantId { get; set; } + } + public class CustomMenuItem + { + /// + /// 传给下级时使用 + /// + public long MenuId { get; set; } + /// + /// 根菜单 + /// + public long RootId { get; set; } + + /// + /// 菜单名称 + /// + public string MenuName { get; set; } + + /// + /// 菜单icon + /// + public string Icon { get; set; } + + /// + /// 路由地址 + /// + public string Url { get; set; } + + /// + /// 链接类型0内部,1外部 + /// + public int Type { get; set; } + + /// + /// 数据排序 + /// + public int Sort { get; set; } + } + +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/Dto/LoginResponse.cs b/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/Dto/LoginResponse.cs new file mode 100644 index 0000000..9652d44 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/Dto/LoginResponse.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application +{ + public class LoginResponse + { + public string Data { get; set; } + + public long TenantId { get; set; } + + /// + /// + /// + public StudentInfo studentInfo { get; set; } + + /// + /// 三方URL + /// + public string OtherUrl { get; set; } + + } + + public class StudentInfo + { + public long UserId { get; set; } + public string UserName { get; set; } + + public string Gender { get; set; } + + public string ClassName { get; set; } + + public string SchoolName { get; set; } + + public string StudyYears { get; set; } + + public string Province { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/Dto/SyncCustomerDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/Dto/SyncCustomerDto.cs new file mode 100644 index 0000000..2d7e298 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/Dto/SyncCustomerDto.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application.Service +{ + public class SyncCustomerDto + { + public int id { get; set; } + public string owner { get; set; } + public string name { get; set; } + public DateTime createdTime { get; set; } + public string organization { get; set; } + public string clientIp { get; set; } + public string user { get; set; } + public string method { get; set; } + public string requestUri { get; set; } + public string action { get; set; } + public bool isTriggered { get; set; } + public string _object { get; set; } + public Extendeduser extendedUser { get; set; } + + } + + public class Extendeduser + { + public string owner { get; set; } + public string name { get; set; } + public DateTime createdTime { get; set; } + public string updatedTime { get; set; } + public string id { get; set; } + public string type { get; set; } + public string password { get; set; } + public string passwordSalt { get; set; } + public string displayName { get; set; } + public string avatar { get; set; } + public string permanentAvatar { get; set; } + public string email { get; set; } + public string phone { get; set; } + public string location { get; set; } + public object address { get; set; } + public string affiliation { get; set; } + public string title { get; set; } + public int score { get; set; } + public int ranking { get; set; } + public bool isOnline { get; set; } + public bool isAdmin { get; set; } + public bool isForbidden { get; set; } + public bool isDeleted { get; set; } + public string signupApplication { get; set; } + public Properties properties { get; set; } + } + + public class Properties + { + public string bio { get; set; } + public string checkinDate { get; set; } + public string editorType { get; set; } + public DateTime emailVerifiedTime { get; set; } + public string fileQuota { get; set; } + public string location { get; set; } + public string no { get; set; } + public string oauth_QQ_displayName { get; set; } + public string oauth_QQ_verifiedTime { get; set; } + public string oauth_WeChat_displayName { get; set; } + public string oauth_WeChat_verifiedTime { get; set; } + public string onlineStatus { get; set; } + public string phoneVerifiedTime { get; set; } + public string renameQuota { get; set; } + public string tagline { get; set; } + public string website { get; set; } + } + + +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/Dto/SysOauthUserDto.cs b/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/Dto/SysOauthUserDto.cs new file mode 100644 index 0000000..dfea75c --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/Dto/SysOauthUserDto.cs @@ -0,0 +1,121 @@ +using System; + +namespace Admin.NET.Application +{ + /// + /// 学生表输出参数 + /// + public class SysOauthUserDto + { + /// + /// 所在年级 + /// + public string BusGradeName { get; set; } + + /// + /// 所在学年 + /// + public string BusStudyYearsName { get; set; } + + /// + /// 所在班级 + /// + public string BusClassInfoName { get; set; } + + /// + /// UUID + /// + public string Uuid { get; set; } + + /// + /// Token + /// + public string AccessToken { get; set; } + + /// + /// 昵称(姓名) + /// + public string NickName { get; set; } + + /// + /// 账号(学号) + /// + public string UserCode { get; set; } + + /// + /// 头像 + /// + public string Avatar { get; set; } + + /// + /// 密码 + /// + public string Password { get; set; } + + /// + /// 性别 + /// + public string Gender { get; set; } + + /// + /// 电话 + /// + public string Phone { get; set; } + + /// + /// 邮箱 + /// + public string Email { get; set; } + + /// + /// 位置 + /// + public string Location { get; set; } + + /// + /// 用户来源 + /// + public string Source { get; set; } + + /// + /// 省份编号 + /// + public int ProvinceCode { get; set; } + + /// + /// 备注 + /// + public string Remark { get; set; } + + /// + /// 所在年级 + /// + public long GradeId { get; set; } + + /// + /// 所在学年 + /// + public long StudyYearsId { get; set; } + + /// + /// 所在班级 + /// + public long ClassId { get; set; } + + /// + /// 是否毕业 + /// + public bool IsGraduation { get; set; } + + /// + /// 租户id + /// + public long TenantId { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/Dto/SysOauthUserInput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/Dto/SysOauthUserInput.cs new file mode 100644 index 0000000..2b7723e --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/Dto/SysOauthUserInput.cs @@ -0,0 +1,163 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application +{ + + + + public class OauthRegister + { + + public string OauthId { get; set; } + public string Phone { get; set; } + + /// + /// 年级 + /// + public string GradeName { get; set; } = "高三"; + + /// + /// 班级 + /// + public string ClassName { get; set; } = "01班"; + + /// + /// + /// + public string SchoolName { get; set; } = ""; + + /// + /// + /// + public string StudyYears { get; set; } = "2022"; + public string Code { get; set; } + + public int Type { get; set; } = 1; + public string Password { get; set; } + + public string NickName { get; set; } + + } + + + /// + /// 学生表输入参数 + /// + public class SysOauthUserInput : BasePageInput + { + /// + /// UUID + /// + public virtual string Uuid { get; set; } + + /// + /// Token + /// + public virtual string AccessToken { get; set; } + + /// + /// 昵称(姓名) + /// + public virtual string NickName { get; set; } + + /// + /// 账号(学号) + /// + public virtual string UserCode { get; set; } + + /// + /// 头像 + /// + public virtual string Avatar { get; set; } + + /// + /// 密码 + /// + public virtual string Password { get; set; } + + /// + /// 性别 + /// + public virtual string Gender { get; set; } + + /// + /// 电话 + /// + public virtual string Phone { get; set; } + + /// + /// 邮箱 + /// + public virtual string Email { get; set; } + + /// + /// 位置 + /// + public virtual string Location { get; set; } + + /// + /// 用户来源 + /// + public virtual string Source { get; set; } + + /// + /// 省份编号 + /// + public virtual int ProvinceCode { get; set; } + + /// + /// 备注 + /// + public virtual string Remark { get; set; } + + /// + /// 所在年级 + /// + public virtual long GradeId { get; set; } + + /// + /// 所在学年 + /// + public virtual long StudyYearsId { get; set; } + + /// + /// 所在班级 + /// + public virtual long ClassId { get; set; } + + /// + /// 是否毕业 + /// + public virtual bool IsGraduation { get; set; } + + /// + /// 租户id + /// + public virtual long TenantId { get; set; } + + } + + public class AddSysOauthUserInput : SysOauthUserInput + { + } + + public class DeleteSysOauthUserInput : BaseIdInput + { + } + + public class UpdateSysOauthUserInput : SysOauthUserInput + { + /// + /// Id主键 + /// + [Required(ErrorMessage = "Id主键不能为空")] + public long Id { get; set; } + + } + + public class QueryeSysOauthUserInput : BaseIdInput + { + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/Dto/SysOauthUserOutput.cs b/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/Dto/SysOauthUserOutput.cs new file mode 100644 index 0000000..935ab28 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/Dto/SysOauthUserOutput.cs @@ -0,0 +1,188 @@ +using System; + +namespace Admin.NET.Application +{ + + /// + /// + /// + public class CustomOutPut + { + + /// + /// 昵称(姓名) + /// + public string NickName { get; set; } + + /// + /// 账号(学号) + /// + public string UserCode { get; set; } + + /// + /// 头像 + /// + public string Avatar { get; set; } + + + /// + /// 性别 + /// + public string Gender { get; set; } + + /// + /// 电话 + /// + public string Phone { get; set; } + + /// + /// 邮箱 + /// + public string Email { get; set; } + + /// + /// 用户来源 + /// + public string Source { get; set; } + + + + /// + /// 备注 + /// + public string Remark { get; set; } + + /// + /// 所在年级 + /// + public string Grade { get; set; } + + /// + /// 所在学年 + /// + public string StudyYears { get; set; } + + /// + /// 所在班级 + /// + public string Class { get; set; } + + /// + /// 是否毕业 + /// + public bool IsGraduation { get; set; } + + /// + /// 租户id + /// + public long TenantId { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } + + /// + /// 学生表输出参数 + /// + public class SysOauthUserOutput + { + /// + /// UUID + /// + public string Uuid { get; set; } + + /// + /// Token + /// + public string AccessToken { get; set; } + + /// + /// 昵称(姓名) + /// + public string NickName { get; set; } + + /// + /// 账号(学号) + /// + public string UserCode { get; set; } + + /// + /// 头像 + /// + public string Avatar { get; set; } + + /// + /// 密码 + /// + public string Password { get; set; } + + /// + /// 性别 + /// + public string Gender { get; set; } + + /// + /// 电话 + /// + public string Phone { get; set; } + + /// + /// 邮箱 + /// + public string Email { get; set; } + + /// + /// 位置 + /// + public string Location { get; set; } + + /// + /// 用户来源 + /// + public string Source { get; set; } + + /// + /// 省份编号 + /// + public int ProvinceCode { get; set; } + + /// + /// 备注 + /// + public string Remark { get; set; } + + /// + /// 所在年级 + /// + public long GradeId { get; set; } + + /// + /// 所在学年 + /// + public long StudyYearsId { get; set; } + + /// + /// 所在班级 + /// + public long ClassId { get; set; } + + /// + /// 是否毕业 + /// + public bool IsGraduation { get; set; } + + /// + /// 租户id + /// + public long TenantId { get; set; } + + /// + /// Id主键 + /// + public long Id { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/SysOauthUserService.cs b/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/SysOauthUserService.cs new file mode 100644 index 0000000..d1c0f06 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/CePing/SysOauthUser/SysOauthUserService.cs @@ -0,0 +1,449 @@ +using Admin.NET.Application.Service; +using Admin.NET.Core.Service; +using Furion; +using Furion.DatabaseAccessor; +using Furion.DataEncryption; +using Furion.DependencyInjection; +using Furion.DynamicApiController; +using Furion.FriendlyException; +using Mapster; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Components.Forms; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Configuration; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading.Tasks; +using static SKIT.FlurlHttpClient.Wechat.Api.Models.ShopCouponGetResponse.Types.Result.Types.Coupon.Types.CouponDetail.Types.Discount.Types.DiscountCondidtion.Types; + +namespace Admin.NET.Application +{ + /// + /// 学生表服务 + /// + [ApiDescriptionSettings("测评服务", Name = "SysOauthUser", Order = 100)] + + public class SysOauthUserService : IDynamicApiController, ITransient + { + private readonly SqlSugarRepository _sysOauthUserRep; + private readonly SqlSugarRepository _busGradeRep; + private readonly SqlSugarRepository _busStudyYearsRep; + private readonly SqlSugarRepository _busClassInfoRep; + private readonly SqlSugarRepository _busCustomMenusRep; + private readonly SqlSugarRepository _sysDictDataRep; + private readonly SysTenantService _tenantRep; + private readonly IHttpContextAccessor _httpContextAccessor; + private readonly IConfiguration _configuration; + private readonly UserManager _userManager; + public SysOauthUserService( + SqlSugarRepository busGradeRep, + SqlSugarRepository busStudyYearsRep, + SqlSugarRepository busClassInfoRep, + SqlSugarRepository sysOauthUserRep, + SqlSugarRepository _buscustomMenus, + SqlSugarRepository _dictdataRep, + SysTenantService tenantrep, + IHttpContextAccessor httpContextAccessor, + IConfiguration configuration, + UserManager userManager + ) + { + _busGradeRep = busGradeRep; + _busStudyYearsRep = busStudyYearsRep; + _busClassInfoRep = busClassInfoRep; + _sysOauthUserRep = sysOauthUserRep; + _busCustomMenusRep = _buscustomMenus; + _sysDictDataRep = _dictdataRep; + _tenantRep = tenantrep; + _httpContextAccessor = httpContextAccessor; + _configuration = configuration; + _userManager = userManager; + } + + + //[HttpGet] + //[AllowAnonymous] + //public async Task Callback([FromQuery] string servicetoken) + //{ + // var res = new LoginResponse(); + // var userinfo = new StudentInfo(); + // var headers = new System.Collections.Generic.Dictionary + // { + // { "Authorization", string.Format("Bearer {0}",servicetoken) } + // }; + // if (servicetoken == null) + // { + // throw Oops.Oh("token无效"); + // } + // string casdoorurl = _configuration["Casdoor:url"] + "/api/userinfo"; + // var casdooruserinfo = await casdoorurl.SetHeaders(headers).GetAsAsync(); + // //下面写正常逻辑 + // // 判断是否正确 忽略全局过滤器 + // var user = _sysOauthUserRep.AsQueryable() + // .Where(u => u.UnionId == casdooruserinfo.sub && !u.IsDelete) + // .FirstAsync(); + // _ = user ?? throw Oops.Oh(ErrorCodeEnum.D1000); + // var accessToken = JWTEncryption.Encrypt(new Dictionary + // { + // {ClaimConst.CLAINM_USERID, user.Id}, + // {ClaimConst.TENANT_ID, user.TenantId}, + // {ClaimConst.CLAINM_ACCOUNT, user.UserCode}, + // {ClaimConst.CLAINM_NAME, user.NickName} + // }); + // userinfo.UserName = user.NickName; + // userinfo.Gender = user.Gender == "1" ? "男" : "女"; + // userinfo.UserId = user.Id; + // userinfo.SchoolName = (await _tenantRep.GetTenant(new QueryTenantInput() { Id = user.TenantId.Value })).Name; + // userinfo.StudyYears = (await _busStudyYearsRep.FirstOrDefaultAsync(s => s.Id == user.StudyYearsId)).Name; + // userinfo.ClassName = (await _busClassInfoRep.FirstOrDefaultAsync(s => s.Id == user.ClassId)).Name; + // userinfo.Province = "山东省"; + // // 设置Swagger自动登录 + // _httpContextAccessor.HttpContext.SigninToSwagger(accessToken); + + // // 生成刷新Token令牌 + // var refreshToken = + // JWTEncryption.GenerateRefreshToken(accessToken, App.GetOptions().ExpiredTime); + // // 设置刷新Token令牌 + // _httpContextAccessor.HttpContext.Response.Headers["x-access-token"] = refreshToken; + // res.Data = accessToken; + // res.TenantId = user.TenantId.Value; + // res.studentInfo = userinfo; + // return res; + //} + + + + + + /// + /// 获取客户端菜单 + /// + /// + /// + [HttpGet("GetCustomMenu")] + public async Task GetCustomMenu([FromQuery] CustomMenuRequestDTO requestDTO) + { + var result = new CustomMenusDTO(); + var query = await _busCustomMenusRep.AsQueryable().Where(e => e.TenantId == requestDTO.TenantId && e.IsDelete == false).ToListAsync(); + var rootmenus = _sysDictDataRep.AsQueryable().Where(e => e.DictTypeId == 339895952609349 && e.IsDelete == false); + result.rootMenus = rootmenus.OrderBy(c => c.OrderNo).Select(s => new RootMenu() + { + Code = s.Code, + Name = s.Value, + Url = s.Remark.Trim() + }).ToList(); + result.rootMenus.ForEach(c => + { + c.Type = c.Url.Contains("http") ? 1 : 0; + c.customMenus = query.Where(e => e.RootId == long.Parse(c.Code)).Select(s => new CustomMenuItem() + { + RootId = s.RootId, + MenuId = s.Id, + MenuName = s.MenuName, + Sort = s.Sort, + Url = s.Url, + Icon = s.Icon, + Type = s.UrlType + }).OrderBy(o => o.Sort).ToList(); + }); + return result; + } + + ///// + ///// 分页查询学生表 + ///// + ///// + ///// + //[HttpGet("page")] + //public async Task> Page([FromQuery] SysOauthUserInput input) + //{ + // var pageResult = new PageResult(); + // var studyyears = await _busStudyYearsRep.AsQueryable().Where(e => e.TenantId == CurrentUserInfo.TenantId).ToListAsync(); + // var gradeinfo = await _busGradeRep.AsQueryable().Where(e => e.TenantId == CurrentUserInfo.TenantId).ToListAsync(); + // var classinfo = await _busClassInfoRep.AsQueryable().Where(e => e.TenantId == CurrentUserInfo.TenantId).ToListAsync(); + // var sysOauthUsers = await _sysOauthUserRep.AsQueryable() + // .Where(!string.IsNullOrEmpty(input.NickName), u => u.NickName == input.NickName) + // .Where(!string.IsNullOrEmpty(input.UserCode), u => u.UserCode == input.UserCode) + // .Where(!string.IsNullOrEmpty(input.Gender), u => u.Gender == input.Gender) + // .Where(!string.IsNullOrEmpty(input.Phone), u => u.Phone == input.Phone) + // .Where(!string.IsNullOrEmpty(input.Remark), u => u.Remark == input.Remark) + // .Where(input.GradeId > 0, u => u.GradeId == input.GradeId) + // .Where(input.StudyYearsId > 0, u => u.StudyYearsId == input.StudyYearsId) + // .Where(input.ClassId > 0, u => u.ClassId == input.ClassId) + // //.Where(u => u.IsGraduation == input.IsGraduation) + // .Where(!CurrentUserInfo.IsSuperAdmin, u => u.TenantId == CurrentUserInfo.TenantId) + // .OrderBy(PageInputOrder.OrderBuilder(input)) + // .ProjectToType() + // .ToADPagedListAsync(input.PageNo, input.PageSize); + + // var customs = new List(); + // sysOauthUsers.Rows.ToList().ForEach(s => + // { + // customs.Add(new CustomOutPut() + // { + // Avatar = s.Avatar, + // Class = classinfo.FirstOrDefault(c => c.Id == s.ClassId).Name, + // Grade = gradeinfo.FirstOrDefault(c => c.Id == s.GradeId).Name, + // Id = s.Id, + // Email = s.Email, + // Gender = s.Gender, + // IsGraduation = s.IsGraduation, + // NickName = s.NickName, + // Phone = s.Phone, + // Remark = s.Remark, + // Source = s.Source, + // StudyYears = studyyears.FirstOrDefault(c => c.Id == s.StudyYearsId).Name, + // TenantId = s.TenantId, + // UserCode = s.UserCode + // }); + // }); + // pageResult.Rows = customs; + // pageResult.TotalPage = sysOauthUsers.TotalPage; + // pageResult.PageNo = sysOauthUsers.PageNo; + // pageResult.PageSize = sysOauthUsers.PageSize; + // return pageResult; + //} + + /// + /// 增加学生表 + /// + /// + /// + //[HttpPost("add")] + //public async Task Add(AddSysOauthUserInput input) + //{ + // var sysOauthUser = input.Adapt(); + // await _sysOauthUserRep.InsertAsync(sysOauthUser); + //} + + /// + /// 删除学生表 + /// + /// + /// + //[HttpPost("delete")] + //public async Task Delete(DeleteSysOauthUserInput input) + //{ + // var sysOauthUser = await _sysOauthUserRep.FirstOrDefaultAsync(u => u.Id == input.Id); + // await _sysOauthUserRep.FakeDeleteAsync(sysOauthUser); + //} + + /// + /// 更新学生表 + /// + /// + /// + //[HttpPost("edit")] + //public async Task Update(UpdateSysOauthUserInput input) + //{ + // var isExist = await _sysOauthUserRep.AnyAsync(u => u.Id == input.Id, false); + // if (!isExist) throw Oops.Oh(ErrorCode.D3000); + + // var sysOauthUser = input.Adapt(); + // await _sysOauthUserRep.UpdateAsync(sysOauthUser, ignoreNullValues: true); + //} + + /// + /// 获取学生表 + /// + /// + /// + //[HttpGet("detail")] + //public async Task Get([FromQuery] QueryeSysOauthUserInput input) + //{ + // return (await _sysOauthUserRep.AsQueryable().FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt(); + //} + + /// + /// 获取学生表列表 + /// + /// + /// + //[HttpGet("list")] + //public async Task> List([FromQuery] SysOauthUserInput input) + //{ + // return await _sysOauthUserRep.AsQueryable().Where(e => e.TenantId == CurrentUserInfo.TenantId).ProjectToType().ToListAsync(); + //} + + /// + /// 获取BusGrade列表 + /// + /// + [HttpGet("fkBusGrade")] + public async Task FkBusGradeList() + { + var list = await _busGradeRep.AsQueryable().Where(e => e.TenantId == _userManager.TenantId).ToListAsync(); + return list.Select(e => new { Code = e.Id, Name = e.Name }); + } + + /// + /// 获取BusStudyYears列表 + /// + /// + [HttpGet("fkBusStudyYears")] + public async Task FkBusStudyYearsList() + { + var list = await _busStudyYearsRep.AsQueryable().Where(e => e.TenantId == _userManager.TenantId).ToListAsync(); + return list.Select(e => new { Code = e.Id, Name = e.Name }); + } + + /// + /// 获取BusClassInfo列表 + /// + /// + [HttpGet("fkBusClassInfo")] + public async Task FkBusClassInfoList() + { + var list = await _busClassInfoRep.AsQueryable().Where(e => e.TenantId == _userManager.TenantId).ToListAsync(); + return list.Select(e => new { Code = e.Id, Name = e.Name }); + } + + + //[HttpPost] + //[AllowAnonymous] + //public async Task WebHookSync([FromBody] SyncCustomerDto sync) + //{ + + // switch (sync.action) + // { + // case "signup": + // break; + // case "login": + // case "logout": + // case "update-user": + // case "delete-user": + // case "add-user": + // if (!string.IsNullOrWhiteSpace(sync.extendedUser.id)) + // { + // var singleinfo = _sysOauthUserRep + // .Where(u => u.Uuid == sync.extendedUser.id && !u.IsDeleted, false, true) + // .FirstOrDefault(); + + // if (singleinfo != null) + // { + // if (!string.IsNullOrWhiteSpace(sync.extendedUser.displayName)) + // { + // singleinfo.NickName = sync.extendedUser.displayName; + // } + // if (!string.IsNullOrWhiteSpace(sync.extendedUser.phone)) + // { + // singleinfo.Phone = sync.extendedUser.phone; + // } + // if (!string.IsNullOrWhiteSpace(sync.extendedUser.email)) + // { + // singleinfo.Email = sync.extendedUser.email; + // } + // if (!string.IsNullOrWhiteSpace(sync.extendedUser.avatar)) + // { + // singleinfo.Avatar = sync.extendedUser.avatar; + // } + // await _sysOauthUserRep.UpdateAsync(singleinfo); + // } + // else + // { + // await Register(new OauthRegister() + // { + // OauthId = sync.extendedUser.id, + // Phone = sync.extendedUser.phone, + // NickName = sync.extendedUser.displayName, + // Password = sync.extendedUser.password + // }); + // } + + // } + // break; + // } + + // return true; + //} + + + + + /// + /// 学年是否存在 + /// + /// + /// + /// + private long CheckStudyyears(string studyyearsname, List studyYears) + { + long TenantId = 1300000000001; + if (studyYears.Where(c => c.Name.Equals(studyyearsname)).Any()) + { + return studyYears.FirstOrDefault(s => s.Name.Equals(studyyearsname)).Id; + } + else + { + var newmodel = new BusStudyYears() + { + Name = studyyearsname, + TenantId = TenantId, + StartDays = DateTime.Now, + EndDays = DateTime.Now, + Status = 0, + CreateTime = DateTime.Now, + CreateUserId = TenantId, + CreateUserName = "系统" + }; + _busStudyYearsRep.InsertAsync(newmodel); + return newmodel.Id; + } + } + + private long CheckGradeinfo(string gradename, List busGrades) + { + long TenantId = 1300000000001; + if (busGrades.Where(c => c.Name.Equals(gradename)).Any()) + { + return busGrades.FirstOrDefault(c => c.Name.Equals(gradename)).Id; + } + else + { + var newmodel = new BusGrade() + { + Name = gradename, + NumberCode = DateTime.Now.ToString("MMddHHssfff"), + TenantId = TenantId, + Sort = 100, + CreateTime = DateTime.Now, + CreateUserId = TenantId, + CreateUserName = "系统" + }; + _busGradeRep.InsertAsync(newmodel); + return newmodel.Id; + } + } + + private long CheckClassinfo(string classname, List busClasses) + { + long TenantId = 1300000000001; + if (busClasses.Where(c => c.Name.Equals(classname)).Any()) + { + return _busClassInfoRep.AsQueryable().FirstAsync(c => c.Name.Equals(classname)).Id; + } + else + { + var newmodel = new BusClassInfo() + { + NumberCode = DateTime.Now.ToString("MMddHHssfff"), + Name = classname, + Sort = 100, + TenantId = TenantId, + CreateTime = DateTime.Now, + CreateUserId = TenantId, + CreateUserName = "系统" + }; + _busClassInfoRep.InsertAsync(newmodel); + return newmodel.Id; + } + } + + + + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/HLDTagMapProfession/Dto/HLDTagMapProfessionDto.cs b/Admin.NET/Admin.NET.Application/Service/HLDTagMapProfession/Dto/HLDTagMapProfessionDto.cs new file mode 100644 index 0000000..04974de --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/HLDTagMapProfession/Dto/HLDTagMapProfessionDto.cs @@ -0,0 +1,30 @@ +namespace Admin.NET.Application; + +/// +/// 霍兰德标签关联表输出参数 +/// +public class HLDTagMapProfessionDto +{ + /// + /// 主键Id + /// + public long Id { get; set; } + + public string Tag { get; set; } + public string Name { get; set; } + + public string CategoryName { get; set; } + public string TradeName { get; set; } + +} + + +public class BusTagMapPersonDto +{ + + public string Tag { get; set; } + public string NickName { get; set; } + public string Description { get; set; } + public string AvatarUrl { get; set; } + +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/Service/HLDTagMapProfession/Dto/HLDTagMapProfessionInput.cs b/Admin.NET/Admin.NET.Application/Service/HLDTagMapProfession/Dto/HLDTagMapProfessionInput.cs new file mode 100644 index 0000000..9364e8f --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/HLDTagMapProfession/Dto/HLDTagMapProfessionInput.cs @@ -0,0 +1,99 @@ +using Admin.NET.Core; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application; + + /// + /// 霍兰德标签关联表基础输入参数 + /// + public class HLDTagMapProfessionBaseInput + { + /// + /// 创建时间 + /// + public virtual DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public virtual DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public virtual long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public virtual string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public virtual long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public virtual string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public virtual bool IsDelete { get; set; } + + } + + /// + /// 霍兰德标签关联表分页查询输入参数 + /// + public class HLDTagMapProfessionInput : BasePageInput + { + /// + /// 关键字查询 + /// + public string? SearchKey { get; set; } + + } + + /// + /// 霍兰德标签关联表增加输入参数 + /// + public class AddHLDTagMapProfessionInput : HLDTagMapProfessionBaseInput + { + /// + /// 软删除 + /// + [Required(ErrorMessage = "软删除不能为空")] + public override bool IsDelete { get; set; } + + } + + /// + /// 霍兰德标签关联表删除输入参数 + /// + public class DeleteHLDTagMapProfessionInput : BaseIdInput + { + } + + /// + /// 霍兰德标签关联表更新输入参数 + /// + public class UpdateHLDTagMapProfessionInput : HLDTagMapProfessionBaseInput + { + /// + /// 主键Id + /// + [Required(ErrorMessage = "主键Id不能为空")] + public long Id { get; set; } + + } + + /// + /// 霍兰德标签关联表主键查询输入参数 + /// + public class QueryByIdHLDTagMapProfessionInput : DeleteHLDTagMapProfessionInput + { + + } diff --git a/Admin.NET/Admin.NET.Application/Service/HLDTagMapProfession/Dto/HLDTagMapProfessionOutput.cs b/Admin.NET/Admin.NET.Application/Service/HLDTagMapProfession/Dto/HLDTagMapProfessionOutput.cs new file mode 100644 index 0000000..263086a --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/HLDTagMapProfession/Dto/HLDTagMapProfessionOutput.cs @@ -0,0 +1,50 @@ +namespace Admin.NET.Application; + +/// +/// 霍兰德标签关联表输出参数 +/// +public class HLDTagMapProfessionOutput +{ + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + + } + + diff --git a/Admin.NET/Admin.NET.Application/Service/HLDTagMapProfession/HLDTagMapProfessionService.cs b/Admin.NET/Admin.NET.Application/Service/HLDTagMapProfession/HLDTagMapProfessionService.cs new file mode 100644 index 0000000..47a9d3f --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/HLDTagMapProfession/HLDTagMapProfessionService.cs @@ -0,0 +1,100 @@ +using Admin.NET.Core.Service; +using Microsoft.AspNetCore.Http; +namespace Admin.NET.Application; +/// +/// 霍兰德标签关联表服务 +/// +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 100)] +public class HLDTagMapProfessionService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _rep; + public HLDTagMapProfessionService(SqlSugarRepository rep) + { + _rep = rep; + } + + /// + /// 分页查询霍兰德标签关联表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Page")] + public async Task> Page(HLDTagMapProfessionInput input) + { + var query = _rep.AsQueryable() + .Select(); + return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 增加霍兰德标签关联表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Add")] + public async Task Add(AddHLDTagMapProfessionInput input) + { + var entity = input.Adapt(); + await _rep.InsertAsync(entity); + return entity.Id; + } + + /// + /// 删除霍兰德标签关联表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Delete")] + public async Task Delete(DeleteHLDTagMapProfessionInput input) + { + var entity = await _rep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + await _rep.FakeDeleteAsync(entity); //假删除 + //await _rep.DeleteAsync(entity); //真删除 + } + + /// + /// 更新霍兰德标签关联表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Update")] + public async Task Update(UpdateHLDTagMapProfessionInput input) + { + var entity = input.Adapt(); + await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); + } + + /// + /// 获取霍兰德标签关联表 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "Detail")] + public async Task Detail([FromQuery] QueryByIdHLDTagMapProfessionInput input) + { + return await _rep.GetFirstAsync(u => u.Id == input.Id); + } + + /// + /// 获取霍兰德标签关联表列表 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "List")] + public async Task> List([FromQuery] HLDTagMapProfessionInput input) + { + return await _rep.AsQueryable().Select().ToListAsync(); + } + + + + + +} + diff --git a/Admin.NET/Admin.NET.Application/Service/SpecialistReservation/Dto/SpecialistReservationDto.cs b/Admin.NET/Admin.NET.Application/Service/SpecialistReservation/Dto/SpecialistReservationDto.cs new file mode 100644 index 0000000..8856176 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SpecialistReservation/Dto/SpecialistReservationDto.cs @@ -0,0 +1,73 @@ +namespace Admin.NET.Application; + + /// + /// 专家预约输出参数 + /// + public class SpecialistReservationDto + { + /// + /// 用户openid + /// + public string OpenIdOpenId { get; set; } + + /// + /// 专家id + /// + public string SIdName { get; set; } + + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 用户openid + /// + public string OpenId { get; set; } + + /// + /// 预约时间 + /// + public string AppointmentTime { get; set; } + + /// + /// 专家id + /// + public long SId { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + + } diff --git a/Admin.NET/Admin.NET.Application/Service/SpecialistReservation/Dto/SpecialistReservationInput.cs b/Admin.NET/Admin.NET.Application/Service/SpecialistReservation/Dto/SpecialistReservationInput.cs new file mode 100644 index 0000000..525ff0c --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SpecialistReservation/Dto/SpecialistReservationInput.cs @@ -0,0 +1,143 @@ +using Admin.NET.Core; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application; + + /// + /// 专家预约基础输入参数 + /// + public class SpecialistReservationBaseInput + { + /// + /// 用户openid + /// + public virtual string OpenId { get; set; } + + /// + /// 预约时间 + /// + public virtual string AppointmentTime { get; set; } + + /// + /// 专家id + /// + public virtual long SId { get; set; } + + /// + /// 创建时间 + /// + public virtual DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public virtual DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public virtual long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public virtual string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public virtual long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public virtual string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public virtual bool IsDelete { get; set; } + + } + + /// + /// 专家预约分页查询输入参数 + /// + public class SpecialistReservationInput : BasePageInput + { + /// + /// 关键字查询 + /// + public string? SearchKey { get; set; } + + /// + /// 用户openid + /// + public string? OpenId { get; set; } + + /// + /// 预约时间 + /// + public string? AppointmentTime { get; set; } + + /// + /// 专家id + /// + public long? SId { get; set; } + + } + + /// + /// 专家预约增加输入参数 + /// + public class AddSpecialistReservationInput : SpecialistReservationBaseInput + { + /// + /// 用户openid + /// + [Required(ErrorMessage = "用户openid不能为空")] + public override string OpenId { get; set; } + + /// + /// 预约时间 + /// + [Required(ErrorMessage = "预约时间不能为空")] + public override string AppointmentTime { get; set; } + + /// + /// 专家id + /// + [Required(ErrorMessage = "专家id不能为空")] + public override long SId { get; set; } + + + + } + + /// + /// 专家预约删除输入参数 + /// + public class DeleteSpecialistReservationInput : BaseIdInput + { + } + + /// + /// 专家预约更新输入参数 + /// + public class UpdateSpecialistReservationInput : SpecialistReservationBaseInput + { + /// + /// 主键Id + /// + [Required(ErrorMessage = "主键Id不能为空")] + public long Id { get; set; } + + } + + /// + /// 专家预约主键查询输入参数 + /// + public class QueryByIdSpecialistReservationInput : DeleteSpecialistReservationInput + { + + } diff --git a/Admin.NET/Admin.NET.Application/Service/SpecialistReservation/Dto/SpecialistReservationOutput.cs b/Admin.NET/Admin.NET.Application/Service/SpecialistReservation/Dto/SpecialistReservationOutput.cs new file mode 100644 index 0000000..00399b5 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SpecialistReservation/Dto/SpecialistReservationOutput.cs @@ -0,0 +1,120 @@ +namespace Admin.NET.Application; + +/// +/// 专家预约输出参数 +/// +public class SpecialistReservationOutput +{ + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 用户openid + /// + public string OpenId { get; set; } + + /// + /// 用户openid 描述 + /// + public string WechatOpenId { get; set; } + + /// + /// 预约时间 + /// + public string AppointmentTime { get; set; } + + /// + /// 专家id + /// + public long SId { get; set; } + + /// + /// 专家id 描述 + /// + public string SIdName { get; set; } + + public string WechatPhone { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + + } + + +public class MyReservationOutput +{ + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 用户openid + /// + public string OpenId { get; set; } + + + + /// + /// 预约时间 + /// + public string AppointmentTime { get; set; } + + /// + /// 专家id + /// + public long SId { get; set; } + + /// + /// 专家id 描述 + /// + public string SIdName { get; set; } + + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + + + + +} + + + diff --git a/Admin.NET/Admin.NET.Application/Service/SpecialistReservation/SpecialistReservationService.cs b/Admin.NET/Admin.NET.Application/Service/SpecialistReservation/SpecialistReservationService.cs new file mode 100644 index 0000000..54ac3c2 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SpecialistReservation/SpecialistReservationService.cs @@ -0,0 +1,193 @@ +using Admin.NET.Core.Service; +using Microsoft.AspNetCore.Http; +namespace Admin.NET.Application; +/// +/// 专家预约服务 +/// +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 100)] +public class SpecialistReservationService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _rep; + private readonly SqlSugarRepository _specialgroup; + public SpecialistReservationService(SqlSugarRepository rep, SqlSugarRepository specialgroup) + { + _rep = rep; + _specialgroup = specialgroup; + } + + /// + /// 分页查询专家预约 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Page")] + public async Task> Page(SpecialistReservationInput input) + { + var query = _rep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => + u.AppointmentTime.Contains(input.SearchKey.Trim()) + ) + .WhereIF(!string.IsNullOrWhiteSpace(input.OpenId), u => u.OpenId == input.OpenId) + .WhereIF(!string.IsNullOrWhiteSpace(input.AppointmentTime), u => u.AppointmentTime.Contains(input.AppointmentTime.Trim())) + .WhereIF(input.SId > 0, u => u.SId == input.SId) + //处理外键和TreeSelector相关字段的连接 + .LeftJoin((u, wechat) => u.OpenId == wechat.OpenId) + .LeftJoin((u, wechat, sid) => u.SId == sid.Id) + .Where(e => e.IsDelete == false) + .OrderBy(u => u.CreateTime) + .Select((u, wechat, sid) => new SpecialistReservationOutput + { + Id = u.Id, + OpenId = u.OpenId, + WechatOpenId = wechat.OpenId, + WechatPhone = wechat.Mobile, + AppointmentTime = u.AppointmentTime, + SId = u.SId, + SIdName = sid.Name, + CreateTime = u.CreateTime, + UpdateTime = u.UpdateTime, + CreateUserId = u.CreateUserId, + CreateUserName = u.CreateUserName, + UpdateUserId = u.UpdateUserId, + UpdateUserName = u.UpdateUserName, + IsDelete = u.IsDelete, + }); + return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 增加专家预约(目前还未衔接短信) + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Add")] + public async Task Add(AddSpecialistReservationInput input) + { + var entity = input.Adapt(); + await _rep.InsertAsync(entity); + return entity.Id; + } + + + /// + /// 用户我的预约 + /// + /// + /// + [HttpGet] + public async Task> Reservation([FromQuery] string OpenId) + { + var result = new List(); + var query = await _rep.AsQueryable().Where(e => e.OpenId == OpenId && e.IsDelete == false).ToListAsync(); + var user = await _rep.Context.Queryable().Where(u => u.OpenId == OpenId).ToListAsync(); + var splist = await _specialgroup.GetListAsync(); + query.ForEach(a => + { + + result.Add(new MyReservationOutput() + { + AppointmentTime = a.AppointmentTime, + CreateTime = a.CreateTime, + OpenId = a.OpenId, + Id = a.Id, + SId = a.SId, + SIdName = splist.FirstOrDefault(e => e.Id == a.SId).Name, + + }); + }); + + return result; + + } + + /// + /// 删除专家预约 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Delete")] + public async Task Delete(DeleteSpecialistReservationInput input) + { + var entity = await _rep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + await _rep.FakeDeleteAsync(entity); //假删除 + //await _rep.DeleteAsync(entity); //真删除 + } + + /// + /// 更新专家预约 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Update")] + public async Task Update(UpdateSpecialistReservationInput input) + { + var entity = input.Adapt(); + await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); + } + + /// + /// 获取专家预约 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "Detail")] + public async Task Detail([FromQuery] QueryByIdSpecialistReservationInput input) + { + return await _rep.GetFirstAsync(u => u.Id == input.Id); + } + + /// + /// 获取专家预约列表 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "List")] + public async Task> List([FromQuery] SpecialistReservationInput input) + { + return await _rep.AsQueryable().Select().ToListAsync(); + } + + /// + /// 获取用户openid列表 + /// + /// + /// + [ApiDescriptionSettings(Name = "SysWechatUserOpenIdDropdown"), HttpGet] + public async Task SysWechatUserOpenIdDropdown() + { + return await _rep.Context.Queryable() + .Select(u => new + { + Label = u.OpenId, + Value = u.Id + } + ).ToListAsync(); + } + /// + /// 获取专家id列表 + /// + /// + /// + [ApiDescriptionSettings(Name = "BusSpecialistGroupSIdDropdown"), HttpGet] + public async Task BusSpecialistGroupSIdDropdown() + { + return await _rep.Context.Queryable() + .Select(u => new + { + Label = u.Name, + Value = u.Id + } + ).ToListAsync(); + } + + + + +} + diff --git a/Admin.NET/Admin.NET.Application/Service/SysAreaConfig/Dto/SysAreaConfigDto.cs b/Admin.NET/Admin.NET.Application/Service/SysAreaConfig/Dto/SysAreaConfigDto.cs new file mode 100644 index 0000000..d4c83f1 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysAreaConfig/Dto/SysAreaConfigDto.cs @@ -0,0 +1,73 @@ +namespace Admin.NET.Application; + + /// + /// 各省份志愿配置表输出参数 + /// + public class SysAreaConfigDto + { + /// + /// 省份 + /// + public string LocationCodeName { get; set; } + + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 省份 + /// + public string LocationCode { get; set; } + + /// + /// 批次 + /// + public string BatchName { get; set; } + + /// + /// 志愿总数量 + /// + public int Count { get; set; } + + /// + /// 单个志愿可选专业 + /// + public int ItemCount { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + + } diff --git a/Admin.NET/Admin.NET.Application/Service/SysAreaConfig/Dto/SysAreaConfigInput.cs b/Admin.NET/Admin.NET.Application/Service/SysAreaConfig/Dto/SysAreaConfigInput.cs new file mode 100644 index 0000000..86900c5 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysAreaConfig/Dto/SysAreaConfigInput.cs @@ -0,0 +1,163 @@ +using Admin.NET.Core; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application; + + /// + /// 各省份志愿配置表基础输入参数 + /// + public class SysAreaConfigBaseInput + { + /// + /// 省份 + /// + public virtual string LocationCode { get; set; } + + /// + /// 批次 + /// + public virtual string BatchName { get; set; } + + /// + /// 志愿总数量 + /// + public virtual int Count { get; set; } + + /// + /// 单个志愿可选专业 + /// + public virtual int ItemCount { get; set; } + + /// + /// 创建时间 + /// + public virtual DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public virtual DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public virtual long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public virtual string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public virtual long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public virtual string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public virtual bool IsDelete { get; set; } + + } + + /// + /// 各省份志愿配置表分页查询输入参数 + /// + public class SysAreaConfigInput : BasePageInput + { + /// + /// 关键字查询 + /// + public string? SearchKey { get; set; } + + /// + /// 省份 + /// + public string? LocationCode { get; set; } + + /// + /// 批次 + /// + public string? BatchName { get; set; } + + /// + /// 志愿总数量 + /// + public int? Count { get; set; } + + /// + /// 单个志愿可选专业 + /// + public int? ItemCount { get; set; } + + } + + /// + /// 各省份志愿配置表增加输入参数 + /// + public class AddSysAreaConfigInput : SysAreaConfigBaseInput + { + /// + /// 省份 + /// + [Required(ErrorMessage = "省份不能为空")] + public override string LocationCode { get; set; } + + /// + /// 批次 + /// + [Required(ErrorMessage = "批次不能为空")] + public override string BatchName { get; set; } + + /// + /// 志愿总数量 + /// + [Required(ErrorMessage = "志愿总数量不能为空")] + public override int Count { get; set; } + + /// + /// 单个志愿可选专业 + /// + [Required(ErrorMessage = "单个志愿可选专业不能为空")] + public override int ItemCount { get; set; } + + /// + /// 软删除 + /// + [Required(ErrorMessage = "软删除不能为空")] + public override bool IsDelete { get; set; } + + } + + /// + /// 各省份志愿配置表删除输入参数 + /// + public class DeleteSysAreaConfigInput : BaseIdInput + { + } + + /// + /// 各省份志愿配置表更新输入参数 + /// + public class UpdateSysAreaConfigInput : SysAreaConfigBaseInput + { + /// + /// 主键Id + /// + [Required(ErrorMessage = "主键Id不能为空")] + public long Id { get; set; } + + } + + /// + /// 各省份志愿配置表主键查询输入参数 + /// + public class QueryByIdSysAreaConfigInput : DeleteSysAreaConfigInput + { + + } diff --git a/Admin.NET/Admin.NET.Application/Service/SysAreaConfig/Dto/SysAreaConfigOutput.cs b/Admin.NET/Admin.NET.Application/Service/SysAreaConfig/Dto/SysAreaConfigOutput.cs new file mode 100644 index 0000000..d5685f0 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysAreaConfig/Dto/SysAreaConfigOutput.cs @@ -0,0 +1,75 @@ +namespace Admin.NET.Application; + +/// +/// 各省份志愿配置表输出参数 +/// +public class SysAreaConfigOutput +{ + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 省份 + /// + public string LocationCode { get; set; } + + /// + /// 省份 描述 + /// + public string LocationCodeName { get; set; } + + /// + /// 批次 + /// + public string BatchName { get; set; } + + /// + /// 志愿总数量 + /// + public int Count { get; set; } + + /// + /// 单个志愿可选专业 + /// + public int ItemCount { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + + } + + diff --git a/Admin.NET/Admin.NET.Application/Service/SysAreaConfig/SysAreaConfigService.cs b/Admin.NET/Admin.NET.Application/Service/SysAreaConfig/SysAreaConfigService.cs new file mode 100644 index 0000000..2880a19 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysAreaConfig/SysAreaConfigService.cs @@ -0,0 +1,143 @@ +using Admin.NET.Core.Service; +using Microsoft.AspNetCore.Http; +namespace Admin.NET.Application; +/// +/// 各省份志愿配置表服务 +/// +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 100)] +public class SysAreaConfigService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _rep; + public SysAreaConfigService(SqlSugarRepository rep) + { + _rep = rep; + } + + /// + /// 分页查询各省份志愿配置表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Page")] + public async Task> Page(SysAreaConfigInput input) + { + var query = _rep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => + u.LocationCode.Contains(input.SearchKey.Trim()) + || u.BatchName.Contains(input.SearchKey.Trim()) + ) + .Where(e => e.IsDelete == false) + .WhereIF(!string.IsNullOrWhiteSpace(input.LocationCode), u => u.LocationCode.Contains(input.LocationCode.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.BatchName), u => u.BatchName.Contains(input.BatchName.Trim())) + .WhereIF(input.Count > 0, u => u.Count == input.Count) + .WhereIF(input.ItemCount > 0, u => u.ItemCount == input.ItemCount) + //处理外键和TreeSelector相关字段的连接 + .LeftJoin((u, locationcode) => u.LocationCode == locationcode.Code) + .OrderBy(u => u.CreateTime) + .Select((u, locationcode) => new SysAreaConfigOutput + { + Id = u.Id, + LocationCode = u.LocationCode, + LocationCodeName = locationcode.Name, + BatchName = u.BatchName, + Count = u.Count, + ItemCount = u.ItemCount, + CreateTime = u.CreateTime, + UpdateTime = u.UpdateTime, + CreateUserId = u.CreateUserId, + CreateUserName = u.CreateUserName, + UpdateUserId = u.UpdateUserId, + UpdateUserName = u.UpdateUserName, + IsDelete = u.IsDelete, + }); + return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 增加各省份志愿配置表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Add")] + public async Task Add(AddSysAreaConfigInput input) + { + var entity = input.Adapt(); + await _rep.InsertAsync(entity); + return entity.Id; + } + + /// + /// 删除各省份志愿配置表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Delete")] + public async Task Delete(DeleteSysAreaConfigInput input) + { + var entity = await _rep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + await _rep.FakeDeleteAsync(entity); //假删除 + //await _rep.DeleteAsync(entity); //真删除 + } + + /// + /// 更新各省份志愿配置表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Update")] + public async Task Update(UpdateSysAreaConfigInput input) + { + var entity = input.Adapt(); + await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); + } + + /// + /// 获取各省份志愿配置表 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "Detail")] + public async Task Detail([FromQuery] QueryByIdSysAreaConfigInput input) + { + return await _rep.GetFirstAsync(u => u.Id == input.Id); + } + + /// + /// 获取各省份志愿配置表列表 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "List")] + public async Task> List([FromQuery] SysAreaConfigInput input) + { + return await _rep.AsQueryable().Select().ToListAsync(); + } + + /// + /// 获取省份列表 + /// + /// + /// + [ApiDescriptionSettings(Name = "BusProvinceLocationCodeDropdown"), HttpGet] + public async Task BusProvinceLocationCodeDropdown() + { + return await _rep.Context.Queryable() + .Select(u => new + { + Label = u.Name, + Value = u.Code + } + ).ToListAsync(); + } + + + + +} + diff --git a/Admin.NET/Admin.NET.Application/Service/SysFeedBack/Dto/SysFeedBackDto.cs b/Admin.NET/Admin.NET.Application/Service/SysFeedBack/Dto/SysFeedBackDto.cs new file mode 100644 index 0000000..0560869 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysFeedBack/Dto/SysFeedBackDto.cs @@ -0,0 +1,63 @@ +namespace Admin.NET.Application; + + /// + /// 用户反馈表输出参数 + /// + public class SysFeedBackDto + { + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 用户Id + /// + public long CId { get; set; } + + /// + /// 标题 + /// + public string? Title { get; set; } + + /// + /// 内容 + /// + public string? Content { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + + } diff --git a/Admin.NET/Admin.NET.Application/Service/SysFeedBack/Dto/SysFeedBackInput.cs b/Admin.NET/Admin.NET.Application/Service/SysFeedBack/Dto/SysFeedBackInput.cs new file mode 100644 index 0000000..4353b2f --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysFeedBack/Dto/SysFeedBackInput.cs @@ -0,0 +1,95 @@ +using Admin.NET.Core; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application; + + /// + /// 用户反馈表基础输入参数 + /// + public class SysFeedBackBaseInput + { + + + /// + /// 标题 + /// + public virtual string? Title { get; set; } + + /// + /// 内容 + /// + public virtual string? Content { get; set; } + + + + + + } + + /// + /// 用户反馈表分页查询输入参数 + /// + public class SysFeedBackInput : BasePageInput + { + /// + /// 关键字查询 + /// + public string? SearchKey { get; set; } + + /// + /// 用户Id + /// + public long? CId { get; set; } + + /// + /// 标题 + /// + public string? Title { get; set; } + + /// + /// 内容 + /// + public string? Content { get; set; } + + } + + /// + /// 用户反馈表增加输入参数 + /// + public class AddSysFeedBackInput : SysFeedBackBaseInput + { + + + + } + + + + + /// + /// 用户反馈表删除输入参数 + /// + public class DeleteSysFeedBackInput : BaseIdInput + { + } + + /// + /// 用户反馈表更新输入参数 + /// + public class UpdateSysFeedBackInput : SysFeedBackBaseInput + { + /// + /// 主键Id + /// + [Required(ErrorMessage = "主键Id不能为空")] + public long Id { get; set; } + + } + + /// + /// 用户反馈表主键查询输入参数 + /// + public class QueryByIdSysFeedBackInput : DeleteSysFeedBackInput + { + + } diff --git a/Admin.NET/Admin.NET.Application/Service/SysFeedBack/Dto/SysFeedBackOutput.cs b/Admin.NET/Admin.NET.Application/Service/SysFeedBack/Dto/SysFeedBackOutput.cs new file mode 100644 index 0000000..b7f51d2 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysFeedBack/Dto/SysFeedBackOutput.cs @@ -0,0 +1,65 @@ +namespace Admin.NET.Application; + +/// +/// 用户反馈表输出参数 +/// +public class SysFeedBackOutput +{ + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 用户Id + /// + public long CId { get; set; } + + /// + /// 标题 + /// + public string? Title { get; set; } + + /// + /// 内容 + /// + public string? Content { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + + } + + diff --git a/Admin.NET/Admin.NET.Application/Service/SysFeedBack/SysFeedBackService.cs b/Admin.NET/Admin.NET.Application/Service/SysFeedBack/SysFeedBackService.cs new file mode 100644 index 0000000..5e54c23 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysFeedBack/SysFeedBackService.cs @@ -0,0 +1,118 @@ +using Admin.NET.Core.Service; +using Microsoft.AspNetCore.Http; +namespace Admin.NET.Application; + + +/// +/// 用户反馈表服务 +/// +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 900)] +public class SysFeedBackService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _rep; + private readonly UserManager _userManager; + public SysFeedBackService(SqlSugarRepository rep, UserManager userManager) + { + _rep = rep; + _userManager = userManager; + } + + /// + /// 分页查询用户反馈表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Page")] + public async Task> Page(SysFeedBackInput input) + { + var query = _rep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => + u.Title.Contains(input.SearchKey.Trim()) + || u.Content.Contains(input.SearchKey.Trim()) + ) + .WhereIF(input.CId > 0, u => u.CId == input.CId) + .WhereIF(!string.IsNullOrWhiteSpace(input.Title), u => u.Title.Contains(input.Title.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Content), u => u.Content.Contains(input.Content.Trim())) + .Select(); + return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 增加用户反馈表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Add")] + public async Task Add(AddSysFeedBackInput input) + { + var entity = input.Adapt(); + entity.CId = _userManager.UserId; + entity.CreateTime = DateTime.Now; + entity.UpdateTime = DateTime.Now; + entity.CreateUserId = _userManager.UserId; + entity.UpdateUserId = _userManager.UserId; + entity.CreateUserName = _userManager.RealName; + entity.UpdateUserName = _userManager.RealName; + await _rep.InsertAsync(entity); + return entity.Id; + } + + /// + /// 删除用户反馈表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Delete")] + public async Task Delete(DeleteSysFeedBackInput input) + { + var entity = await _rep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + await _rep.FakeDeleteAsync(entity); //假删除 + //await _rep.DeleteAsync(entity); //真删除 + } + + /// + /// 更新用户反馈表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Update")] + public async Task Update(UpdateSysFeedBackInput input) + { + var entity = input.Adapt(); + await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); + } + + /// + /// 获取用户反馈表 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "Detail")] + public async Task Detail([FromQuery] QueryByIdSysFeedBackInput input) + { + return await _rep.GetFirstAsync(u => u.Id == input.Id); + } + + /// + /// 获取用户反馈表列表 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "List")] + public async Task> List([FromQuery] SysFeedBackInput input) + { + return await _rep.AsQueryable().Select().ToListAsync(); + } + + + + + +} + diff --git a/Admin.NET/Admin.NET.Application/Service/SysJsonStatic/Dto/SysJsonStaticDto.cs b/Admin.NET/Admin.NET.Application/Service/SysJsonStatic/Dto/SysJsonStaticDto.cs new file mode 100644 index 0000000..735c6b4 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysJsonStatic/Dto/SysJsonStaticDto.cs @@ -0,0 +1,73 @@ +namespace Admin.NET.Application; + + /// + /// 系统Json静态数据输出参数 + /// + public class SysJsonStaticDto + { + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 名称 + /// + public string Name { get; set; } + + /// + /// Json内容 + /// + public string JsonContext { get; set; } + + /// + /// 外链链接 + /// + public string? OutLink { get; set; } + + /// + /// 备注 + /// + public string? Remark { get; set; } + + /// + /// 排序 + /// + public int OrderNo { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + + } diff --git a/Admin.NET/Admin.NET.Application/Service/SysJsonStatic/Dto/SysJsonStaticInput.cs b/Admin.NET/Admin.NET.Application/Service/SysJsonStatic/Dto/SysJsonStaticInput.cs new file mode 100644 index 0000000..17334de --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysJsonStatic/Dto/SysJsonStaticInput.cs @@ -0,0 +1,167 @@ +using Admin.NET.Core; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application; + + /// + /// 系统Json静态数据基础输入参数 + /// + public class SysJsonStaticBaseInput + { + /// + /// 名称 + /// + public virtual string Name { get; set; } + + /// + /// Json内容 + /// + public virtual string JsonContext { get; set; } + + /// + /// 链接url名称(api/dic/) + /// + public virtual string? OutLink { get; set; } + + /// + /// 备注 + /// + public virtual string? Remark { get; set; } + + /// + /// 排序 + /// + public virtual int OrderNo { get; set; } + + /// + /// 创建时间 + /// + public virtual DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public virtual DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public virtual long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public virtual string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public virtual long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public virtual string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public virtual bool IsDelete { get; set; } + + } + + /// + /// 系统Json静态数据分页查询输入参数 + /// + public class SysJsonStaticInput : BasePageInput + { + /// + /// 关键字查询 + /// + public string? SearchKey { get; set; } + + /// + /// 名称 + /// + public string? Name { get; set; } + + /// + /// Json内容 + /// + public string? JsonContext { get; set; } + + /// + /// 外链链接 + /// + public string? OutLink { get; set; } + + /// + /// 备注 + /// + public string? Remark { get; set; } + + /// + /// 排序 + /// + public int? OrderNo { get; set; } + + } + + /// + /// 系统Json静态数据增加输入参数 + /// + public class AddSysJsonStaticInput : SysJsonStaticBaseInput + { + /// + /// 名称(demo.json/aa.json) + /// + [Required(ErrorMessage = "名称不能为空")] + public override string Name { get; set; } + + /// + /// Json内容 + /// + [Required(ErrorMessage = "Json内容不能为空")] + public override string JsonContext { get; set; } + + /// + /// 排序 + /// + [Required(ErrorMessage = "排序不能为空")] + public override int OrderNo { get; set; } + + /// + /// 软删除 + /// + [Required(ErrorMessage = "软删除不能为空")] + public override bool IsDelete { get; set; } + + } + + /// + /// 系统Json静态数据删除输入参数 + /// + public class DeleteSysJsonStaticInput : BaseIdInput + { + } + + /// + /// 系统Json静态数据更新输入参数 + /// + public class UpdateSysJsonStaticInput : SysJsonStaticBaseInput + { + /// + /// 主键Id + /// + [Required(ErrorMessage = "主键Id不能为空")] + public long Id { get; set; } + + } + + /// + /// 系统Json静态数据主键查询输入参数 + /// + public class QueryByIdSysJsonStaticInput : DeleteSysJsonStaticInput + { + + } diff --git a/Admin.NET/Admin.NET.Application/Service/SysJsonStatic/Dto/SysJsonStaticOutput.cs b/Admin.NET/Admin.NET.Application/Service/SysJsonStatic/Dto/SysJsonStaticOutput.cs new file mode 100644 index 0000000..6899c5c --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysJsonStatic/Dto/SysJsonStaticOutput.cs @@ -0,0 +1,75 @@ +namespace Admin.NET.Application; + +/// +/// 系统Json静态数据输出参数 +/// +public class SysJsonStaticOutput +{ + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 名称 + /// + public string Name { get; set; } + + /// + /// Json内容 + /// + public string JsonContext { get; set; } + + /// + /// 外链链接 + /// + public string? OutLink { get; set; } + + /// + /// 备注 + /// + public string? Remark { get; set; } + + /// + /// 排序 + /// + public int OrderNo { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + + } + + diff --git a/Admin.NET/Admin.NET.Application/Service/SysJsonStatic/SysJsonStaticService.cs b/Admin.NET/Admin.NET.Application/Service/SysJsonStatic/SysJsonStaticService.cs new file mode 100644 index 0000000..7d15210 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysJsonStatic/SysJsonStaticService.cs @@ -0,0 +1,127 @@ +using Admin.NET.Core.Service; +using Microsoft.AspNetCore.Http; +using System.IO; +using System.Text.Json; +using static SKIT.FlurlHttpClient.Wechat.Api.Models.CgibinExpressIntracityUpdateStoreRequest.Types; +namespace Admin.NET.Application; +/// +/// 系统Json静态数据服务 +/// +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 100)] +public class SysJsonStaticService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _rep; + public SysJsonStaticService(SqlSugarRepository rep) + { + _rep = rep; + } + + /// + /// 分页查询系统Json静态数据 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Page")] + public async Task> Page(SysJsonStaticInput input) + { + var query = _rep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => + u.Name.Contains(input.SearchKey.Trim()) + || u.JsonContext.Contains(input.SearchKey.Trim()) + || u.OutLink.Contains(input.SearchKey.Trim()) + || u.Remark.Contains(input.SearchKey.Trim()) + ) + .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.JsonContext), u => u.JsonContext.Contains(input.JsonContext.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.OutLink), u => u.OutLink.Contains(input.OutLink.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Remark), u => u.Remark.Contains(input.Remark.Trim())) + .WhereIF(input.OrderNo > 0, u => u.OrderNo == input.OrderNo) + .Select(); + return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 增加系统Json静态数据 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Add")] + public async Task Add(AddSysJsonStaticInput input) + { + var entity = input.Adapt(); + entity.OrderNo = 0; + string filePath = input.Name; + await File.WriteAllTextAsync(filePath, input.JsonContext); + byte[] fileBytes = await File.ReadAllBytesAsync(filePath); + var stream = new MemoryStream(fileBytes); + + // 2. 构造 IFormFile + IFormFile formFile = new FormFile(stream, 0, stream.Length, "file", filePath) + { + Headers = new HeaderDictionary(), + ContentType = "application/json" + }; + var newFile = await App.GetRequiredService().UploadFileReName(formFile, input.OutLink,filePath); + await _rep.InsertAsync(entity); + return entity.Id; + } + + /// + /// 删除系统Json静态数据 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Delete")] + public async Task Delete(DeleteSysJsonStaticInput input) + { + var entity = await _rep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + //await _rep.FakeDeleteAsync(entity); //假删除 + await _rep.DeleteAsync(entity); //真删除 + } + + /// + /// 更新系统Json静态数据 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Update")] + public async Task Update(UpdateSysJsonStaticInput input) + { + var entity = input.Adapt(); + await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); + } + + /// + /// 获取系统Json静态数据 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "Detail")] + public async Task Detail([FromQuery] QueryByIdSysJsonStaticInput input) + { + return await _rep.GetFirstAsync(u => u.Id == input.Id); + } + + /// + /// 获取系统Json静态数据列表 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "List")] + public async Task> List([FromQuery] SysJsonStaticInput input) + { + return await _rep.AsQueryable().Select().ToListAsync(); + } + + + + + +} + diff --git a/Admin.NET/Admin.NET.Application/Service/SysUnCollection/Dto/SysUnCollectionDto.cs b/Admin.NET/Admin.NET.Application/Service/SysUnCollection/Dto/SysUnCollectionDto.cs new file mode 100644 index 0000000..b4caeee --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysUnCollection/Dto/SysUnCollectionDto.cs @@ -0,0 +1,18 @@ +namespace Admin.NET.Application; + + /// + /// 用户院校收藏表输出参数 + /// + public class SysUnCollectionDto + { + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// Wx用户Id + /// + public long WxId { get; set; } + + } diff --git a/Admin.NET/Admin.NET.Application/Service/SysUnCollection/Dto/SysUnCollectionInput.cs b/Admin.NET/Admin.NET.Application/Service/SysUnCollection/Dto/SysUnCollectionInput.cs new file mode 100644 index 0000000..99190d8 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysUnCollection/Dto/SysUnCollectionInput.cs @@ -0,0 +1,69 @@ +using Admin.NET.Core; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application; + +/// +/// 用户院校收藏表基础输入参数 +/// +public class SysUnCollectionBaseInput +{ + /// + /// Wx用户Id + /// + public virtual long WxId { get; set; } + +} + +/// +/// 用户院校收藏表分页查询输入参数 +/// +public class SysUnCollectionInput : BasePageInput +{ + /// + /// 关键字查询 + /// + //public string? SearchKey { get; set; } + + + +} + +/// +/// 用户院校收藏表增加输入参数 +/// +public class AddSysUnCollectionInput : SysUnCollectionBaseInput +{ + [Required(ErrorMessage = "uId不能为空")] + public long uId { get; set; } + + +} + +/// +/// 用户院校收藏表删除输入参数 +/// +public class DeleteSysUnCollectionInput : BaseIdInput +{ +} + +/// +/// 用户院校收藏表更新输入参数 +/// +public class UpdateSysUnCollectionInput : SysUnCollectionBaseInput +{ + /// + /// 主键Id + /// + [Required(ErrorMessage = "主键Id不能为空")] + public long Id { get; set; } + +} + +/// +/// 用户院校收藏表主键查询输入参数 +/// +public class QueryByIdSysUnCollectionInput : DeleteSysUnCollectionInput +{ + +} diff --git a/Admin.NET/Admin.NET.Application/Service/SysUnCollection/Dto/SysUnCollectionOutput.cs b/Admin.NET/Admin.NET.Application/Service/SysUnCollection/Dto/SysUnCollectionOutput.cs new file mode 100644 index 0000000..7e25950 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysUnCollection/Dto/SysUnCollectionOutput.cs @@ -0,0 +1,53 @@ +namespace Admin.NET.Application; + +/// +/// 用户院校收藏表输出参数 +/// +public class SysUnCollectionOutput +{ + + public long uId { get; set; } + /// + /// Wx用户Id + /// + public long WxId { get; set; } + +} + + +public class UnCollectionDto +{ + + public long Id { get; set; } + public string Name { get; set; } + + public string logo { get; set; } + + public string provinceName { get; set; } + public string cityName { get; set; } + + public List features { get; set; } + + public string collegeCode { get; set; } + public string address { get; set; } + + public List imglist { get; set; } + public string vrurl { get; set; } + public string phone { get; set; } + + public string belong { get; set; } + + + public int? level { get; set; } + + public bool isCollect { get; set; } = false; + public string builddate { get; set; } + + + public List utype { get; set; } + public string nature { get; set; } + + public string detail { get; set; } +} + + diff --git a/Admin.NET/Admin.NET.Application/Service/SysUnCollection/SysUnCollectionService.cs b/Admin.NET/Admin.NET.Application/Service/SysUnCollection/SysUnCollectionService.cs new file mode 100644 index 0000000..95bbebe --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysUnCollection/SysUnCollectionService.cs @@ -0,0 +1,102 @@ +using Admin.NET.Core.Service; + +using Microsoft.AspNetCore.Http; +namespace Admin.NET.Application; +/// +/// 用户院校收藏表服务 +/// +[ApiDescriptionSettings(Order = 100)] +public class SysUnCollectionService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _rep; + public SysUnCollectionService(SqlSugarRepository rep) + { + _rep = rep; + } + + /// + /// 分页查询用户院校收藏表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Page")] + public async Task> Page(SysUnCollectionInput input) + { + var query = _rep.AsQueryable() + //.WhereIF(input.WxId>0, u => u.WxId == input.WxId) + .Select(); + return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 增加用户院校收藏表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Add")] + public async Task Add(AddSysUnCollectionInput input) + { + var entity = input.Adapt(); + await _rep.InsertAsync(entity); + return entity.Id; + } + + /// + /// 删除用户院校收藏表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Delete")] + public async Task Delete(AddSysUnCollectionInput input) + { + var entity = await _rep.GetFirstAsync(u => u.uId == input.uId && u.WxId == input.WxId) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + await _rep.FakeDeleteAsync(entity); //假删除 + //await _rep.DeleteAsync(entity); //真删除 + } + + /// + /// 更新用户院校收藏表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Update")] + public async Task Update(UpdateSysUnCollectionInput input) + { + var entity = input.Adapt(); + await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); + } + + /// + /// 获取用户院校收藏表 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "Detail")] + public async Task Detail([FromQuery] QueryByIdSysUnCollectionInput input) + { + return await _rep.GetFirstAsync(u => u.Id == input.Id); + } + + /// + /// 获取用户院校收藏表列表 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "List")] + public async Task> List([FromQuery] SysUnCollectionInput input) + { + return await _rep.AsQueryable().Select().ToListAsync(); + } + + + + + +} + diff --git a/Admin.NET/Admin.NET.Application/Service/SysUnCollection/UnCollectionService.cs b/Admin.NET/Admin.NET.Application/Service/SysUnCollection/UnCollectionService.cs new file mode 100644 index 0000000..f7ccdc0 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysUnCollection/UnCollectionService.cs @@ -0,0 +1,108 @@ +using Admin.NET.Core.Service; +using Microsoft.AspNetCore.Http; +using MongoDB.Bson; +using MongoDB.Driver; +namespace Admin.NET.Application; +/// +/// 用户院校收藏表服务 +/// +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 900)] +public class UnCollectionService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _rep; + + private readonly IMongoDBRepository _mongoRepository; + private readonly UserManager _userManager; + public UnCollectionService(SqlSugarRepository rep, IMongoDBRepository mongoDBRepository, UserManager userManager) + { + _rep = rep; + _mongoRepository = mongoDBRepository; + _userManager = userManager; + } + + /// + /// 分页查询用户院校收藏表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Page")] + public async Task> Page(SysUnCollectionInput input) + { + var query = _rep.AsQueryable() + .WhereIF(_userManager.UserId > 0, u => u.WxId == _userManager.UserId) + .Select(); + return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 增加用户院校收藏表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Add")] + public async Task Add(AddSysUnCollectionInput input) + { + input.WxId = _userManager.UserId; + var entity = input.Adapt(); + await _rep.InsertAsync(entity); + return entity.Id; + } + + /// + /// 删除用户院校收藏表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Delete")] + public async Task Delete(AddSysUnCollectionInput input) + { + var entity = await _rep.AsQueryable().FirstAsync(u => u.uId == input.uId && u.WxId == input.WxId) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + // await _rep.FakeDeleteAsync(entity); //假删除 + return await _rep.DeleteAsync(entity); //真删除 + } + + + /// + /// 获取用户院校收藏表详情 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "Detail")] + public async Task Detail([FromQuery] QueryByIdSysUnCollectionInput input) + { + + return await _rep.GetFirstAsync(u => u.uId == input.Id && u.WxId == _userManager.UserId); + } + + /// + /// 获取用户院校收藏表列表 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "List")] + public async Task> List([FromQuery] SysUnCollectionInput input) + { + var list = await _rep.AsQueryable().Where(e => e.WxId == _userManager.UserId).Select().ToListAsync(); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var university = dbclient.GetCollection("university"); + var unfilterBuilders = new List>(); + unfilterBuilders.Add(Builders.Filter.In(p => p._id, list.Select(c => c.uId))); + FilterDefinition unfilter = unfilterBuilders.Count > 0 + ? Builders.Filter.And(unfilterBuilders) + : new BsonDocument(); // 如果没有条件,则使用空过滤器 + var unlist = await university.Find(unfilter).ToListAsync(); + return unlist.ToList(); + + } + + + + + +} + diff --git a/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/Dto/AIInfoDto.cs b/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/Dto/AIInfoDto.cs new file mode 100644 index 0000000..c4796a3 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/Dto/AIInfoDto.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application.Service +{ + public class AIInfoDto + { + public string Url { get; set; } + /// + /// 志愿表 + /// + public string TableName { get; set; } + /// + ///批次名称 + /// + public string BatchName { get; set; } + + public string ProvinceName { get; set; } + + /// + /// 志愿填报类型(智能填报|一键填报) + /// + public string Type { get; set; } + + /// + /// 选科科目 + /// + public string SubjectClaim { get; set; } + + /// + ///填报志愿选择成绩 + /// + public float Score { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/Dto/ExportExcelDto.cs b/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/Dto/ExportExcelDto.cs new file mode 100644 index 0000000..eb2398d --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/Dto/ExportExcelDto.cs @@ -0,0 +1,135 @@ +using MiniExcelLibs.Attributes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +namespace Admin.NET.Application.Service; +public class ExportExcelDto +{ + public long Id { get; set; } + + public string location { get; set; } +} + + +public class VolunteerItemsViewMinExcelAttr +{ + [ExcelColumnName("排序")] + public int Sort { get; set; } + /// + /// 院校名称 + /// + [ExcelColumnName("院校名称")] + public string UniversityName { get; set; } + + /// + /// 院校编码 + /// + [ExcelColumnName("院校编码")] + public string UniversityCode { get; set; } + + + + /// + /// 学校所在地区 + /// + [ExcelColumnName("学校所在地区")] + public string AreaName { get; set; } + + + + /// + /// 公办|民办 + /// + [ExcelColumnName("学校类型")] + public string Nature { get; set; } + + /// + /// 专业代码 + /// + /// + [ExcelColumnName("专业代码")] + public string MajorCode { get; set; } + /// + /// 专业组 + /// + [ExcelColumnName("专业组")] + public string MajorGroup { get; set; } + /// + /// 专业名称 + /// + [ExcelColumnName("专业名称")] + public string Major { get; set; } + + ///// + ///// 专业备注 + ///// + //[ExcelColumnName("专业备注")] + //public string MajorRemark { get; set; } + + [ExcelColumnName("学制")] + public string AcademicYear { get; set; } + + /// + /// 专业选科 + /// + [ExcelColumnName("专业选科")] + public string MajorSubjectClam { get; set; } + /// + /// 计划数 + /// + [ExcelColumnName("计划数量")] + public int planCount { get; set; } + + + /// + /// 学费 + /// + [ExcelColumnName("学费")] + public string fee { get; set; } + //public List planMajorItems { get; set; } + + [ExcelColumnName("23计划")] + public string _23PlanCount { get; set; } + /// + /// 位次 + /// + [ExcelColumnName("23最低位次")] + public string _23RankLine { get; set; } + + ///// + ///// 最低分 + ///// + [ExcelColumnName("23最低分")] + public string _23Scoreline { get; set; } + + [ExcelColumnName("22计划")] + public string _22PlanCount { get; set; } + /// + /// 位次 + /// + [ExcelColumnName("22最低位次")] + public string _22RankLine { get; set; } + + ///// + ///// 最低分 + ///// + [ExcelColumnName("22最低分")] + public string _22Scoreline { get; set; } + + [ExcelColumnName("21计划")] + public string _21PlanCount { get; set; } + /// + /// 位次 + /// + [ExcelColumnName("21最低位次")] + public string _21RankLine { get; set; } + + ///// + ///// 最低分 + ///// + [ExcelColumnName("21最低分")] + public string _21Scoreline { get; set; } + +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/Dto/SysVolunteerTbDto.cs b/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/Dto/SysVolunteerTbDto.cs new file mode 100644 index 0000000..5cdf59d --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/Dto/SysVolunteerTbDto.cs @@ -0,0 +1,88 @@ +namespace Admin.NET.Application; + + /// + /// 我的志愿表输出参数 + /// + public class SysVolunteerTbDto + { + /// + /// 用户Id + /// + public long CIdId { get; set; } + + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 用户Id + /// + public int CId { get; set; } + + /// + /// 志愿表名称 + /// + public string? TableName { get; set; } + + /// + /// 批次名称 + /// + public string? BatchName { get; set; } + + /// + /// 志愿填报类型 + /// + public string? Type { get; set; } + + /// + /// 选科科目 + /// + public string? SubjectClaim { get; set; } + + /// + /// 成绩 + /// + public string Score { get; set; } + + /// + /// 志愿表详情 + /// + public string Detail { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + + } diff --git a/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/Dto/SysVolunteerTbInput.cs b/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/Dto/SysVolunteerTbInput.cs new file mode 100644 index 0000000..4bc60f3 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/Dto/SysVolunteerTbInput.cs @@ -0,0 +1,187 @@ +using Admin.NET.Core; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application; + + /// + /// 我的志愿表基础输入参数 + /// + public class SysVolunteerTbBaseInput + { + /// + /// 用户Id + /// + public virtual int CId { get; set; } + + /// + /// 志愿表名称 + /// + public virtual string? TableName { get; set; } + + /// + /// 批次名称 + /// + public virtual string? BatchName { get; set; } + + /// + /// 志愿填报类型 + /// + public virtual string? Type { get; set; } + + /// + /// 选科科目 + /// + public virtual string? SubjectClaim { get; set; } + + /// + /// 成绩 + /// + public virtual string Score { get; set; } + + /// + /// 志愿表详情 + /// + public virtual string Detail { get; set; } + + /// + /// 创建时间 + /// + public virtual DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public virtual DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public virtual long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public virtual string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public virtual long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public virtual string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public virtual bool IsDelete { get; set; } + + } + + /// + /// 我的志愿表分页查询输入参数 + /// + public class SysVolunteerTbInput : BasePageInput + { + /// + /// 关键字查询 + /// + public string SearchKey { get; set; } + + /// + /// 用户Id + /// + public long? CId { get; set; } + + /// + /// 志愿表名称 + /// + public string TableName { get; set; } + + /// + /// 批次名称 + /// + public string BatchName { get; set; } + + /// + /// 志愿填报类型 + /// + public string Type { get; set; } + + /// + /// 选科科目 + /// + public string SubjectClaim { get; set; } + + /// + /// 成绩 + /// + public float Score { get; set; } + + /// + /// 志愿表详情 + /// + public string Detail { get; set; } + + } + + /// + /// 我的志愿表增加输入参数 + /// + public class AddSysVolunteerTbInput : SysVolunteerTbBaseInput + { + /// + /// 用户Id + /// + [Required(ErrorMessage = "用户Id不能为空")] + public override int CId { get; set; } + + /// + /// 成绩 + /// + [Required(ErrorMessage = "成绩不能为空")] + public override string Score { get; set; } + + /// + /// 志愿表详情 + /// + [Required(ErrorMessage = "志愿表详情不能为空")] + public override string Detail { get; set; } + + /// + /// 软删除 + /// + [Required(ErrorMessage = "软删除不能为空")] + public override bool IsDelete { get; set; } + + } + + /// + /// 我的志愿表删除输入参数 + /// + public class DeleteSysVolunteerTbInput : BaseIdInput + { + } + + /// + /// 我的志愿表更新输入参数 + /// + public class UpdateSysVolunteerTbInput : SysVolunteerTbBaseInput + { + /// + /// 主键Id + /// + [Required(ErrorMessage = "主键Id不能为空")] + public long Id { get; set; } + + } + + /// + /// 我的志愿表主键查询输入参数 + /// + public class QueryByIdSysVolunteerTbInput : DeleteSysVolunteerTbInput + { + + } diff --git a/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/Dto/SysVolunteerTbOutput.cs b/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/Dto/SysVolunteerTbOutput.cs new file mode 100644 index 0000000..e9c8921 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/Dto/SysVolunteerTbOutput.cs @@ -0,0 +1,85 @@ +namespace Admin.NET.Application; + +/// +/// 我的志愿表输出参数 +/// +public class SysVolunteerTbOutput +{ + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 用户Id + /// + public long CId { get; set; } + + /// + /// 志愿表名称 + /// + public string? TableName { get; set; } + + /// + /// 批次名称 + /// + public string? BatchName { get; set; } + + /// + /// 志愿填报类型 + /// + public string? Type { get; set; } + + /// + /// 选科科目 + /// + public string? SubjectClaim { get; set; } + + /// + /// 成绩 + /// + public float Score { get; set; } + + /// + /// 志愿表详情 + /// + public string Detail { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + + } + + diff --git a/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/Dto/VolunteerTbDetailDto.cs b/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/Dto/VolunteerTbDetailDto.cs new file mode 100644 index 0000000..e5fa4b5 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/Dto/VolunteerTbDetailDto.cs @@ -0,0 +1,302 @@ +using Admin.NET.Core.Service; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application.Service; + + +public class VoTabDetailDto +{ + public VoTableDtoResponse VoTable { get; set; } + + public List tbDetails { get; set; } + + + +} + +public class VoTableDtoResponse +{ + /// + /// 志愿表ID-新增不传 + /// + public long VId { get; set; } + /// + /// 用户ID + /// + public long CId { get; set; } + + public int Sp { get; set; } + + /// + /// 志愿表名称 + /// + public string TableName { get; set; } + + public string personlocationCode { get; set; } + /// + /// 批次 + /// + public string BatchName { get; set; } + + /// + /// 用户名称 + /// + public string CustomerName { get; set; } + + /// + /// 志愿填报类型(智能填报|一键填报) + /// + public string Type { get; set; } + + /// + /// 选科科目 + /// + public string SubjectClaim { get; set; } + + /// + ///填报志愿选择成绩 + /// + public float Score { get; set; } + + public bool IsPush { get; set; } + public DateTime? CreateTime { get; set; } + + public string LocationName { get; set; } + +} +public class VoTableDtoRequest +{ + /// + /// 志愿表ID-新增不传 + /// + public long VId { get; set; } + /// + /// 用户ID + /// + public long CId { get; set; } + + /// + /// 志愿表名称 + /// + public string TableName { get; set; } + + /// + /// 批次 + /// + public string BatchName { get; set; } + + + /// + /// 志愿填报类型(智能填报|一键填报) + /// + public string Type { get; set; } + + /// + /// 选科科目 + /// + public string SubjectClaim { get; set; } + + public string LocationCode { get; set;} + + /// + ///填报志愿选择成绩 + /// + public float Score { get; set; } + + + /// + /// 志愿表详情 + /// + public List vTbDetails { get; set; } + + + +} + + +public class TbDetailASDto +{ + + /// + /// 院校详情 + /// + public List childItems { get; set; } + /// + /// + /// + public int Year { get; set; } + /// + /// 院校Id + /// + public long UnId { get; set; } + + public string city { get; set; } + /// + /// 院校名称 + /// + public string UnName { get; set; } + + public string Logo { get; set; } + public string UnCode { get; set; } + public string Rank { get; set; } + + /// + /// 冲稳保 + /// + public int Type { get; set; } + + + /// + /// 985、211 + /// + public List features { get; set; } + public string ownership { get; set; } + + public string educationCategory { get; set; } + + public string province { get; set; } + + public int Sort { get; set; } + + /// + /// 综合| + /// + public string subjectType { get; set; } + + + /// + ///保存内容详情 + /// + public List vItems { get; set; } +} + +public class VItemDetail +{ + public int Sort { get; set; } + /// + /// 招生计划 + /// + public int _pId { get; set; } + + /// + /// 专业名称 + /// + public string Major { get; set; } + /// + /// 专业code + /// + public string MajorCode { get; set; } + public string MajorGroup { get; set; } + + /// + /// 冲稳保 + /// + public int type { get; set; } + + /// + /// 成功百分比 + /// + public string percentAge { get; set; } + + public string academic { get; set; } + /// + /// 计划数 + /// + public int planCount { get; set; } + + + + /// + /// 学费 + /// + public string fee { get; set; } + + + + /// + /// + /// + public string nature { get; set; } + + /// + /// 专业备注 + /// + public string remark { get; set; } + + /// + /// 选科组合 + /// + public string subjectClam { get; set; } + + /// + /// + /// + public List planItems { get; set; } +} + + + + +public class VTbDetailDto +{ + + /// + /// 院校Id + /// + public int UnId { get; set; } + + /// + /// 院校名称 + /// + public string UnName { get; set; } + + public string UnCode { get; set; } + + /// + /// 冲稳保 + /// + public int type { get; set; } + + public int Sort { get; set; } + + /// + ///保存内容详情 + /// + public List vItems { get; set; } + +} + + +public class VItem +{ + public int Sort { get; set; } + /// + /// 招生计划 + /// + public int _pId { get; set; } + + /// + /// 专业名称 + /// + public string major { get; set; } + /// + /// 专业code + /// + public string majorCode { get; set; } + + public string majorGroup { get; set; } + + /// + /// 冲稳保 + /// + public int type { get; set; } + + /// + /// 成功百分比 + /// + public string percentAge { get; set; } +} diff --git a/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/SysVolunteerTbService.cs b/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/SysVolunteerTbService.cs new file mode 100644 index 0000000..a7f697d --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/SysVolunteerTbService.cs @@ -0,0 +1,151 @@ +using Admin.NET.Core.Service; +using Microsoft.AspNetCore.Http; +namespace Admin.NET.Application; +/// +/// 我的志愿表服务 +/// +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 100)] +public class SysVolunteerTbService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _rep; + public SysVolunteerTbService(SqlSugarRepository rep) + { + _rep = rep; + } + + /// + /// 分页查询我的志愿表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Page")] + public async Task> Page(SysVolunteerTbInput input) + { + var query = _rep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => + u.TableName.Contains(input.SearchKey.Trim()) + || u.BatchName.Contains(input.SearchKey.Trim()) + //|| u.Type.Contains(input.SearchKey.Trim()) + || u.SubjectClaim.Contains(input.SearchKey.Trim()) + //|| u.Score.Contains(input.SearchKey.Trim()) + //|| u.Detail.Contains(input.SearchKey.Trim()) + ) + .WhereIF(input.CId>0, u => u.CId == input.CId) + .WhereIF(!string.IsNullOrWhiteSpace(input.TableName), u => u.TableName.Contains(input.TableName.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.BatchName), u => u.BatchName.Contains(input.BatchName.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Type), u => u.Type.Contains(input.Type.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.SubjectClaim), u => u.SubjectClaim.Contains(input.SubjectClaim.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Detail), u => u.Detail.Contains(input.Detail.Trim())) + //处理外键和TreeSelector相关字段的连接 + .LeftJoin((u, cid) => u.CId == cid.Id ) + .OrderBy(u => u.CreateTime) + .Select((u, cid) => new SysVolunteerTbOutput + { + Id = u.Id, + CId = u.CId, + // CIdId = cid.Id, + TableName = u.TableName, + BatchName = u.BatchName, + Type = u.Type, + SubjectClaim = u.SubjectClaim, + Score = u.Score, + Detail = u.Detail, + CreateTime = u.CreateTime, + UpdateTime = u.UpdateTime, + CreateUserId = u.CreateUserId, + CreateUserName = u.CreateUserName, + UpdateUserId = u.UpdateUserId, + UpdateUserName = u.UpdateUserName, + IsDelete = u.IsDelete, + }); + return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 增加我的志愿表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Add")] + public async Task Add(AddSysVolunteerTbInput input) + { + var entity = input.Adapt(); + await _rep.InsertAsync(entity); + return entity.Id; + } + + /// + /// 删除我的志愿表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Delete")] + public async Task Delete(DeleteSysVolunteerTbInput input) + { + var entity = await _rep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + await _rep.FakeDeleteAsync(entity); //假删除 + //await _rep.DeleteAsync(entity); //真删除 + } + + /// + /// 更新我的志愿表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Update")] + public async Task Update(UpdateSysVolunteerTbInput input) + { + var entity = input.Adapt(); + await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); + } + + /// + /// 获取我的志愿表 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "Detail")] + public async Task Detail([FromQuery] QueryByIdSysVolunteerTbInput input) + { + return await _rep.GetFirstAsync(u => u.Id == input.Id); + } + + /// + /// 获取我的志愿表列表 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "List")] + public async Task> List([FromQuery] SysVolunteerTbInput input) + { + return await _rep.AsQueryable().Select().ToListAsync(); + } + + + /// + /// 获取用户Id列表 + /// + /// + [ApiDescriptionSettings(Name = "SysWeChatUserExtendCIdDropdown"), HttpGet] + public async Task SysWeChatUserExtendCIdDropdown() + { + return await _rep.Context.Queryable() + .Select(u => new + { + Label = u.Id, + Value = u.Id + } + ).ToListAsync(); + } + + + + +} + diff --git a/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/VolunTbService.cs b/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/VolunTbService.cs new file mode 100644 index 0000000..cf590b9 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysVolunteerTb/VolunTbService.cs @@ -0,0 +1,736 @@ +using Admin.NET.Core; +using Admin.NET.Core.Service; +using AngleSharp.Dom; +using DocumentFormat.OpenXml.Wordprocessing; +using Elastic.Clients.Elasticsearch; +using Furion.DatabaseAccessor; +using iText.Kernel.Pdf; +using Microsoft.AspNetCore.Http; +using MiniExcelLibs; +using MongoDB.Bson; +using MongoDB.Driver; +using NewLife.Net.Handlers; +using Newtonsoft.Json; +using OfficeOpenXml; +using Org.BouncyCastle.Ocsp; +using SharpCompress.Common; +using SkiaSharp; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Text.Json.Serialization; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using static Admin.NET.Core.PdfOptHelper; + +namespace Admin.NET.Application.Service; + + +/// +/// 我的志愿表 +/// +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 800)] +public class VolunTbService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _rep; + private readonly UserManager _userManager; + private readonly IMongoDBRepository _mongoRepository; + private readonly IHttpContextAccessor _httpContextAccessor; + private readonly IHttpClientFactory _httpClientFactory; + private readonly SqlSugarRepository _busProvince; + public VolunTbService(SqlSugarRepository rep, UserManager userManager, IMongoDBRepository mongoDBRepository, IHttpContextAccessor httpContextAccessor, IHttpClientFactory httpClientFactory, SqlSugarRepository busProvince) + { + _rep = rep; + _userManager = userManager; + _mongoRepository = mongoDBRepository; + _httpClientFactory = httpClientFactory; + _httpContextAccessor = httpContextAccessor; + _busProvince = busProvince; + } + + + + /// + /// 分页查询我的志愿表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Page")] + public async Task> Page(SysVolunteerTbInput input) + { + var query = _rep.AsQueryable() + .Where(e => e.CId == _userManager.UserId) + .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => + u.TableName.Contains(input.SearchKey.Trim()) + || u.BatchName.Contains(input.SearchKey.Trim()) + //|| u.Type.Contains(input.SearchKey.Trim()) + || u.SubjectClaim.Contains(input.SearchKey.Trim()) + //|| u.Score.Contains(input.SearchKey.Trim()) + //|| u.Detail.Contains(input.SearchKey.Trim()) + ) + .WhereIF(input.CId > 0, u => u.CId == input.CId) + .WhereIF(!string.IsNullOrWhiteSpace(input.TableName), u => u.TableName.Contains(input.TableName.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.BatchName), u => u.BatchName.Contains(input.BatchName.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Type), u => u.Type.Contains(input.Type.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.SubjectClaim), u => u.SubjectClaim.Contains(input.SubjectClaim.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Detail), u => u.Detail.Contains(input.Detail.Trim())) + .LeftJoin((u, cid) => u.CId == cid.Id) + .OrderBy((u, cid) => u.CreateTime, OrderByType.Desc) + .Select((u, cid) => new VoTableDtoResponse + { + BatchName = u.BatchName, + VId = u.Id, + CId = cid.Id, + CreateTime = u.CreateTime, + CustomerName = u.CreateUserName, + // personlocationCode = u.CreateUserName, + Score = u.Score, + SubjectClaim = u.SubjectClaim, + TableName = u.TableName, + Type = u.Type, + IsPush = u.IsPush, + }); + return await query.ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 查询志愿列表 + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "List")] + public async Task> List() + { + return await _rep.AsQueryable().Where(e => e.CId == _userManager.UserId).Select(c => new VoTableDtoResponse() + { + BatchName = c.BatchName, + CId = c.CId, + Score = c.Score, + SubjectClaim = c.SubjectClaim, + TableName = c.TableName, + Type = c.Type, + VId = c.Id, + IsPush = c.IsPush, + CreateTime = c.CreateTime + }).OrderByDescending(c => c.VId).ToListAsync(); + } + + /// + /// 查询志愿列表 + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "V2/List")] + public async Task> ListV2([FromQuery] string locationCode) + { + var provincename = await _busProvince.AsQueryable().Where(e => e.Code == locationCode).FirstAsync(); + return await _rep.AsQueryable().WhereIF(!string.IsNullOrWhiteSpace(locationCode), l => l.LocationCode == locationCode).Where(e => e.CId == _userManager.UserId).Select(c => new VoTableDtoResponse() + { + BatchName = c.BatchName, + CId = c.CId, + Score = c.Score, + SubjectClaim = c.SubjectClaim, + TableName = c.TableName, + Type = c.Type, + VId = c.Id, + IsPush = c.IsPush, + CreateTime = c.CreateTime, + personlocationCode = c.LocationCode, + LocationName = provincename.Name + }).OrderByDescending(c => c.VId).ToListAsync(); + } + + + /// + /// 保存我的志愿 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Post")] + public async Task Post([FromBody] VoTableDtoRequest request) + { + //if (request.CId <= 0) + //{ + // throw Oops.Oh("用户Id不能为空"); + //} + int ordersort = 0; + var vol = (await _rep.GetListAsync(c => c.CId == _userManager.UserId)); + if (vol.Any()) + { + request.TableName = "我的志愿表" + (vol.OrderByDescending(c => c.CreateTime).FirstOrDefault().OrderSort + 1); + ordersort = (vol.OrderByDescending(c => c.CreateTime).FirstOrDefault().OrderSort + 1); + } + else + { + request.TableName = "我的志愿表01"; + ordersort = 1; + } + var newmodels = new SysVolunteerTb() + { + CreateTime = DateTime.Now, + CId = _userManager.UserId, + LocationCode = request.LocationCode, + UpdateTime = DateTime.Now, + OrderSort = ordersort, + IsDelete = false, + SubjectClaim = request.SubjectClaim, + Type = request.Type, + Score = request.Score, + BatchName = request.BatchName, + TableName = request.TableName, + CreateUserId = _userManager.UserId, + UpdateUserId = _userManager.UserId, + CreateUserName = _userManager.RealName, + UpdateUserName = _userManager.RealName, + Detail = request.vTbDetails.ToJson() + }; + await _rep.InsertAsync(newmodels); + return newmodels.Id; + } + + /// + /// 修改我的志愿 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Put")] + public async Task Put([FromBody] VoTableDtoRequest request) + { + if (request.VId <= 0) + { + throw Oops.Oh("志愿id为必传"); + } + var model = await _rep.GetSingleAsync(c => c.Id == request.VId); + if (!string.IsNullOrWhiteSpace(request.TableName)) { model.TableName = request.TableName; } + model.Detail = request.vTbDetails.ToJson(); + model.UpdateTime = DateTime.Now; + model.UpdateUserName = _userManager.RealName; + model.UpdateUserId = _userManager.UserId; + await _rep.UpdateAsync(model); + return model.Id; + } + + + /// + /// 删除我的志愿表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Delete")] + public async Task Delete(DeleteSysVolunteerTbInput input) + { + var entity = await _rep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + await _rep.DeleteAsync(entity); //假删除 + } + + + /// + ///志愿单提交给专家 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "PushStatus")] + public async Task PushStatus(DeleteSysVolunteerTbInput input) + { + var entity = await _rep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + var replist = await _rep.GetListAsync(u => u.CId == entity.CId); + var updatedList = replist.Select(a => + { + a.IsPush = false; + return a; + }).ToList(); + await _rep.UpdateRangeAsync(updatedList); + entity.IsPush = true; + await _rep.UpdateAsync(entity); + } + + + /// + /// 已添加志愿列表详情 + /// + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "Get")] + public async Task Get([FromQuery] long Id, string location) + { + var asrespose = new VoTabDetailDto(); + var entity = await _rep.GetFirstAsync(u => u.Id == Id); + var rep = new VoTableDtoResponse(); + rep.CId = entity.CId; + rep.TableName = entity.TableName; + rep.BatchName = entity.BatchName; + rep.Type = entity.Type; + rep.SubjectClaim = entity.SubjectClaim; + rep.Score = entity.Score; + asrespose.VoTable = rep; + var jsons = JsonConvert.DeserializeObject>(entity.Detail); + var pids = jsons.SelectMany(c => c.vItems.Select(c => c._pId).ToList()).ToList(); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var bejson = dbclient.GetCollection(string.Format("zsplanfusionmodel_{0}", location)); + var filterBuilders = new List>(); + filterBuilders.Add(Builders.Filter.In(p => p.pid, pids)); + FilterDefinition filter = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) + : new BsonDocument(); // 如果没有条件,则使用空过滤器 + var list = await bejson.Find(filter).ToListAsync(); + var dtolist = new List(); + DateTime dt = DateTime.Now; + DateTime fixedDate = new DateTime(dt.Year, 7, 20); + int year = dt > fixedDate ? dt.Year : dt.Year - 1; + jsons.ForEach(c => + { + var vlist = new List(); + string educationCategory = string.Empty; + var features = new List(); + string ownership = string.Empty; + string province = string.Empty; + string subjectType = string.Empty; + string city = string.Empty; + string uName = string.Empty; + c.vItems.ForEach(a => + { + + var plan = list.FirstOrDefault(f => f.pid == a._pId); + if (plan != null) + { + uName = plan.universityName; + educationCategory = plan.educationCategory; + features = plan.features; + ownership = plan.ownership; + province = plan.province; + subjectType = plan.subjectType; + city = plan.city; + vlist.Add(new VItemDetail + { + MajorCode = plan.majorCode, + MajorGroup = string.IsNullOrWhiteSpace(plan.majorGroup) ? "" : "(" + plan.majorGroup.Split("(")[1], + percentAge = a.percentAge, + _pId = a._pId, + Sort = a.Sort, + type = a.type, + Major = plan.majorName, + academic = plan.academicYear, + //features = plan.features, + fee = plan.fee, + nature = plan.nature, + // ownership = plan.ownership, + planCount = plan.planCount, + planItems = plan.items, + remark = plan.remark, + subjectClam = plan._23subject, + // subjectType = plan.subjectType, + }); + } + }); + dtolist.Add(new TbDetailASDto() + { + Year = year, + Type = c.type, + Sort = c.Sort, + UnCode = c.UnCode, + UnName = uName, + educationCategory = educationCategory, + features = features, + ownership = ownership, + province = province, + subjectType = subjectType, + city = city, + Logo = "https://static-data.ycymedu.com/6.jpg", + UnId = c.UnId, + childItems = vlist + .SelectMany(e => e.planItems ?? Enumerable.Empty()) + .GroupBy(pi => pi.year) + .Select(g => new UChildItem + { + year = g.Key, + planCount = g.Sum(pi => pi.planCount), + score = Math.Round(g.Average(pi => pi.score), 0), + rankLine = Math.Round(g.Average(pi => pi.rankLine), 0) + }) + .OrderByDescending(result => result.year) + .ToList(), + vItems = vlist + }); + }); + var university = dbclient.GetCollection("university"); + + // 获取 dtolist 中的所有 UnId + var unIds = dtolist.Select(c => c.UnId).ToList(); + + // 构建查询条件 + FilterDefinition unfilter = unIds.Any() + ? Builders.Filter.In(p => p._id, unIds) + : Builders.Filter.Empty; // 如果 dtolist 为空,则查询所有数据 + + // 执行查询 + var unlist = await university.Find(unfilter).ToListAsync(); + dtolist.ForEach(a => + { + a.Rank = unlist.Where(e => e._id == a.UnId).Any() ? unlist.Where(e => e._id == a.UnId).FirstOrDefault().rank : "暂无"; + a.features = unlist.Where(e => e._id == a.UnId).Any() ? unlist.Where(e => e._id == a.UnId).FirstOrDefault().features : new List(); + a.Logo = unlist.Where(e => e._id == a.UnId).Any() ? unlist.Where(e => e._id == a.UnId).FirstOrDefault().logo : "https://api-static-zhiy.oss-cn-shanghai.aliyuncs.com/images/nocontent/empty.png"; + }); + asrespose.tbDetails = dtolist; + return asrespose; + + } + + + + + + /// + /// 导出excel + /// + /// + /// + [HttpGet("Export"), NonUnify] + public async Task Export([FromQuery] ExportExcelDto dto) + { + var viewentity = await _rep.GetFirstAsync(u => u.Id == dto.Id); + var jsons = JsonConvert.DeserializeObject>(viewentity.Detail); + var pids = jsons.SelectMany(c => c.vItems.Select(c => c._pId).ToList()).ToList(); + + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var bejson = dbclient.GetCollection(string.Format("zsplanfusionmodel_{0}", dto.location)); + var filterBuilders = new List>(); + filterBuilders.Add(Builders.Filter.In(p => p.pid, pids)); + FilterDefinition filter = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) + : new BsonDocument(); + var list = await bejson.Find(filter).ToListAsync(); + + // 按院校分组 + var groupedData = jsons.GroupBy(c => new { c.UnCode, c.UnName }) + .Select(group => new + { + UniversityCode = group.Key.UnCode, + UniversityName = group.Key.UnName, + Items = group.SelectMany(c => c.vItems).ToList() + }).ToList(); + + using (var package = new ExcelPackage()) + { + var worksheet = package.Workbook.Worksheets.Add("志愿表"); + + // 设置字体 + worksheet.Cells.Style.Font.Name = "Calibri"; + worksheet.Cells.Style.Font.Size = 12; + + // 设置表头 + worksheet.Cells[1, 1].Value = "院校代码"; + worksheet.Cells[1, 2].Value = "院校名称"; + worksheet.Cells[1, 3].Value = "专业名称"; + worksheet.Cells[1, 4].Value = "专业信息"; + worksheet.Cells[1, 5].Value = "2024招生计划"; + worksheet.Cells[1, 6].Value = "2024分数/位次"; + worksheet.Cells[1, 7].Value = "2023分数/位次"; + worksheet.Cells[1, 8].Value = "2022分数/位次"; + + // 设置表头样式 + using (var headerRange = worksheet.Cells[1, 1, 1, 8]) + { + headerRange.Style.Font.Bold = true; + headerRange.Style.Font.Size = 12; // 表头字体稍大 + headerRange.Style.Font.Color.SetColor(SixLabors.ImageSharp.Color.White); // 白色字体 + headerRange.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid; + headerRange.Style.Fill.BackgroundColor.SetColor(SixLabors.ImageSharp.Color.FromRgb(51, 112, 255)); // 深蓝色背景 + headerRange.Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center; + headerRange.Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center; + headerRange.Style.Border.BorderAround(OfficeOpenXml.Style.ExcelBorderStyle.Thick, System.Drawing.Color.Black); // 边框加粗 + } + + int currentRow = 2; // 从第2行开始写数据 + + // 写入数据并处理合并 + foreach (var university in groupedData) + { + int startRow = currentRow; // 合并起始行 + + foreach (var major in university.Items) + { + var plan = list.FirstOrDefault(f => f.pid == major._pId); + if (plan != null) + { + //var _24items = plan.items.Where(e => e.year == "2024"); + var _23items = plan.items.Where(e => e.year == "2023"); + var _22items = plan.items.Where(e => e.year == "2022"); + + worksheet.Cells[currentRow, 3].Value = plan.majorName; + worksheet.Cells[currentRow, 4].Value = string.Format("代码:{0}\n学年:{1}/年\n费用:{2}\n 选科:{3}", plan.majorCode, plan.academicYear, plan.fee, plan._24subject); + worksheet.Cells[currentRow, 5].Value = plan.planCount; + worksheet.Cells[currentRow, 6].Value = plan._score > 0 ? plan._score : "--"; + worksheet.Cells[currentRow, 7].Value = string.Format("{0}\n{1}", _23items.Any() ? _23items.FirstOrDefault().score > 0 ? _23items.FirstOrDefault().score.ToString() : "--" : "--", _23items.FirstOrDefault().rankLine); + worksheet.Cells[currentRow, 8].Value = string.Format("{0}\n{1}", _22items.Any() ? _22items.FirstOrDefault().score > 0 ? _22items.FirstOrDefault().score.ToString() : "--" : "--", _22items.FirstOrDefault().rankLine); + + currentRow++; + } + } + + // 合并院校代码和院校名称列 + if (startRow < currentRow - 1) + { + worksheet.Cells[startRow, 1, currentRow - 1, 1].Merge = true; // 合并院校代码列 + worksheet.Cells[startRow, 2, currentRow - 1, 2].Merge = true; // 合并院校名称列 + } + + worksheet.Cells[startRow, 1].Value = university.UniversityCode; + worksheet.Cells[startRow, 2].Value = university.UniversityName; + } + + // 设置内容单元格样式 + for (int i = 2; i < currentRow; i++) + { + // 交替行背景色 + var rowColor = i % 2 == 0 ? SixLabors.ImageSharp.Color.FromRgb(242, 242, 242) : SixLabors.ImageSharp.Color.White; + using (var contentRange = worksheet.Cells[i, 1, i, 8]) + { + contentRange.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid; + contentRange.Style.Fill.BackgroundColor.SetColor(rowColor); + + // 设置水平和垂直居中 + contentRange.Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center; + contentRange.Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center; + + // 设置边框 + contentRange.Style.Border.Top.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin; + contentRange.Style.Border.Top.Color.SetColor(SixLabors.ImageSharp.Color.Gray); // 顶部边框颜色 + + contentRange.Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin; + contentRange.Style.Border.Bottom.Color.SetColor(SixLabors.ImageSharp.Color.Gray); // 底部边框颜色 + + contentRange.Style.Border.Left.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin; + contentRange.Style.Border.Left.Color.SetColor(SixLabors.ImageSharp.Color.Gray); // 左侧边框颜色 + + contentRange.Style.Border.Right.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin; + contentRange.Style.Border.Right.Color.SetColor(SixLabors.ImageSharp.Color.Gray); // 右侧边框颜色 + } + } + + // 自动调整列宽 + worksheet.Cells.AutoFitColumns(); + + // 设置行高 + worksheet.Cells.Style.WrapText = true; // 自动换行 + worksheet.Row(1).Height = 24; // 表头行高 + for (int i = 2; i < currentRow; i++) + { + worksheet.Row(i).Height = 65; // 数据行行高 + } + + // 导出 Excel 文件 + var stream = new MemoryStream(); + package.SaveAs(stream); + stream.Seek(0, SeekOrigin.Begin); + + return new FileStreamResult(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + { + FileDownloadName = $"志愿表_{DateTime.Now:yyyyMMddHHmmss}.xlsx" + }; + } + } + + + + + + + + + /// + /// + /// + /// + /// + /// + [HttpGet("downloadpdf")] + public async Task GenerateAsync([FromQuery] ExportExcelDto dto) + { + string[] unversityheaders = { "志愿", "概率", "院校代码", "院校名称", "24招生计划", "历年", "2024", "2023", "2022" }; + string[] majorlistheaders = { "序号", "概率", "专业代码", "专业名称", "24招生计划", "历年", "2024", "2023", "2022" }; + if (dto.Id <= 0) + { + throw new Exception("id为空"); + } + var ulist = new List(); + var viewentity = await _rep.GetFirstAsync(u => u.Id == dto.Id); + var jsons = JsonConvert.DeserializeObject>(viewentity.Detail); + var pids = jsons.SelectMany(c => c.vItems.Select(c => c._pId).ToList()).ToList(); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var bejson = dbclient.GetCollection(string.Format("zsplanfusionmodel_{0}", dto.location)); + var filterBuilders = new List>(); + filterBuilders.Add(Builders.Filter.In(p => p.pid, pids)); + FilterDefinition filter = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) + : new BsonDocument(); // 如果没有条件,则使用空过滤器 + var list = await bejson.Find(filter).ToListAsync(); + var udist = jsons.Select(s => new PdfOptHelper.dataModel { universityCode = s.UnCode, universityName = s.UnName }).Distinct().ToList(); + int k = 0; + udist.ForEach(a => + { + k++; + var majorlist = new List(); + var schoolinfo = new zsplanfusionmodel(); + var vitems = jsons.Where(e => e.UnCode == a.universityCode).SelectMany(s => s.vItems).ToList(); + int z = 0; + vitems.ForEach(v => + { + z++; + var majormodel = list.Where(e => e.pid == v._pId).FirstOrDefault(); + var mlist = new List(); + mlist.Add(string.Format("{0}\n{1}\n{2}\n{3}", majormodel.planCount == 0 ? "--" : majormodel.planCount.ToString(), majormodel._score == 0 ? "--" : majormodel._score.ToString(), "--", "--")); + majormodel.items.OrderByDescending(b => b.year).Take(2).ToList().ForEach(x => + { + mlist.Add(string.Format("{0}\n{1}\n{2}\n{3}", x.planCount, x.score, x.rankLine, "--")); + }); + majorlist.Add(new dataMajorModel() + { + id = z, + majorCode = majormodel.majorCode, + mjaorName = PdfOptHelper.AddLineBreaks(majormodel.majorName, 9), + probability = v.percentAge, + history = "计划人数\n最低分\n最低位次\n效位差", + planCount = string.Format("{0}人\n{1}年\n¥{2}\n{3}", majormodel.planCount.ToString(), majormodel.academicYear, majormodel.fee, majormodel._24subject), + years = mlist + }); + schoolinfo = majormodel; + }); + ulist.Add(new PdfOptHelper.dataModel() + { + id = k, + planCount = list.Where(e => e.universityName == a.universityName).Sum(s => s.planCount).ToString(), + universityName = a.universityName, + universityCode = a.universityCode, + planName = a.planName, + probability = "--", + history = "计划人数\n最低分\n最低位次\n效位差", + years = new List() { schoolinfo.items.Sum(s => s.planCount).ToString(), schoolinfo._schoolScore.ToString(), schoolinfo._schoolScoreLine.ToString(), "--" }, + majorModels = majorlist + }); + }); + var stream = PdfOptHelper.CreatePdfAsync(string.Format("{0}-{1}-{2}", viewentity.Type, viewentity.SubjectClaim, viewentity.Score), unversityheaders.ToList(), majorlistheaders.ToList(), ulist, viewentity.CreateTime.Value); + // 将 byte[] 转换为 MemoryStream + var pdfStream = new MemoryStream(stream); + + return new FileStreamResult(pdfStream, "application/pdf") + { + FileDownloadName = string.Format("{0}.pdf", DateTime.Now.ToString("yyyyMMddhhssfff_")) + }; + } + + + + /// + /// 生成 PDF 并上传至阿里云 OSS,返回文件 URL。 + /// + /// + /// + /// + [HttpGet("downloadpdfUrl")] + public async Task GeneratePdfAsync([FromQuery] ExportExcelDto dto) + { + string[] unversityheaders = { "志愿", "概率", "院校代码", "院校名称", "24招生计划", "历年", "2024", "2023", "2022" }; + string[] majorlistheaders = { "序号", "概率", "专业代码", "专业名称", "24招生计划", "历年", "2024", "2023", "2022" }; + if (dto.Id <= 0) + { + throw new Exception("id为空"); + } + var ulist = new List(); + var viewentity = await _rep.GetFirstAsync(u => u.Id == dto.Id); + var jsons = JsonConvert.DeserializeObject>(viewentity.Detail); + var pids = jsons.SelectMany(c => c.vItems.Select(c => c._pId).ToList()).ToList(); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var bejson = dbclient.GetCollection(string.Format("zsplanfusionmodel_{0}", dto.location)); + var filter = Builders.Filter.In(p => p.pid, pids); + var list = await bejson.Find(filter).ToListAsync(); + var udist = jsons.Select(s => new PdfOptHelper.dataModel { universityCode = s.UnCode, universityName = s.UnName }).Distinct().ToList(); + int k = 0; + foreach (var a in udist) + { + k++; + var majorlist = new List(); + var schoolinfo = new zsplanfusionmodel(); + var vitems = jsons.Where(e => e.UnCode == a.universityCode).SelectMany(s => s.vItems).ToList(); + int z = 0; + foreach (var v in vitems) + { + z++; + var majormodel = list.FirstOrDefault(e => e.pid == v._pId); + if (majormodel == null) continue; + var mlist = new List + { + string.Format("{0}\n{1}\n{2}\n{3}", majormodel.planCount == 0 ? "--" : majormodel.planCount.ToString(), majormodel._score == 0 ? "--" : majormodel._score.ToString(), "--", "--") + }; + majormodel.items.OrderByDescending(b => b.year).Take(2).ToList().ForEach(x => + { + mlist.Add(string.Format("{0}\n{1}\n{2}\n{3}", x.planCount, x.score, x.rankLine, "--")); + }); + majorlist.Add(new PdfOptHelper.dataMajorModel() + { + id = z, + majorCode = majormodel.majorCode, + mjaorName = PdfOptHelper.AddLineBreaks(majormodel.majorName, 9), + probability = v.percentAge, + history = "计划人数\n最低分\n最低位次\n效位差", + planCount = string.Format("{0}人\n{1}年\n¥{2}\n{3}", majormodel.planCount.ToString(), majormodel.academicYear, majormodel.fee, majormodel._24subject), + years = mlist + }); + schoolinfo = majormodel; + } + ulist.Add(new PdfOptHelper.dataModel() + { + id = k, + planCount = list.Where(e => e.universityName == a.universityName).Sum(s => s.planCount).ToString(), + universityName = a.universityName, + universityCode = a.universityCode, + planName = a.planName, + probability = "--", + history = "计划人数\n最低分\n最低位次\n效位差", + years = new List { schoolinfo.items.Sum(s => s.planCount).ToString(), schoolinfo._schoolScore.ToString(), schoolinfo._schoolScoreLine.ToString(), "--" }, + majorModels = majorlist + }); + } + var stream = PdfOptHelper.CreatePdfAsync(string.Format("{0}-{1}-{2}", viewentity.Type, viewentity.SubjectClaim, viewentity.Score), unversityheaders.ToList(), majorlistheaders.ToList(), ulist, viewentity.CreateTime.Value); + var pdfStream = new MemoryStream(stream); + var fileName = string.Format("{0}.pdf", DateTime.Now.ToString("yyyyMMddhhssfff_")); + var provincename = await _busProvince.AsQueryable().Where(e => e.Code == viewentity.LocationCode).FirstAsync(); + // 2. 构造 IFormFile + IFormFile formFile = new FormFile(pdfStream, 0, stream.Length, "file", fileName) + { + Headers = new HeaderDictionary(), + ContentType = "application/json" + }; + var newFile = await App.GetRequiredService().UploadFile(formFile, "pdf"); + return new AIInfoDto + { + Url = newFile.Url, + TableName = viewentity.TableName, + BatchName = viewentity.BatchName, + Score = viewentity.Score, + SubjectClaim = viewentity.SubjectClaim, + Type = viewentity.Type, + ProvinceName = provincename.Name + + }; + } + + + + + + +} + + + + diff --git a/Admin.NET/Admin.NET.Application/Service/SysVolunteerTbSp/Dto/SysVolunteerTbSpDto.cs b/Admin.NET/Admin.NET.Application/Service/SysVolunteerTbSp/Dto/SysVolunteerTbSpDto.cs new file mode 100644 index 0000000..aabc592 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysVolunteerTbSp/Dto/SysVolunteerTbSpDto.cs @@ -0,0 +1,98 @@ +namespace Admin.NET.Application; + + /// + /// 志愿表专家复制输出参数 + /// + public class SysVolunteerTbSpDto + { + /// + /// 用户Id + /// + public string CIdNickName { get; set; } + + /// + /// 专家Id + /// + public string SCIdNickName { get; set; } + + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 用户Id + /// + public long CId { get; set; } + + /// + /// 专家Id + /// + public long SCId { get; set; } + + /// + /// 志愿表名称 + /// + public string? TableName { get; set; } + + /// + /// 批次名称 + /// + public string? BatchName { get; set; } + + /// + /// 志愿填报类型 + /// + public string? Type { get; set; } + + /// + /// 选科科目 + /// + public string? SubjectClaim { get; set; } + + /// + /// 成绩 + /// + public double Score { get; set; } + + /// + /// 志愿表详情 + /// + public string Detail { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + + } diff --git a/Admin.NET/Admin.NET.Application/Service/SysVolunteerTbSp/Dto/SysVolunteerTbSpInput.cs b/Admin.NET/Admin.NET.Application/Service/SysVolunteerTbSp/Dto/SysVolunteerTbSpInput.cs new file mode 100644 index 0000000..e06f25e --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysVolunteerTbSp/Dto/SysVolunteerTbSpInput.cs @@ -0,0 +1,203 @@ +using Admin.NET.Core; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application; + + /// + /// 志愿表专家复制基础输入参数 + /// + public class SysVolunteerTbSpBaseInput + { + /// + /// 用户Id + /// + public virtual long CId { get; set; } + + /// + /// 专家Id + /// + public virtual long SCId { get; set; } + + /// + /// 志愿表名称 + /// + public virtual string? TableName { get; set; } + + /// + /// 批次名称 + /// + public virtual string? BatchName { get; set; } + + /// + /// 志愿填报类型 + /// + public virtual string? Type { get; set; } + + /// + /// 选科科目 + /// + public virtual string? SubjectClaim { get; set; } + + /// + /// 成绩 + /// + public virtual double Score { get; set; } + + /// + /// 志愿表详情 + /// + public virtual string Detail { get; set; } + + /// + /// 创建时间 + /// + public virtual DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public virtual DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public virtual long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public virtual string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public virtual long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public virtual string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public virtual bool IsDelete { get; set; } + + } + + /// + /// 志愿表专家复制分页查询输入参数 + /// + public class SysVolunteerTbSpInput : BasePageInput + { + /// + /// 关键字查询 + /// + public string? SearchKey { get; set; } + + /// + /// 用户Id + /// + public long? CId { get; set; } + + /// + /// 专家Id + /// + public long? SCId { get; set; } + + /// + /// 志愿表名称 + /// + public string? TableName { get; set; } + + /// + /// 批次名称 + /// + public string? BatchName { get; set; } + + /// + /// 志愿填报类型 + /// + public string? Type { get; set; } + + /// + /// 选科科目 + /// + public string? SubjectClaim { get; set; } + + /// + /// 成绩 + /// + public double? Score { get; set; } + + /// + /// 志愿表详情 + /// + public string? Detail { get; set; } + + } + + /// + /// 志愿表专家复制增加输入参数 + /// + public class AddSysVolunteerTbSpInput : SysVolunteerTbSpBaseInput + { + /// + /// 用户Id + /// + [Required(ErrorMessage = "用户Id不能为空")] + public override long CId { get; set; } + + /// + /// 专家Id + /// + [Required(ErrorMessage = "专家Id不能为空")] + public override long SCId { get; set; } + + /// + /// 成绩 + /// + [Required(ErrorMessage = "成绩不能为空")] + public override double Score { get; set; } + + /// + /// 志愿表详情 + /// + [Required(ErrorMessage = "志愿表详情不能为空")] + public override string Detail { get; set; } + + /// + /// 软删除 + /// + [Required(ErrorMessage = "软删除不能为空")] + public override bool IsDelete { get; set; } + + } + + /// + /// 志愿表专家复制删除输入参数 + /// + public class DeleteSysVolunteerTbSpInput : BaseIdInput + { + } + + /// + /// 志愿表专家复制更新输入参数 + /// + public class UpdateSysVolunteerTbSpInput : SysVolunteerTbSpBaseInput + { + /// + /// 主键Id + /// + [Required(ErrorMessage = "主键Id不能为空")] + public long Id { get; set; } + + } + + /// + /// 志愿表专家复制主键查询输入参数 + /// + public class QueryByIdSysVolunteerTbSpInput : DeleteSysVolunteerTbSpInput + { + + } diff --git a/Admin.NET/Admin.NET.Application/Service/SysVolunteerTbSp/Dto/SysVolunteerTbSpOutput.cs b/Admin.NET/Admin.NET.Application/Service/SysVolunteerTbSp/Dto/SysVolunteerTbSpOutput.cs new file mode 100644 index 0000000..24bef6d --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysVolunteerTbSp/Dto/SysVolunteerTbSpOutput.cs @@ -0,0 +1,104 @@ +namespace Admin.NET.Application; + +/// +/// 志愿表专家复制输出参数 +/// +public class SysVolunteerTbSpOutput +{ + + + public string LocationCode { get; set; } + + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 用户Id + /// + public long CId { get; set; } + + /// + /// 用户Id 描述 + /// + public string CIdNickName { get; set; } + + /// + /// 专家Id + /// + public long SCId { get; set; } + + /// + /// 专家Id 描述 + /// + public string SCIdNickName { get; set; } + + /// + /// 志愿表名称 + /// + public string? TableName { get; set; } + + /// + /// 批次名称 + /// + public string? BatchName { get; set; } + + /// + /// 志愿填报类型 + /// + public string? Type { get; set; } + + /// + /// 选科科目 + /// + public string? SubjectClaim { get; set; } + + /// + /// 成绩 + /// + public double Score { get; set; } + + /// + /// 志愿表详情 + /// + public string Detail { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + + } + + diff --git a/Admin.NET/Admin.NET.Application/Service/SysVolunteerTbSp/SysVolunteerTbSpService.cs b/Admin.NET/Admin.NET.Application/Service/SysVolunteerTbSp/SysVolunteerTbSpService.cs new file mode 100644 index 0000000..9a7a0b9 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysVolunteerTbSp/SysVolunteerTbSpService.cs @@ -0,0 +1,180 @@ +using Admin.NET.Core.Service; +using Microsoft.AspNetCore.Http; +namespace Admin.NET.Application; +/// +/// 志愿表专家复制服务 +/// +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 100)] +public class SysVolunteerTbSpService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _rep; + private readonly SqlSugarRepository _weChatUser; + public SysVolunteerTbSpService(SqlSugarRepository rep, SqlSugarRepository weChatUser) + { + _rep = rep; + _weChatUser = weChatUser; + } + + /// + /// 分页查询志愿表专家复制 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Page")] + public async Task> Page(SysVolunteerTbSpInput input) + { + var query = _rep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => + u.TableName.Contains(input.SearchKey.Trim()) + || u.BatchName.Contains(input.SearchKey.Trim()) + || u.Type.Contains(input.SearchKey.Trim()) + || u.SubjectClaim.Contains(input.SearchKey.Trim()) + || u.Detail.Contains(input.SearchKey.Trim()) + ) + .WhereIF(input.CId > 0, u => u.CId == input.CId) + .WhereIF(input.SCId > 0, u => u.SCId == input.SCId) + .WhereIF(!string.IsNullOrWhiteSpace(input.TableName), u => u.TableName.Contains(input.TableName.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.BatchName), u => u.BatchName.Contains(input.BatchName.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Type), u => u.Type.Contains(input.Type.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.SubjectClaim), u => u.SubjectClaim.Contains(input.SubjectClaim.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Detail), u => u.Detail.Contains(input.Detail.Trim())) + //处理外键和TreeSelector相关字段的连接 + .LeftJoin((u, cid) => u.CId == cid.Id) + .LeftJoin((u, cid, scid) => u.SCId == scid.Id) + .OrderBy(u => u.CreateTime) + .Select((u, cid, scid) => new SysVolunteerTbSpOutput + { + Id = u.Id, + CId = u.CId, + CIdNickName = cid.NickName, + SCId = u.SCId, + SCIdNickName = scid.NickName, + TableName = u.TableName, + BatchName = u.BatchName, + Type = u.Type, + SubjectClaim = u.SubjectClaim, + Score = u.Score, + Detail = u.Detail, + CreateTime = u.CreateTime, + UpdateTime = u.UpdateTime, + CreateUserId = u.CreateUserId, + CreateUserName = u.CreateUserName, + UpdateUserId = u.UpdateUserId, + UpdateUserName = u.UpdateUserName, + IsDelete = u.IsDelete, + }); + return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 增加志愿表专家复制 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Add")] + public async Task Add(AddSysVolunteerTbSpInput input) + { + var entity = input.Adapt(); + await _rep.InsertAsync(entity); + return entity.Id; + } + + /// + /// 删除志愿表专家复制 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Delete")] + public async Task Delete(DeleteSysVolunteerTbSpInput input) + { + var entity = await _rep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + await _rep.DeleteAsync(entity); //假删除 + //await _rep.DeleteAsync(entity); //真删除 + } + + /// + /// 更新志愿表专家复制 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Update")] + public async Task Update(UpdateSysVolunteerTbSpInput input) + { + var entity = input.Adapt(); + await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); + } + + /// + /// 获取志愿表专家复制 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "Detail")] + public async Task Detail([FromQuery] QueryByIdSysVolunteerTbSpInput input) + { + return await _rep.GetFirstAsync(u => u.Id == input.Id); + } + + /// + /// 获取志愿表专家复制列表 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "List")] + public async Task> List([FromQuery] SysVolunteerTbSpInput input) + { + var tblist = await _rep.AsQueryable().Select().ToListAsync(); + var uids = tblist.Select(s => s.CId).ToList(); + var userinfo = await _weChatUser.AsQueryable().Where(e => uids.Contains(e.Id)).ToListAsync(); + tblist.ForEach(a => + { + a.CIdNickName = userinfo.Where(s => s.Id == a.CId).Select(s => s.NickName).FirstOrDefault(); + a.SCIdNickName = userinfo.Where(s => s.Id == a.SCId).Select(s => s.NickName).FirstOrDefault(); + }); + return tblist; + } + + /// + /// 获取用户Id列表 + /// + /// + /// + [ApiDescriptionSettings(Name = "SysWechatUserCIdDropdown"), HttpGet] + public async Task SysWechatUserCIdDropdown() + { + return await _rep.Context.Queryable() + .Select(u => new + { + Label = u.NickName, + Value = u.Id + } + ).ToListAsync(); + } + /// + /// 获取专家Id列表 + /// + /// + /// + [ApiDescriptionSettings(Name = "SysWechatUserSCIdDropdown"), HttpGet] + public async Task SysWechatUserSCIdDropdown() + { + return await _rep.Context.Queryable() + .Select(u => new + { + Label = u.NickName, + Value = u.Id + } + ).ToListAsync(); + } + + + + +} + diff --git a/Admin.NET/Admin.NET.Application/Service/SysWeChatUserExtend/Dto/SysWeChatUserExtendDto.cs b/Admin.NET/Admin.NET.Application/Service/SysWeChatUserExtend/Dto/SysWeChatUserExtendDto.cs new file mode 100644 index 0000000..a450da0 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysWeChatUserExtend/Dto/SysWeChatUserExtendDto.cs @@ -0,0 +1,88 @@ +namespace Admin.NET.Application; + + /// + /// 用户拓展字段表输出参数 + /// + public class SysWeChatUserExtendDto + { + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 系统用户Id + /// + public long UserId { get; set; } + + /// + /// 学校名称 + /// + public string SchoolName { get; set; } + + /// + /// 班级名称 + /// + public string ClassName { get; set; } + + /// + /// 选科组合 + /// + public string subjectGroup { get; set; } + + /// + /// vip卡号 + /// + public string VipCode { get; set; } + + /// + /// 是否更新成绩 + /// + public int? IsUpdateScore { get; set; } + + /// + /// 高考年份 + /// + public int? Year { get; set; } + + /// + /// 三方uuid + /// + public string UUID { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + + } diff --git a/Admin.NET/Admin.NET.Application/Service/SysWeChatUserExtend/Dto/SysWeChatUserExtendInput.cs b/Admin.NET/Admin.NET.Application/Service/SysWeChatUserExtend/Dto/SysWeChatUserExtendInput.cs new file mode 100644 index 0000000..fda3f22 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysWeChatUserExtend/Dto/SysWeChatUserExtendInput.cs @@ -0,0 +1,185 @@ +using Admin.NET.Core; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application; + + /// + /// 用户拓展字段表基础输入参数 + /// + public class SysWeChatUserExtendBaseInput + { + /// + /// 系统用户Id + /// + public virtual long UserId { get; set; } + + /// + /// 学校名称 + /// + public virtual string SchoolName { get; set; } + + /// + /// 班级名称 + /// + public virtual string ClassName { get; set; } + + /// + /// 选科组合 + /// + public virtual string subjectGroup { get; set; } + + /// + /// vip卡号 + /// + public virtual string VipCode { get; set; } + + /// + /// 是否更新成绩 + /// + public virtual int? IsUpdateScore { get; set; } + + /// + /// 高考年份 + /// + public virtual int? Year { get; set; } + + /// + /// 三方uuid + /// + public virtual string UUID { get; set; } + + /// + /// 创建时间 + /// + public virtual DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public virtual DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public virtual long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public virtual string CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public virtual long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public virtual string UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public virtual bool IsDelete { get; set; } + + } + + /// + /// 用户拓展字段表分页查询输入参数 + /// + public class SysWeChatUserExtendInput : BasePageInput + { + /// + /// 关键字查询 + /// + public string SearchKey { get; set; } + + /// + /// 系统用户Id + /// + public long? UserId { get; set; } + + /// + /// 学校名称 + /// + public string SchoolName { get; set; } + + /// + /// 班级名称 + /// + public string ClassName { get; set; } + + /// + /// 选科组合 + /// + public string subjectGroup { get; set; } + + /// + /// vip卡号 + /// + public string VipCode { get; set; } + + /// + /// 是否更新成绩 + /// + public int? IsUpdateScore { get; set; } + + /// + /// 高考年份 + /// + public int? Year { get; set; } + + /// + /// 三方uuid + /// + public string UUID { get; set; } + + } + + /// + /// 用户拓展字段表增加输入参数 + /// + public class AddSysWeChatUserExtendInput : SysWeChatUserExtendBaseInput + { + /// + /// 系统用户Id + /// + [Required(ErrorMessage = "系统用户Id不能为空")] + public override long UserId { get; set; } + + /// + /// 软删除 + /// + [Required(ErrorMessage = "软删除不能为空")] + public override bool IsDelete { get; set; } + + } + + /// + /// 用户拓展字段表删除输入参数 + /// + public class DeleteSysWeChatUserExtendInput : BaseIdInput + { + } + + /// + /// 用户拓展字段表更新输入参数 + /// + public class UpdateSysWeChatUserExtendInput : SysWeChatUserExtendBaseInput + { + /// + /// 主键Id + /// + [Required(ErrorMessage = "主键Id不能为空")] + public long Id { get; set; } + + } + + /// + /// 用户拓展字段表主键查询输入参数 + /// + public class QueryByIdSysWeChatUserExtendInput : DeleteSysWeChatUserExtendInput + { + + } diff --git a/Admin.NET/Admin.NET.Application/Service/SysWeChatUserExtend/Dto/SysWeChatUserExtendOutput.cs b/Admin.NET/Admin.NET.Application/Service/SysWeChatUserExtend/Dto/SysWeChatUserExtendOutput.cs new file mode 100644 index 0000000..0687102 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysWeChatUserExtend/Dto/SysWeChatUserExtendOutput.cs @@ -0,0 +1,98 @@ +namespace Admin.NET.Application; + +/// +/// 用户拓展字段表输出参数 +/// +public class SysWeChatUserExtendOutput +{ + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 系统用户Id + /// + public long WxId { get; set; } + + public string Mobile { get; set; } + + public string NickName { get; set;} + + /// + /// 学校名称 + /// + public string SchoolName { get; set; } + + public double expectedScore { get; set; } + + /// + /// 班级名称 + /// + public string ClassName { get; set; } + + /// + /// 选科组合 + /// + public string subjectGroup { get; set; } + + /// + /// vip卡号 + /// + public string VipCode { get; set; } + + /// + /// 是否更新成绩 + /// + public string IsUpdateScore { get; set; } + + public string Score { get; set; } + + /// + /// 高考年份 + /// + public int? Year { get; set; } + + /// + /// 三方uuid + /// + public string UUID { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + + } + + diff --git a/Admin.NET/Admin.NET.Application/Service/SysWeChatUserExtend/Dto/VipBindDto.cs b/Admin.NET/Admin.NET.Application/Service/SysWeChatUserExtend/Dto/VipBindDto.cs new file mode 100644 index 0000000..f8303f7 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysWeChatUserExtend/Dto/VipBindDto.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application; + +public class VipBindInput +{ + + /// + /// 卡号 + /// + public string CardCode { get; set; } + + + /// + /// 卡密 + /// + + public string CardPwd { get; set; } + +} + +public class UserVipBindDto +{ + /// + /// 卡号 + /// + public string CardCode { get; set; } + + /// + /// 卡类型Id + /// + public string CarTypeName { get; set; } + /// + /// 卡号有效时间 + /// + public int Day { get; set; } + + /// + /// 到期时间 + /// + public DateTime EndTime { get; set; } + + /// + /// 金额 + /// + public decimal Money { get; set; } + + /// + /// 卡号绑定时间 + /// + public DateTime CreateTime { get; set; } + +} + +public class OldVipBindDto +{ + public long CustomerId { get; set; } + + public string CardCode { get; set; } + + public string CardPwd { get; set; } + + public long? TenantId { get; set; } +} diff --git a/Admin.NET/Admin.NET.Application/Service/SysWeChatUserExtend/Dto/WeChatUserExDto.cs b/Admin.NET/Admin.NET.Application/Service/SysWeChatUserExtend/Dto/WeChatUserExDto.cs new file mode 100644 index 0000000..b33593b --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysWeChatUserExtend/Dto/WeChatUserExDto.cs @@ -0,0 +1,175 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Application.Service; + + +public class WeChatUserDto +{ + public string Mobile { get; set; } + +} + + + + + + +public class batchobject +{ + public int code { get; set; } + public string type { get; set; } + public string message { get; set; } + public BatchResult[] result { get; set; } + public object extras { get; set; } + public string time { get; set; } +} + +public class BatchResult +{ + public string provinceCode { get; set; } + public string provinceName { get; set; } + public int year { get; set; } + public Batch[] batches { get; set; } +} + +public class Batch +{ + public int year { get; set; } + public string batch { get; set; } + public string course { get; set; } + public string batchType { get; set; } + public int score { get; set; } + public int pressureScore { get; set; } + public string pressureRange { get; set; } +} + + +public class WeChatUserExResponseDto +{ + + public string cartId { get; set; } + public string nickName { get; set; } + public string mobile { get; set; } + + public string avatar { get; set; } + + public CustomerTypeEnum customerType { get; set; } + /// + /// 用户拓展信息 + /// + public SysWeChatUserExtend userExtend { get; set; } + + + /// + /// 用户分数对应批次表 + /// + public string batchName { get; set; } + + /// + /// 批次分数数据 + /// + public int? batchScore { get; set; } + + /// + /// 获取批次接口url + /// + public string BatchDataUrl { get; set; } + + /// + /// 选科规则 + /// + public List SelectRule { get; set; } + + + /// + /// 筛选年份 + /// + public List yearRules { get; set; } + + /// + /// 各省份志愿数量 + /// + public List zyBatches { get; set; } + + + +} + +public class YearRule +{ + public bool IsDefault { get; set; } + + public int Year { get; set; } +} + +public class ZyBatchRule +{ + + /// + /// 批次名称 + /// + public string batchName { get; set; } + + /// + /// 志愿组数量 + /// + public int Count { get; set; } + + /// + /// 志愿组单个专业数量 + /// + public int ItemCount { get; set; } + +} + +public class WeChatUserAvatarDto +{ + public string Avatar { get; set; } + + public string NickName { get; set; } + +} +public class WeChatUserExRequestDto +{ + + public string provinceCode { get; set; } + + public string provinceName { get; set; } + /// + /// 学校名称 + /// + public virtual string schoolName { get; set; } + + /// + /// 班级名称 + /// + public virtual string className { get; set; } + + /// + /// 选科组合 + /// + public virtual string subjectGroup { get; set; } + + + /// + /// 分数 + /// + public virtual int? score { get; set; } + + /// + /// 选科类型0(文科,理科)|1(3+3)|3 (3+1+2) |2(浙江7选三) + /// + public int? sp { get; set; } = 1; + + /// + /// 高考年份 + /// + public virtual int? Year { get; set; } + + + +} diff --git a/Admin.NET/Admin.NET.Application/Service/SysWeChatUserExtend/SysWeChatUserExtendService.cs b/Admin.NET/Admin.NET.Application/Service/SysWeChatUserExtend/SysWeChatUserExtendService.cs new file mode 100644 index 0000000..abe09fc --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysWeChatUserExtend/SysWeChatUserExtendService.cs @@ -0,0 +1,150 @@ +using Admin.NET.Core.Service; +using Admin.NET.Core.Util; +using DocumentFormat.OpenXml.Wordprocessing; +using Elastic.Clients.Elasticsearch.Sql; +using Microsoft.AspNetCore.Http; +namespace Admin.NET.Application; +/// +/// 用户拓展字段表服务 +/// +[ApiDescriptionSettings(Order = 100)] +public class SysWeChatUserExtendService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _rep; + private readonly SqlSugarRepository _userrep; + public SysWeChatUserExtendService(SqlSugarRepository rep, SqlSugarRepository userrep) + { + _rep = rep; + _userrep = userrep; + } + + + + + /// + /// 分页查询用户拓展字段表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Page")] + public async Task> Page(SysWeChatUserExtendInput input) + { + var query = _rep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => + u.SchoolName.Contains(input.SearchKey.Trim()) + || u.ClassName.Contains(input.SearchKey.Trim()) + || u.subjectGroup.Contains(input.SearchKey.Trim()) + || u.VipCode.Contains(input.SearchKey.Trim()) + || u.UUID.Contains(input.SearchKey.Trim()) + ) + //.WhereIF(input.UserId>0, u => u.UserId == input.UserId) + .WhereIF(!string.IsNullOrWhiteSpace(input.SchoolName), u => u.SchoolName.Contains(input.SchoolName.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.ClassName), u => u.ClassName.Contains(input.ClassName.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.subjectGroup), u => u.subjectGroup.Contains(input.subjectGroup.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.VipCode), u => u.VipCode.Contains(input.VipCode.Trim())) + .WhereIF(input.IsUpdateScore > 0, u => u.IsUpdateScore == input.IsUpdateScore) + .WhereIF(input.Year > 0, u => u.Year == input.Year) + .WhereIF(!string.IsNullOrWhiteSpace(input.UUID), u => u.UUID.Contains(input.UUID.Trim())) + .Select(); + + var response = await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); + var items = response.Items.Select(s => s.WxId).ToList(); + var userinfo = await _userrep.AsQueryable().Where(e => items.Contains(e.Id)).ToListAsync(); + response.Items.ToList().ForEach(a => + { + if (string.IsNullOrEmpty(a.SchoolName)) + { + a.SchoolName = SchoolNameHelper.getName(); + } + if (string.IsNullOrEmpty(a.ClassName)) + { + a.ClassName = SchoolNameHelper.getClassName(); + } + a.IsUpdateScore = a.IsUpdateScore == "0" ? "否" : "是"; + a.Mobile = userinfo.FirstOrDefault(e => e.Id == a.WxId)?.Mobile; + a.NickName = MarkPhoneUtil.MaskPhoneNumber(userinfo.FirstOrDefault(e => e.Id == a.WxId)?.Mobile); + a.Score = a.expectedScore.ToString(); + a.UUID = userinfo.FirstOrDefault(e => e.Id == a.WxId)?.OpenId; + }); + + + + + return response; + } + + + + + /// + /// 增加用户拓展字段表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Add")] + public async Task Add(AddSysWeChatUserExtendInput input) + { + var entity = input.Adapt(); + await _rep.InsertAsync(entity); + return entity.Id; + } + + /// + /// 删除用户拓展字段表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Delete")] + public async Task Delete(DeleteSysWeChatUserExtendInput input) + { + var entity = await _rep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + await _rep.FakeDeleteAsync(entity); //假删除 + //await _rep.DeleteAsync(entity); //真删除 + } + + /// + /// 更新用户拓展字段表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Update")] + public async Task Update(UpdateSysWeChatUserExtendInput input) + { + var entity = input.Adapt(); + await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); + } + + /// + /// 获取用户拓展字段表 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "Detail")] + public async Task Detail([FromQuery] QueryByIdSysWeChatUserExtendInput input) + { + return await _rep.GetFirstAsync(u => u.Id == input.Id); + } + + /// + /// 获取用户拓展字段表列表 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "List")] + public async Task> List([FromQuery] SysWeChatUserExtendInput input) + { + return await _rep.AsQueryable().Select().ToListAsync(); + } + + + + + +} + diff --git a/Admin.NET/Admin.NET.Application/Service/SysWeChatUserExtend/WeChatUserExService.cs b/Admin.NET/Admin.NET.Application/Service/SysWeChatUserExtend/WeChatUserExService.cs new file mode 100644 index 0000000..d10e815 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysWeChatUserExtend/WeChatUserExService.cs @@ -0,0 +1,344 @@ +using Admin.NET.Core.Service; +using Aliyun.OSS; +using Furion.DataEncryption; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Caching.Distributed; +using MongoDB.Bson; +using MongoDB.Driver; +using NewLife.Net.Handlers; +using SKIT.FlurlHttpClient.Wechat.Api.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.WebSockets; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; +using Flurl.Http; +namespace Admin.NET.Application.Service; + +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 800)] +public class WeChatUserExService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _rep; + private readonly SqlSugarRepository _sysWechatUserRep; + private readonly UserManager _userManager; + private readonly IMongoDBRepository _mongoRepository; + private readonly IDistributedCache _distributed; + private readonly SqlSugarRepository _busProvince; + private readonly SqlSugarRepository _sysAreaConfig; + private readonly SqlSugarRepository _specialist; + public WeChatUserExService(SqlSugarRepository rep, UserManager userManager, + SqlSugarRepository sysWechatUserRep, IMongoDBRepository mongoDBRepository, IDistributedCache distributed, + SqlSugarRepository sysAreaConfig, SqlSugarRepository specialist, SqlSugarRepository buProvince) + { + _rep = rep; + _userManager = userManager; + _sysWechatUserRep = sysWechatUserRep; + _mongoRepository = mongoDBRepository; + _distributed = distributed; + _sysAreaConfig = sysAreaConfig; + _specialist = specialist; + _busProvince = buProvince; + } + + + + + /// + /// 保存用户获取的手机号 + /// + /// + /// + [HttpPost] + [DisplayName("保存用户获取的手机号")] + public async Task UpdateWxInfo([FromBody] WeChatUserDto userDto) + { + var single = await _sysWechatUserRep.GetSingleAsync(c => c.Id == _userManager.UserId); + single.Mobile = userDto.Mobile; + single.UpdateTime = DateTime.Now; + single.UpdateUserName = _userManager.RealName; + single.UpdateUserId = _userManager.UserId; + return await _sysWechatUserRep.AsUpdateable(single).IgnoreColumns(true).ExecuteCommandAsync() > 0; + } + + + + //[DisplayName("用户注销")] + //[HttpPost] + //public async Task AccountCancel() + //{ + // var single = await _rep.GetSingleAsync(c => c.WxId == _userManager.UserId); + // if (single == null) + // { + // throw Oops.Oh("不存在该用户"); + // } + // single.IsDelete = true; + // single.UpdateTime = DateTime.Now; + // single.UpdateUserName = _userManager.RealName; + // single.UpdateUserId = _userManager.UserId; + // return await _rep.UpdateAsync(single); + + //} + + /// + /// 获取用户拓展字段表 + /// + /// + [HttpGet] + [DisplayName("获取用户拓展字段表")] + public async Task UserInfo() + { + if (_userManager == null || _userManager.UserId <= 0) + { + throw Oops.Oh("用户token无效"); + } + var result = new WeChatUserExResponseDto(); + var userext = await _rep.GetFirstAsync(u => u.WxId == _userManager.UserId); + var wechatinfo = await _sysWechatUserRep.GetFirstAsync(u => u.Id == _userManager.UserId); + result.nickName = MarkPhoneUtil.MaskPhoneNumber(wechatinfo.Mobile); + // result.mobile = wechatinfo.Mobile;不给手机号 + result.avatar = wechatinfo.Avatar; + result.customerType = wechatinfo.CustomerType; + if (result.customerType == CustomerTypeEnum.Enterprise) + { + var spInfo = await _specialist.AsQueryable().FirstAsync(e => e.Phone == wechatinfo.Mobile && e.IsDelete == false); + if (spInfo != null) + { + result.cartId = spInfo?.MajorType.ToString(); + result.nickName = spInfo?.Name; + } + } + if (userext != null && !string.IsNullOrWhiteSpace(userext.ProvinceCode)) + { + try + { + var province = await _busProvince.AsQueryable().FirstAsync(u => u.Code == userext.ProvinceCode); + userext.ProvinceName = province?.Name; + result.BatchDataUrl = string.Format("https://api.static.ycymedu.com/api/v1/batch/s/{0}.json", userext.ProvinceCode); + //var response = await result.BatchDataUrl.SetJsonSerialization().GetAsAsync(); + var response = await result.BatchDataUrl.GetJsonAsync() ; + var batches = response.result.OrderByDescending(e => e.year).FirstOrDefault().batches; + result.batchName = batches.Where(e => userext.expectedScore >= e.score).Any() ? batches.Where(e => userext.expectedScore >= e.score).OrderByDescending(c => c.score).FirstOrDefault().batch : ""; + result.batchScore = batches.Where(e => userext.expectedScore >= e.score).Any() ? batches.Where(e => userext.expectedScore >= e.score).OrderByDescending(c => c.score).FirstOrDefault().score : 0; + } + catch (Exception ex) + { + result.batchName = ""; + } + } + if (userext != null && userext.sp.HasValue) + { + result.SelectRule = userext.sp.Value > 0 ? new List() { "综合" } : new List() { "文科", "理科" }; + + result.userExtend = userext; + } + var ylist = new List(); + DateTime dt = DateTime.Now; + DateTime fixedDate = new DateTime(dt.Year, 6, 10); // 创建当前年份的9月10日 + int showdt = dt > fixedDate ? dt.Year : dt.Year - 1; // 比较当前日期与固定日期 + ylist.Add(new YearRule() + { + IsDefault = true, + Year = showdt, + }); + showdt--; + ylist.Add(new YearRule() + { + IsDefault = false, + Year = showdt, + }); + showdt--; + ylist.Add(new YearRule() + { + IsDefault = false, + Year = showdt, + }); + result.yearRules = ylist; + if (userext != null) + { + var batchcache = await _distributed.GetAsync(CacheConst.KeyProvinceBatch + userext.ProvinceCode); + if (batchcache == null)// 判断缓存是否存在,存在就直接返回,不存在就重新获取 + { + var areaconfig = await _sysAreaConfig.AsQueryable().Where(e => e.IsDelete == false && e.LocationCode == userext.ProvinceCode) + .Select(s => new ZyBatchRule() + { + batchName = s.BatchName, + Count = s.Count, + ItemCount = s.ItemCount, + }) + .ToListAsync(); + _distributed.Set($"{CacheConst.KeyProvinceBatch}{userext.ProvinceCode}", Encoding.UTF8.GetBytes(areaconfig.ToJson()), new DistributedCacheEntryOptions() + .SetSlidingExpiration(TimeSpan.FromHours(24))); + result.zyBatches = areaconfig; + } + else + { + result.zyBatches = JsonConvert.DeserializeObject>(Encoding.UTF8.GetString(_distributed.Get($"{CacheConst.KeyProvinceBatch}{userext.ProvinceCode}"))); + } + } + + return result; + } + + + [HttpPost] + [DisplayName("注销用户")] + public async Task AccountCancel() + { + var single = await _sysWechatUserRep.GetSingleAsync(c => c.Id == _userManager.UserId); + if (single == null) + { + throw Oops.Oh("不存在该用户"); + } + var extend = await _rep.GetSingleAsync(c => c.WxId == _userManager.UserId); + single.IsDelete = true; + extend.IsDelete = true; + await _rep.UpdateAsync(extend); + single.UpdateTime = DateTime.Now; + single.UpdateUserName = _userManager.RealName; + single.UpdateUserId = _userManager.UserId; + return await _sysWechatUserRep.UpdateAsync(single); + } + + + /// + /// 修改用户头像和名字 + /// + /// + [HttpPost] + [DisplayName("修改用户头像和名字")] + public async Task UpdateUserAvatar([FromBody] WeChatUserAvatarDto dto) + { + var single = await _sysWechatUserRep.GetSingleAsync(c => c.Id == _userManager.UserId); + if (single == null) + { + throw Oops.Oh("不存在该用户"); + } + single.Avatar = dto.Avatar; + single.NickName = dto.NickName; + single.UpdateTime = DateTime.Now; + single.UpdateUserName = _userManager.RealName; + single.UpdateUserId = _userManager.UserId; + return await _sysWechatUserRep.UpdateAsync(single); + } + + + /// + /// 完善用户信息 + /// + /// + /// + [HttpPost] + [DisplayName("完善用户信息")] + public async Task PerfectInfo([FromBody] WeChatUserExRequestDto requestDto) + { + + var single = await _sysWechatUserRep.GetSingleAsync(c => c.Id == _userManager.UserId); + if (single == null) + { + throw Oops.Oh("不存在该用户"); + } + var db_client = _mongoRepository.Context.GetDatabase("zhiyuan"); + DateTime dt = DateTime.Now; + DateTime fixedDate = new DateTime(dt.Year, 7, 20); // 创建当前年份的7月20日 + int year = dt > fixedDate ? dt.Year : dt.Year - 1; // 比较当前日期与固定日期 + var be_json = db_client.GetCollection(string.Format("scoresection_{0}_{1}", requestDto.provinceCode, year)); + // 动态条件列表 + var filterBuilders = new List>(); + if (requestDto.score.HasValue && requestDto.score > 0) + { + filterBuilders.Add(Builders.Filter.Lte(e => e.Score.Value, requestDto.score.Value)); + + } + FilterDefinition filter = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) + : new BsonDocument(); // 如果没有条件,则使用空过滤器 + + var limit = await be_json.Find(filter).Sort(Builders.Sort.Descending(s => s.Score)).Limit(1).FirstOrDefaultAsync(); + + var model = await _rep.GetSingleAsync(e => e.WxId == _userManager.UserId); + if (model == null) + { + model = new SysWeChatUserExtend(); + if (!string.IsNullOrWhiteSpace(requestDto.schoolName)) + { + model.SchoolName = requestDto.schoolName; + } + if (!string.IsNullOrWhiteSpace(requestDto.className)) + { + model.ClassName = requestDto.className; + } + if (!string.IsNullOrWhiteSpace(requestDto.provinceCode)) + { + model.ProvinceCode = requestDto.provinceCode; + } + if (!string.IsNullOrWhiteSpace(requestDto.provinceName)) + { + model.ProvinceName = requestDto.provinceName; + } + if (!string.IsNullOrWhiteSpace(requestDto.subjectGroup)) + { + model.subjectGroup = requestDto.subjectGroup; + } + if (requestDto.Year.HasValue) + { + model.Year = requestDto.Year.Value; + } + if (requestDto.score.HasValue) + { + model.expectedScore = requestDto.score.Value; + model.Rank = limit != null ? limit.CumulativeCount : 0; + } + if (requestDto.sp.HasValue) + { + model.sp = requestDto.sp.Value; + } + //model.CreateUserId = _userManager.UserId; + model.CreateTime = DateTime.Now; + model.CreateUserName = _userManager.RealName; + model.CreateUserId = _userManager.UserId; + model.WxId = _userManager.UserId; + return await _rep.InsertAsync(model); + } + else + { + if (!string.IsNullOrWhiteSpace(requestDto.schoolName)) + { + model.SchoolName = requestDto.schoolName; + } + if (!string.IsNullOrWhiteSpace(requestDto.className)) + { + model.ClassName = requestDto.className; + } + if (!string.IsNullOrWhiteSpace(requestDto.subjectGroup)) + { + model.subjectGroup = requestDto.subjectGroup; + } + if (!string.IsNullOrWhiteSpace(requestDto.provinceCode)) + { + model.ProvinceCode = requestDto.provinceCode; + } + if (requestDto.Year.HasValue) + { + model.Year = requestDto.Year.Value; + } + if (requestDto.score.HasValue) + { + model.expectedScore = requestDto.score.Value; + model.Rank = limit != null ? limit.CumulativeCount : 0; + } + if (requestDto.sp.HasValue) + { + model.sp = requestDto.sp.Value; + } + model.UpdateTime = DateTime.Now; + model.UpdateUserName = _userManager.RealName; + model.UpdateUserId = _userManager.UserId; + return await _rep.UpdateAsync(model); + } + } + + + +} diff --git a/Admin.NET/Admin.NET.Application/Service/SysWeChatUserExtend/ZYVipService.cs b/Admin.NET/Admin.NET.Application/Service/SysWeChatUserExtend/ZYVipService.cs new file mode 100644 index 0000000..3e8d496 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysWeChatUserExtend/ZYVipService.cs @@ -0,0 +1,120 @@ +using Microsoft.Extensions.Caching.Distributed; +using Newtonsoft.Json.Serialization; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Admin.NET.Core.Service; +using Flurl.Http; + +namespace Admin.NET.Application.Service; + + +/// +/// vip卡服务 +/// +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 900)] +[Route("api/Zyvip")] +public class ZYVipService : IDynamicApiController, ITransient +{ + private readonly UserManager _userManager; + private readonly IHttpContextAccessor _httpContextAccessor; + private readonly SqlSugarRepository _vipCardInfo; + private readonly SqlSugarRepository _dictdata; + /// + /// + /// + private readonly SqlSugarRepository _wechatUserExtend; + public ZYVipService(UserManager userManager, IHttpContextAccessor httpContextAccessor, SqlSugarRepository wechatUserExtend, SqlSugarRepository vipCardInfo, SqlSugarRepository dictdata) + { + _userManager = userManager; + _httpContextAccessor = httpContextAccessor; + _wechatUserExtend = wechatUserExtend; + _vipCardInfo = vipCardInfo; + _dictdata = dictdata; + } + + + /// + /// 绑定vip + /// + /// + /// + [HttpPost] + public async Task Bind([FromBody] VipBindInput dto) + { + try + { + if (string.IsNullOrWhiteSpace(dto.CardPwd) || string.IsNullOrWhiteSpace(dto.CardCode)) + { + throw Oops.Oh("必填信息为空"); + } + + var cardinfo = await _vipCardInfo.AsQueryable().FirstAsync(e => e.Code == dto.CardCode && e.Pwd == dto.CardPwd); + if (cardinfo == null) + throw Oops.Oh("卡号或密码错误"); + if (cardinfo.IsBind == 1) + throw Oops.Oh("卡号已被绑定"); + //更新用户拓展信息表状态 + if (cardinfo != null) + { + var single = await _wechatUserExtend.GetSingleAsync(e => e.WxId == _userManager.UserId); + single.VipCode = dto.CardCode; + single.IsVIP = true; + single.UpdateTime = DateTime.Now; + single.UpdateUserId = _userManager.UserId; + cardinfo.IsBind = 1; + cardinfo.UpdateTime = DateTime.Now; + cardinfo.UpdateUserId = _userManager.UserId; + cardinfo.UpdateUserName = _userManager.RealName; + await _vipCardInfo.UpdateAsync(cardinfo); + return await _wechatUserExtend.UpdateAsync(single); + } + else + { + throw Oops.Oh("卡号或密码错误"); + } + } + catch (Exception ex) + { + throw Oops.Oh("卡号或密码错误"); + } + } + + + + /// + /// 获取用户VIP绑定信息 + /// + /// + [HttpGet] + public async Task GetBingInfo() + { + var userbindinfo = new UserVipBindDto(); + //var single = await _wechatUserExtend.GetFirstAsync(e => e.WxId == _userManager.UserId && e.IsVIP == false); + //if (single == null) + //{ + // throw Oops.Oh("用户未绑定"); + //} + var cardinfo = await _vipCardInfo.GetFirstAsync(e => e.IsBind == 1 && e.UpdateUserId == _userManager.UserId); + if (cardinfo == null) + { + throw Oops.Oh("用户未绑定"); + } + var cardtypeinfo = await _dictdata.GetFirstAsync(e => e.Id == cardinfo.CardTypeId); + userbindinfo.CarTypeName = cardtypeinfo.Name; + userbindinfo.CardCode = cardinfo.Code; + userbindinfo.EndTime = cardinfo.EndTime; + userbindinfo.CreateTime = cardinfo.UpdateTime.Value; + userbindinfo.Money = cardinfo.Money; + userbindinfo.Day = (cardinfo.EndTime - cardinfo.CreateTime.Value).Days; + return userbindinfo; + } + + + + +} diff --git a/Admin.NET/Admin.NET.Application/Service/SysWechatUserMapCarts/Dto/SysWechatUserMapCartsDto.cs b/Admin.NET/Admin.NET.Application/Service/SysWechatUserMapCarts/Dto/SysWechatUserMapCartsDto.cs new file mode 100644 index 0000000..ebcb06e --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysWechatUserMapCarts/Dto/SysWechatUserMapCartsDto.cs @@ -0,0 +1,93 @@ +namespace Admin.NET.Application; + + /// + /// 用户订单关联表输出参数 + /// + public class SysWechatUserMapCartsDto + { + /// + /// 关联专家介绍页面唯一Id + /// + public string cartIdName { get; set; } + + /// + /// OpenId + /// + public string OpenIdNickName { get; set; } + + /// + /// ZjOpenId + /// + public string ZjOpenIdNickName { get; set; } + + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 用户手机号 + /// + public string Phone { get; set; } + + /// + /// 用户订单 + /// + public string OrderId { get; set; } + + /// + /// 关联专家介绍页面唯一Id + /// + public string cartId { get; set; } + + /// + /// 支付金额 + /// + public string Amount { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + + /// + /// OpenId + /// + public string? OpenId { get; set; } + + /// + /// ZjOpenId + /// + public string? ZjOpenId { get; set; } + + } diff --git a/Admin.NET/Admin.NET.Application/Service/SysWechatUserMapCarts/Dto/SysWechatUserMapCartsInput.cs b/Admin.NET/Admin.NET.Application/Service/SysWechatUserMapCarts/Dto/SysWechatUserMapCartsInput.cs new file mode 100644 index 0000000..9b8891b --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysWechatUserMapCarts/Dto/SysWechatUserMapCartsInput.cs @@ -0,0 +1,224 @@ +using Admin.NET.Core; +using System.ComponentModel.DataAnnotations; + +namespace Admin.NET.Application; + +/// +/// 用户订单关联表基础输入参数 +/// +public class SysWechatUserMapCartsBaseInput +{ + /// + /// 用户手机号 + /// + public virtual string Phone { get; set; } + + /// + /// 用户订单 + /// + public virtual string OrderId { get; set; } + + /// + /// 关联专家介绍页面唯一Id + /// + public virtual string cartId { get; set; } + + /// + /// 支付金额 + /// + public virtual string Amount { get; set; } + + /// + /// 创建时间 + /// + public virtual DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public virtual DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public virtual long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public virtual string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public virtual long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public virtual string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public virtual bool IsDelete { get; set; } + + /// + /// OpenId + /// + public virtual string? OpenId { get; set; } + + /// + /// ZjOpenId + /// + public virtual string? ZjOpenId { get; set; } + +} + +/// +/// 用户订单关联表分页查询输入参数 +/// +public class SysWechatUserMapCartsInput : BasePageInput +{ + /// + /// 关键字查询 + /// + public string? SearchKey { get; set; } + + /// + /// 用户手机号 + /// + public string? Phone { get; set; } + + /// + /// 用户订单 + /// + public string? OrderId { get; set; } + + /// + /// 关联专家介绍页面唯一Id + /// + public string? cartId { get; set; } + + /// + /// 支付金额 + /// + public string? Amount { get; set; } + + /// + /// OpenId + /// + public string? OpenId { get; set; } + + /// + /// ZjOpenId + /// + public string? ZjOpenId { get; set; } + +} + + +/// +/// 用户订单关联表分页查询输入参数 +/// +public class SpecialistGroupOrderListInput +{ + + /// + /// 用户手机号 + /// + public string? Phone { get; set; } + + /// + /// 用户订单 + /// + public string? OrderId { get; set; } + + /// + /// 志愿表分类Id + /// + public string catId { get; set; } + +} + +public class CopyTbZyInput +{ + /// + /// 志愿表Id + /// + public long tId { get; set; } + + + public string locationCode { get; set; } + + /// + /// 专家Id + /// + public long SpId { get; set; } + +} + +/// +/// 用户订单关联表增加输入参数 +/// +public class AddSysWechatUserMapCartsInput : SysWechatUserMapCartsBaseInput +{ + /// + /// 用户手机号 + /// + [Required(ErrorMessage = "用户手机号不能为空")] + public override string Phone { get; set; } + + /// + /// 用户订单 + /// + [Required(ErrorMessage = "用户订单不能为空")] + public override string OrderId { get; set; } + + /// + /// 关联专家介绍页面唯一Id + /// + [Required(ErrorMessage = "关联专家介绍页面唯一Id不能为空")] + public override string cartId { get; set; } + + /// + /// 支付金额 + /// + [Required(ErrorMessage = "支付金额不能为空")] + public override string Amount { get; set; } + + /// + /// 软删除 + /// + [Required(ErrorMessage = "软删除不能为空")] + public override bool IsDelete { get; set; } + +} + +/// +/// 用户订单关联表删除输入参数 +/// +public class DeleteSysWechatUserMapCartsInput : BaseIdInput +{ +} + +/// +/// 用户订单关联表更新输入参数 +/// +public class UpdateSysWechatUserMapCartsInput : SysWechatUserMapCartsBaseInput +{ + /// + /// 主键Id + /// + [Required(ErrorMessage = "主键Id不能为空")] + public long Id { get; set; } + +} + +/// +/// 用户订单关联表主键查询输入参数 +/// +public class QueryByIdSysWechatUserMapCartsInput : DeleteSysWechatUserMapCartsInput +{ + +} diff --git a/Admin.NET/Admin.NET.Application/Service/SysWechatUserMapCarts/Dto/SysWechatUserMapCartsOutput.cs b/Admin.NET/Admin.NET.Application/Service/SysWechatUserMapCarts/Dto/SysWechatUserMapCartsOutput.cs new file mode 100644 index 0000000..be42464 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysWechatUserMapCarts/Dto/SysWechatUserMapCartsOutput.cs @@ -0,0 +1,95 @@ +namespace Admin.NET.Application; + +/// +/// 用户订单关联表输出参数 +/// +public class SysWechatUserMapCartsOutput +{ + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 用户手机号 + /// + public string Phone { get; set; } + + /// + /// 用户订单 + /// + public string OrderId { get; set; } + + /// + /// 关联专家介绍页面唯一Id + /// + public string cartId { get; set; } + + /// + /// 关联专家介绍页面唯一Id 描述 + /// + public string cartName { get; set; } + + /// + /// 支付金额 + /// + public string Amount { get; set; } + + /// + /// 创建时间 + /// + public DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + public long? CreateUserId { get; set; } + + /// + /// 创建者姓名 + /// + public string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + public long? UpdateUserId { get; set; } + + /// + /// 修改者姓名 + /// + public string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + public bool IsDelete { get; set; } + + /// + /// OpenId + /// + public string? OpenId { get; set; } + + /// + /// OpenId 描述 + /// + public string OpenIdNickName { get; set; } + + /// + /// ZjOpenId + /// + public string? ZjOpenId { get; set; } + + /// + /// ZjOpenId 描述 + /// + public string ZjOpenIdNickName { get; set; } + + } + + diff --git a/Admin.NET/Admin.NET.Application/Service/SysWechatUserMapCarts/SysWechatUserMapCartsService.cs b/Admin.NET/Admin.NET.Application/Service/SysWechatUserMapCarts/SysWechatUserMapCartsService.cs new file mode 100644 index 0000000..22a7d6d --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Service/SysWechatUserMapCarts/SysWechatUserMapCartsService.cs @@ -0,0 +1,498 @@ +using Admin.NET.Application.Service; +using Admin.NET.Core.Service; +using Microsoft.AspNetCore.Http; +using MongoDB.Bson; +using MongoDB.Driver; +using System.IO; +using Newtonsoft.Json; +using MiniExcelLibs; +namespace Admin.NET.Application; + + +/// +///专家端服务 +/// +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 100)] +public class SysWechatUserMapCartsService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _rep; + private readonly SqlSugarRepository _userRep; + private readonly SqlSugarRepository _userExtendRep; + private readonly SqlSugarRepository _volunteerRep; + private readonly SqlSugarRepository _vtbSpRep; + private readonly UserManager _userManager; + private readonly SqlSugarRepository _wechatUserExtendrep; + private readonly IMongoDBRepository _mongoRepository; + public SysWechatUserMapCartsService(SqlSugarRepository rep, SqlSugarRepository userRepository, + SqlSugarRepository volunteerRepository, SqlSugarRepository vSpRep, UserManager userManager, IMongoDBRepository mongoRepository, SqlSugarRepository userExtendRep, SqlSugarRepository wechatUserExtendrep) + { + _rep = rep; + _userRep = userRepository; + _volunteerRep = volunteerRepository; + _vtbSpRep = vSpRep; + _userManager = userManager; + _mongoRepository = mongoRepository; + _userExtendRep = userExtendRep; + _wechatUserExtendrep = wechatUserExtendrep; + } + + /// + /// 分页查询用户订单关联表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Page")] + public async Task> Page(SysWechatUserMapCartsInput input) + { + var query = _rep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => + u.Phone.Contains(input.SearchKey.Trim()) + || u.OrderId.Contains(input.SearchKey.Trim()) + || u.cartId.Contains(input.SearchKey.Trim()) + || u.Amount.Contains(input.SearchKey.Trim()) + || u.OpenId.Contains(input.SearchKey.Trim()) + || u.ZjOpenId.Contains(input.SearchKey.Trim()) + ) + .WhereIF(!string.IsNullOrWhiteSpace(input.Phone), u => u.Phone.Contains(input.Phone.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.OrderId), u => u.OrderId.Contains(input.OrderId.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.cartId), u => u.cartId.Contains(input.cartId.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Amount), u => u.Amount.Contains(input.Amount.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.OpenId), u => u.OpenId.Contains(input.OpenId.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.ZjOpenId), u => u.ZjOpenId.Contains(input.ZjOpenId.Trim())) + //处理外键和TreeSelector相关字段的连接 + .LeftJoin((u, cartid) => u.cartId == cartid.MajorType.ToString()) + .LeftJoin((u, cartid, openid) => u.OpenId == openid.OpenId) + .LeftJoin((u, cartid, openid, zjopenid) => u.ZjOpenId == zjopenid.OpenId) + .OrderBy(u => u.CreateTime) + .Select((u, cartid, openid, zjopenid) => new SysWechatUserMapCartsOutput + { + Id = u.Id, + Phone = u.Phone, + OrderId = u.OrderId, + cartId = u.cartId, + cartName = cartid.Name, + Amount = u.Amount, + CreateTime = u.CreateTime, + UpdateTime = u.UpdateTime, + CreateUserId = u.CreateUserId, + CreateUserName = u.CreateUserName, + UpdateUserId = u.UpdateUserId, + UpdateUserName = u.UpdateUserName, + IsDelete = u.IsDelete, + OpenId = u.OpenId, + OpenIdNickName = openid.NickName, + ZjOpenId = u.ZjOpenId, + ZjOpenIdNickName = zjopenid.NickName, + }); + return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); + } + + + + + /// + /// 获取用户订单关联表列表 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "List")] + public async Task> List([FromQuery] SysWechatUserMapCartsInput input) + { + return await _rep.AsQueryable().Select().ToListAsync(); + } + + /// + /// 获取关联专家介绍页面唯一Id列表 + /// + /// + /// + [ApiDescriptionSettings(Name = "BusSpecialistGroupcartIdDropdown"), HttpGet] + public async Task BusSpecialistGroupcartIdDropdown() + { + return await _rep.Context.Queryable() + .Select(u => new + { + Label = u.Name, + Value = u.Id + } + ).ToListAsync(); + } + /// + /// 获取OpenId列表 + /// + /// + /// + [ApiDescriptionSettings(Name = "SysWechatUserOpenIdDropdown"), HttpGet] + public async Task SysWechatUserOpenIdDropdown() + { + return await _rep.Context.Queryable() + .Select(u => new + { + Label = u.NickName, + Value = u.Id + } + ).ToListAsync(); + } + /// + /// 获取ZjOpenId列表 + /// + /// + /// + [ApiDescriptionSettings(Name = "SysWechatUserZjOpenIdDropdown"), HttpGet] + public async Task SysWechatUserZjOpenIdDropdown() + { + return await _rep.Context.Queryable() + .Select(u => new + { + Label = u.NickName, + Value = u.Id + } + ).ToListAsync(); + } + + + + + /// + /// 专家订单列表 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "SpecialistGroupOrderList")] + public async Task> SpecialistGroupOrderList([FromQuery] SpecialistGroupOrderListInput input) + { + return await _rep.AsQueryable() + .Where(e => e.cartId == input.catId) + .WhereIF(!string.IsNullOrWhiteSpace(input.OrderId), s => s.OrderId.Contains(input.OrderId)) + .WhereIF(!string.IsNullOrWhiteSpace(input.Phone), s => s.OrderId.Contains(input.Phone)) + .Select().ToListAsync(); + } + + + + /// + /// 用户订单列表 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "UserOrderList")] + public async Task> UserOrderList([FromQuery] SpecialistGroupOrderListInput input) + { + return await _rep.AsQueryable() + //.Where(e => e.cartId == input.catId) + .WhereIF(!string.IsNullOrWhiteSpace(input.OrderId), s => s.OrderId.Contains(input.OrderId)) + .WhereIF(!string.IsNullOrWhiteSpace(input.Phone), s => s.Phone.Contains(input.Phone)) + .Select().ToListAsync(); + } + + + + + /// + /// 获取专家的客户的志愿表列表 + /// 详情和导出都可以直接用 VolunTb的原始接口 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "GetCustomerTbList")] + public async Task> GetCustomerTbList([FromQuery] SpecialistGroupOrderListInput input) + { + var customer = await _userRep.AsQueryable().Where(e => e.Mobile == input.Phone).FirstAsync(); + if (customer == null) + { + Oops.Oh("未找到用户信息"); + } + var provinceCode = (await _userExtendRep.AsQueryable().Where(e => e.WxId == customer.Id).FirstAsync()).ProvinceCode; + var tblist = await _volunteerRep.AsQueryable().Where(e => e.CId == customer.Id && e.IsPush == true).Select(c => new VoTableDtoResponse() + { + BatchName = c.BatchName, + CId = c.CId, + Score = c.Score, + SubjectClaim = c.SubjectClaim, + CustomerName = customer.NickName, + personlocationCode = provinceCode, + TableName = c.TableName, + Type = c.Type, + VId = c.Id, + CreateTime = c.CreateTime + }).OrderByDescending(c => c.VId).ToListAsync(); + return tblist; + } + + + + /// + /// 复制用户志愿表 + /// + /// + /// + [HttpPost] + public async Task CopyTbZy([FromBody] CopyTbZyInput input) + { + var vModel = await _volunteerRep.AsQueryable().FirstAsync(e => e.Id == input.tId); + if (vModel == null) + Oops.Oh("志愿数据不存在或已删除"); + var entity = vModel.Adapt(); + entity.SCId = input.SpId; + entity.LocationCode = input.locationCode; + var wxextend = await _wechatUserExtendrep.GetFirstAsync(e => e.WxId == vModel.CId); + entity.Sp = wxextend.sp.Value; + + if(await _vtbSpRep.IsAnyAsync(e => e.Id == vModel.Id)) + { + await _vtbSpRep.DeleteAsync(e => e.Id == vModel.Id); + } + + return await _vtbSpRep.InsertAsync(entity); + } + + + + /// + /// 修改我的志愿 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Put")] + public async Task Put([FromBody] VoTableDtoRequest request) + { + if (request.VId <= 0) + { + throw Oops.Oh("志愿id为必传"); + } + var model = await _vtbSpRep.GetSingleAsync(c => c.Id == request.VId); + if (!string.IsNullOrWhiteSpace(request.TableName)) { model.TableName = request.TableName; } + model.Detail = request.vTbDetails.ToJson(); + model.UpdateTime = DateTime.Now; + model.UpdateUserName = _userManager.RealName; + model.UpdateUserId = _userManager.UserId; + await _vtbSpRep.UpdateAsync(model); + return model.Id; + } + + + /// + /// 删除我的志愿表 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Delete")] + public async Task Delete(DeleteSysVolunteerTbInput input) + { + var entity = await _vtbSpRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + await _vtbSpRep.FakeDeleteAsync(entity); //假删除 + } + + + + /// + /// 已添加志愿列表详情 + /// + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "Get")] + public async Task Get([FromQuery] long Id, string location) + { + var asrespose = new VoTabDetailDto(); + var entity = await _vtbSpRep.GetFirstAsync(u => u.Id == Id); + var rep = new VoTableDtoResponse(); + rep.CId = entity.CId; + rep.Sp = entity.Sp; + rep.TableName = entity.TableName; + rep.BatchName = entity.BatchName; + rep.Type = entity.Type; + rep.SubjectClaim = entity.SubjectClaim; + rep.Score = entity.Score; + var userInfo = await _userRep.AsQueryable().FirstAsync(e => e.Id == entity.CId); + rep.CustomerName = userInfo?.NickName; + asrespose.VoTable = rep; + var jsons = JsonConvert.DeserializeObject>(entity.Detail); + var pids = jsons.SelectMany(c => c.vItems.Select(c => c._pId).ToList()).ToList(); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var bejson = dbclient.GetCollection(string.Format("zsplanfusionmodel_{0}", location)); + var filterBuilders = new List>(); + filterBuilders.Add(Builders.Filter.In(p => p.pid, pids)); + FilterDefinition filter = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) + : new BsonDocument(); // 如果没有条件,则使用空过滤器 + var list = await bejson.Find(filter).ToListAsync(); + var dtolist = new List(); + jsons.ForEach(c => + { + var vlist = new List(); + string educationCategory = string.Empty; + var features = new List(); + string ownership = string.Empty; + string province = string.Empty; + string subjectType = string.Empty; + string city = string.Empty; + string uName = string.Empty; + c.vItems.ForEach(a => + { + + var plan = list.FirstOrDefault(f => f.pid == a._pId); + uName = plan.universityName; + educationCategory = plan.educationCategory; + features = plan.features; + ownership = plan.ownership; + province = plan.province; + subjectType = plan.subjectType; + city = plan.city; + vlist.Add(new VItemDetail + { + MajorCode = plan.majorCode, + percentAge = a.percentAge, + _pId = a._pId, + Sort = a.Sort, + type = a.type, + Major = plan.majorName, + academic = plan.academicYear, + //features = plan.features, + fee = plan.fee, + nature = plan.nature, + // ownership = plan.ownership, + planCount = plan.planCount, + planItems = plan.items, + remark = plan.remark, + subjectClam = plan._23subject, + // subjectType = plan.subjectType, + }); + }); + dtolist.Add(new TbDetailASDto() + { + Type = c.type, + Sort = c.Sort, + UnCode = c.UnCode, + UnName = uName, + educationCategory = educationCategory, + features = features, + ownership = ownership, + province = province, + subjectType = subjectType, + city = city, + Logo = "https://static-data.ycymedu.com/6.jpg", + UnId = c.UnId, + vItems = vlist + }); + }); + var university = dbclient.GetCollection("university"); + var unfilterBuilders = new List>(); + unfilterBuilders.Add(Builders.Filter.In(p => p._id, dtolist.Select(c => c.UnId))); + FilterDefinition unfilter = unfilterBuilders.Count > 0 + ? Builders.Filter.And(unfilterBuilders) + : new BsonDocument(); // 如果没有条件,则使用空过滤器 + var unlist = await university.Find(unfilter).ToListAsync(); + dtolist.ForEach(a => + { + a.Logo = unlist.Where(e => e._id == a.UnId).Any() ? unlist.Where(e => e._id == a.UnId).FirstOrDefault().logo : "https://api-static-zhiy.oss-cn-shanghai.aliyuncs.com/images/nocontent/empty.png"; + }); + asrespose.tbDetails = dtolist; + return asrespose; + + } + + + + + + /// + /// 导出excel + /// + /// + /// + [HttpGet("Export")] + [ProducesResponseType(0)] + [AllowAnonymous] + public async Task Export([FromQuery] ExportExcelDto dto) + { + var tableDetailItemsViews = new List(); + var viewentity = await _vtbSpRep.GetFirstAsync(u => u.Id == dto.Id); + + var jsons = JsonConvert.DeserializeObject>(viewentity.Detail); + var pids = jsons.SelectMany(c => c.vItems.Select(c => c._pId).ToList()).ToList(); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var bejson = dbclient.GetCollection(string.Format("zsplanfusionmodel_{0}", dto.location)); + var filterBuilders = new List>(); + filterBuilders.Add(Builders.Filter.In(p => p.pid, pids)); + FilterDefinition filter = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) + : new BsonDocument(); // 如果没有条件,则使用空过滤器 + var list = await bejson.Find(filter).ToListAsync(); + jsons.ForEach(c => + { + var vlist = new List(); + string educationCategory = string.Empty; + var features = new List(); + string ownership = string.Empty; + string province = string.Empty; + string subjectType = string.Empty; + string city = string.Empty; + string uName = string.Empty; + c.vItems.ForEach(a => + { + var plan = list.FirstOrDefault(f => f.pid == a._pId); + if (plan.items != null) + { + var planitems = plan.items; + + var _23items = planitems.Where(e => e.year == "2023"); + var _22items = planitems.Where(e => e.year == "2022"); + var _21items = planitems.Where(e => e.year == "2021"); + tableDetailItemsViews.Add(new VolunteerItemsViewMinExcelAttr() + { + AcademicYear = plan.academicYear, + AreaName = province, + fee = plan.fee, + Major = plan.majorName, + MajorCode = plan.majorCode, + MajorGroup = string.IsNullOrWhiteSpace(plan.majorGroup) ? "" : "(" + plan.majorGroup.Split("(")[1], + MajorSubjectClam = plan._24subject, + Nature = plan.nature, + planCount = plan.planCount, + Sort = a.Sort, + UniversityCode = c.UnCode, + UniversityName = c.UnName, + _23Scoreline = _23items.Any() ? _23items.FirstOrDefault().score == 0 ? "--" : _23items.FirstOrDefault().score.ToString() : "--", + _22Scoreline = _22items.Any() ? _22items.FirstOrDefault().score == 0 ? "--" : _22items.FirstOrDefault().score.ToString() : "--", + _21Scoreline = _21items.Any() ? _21items.FirstOrDefault().score == 0 ? "--" : _21items.FirstOrDefault().score.ToString() : "--", + + _23PlanCount = _23items.Any() ? _23items.FirstOrDefault().planCount == 0 ? "--" : _23items.FirstOrDefault().planCount.ToString() : "--", + _22PlanCount = _22items.Any() ? _22items.FirstOrDefault().planCount == 0 ? "--" : _22items.FirstOrDefault().planCount.ToString() : "--", + _21PlanCount = _21items.Any() ? _21items.FirstOrDefault().planCount == 0 ? "--" : _21items.FirstOrDefault().planCount.ToString() : "--", + + _23RankLine = _23items.Any() ? _23items.FirstOrDefault().rankLine == 0 ? "--" : _23items.FirstOrDefault().rankLine.ToString() : "--", + _22RankLine = _22items.Any() ? _22items.FirstOrDefault().rankLine == 0 ? "--" : _22items.FirstOrDefault().rankLine.ToString() : "--", + _21RankLine = _21items.Any() ? _21items.FirstOrDefault().rankLine == 0 ? "--" : _21items.FirstOrDefault().rankLine.ToString() : "--", + + }); + } + }); + }); + + var memoryStream = new MemoryStream(); + //将数据写到内存当中 + memoryStream.SaveAs(tableDetailItemsViews, true, string.Format("模拟志愿表:_{0}_选科:{1}|_分数:{2}|_类型_{3}", viewentity.TableName, viewentity.SubjectClaim, viewentity.Score, viewentity.Type)); + //从0的位置开始写入 + memoryStream.Seek(0, SeekOrigin.Begin); + + //返回文件流 //格式是Excel格式 + return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + { + FileDownloadName = string.Format("{0}.xlsx", DateTime.Now.ToString("yyyyMMddhhssfff_")) + }; + } + + + + +} + diff --git a/Admin.NET/Admin.NET.Application/Startup.cs b/Admin.NET/Admin.NET.Application/Startup.cs new file mode 100644 index 0000000..29aa318 --- /dev/null +++ b/Admin.NET/Admin.NET.Application/Startup.cs @@ -0,0 +1,22 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; + +namespace Admin.NET.Application; + +[AppStartup(100)] +public class Startup : AppStartup +{ + public void ConfigureServices(IServiceCollection services) + { + } + + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj b/Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj new file mode 100644 index 0000000..4d1dfcf --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj @@ -0,0 +1,64 @@ + + + + net8.0 + 1701;1702;1591;8632 + + enable + true + disable + True + © Admin.NET + Admin.NET 通用权限开发平台 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Always + + + + diff --git a/Admin.NET/Admin.NET.Core/Attribute/ConstAttribute.cs b/Admin.NET/Admin.NET.Core/Attribute/ConstAttribute.cs new file mode 100644 index 0000000..baf5a60 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Attribute/ConstAttribute.cs @@ -0,0 +1,22 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 常量特性 +/// +[SuppressSniffer] +[AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = true)] +public class ConstAttribute : Attribute +{ + public string Name { get; set; } + + public ConstAttribute(string name) + { + Name = name; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Attribute/CustomUnifyResultAttribute.cs b/Admin.NET/Admin.NET.Core/Attribute/CustomUnifyResultAttribute.cs new file mode 100644 index 0000000..0543422 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Attribute/CustomUnifyResultAttribute.cs @@ -0,0 +1,22 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 自定义规范化结果特性 +/// +[SuppressSniffer] +[AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = true)] +public class CustomUnifyResultAttribute : Attribute +{ + public string Name { get; set; } + + public CustomUnifyResultAttribute(string name) + { + Name = name; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Attribute/IdempotentAttribute.cs b/Admin.NET/Admin.NET.Core/Attribute/IdempotentAttribute.cs new file mode 100644 index 0000000..d9664b6 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Attribute/IdempotentAttribute.cs @@ -0,0 +1,105 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using System.Security.Claims; + +namespace Admin.NET.Core; + +/// +/// 防止重复请求过滤器特性 +/// +[SuppressSniffer] +[AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = true)] +public class IdempotentAttribute : Attribute, IAsyncActionFilter +{ + /// + /// 请求间隔时间/秒 + /// + public int IntervalTime { get; set; } = 5; + + /// + /// 错误提示内容 + /// + public string Message { get; set; } = "你操作频率过快,请稍后重试!"; + + /// + /// 缓存前缀: Key+请求路由+用户Id+请求参数 + /// + public string CacheKey { get; set; } + + /// + /// 是否直接抛出异常:Ture是,False返回上次请求结果 + /// + public bool ThrowBah { get; set; } + + public IdempotentAttribute() + { + } + + public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) + { + var httpContext = context.HttpContext; + var path = httpContext.Request.Path.Value.ToString(); + var userId = httpContext.User?.FindFirstValue(ClaimConst.UserId); + var cacheExpireTime = TimeSpan.FromSeconds(IntervalTime); + + var parameters = ""; + foreach (var parameter in context.ActionDescriptor.Parameters) + { + parameters += parameter.Name; + parameters += context.ActionArguments[parameter.Name].ToJson(); + } + + var cacheKey = MD5Encryption.Encrypt($"{CacheKey}{path}{userId}{parameters}"); + var sysCacheService = App.GetRequiredService(); + if (sysCacheService.ExistKey(cacheKey)) + { + if (ThrowBah) throw Oops.Oh(Message); + + try + { + var cachedResult = sysCacheService.Get(cacheKey); + context.Result = new ObjectResult(cachedResult.Value); + } + catch (Exception ex) + { + throw Oops.Oh($"{Message}-{ex}"); + } + } + else + { + // 先加入一个空缓存,防止第一次请求结果没回来导致连续请求 + sysCacheService.Set(cacheKey, "", cacheExpireTime); + var resultContext = await next(); + if (resultContext.Result is ObjectResult objectResult) + { + var valueType = objectResult.Value.GetType(); + var responseData = new ResponseData + { + Type = valueType.Name, + Value = objectResult.Value + }; + sysCacheService.Set(cacheKey, responseData, cacheExpireTime); + } + } + } + + /// + /// 请求结果数据 + /// + private class ResponseData + { + /// + /// 结果类型 + /// + public string Type { get; set; } + + /// + /// 请求结果 + /// + public dynamic Value { get; set; } + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Attribute/IncreSeedAttribute.cs b/Admin.NET/Admin.NET.Core/Attribute/IncreSeedAttribute.cs new file mode 100644 index 0000000..9ab1f02 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Attribute/IncreSeedAttribute.cs @@ -0,0 +1,16 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 增量种子特性 +/// +[SuppressSniffer] +[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)] +public class IncreSeedAttribute : Attribute +{ +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Attribute/IncreTableAttribute.cs b/Admin.NET/Admin.NET.Core/Attribute/IncreTableAttribute.cs new file mode 100644 index 0000000..31f31b7 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Attribute/IncreTableAttribute.cs @@ -0,0 +1,16 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 增量表特性 +/// +[SuppressSniffer] +[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)] +public class IncreTableAttribute : Attribute +{ +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Attribute/LogTableAttribute.cs b/Admin.NET/Admin.NET.Core/Attribute/LogTableAttribute.cs new file mode 100644 index 0000000..aa07fd4 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Attribute/LogTableAttribute.cs @@ -0,0 +1,16 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 日志表特性 +/// +[SuppressSniffer] +[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)] +public class LogTableAttribute : Attribute +{ +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Attribute/MaskNewtonsoftJsonConverter.cs b/Admin.NET/Admin.NET.Core/Attribute/MaskNewtonsoftJsonConverter.cs new file mode 100644 index 0000000..a09c801 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Attribute/MaskNewtonsoftJsonConverter.cs @@ -0,0 +1,60 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Newtonsoft.Json; + +namespace Admin.NET.Core; + +/// +/// 字符串掩码 +/// +[SuppressSniffer] +public class MaskNewtonsoftJsonConverter : JsonConverter +{ + public override string ReadJson(JsonReader reader, Type objectType, string existingValue, bool hasExistingValue, JsonSerializer serializer) + { + return reader.Value.ToString(); + } + + public override void WriteJson(JsonWriter writer, string value, JsonSerializer serializer) + { + writer.WriteValue(value?.ToString().Mask()); + } +} + +/// +/// 身份证掩码 +/// +[SuppressSniffer] +public class MaskIdCardNewtonsoftJsonConverter : JsonConverter +{ + public override string ReadJson(JsonReader reader, Type objectType, string existingValue, bool hasExistingValue, JsonSerializer serializer) + { + return reader.Value.ToString(); + } + + public override void WriteJson(JsonWriter writer, string value, JsonSerializer serializer) + { + writer.WriteValue(value?.ToString().MaskIdCard()); + } +} + +/// +/// 邮箱掩码 +/// +[SuppressSniffer] +public class MaskEmailNewtonsoftJsonConverter : JsonConverter +{ + public override string ReadJson(JsonReader reader, Type objectType, string existingValue, bool hasExistingValue, JsonSerializer serializer) + { + return reader.Value.ToString(); + } + + public override void WriteJson(JsonWriter writer, string value, JsonSerializer serializer) + { + writer.WriteValue(value?.ToString().MaskEmail()); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Attribute/MaskSystemTextJsonConverter.cs b/Admin.NET/Admin.NET.Core/Attribute/MaskSystemTextJsonConverter.cs new file mode 100644 index 0000000..6b1a12f --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Attribute/MaskSystemTextJsonConverter.cs @@ -0,0 +1,61 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace Admin.NET.Core; + +/// +/// 字符串掩码 +/// +[SuppressSniffer] +public class MaskSystemTextJsonConverter : JsonConverter +{ + public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return reader.GetString(); + } + + public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) + { + writer.WriteStringValue(value?.ToString().Mask()); + } +} + +/// +/// 身份证掩码 +/// +[SuppressSniffer] +public class MaskIdCardSystemTextJsonConverter : JsonConverter +{ + public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return reader.GetString(); + } + + public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) + { + writer.WriteStringValue(value?.ToString().MaskIdCard()); + } +} + +/// +/// 邮箱掩码 +/// +[SuppressSniffer] +public class MaskEmailSystemTextJsonConverter : JsonConverter +{ + public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return reader.GetString(); + } + + public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) + { + writer.WriteStringValue(value?.ToString().MaskEmail()); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Attribute/MaxValueAttribute.cs b/Admin.NET/Admin.NET.Core/Attribute/MaxValueAttribute.cs new file mode 100644 index 0000000..8132890 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Attribute/MaxValueAttribute.cs @@ -0,0 +1,39 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 最大值校验 +/// +[SuppressSniffer] +public class MaxValueAttribute : ValidationAttribute +{ + private double MaxValue { get; } + + /// + /// 最大值 + /// + /// + public MaxValueAttribute(double value) => this.MaxValue = value; + + /// + /// 最大值校验 + /// + /// + /// + public override bool IsValid(object value) + { + return value == null || Convert.ToDouble(value) <= this.MaxValue; + } + + /// + /// 错误信息 + /// + /// + /// + public override string FormatErrorMessage(string name) => base.FormatErrorMessage(name); +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Attribute/MinValueAttribute.cs b/Admin.NET/Admin.NET.Core/Attribute/MinValueAttribute.cs new file mode 100644 index 0000000..40c7378 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Attribute/MinValueAttribute.cs @@ -0,0 +1,39 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 最小值校验 +/// +[SuppressSniffer] +public class MinValueAttribute : ValidationAttribute +{ + private double MinValue { get; set; } + + /// + /// 最小值 + /// + /// + public MinValueAttribute(double value) => this.MinValue = value; + + /// + /// 最小值校验 + /// + /// + /// + public override bool IsValid(object value) + { + return value == null || Convert.ToDouble(value) > this.MinValue; + } + + /// + /// 错误信息 + /// + /// + /// + public override string FormatErrorMessage(string name) => base.FormatErrorMessage(name); +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Attribute/SysTableAttribute.cs b/Admin.NET/Admin.NET.Core/Attribute/SysTableAttribute.cs new file mode 100644 index 0000000..f526b42 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Attribute/SysTableAttribute.cs @@ -0,0 +1,16 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统表特性 +/// +[SuppressSniffer] +[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)] +public class SysTableAttribute : Attribute +{ +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Cache/CacheSetup.cs b/Admin.NET/Admin.NET.Core/Cache/CacheSetup.cs new file mode 100644 index 0000000..6281765 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Cache/CacheSetup.cs @@ -0,0 +1,33 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +public static class CacheSetup +{ + /// + /// 缓存注册(新生命Redis组件) + /// + /// + public static void AddCache(this IServiceCollection services) + { + ICache cache = Cache.Default; + + var cacheOptions = App.GetConfig("Cache", true); + if (cacheOptions.CacheType == CacheTypeEnum.Redis.ToString()) + { + cache = new FullRedis(new RedisOptions + { + Configuration = cacheOptions.Redis.Configuration, + Prefix = cacheOptions.Redis.Prefix + }); + if (cacheOptions.Redis.MaxMessageSize > 0) + ((FullRedis)cache).MaxMessageSize = cacheOptions.Redis.MaxMessageSize; + } + + services.AddSingleton(cache); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Cache/SqlSugarCache.cs b/Admin.NET/Admin.NET.Core/Cache/SqlSugarCache.cs new file mode 100644 index 0000000..6bbcda6 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Cache/SqlSugarCache.cs @@ -0,0 +1,56 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// SqlSugar二级缓存 +/// +public class SqlSugarCache : ICacheService +{ + /// + /// 系统缓存服务 + /// + private static readonly SysCacheService _cache = App.GetRequiredService(); + + public void Add(string key, V value) + { + _cache.Set($"{CacheConst.SqlSugar}{key}", value); + } + + public void Add(string key, V value, int cacheDurationInSeconds) + { + _cache.Set($"{CacheConst.SqlSugar}{key}", value, TimeSpan.FromSeconds(cacheDurationInSeconds)); + } + + public bool ContainsKey(string key) + { + return _cache.ExistKey($"{CacheConst.SqlSugar}{key}"); + } + + public V Get(string key) + { + return _cache.Get($"{CacheConst.SqlSugar}{key}"); + } + + public IEnumerable GetAllKey() + { + return _cache.GetKeysByPrefixKey(CacheConst.SqlSugar); + } + + public V GetOrCreate(string key, Func create, int cacheDurationInSeconds = int.MaxValue) + { + return _cache.GetOrAdd($"{CacheConst.SqlSugar}{key}", (cacheKey) => + { + return create(); + }, cacheDurationInSeconds); + } + + public void Remove(string key) + { + _cache.Remove(key); // SqlSugar调用Remove方法时,key中已包含了CacheConst.SqlSugar前缀 + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Const/CacheConst.cs b/Admin.NET/Admin.NET.Core/Const/CacheConst.cs new file mode 100644 index 0000000..0431020 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Const/CacheConst.cs @@ -0,0 +1,100 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 缓存相关常量 +/// +public class CacheConst +{ + ///// + ///// 用户缓存 + ///// + //public const string KeyUser = "sys_user:"; + + ///// + ///// 用户菜单缓存 + ///// + //public const string KeyUserMenu = "sys_user_menu:"; + + /// + /// 用户权限缓存(按钮集合) + /// + public const string KeyUserButton = "sys_user_button:"; + + /// + /// 用户机构缓存 + /// + public const string KeyUserOrg = "sys_user_org:"; + + /// + /// 角色最大数据范围缓存 + /// + public const string KeyRoleMaxDataScope = "sys_role_maxDataScope:"; + + /// + /// 在线用户缓存 + /// + public const string KeyUserOnline = "sys_user_online:"; + + /// + /// 图形验证码缓存 + /// + public const string KeyVerCode = "sys_verCode:"; + + /// + /// 手机验证码缓存 + /// + public const string KeyPhoneVerCode = "sys_phoneVerCode:"; + + /// + /// 密码错误次数缓存 + /// + public const string KeyErrorPasswordCount = "sys_errorPasswordCount:"; + + /// + /// 租户缓存 + /// + public const string KeyTenant = "sys_tenant"; + + /// + /// 常量下拉框 + /// + public const string KeyConst = "sys_const:"; + + /// + /// 所有缓存关键字集合 + /// + public const string KeyAll = "sys_keys"; + + /// + /// SqlSugar二级缓存 + /// + public const string SqlSugar = "sys_sqlSugar:"; + + /// + /// 开放接口身份缓存 + /// + public const string KeyOpenAccess = "sys_open_access:"; + + /// + /// 开放接口身份随机数缓存 + /// + public const string KeyOpenAccessNonce = "sys_open_access_nonce:"; + + /// + /// 黑名单 + /// + public const string KeyBlacklist = "sys_blacklist:"; + + /// + /// 各省份批次缓存 + /// + + public const string KeyProvinceBatch = "pro_b_"; + +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Const/ClaimConst.cs b/Admin.NET/Admin.NET.Core/Const/ClaimConst.cs new file mode 100644 index 0000000..6c8ce01 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Const/ClaimConst.cs @@ -0,0 +1,76 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +public class ApplicationConst +{ + /// + /// API分组名称 + /// + public const string ZYGroupName = "志愿业务应用"; +} + +/// +/// Claim相关常量 +/// +public class ClaimConst +{ + /// + /// 用户Id + /// + public const string UserId = "UserId"; + + /// + /// 账号 + /// + public const string Account = "Account"; + + /// + /// 真实姓名 + /// + public const string RealName = "RealName"; + + /// + /// 昵称 + /// + public const string NickName = "NickName"; + + /// + /// 账号类型 + /// + public const string AccountType = "AccountType"; + + /// + /// 租户Id + /// + public const string TenantId = "TenantId"; + + /// + /// 组织机构Id + /// + public const string OrgId = "OrgId"; + + /// + /// 组织机构名称 + /// + public const string OrgName = "OrgName"; + + /// + /// 组织机构类型 + /// + public const string OrgType = "OrgType"; + + /// + /// 微信OpenId + /// + public const string OpenId = "OpenId"; + + /// + /// 登录模式PC、APP + /// + public const string LoginMode = "LoginMode"; +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Const/CommonConst.cs b/Admin.NET/Admin.NET.Core/Const/CommonConst.cs new file mode 100644 index 0000000..304044f --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Const/CommonConst.cs @@ -0,0 +1,101 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 通用常量 +/// +[Const("平台配置")] +public class CommonConst +{ + /// + /// 演示环境开关 + /// + public const string SysDemoEnv = "sys_demo"; + + /// + /// 默认密码 + /// + public const string SysPassword = "sys_password"; + + /// + /// 登录二次验证 + /// + public const string SysSecondVer = "sys_second_ver"; + + /// + /// 开启图形验证码 + /// + public const string SysCaptcha = "sys_captcha"; + + /// + /// 开启水印 + /// + public const string SysWatermark = "sys_watermark"; + + /// + /// 开启操作日志 + /// + public const string SysOpLog = "sys_oplog"; + + /// + /// Token过期时间 + /// + public const string SysTokenExpire = "sys_token_expire"; + + /// + /// RefreshToken过期时间 + /// + public const string SysRefreshTokenExpire = "sys_refresh_token_expire"; + + /// + /// 开启发送异常日志邮件 + /// + public const string SysErrorMail = "sys_error_mail"; + + /// + /// 日志保留天数 + /// + public const string SysLogRetentionDays = "sys_log_retention_days"; + + /// + /// 单用户登录 + /// + public const string SysSingleLogin = "sys_single_login"; + + /// + /// 系统管理员角色编码 + /// + public const string SysAdminRole = "sys_admin"; + + ///// + ///// 开启全局脱敏处理(默认不开启) + ///// + //public static bool SysSensitiveDetection = false; + + /// + /// 开启域登录验证 + /// + public const string SysDomainLogin = "sys_domain_login"; + + + /// + /// 日志分组名称 + /// + public const string SysLogCategoryName = "System.Logging.LoggingMonitor"; + + /// + /// 事件-增加异常日志 + /// + public const string AddExLog = "Add:ExLog"; + + /// + /// 事件-发送异常邮件 + /// + public const string SendErrorMail = "Send:ErrorMail"; + +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Const/SqlSugarConst.cs b/Admin.NET/Admin.NET.Core/Const/SqlSugarConst.cs new file mode 100644 index 0000000..a79b2cb --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Const/SqlSugarConst.cs @@ -0,0 +1,28 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// SqlSugar相关常量 +/// +public class SqlSugarConst +{ + /// + /// 默认主数据库标识(默认租户) + /// + public const string MainConfigId = "1300000000001"; + + /// + /// 默认日志数据库标识 + /// + public const string LogConfigId = "1300000000002"; + + /// + /// 默认表主键 + /// + public const string PrimaryKey = "Id"; +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/BusBatchBase.cs b/Admin.NET/Admin.NET.Core/Entity/BusBatchBase.cs new file mode 100644 index 0000000..3a95598 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/BusBatchBase.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + /// + /// 基础批次表 + /// + [SugarTable(null, "基础批次表")] + [SysTable] + public class BusBatchBase : EntityBase + { + [SugarColumn(ColumnDescription = "省份Code", Length = 100)] + public string ProvinceCode { get; set; } + + [SugarColumn(ColumnDescription = "省份", Length = 100)] + public string ProvinceName { get; set; } + + [SugarColumn(ColumnDescription = "年份")] + public int Year { get; set; } + + + + /// + /// 批次名称 + /// + [SugarColumn(ColumnDescription = "批次名称", Length = 100)] + public string Batch { get; set; } + + /// + /// 综合(默认不管) + /// + [SugarColumn(ColumnDescription = "类型", Length = 100)] + public string Course { get; set; } + + /// + /// 批次类型(提前/普通) + /// + [SugarColumn(ColumnDescription = "批次类型", Length = 100)] + public string BatchType { get; set; } + + /// + /// 批次分 + /// + [SugarColumn(ColumnDescription = "批次分")] + public int Score { get; set; } + + /// + /// 批次最低分 + /// + [SugarColumn(ColumnDescription = "批次最低分")] + public int MinScore { get; set; } + + /// + /// 批次最高分 + /// + [SugarColumn(ColumnDescription = "批次最高分")] + public int MaxScore { get; set; } + + /// + /// 压力分 + /// + + [SugarColumn(ColumnDescription = "压力分")] + public int PressureScore { get; set; } + + + /// + /// 压力分区间 + /// + [SugarColumn(ColumnDescription = "压力分区间")] + public string PressureRange { get; set; } + } +} + diff --git a/Admin.NET/Admin.NET.Core/Entity/BusProduct.cs b/Admin.NET/Admin.NET.Core/Entity/BusProduct.cs new file mode 100644 index 0000000..fd9e18b --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/BusProduct.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + + [SugarTable(null, "基础产品信息")] + [SysTable] + public class BusProduct : EntityBase + { + /// + /// 产品名称 + /// + [SugarColumn(ColumnDescription = "产品名称", Length = 200)] + public string Name { get; set; } + + /// + /// 产品单价 + /// + [SugarColumn(ColumnDescription = "产品单价")] + public decimal Price { get; set; } + + /// + /// 产品图片 + /// + [SugarColumn(ColumnDescription = "产品图片", IsNullable = true)] + public string Image { get; set; } + /// + /// 产品简介 + /// + [SugarColumn(ColumnDescription = "产品简介", IsNullable = true, Length = int.MaxValue)] + public string Summary { get; set; } + + + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/BusUniversityRank.cs b/Admin.NET/Admin.NET.Core/Entity/BusUniversityRank.cs new file mode 100644 index 0000000..21c3263 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/BusUniversityRank.cs @@ -0,0 +1,33 @@ +using DocumentFormat.OpenXml.Drawing.Diagrams; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core; + + +[SugarTable(null, "院校排名")] +[SysTable] +public class BusUniversityRank: EntityBase +{ + [SugarColumn(ColumnDescription = "高校名称", IsNullable = true)] + public string UniversityName { get; set; } + + [SugarColumn(ColumnDescription = "排名类型", IsNullable = true)] + public int? UniversityType { get; set; } + + [SugarColumn(ColumnDescription = "年份", IsNullable = true)] + public string Year { get; set; } + + [SugarColumn(ColumnDescription = "排名", IsNullable = true)] + public int Rank { get; set; } + + [SugarColumn(ColumnDescription = "得分", IsNullable = true)] + public string Score { get;set; } + + [SugarColumn(ColumnDescription = "排序", IsNullable = true)] + public int OrderSort { get; set; } + +} diff --git a/Admin.NET/Admin.NET.Core/Entity/BusVipCardInfo.cs b/Admin.NET/Admin.NET.Core/Entity/BusVipCardInfo.cs new file mode 100644 index 0000000..af2ec75 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/BusVipCardInfo.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + + /// + /// Vip卡生成 + /// + [SugarTable(null, "Vip卡生成")] + [SysTable] + public class BusVipCardInfo : EntityTenant + { + + /// + ///卡号 + /// + [SugarColumn(ColumnDescription = "卡号", IsNullable = true)] + public string Code { get; set; } + + /// + /// 卡密码 + /// + [SugarColumn(ColumnDescription = "卡密码", IsNullable = true)] + public string Pwd { get; set; } + + /// + /// 是否一绑定0否1是 + /// + [SugarColumn(ColumnDescription = "是否绑定")] + public int IsBind { get; set; } + + /// + /// 卡号有效时间 + /// + [SugarColumn(ColumnDescription = "卡号有效时间")] + public int Day { get; set; } + + /// + /// 到期时间 + /// + + [SugarColumn(ColumnDescription = "到期时间")] + public DateTime EndTime { get; set; } + + /// + /// 金额 + /// + [SugarColumn(ColumnDescription = "金额")] + public decimal Money { get; set; } + + /// + /// 卡类型Id + /// + [SugarColumn(ColumnDescription = "卡类型Id")] + public long CardTypeId { get; set; } + + + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusClassInfo.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusClassInfo.cs new file mode 100644 index 0000000..90e1376 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusClassInfo.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + + /// + /// 班级表 + /// + [SugarTable("bus_class_info", "班级表")] + public class BusClassInfo: DEntitySortTenant + { + + + public virtual long GradeId { get; set; } + + /// + /// 班级名称 + /// + [SugarColumn(ColumnDescription = "班级名称")] + [Required, MaxLength(200)] + public string Name { get; set; } + + /// + /// 班级编号 + /// + [SugarColumn(ColumnDescription = "班级编号")] + [Required, MaxLength(200)] + public string NumberCode { get; set; } + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusCustomMapReport.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusCustomMapReport.cs new file mode 100644 index 0000000..dbfe50f --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusCustomMapReport.cs @@ -0,0 +1,45 @@ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + /// + /// 用户做题进度 + /// + [SugarTable("bus_custommap_report", "用户做题进度")] + public class BusCustomMapReport : DEntitySortBase + { + /// + /// CustomId + /// + [SugarColumn(ColumnDescription = "CustomId")] + public long CustomId { get; set; } + + /// + /// 状态 + /// + [SugarColumn(ColumnDescription = "状态")] + public int Status { get; set; } + + /// + /// + /// + [SugarColumn(ColumnDescription = "进度Id")] + public int Proccess { get; set; } + + + public long HId { get; set; } + public long MId { get; set; } + public long NId { get; set; } + + public long JId { get; set; } + + + + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusCustomMenus.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusCustomMenus.cs new file mode 100644 index 0000000..b208d66 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusCustomMenus.cs @@ -0,0 +1,54 @@ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + /// + /// 学生菜单 + /// + [SugarTable("bus_custom_menus", "学生菜单")] + public class BusCustomMenus : DEntitySortTenant + { + + /// + /// 根菜单(目前学生限定两级) + /// + [SugarColumn(ColumnDescription = "根菜单")] + public virtual long RootId { get; set; } + + + /// + /// 内部链接0,1外部链接 + /// + [SugarColumn(ColumnDescription = "链接类型")] + public int UrlType { get; set; } = 0; + /// + /// 菜单名称 + /// + [SugarColumn(ColumnDescription = "菜单名称")] + [Required, MaxLength(100)] + public string MenuName { get; set; } + + + /// + /// 菜单icon + /// + [SugarColumn(ColumnDescription = "菜单icon")] + [Required, MaxLength(100)] + public string Icon { get; set; } + + /// + /// 路由地址 + /// + /// + [SugarColumn(ColumnDescription = "路由地址")] + [Required, MaxLength(400)] + public string Url { get; set; } + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusCustomeMapReportsFile.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusCustomeMapReportsFile.cs new file mode 100644 index 0000000..9f93b26 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusCustomeMapReportsFile.cs @@ -0,0 +1,37 @@ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + [SugarTable("bus_customemap_filereport", "用户报告")] + public class BusCustomeMapReports: DEntitySortBase + { + + /// + /// + /// + [SugarColumn(ColumnDescription = "学生Id")] + public Guid StudentId { get; set; } + + + /// + /// + /// + [SugarColumn(ColumnDescription = "量表类型")] + public int ScType { get; set; } + + + /// + /// 文件地址 + /// + [SugarColumn(ColumnDescription = "量表地址", Length = 600)] + public string FileUrl { get; set; } + + + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusFeedback.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusFeedback.cs new file mode 100644 index 0000000..5044632 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusFeedback.cs @@ -0,0 +1,39 @@ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + + /// + /// 意见反馈表 + /// + [SugarTable("bus_feedback_info", "意见反馈表")] + public class BusFeedback: EntityBase + { + /// + /// 意见类型 + /// + [SugarColumn(ColumnDescription = "意见类型")] + public int Type { get; set; } + + /// + /// 家长Id + /// + [SugarColumn(ColumnDescription = "家长Id")] + public long FamilyId { get; set; } + + /// + /// 意见内容 + /// + [SugarColumn(ColumnDescription = "意见内容")] + [Required, MaxLength(2000)] + public string Context { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusFramilyMapStudents.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusFramilyMapStudents.cs new file mode 100644 index 0000000..7506d92 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusFramilyMapStudents.cs @@ -0,0 +1,78 @@ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + + /// + /// 家庭关联学生表 + /// + [SugarTable("bus_framilymap_students", "家庭关联学生表")] + public class BusFramilyMapStudents : DEntitySortTenant + { + + /// + /// + /// + [SugarColumn(ColumnDescription = "家庭Id")] + public long FramilyId { get; set; } + + + /// + /// 生涯系统学生Id(远端) + /// + [SugarColumn(ColumnDescription = "学生Id")] + public Guid StudentId { get; set; } + + + /// + /// 学生学号 + /// + [SugarColumn(ColumnDescription = "学生学号",IsNullable =true)] + public string BarCode { get; set; } + + + /// + /// 学生姓名 + /// + [SugarColumn(ColumnDescription = "学生姓名", IsNullable = true)] + public string StudentName { get; set; } + + /// + /// + /// + [SugarColumn(ColumnDescription = "学校名称", IsNullable = true)] + public string SchoolName { get; set; } + /// + /// 学生年级 + /// + [SugarColumn(ColumnDescription = "学生年级", IsNullable = true)] + public string GradeName { get; set; } + + /// + /// 学生班级 + /// + [SugarColumn(ColumnDescription = "学生班级", IsNullable = true)] + public string ClassName { get; set; } + + /// + /// 性别 + /// + [SugarColumn(ColumnDescription = "性别", IsNullable = true)] + public string Gender { get; set; } + + /// + /// 是否为默认 + /// + [SugarColumn(ColumnDescription = "是否为默认", IsNullable = true)] + public bool IsDefault { get; set; } + + + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusGrade.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusGrade.cs new file mode 100644 index 0000000..a213bc4 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusGrade.cs @@ -0,0 +1,36 @@ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + + /// + /// 年级表 + /// + [SugarTable("bus_grade_info", "年级表")] + public class BusGrade: DEntitySortTenant + { + + /// + /// 年级名称 + /// + [SugarColumn(ColumnDescription = "年级名称")] + [Required, MaxLength(200)] + public string Name { get; set; } + + + /// + /// 年级编号 + /// + [SugarColumn(ColumnDescription = "年级编号")] + [Required, MaxLength(200)] + public string NumberCode { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusMajorType.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusMajorType.cs new file mode 100644 index 0000000..89d9d10 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusMajorType.cs @@ -0,0 +1,41 @@ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + + /// + /// 专业大类 + /// + [SugarTable("bus_major_type", "专业大类")] + public class BusMajorType:DEntitySortBase + { + /// + /// 专业编号 + /// + [SugarColumn(ColumnDescription = "专业编号")] + [Required, MaxLength(20)] + public string Code { get; set; } + + + /// + /// 专业名称 + /// + [SugarColumn(ColumnDescription = "专业名称")] + [Required, MaxLength(20)] + public string Name { get; set; } + + + /// + /// 本科专科 + /// + [SugarColumn(ColumnDescription = "类型")] + public int Type { get; set; } + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusMenuMapScale.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusMenuMapScale.cs new file mode 100644 index 0000000..2ae8873 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusMenuMapScale.cs @@ -0,0 +1,23 @@ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + + /// + /// 菜单关联量表 + /// + [SugarTable("bus_menumapscale_info", "菜单关联量表")] + public class BusMenuMapScale : EntityBase + { + public long MenuId { get; set; } + + public long ScaleId { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusProvince.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusProvince.cs new file mode 100644 index 0000000..c2249f5 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusProvince.cs @@ -0,0 +1,38 @@ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + + /// + /// 省份管理 + /// + [SugarTable("bus_province_info", "省份管理")] + public class BusProvince : DEntitySortBase + { + + /// + /// 省份编号 + /// + [SugarColumn(ColumnDescription = "省份编号")] + [Required, MaxLength(20)] + public string Code { get; set; } + + + /// + /// + /// + [SugarColumn(ColumnDescription = "省份名称")] + [Required, MaxLength(20)] + public string Name { get; set; } + + + + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusProvinceInitialization.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusProvinceInitialization.cs new file mode 100644 index 0000000..2e98dfe --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusProvinceInitialization.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core; + +/// +/// 各省份政策初始化表 +/// +[SugarTable(null, "各省份政策初始化表")] +[SysTable] +public class BusProvinceInitialization : EntityBase +{ + + /// + /// 省份Code + /// + [SugarColumn(ColumnDescription = "省份Code", IsNullable = true)] + public string Code { get; set; } + + [SugarColumn(ColumnDescription = "省份名称简称", IsNullable = true)] + public string Shortname { get; set;} + /// + /// 省份名称 + /// + [SugarColumn(ColumnDescription = "省份名称", IsNullable = true)] + public string Provincename { get; set; } + + /// + /// 政策类型 + /// + [SugarColumn(ColumnDescription = "政策类型", IsNullable = true)] + public int Policy { get; set; } + + /// + /// 省份总分 + /// + [SugarColumn(ColumnDescription = "省份总分", IsNullable = true)] + public int Allscore { get; set; } + +} + + \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusScaleDescription.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusScaleDescription.cs new file mode 100644 index 0000000..966e54c --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusScaleDescription.cs @@ -0,0 +1,53 @@ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + + + /// + /// 量表描述 + /// + [SugarTable("bus_scale_description","量表描述")] + public class BusScaleDescription : DEntitySortBase + { + + [SugarColumn(ColumnDescription = "量表名称")] + public string Title { get; set; } + + /// + /// 使用时间 + /// + [SugarColumn(ColumnDescription = "使用时间")] + public string UsesTime { get; set; } + /// + /// ScaleId + /// + [SugarColumn(ColumnDescription = "ScaleId")] + public long ScaleId { get; set; } + + /// + /// 介绍 + /// + [SugarColumn(ColumnDescription = "介绍", Length = int.MaxValue)] + public string Introduce { get; set; } + + /// + /// 应用 + /// + [SugarColumn(ColumnDescription = "应用", Length = int.MaxValue,IsNullable =true)] + public string Application { get; set; } + + /// + /// 须知 + /// + [SugarColumn(ColumnDescription = "须知", Length = int.MaxValue)] + public string Notice { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusScaleExplain.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusScaleExplain.cs new file mode 100644 index 0000000..94257f8 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusScaleExplain.cs @@ -0,0 +1,96 @@ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + /// + /// 量表结果解释 + /// + [SugarTable("bus_scaleexplain_info", "量表结果解释")] + public class BusScaleExplain : EntityBase + { + /// + /// 量表类型Id + /// + [SugarColumn(ColumnDescription = "标签ScaleId")] + public long ScaleId { get; set; } + + /// + /// 标签 + /// + [SugarColumn(ColumnDescription = "标签", IsNullable = true)] + [MaxLength(20)] + public string Tag { get; set; } + + + /// + /// 标签名称 + /// + [SugarColumn(ColumnDescription = "标签名称")] + [MaxLength(40)] + public string Title { get; set; } + + /// + /// 标签描述 + /// + [SugarColumn(ColumnDescription = "标签描述", Length = int.MaxValue, IsNullable = true)] + [MaxLength(2000)] + public string Description { get; set; } + + /// + /// 标签解析 + /// + [SugarColumn(ColumnDescription = "标签解析", Length = int.MaxValue, IsNullable = true)] + [MaxLength(2000)] + public string Resolving { get; set; } + + + + /// + /// 性格特质 + /// + [SugarColumn(ColumnDescription = "性格特质", Length = int.MaxValue, IsNullable = true)] + [MaxLength(2000)] + public string Traits { get; set; } + + + /// + /// 主要特征 + /// + [SugarColumn(ColumnDescription = "主要特征", Length = int.MaxValue, IsNullable = true)] + [MaxLength(int.MaxValue)] + public string Features { get; set; } + + + /// + /// 领域 + /// + [SugarColumn(ColumnDescription = "领域", Length = int.MaxValue, IsNullable = true)] + [MaxLength(int.MaxValue)] + public string MainDomain { get; set; } + + + [SugarColumn(ColumnDescription = "职业", Length = int.MaxValue, IsNullable = true)] + [MaxLength(int.MaxValue)] + public string Occupation { get; set; } + + + + [SugarColumn(ColumnDescription = "专业", Length = int.MaxValue, IsNullable = true)] + [MaxLength(int.MaxValue)] + public string Major { get; set; } + + + + [SugarColumn(ColumnDescription = "院校", Length = int.MaxValue, IsNullable = true)] + [MaxLength(int.MaxValue)] + public string University { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusScaleQuestions.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusScaleQuestions.cs new file mode 100644 index 0000000..a94b8bb --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusScaleQuestions.cs @@ -0,0 +1,32 @@ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + + /// + /// 量表试题 + /// + [SugarTable("bus_scale_questions", "量表试题")] + public class BusScaleQuestions: DEntitySortBase + { + + [SugarColumn(ColumnDescription = "量表ID")] + public virtual long ScaleId { get; set; } + + /// + /// 试题内容 + /// + [SugarColumn(ColumnDescription = "试题内容",Length =int.MaxValue)] + public string Context { get; set; } + + + + + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusSpecialRecruitStudents.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusSpecialRecruitStudents.cs new file mode 100644 index 0000000..9162e8d --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusSpecialRecruitStudents.cs @@ -0,0 +1,59 @@ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + /// + /// 特殊批次招生 + /// + [SugarTable("bus_special_recruit_students", "特殊批次招生")] + public class BusSpecialRecruitStudents:DEntitySortBase + { + + /// + /// 招生批次名称 + /// + [SugarColumn(ColumnDescription = "招生批次名称")] + [Required, MaxLength(200)] + public string Title { get; set; } + + + /// + /// Ico + /// + [SugarColumn(ColumnDescription = "Ico")] + [Required, MaxLength(300)] + public string Ico { get; set; } + + /// + /// 封面 + /// + [SugarColumn(ColumnDescription = "封面")] + [Required, MaxLength(300)] + public string Pic { get; set; } + + + /// + /// 批次描述 + /// + [SugarColumn(ColumnDescription = "批次描述")] + [Required, MaxLength(4000)] + public string Summary { get; set; } + + + /// + /// 跳转链接 + /// + [SugarColumn(ColumnDescription = "跳转链接")] + [Required, MaxLength(300)] + public string Url { get; set; } + + + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusSpecialistGroup.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusSpecialistGroup.cs new file mode 100644 index 0000000..4b8557a --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusSpecialistGroup.cs @@ -0,0 +1,90 @@ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + + /// + /// 专家团队 + /// + [SugarTable("bus_specialist_group", "专家团队")] + public class BusSpecialistGroup : DEntitySortBase + { + + + /// + /// 专家方向(该字段关联SysWechatUserMapCarts_cartId) + /// 关联知识付费eb_special_cartid + /// + [SugarColumn(ColumnDescription = "专家方向")] + public long MajorType { get; set; } + + + /// + /// 专家姓名 + /// + [SugarColumn(ColumnDescription = "专家姓名")] + [Required, MaxLength(40)] + public string Name { get; set; } + + /// + /// 专家性别 + /// + [SugarColumn(ColumnDescription = "专家性别")] + public int Gander { get; set; } + + + /// + ///专家头像 + /// + [SugarColumn(ColumnDescription = "专家头像")] + [Required, MaxLength(300)] + public string Pic { get; set; } + + /// + /// 专家电话 + /// + [SugarColumn(ColumnDescription = "专家电话")] + [Required, MaxLength(20)] + public string Phone { get; set; } + + + /// + /// 从业经验 + /// + [SugarColumn(ColumnDescription = "从业经验", IsNullable = true)] + [MaxLength(400)] + public string ServiceExpres { get; set; } + + + /// + /// 专业标签 + /// + [SugarColumn(ColumnDescription = "专业标签", IsNullable = true)] + [MaxLength(400)] + public string MajorTag { get; set; } + + + /// + /// 专家简介 + /// + [SugarColumn(ColumnDescription = "专家简介", IsNullable = true)] + [MaxLength(4000)] + public string Summery { get; set; } + + + /// + /// 咨询领域 + /// + [SugarColumn(ColumnDescription = "咨询领域", IsNullable = true)] + [MaxLength(2000)] + public string BusinessScope { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusStudentScaleResults.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusStudentScaleResults.cs new file mode 100644 index 0000000..b39d47f --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusStudentScaleResults.cs @@ -0,0 +1,51 @@ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + [SugarTable("bus_studentscale_results", "学生量表结果表")] + public class BusStudentScaleResults : EntityTenant + { + /// + /// 学生Id + /// + [SugarColumn(ColumnDescription = "学生Id")] + public long SysOauthUserId { get; set; } + + /// + /// 量表Id + /// + [SugarColumn(ColumnDescription = "量表Id")] + public long ScaleId { get; set; } + + /// + /// + /// + [SugarColumn(ColumnDescription = "标题", IsNullable = true)] + public string Title { get; set; } + + /// + /// 结果类型 + /// + [SugarColumn(ColumnDescription = "结果类型")] + public int Type { get; set; } = 0; + + /// + /// 测试结果 + /// + [SugarColumn(ColumnDescription = "测试结果", IsNullable = true, Length = int.MaxValue)] + + public string Result { get; set; } + + + + + + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusStudentSubjectData.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusStudentSubjectData.cs new file mode 100644 index 0000000..d2eba1c --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusStudentSubjectData.cs @@ -0,0 +1,34 @@ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + + /// + /// 学生选科 + /// + [SugarTable("bus_student_subjectdata", "学生选科")] + public class BusStudentSubjectData : DEntitySortTenant + { + + /// + /// 学生ID + /// + [SugarColumn(ColumnDescription = "学生ID")] + public long SysOauthId { get; set; } + + /// + /// + /// + [SugarColumn(ColumnDescription = "选科规则")] + [MaxLength(200)] + public string SubjectRules { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusStudentsFramily.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusStudentsFramily.cs new file mode 100644 index 0000000..7c034ce --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusStudentsFramily.cs @@ -0,0 +1,57 @@ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + + /// + /// 家长信息表 + /// + [SugarTable("bus_studentsframily_info", "家长信息表")] + public class BusStudentsFramily : DEntitySortTenant + { + + + /// + /// 第三方平台的用户唯一Id + /// + [SugarColumn(ColumnDescription = "UUID")] + [MaxLength(50)] + public string Uuid { get; set; } + + + /// + /// + /// + [SugarColumn(ColumnDescription = "默认头像", IsNullable = true)] + public string Avatar { get; set; } + + /// + /// 家长手机号 + /// + [SugarColumn(ColumnDescription = "家长手机号",IsNullable =true)] + public string Phone { get; set; } + + /// + /// 昵称 + /// + [SugarColumn(ColumnDescription = "昵称", IsNullable = true)] + [MaxLength(20)] + public string NickName { get; set; } + + + /// + /// 亲属角色 + /// + [SugarColumn(ColumnDescription = "亲属角色")] + public FramilyRoleEnum framilyRole { get; set; } + + + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusStudyYears.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusStudyYears.cs new file mode 100644 index 0000000..fd75ab8 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusStudyYears.cs @@ -0,0 +1,44 @@ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + + /// + /// 学年表 + /// + [SugarTable("bus_studyyears_info", "学年表")] + public class BusStudyYears : DEntitySortTenant + { + /// + /// 学年名称 + /// + [SugarColumn(ColumnDescription = "学年名称")] + [Required, MaxLength(300)] + public string Name { get; set; } + + /// + /// 学年入学时间 + /// + [SugarColumn(ColumnDescription = "学年入学时间")] + public DateTime StartDays { get; set; } + + /// + /// 学年毕业时间 + /// + [SugarColumn(ColumnDescription = "学年毕业时间")] + public DateTime EndDays { get; set; } + + /// + /// 0在读,1已毕业学界 + /// + [SugarColumn(ColumnDescription = "学年状态")] + public int Status { get; set; } + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusStudyabroadTimeAxis.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusStudyabroadTimeAxis.cs new file mode 100644 index 0000000..55a1c0f --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusStudyabroadTimeAxis.cs @@ -0,0 +1,49 @@ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + + /// + /// 留学时间节点 + /// + [SugarTable("bus_studyabroad_timeaxis", "留学时间节点")] + public class BusStudyabroadTimeAxis : DEntitySortBase + { + + /// + /// 入学时间Id + /// + [SugarColumn(ColumnDescription = "入学时间Id")] + public int StartTimeAxis { get; set; } + /// + /// 国家 + /// + [SugarColumn(ColumnDescription = "国家ID")] + public int CountryId { get; set; } + /// + /// 时间节点 + /// + [SugarColumn(ColumnDescription = "时间节点")] + public string TimeNode { get; set; } + + /// + /// 时间名称 + /// + [SugarColumn(ColumnDescription = "时间名称")] + public string EventName { get; set; } + + /// + /// 描述 + /// + [SugarColumn(ColumnDescription = "描述", Length = int.MaxValue)] + public string Description { get; set; } + + + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusSubjectBaseData.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusSubjectBaseData.cs new file mode 100644 index 0000000..e0f9d32 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusSubjectBaseData.cs @@ -0,0 +1,71 @@ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + + /// + /// 选科基础数据 + /// + [SugarTable("bus_subject_basedata", "选科基础数据")] + public class BusSubjectBaseData : DEntitySortBase + { + + + /// + /// 适用省份Id + /// + [SugarColumn(ColumnDescription = "适用省份Id")] + public int ApplyType { get; set; } + + /// + /// 年份 + /// + [SugarColumn(ColumnDescription = "年份")] + [MaxLength(100)] + public string Years { get; set; } + + + /// + /// 高校省份 + /// + [SugarColumn(ColumnDescription = "高校省份")] + [MaxLength(100)] + public string LocalProvince { get; set; } + + [SugarColumn(ColumnDescription = "学历类别")] + public int Type { get; set; } + + + /// + /// 院校名称 + /// + [SugarColumn(ColumnDescription = "院校名称")] + [MaxLength(200)] + public string UniversityName { get; set; } + + + /// + /// 专业名称 + /// + [SugarColumn(ColumnDescription = "专业名称")] + [MaxLength(150)] + public string MajorName { get; set; } + + + /// + /// 选科要求 + /// + [SugarColumn(ColumnDescription = "选科要求")] + [MaxLength(200)] + public string Requirements { get; set; } + + + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusTagMapPerson.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusTagMapPerson.cs new file mode 100644 index 0000000..e13c59c --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusTagMapPerson.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core; + +[SugarTable("bus_tagmapperson", "霍兰德代表人物")] +public class BusTagMapPerson : DEntitySortBase +{ + [SugarColumn(ColumnDescription = "标签", Length = 50, IsNullable = true)] + public string Tag { get; set; } + + [SugarColumn(ColumnDescription = "代表人物", Length = 100, IsNullable = true)] + public string NickName { get; set; } + + [SugarColumn(ColumnDescription = "人物特点", Length = int.MaxValue, IsNullable = true)] + public string Description { get; set; } + + [SugarColumn(ColumnDescription = "人物头像", Length = 300, IsNullable = true)] + public string AvatarUrl { get; set; } + +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusTenantSubjectData.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusTenantSubjectData.cs new file mode 100644 index 0000000..d0d0e4f --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusTenantSubjectData.cs @@ -0,0 +1,49 @@ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + + /// + /// 选科规则 + /// + [SugarTable("bus_tenant_subjectdata", "选科规则")] + public class BusTenantSubjectData : DEntitySortTenant + { + + /// + /// 选课规则所属学年 + /// + [SugarColumn(ColumnDescription = "选课规则所属学年")] + public long StudyYearsId { get; set; } + + + /// + /// 规则名称 + /// + [SugarColumn(ColumnDescription = "规则名称")] + [MaxLength(200)] + public string Title { get; set; } + + + /// + /// 是否开启限制规则,1限制 + /// + [SugarColumn(ColumnDescription = "是否开启限制规则")] + public int Type { get; set; } = 1; + + /// + /// 选课限制规则 + /// + [SugarColumn(ColumnDescription = "选课限制规则")] + [MaxLength(int.MaxValue)] + public string Rules { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusTimeAxis.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusTimeAxis.cs new file mode 100644 index 0000000..a88ee1f --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusTimeAxis.cs @@ -0,0 +1,79 @@ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + /// + /// 升学规划时间轴 + /// + [SugarTable("bus_time_axis", "升学规划时间轴")] + public class BusTimeAxis : DEntitySortBase + { + + /// + /// 时间轴 + /// + [SugarColumn(ColumnDescription = "时间轴")] + [Required, MaxLength(40)] + public string TimeAxis { get; set; } + + + /// + /// 对应年级(配置表初始化) + /// + [SugarColumn(ColumnDescription = "对应年级")] + public int Grade { get; set; } + + + /// + /// 对应上下学期(配置表初始化) + /// + [SugarColumn(ColumnDescription = "对应上下学期")] + public int StudyYear { get; set; } + + /// + /// 大标题 + /// + [SugarColumn(ColumnDescription = "大标题")] + [Required, MaxLength(200)] + public string BigTitle { get; set; } + + + /// + /// 小标题 + /// + [SugarColumn(ColumnDescription = "小标题")] + [Required, MaxLength(300)] + public string Title { get; set; } + + + /// + /// + /// + [SugarColumn(ColumnDescription = "是否标红")] + public int IsColor { get; set; } = 0; + + /// + /// 节点描述 + /// + [SugarColumn(ColumnDescription = "节点描述")] + [Required, MaxLength(300)] + public string Summary { get; set; } + + + /// + /// 外部链接 + /// + [SugarColumn(ColumnDescription = "外部链接")] + [Required, MaxLength(300)] + public string Url { get; set; } + + + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/BusUniversityInfo.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/BusUniversityInfo.cs new file mode 100644 index 0000000..a05bc0c --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/BusUniversityInfo.cs @@ -0,0 +1,78 @@ + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + /// + /// 高校基础信息 + /// + [SugarTable("bus_universitybase_info", "高校基础信息")] + public class BusUniversityInfo : DEntitySortBase + { + + /// + /// 高校名称 + /// + [SugarColumn(ColumnDescription = "高校名称")] + [Required, MaxLength(200)] + public string Name { get; set; } + + + /// + /// LOGO + /// + [SugarColumn(ColumnDescription = "LOGO")] + [Required, MaxLength(300)] + public string Logo { get; set; } + /// + /// 省份Id + /// + [SugarColumn(ColumnDescription = "省份Id")] + public long ProvinceId { get; set; } + + + /// + /// 教育主管部门Id + /// + [SugarColumn(ColumnDescription = "教育主管部门Id")] + public long ZgManageId { get; set; } + + + /// + /// 办学层次 + /// + [SugarColumn(ColumnDescription = "办学层次")] + public int Levels { get; set; } + + + /// + /// 办学特征(985,211) + /// + [SugarColumn(ColumnDescription = "办学特征")] + [Required, MaxLength(200)] + public string Specific { get; set; } + + + /// + /// 院校类型(综合,财经) + /// + [SugarColumn(ColumnDescription = "院校类型")] + public int UniversityType { get; set; } + + + /// + /// 排名 + /// + [SugarColumn(ColumnDescription = "排名")] + public int Rank { get; set; } + + + + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/HLDTagMapProfession.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/HLDTagMapProfession.cs new file mode 100644 index 0000000..68cdb98 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/HLDTagMapProfession.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core; + + + +/// +/// 霍兰德标签关联表 +/// +[SugarTable("bus_hldtagmap_profession", "霍兰德标签关联表")] +public class HLDTagMapProfession : DEntitySortBase +{ + [SugarColumn(ColumnDescription = "行业大类", Length = 100, IsNullable = true)] + public string TradeName { get; set; } + + + [SugarColumn(ColumnDescription = "专业大类", Length = 100, IsNullable = true)] + public string CategoryName { get; set; } + + + [SugarColumn(ColumnDescription = "专业", Length = 600, IsNullable = true)] + public string Name { get; set; } + + [SugarColumn(ColumnDescription = "标签", Length = 300, IsNullable = true)] + public string Tag { get; set; } + +} diff --git a/Admin.NET/Admin.NET.Core/Entity/CePing/SpecialistReservation.cs b/Admin.NET/Admin.NET.Core/Entity/CePing/SpecialistReservation.cs new file mode 100644 index 0000000..ec5ab5f --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/CePing/SpecialistReservation.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + /// + /// 专家预约 + /// + [SugarTable("bus_specialist_reservation", "专家预约")] + public class SpecialistReservation : DEntitySortBase + { + [SugarColumn(ColumnDescription = "用户openid")] + public string OpenId { get; set; } + + + /// + /// 预约时间 + /// + [SugarColumn(ColumnDescription = "预约时间", Length = 400)] + public string AppointmentTime { get; set; } + + + /// + /// 专家id + /// + [SugarColumn(ColumnDescription = "专家id")] + public long SId { get; set; } + + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + [Navigate(NavigateType.OneToOne, nameof(SId))] + public virtual BusSpecialistGroup BusSpecialistGroup { get; set; } + + + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + [Navigate(NavigateType.OneToOne, nameof(OpenId))] + public virtual SysWechatUser WechatUser { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Core/Entity/EntityBase.cs b/Admin.NET/Admin.NET.Core/Entity/EntityBase.cs new file mode 100644 index 0000000..2200d2d --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/EntityBase.cs @@ -0,0 +1,158 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 框架实体基类Id +/// +public abstract class EntityBaseId +{ + /// + /// 雪花Id + /// + [SugarColumn(ColumnName = "Id", ColumnDescription = "主键Id", IsPrimaryKey = true, IsIdentity = false)] + public virtual long Id { get; set; } +} + +/// +/// 框架实体基类 +/// +[SugarIndex("index_{table}_CT", nameof(CreateTime), OrderByType.Asc)] +public abstract class EntityBase : EntityBaseId, IDeletedFilter +{ + /// + /// 创建时间 + /// + [SugarColumn(ColumnDescription = "创建时间", IsOnlyIgnoreUpdate = true)] + public virtual DateTime? CreateTime { get; set; } + + /// + /// 更新时间 + /// + [SugarColumn(ColumnDescription = "更新时间")] + public virtual DateTime? UpdateTime { get; set; } + + /// + /// 创建者Id + /// + [SugarColumn(ColumnDescription = "创建者Id", IsOnlyIgnoreUpdate = true)] + public virtual long? CreateUserId { get; set; } + + ///// + ///// 创建者 + ///// + //[Newtonsoft.Json.JsonIgnore] + //[System.Text.Json.Serialization.JsonIgnore] + //[Navigate(NavigateType.OneToOne, nameof(CreateUserId))] + //public virtual SysUser CreateUser { get; set; } + + /// + /// 创建者姓名 + /// + [SugarColumn(ColumnDescription = "创建者姓名", Length = 64, IsOnlyIgnoreUpdate = true)] + public virtual string? CreateUserName { get; set; } + + /// + /// 修改者Id + /// + [SugarColumn(ColumnDescription = "修改者Id")] + public virtual long? UpdateUserId { get; set; } + + ///// + ///// 修改者 + ///// + //[Newtonsoft.Json.JsonIgnore] + //[System.Text.Json.Serialization.JsonIgnore] + //[Navigate(NavigateType.OneToOne, nameof(UpdateUserId))] + //public virtual SysUser UpdateUser { get; set; } + + /// + /// 修改者姓名 + /// + [SugarColumn(ColumnDescription = "修改者姓名", Length = 64)] + public virtual string? UpdateUserName { get; set; } + + /// + /// 软删除 + /// + [SugarColumn(ColumnDescription = "软删除")] + public virtual bool IsDelete { get; set; } = false; +} + +/// +/// 业务数据实体基类(数据权限) +/// +public abstract class EntityBaseData : EntityBase, IOrgIdFilter +{ + /// + /// 创建者部门Id + /// + [SugarColumn(ColumnDescription = "创建者部门Id", IsOnlyIgnoreUpdate = true)] + public virtual long? CreateOrgId { get; set; } + + /// + /// 创建者部门 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + [Navigate(NavigateType.OneToOne, nameof(CreateOrgId))] + public virtual SysOrg CreateOrg { get; set; } + + /// + /// 创建者部门名称 + /// + [SugarColumn(ColumnDescription = "创建者部门名称", Length = 64, IsOnlyIgnoreUpdate = true)] + public virtual string? CreateOrgName { get; set; } +} + +/// +/// 租户实体基类 +/// +public abstract class EntityTenant : EntityBase, ITenantIdFilter +{ + /// + /// 租户Id + /// + [SugarColumn(ColumnDescription = "租户Id", IsOnlyIgnoreUpdate = true)] + public virtual long? TenantId { get; set; } +} + + + public abstract class DEntitySortBase : EntityBase +{ + public virtual int Sort { get; set; } + +} +public abstract class DEntitySortTenant : EntityTenant +{ + public virtual int Sort { get; set; } + +} + +/// +/// 租户实体基类Id +/// +public abstract class EntityTenantId : EntityBaseId, ITenantIdFilter +{ + /// + /// 租户Id + /// + [SugarColumn(ColumnDescription = "租户Id", IsOnlyIgnoreUpdate = true)] + public virtual long? TenantId { get; set; } +} + +/// +/// 租户实体基类 + 业务数据(数据权限) +/// +public abstract class EntityTenantBaseData : EntityBaseData, ITenantIdFilter +{ + /// + /// 租户Id + /// + [SugarColumn(ColumnDescription = "租户Id", IsOnlyIgnoreUpdate = true)] + public virtual long? TenantId { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/IEntityFilter.cs b/Admin.NET/Admin.NET.Core/Entity/IEntityFilter.cs new file mode 100644 index 0000000..05c8727 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/IEntityFilter.cs @@ -0,0 +1,40 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 假删除接口过滤器 +/// +internal interface IDeletedFilter +{ + /// + /// 软删除 + /// + bool IsDelete { get; set; } +} + +/// +/// 租户Id接口过滤器 +/// +internal interface ITenantIdFilter +{ + /// + /// 租户Id + /// + long? TenantId { get; set; } +} + +/// +/// 机构Id接口过滤器 +/// +internal interface IOrgIdFilter +{ + /// + /// 创建者部门Id + /// + long? CreateOrgId { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysAreaConfig.cs b/Admin.NET/Admin.NET.Core/Entity/SysAreaConfig.cs new file mode 100644 index 0000000..e786f63 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysAreaConfig.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core; + +[SugarTable(null, "各省份志愿配置表")] +[SysTable] +public class SysAreaConfig : EntityBase +{ + [SugarColumn(ColumnDescription = "省份")] + [Required, MaxLength(300)] + public string LocationCode { get; set; } + [SugarColumn(ColumnDescription = "批次")] + [Required, MaxLength(300)] + public string BatchName { get; set; } + + [SugarColumn(ColumnDescription = "志愿总数量")] + public int Count { get; set; } + + + [SugarColumn(ColumnDescription = "单个志愿可选专业")] + public int ItemCount { get; set; } + +} diff --git a/Admin.NET/Admin.NET.Core/Entity/SysCodeGen.cs b/Admin.NET/Admin.NET.Core/Entity/SysCodeGen.cs new file mode 100644 index 0000000..a1a9c3b --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysCodeGen.cs @@ -0,0 +1,107 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 代码生成表 +/// +[SugarTable(null, "代码生成表")] +[SysTable] +[SugarIndex("index_{table}_B", nameof(BusName), OrderByType.Asc)] +[SugarIndex("index_{table}_T", nameof(TableName), OrderByType.Asc)] +public partial class SysCodeGen : EntityBase +{ + /// + /// 作者姓名 + /// + [SugarColumn(ColumnDescription = "作者姓名", Length = 32)] + [MaxLength(32)] + public string? AuthorName { get; set; } + + /// + /// 是否移除表前缀 + /// + [SugarColumn(ColumnDescription = "是否移除表前缀", Length = 8)] + [MaxLength(8)] + public string? TablePrefix { get; set; } + + /// + /// 生成方式 + /// + [SugarColumn(ColumnDescription = "生成方式", Length = 32)] + [MaxLength(32)] + public string? GenerateType { get; set; } + + /// + /// 库定位器名 + /// + [SugarColumn(ColumnDescription = "库定位器名", Length = 64)] + [MaxLength(64)] + public string? ConfigId { get; set; } + + /// + /// 数据库名(保留字段) + /// + [SugarColumn(ColumnDescription = "数据库库名", Length = 64)] + [MaxLength(64)] + public string? DbName { get; set; } + + /// + /// 数据库类型 + /// + [SugarColumn(ColumnDescription = "数据库类型", Length = 64)] + [MaxLength(64)] + public string? DbType { get; set; } + + /// + /// 数据库链接 + /// + [SugarColumn(ColumnDescription = "数据库链接", Length = 256)] + [MaxLength(256)] + public string? ConnectionString { get; set; } + + /// + /// 数据库表名 + /// + [SugarColumn(ColumnDescription = "数据库表名", Length = 128)] + [MaxLength(128)] + public string? TableName { get; set; } + + /// + /// 命名空间 + /// + [SugarColumn(ColumnDescription = "命名空间", Length = 128)] + [MaxLength(128)] + public string? NameSpace { get; set; } + + /// + /// 业务名 + /// + [SugarColumn(ColumnDescription = "业务名", Length = 128)] + [MaxLength(128)] + public string? BusName { get; set; } + + /// + /// 菜单编码 + /// + [SugarColumn(ColumnDescription = "菜单编码")] + public long MenuPid { get; set; } + + /// + /// 支持打印类型 + /// + [SugarColumn(ColumnDescription = "支持打印类型", Length = 32)] + [MaxLength(32)] + public string? PrintType { get; set; } + + /// + /// 打印模版名称 + /// + [SugarColumn(ColumnDescription = "打印模版名称", Length = 32)] + [MaxLength(32)] + public string? PrintName { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysCodeGenConfig.cs b/Admin.NET/Admin.NET.Core/Entity/SysCodeGenConfig.cs new file mode 100644 index 0000000..03f6b81 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysCodeGenConfig.cs @@ -0,0 +1,193 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 代码生成字段配置表 +/// +[SugarTable(null, "代码生成字段配置表")] +[SysTable] +public partial class SysCodeGenConfig : EntityBase +{ + /// + /// 代码生成主表Id + /// + [SugarColumn(ColumnDescription = "主表Id")] + public long CodeGenId { get; set; } + + /// + /// 数据库字段名 + /// + [SugarColumn(ColumnDescription = "字段名称", Length = 128)] + [Required, MaxLength(128)] + public virtual string ColumnName { get; set; } + + /// + /// 实体属性名 + /// + [SugarColumn(ColumnDescription = "属性名称", Length = 128)] + [Required, MaxLength(128)] + public virtual string PropertyName { get; set; } + + /// + /// 字段数据长度 + /// + [SugarColumn(ColumnDescription = "字段数据长度", DefaultValue = "0")] + public int ColumnLength { get; set; } + + /// + /// 字段描述 + /// + [SugarColumn(ColumnDescription = "字段描述", Length = 128)] + [MaxLength(128)] + public string? ColumnComment { get; set; } + + /// + /// .NET数据类型 + /// + [SugarColumn(ColumnDescription = "NET数据类型", Length = 64)] + [MaxLength(64)] + public string? NetType { get; set; } + + /// + /// 作用类型(字典) + /// + [SugarColumn(ColumnDescription = "作用类型", Length = 64)] + [MaxLength(64)] + public string? EffectType { get; set; } + + /// + /// 外键实体名称 + /// + [SugarColumn(ColumnDescription = "外键实体名称", Length = 64)] + [MaxLength(64)] + public string? FkEntityName { get; set; } + + /// + /// 外键表名称 + /// + [SugarColumn(ColumnDescription = "外键表名称", Length = 128)] + [MaxLength(128)] + public string? FkTableName { get; set; } + + /// + /// 外键显示字段 + /// + [SugarColumn(ColumnDescription = "外键显示字段", Length = 64)] + [MaxLength(64)] + public string? FkColumnName { get; set; } + + /// + /// 外键显示字段.NET类型 + /// + [SugarColumn(ColumnDescription = "外键显示字段.NET类型", Length = 64)] + [MaxLength(64)] + public string? FkColumnNetType { get; set; } + + /// + /// 字典编码 + /// + [SugarColumn(ColumnDescription = "字典编码", Length = 64)] + [MaxLength(64)] + public string? DictTypeCode { get; set; } + + /// + /// 列表是否缩进(字典) + /// + [SugarColumn(ColumnDescription = "列表是否缩进", Length = 8)] + [MaxLength(8)] + public string? WhetherRetract { get; set; } + + /// + /// 是否必填(字典) + /// + [SugarColumn(ColumnDescription = "是否必填", Length = 8)] + [MaxLength(8)] + public string? WhetherRequired { get; set; } + + /// + /// 是否可排序(字典) + /// + [SugarColumn(ColumnDescription = "是否可排序", Length = 8)] + [MaxLength(8)] + public string? WhetherSortable { get; set; } + + /// + /// 是否是查询条件 + /// + [SugarColumn(ColumnDescription = "是否是查询条件", Length = 8)] + [MaxLength(8)] + public string? QueryWhether { get; set; } + + /// + /// 查询方式 + /// + [SugarColumn(ColumnDescription = "查询方式", Length = 16)] + [MaxLength(16)] + public string? QueryType { get; set; } + + /// + /// 列表显示 + /// + [SugarColumn(ColumnDescription = "列表显示", Length = 8)] + [MaxLength(8)] + public string? WhetherTable { get; set; } + + /// + /// 增改 + /// + [SugarColumn(ColumnDescription = "增改", Length = 8)] + [MaxLength(8)] + public string? WhetherAddUpdate { get; set; } + + /// + /// 主键 + /// + [SugarColumn(ColumnDescription = "主键", Length = 8)] + [MaxLength(8)] + public string? ColumnKey { get; set; } + + /// + /// 数据库中类型(物理类型) + /// + [SugarColumn(ColumnDescription = "数据库中类型", Length = 64)] + [MaxLength(64)] + public string? DataType { get; set; } + + /// + /// 是否通用字段 + /// + [SugarColumn(ColumnDescription = "是否通用字段", Length = 8)] + [MaxLength(8)] + public string? WhetherCommon { get; set; } + + /// + /// 显示文本字段 + /// + [SugarColumn(ColumnDescription = "显示文本字段", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? DisplayColumn { get; set; } + + /// + /// 选中值字段 + /// + [SugarColumn(ColumnDescription = "选中值字段", Length = 128)] + [MaxLength(128)] + public string? ValueColumn { get; set; } + + /// + /// 父级字段 + /// + [SugarColumn(ColumnDescription = "父级字段", Length = 128)] + [MaxLength(128)] + public string? PidColumn { get; set; } + + /// + /// 排序 + /// + [SugarColumn(ColumnDescription = "排序")] + public int OrderNo { get; set; } = 100; +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysConfig.cs b/Admin.NET/Admin.NET.Core/Entity/SysConfig.cs new file mode 100644 index 0000000..d5af5b7 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysConfig.cs @@ -0,0 +1,64 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统参数配置表 +/// +[SugarTable(null, "系统参数配置表")] +[SysTable] +[SugarIndex("index_{table}_N", nameof(Name), OrderByType.Asc)] +[SugarIndex("index_{table}_C", nameof(Code), OrderByType.Asc)] +public partial class SysConfig : EntityBase +{ + /// + /// 名称 + /// + [SugarColumn(ColumnDescription = "名称", Length = 64)] + [Required, MaxLength(64)] + public virtual string Name { get; set; } + + /// + /// 编码 + /// + [SugarColumn(ColumnDescription = "编码", Length = 64)] + [MaxLength(64)] + public string? Code { get; set; } + + /// + /// 属性值 + /// + [SugarColumn(ColumnDescription = "属性值", Length = 64)] + [MaxLength(64)] + public string? Value { get; set; } + + /// + /// 是否是内置参数(Y-是,N-否) + /// + [SugarColumn(ColumnDescription = "是否是内置参数")] + public YesNoEnum SysFlag { get; set; } + + /// + /// 分组编码 + /// + [SugarColumn(ColumnDescription = "分组编码", Length = 64)] + [MaxLength(64)] + public string? GroupCode { get; set; } + + /// + /// 排序 + /// + [SugarColumn(ColumnDescription = "排序")] + public int OrderNo { get; set; } = 100; + + /// + /// 备注 + /// + [SugarColumn(ColumnDescription = "备注", Length = 256)] + [MaxLength(256)] + public string? Remark { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysDictData.cs b/Admin.NET/Admin.NET.Core/Entity/SysDictData.cs new file mode 100644 index 0000000..c8d1b6e --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysDictData.cs @@ -0,0 +1,97 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统字典值表 +/// +[SugarTable(null, "系统字典值表")] +[SysTable] +[SugarIndex("index_{table}_C", nameof(Code), OrderByType.Asc)] +public partial class SysDictData : EntityBase +{ + /// + /// 字典类型Id + /// + [SugarColumn(ColumnDescription = "字典类型Id")] + public long DictTypeId { get; set; } + + /// + /// 字典类型 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + [Navigate(NavigateType.OneToOne, nameof(DictTypeId))] + public SysDictType DictType { get; set; } + + /// + /// 值 + /// + [SugarColumn(ColumnDescription = "值", Length = 128)] + [Required, MaxLength(128)] + public virtual string Value { get; set; } + + /// + /// 编码 + /// + [SugarColumn(ColumnDescription = "编码", Length = 128)] + [Required, MaxLength(128)] + public virtual string Code { get; set; } + + /// + /// 名称 + /// + [SugarColumn(ColumnDescription = "名称", Length = 128)] + [MaxLength(128)] + public virtual string? Name { get; set; } + + /// + /// 显示样式-标签颜色 + /// + [SugarColumn(ColumnDescription = "显示样式-标签颜色", Length = 16)] + [MaxLength(16)] + public string? TagType { get; set; } + + /// + /// 显示样式-Style(控制显示样式) + /// + [SugarColumn(ColumnDescription = "显示样式-Style", Length = 512)] + [MaxLength(512)] + public string? StyleSetting { get; set; } + + /// + /// 显示样式-Class(控制显示样式) + /// + [SugarColumn(ColumnDescription = "显示样式-Class", Length = 512)] + [MaxLength(512)] + public string? ClassSetting { get; set; } + + /// + /// 排序 + /// + [SugarColumn(ColumnDescription = "排序")] + public int OrderNo { get; set; } = 100; + + /// + /// 备注 + /// + [SugarColumn(ColumnDescription = "备注", Length = 2048)] + [MaxLength(2048)] + public string? Remark { get; set; } + + /// + /// 拓展数据(保存业务功能的配置项) + /// + [SugarColumn(ColumnDescription = "拓展数据(保存业务功能的配置项)", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? ExtData { get; set; } + + /// + /// 状态 + /// + [SugarColumn(ColumnDescription = "状态")] + public StatusEnum Status { get; set; } = StatusEnum.Enable; +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysDictType.cs b/Admin.NET/Admin.NET.Core/Entity/SysDictType.cs new file mode 100644 index 0000000..df1d3d2 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysDictType.cs @@ -0,0 +1,56 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统字典类型表 +/// +[SugarTable(null, "系统字典类型表")] +[SysTable] +[SugarIndex("index_{table}_N", nameof(Name), OrderByType.Asc)] +[SugarIndex("index_{table}_C", nameof(Code), OrderByType.Asc)] +public partial class SysDictType : EntityBase +{ + /// + /// 名称 + /// + [SugarColumn(ColumnDescription = "名称", Length = 64)] + [Required, MaxLength(64)] + public virtual string Name { get; set; } + + /// + /// 编码 + /// + [SugarColumn(ColumnDescription = "编码", Length = 64)] + [Required, MaxLength(64)] + public virtual string Code { get; set; } + + /// + /// 排序 + /// + [SugarColumn(ColumnDescription = "排序")] + public int OrderNo { get; set; } = 100; + + /// + /// 备注 + /// + [SugarColumn(ColumnDescription = "备注", Length = 256)] + [MaxLength(256)] + public string? Remark { get; set; } + + /// + /// 状态 + /// + [SugarColumn(ColumnDescription = "状态")] + public StatusEnum Status { get; set; } = StatusEnum.Enable; + + /// + /// 字典值集合 + /// + [Navigate(NavigateType.OneToMany, nameof(SysDictData.DictTypeId))] + public List Children { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysFeedBack.cs b/Admin.NET/Admin.NET.Core/Entity/SysFeedBack.cs new file mode 100644 index 0000000..93e3f3a --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysFeedBack.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core; + + +/// +/// 用户反馈表 +/// +[SugarTable(null, "用户反馈表")] +[SysTable] +public class SysFeedBack : EntityBase +{ + /// + /// 用户ID + /// + [SugarColumn(ColumnDescription = "用户Id")] + public long CId { get; set; } + + [SugarColumn(ColumnDescription = "标题", IsNullable = true)] + public string Title { get; set; } + + [SugarColumn(ColumnDescription = "内容", IsNullable = true, Length = 800)] + public string Content { get; set; } + +} diff --git a/Admin.NET/Admin.NET.Core/Entity/SysFile.cs b/Admin.NET/Admin.NET.Core/Entity/SysFile.cs new file mode 100644 index 0000000..7a12a68 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysFile.cs @@ -0,0 +1,79 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统文件表 +/// +[SugarTable(null, "系统文件表")] +[SysTable] +[SugarIndex("index_{table}_F", nameof(FileName), OrderByType.Asc)] +public partial class SysFile : EntityBase +{ + /// + /// 提供者 + /// + [SugarColumn(ColumnDescription = "提供者", Length = 128)] + [MaxLength(128)] + public string? Provider { get; set; } + + /// + /// 仓储名称 + /// + [SugarColumn(ColumnDescription = "仓储名称", Length = 128)] + [MaxLength(128)] + public string? BucketName { get; set; } + + /// + /// 文件名称(源文件名) + /// + [SugarColumn(ColumnDescription = "文件名称", Length = 128)] + [MaxLength(128)] + public string? FileName { get; set; } + + /// + /// 文件后缀 + /// + [SugarColumn(ColumnDescription = "文件后缀", Length = 16)] + [MaxLength(16)] + public string? Suffix { get; set; } + + /// + /// 存储路径 + /// + [SugarColumn(ColumnDescription = "存储路径", Length = 128)] + [MaxLength(128)] + public string? FilePath { get; set; } + + /// + /// 文件大小KB + /// + [SugarColumn(ColumnDescription = "文件大小KB", Length = 16)] + [MaxLength(16)] + public string? SizeKb { get; set; } + + /// + /// 文件大小信息-计算后的 + /// + [SugarColumn(ColumnDescription = "文件大小信息", Length = 64)] + [MaxLength(64)] + public string? SizeInfo { get; set; } + + /// + /// 外链地址-OSS上传后生成外链地址方便前端预览 + /// + [SugarColumn(ColumnDescription = "外链地址", Length = 512)] + [MaxLength(512)] + public string? Url { get; set; } + + /// + /// 文件MD5 + /// + [SugarColumn(ColumnDescription = "文件MD5", Length = 128)] + [MaxLength(128)] + public string? FileMd5 { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysJobCluster.cs b/Admin.NET/Admin.NET.Core/Entity/SysJobCluster.cs new file mode 100644 index 0000000..6687cf6 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysJobCluster.cs @@ -0,0 +1,41 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统作业集群表 +/// +[SugarTable(null, "系统作业集群表")] +[SysTable] +public partial class SysJobCluster : EntityBaseId +{ + /// + /// 作业集群Id + /// + [SugarColumn(ColumnDescription = "作业集群Id", Length = 64)] + [Required, MaxLength(64)] + public virtual string ClusterId { get; set; } + + /// + /// 描述信息 + /// + [SugarColumn(ColumnDescription = "描述信息", Length = 128)] + [MaxLength(128)] + public string? Description { get; set; } + + /// + /// 状态 + /// + [SugarColumn(ColumnDescription = "状态")] + public ClusterStatus Status { get; set; } + + /// + /// 更新时间 + /// + [SugarColumn(ColumnDescription = "更新时间")] + public DateTime? UpdatedTime { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysJobDetail.cs b/Admin.NET/Admin.NET.Core/Entity/SysJobDetail.cs new file mode 100644 index 0000000..3c2868f --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysJobDetail.cs @@ -0,0 +1,87 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统作业信息表 +/// +[SugarTable(null, "系统作业信息表")] +[SysTable] +[SugarIndex("index_{table}_J", nameof(JobId), OrderByType.Asc)] +public partial class SysJobDetail : EntityBaseId +{ + /// + /// 作业Id + /// + [SugarColumn(ColumnDescription = "作业Id", Length = 64)] + [Required, MaxLength(64)] + public virtual string JobId { get; set; } + + /// + /// 组名称 + /// + [SugarColumn(ColumnDescription = "组名称", Length = 128)] + [MaxLength(128)] + public string? GroupName { get; set; } = "default"; + + /// + /// 作业类型FullName + /// + [SugarColumn(ColumnDescription = "作业类型", Length = 128)] + [MaxLength(128)] + public string? JobType { get; set; } + + /// + /// 程序集Name + /// + [SugarColumn(ColumnDescription = "程序集", Length = 128)] + [MaxLength(128)] + public string? AssemblyName { get; set; } + + /// + /// 描述信息 + /// + [SugarColumn(ColumnDescription = "描述信息", Length = 128)] + [MaxLength(128)] + public string? Description { get; set; } + + /// + /// 是否并行执行 + /// + [SugarColumn(ColumnDescription = "是否并行执行")] + public bool Concurrent { get; set; } = true; + + /// + /// 是否扫描特性触发器 + /// + [SugarColumn(ColumnDescription = "是否扫描特性触发器", ColumnName = "annotation")] + public bool IncludeAnnotation { get; set; } = false; + + /// + /// 额外数据 + /// + [SugarColumn(ColumnDescription = "额外数据", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? Properties { get; set; } = "{}"; + + /// + /// 更新时间 + /// + [SugarColumn(ColumnDescription = "更新时间")] + public DateTime? UpdatedTime { get; set; } + + /// + /// 作业创建类型 + /// + [SugarColumn(ColumnDescription = "作业创建类型")] + public JobCreateTypeEnum CreateType { get; set; } = JobCreateTypeEnum.BuiltIn; + + /// + /// 脚本代码 + /// + [SugarColumn(ColumnDescription = "脚本代码", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? ScriptCode { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysJobTrigger.cs b/Admin.NET/Admin.NET.Core/Entity/SysJobTrigger.cs new file mode 100644 index 0000000..dc6d5c8 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysJobTrigger.cs @@ -0,0 +1,147 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统作业触发器表 +/// +[SugarTable(null, "系统作业触发器表")] +[SysTable] +public partial class SysJobTrigger : EntityBaseId +{ + /// + /// 触发器Id + /// + [SugarColumn(ColumnDescription = "触发器Id", Length = 64)] + [Required, MaxLength(64)] + public virtual string TriggerId { get; set; } + + /// + /// 作业Id + /// + [SugarColumn(ColumnDescription = "作业Id", Length = 64)] + [Required, MaxLength(64)] + public virtual string JobId { get; set; } + + /// + /// 触发器类型FullName + /// + [SugarColumn(ColumnDescription = "触发器类型", Length = 128)] + [MaxLength(128)] + public string? TriggerType { get; set; } + + /// + /// 程序集Name + /// + [SugarColumn(ColumnDescription = "程序集", Length = 128)] + [MaxLength(128)] + public string? AssemblyName { get; set; } = "Furion.Pure"; + + /// + /// 参数 + /// + [SugarColumn(ColumnDescription = "参数", Length = 128)] + [MaxLength(128)] + public string? Args { get; set; } + + /// + /// 描述信息 + /// + [SugarColumn(ColumnDescription = "描述信息", Length = 128)] + [MaxLength(128)] + public string? Description { get; set; } + + /// + /// 状态 + /// + [SugarColumn(ColumnDescription = "状态")] + public TriggerStatus Status { get; set; } = TriggerStatus.Ready; + + /// + /// 起始时间 + /// + [SugarColumn(ColumnDescription = "起始时间")] + public DateTime? StartTime { get; set; } + + /// + /// 结束时间 + /// + [SugarColumn(ColumnDescription = "结束时间")] + public DateTime? EndTime { get; set; } + + /// + /// 最近运行时间 + /// + [SugarColumn(ColumnDescription = "最近运行时间")] + public DateTime? LastRunTime { get; set; } + + /// + /// 下一次运行时间 + /// + [SugarColumn(ColumnDescription = "下一次运行时间")] + public DateTime? NextRunTime { get; set; } + + /// + /// 触发次数 + /// + [SugarColumn(ColumnDescription = "触发次数")] + public long NumberOfRuns { get; set; } + + /// + /// 最大触发次数(0:不限制,n:N次) + /// + [SugarColumn(ColumnDescription = "最大触发次数")] + public long MaxNumberOfRuns { get; set; } + + /// + /// 出错次数 + /// + [SugarColumn(ColumnDescription = "出错次数")] + public long NumberOfErrors { get; set; } + + /// + /// 最大出错次数(0:不限制,n:N次) + /// + [SugarColumn(ColumnDescription = "最大出错次数")] + public long MaxNumberOfErrors { get; set; } + + /// + /// 重试次数 + /// + [SugarColumn(ColumnDescription = "重试次数")] + public int NumRetries { get; set; } + + /// + /// 重试间隔时间(ms) + /// + [SugarColumn(ColumnDescription = "重试间隔时间(ms)")] + public int RetryTimeout { get; set; } = 1000; + + /// + /// 是否立即启动 + /// + [SugarColumn(ColumnDescription = "是否立即启动")] + public bool StartNow { get; set; } = true; + + /// + /// 是否启动时执行一次 + /// + [SugarColumn(ColumnDescription = "是否启动时执行一次")] + public bool RunOnStart { get; set; } = false; + + /// + /// 是否在启动时重置最大触发次数等于一次的作业 + /// + [SugarColumn(ColumnDescription = "是否重置触发次数")] + public bool ResetOnlyOnce { get; set; } = true; + + /// + /// 更新时间 + /// + [SugarColumn(ColumnDescription = "更新时间")] + public DateTime? UpdatedTime { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysJobTriggerRecord.cs b/Admin.NET/Admin.NET.Core/Entity/SysJobTriggerRecord.cs new file mode 100644 index 0000000..080c5cc --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysJobTriggerRecord.cs @@ -0,0 +1,72 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统作业触发器运行记录表 +/// +[SugarTable(null, "系统作业触发器运行记录表")] +[SysTable] +public partial class SysJobTriggerRecord : EntityBaseId +{ + /// + /// 作业Id + /// + [SugarColumn(ColumnDescription = "作业Id", Length = 64)] + [Required, MaxLength(64)] + public virtual string JobId { get; set; } + + /// + /// 触发器Id + /// + [SugarColumn(ColumnDescription = "触发器Id", Length = 64)] + [Required, MaxLength(64)] + public virtual string TriggerId { get; set; } + + /// + /// 当前运行次数 + /// + [SugarColumn(ColumnDescription = "当前运行次数")] + public long NumberOfRuns { get; set; } + + /// + /// 最近运行时间 + /// + [SugarColumn(ColumnDescription = "最近运行时间")] + public DateTime? LastRunTime { get; set; } + + /// + /// 下一次运行时间 + /// + [SugarColumn(ColumnDescription = "下一次运行时间")] + public DateTime? NextRunTime { get; set; } + + /// + /// 触发器状态 + /// + [SugarColumn(ColumnDescription = "触发器状态")] + public TriggerStatus Status { get; set; } = TriggerStatus.Ready; + + /// + /// 本次执行结果 + /// + [SugarColumn(ColumnDescription = "本次执行结果", Length = 128)] + [MaxLength(128)] + public string? Result { get; set; } + + /// + /// 本次执行耗时 + /// + [SugarColumn(ColumnDescription = "本次执行耗时")] + public long ElapsedTime { get; set; } + + /// + /// 创建时间 + /// + [SugarColumn(ColumnDescription = "创建时间")] + public DateTime? CreatedTime { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysJsonStatic.cs b/Admin.NET/Admin.NET.Core/Entity/SysJsonStatic.cs new file mode 100644 index 0000000..6b6c044 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysJsonStatic.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core; + + +/// +/// 系统Json静态数据 +/// +[SugarTable(null, "系统Json静态数据")] +[SysTable] +public class SysJsonStatic : EntityBase +{ + /// + /// 名称 + /// + [SugarColumn(ColumnDescription = "名称", Length = 200)] + [Required, MaxLength(200)] + public string Name { get; set; } + + /// + /// Json内容 + /// + [SugarColumn(ColumnDescription = "Json内容", Length = 200)] + [Required, MaxLength(int.MaxValue)] + public string JsonContext { get; set; } + + /// + /// 外链链接 + /// + [SugarColumn(ColumnDescription = "外链链接", Length = 500)] + [MaxLength(500)] + public string? OutLink { get; set; } + + /// + /// 备注 + /// + [SugarColumn(ColumnDescription = "备注", Length = 256)] + [MaxLength(256)] + public string? Remark { get; set; } + + /// + /// 排序 + /// + [SugarColumn(ColumnDescription = "排序")] + public int OrderNo { get; set; } = 100; + +} diff --git a/Admin.NET/Admin.NET.Core/Entity/SysLdap.cs b/Admin.NET/Admin.NET.Core/Entity/SysLdap.cs new file mode 100644 index 0000000..a8d629b --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysLdap.cs @@ -0,0 +1,89 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统域登录信息配置表 +/// +[SugarTable(null, "系统域登录信息配置表")] +[SysTable] +public class SysLdap : EntityTenant +{ + /// + /// 主机 + /// + [SugarColumn(ColumnDescription = "主机", Length = 128)] + [Required] + public virtual string Host { get; set; } + + /// + /// 端口 + /// + [SugarColumn(ColumnDescription = "端口")] + public virtual int Port { get; set; } + + /// + /// 用户搜索基准 + /// + [SugarColumn(ColumnDescription = "用户搜索基准", Length = 128)] + [Required] + public virtual string BaseDn { get; set; } + + /// + /// 绑定DN(有管理权限制的用户) + /// + [SugarColumn(ColumnDescription = "绑定DN", Length = 32)] + [Required] + public virtual string BindDn { get; set; } + + /// + /// 绑定密码(有管理权限制的用户密码) + /// + [SugarColumn(ColumnDescription = "绑定密码", Length = 512)] + [Required] + public virtual string BindPass { get; set; } + + /// + /// 用户过滤规则 + /// + [SugarColumn(ColumnDescription = "用户过滤规则", Length = 128)] + [Required] + public virtual string AuthFilter { get; set; } = "sAMAccountName=%s"; + + /// + /// Ldap版本 + /// + [SugarColumn(ColumnDescription = "Ldap版本")] + public int Version { get; set; } + + /// + /// 绑定域账号字段属性值 + /// + [SugarColumn(ColumnDescription = "绑定域账号字段属性值", Length = 32)] + [Required] + public virtual string BindAttrAccount { get; set; } = "sAMAccountName"; + + /// + /// 绑定用户EmployeeId属性值 + /// + [SugarColumn(ColumnDescription = "绑定用户EmployeeId属性值", Length = 32)] + [Required] + public virtual string BindAttrEmployeeId { get; set; } = "EmployeeId"; + + /// + /// 绑定Code属性值 + /// + [SugarColumn(ColumnDescription = "绑定对象Code属性值", Length = 64)] + [Required] + public virtual string BindAttrCode { get; set; } = "objectGUID"; + + /// + /// 状态 + /// + [SugarColumn(ColumnDescription = "状态")] + public StatusEnum Status { get; set; } = StatusEnum.Enable; +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysLogDiff.cs b/Admin.NET/Admin.NET.Core/Entity/SysLogDiff.cs new file mode 100644 index 0000000..a25de06 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysLogDiff.cs @@ -0,0 +1,58 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统差异日志表 +/// +[SugarTable(null, "系统差异日志表")] +[SysTable] +[LogTable] +public partial class SysLogDiff : EntityBase +{ + /// + /// 操作前记录 + /// + [SugarColumn(ColumnDescription = "操作前记录", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? BeforeData { get; set; } + + /// + /// 操作后记录 + /// + [SugarColumn(ColumnDescription = "操作后记录", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? AfterData { get; set; } + + /// + /// Sql + /// + [SugarColumn(ColumnDescription = "Sql", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? Sql { get; set; } + + /// + /// 参数 手动传入的参数 + /// + [SugarColumn(ColumnDescription = "参数", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? Parameters { get; set; } + + /// + /// 业务对象 + /// + [SugarColumn(ColumnDescription = "业务对象", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? BusinessData { get; set; } + + /// + /// 差异操作 + /// + [SugarColumn(ColumnDescription = "差异操作", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? DiffType { get; set; } + + /// + /// 耗时 + /// + [SugarColumn(ColumnDescription = "耗时")] + public long? Elapsed { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysLogEx.cs b/Admin.NET/Admin.NET.Core/Entity/SysLogEx.cs new file mode 100644 index 0000000..e650144 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysLogEx.cs @@ -0,0 +1,72 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统异常日志表 +/// +[SugarTable(null, "系统异常日志表")] +[SysTable] +[LogTable] +public partial class SysLogEx : SysLogVis +{ + /// + /// 请求方式 + /// + [SugarColumn(ColumnDescription = "请求方式", Length = 32)] + [MaxLength(32)] + public string? HttpMethod { get; set; } + + /// + /// 请求地址 + /// + [SugarColumn(ColumnDescription = "请求地址", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? RequestUrl { get; set; } + + /// + /// 请求参数 + /// + [SugarColumn(ColumnDescription = "请求参数", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? RequestParam { get; set; } + + /// + /// 返回结果 + /// + [SugarColumn(ColumnDescription = "返回结果", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? ReturnResult { get; set; } + + /// + /// 事件Id + /// + [SugarColumn(ColumnDescription = "事件Id")] + public int? EventId { get; set; } + + /// + /// 线程Id + /// + [SugarColumn(ColumnDescription = "线程Id")] + public int? ThreadId { get; set; } + + /// + /// 请求跟踪Id + /// + [SugarColumn(ColumnDescription = "请求跟踪Id", Length = 128)] + [MaxLength(128)] + public string? TraceId { get; set; } + + /// + /// 异常信息 + /// + [SugarColumn(ColumnDescription = "异常信息", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? Exception { get; set; } + + /// + /// 日志消息Json + /// + [SugarColumn(ColumnDescription = "日志消息Json", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? Message { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysLogOp.cs b/Admin.NET/Admin.NET.Core/Entity/SysLogOp.cs new file mode 100644 index 0000000..e5ba1c1 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysLogOp.cs @@ -0,0 +1,72 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统操作日志表 +/// +[SugarTable(null, "系统操作日志表")] +[SysTable] +[LogTable] +public partial class SysLogOp : SysLogVis +{ + /// + /// 请求方式 + /// + [SugarColumn(ColumnDescription = "请求方式", Length = 32)] + [MaxLength(32)] + public string? HttpMethod { get; set; } + + /// + /// 请求地址 + /// + [SugarColumn(ColumnDescription = "请求地址", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? RequestUrl { get; set; } + + /// + /// 请求参数 + /// + [SugarColumn(ColumnDescription = "请求参数", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? RequestParam { get; set; } + + /// + /// 返回结果 + /// + [SugarColumn(ColumnDescription = "返回结果", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? ReturnResult { get; set; } + + /// + /// 事件Id + /// + [SugarColumn(ColumnDescription = "事件Id")] + public int? EventId { get; set; } + + /// + /// 线程Id + /// + [SugarColumn(ColumnDescription = "线程Id")] + public int? ThreadId { get; set; } + + /// + /// 请求跟踪Id + /// + [SugarColumn(ColumnDescription = "请求跟踪Id", Length = 128)] + [MaxLength(128)] + public string? TraceId { get; set; } + + /// + /// 异常信息 + /// + [SugarColumn(ColumnDescription = "异常信息", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? Exception { get; set; } + + /// + /// 日志消息Json + /// + [SugarColumn(ColumnDescription = "日志消息Json", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? Message { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysLogVis.cs b/Admin.NET/Admin.NET.Core/Entity/SysLogVis.cs new file mode 100644 index 0000000..2e0928f --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysLogVis.cs @@ -0,0 +1,116 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统访问日志表 +/// +[SugarTable(null, "系统访问日志表")] +[SysTable] +[LogTable] +public partial class SysLogVis : EntityTenant +{ + /// + /// 模块名称 + /// + [SugarColumn(ColumnDescription = "模块名称", Length = 256)] + [MaxLength(256)] + public string? ControllerName { get; set; } + + /// + /// 方法名称 + /// + [SugarColumn(ColumnDescription = "方法名称", Length = 256)] + [MaxLength(256)] + public string? ActionName { get; set; } + + /// + /// 显示名称 + /// + [SugarColumn(ColumnDescription = "显示名称", Length = 256)] + [MaxLength(256)] + public string? DisplayTitle { get; set; } + + /// + /// 执行状态 + /// + [SugarColumn(ColumnDescription = "执行状态", Length = 32)] + [MaxLength(32)] + public string? Status { get; set; } + + /// + /// IP地址 + /// + [SugarColumn(ColumnDescription = "IP地址", Length = 256)] + [MaxLength(256)] + public string? RemoteIp { get; set; } + + /// + /// 登录地点 + /// + [SugarColumn(ColumnDescription = "登录地点", Length = 128)] + [MaxLength(128)] + public string? Location { get; set; } + + /// + /// 经度 + /// + [SugarColumn(ColumnDescription = "经度")] + public double? Longitude { get; set; } + + /// + /// 维度 + /// + [SugarColumn(ColumnDescription = "维度")] + public double? Latitude { get; set; } + + /// + /// 浏览器 + /// + [SugarColumn(ColumnDescription = "浏览器", Length = 1024)] + [MaxLength(1024)] + public string? Browser { get; set; } + + /// + /// 操作系统 + /// + [SugarColumn(ColumnDescription = "操作系统", Length = 256)] + [MaxLength(256)] + public string? Os { get; set; } + + /// + /// 操作用时 + /// + [SugarColumn(ColumnDescription = "操作用时")] + public long? Elapsed { get; set; } + + /// + /// 日志时间 + /// + [SugarColumn(ColumnDescription = "日志时间")] + public DateTime? LogDateTime { get; set; } + + /// + /// 日志级别 + /// + [SugarColumn(ColumnDescription = "日志级别")] + public LogLevel? LogLevel { get; set; } + + /// + /// 账号 + /// + [SugarColumn(ColumnDescription = "账号", Length = 32)] + [MaxLength(32)] + public string? Account { get; set; } + + /// + /// 真实姓名 + /// + [SugarColumn(ColumnDescription = "真实姓名", Length = 32)] + [MaxLength(32)] + public string? RealName { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysMenu.cs b/Admin.NET/Admin.NET.Core/Entity/SysMenu.cs new file mode 100644 index 0000000..3f6a51a --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysMenu.cs @@ -0,0 +1,134 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统菜单表 +/// +[SugarTable(null, "系统菜单表")] +[SysTable] +[SugarIndex("index_{table}_T", nameof(Title), OrderByType.Asc)] +[SugarIndex("index_{table}_T2", nameof(Type), OrderByType.Asc)] +public partial class SysMenu : EntityBase +{ + /// + /// 父Id + /// + [SugarColumn(ColumnDescription = "父Id")] + public long Pid { get; set; } + + /// + /// 菜单类型(1目录 2菜单 3按钮) + /// + [SugarColumn(ColumnDescription = "菜单类型")] + public MenuTypeEnum Type { get; set; } + + /// + /// 路由名称 + /// + [SugarColumn(ColumnDescription = "路由名称", Length = 64)] + [MaxLength(64)] + public string? Name { get; set; } + + /// + /// 路由地址 + /// + [SugarColumn(ColumnDescription = "路由地址", Length = 128)] + [MaxLength(128)] + public string? Path { get; set; } + + /// + /// 组件路径 + /// + [SugarColumn(ColumnDescription = "组件路径", Length = 128)] + [MaxLength(128)] + public string? Component { get; set; } + + /// + /// 重定向 + /// + [SugarColumn(ColumnDescription = "重定向", Length = 128)] + [MaxLength(128)] + public string? Redirect { get; set; } + + /// + /// 权限标识 + /// + [SugarColumn(ColumnDescription = "权限标识", Length = 128)] + [MaxLength(128)] + public string? Permission { get; set; } + + /// + /// 菜单名称 + /// + [SugarColumn(ColumnDescription = "菜单名称", Length = 64)] + [Required, MaxLength(64)] + public virtual string Title { get; set; } + + /// + /// 图标 + /// + [SugarColumn(ColumnDescription = "图标", Length = 128)] + [MaxLength(128)] + public string? Icon { get; set; } + + /// + /// 是否内嵌 + /// + [SugarColumn(ColumnDescription = "是否内嵌")] + public bool IsIframe { get; set; } + + /// + /// 外链链接 + /// + [SugarColumn(ColumnDescription = "外链链接", Length = 256)] + [MaxLength(256)] + public string? OutLink { get; set; } + + /// + /// 是否隐藏 + /// + [SugarColumn(ColumnDescription = "是否隐藏")] + public bool IsHide { get; set; } + + /// + /// 是否缓存 + /// + [SugarColumn(ColumnDescription = "是否缓存")] + public bool IsKeepAlive { get; set; } = true; + + /// + /// 是否固定 + /// + [SugarColumn(ColumnDescription = "是否固定")] + public bool IsAffix { get; set; } + + /// + /// 排序 + /// + [SugarColumn(ColumnDescription = "排序")] + public int OrderNo { get; set; } = 100; + + /// + /// 状态 + /// + [SugarColumn(ColumnDescription = "状态")] + public StatusEnum Status { get; set; } = StatusEnum.Enable; + + /// + /// 备注 + /// + [SugarColumn(ColumnDescription = "备注", Length = 256)] + [MaxLength(256)] + public string? Remark { get; set; } + + /// + /// 菜单子项 + /// + [SugarColumn(IsIgnore = true)] + public List Children { get; set; } = new List(); +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysNotice.cs b/Admin.NET/Admin.NET.Core/Entity/SysNotice.cs new file mode 100644 index 0000000..7aa7d01 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysNotice.cs @@ -0,0 +1,82 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统通知公告表 +/// +[SugarTable(null, "系统通知公告表")] +[SysTable] +[SugarIndex("index_{table}_T", nameof(Type), OrderByType.Asc)] +public partial class SysNotice : EntityBase +{ + /// + /// 标题 + /// + [SugarColumn(ColumnDescription = "标题", Length = 32)] + [Required, MaxLength(32)] + [SensitiveDetection('*')] + public virtual string Title { get; set; } + + /// + /// 内容 + /// + [SugarColumn(ColumnDescription = "内容", ColumnDataType = StaticConfig.CodeFirst_BigString)] + [Required] + [SensitiveDetection('*')] + public virtual string Content { get; set; } + + /// + /// 类型(1通知 2公告) + /// + [SugarColumn(ColumnDescription = "类型(1通知 2公告)")] + public NoticeTypeEnum Type { get; set; } + + /// + /// 发布人Id + /// + [SugarColumn(ColumnDescription = "发布人Id")] + public long PublicUserId { get; set; } + + /// + /// 发布人姓名 + /// + [SugarColumn(ColumnDescription = "发布人姓名", Length = 32)] + [MaxLength(32)] + public string? PublicUserName { get; set; } + + /// + /// 发布机构Id + /// + [SugarColumn(ColumnDescription = "发布机构Id")] + public long PublicOrgId { get; set; } + + /// + /// 发布机构名称 + /// + [SugarColumn(ColumnDescription = "发布机构名称", Length = 64)] + [MaxLength(64)] + public string? PublicOrgName { get; set; } + + /// + /// 发布时间 + /// + [SugarColumn(ColumnDescription = "发布时间")] + public DateTime? PublicTime { get; set; } + + /// + /// 撤回时间 + /// + [SugarColumn(ColumnDescription = "撤回时间")] + public DateTime? CancelTime { get; set; } + + /// + /// 状态(0草稿 1发布 2撤回 3删除) + /// + [SugarColumn(ColumnDescription = "状态(0草稿 1发布 2撤回 3删除)")] + public NoticeStatusEnum Status { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysNoticeUser.cs b/Admin.NET/Admin.NET.Core/Entity/SysNoticeUser.cs new file mode 100644 index 0000000..5f71ba4 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysNoticeUser.cs @@ -0,0 +1,45 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统通知公告用户表 +/// +[SugarTable(null, "系统通知公告用户表")] +[SysTable] +public partial class SysNoticeUser : EntityBaseId +{ + /// + /// 通知公告Id + /// + [SugarColumn(ColumnDescription = "通知公告Id")] + public long NoticeId { get; set; } + + /// + /// 通知公告 + /// + [Navigate(NavigateType.OneToOne, nameof(NoticeId))] + public SysNotice SysNotice { get; set; } + + /// + /// 用户Id + /// + [SugarColumn(ColumnDescription = "用户Id")] + public long UserId { get; set; } + + /// + /// 阅读时间 + /// + [SugarColumn(ColumnDescription = "阅读时间")] + public DateTime? ReadTime { get; set; } + + /// + /// 状态(0未读 1已读) + /// + [SugarColumn(ColumnDescription = "状态(0未读 1已读)")] + public NoticeUserStatusEnum ReadStatus { get; set; } = NoticeUserStatusEnum.UNREAD; +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysOnlineUser.cs b/Admin.NET/Admin.NET.Core/Entity/SysOnlineUser.cs new file mode 100644 index 0000000..f8270f4 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysOnlineUser.cs @@ -0,0 +1,82 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统在线用户表 +/// +[SugarTable(null, "系统在线用户表")] +[SysTable] +public partial class SysOnlineUser : EntityTenantId +{ + /// + /// 连接Id + /// + [SugarColumn(ColumnDescription = "连接Id")] + public string? ConnectionId { get; set; } + + /// + /// 用户Id + /// + [SugarColumn(ColumnDescription = "用户Id")] + public long UserId { get; set; } + + /// + /// 账号 + /// + [SugarColumn(ColumnDescription = "账号", Length = 32, IsNullable = true)] + [Required, MaxLength(32)] + public virtual string UserName { get; set; } + + /// + /// 真实姓名 + /// + [SugarColumn(ColumnDescription = "真实姓名", Length = 32, IsNullable = true)] + [MaxLength(32)] + public string? RealName { get; set; } + + /// + /// 连接时间(上线时间) + /// + [SugarColumn(ColumnDescription = "连接时间")] + public DateTime? Time { get; set; } + + + /// + /// 下线时间 + /// + [SugarColumn(ColumnDescription = "下线时间")] + public DateTime? LastOfflineTime { get; set; } + + + /// + ///累计在线时间 + /// + [SugarColumn(ColumnDescription = "累计在线时间")] + public int TotalOnlineSeconds { get; set; } // 累计在线时间 + + /// + /// 连接IP + /// + [SugarColumn(ColumnDescription = "连接IP", Length = 256)] + [MaxLength(256)] + public string? Ip { get; set; } + + /// + /// 浏览器 + /// + [SugarColumn(ColumnDescription = "浏览器", Length = 128)] + [MaxLength(128)] + public string? Browser { get; set; } + + /// + /// 操作系统 + /// + [SugarColumn(ColumnDescription = "操作系统", Length = 128)] + [MaxLength(128)] + public string? Os { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysOpenAccess.cs b/Admin.NET/Admin.NET.Core/Entity/SysOpenAccess.cs new file mode 100644 index 0000000..68185cf --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysOpenAccess.cs @@ -0,0 +1,58 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 开放接口身份表 +/// +[SugarTable(null, "开放接口身份表")] +[SysTable] +[SugarIndex("index_{table}_A", nameof(AccessKey), OrderByType.Asc)] +public partial class SysOpenAccess : EntityBase +{ + /// + /// 身份标识 + /// + [SugarColumn(ColumnDescription = "身份标识", Length = 128)] + [Required, MaxLength(128)] + public virtual string AccessKey { get; set; } + + /// + /// 密钥 + /// + [SugarColumn(ColumnDescription = "密钥", Length = 256)] + [Required, MaxLength(256)] + public virtual string AccessSecret { get; set; } + + /// + /// 绑定租户Id + /// + [SugarColumn(ColumnDescription = "绑定租户Id")] + public long BindTenantId { get; set; } + + /// + /// 绑定租户 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + [Navigate(NavigateType.OneToOne, nameof(BindTenantId))] + public SysTenant BindTenant { get; set; } + + /// + /// 绑定用户Id + /// + [SugarColumn(ColumnDescription = "绑定用户Id")] + public virtual long BindUserId { get; set; } + + /// + /// 绑定用户 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + [Navigate(NavigateType.OneToOne, nameof(BindUserId))] + public SysUser BindUser { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysOrg.cs b/Admin.NET/Admin.NET.Core/Entity/SysOrg.cs new file mode 100644 index 0000000..f6dc77e --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysOrg.cs @@ -0,0 +1,96 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统机构表 +/// +[SugarTable(null, "系统机构表")] +[SysTable] +[SugarIndex("index_{table}_N", nameof(Name), OrderByType.Asc)] +[SugarIndex("index_{table}_C", nameof(Code), OrderByType.Asc)] +[SugarIndex("index_{table}_T", nameof(Type), OrderByType.Asc)] +public partial class SysOrg : EntityTenant +{ + /// + /// 父Id + /// + [SugarColumn(ColumnDescription = "父Id")] + public long Pid { get; set; } + + /// + /// 名称 + /// + [SugarColumn(ColumnDescription = "名称", Length = 64)] + [Required, MaxLength(64)] + public virtual string Name { get; set; } + + /// + /// 编码 + /// + [SugarColumn(ColumnDescription = "编码", Length = 64)] + [MaxLength(64)] + public string? Code { get; set; } + + /// + /// 级别 + /// + [SugarColumn(ColumnDescription = "级别")] + public int? Level { get; set; } + + /// + /// 机构类型-数据字典 + /// + [SugarColumn(ColumnDescription = "机构类型", Length = 64)] + [MaxLength(64)] + public string? Type { get; set; } + + /// + /// 负责人Id + /// + [SugarColumn(ColumnDescription = "负责人Id", IsNullable = true)] + public long? DirectorId { get; set; } + + /// + /// 负责人 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + [Navigate(NavigateType.OneToOne, nameof(DirectorId))] + public SysUser Director { get; set; } + + /// + /// 排序 + /// + [SugarColumn(ColumnDescription = "排序")] + public int OrderNo { get; set; } = 100; + + /// + /// 状态 + /// + [SugarColumn(ColumnDescription = "状态")] + public StatusEnum Status { get; set; } = StatusEnum.Enable; + + /// + /// 备注 + /// + [SugarColumn(ColumnDescription = "备注", Length = 128)] + [MaxLength(128)] + public string? Remark { get; set; } + + /// + /// 机构子项 + /// + [SugarColumn(IsIgnore = true)] + public List Children { get; set; } + + /// + /// 是否禁止选中 + /// + [SugarColumn(IsIgnore = true)] + public bool Disabled { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysPlugin.cs b/Admin.NET/Admin.NET.Core/Entity/SysPlugin.cs new file mode 100644 index 0000000..2cc8e58 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysPlugin.cs @@ -0,0 +1,56 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统动态插件表 +/// +[SugarTable(null, "系统动态插件表")] +[SysTable] +[SugarIndex("index_{table}_N", nameof(Name), OrderByType.Asc)] +public partial class SysPlugin : EntityTenant +{ + /// + /// 名称 + /// + [SugarColumn(ColumnDescription = "名称", Length = 64)] + [Required, MaxLength(64)] + public virtual string Name { get; set; } + + /// + /// C#代码 + /// + [SugarColumn(ColumnDescription = "C#代码", ColumnDataType = StaticConfig.CodeFirst_BigString)] + [Required] + public virtual string CsharpCode { get; set; } + + /// + /// 程序集名称 + /// + [SugarColumn(ColumnDescription = "程序集名称", Length = 512)] + [MaxLength(512)] + public string? AssemblyName { get; set; } + + /// + /// 排序 + /// + [SugarColumn(ColumnDescription = "排序")] + public int OrderNo { get; set; } = 100; + + /// + /// 状态 + /// + [SugarColumn(ColumnDescription = "状态")] + public StatusEnum Status { get; set; } = StatusEnum.Enable; + + /// + /// 备注 + /// + [SugarColumn(ColumnDescription = "备注", Length = 128)] + [MaxLength(128)] + public string? Remark { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysPos.cs b/Admin.NET/Admin.NET.Core/Entity/SysPos.cs new file mode 100644 index 0000000..d20f060 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysPos.cs @@ -0,0 +1,50 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统职位表 +/// +[SugarTable(null, "系统职位表")] +[SysTable] +[SugarIndex("index_{table}_N", nameof(Name), OrderByType.Asc)] +[SugarIndex("index_{table}_C", nameof(Code), OrderByType.Asc)] +public partial class SysPos : EntityTenant +{ + /// + /// 名称 + /// + [SugarColumn(ColumnDescription = "名称", Length = 64)] + [Required, MaxLength(64)] + public virtual string Name { get; set; } + + /// + /// 编码 + /// + [SugarColumn(ColumnDescription = "编码", Length = 64)] + [MaxLength(64)] + public string? Code { get; set; } + + /// + /// 排序 + /// + [SugarColumn(ColumnDescription = "排序")] + public int OrderNo { get; set; } = 100; + + /// + /// 备注 + /// + [SugarColumn(ColumnDescription = "备注", Length = 128)] + [MaxLength(128)] + public string? Remark { get; set; } + + /// + /// 状态 + /// + [SugarColumn(ColumnDescription = "状态")] + public StatusEnum Status { get; set; } = StatusEnum.Enable; +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysPrint.cs b/Admin.NET/Admin.NET.Core/Entity/SysPrint.cs new file mode 100644 index 0000000..1f9d8ac --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysPrint.cs @@ -0,0 +1,49 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统打印模板表 +/// +[SugarTable(null, "系统打印模板表")] +[SysTable] +[SugarIndex("index_{table}_N", nameof(Name), OrderByType.Asc)] +public partial class SysPrint : EntityTenant +{ + /// + /// 名称 + /// + [SugarColumn(ColumnDescription = "名称", Length = 64)] + [Required, MaxLength(64)] + public virtual string Name { get; set; } + + /// + /// 打印模板 + /// + [SugarColumn(ColumnDescription = "打印模板", ColumnDataType = StaticConfig.CodeFirst_BigString)] + [Required] + public virtual string Template { get; set; } + + /// + /// 排序 + /// + [SugarColumn(ColumnDescription = "排序")] + public int OrderNo { get; set; } = 100; + + /// + /// 状态 + /// + [SugarColumn(ColumnDescription = "状态")] + public StatusEnum Status { get; set; } = StatusEnum.Enable; + + /// + /// 备注 + /// + [SugarColumn(ColumnDescription = "备注", Length = 128)] + [MaxLength(128)] + public string? Remark { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysRegion.cs b/Admin.NET/Admin.NET.Core/Entity/SysRegion.cs new file mode 100644 index 0000000..103f20e --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysRegion.cs @@ -0,0 +1,109 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统行政地区表 +/// +[SugarTable(null, "系统行政地区表")] +[SysTable] +[SugarIndex("index_{table}_N", nameof(Name), OrderByType.Asc)] +[SugarIndex("index_{table}_C", nameof(Code), OrderByType.Asc)] +public partial class SysRegion : EntityBaseId +{ + /// + /// 父Id + /// + [SugarColumn(ColumnDescription = "父Id")] + public long Pid { get; set; } + + /// + /// 名称 + /// + [SugarColumn(ColumnDescription = "名称", Length = 128)] + [Required, MaxLength(128)] + public virtual string Name { get; set; } + + /// + /// 简称 + /// + [SugarColumn(ColumnDescription = "简称", Length = 32)] + [MaxLength(32)] + public string? ShortName { get; set; } + + /// + /// 组合名 + /// + [SugarColumn(ColumnDescription = "组合名", Length = 64)] + [MaxLength(64)] + public string? MergerName { get; set; } + + /// + /// 行政代码 + /// + [SugarColumn(ColumnDescription = "行政代码", Length = 32)] + [MaxLength(32)] + public string? Code { get; set; } + + /// + /// 邮政编码 + /// + [SugarColumn(ColumnDescription = "邮政编码", Length = 6)] + [MaxLength(6)] + public string? ZipCode { get; set; } + + /// + /// 区号 + /// + [SugarColumn(ColumnDescription = "区号", Length = 6)] + [MaxLength(6)] + public string? CityCode { get; set; } + + /// + /// 层级 + /// + [SugarColumn(ColumnDescription = "层级")] + public int Level { get; set; } + + /// + /// 拼音 + /// + [SugarColumn(ColumnDescription = "拼音", Length = 128)] + [MaxLength(128)] + public string? PinYin { get; set; } + + /// + /// 经度 + /// + [SugarColumn(ColumnDescription = "经度")] + public float Lng { get; set; } + + /// + /// 维度 + /// + [SugarColumn(ColumnDescription = "维度")] + public float Lat { get; set; } + + /// + /// 排序 + /// + [SugarColumn(ColumnDescription = "排序")] + public int OrderNo { get; set; } = 100; + + /// + /// 备注 + /// + [SugarColumn(ColumnDescription = "备注", Length = 128)] + [MaxLength(128)] + public string? Remark { get; set; } + + /// + /// 机构子项 + /// + [SugarColumn(IsIgnore = true)] + public List Children { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysRole.cs b/Admin.NET/Admin.NET.Core/Entity/SysRole.cs new file mode 100644 index 0000000..509e13d --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysRole.cs @@ -0,0 +1,56 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统角色表 +/// +[SugarTable(null, "系统角色表")] +[SysTable] +[SugarIndex("index_{table}_N", nameof(Name), OrderByType.Asc)] +[SugarIndex("index_{table}_C", nameof(Code), OrderByType.Asc)] +public partial class SysRole : EntityTenant +{ + /// + /// 名称 + /// + [SugarColumn(ColumnDescription = "名称", Length = 64)] + [Required, MaxLength(64)] + public virtual string Name { get; set; } + + /// + /// 编码 + /// + [SugarColumn(ColumnDescription = "编码", Length = 64)] + [MaxLength(64)] + public string? Code { get; set; } + + /// + /// 排序 + /// + [SugarColumn(ColumnDescription = "排序")] + public int OrderNo { get; set; } = 100; + + /// + /// 数据范围(1全部数据 2本部门及以下数据 3本部门数据 4仅本人数据 5自定义数据) + /// + [SugarColumn(ColumnDescription = "数据范围")] + public DataScopeEnum DataScope { get; set; } = DataScopeEnum.Self; + + /// + /// 备注 + /// + [SugarColumn(ColumnDescription = "备注", Length = 128)] + [MaxLength(128)] + public string? Remark { get; set; } + + /// + /// 状态 + /// + [SugarColumn(ColumnDescription = "状态")] + public StatusEnum Status { get; set; } = StatusEnum.Enable; +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysRoleMenu.cs b/Admin.NET/Admin.NET.Core/Entity/SysRoleMenu.cs new file mode 100644 index 0000000..04e3f1d --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysRoleMenu.cs @@ -0,0 +1,35 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统角色菜单表 +/// +[SugarTable(null, "系统角色菜单表")] +[SysTable] +public class SysRoleMenu : EntityBaseId +{ + /// + /// 角色Id + /// + [SugarColumn(ColumnDescription = "角色Id")] + public long RoleId { get; set; } + + /// + /// 菜单Id + /// + [SugarColumn(ColumnDescription = "菜单Id")] + public long MenuId { get; set; } + + /// + /// 菜单 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + [Navigate(NavigateType.OneToOne, nameof(MenuId))] + public SysMenu SysMenu { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysRoleOrg.cs b/Admin.NET/Admin.NET.Core/Entity/SysRoleOrg.cs new file mode 100644 index 0000000..c4622f8 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysRoleOrg.cs @@ -0,0 +1,35 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统角色机构表 +/// +[SugarTable(null, "系统角色机构表")] +[SysTable] +public class SysRoleOrg : EntityBaseId +{ + /// + /// 角色Id + /// + [SugarColumn(ColumnDescription = "角色Id")] + public long RoleId { get; set; } + + /// + /// 机构Id + /// + [SugarColumn(ColumnDescription = "机构Id")] + public long OrgId { get; set; } + + /// + /// 机构 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + [Navigate(NavigateType.OneToOne, nameof(OrgId))] + public SysOrg SysOrg { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysTenant.cs b/Admin.NET/Admin.NET.Core/Entity/SysTenant.cs new file mode 100644 index 0000000..9d1fa6f --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysTenant.cs @@ -0,0 +1,85 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统租户表 +/// +[SugarTable(null, "系统租户表")] +[SysTable] +public partial class SysTenant : EntityBase +{ + /// + /// 用户Id + /// + [SugarColumn(ColumnDescription = "用户Id")] + public long UserId { get; set; } + + /// + /// 机构Id + /// + [SugarColumn(ColumnDescription = "机构Id")] + public long OrgId { get; set; } + + /// + /// 主机 + /// + [SugarColumn(ColumnDescription = "主机", Length = 128)] + [MaxLength(128)] + public string? Host { get; set; } + + /// + /// 租户类型 + /// + [SugarColumn(ColumnDescription = "租户类型")] + public TenantTypeEnum TenantType { get; set; } + + /// + /// 数据库类型 + /// + [SugarColumn(ColumnDescription = "数据库类型")] + public SqlSugar.DbType DbType { get; set; } + + /// + /// 数据库连接 + /// + [SugarColumn(ColumnDescription = "数据库连接", Length = 256)] + [MaxLength(256)] + public string? Connection { get; set; } + + /// + /// 数据库标识 + /// + [SugarColumn(ColumnDescription = "数据库标识", Length = 64)] + [MaxLength(64)] + public string? ConfigId { get; set; } + + /// + /// 从库连接/读写分离 + /// + [SugarColumn(ColumnDescription = "从库连接/读写分离", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? SlaveConnections { get; set; } + + /// + /// 排序 + /// + [SugarColumn(ColumnDescription = "排序")] + public int OrderNo { get; set; } = 100; + + /// + /// 备注 + /// + [SugarColumn(ColumnDescription = "备注", Length = 128)] + [MaxLength(128)] + public string? Remark { get; set; } + + /// + /// 状态 + /// + [SugarColumn(ColumnDescription = "状态")] + public StatusEnum Status { get; set; } = StatusEnum.Enable; +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysUnCollection.cs b/Admin.NET/Admin.NET.Core/Entity/SysUnCollection.cs new file mode 100644 index 0000000..1a58849 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysUnCollection.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core; + + +/// +/// 系统用户扩展机构表 +/// +[SugarTable(null, "用户院校收藏表")] +[SysTable] +public class SysUnCollection: EntityBase +{ + /// + /// Wx用户Id + /// + [SugarColumn(ColumnDescription = "Wx用户Id")] + public long WxId { get; set; } + + /// + /// 院校Id + /// + public long uId { get; set; } + +} diff --git a/Admin.NET/Admin.NET.Core/Entity/SysUser.cs b/Admin.NET/Admin.NET.Core/Entity/SysUser.cs new file mode 100644 index 0000000..eea9f1d --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysUser.cs @@ -0,0 +1,315 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统用户表 +/// +[SugarTable(null, "系统用户表")] +[SysTable] +[SugarIndex("index_{table}_A", nameof(Account), OrderByType.Asc)] +[SugarIndex("index_{table}_P", nameof(Phone), OrderByType.Asc)] +public partial class SysUser : EntityTenant +{ + /// + /// 账号 + /// + [SugarColumn(ColumnDescription = "账号", Length = 32)] + [Required, MaxLength(32)] + public virtual string Account { get; set; } + + /// + /// 密码 + /// + [SugarColumn(ColumnDescription = "密码", Length = 512)] + [MaxLength(512)] + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public virtual string Password { get; set; } + + /// + /// 真实姓名 + /// + [SugarColumn(ColumnDescription = "真实姓名", Length = 32)] + [MaxLength(32)] + public virtual string RealName { get; set; } + + /// + /// 昵称 + /// + [SugarColumn(ColumnDescription = "昵称", Length = 32)] + [MaxLength(32)] + public string? NickName { get; set; } + + /// + /// 头像 + /// + [SugarColumn(ColumnDescription = "头像", Length = 512)] + [MaxLength(512)] + public string? Avatar { get; set; } + + /// + /// 性别-男_1、女_2 + /// + [SugarColumn(ColumnDescription = "性别")] + public GenderEnum Sex { get; set; } = GenderEnum.Male; + + /// + /// 年龄 + /// + [SugarColumn(ColumnDescription = "年龄")] + public int Age { get; set; } + + /// + /// 出生日期 + /// + [SugarColumn(ColumnDescription = "出生日期")] + public DateTime? Birthday { get; set; } + + /// + /// 民族 + /// + [SugarColumn(ColumnDescription = "民族", Length = 32)] + [MaxLength(32)] + public string? Nation { get; set; } + + /// + /// 手机号码 + /// + [SugarColumn(ColumnDescription = "手机号码", Length = 16)] + [MaxLength(16)] + public string? Phone { get; set; } + + /// + /// 证件类型 + /// + [SugarColumn(ColumnDescription = "证件类型")] + public CardTypeEnum CardType { get; set; } + + /// + /// 身份证号 + /// + [SugarColumn(ColumnDescription = "身份证号", Length = 32)] + [MaxLength(32)] + public string? IdCardNum { get; set; } + + /// + /// 邮箱 + /// + [SugarColumn(ColumnDescription = "邮箱", Length = 64)] + [MaxLength(64)] + public string? Email { get; set; } + + /// + /// 地址 + /// + [SugarColumn(ColumnDescription = "地址", Length = 256)] + [MaxLength(256)] + public string? Address { get; set; } + + /// + /// 文化程度 + /// + [SugarColumn(ColumnDescription = "文化程度")] + public CultureLevelEnum CultureLevel { get; set; } + + /// + /// 政治面貌 + /// + [SugarColumn(ColumnDescription = "政治面貌", Length = 16)] + [MaxLength(16)] + public string? PoliticalOutlook { get; set; } + + /// + /// 毕业院校 + /// COLLEGE + [SugarColumn(ColumnDescription = "毕业院校", Length = 128)] + [MaxLength(128)] + public string? College { get; set; } + + /// + /// 办公电话 + /// + [SugarColumn(ColumnDescription = "办公电话", Length = 16)] + [MaxLength(16)] + public string? OfficePhone { get; set; } + + /// + /// 紧急联系人 + /// + [SugarColumn(ColumnDescription = "紧急联系人", Length = 32)] + [MaxLength(32)] + public string? EmergencyContact { get; set; } + + /// + /// 紧急联系人电话 + /// + [SugarColumn(ColumnDescription = "紧急联系人电话", Length = 16)] + [MaxLength(16)] + public string? EmergencyPhone { get; set; } + + /// + /// 紧急联系人地址 + /// + [SugarColumn(ColumnDescription = "紧急联系人地址", Length = 256)] + [MaxLength(256)] + public string? EmergencyAddress { get; set; } + + /// + /// 个人简介 + /// + [SugarColumn(ColumnDescription = "个人简介", Length = 512)] + [MaxLength(512)] + public string? Introduction { get; set; } + + /// + /// 排序 + /// + [SugarColumn(ColumnDescription = "排序")] + public int OrderNo { get; set; } = 100; + + /// + /// 状态 + /// + [SugarColumn(ColumnDescription = "状态")] + public StatusEnum Status { get; set; } = StatusEnum.Enable; + + /// + /// 备注 + /// + [SugarColumn(ColumnDescription = "备注", Length = 256)] + [MaxLength(256)] + public string? Remark { get; set; } + + /// + /// 账号类型 + /// + [SugarColumn(ColumnDescription = "账号类型")] + public AccountTypeEnum AccountType { get; set; } = AccountTypeEnum.NormalUser; + + /// + /// 直属机构Id + /// + [SugarColumn(ColumnDescription = "直属机构Id")] + public long OrgId { get; set; } + + /// + /// 直属机构 + /// + [Navigate(NavigateType.OneToOne, nameof(OrgId))] + public SysOrg SysOrg { get; set; } + + /// + /// 直属主管Id + /// + [SugarColumn(ColumnDescription = "直属主管Id")] + public long? ManagerUserId { get; set; } + + /// + /// 直属主管 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + [Navigate(NavigateType.OneToOne, nameof(ManagerUserId))] + public SysUser ManagerUser { get; set; } + + /// + /// 职位Id + /// + [SugarColumn(ColumnDescription = "职位Id")] + public long PosId { get; set; } + + /// + /// 职位 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + [Navigate(NavigateType.OneToOne, nameof(PosId))] + public SysPos SysPos { get; set; } + + /// + /// 工号 + /// + [SugarColumn(ColumnDescription = "工号", Length = 32)] + [MaxLength(32)] + public string? JobNum { get; set; } + + /// + /// 职级 + /// + [SugarColumn(ColumnDescription = "职级", Length = 32)] + [MaxLength(32)] + public string? PosLevel { get; set; } + + /// + /// 职称 + /// + [SugarColumn(ColumnDescription = "职称", Length = 32)] + [MaxLength(32)] + public string? PosTitle { get; set; } + + /// + /// 擅长领域 + /// + [SugarColumn(ColumnDescription = "擅长领域", Length = 32)] + [MaxLength(32)] + public string? Expertise { get; set; } + + /// + /// 办公区域 + /// + [SugarColumn(ColumnDescription = "办公区域", Length = 32)] + [MaxLength(32)] + public string? OfficeZone { get; set; } + + /// + /// 办公室 + /// + [SugarColumn(ColumnDescription = "办公室", Length = 32)] + [MaxLength(32)] + public string? Office { get; set; } + + /// + /// 入职日期 + /// + [SugarColumn(ColumnDescription = "入职日期")] + public DateTime? JoinDate { get; set; } + + /// + /// 最新登录Ip + /// + [SugarColumn(ColumnDescription = "最新登录Ip", Length = 256)] + [MaxLength(256)] + public string? LastLoginIp { get; set; } + + /// + /// 最新登录地点 + /// + [SugarColumn(ColumnDescription = "最新登录地点", Length = 128)] + [MaxLength(128)] + public string? LastLoginAddress { get; set; } + + /// + /// 最新登录时间 + /// + [SugarColumn(ColumnDescription = "最新登录时间")] + public DateTime? LastLoginTime { get; set; } + + /// + /// 最新登录设备 + /// + [SugarColumn(ColumnDescription = "最新登录设备", Length = 128)] + [MaxLength(128)] + public string? LastLoginDevice { get; set; } + + /// + /// 电子签名 + /// + [SugarColumn(ColumnDescription = "电子签名", Length = 512)] + [MaxLength(512)] + public string? Signature { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysUserExtOrg.cs b/Admin.NET/Admin.NET.Core/Entity/SysUserExtOrg.cs new file mode 100644 index 0000000..cc8c3cb --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysUserExtOrg.cs @@ -0,0 +1,77 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统用户扩展机构表 +/// +[SugarTable(null, "系统用户扩展机构表")] +[SysTable] +public partial class SysUserExtOrg : EntityBaseId +{ + /// + /// 用户Id + /// + [SugarColumn(ColumnDescription = "用户Id")] + public long UserId { get; set; } + + /// + /// 用户 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + [Navigate(NavigateType.OneToOne, nameof(UserId))] + public SysUser SysUser { get; set; } + + /// + /// 机构Id + /// + [SugarColumn(ColumnDescription = "机构Id")] + public long OrgId { get; set; } + + /// + /// 机构 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + [Navigate(NavigateType.OneToOne, nameof(OrgId))] + public SysOrg SysOrg { get; set; } + + /// + /// 职位Id + /// + [SugarColumn(ColumnDescription = "职位Id")] + public long PosId { get; set; } + + /// + /// 职位 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + [Navigate(NavigateType.OneToOne, nameof(PosId))] + public SysPos SysPos { get; set; } + + /// + /// 工号 + /// + [SugarColumn(ColumnDescription = "工号", Length = 32)] + [MaxLength(32)] + public string? JobNum { get; set; } + + /// + /// 职级 + /// + [SugarColumn(ColumnDescription = "职级", Length = 32)] + [MaxLength(32)] + public string? PosLevel { get; set; } + + /// + /// 入职日期 + /// + [SugarColumn(ColumnDescription = "入职日期")] + public DateTime? JoinDate { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysUserLdap.cs b/Admin.NET/Admin.NET.Core/Entity/SysUserLdap.cs new file mode 100644 index 0000000..f2e0b74 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysUserLdap.cs @@ -0,0 +1,44 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统用户域配置表 +/// +[SugarTable(null, "系统用户域配置表")] +[SysTable] +[SugarIndex("index_{table}_A", nameof(Account), OrderByType.Asc)] +[SugarIndex("index_{table}_U", nameof(UserId), OrderByType.Asc)] +public class SysUserLdap : EntityTenant +{ + /// + /// 用户Id + /// + [SugarColumn(ColumnDescription = "用户Id")] + public long UserId { get; set; } + + /// + /// 域账号 + /// AD域对应sAMAccountName + /// Ldap对应uid + /// + [SugarColumn(ColumnDescription = "域账号", Length = 32)] + [Required] + public string Account { get; set; } + + /// + /// 对应EmployeeId(用于数据导入对照) + /// + [SugarColumn(ColumnDescription = "对应EmployeeId", Length = 32)] + public string? EmployeeId { get; set; } + + /// + /// 组织代码 + /// + [SugarColumn(ColumnDescription = "组织代码", Length = 64)] + public string? DeptCode { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysUserRole.cs b/Admin.NET/Admin.NET.Core/Entity/SysUserRole.cs new file mode 100644 index 0000000..8d5cff1 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysUserRole.cs @@ -0,0 +1,41 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统用户角色表 +/// +[SugarTable(null, "系统用户角色表")] +[SysTable] +public class SysUserRole : EntityBaseId +{ + /// + /// 用户Id + /// + [SugarColumn(ColumnDescription = "用户Id")] + public long UserId { get; set; } + + /// + /// 用户 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + [Navigate(NavigateType.OneToOne, nameof(UserId))] + public SysUser SysUser { get; set; } + + /// + /// 角色Id + /// + [SugarColumn(ColumnDescription = "角色Id")] + public long RoleId { get; set; } + + /// + /// 角色 + /// + [Navigate(NavigateType.OneToOne, nameof(RoleId))] + public SysRole SysRole { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysVolunteerTb.cs b/Admin.NET/Admin.NET.Core/Entity/SysVolunteerTb.cs new file mode 100644 index 0000000..5eb20e1 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysVolunteerTb.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core; + + +/// +/// 我的志愿表 +/// +[SugarTable(null, "我的志愿表")] +[SysTable] +public class SysVolunteerTb : EntityBase +{ + /// + /// 用户ID + /// + [SugarColumn(ColumnDescription = "用户Id")] + public long CId { get; set; } + + /// + /// 志愿表名称 + /// + [SugarColumn(ColumnDescription = "志愿表名称", IsNullable = true)] + public string TableName { get; set; } + + + /// + ///批次名称 + /// + [SugarColumn(ColumnDescription = "批次名称", IsNullable = true)] + public string BatchName { get; set; } + + /// + /// 志愿填报类型(智能填报|一键填报) + /// + [SugarColumn(ColumnDescription = "志愿填报类型", IsNullable = true)] + public string Type { get; set; } + + /// + /// 选科科目 + /// + [SugarColumn(ColumnDescription = "选科科目", IsNullable = true)] + public string SubjectClaim { get; set; } + + /// + ///填报志愿选择成绩 + /// + [SugarColumn(ColumnDescription = "成绩")] + public float Score { get; set; } + + + /// + /// 志愿表详情 + /// + [SugarColumn(ColumnDescription = "志愿表详情", Length = int.MaxValue)] + [MaxLength(int.MaxValue)] + public string Detail { get; set; } + + + /// + /// 所在省份code + /// + [SugarColumn(ColumnDescription = "所在省份code", IsNullable = true)] + public string LocationCode { get; set; } + + /// + /// 排序 + /// + public int OrderSort { get; set; } = 0; + + /// + /// 是否推给专家 + /// + [SugarColumn(ColumnDescription = "是否推给专家", IsNullable = true)] + public bool IsPush { get; set; } = false; + +} diff --git a/Admin.NET/Admin.NET.Core/Entity/SysVolunteerTbSp.cs b/Admin.NET/Admin.NET.Core/Entity/SysVolunteerTbSp.cs new file mode 100644 index 0000000..b09d190 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysVolunteerTbSp.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core; + + +/// +/// 我的志愿表 +/// +[SugarTable(null, "我的志愿表_专家复制")] +[SysTable] +public class SysVolunteerTbSp : EntityBase +{ + + /// + /// 政策规则 + /// + public int Sp { get; set;} + + /// + /// + /// + [SugarColumn(ColumnDescription = "志愿表所在省份", IsNullable = true)] + public string LocationCode { get; set; } + + /// + /// 用户ID + /// + [SugarColumn(ColumnDescription = "用户Id")] + public long CId { get; set; } + + /// + /// 专家Id + /// + [SugarColumn(ColumnDescription = "专家Id")] + public long SCId { get; set; } + + /// + /// 志愿表名称 + /// + [SugarColumn(ColumnDescription = "志愿表名称", IsNullable = true)] + public string TableName { get; set; } + + + /// + ///批次名称 + /// + [SugarColumn(ColumnDescription = "批次名称", IsNullable = true)] + public string BatchName { get; set; } + + /// + /// 志愿填报类型(智能填报|一键填报) + /// + [SugarColumn(ColumnDescription = "志愿填报类型", IsNullable = true)] + public string Type { get; set; } + + /// + /// 选科科目 + /// + [SugarColumn(ColumnDescription = "选科科目", IsNullable = true)] + public string SubjectClaim { get; set; } + + /// + ///填报志愿选择成绩 + /// + [SugarColumn(ColumnDescription = "成绩")] + public float Score { get; set; } + + + /// + /// 志愿表详情 + /// + [SugarColumn(ColumnDescription = "志愿表详情", Length = int.MaxValue)] + public string Detail { get; set; } + + /// + /// 排序 + /// + public int OrderSort { get; set; } = 0; + +} diff --git a/Admin.NET/Admin.NET.Core/Entity/SysWeChatUserBase.cs b/Admin.NET/Admin.NET.Core/Entity/SysWeChatUserBase.cs new file mode 100644 index 0000000..9232146 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysWeChatUserBase.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core; + +/// +/// 用户拓展字段表 +/// +[SugarTable(null, "用户拓展字段表")] +[SysTable] +public class SysWeChatUserExtend : EntityBase +{ + /// + /// Wx用户Id + /// + [SugarColumn(ColumnDescription = "Wx用户Id")] + public long WxId { get; set; } + + + /// + ///学生所在学校 + /// + [SugarColumn(IsNullable = true)] + public string SchoolName { get; set; } + + /// + /// 学生所在班级 + /// + [SugarColumn(IsNullable = true)] + public string ClassName { get; set; } + + /// + ///学生数据是否初始化(省份,选科等) + /// + public bool? Init { get; set; } = false; + + /// + /// 0(文科,理科)|1(3+3)|2 (3+1+2) + /// + public int? sp { get; set; } = 1; + + /// + /// 选科文字展示 + /// + [SugarColumn(IsNullable = true)] + public string subjectGroup { get; set; } + + /// + ///分数 + /// + public double? expectedScore { get; set; } = 0; + + /// + /// 分数位次 + /// + [SugarColumn(IsNullable = true)] + public double? Rank { get; set; } + + /// + /// 是否为VIP + /// + public bool IsVIP { get; set; } = false; + + + [SugarColumn(IsNullable = true)] + public string VipCode { get; set; } + + /// + /// 是否更新分数 + /// + [SugarColumn(IsNullable = true)] + public int IsUpdateScore { get; set; } = 0; + + /// + /// 高考年份 + /// + [SugarColumn(IsNullable = true)] + public int Year { get; set; } + + + /// + /// 省份 + /// + [SugarColumn(IsNullable = true)] + public string ProvinceName { get; set; } + /// + /// 省份Code + /// + [SugarColumn(IsNullable = true)] + public string ProvinceCode { get; set; } + /// + /// CasdoorId + /// + [SugarColumn(IsNullable = true)] + public string UUID { get; set; } + +} diff --git a/Admin.NET/Admin.NET.Core/Entity/SysWechatPay.cs b/Admin.NET/Admin.NET.Core/Entity/SysWechatPay.cs new file mode 100644 index 0000000..5fc893f --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysWechatPay.cs @@ -0,0 +1,172 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统微信支付表 +/// +[SugarTable(null, "系统微信支付表")] +[SysTable] +public partial class SysWechatPay : EntityBase +{ + /// + /// 微信商户号 + /// + [SugarColumn(ColumnDescription = "微信商户号")] + [Required] + public virtual string MerchantId { get; set; } + + /// + /// 服务商AppId + /// + [SugarColumn(ColumnDescription = "服务商AppId")] + [Required] + public virtual string AppId { get; set; } + + /// + /// 商户订单号 + /// + [SugarColumn(ColumnDescription = "商户订单号")] + [Required] + public virtual string OutTradeNumber { get; set; } + + /// + /// 支付订单号 + /// + [SugarColumn(ColumnDescription = "支付订单号")] + [Required] + public virtual string TransactionId { get; set; } + + /// + /// 交易类型 + /// + [SugarColumn(ColumnDescription = "交易类型")] + public string? TradeType { get; set; } + + /// + /// 交易状态 + /// + [SugarColumn(ColumnDescription = "交易状态")] + public string? TradeState { get; set; } + + /// + /// 交易状态描述 + /// + [SugarColumn(ColumnDescription = "交易状态描述")] + public string? TradeStateDescription { get; set; } + + /// + /// 付款银行类型 + /// + [SugarColumn(ColumnDescription = "付款银行类型")] + public string? BankType { get; set; } + + /// + /// 订单总金额 + /// + [SugarColumn(ColumnDescription = "订单总金额")] + public int Total { get; set; } + + /// + /// 用户支付金额 + /// + [SugarColumn(ColumnDescription = "用户支付金额")] + public int? PayerTotal { get; set; } + + /// + /// 支付完成时间 + /// + [SugarColumn(ColumnDescription = "支付完成时间")] + public DateTimeOffset? SuccessTime { get; set; } + + /// + /// 交易结束时间 + /// + [SugarColumn(ColumnDescription = "交易结束时间")] + public DateTimeOffset? ExpireTime { get; set; } + + /// + /// 商品描述 + /// + [SugarColumn(ColumnDescription = "商品描述")] + public string? Description { get; set; } + + /// + /// 场景信息 + /// + [SugarColumn(ColumnDescription = "场景信息")] + public string? Scene { get; set; } + + /// + /// 附加数据 + /// + [SugarColumn(ColumnDescription = "附加数据")] + public string? Attachment { get; set; } + + /// + /// 优惠标记 + /// + [SugarColumn(ColumnDescription = "优惠标记")] + public string? GoodsTag { get; set; } + + /// + /// 结算信息 + /// + [SugarColumn(ColumnDescription = "结算信息")] + public string? Settlement { get; set; } + + /// + /// 回调通知地址 + /// + [SugarColumn(ColumnDescription = "回调通知地址")] + public string? NotifyUrl { get; set; } + + /// + /// 备注 + /// + [SugarColumn(ColumnDescription = "备注")] + public string? Remark { get; set; } + + /// + /// 微信OpenId标识 + /// + [SugarColumn(ColumnDescription = "微信OpenId标识")] + public string? OpenId { get; set; } + + /// + /// 关联微信用户 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + [Navigate(NavigateType.OneToOne, nameof(OpenId))] + public SysWechatUser SysWechatUser { get; set; } + + + /// + /// 订单状态 + /// + [SugarColumn(ColumnDescription = "订单状态")] + public EnumOrderType? OrderType { get; set; } + + /// + /// 子商户号 + /// + [SugarColumn(ColumnDescription = "子商户号")] + public string? SubMerchantId { get; set; } + + /// + /// 子商户AppId + /// + [SugarColumn(ColumnDescription = "回调通知地址")] + public string? SubAppId { get; set; } + + /// + /// 子商户唯一标识 + /// + [SugarColumn(ColumnDescription = "子商户唯一标识")] + public string? SubOpenId { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysWechatUser.cs b/Admin.NET/Admin.NET.Core/Entity/SysWechatUser.cs new file mode 100644 index 0000000..3c0bbcc --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysWechatUser.cs @@ -0,0 +1,176 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统微信用户表 +/// +[SugarTable(null, "系统微信用户表")] +[SysTable] +[SugarIndex("index_{table}_N", nameof(NickName), OrderByType.Asc)] +[SugarIndex("index_{table}_M", nameof(Mobile), OrderByType.Asc)] +public partial class SysWechatUser : EntityBase +{ + /// + /// 系统用户Id + /// + [SugarColumn(ColumnDescription = "系统用户Id")] + public long UserId { get; set; } + + /// + /// 系统用户 + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + [Navigate(NavigateType.OneToOne, nameof(UserId))] + public SysUser SysUser { get; set; } + + /// + /// 平台类型 + /// + [SugarColumn(ColumnDescription = "平台类型")] + public PlatformTypeEnum PlatformType { get; set; } = PlatformTypeEnum.微信公众号; + + /// + /// OpenId + /// + [SugarColumn(ColumnDescription = "OpenId", Length = 64)] + [Required, MaxLength(64)] + public virtual string OpenId { get; set; } + + /// + /// 会话密钥 + /// + [SugarColumn(ColumnDescription = "会话密钥", Length = 256)] + [MaxLength(256)] + public string SessionKey { get; set; } + + /// + /// UnionId + /// + [SugarColumn(ColumnDescription = "UnionId", Length = 64)] + [MaxLength(64)] + public string UnionId { get; set; } + + /// + /// 昵称 + /// + [SugarColumn(ColumnDescription = "昵称", Length = 64)] + [MaxLength(64)] + public string NickName { get; set; } + + /// + /// 头像 + /// + [SugarColumn(ColumnDescription = "头像", Length = 256, IsNullable = true)] + [MaxLength(256)] + public string Avatar { get; set; } + + /// + /// 手机号码 + /// + [SugarColumn(ColumnDescription = "手机号码", Length = 16, IsNullable = true)] + [MaxLength(16)] + public string Mobile { get; set; } + + /// + /// 性别 + /// + [SugarColumn(ColumnDescription = "性别")] + public int? Sex { get; set; } + + /// + /// 语言 + /// + [SugarColumn(ColumnDescription = "语言", Length = 64, IsNullable = true)] + [MaxLength(64)] + public string Language { get; set; } + + /// + /// 城市 + /// + [SugarColumn(ColumnDescription = "城市", Length = 64, IsNullable = true)] + [MaxLength(64)] + public string City { get; set; } + + /// + /// 省 + /// + [SugarColumn(ColumnDescription = "省", Length = 64, IsNullable = true)] + [MaxLength(64)] + public string Province { get; set; } + + /// + /// 国家 + /// + [SugarColumn(ColumnDescription = "国家", Length = 64, IsNullable = true)] + [MaxLength(64)] + public string Country { get; set; } + + /// + /// AccessToken + /// + [SugarColumn(ColumnDescription = "AccessToken", ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)] + public string AccessToken { get; set; } + + /// + /// RefreshToken + /// + [SugarColumn(ColumnDescription = "RefreshToken", ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)] + public string RefreshToken { get; set; } + + /// + /// 过期时间 + /// + [SugarColumn(ColumnDescription = "ExpiresIn")] + public int? ExpiresIn { get; set; } + + /// + /// 用户授权的作用域,使用逗号分隔 + /// + [SugarColumn(ColumnDescription = "授权作用域", Length = 64, IsNullable = true)] + [MaxLength(64)] + public string Scope { get; set; } + + + /// + /// 用户备注(各平台中的用户个人介绍) + /// + [SugarColumn(ColumnDescription = "备注", IsNullable = true)] + [MaxLength(200)] + public string Remark { get; set; } + + /// + /// 所在年级 + /// + [SugarColumn(ColumnDescription = "所在年级", IsNullable = true)] + public long GradeId { get; set; } + + /// + /// 所在学年Id + /// + [SugarColumn(ColumnDescription = "所在学年Id", IsNullable = true)] + public long StudyYearsId { get; set; } + + /// + /// 所在班级 + /// + [SugarColumn(ColumnDescription = "所在班级", IsNullable = true)] + public long ClassId { get; set; } + /// + /// 默认未毕业 + /// + [SugarColumn(ColumnDescription = "是否毕业", IsNullable = true)] + public bool IsGraduation { get; set; } = false; + + /// + /// 用户类型 + /// + [SugarColumn(ColumnDescription = "用户类型", IsNullable = true)] + public CustomerTypeEnum CustomerType { get; set; } = CustomerTypeEnum.Person; + +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Entity/SysWechatUserMapCarts.cs b/Admin.NET/Admin.NET.Core/Entity/SysWechatUserMapCarts.cs new file mode 100644 index 0000000..517dc65 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Entity/SysWechatUserMapCarts.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core; + + +[SugarTable(null, "用户订单关联表")] +[SysTable] +public class SysWechatUserMapCarts : EntityBase +{ + /// + ///付款用户的小程序OpenId(根据用户绑定小程序获取) + /// + [SugarColumn(ColumnDescription = "OpenId", IsNullable = true)] + public string OpenId { get; set; } + + /// + /// 微信平台Id + /// + [SugarColumn(ColumnDescription = "Unionid", IsNullable = true)] + public string Unionid { get; set; } + /// + /// 用户手机号 + /// + [SugarColumn(ColumnDescription = "用户手机号")] + public string Phone { get; set; } + + /// + /// + /// + [SugarColumn(ColumnDescription = "用户订单")] + public string OrderId { get; set; } + + /// + /// 关联专家介绍页面唯一Id + /// + [SugarColumn(ColumnDescription = "关联专家介绍页面唯一Id")] + public string cartId { get; set; }//关联专家介绍id + + /// + /// 项目名称 + /// + [SugarColumn(ColumnDescription = "cartName", IsNullable = true)] + public string cartName { get; set; } + /// + /// 专家用户的Openid + /// + [SugarColumn(ColumnDescription = "ZjOpenId", IsNullable = true)] + public string ZjOpenId { get; set; } + + /// + /// 支付金额 + /// + [SugarColumn(ColumnDescription = "支付金额")] + public string Amount { get; set; } + + + + + +} diff --git a/Admin.NET/Admin.NET.Core/Enum/AccountTypeEnum.cs b/Admin.NET/Admin.NET.Core/Enum/AccountTypeEnum.cs new file mode 100644 index 0000000..bedbec6 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/AccountTypeEnum.cs @@ -0,0 +1,38 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 账号类型枚举 +/// +[Description("账号类型枚举")] +public enum AccountTypeEnum +{ + /// + /// 超级管理员 + /// + [Description("超级管理员")] + SuperAdmin = 999, + + /// + /// 系统管理员 + /// + [Description("系统管理员")] + SysAdmin = 888, + + /// + /// 普通账号 + /// + [Description("普通账号")] + NormalUser = 777, + + /// + /// 会员 + /// + [Description("会员")] + Member = 666, +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Enum/CacheTypeEnum.cs b/Admin.NET/Admin.NET.Core/Enum/CacheTypeEnum.cs new file mode 100644 index 0000000..e6832ed --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/CacheTypeEnum.cs @@ -0,0 +1,26 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 缓存类型枚举 +/// +[Description("缓存类型枚举")] +public enum CacheTypeEnum +{ + /// + /// 内存缓存 + /// + [Description("内存缓存")] + Memory, + + /// + /// Redis缓存 + /// + [Description("Redis缓存")] + Redis +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Enum/CardTypeEnum.cs b/Admin.NET/Admin.NET.Core/Enum/CardTypeEnum.cs new file mode 100644 index 0000000..cf2e863 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/CardTypeEnum.cs @@ -0,0 +1,83 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 证件类型枚举 +/// +[Description("证件类型枚举")] +public enum CardTypeEnum +{ + /// + /// 身份证 + /// + [Description("身份证")] + IdCard = 0, + + /// + /// 护照 + /// + [Description("护照")] + PassportCard = 1, + + /// + /// 出生证 + /// + [Description("出生证")] + BirthCard = 2, + + /// + /// 港澳台通行证 + /// + [Description("港澳台通行证")] + GatCard = 3, + + /// + /// 外国人居留证 + /// + [Description("外国人居留证")] + ForeignCard = 4, + + /// + /// 营业执照 + /// + [Description("营业执照")] + License = 5, +} + + +/// +/// 订单类型 +/// +public enum EnumOrderType +{ + /// + ///取消订单 + /// + [Description("取消")] + Cancel = -1, + /// + /// 待支付 + /// + [Description("待支付")] + payment = 0, + /// + /// 支付完成 + /// + [Description("支付完成")] + payoff = 1, + /// + /// 已发货 + /// + [Description("已发货")] + Delivered = 2, + /// + /// 已收货 + /// + [Description("已收货")] + Received = 3 +} diff --git a/Admin.NET/Admin.NET.Core/Enum/CryptogramEnum.cs b/Admin.NET/Admin.NET.Core/Enum/CryptogramEnum.cs new file mode 100644 index 0000000..e259bea --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/CryptogramEnum.cs @@ -0,0 +1,32 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 密码加密枚举 +/// +[Description("密码加密枚举")] +public enum CryptogramEnum +{ + /// + /// MD5 + /// + [Description("MD5")] + MD5 = 0, + + /// + /// SM2(国密) + /// + [Description("SM2")] + SM2 = 1, + + /// + /// SM4(国密) + /// + [Description("SM4")] + SM4 = 2 +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Enum/CultureLevelEnum.cs b/Admin.NET/Admin.NET.Core/Enum/CultureLevelEnum.cs new file mode 100644 index 0000000..56b325e --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/CultureLevelEnum.cs @@ -0,0 +1,92 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 文化程度枚举 +/// +[Description("文化程度枚举")] +public enum CultureLevelEnum +{ + /// + /// 其他 + /// + [Description("其他")] + Level0 = 0, + + /// + /// 文盲 + /// + [Description("文盲")] + Level1 = 1, + + /// + /// 小学 + /// + [Description("小学")] + Level2 = 2, + + /// + /// 初中 + /// + [Description("初中")] + Level3 = 3, + + /// + /// 普通高中 + /// + [Description("普通高中")] + Level4 = 4, + + /// + /// 技工学校 + /// + [Description("技工学校")] + Level5 = 5, + + /// + /// 职业教育 + /// + [Description("职业教育")] + Level6 = 6, + + /// + /// 职业高中 + /// + [Description("职业高中")] + Level7 = 7, + + /// + /// 中等专科 + /// + [Description("中等专科")] + Level8 = 8, + + /// + /// 大学专科 + /// + [Description("大学专科")] + Level9 = 9, + + /// + /// 大学本科 + /// + [Description("大学本科")] + Level10 = 10, + + /// + /// 硕士研究生 + /// + [Description("硕士研究生")] + Level11 = 11, + + /// + /// 博士研究生 + /// + [Description("博士研究生")] + Level12 = 12, +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Enum/DataOpTypeEnum.cs b/Admin.NET/Admin.NET.Core/Enum/DataOpTypeEnum.cs new file mode 100644 index 0000000..f4c04ea --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/DataOpTypeEnum.cs @@ -0,0 +1,92 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 数据操作类型枚举 +/// +[Description("数据操作类型枚举")] +public enum DataOpTypeEnum +{ + /// + /// 其它 + /// + [Description("其它")] + Other, + + /// + /// 增加 + /// + [Description("增加")] + Add, + + /// + /// 删除 + /// + [Description("删除")] + Delete, + + /// + /// 编辑 + /// + [Description("编辑")] + Edit, + + /// + /// 更新 + /// + [Description("更新")] + Update, + + /// + /// 查询 + /// + [Description("查询")] + Query, + + /// + /// 详情 + /// + [Description("详情")] + Detail, + + /// + /// 树 + /// + [Description("树")] + Tree, + + /// + /// 导入 + /// + [Description("导入")] + Import, + + /// + /// 导出 + /// + [Description("导出")] + Export, + + /// + /// 授权 + /// + [Description("授权")] + Grant, + + /// + /// 强退 + /// + [Description("强退")] + Force, + + /// + /// 清空 + /// + [Description("清空")] + Clean +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Enum/DataScopeEnum.cs b/Admin.NET/Admin.NET.Core/Enum/DataScopeEnum.cs new file mode 100644 index 0000000..d6fc8bd --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/DataScopeEnum.cs @@ -0,0 +1,44 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 角色数据范围枚举 +/// +[Description("角色数据范围枚举")] +public enum DataScopeEnum +{ + /// + /// 全部数据 + /// + [Description("全部数据")] + All = 1, + + /// + /// 本部门及以下数据 + /// + [Description("本部门及以下数据")] + DeptChild = 2, + + /// + /// 本部门数据 + /// + [Description("本部门数据")] + Dept = 3, + + /// + /// 仅本人数据 + /// + [Description("仅本人数据")] + Self = 4, + + /// + /// 自定义数据 + /// + [Description("自定义数据")] + Define = 5 +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Enum/ElasticSearchAuthTypeEnum.cs b/Admin.NET/Admin.NET.Core/Enum/ElasticSearchAuthTypeEnum.cs new file mode 100644 index 0000000..60f290f --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/ElasticSearchAuthTypeEnum.cs @@ -0,0 +1,33 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// ES认证类型枚举 +/// https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/_options_on_elasticsearchclientsettings.html +/// +[Description("ES认证类型枚举")] +public enum ElasticSearchAuthTypeEnum +{ + /// + /// BasicAuthentication + /// + [Description("BasicAuthentication")] + Basic = 1, + + /// + /// ApiKey + /// + [Description("ApiKey")] + ApiKey = 2, + + /// + /// Base64ApiKey + /// + [Description("Base64ApiKey")] + Base64ApiKey = 3 +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Enum/ErrorCodeEnum.cs b/Admin.NET/Admin.NET.Core/Enum/ErrorCodeEnum.cs new file mode 100644 index 0000000..86ae8b9 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/ErrorCodeEnum.cs @@ -0,0 +1,693 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统错误码 +/// +[ErrorCodeType] +[Description("系统错误码")] +public enum ErrorCodeEnum +{ + /// + /// 验证码错误 + /// + [ErrorCodeItemMetadata("验证码错误")] + D0008, + + /// + /// 账号不存在 + /// + [ErrorCodeItemMetadata("账号不存在")] + D0009, + + /// + /// 密码不正确 + /// + [ErrorCodeItemMetadata("密码不正确")] + D1000, + + /// + /// 非法操作!禁止删除自己 + /// + [ErrorCodeItemMetadata("非法操作,禁止删除自己")] + D1001, + + /// + /// 记录不存在 + /// + [ErrorCodeItemMetadata("记录不存在")] + D1002, + + /// + /// 账号已存在 + /// + [ErrorCodeItemMetadata("账号已存在")] + D1003, + + /// + /// 旧密码不匹配 + /// + [ErrorCodeItemMetadata("旧密码输入错误")] + D1004, + + /// + /// 测试数据禁止更改admin密码 + /// + [ErrorCodeItemMetadata("测试数据禁止更改用户【admin】密码")] + D1005, + + /// + /// 数据已存在 + /// + [ErrorCodeItemMetadata("数据已存在")] + D1006, + + /// + /// 数据不存在或含有关联引用,禁止删除 + /// + [ErrorCodeItemMetadata("数据不存在或含有关联引用,禁止删除")] + D1007, + + /// + /// 禁止为管理员分配角色 + /// + [ErrorCodeItemMetadata("禁止为管理员分配角色")] + D1008, + + /// + /// 重复数据或记录含有不存在数据 + /// + [ErrorCodeItemMetadata("重复数据或记录含有不存在数据")] + D1009, + + /// + /// 禁止为超级管理员角色分配权限 + /// + [ErrorCodeItemMetadata("禁止为超级管理员角色分配权限")] + D1010, + + /// + /// 非法操作,未登录 + /// + [ErrorCodeItemMetadata("非法操作,未登录")] + D1011, + + /// + /// Id不能为空 + /// + [ErrorCodeItemMetadata("Id不能为空")] + D1012, + + /// + /// 所属机构不在自己的数据范围内 + /// + [ErrorCodeItemMetadata("没有权限操作该数据")] + D1013, + + /// + /// 禁止删除超级管理员 + /// + [ErrorCodeItemMetadata("禁止删除超级管理员")] + D1014, + + /// + /// 禁止修改超级管理员状态 + /// + [ErrorCodeItemMetadata("禁止修改超级管理员状态")] + D1015, + + /// + /// 没有权限 + /// + [ErrorCodeItemMetadata("没有权限")] + D1016, + + /// + /// 账号已冻结 + /// + [ErrorCodeItemMetadata("账号已冻结")] + D1017, + + /// + /// 禁止删除管理员 + /// + [ErrorCodeItemMetadata("禁止删除管理员")] + D1018, + + /// + /// 禁止删除系统管理员角色 + /// + [ErrorCodeItemMetadata("禁止删除系统管理员角色")] + D1019, + + /// + /// 禁止修改系统管理员角色 + /// + [ErrorCodeItemMetadata("禁止修改系统管理员角色")] + D1020, + + /// + /// 禁止为系统管理员角色分配权限 + /// + [ErrorCodeItemMetadata("禁止为系统管理员角色分配权限")] + D1021, + + /// + /// 禁止为超级管理员分配角色 + /// + [ErrorCodeItemMetadata("禁止为超级管理员分配角色")] + D1022, + + /// + /// 禁止删除默认租户 + /// + [ErrorCodeItemMetadata("禁止删除默认租户")] + D1023, + + /// + /// 已将其他地方登录账号下线 + /// + [ErrorCodeItemMetadata("已将其他地方登录账号下线")] + D1024, + + /// + /// 此角色下面存在账号禁止删除 + /// + [ErrorCodeItemMetadata("此角色下面存在账号禁止删除")] + D1025, + + /// + /// 禁止修改本人账号状态 + /// + [ErrorCodeItemMetadata("禁止修改本人账号状态")] + D1026, + + /// + /// 密码错误次数过多,账号已锁定,请半小时后重试! + /// + [ErrorCodeItemMetadata("密码错误次数过多,账号已锁定,请半小时后重试!")] + D1027, + + /// + /// 新密码不能与旧密码相同 + /// + [ErrorCodeItemMetadata("新密码不能与旧密码相同")] + D1028, + + /// + /// 父机构不存在 + /// + [ErrorCodeItemMetadata("父机构不存在")] + D2000, + + /// + /// 当前机构Id不能与父机构Id相同 + /// + [ErrorCodeItemMetadata("当前机构Id不能与父机构Id相同")] + D2001, + + /// + /// 已有相同组织机构,编码或名称相同 + /// + [ErrorCodeItemMetadata("已有相同组织机构,编码或名称相同")] + D2002, + + /// + /// 没有权限操作机构 + /// + [ErrorCodeItemMetadata("没有权限操作机构")] + D2003, + + /// + /// 该机构下有用户禁止删除 + /// + [ErrorCodeItemMetadata("该机构下有用户禁止删除")] + D2004, + + /// + /// 附属机构下有用户禁止删除 + /// + [ErrorCodeItemMetadata("附属机构下有用户禁止删除")] + D2005, + + /// + /// 只能增加下级机构 + /// + [ErrorCodeItemMetadata("只能增加下级机构")] + D2006, + + /// + /// 下级机构下有用户禁止删除 + /// + [ErrorCodeItemMetadata("下级机构下有用户禁止删除")] + D2007, + + /// + /// 租户默认机构禁止删除 + /// + [ErrorCodeItemMetadata("租户默认机构禁止删除")] + D2008, + + /// + /// 禁止增加根节点机构 + /// + [ErrorCodeItemMetadata("禁止增加根节点机构")] + D2009, + + /// + /// 字典类型不存在 + /// + [ErrorCodeItemMetadata("字典类型不存在")] + D3000, + + /// + /// 字典类型已存在 + /// + [ErrorCodeItemMetadata("字典类型已存在,名称或编码重复")] + D3001, + + /// + /// 字典类型下面有字典值禁止删除 + /// + [ErrorCodeItemMetadata("字典类型下面有字典值禁止删除")] + D3002, + + /// + /// 字典值已存在 + /// + [ErrorCodeItemMetadata("字典值已存在,名称或编码重复")] + D3003, + + /// + /// 字典值不存在 + /// + [ErrorCodeItemMetadata("字典值不存在")] + D3004, + + /// + /// 字典状态错误 + /// + [ErrorCodeItemMetadata("字典状态错误")] + D3005, + + /// + /// 菜单已存在 + /// + [ErrorCodeItemMetadata("菜单已存在")] + D4000, + + /// + /// 路由地址为空 + /// + [ErrorCodeItemMetadata("路由地址为空")] + D4001, + + /// + /// 打开方式为空 + /// + [ErrorCodeItemMetadata("打开方式为空")] + D4002, + + /// + /// 权限标识格式为空 + /// + [ErrorCodeItemMetadata("权限标识格式为空")] + D4003, + + /// + /// 权限标识格式错误 + /// + [ErrorCodeItemMetadata("权限标识格式错误 如xxx:xxx")] + D4004, + + /// + /// 权限不存在 + /// + [ErrorCodeItemMetadata("权限不存在")] + D4005, + + /// + /// 父级菜单不能为当前节点,请重新选择父级菜单 + /// + [ErrorCodeItemMetadata("父级菜单不能为当前节点,请重新选择父级菜单")] + D4006, + + /// + /// 不能移动根节点 + /// + [ErrorCodeItemMetadata("不能移动根节点")] + D4007, + + /// + /// 禁止本节点与父节点相同 + /// + [ErrorCodeItemMetadata("禁止本节点与父节点相同")] + D4008, + + /// + /// 路由名称重复 + /// + [ErrorCodeItemMetadata("路由名称重复")] + D4009, + + /// + /// 父节点不能为按钮类型 + /// + [ErrorCodeItemMetadata("父节点不能为按钮类型")] + D4010, + + /// + /// 已存在同名或同编码应用 + /// + [ErrorCodeItemMetadata("已存在同名或同编码应用")] + D5000, + + /// + /// 默认激活系统只能有一个 + /// + [ErrorCodeItemMetadata("默认激活系统只能有一个")] + D5001, + + /// + /// 该应用下有菜单禁止删除 + /// + [ErrorCodeItemMetadata("该应用下有菜单禁止删除")] + D5002, + + /// + /// 已存在同名或同编码应用 + /// + [ErrorCodeItemMetadata("已存在同名或同编码应用")] + D5003, + + /// + /// 已存在同名或同编码职位 + /// + [ErrorCodeItemMetadata("已存在同名或同编码职位")] + D6000, + + /// + /// 该职位下有用户禁止删除 + /// + [ErrorCodeItemMetadata("该职位下有用户禁止删除")] + D6001, + + /// + /// 无权修改本职位 + /// + [ErrorCodeItemMetadata("无权修改本职位")] + D6002, + + /// + /// 职位不存在 + /// + [ErrorCodeItemMetadata("职位不存在")] + D6003, + + /// + /// 通知公告状态错误 + /// + [ErrorCodeItemMetadata("通知公告状态错误")] + D7000, + + /// + /// 通知公告删除失败 + /// + [ErrorCodeItemMetadata("通知公告删除失败")] + D7001, + + /// + /// 通知公告编辑失败 + /// + [ErrorCodeItemMetadata("通知公告编辑失败,类型必须为草稿")] + D7002, + + /// + /// 通知公告操作失败,非发布者不能进行操作 + /// + [ErrorCodeItemMetadata("通知公告操作失败,非发布者不能进行操作")] + D7003, + + /// + /// 文件不存在 + /// + [ErrorCodeItemMetadata("文件不存在")] + D8000, + + /// + /// 不允许的文件类型 + /// + [ErrorCodeItemMetadata("不允许的文件类型")] + D8001, + + /// + /// 文件超过允许大小 + /// + [ErrorCodeItemMetadata("文件超过允许大小")] + D8002, + + /// + /// 文件后缀错误 + /// + [ErrorCodeItemMetadata("文件后缀错误")] + D8003, + + /// + /// 文件已存在 + /// + [ErrorCodeItemMetadata("文件已存在")] + D8004, + + /// + /// 已存在同名或同编码参数配置 + /// + [ErrorCodeItemMetadata("已存在同名或同编码参数配置")] + D9000, + + /// + /// 禁止删除系统参数 + /// + [ErrorCodeItemMetadata("禁止删除系统参数")] + D9001, + + /// + /// 已存在同名任务调度 + /// + [ErrorCodeItemMetadata("已存在同名任务调度")] + D1100, + + /// + /// 任务调度不存在 + /// + [ErrorCodeItemMetadata("任务调度不存在")] + D1101, + + /// + /// 演示环境禁止修改数据 + /// + [ErrorCodeItemMetadata("演示环境禁止修改数据")] + D1200, + + /// + /// 已存在同名的租户 + /// + [ErrorCodeItemMetadata("已存在同名的租户")] + D1300, + + /// + /// 已存在同名的租户管理员 + /// + [ErrorCodeItemMetadata("已存在同名的租户管理员")] + D1301, + + /// + /// 租户从库配置错误 + /// + [ErrorCodeItemMetadata("租户从库配置错误")] + D1302, + + /// + /// 该表代码模板已经生成过 + /// + [ErrorCodeItemMetadata("该表代码模板已经生成过")] + D1400, + + /// + /// 该类型不存在 + /// + [ErrorCodeItemMetadata("该类型不存在")] + D1501, + + /// + /// 该字段不存在 + /// + [ErrorCodeItemMetadata("该字段不存在")] + D1502, + + /// + /// 该类型不是枚举类型 + /// + [ErrorCodeItemMetadata("该类型不是枚举类型")] + D1503, + + /// + /// 该实体不存在 + /// + [ErrorCodeItemMetadata("该实体不存在")] + D1504, + + /// + /// 父菜单不存在 + /// + [ErrorCodeItemMetadata("父菜单不存在")] + D1505, + + /// + /// 父资源不存在 + /// + [ErrorCodeItemMetadata("父资源不存在")] + D1600, + + /// + /// 当前资源Id不能与父资源Id相同 + /// + [ErrorCodeItemMetadata("当前资源Id不能与父资源Id相同")] + D1601, + + /// + /// 已有相同编码或名称 + /// + [ErrorCodeItemMetadata("已有相同编码或名称")] + D1602, + + /// + /// 脚本代码不能为空 + /// + [ErrorCodeItemMetadata("脚本代码不能为空")] + D1701, + + /// + /// 脚本代码中的作业类,需要定义 [JobDetail] 特性 + /// + [ErrorCodeItemMetadata("脚本代码中的作业类,需要定义 [JobDetail] 特性")] + D1702, + + /// + /// 作业编号需要与脚本代码中的作业类 [JobDetail('jobId')] 一致 + /// + [ErrorCodeItemMetadata("作业编号需要与脚本代码中的作业类 [JobDetail('jobId')] 一致")] + D1703, + + /// + /// 禁止修改作业编号 + /// + [ErrorCodeItemMetadata("禁止修改作业编号")] + D1704, + + /// + /// 执行作业失败 + /// + [ErrorCodeItemMetadata("执行作业失败")] + D1705, + + /// + /// 已存在同名打印模板 + /// + [ErrorCodeItemMetadata("已存在同名打印模板")] + D1800, + + /// + /// 已存在同名功能或同名程序及插件 + /// + [ErrorCodeItemMetadata("已存在同名功能或同名程序及插件")] + D1900, + + /// + /// 已存在同名或同编码项目 + /// + [ErrorCodeItemMetadata("已存在同名或同编码项目")] + xg1000, + + /// + /// 已存在相同证件号码人员 + /// + [ErrorCodeItemMetadata("已存在相同证件号码人员")] + xg1001, + + /// + /// 检测数据不存在 + /// + [ErrorCodeItemMetadata("检测数据不存在")] + xg1002, + + /// + /// 请添加数据列 + /// + [ErrorCodeItemMetadata("请添加数据列")] + db1000, + + /// + /// 数据表不存在 + /// + [ErrorCodeItemMetadata("数据表不存在")] + db1001, + + /// + /// 数据表不存在 + /// + [ErrorCodeItemMetadata("不允许添加相同字段名")] + db1002, + + /// + /// 父节点不存在 + /// + [ErrorCodeItemMetadata("父节点不存在")] + R2000, + + /// + /// 当前节点Id不能与父节点Id相同 + /// + [ErrorCodeItemMetadata("当前节点Id不能与父节点Id相同")] + R2001, + + /// + /// 已有相同编码或名称 + /// + [ErrorCodeItemMetadata("已有相同编码或名称")] + R2002, + + /// + /// 默认租户状态禁止修改 + /// + [ErrorCodeItemMetadata("默认租户状态禁止修改")] + Z1001, + + /// + /// 禁止创建此类型的数据库 + /// + [ErrorCodeItemMetadata("禁止创建此类型的数据库")] + Z1002, + + /// + /// 租户已禁用 + /// + [ErrorCodeItemMetadata("租户已禁用")] + Z1003, + + /// + /// 租户库连接不能为空 + /// + [ErrorCodeItemMetadata("租户库连接不能为空")] + Z1004, + + /// + /// 身份标识已存在 + /// + [ErrorCodeItemMetadata("身份标识已存在")] + O1000, +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Enum/FramilyRoleEnum.cs b/Admin.NET/Admin.NET.Core/Enum/FramilyRoleEnum.cs new file mode 100644 index 0000000..f5c0f70 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/FramilyRoleEnum.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core; + +/// +/// 家属类型 +/// +public enum FramilyRoleEnum +{ + /// + /// 爸爸 + /// + [Description("爸爸")] + Father = 0, + /// + /// 妈妈 + /// + [Description("妈妈")] + Mother = 1, + /// + /// 其他亲属 + /// + [Description("其他亲属")] + Other = 2 + +} diff --git a/Admin.NET/Admin.NET.Core/Enum/GenderEnum.cs b/Admin.NET/Admin.NET.Core/Enum/GenderEnum.cs new file mode 100644 index 0000000..3284532 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/GenderEnum.cs @@ -0,0 +1,32 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 性别枚举 +/// +[Description("性别枚举")] +public enum GenderEnum +{ + /// + /// 男 + /// + [Description("男")] + Male = 1, + + /// + /// 女 + /// + [Description("女")] + Female = 2, + + /// + /// 其他 + /// + [Description("其他")] + Other = 3 +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Enum/HttpMethodEnum.cs b/Admin.NET/Admin.NET.Core/Enum/HttpMethodEnum.cs new file mode 100644 index 0000000..f930893 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/HttpMethodEnum.cs @@ -0,0 +1,68 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// HTTP请求方法枚举 +/// +[Description("HTTP请求方法枚举")] +public enum HttpMethodEnum +{ + /// + /// HTTP "GET" method. + /// + [Description("HTTP \"GET\" method.")] + Get, + + /// + /// HTTP "POST" method. + /// + [Description("HTTP \"POST\" method.")] + Post, + + /// + /// HTTP "PUT" method. + /// + [Description(" HTTP \"PUT\" method.")] + Put, + + /// + /// HTTP "DELETE" method. + /// + [Description("HTTP \"DELETE\" method.")] + Delete, + + /// + /// HTTP "PATCH" method. + /// + [Description("HTTP \"PATCH\" method. ")] + Patch, + + /// + /// HTTP "HEAD" method. + /// + [Description("HTTP \"HEAD\" method.")] + Head, + + /// + /// HTTP "OPTIONS" method. + /// + [Description("HTTP \"OPTIONS\" method.")] + Options, + + /// + /// HTTP "TRACE" method. + /// + [Description(" HTTP \"TRACE\" method.")] + Trace, + + /// + /// HTTP "CONNECT" method. + /// + [Description("HTTP \"CONNECT\" method.")] + Connect +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Enum/JobCreateTypeEnum.cs b/Admin.NET/Admin.NET.Core/Enum/JobCreateTypeEnum.cs new file mode 100644 index 0000000..acee68b --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/JobCreateTypeEnum.cs @@ -0,0 +1,32 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 作业创建类型枚举 +/// +[Description("作业创建类型枚举")] +public enum JobCreateTypeEnum +{ + /// + /// 内置 + /// + [Description("内置")] + BuiltIn = 0, + + /// + /// 脚本 + /// + [Description("脚本")] + Script = 1, + + /// + /// HTTP请求 + /// + [Description("HTTP请求")] + Http = 2, +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Enum/JobStatusEnum.cs b/Admin.NET/Admin.NET.Core/Enum/JobStatusEnum.cs new file mode 100644 index 0000000..b06c65c --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/JobStatusEnum.cs @@ -0,0 +1,38 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 岗位状态枚举 +/// +[Description("岗位状态枚举")] +public enum JobStatusEnum +{ + /// + /// 在职 + /// + [Description("在职")] + On = 1, + + /// + /// 离职 + /// + [Description("离职")] + Off = 2, + + /// + /// 请假 + /// + [Description("请假")] + Leave = 3, + + /// + /// 其他 + /// + [Description("其他")] + Other = 4, +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Enum/LoginModeEnum.cs b/Admin.NET/Admin.NET.Core/Enum/LoginModeEnum.cs new file mode 100644 index 0000000..55e8ddb --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/LoginModeEnum.cs @@ -0,0 +1,26 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 登录模式枚举 +/// +[Description("登录模式枚举")] +public enum LoginModeEnum +{ + /// + /// PC模式 + /// + [Description("PC模式")] + PC = 1, + + /// + /// APP + /// + [Description("APP")] + APP = 2 +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Enum/LoginTypeEnum.cs b/Admin.NET/Admin.NET.Core/Enum/LoginTypeEnum.cs new file mode 100644 index 0000000..9fa0950 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/LoginTypeEnum.cs @@ -0,0 +1,32 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 登录类型枚举 +/// +[Description("登录类型枚举")] +public enum LoginTypeEnum +{ + /// + /// PC登录 + /// + [Description("PC登录")] + Login = 1, + + /// + /// PC退出 + /// + [Description("PC退出")] + Logout = 2, + + /// + /// PC注册 + /// + [Description("PC注册")] + Register = 3 +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Enum/MaritalStatusEnum.cs b/Admin.NET/Admin.NET.Core/Enum/MaritalStatusEnum.cs new file mode 100644 index 0000000..b3787b2 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/MaritalStatusEnum.cs @@ -0,0 +1,50 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 婚姻状况枚举 +/// +[Description("婚姻状况枚举")] +public enum MaritalStatusEnum +{ + /// + /// 未婚 + /// + [Description("未婚")] + UnMarried = 1, + + /// + /// 已婚 + /// + [Description("已婚")] + Married = 2, + + /// + /// 离异 + /// + [Description("离异")] + Divorce = 3, + + /// + /// 再婚 + /// + [Description("再婚")] + Remarry = 4, + + /// + /// 丧偶 + /// + [Description("丧偶")] + Widowed = 5, + + /// + /// 未知 + /// + [Description("未知")] + None = 6, +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Enum/MenuTypeEnum.cs b/Admin.NET/Admin.NET.Core/Enum/MenuTypeEnum.cs new file mode 100644 index 0000000..9d32321 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/MenuTypeEnum.cs @@ -0,0 +1,32 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统菜单类型枚举 +/// +[Description("系统菜单类型枚举")] +public enum MenuTypeEnum +{ + /// + /// 目录 + /// + [Description("目录")] + Dir = 1, + + /// + /// 菜单 + /// + [Description("菜单")] + Menu = 2, + + /// + /// 按钮 + /// + [Description("按钮")] + Btn = 3 +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Enum/MessageTypeEnum.cs b/Admin.NET/Admin.NET.Core/Enum/MessageTypeEnum.cs new file mode 100644 index 0000000..cfbe3a3 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/MessageTypeEnum.cs @@ -0,0 +1,38 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 消息类型枚举 +/// +[Description("消息类型枚举")] +public enum MessageTypeEnum +{ + /// + /// 普通信息 + /// + [Description("消息")] + Info = 0, + + /// + /// 成功提示 + /// + [Description("成功")] + Success = 1, + + /// + /// 警告提示 + /// + [Description("警告")] + Warning = 2, + + /// + /// 错误提示 + /// + [Description("错误")] + Error = 3 +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Enum/NoticeStatusEnum.cs b/Admin.NET/Admin.NET.Core/Enum/NoticeStatusEnum.cs new file mode 100644 index 0000000..16b4067 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/NoticeStatusEnum.cs @@ -0,0 +1,38 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 通知公告状态枚举 +/// +[Description("通知公告状态枚举")] +public enum NoticeStatusEnum +{ + /// + /// 草稿 + /// + [Description("草稿")] + DRAFT = 0, + + /// + /// 发布 + /// + [Description("发布")] + PUBLIC = 1, + + /// + /// 撤回 + /// + [Description("撤回")] + CANCEL = 2, + + /// + /// 删除 + /// + [Description("删除")] + DELETED = 3 +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Enum/NoticeTypeEnum.cs b/Admin.NET/Admin.NET.Core/Enum/NoticeTypeEnum.cs new file mode 100644 index 0000000..387bf29 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/NoticeTypeEnum.cs @@ -0,0 +1,26 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 通知公告状类型枚举 +/// +[Description("通知公告状类型枚举")] +public enum NoticeTypeEnum +{ + /// + /// 通知 + /// + [Description("通知")] + NOTICE = 1, + + /// + /// 公告 + /// + [Description("公告")] + ANNOUNCEMENT = 2, +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Enum/NoticeUserStatusEnum.cs b/Admin.NET/Admin.NET.Core/Enum/NoticeUserStatusEnum.cs new file mode 100644 index 0000000..91998b5 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/NoticeUserStatusEnum.cs @@ -0,0 +1,26 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 通知公告用户状态枚举 +/// +[Description("通知公告用户状态枚举")] +public enum NoticeUserStatusEnum +{ + /// + /// 未读 + /// + [Description("未读")] + UNREAD = 0, + + /// + /// 已读 + /// + [Description("已读")] + READ = 1 +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Enum/PlatformTypeEnum.cs b/Admin.NET/Admin.NET.Core/Enum/PlatformTypeEnum.cs new file mode 100644 index 0000000..30d309f --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/PlatformTypeEnum.cs @@ -0,0 +1,62 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 平台类型枚举 +/// +[Description("平台类型枚举")] +public enum PlatformTypeEnum +{ + /// + /// 微信公众号 + /// + [Description("微信公众号")] + 微信公众号 = 1, + + /// + /// 微信小程序 + /// + [Description("微信小程序")] + 微信小程序 = 2, + + /// + /// QQ + /// + [Description("QQ")] + QQ = 3, + + /// + /// 支付宝 + /// + [Description("支付宝")] + Alipay = 4, + + /// + /// Gitee + /// + [Description("Gitee")] + Gitee = 5, +} + + +[Description("用户类型")] +public enum CustomerTypeEnum +{ + /// + /// 个人客户 + /// + [Description("个人客户")] + Person = 0, + /// + /// 企业客户 + /// + [Description("企业客户")] + Enterprise = 1, + [Description("其他客户")] + Other = 2 +} diff --git a/Admin.NET/Admin.NET.Core/Enum/RequestTypeEnum.cs b/Admin.NET/Admin.NET.Core/Enum/RequestTypeEnum.cs new file mode 100644 index 0000000..f1f4aee --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/RequestTypeEnum.cs @@ -0,0 +1,39 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// HTTP请求类型 +/// +[Description("HTTP请求类型")] +public enum RequestTypeEnum +{ + /// + /// 执行内部方法 + /// + Run = 0, + + /// + /// GET + /// + Get = 1, + + /// + /// POST + /// + Post = 2, + + /// + /// PUT + /// + Put = 3, + + /// + /// DELETE + /// + Delete = 4 +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Enum/StatusEnum.cs b/Admin.NET/Admin.NET.Core/Enum/StatusEnum.cs new file mode 100644 index 0000000..c956035 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/StatusEnum.cs @@ -0,0 +1,26 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 通用状态枚举 +/// +[Description("通用状态枚举")] +public enum StatusEnum +{ + /// + /// 启用 + /// + [Description("启用")] + Enable = 1, + + /// + /// 停用 + /// + [Description("停用")] + Disable = 2, +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Enum/TenantTypeEnum.cs b/Admin.NET/Admin.NET.Core/Enum/TenantTypeEnum.cs new file mode 100644 index 0000000..2873d0e --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/TenantTypeEnum.cs @@ -0,0 +1,26 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 租户类型枚举 +/// +[Description("租户类型枚举")] +public enum TenantTypeEnum +{ + /// + /// Id隔离 + /// + [Description("Id隔离")] + Id = 0, + + /// + /// 库隔离 + /// + [Description("库隔离")] + Db = 1, +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Enum/UniversityTypeEnum.cs b/Admin.NET/Admin.NET.Core/Enum/UniversityTypeEnum.cs new file mode 100644 index 0000000..2b004d2 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/UniversityTypeEnum.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core; + +/// +/// 院校类型 +/// +public enum UniversityTypeEnum +{ + /// + /// 综合 + /// + [Description("综合")] + Comprehensive = 0, + /// + /// 理工 + /// + [Description("理工")] + Engineering = 1, + /// + /// 医药 + /// + [Description("医学")] + Medical = 2, + /// + /// 军事 + /// + [Description("军事")] + Military = 3, + /// + /// 语言 + /// + [Description("语言")] + Language = 4, + + /// + /// 师范 + /// + [Description("师范")] + Normal = 5, + /// + /// 财经 + /// + [Description("财经")] + Finance = 6, + /// + /// 政法 + /// + [Description("政法")] + Politics = 7, + /// + /// 民族 + /// + [Description("民族")] + Nation = 8, + /// + /// 农林 + /// + [Description("农林")] + Farming = 9, + /// + /// 艺术 + /// + [Description("艺术")] + Art = 10, + /// + /// 体育 + /// + [Description("体育")] + Sports = 11, + /// + /// 其它 + /// + [Description("其它")] + Other = 12, + +} diff --git a/Admin.NET/Admin.NET.Core/Enum/WechatReturnCodeEnum.cs b/Admin.NET/Admin.NET.Core/Enum/WechatReturnCodeEnum.cs new file mode 100644 index 0000000..ba30a3e --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/WechatReturnCodeEnum.cs @@ -0,0 +1,289 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 微信开发返回码 +/// +[Description("微信开发返回码")] +public enum WechatReturnCodeEnum +{ + SenparcWeixinSDK配置错误 = -99, // 0xFFFFFF9D + 系统繁忙此时请开发者稍候再试 = -1, // 0xFFFFFFFF + 请求成功 = 0, + 工商数据返回_企业已注销 = 101, // 0x00000065 + 工商数据返回_企业不存在或企业信息未更新 = 102, // 0x00000066 + 工商数据返回_企业法定代表人姓名不一致 = 103, // 0x00000067 + 工商数据返回_企业法定代表人身份证号码不一致 = 104, // 0x00000068 + 法定代表人身份证号码_工商数据未更新_请5_15个工作日之后尝试 = 105, // 0x00000069 + 工商数据返回_企业信息或法定代表人信息不一致 = 1000, // 0x000003E8 + 对方不是粉丝 = 10700, // 0x000029CC + 发送消息失败_对方关闭了接收消息 = 10703, // 0x000029CF + 发送消息失败_48小时内用户未互动 = 10706, // 0x000029D2 + POST参数非法 = 20002, // 0x00004E22 + 获取access_token时AppSecret错误或者access_token无效 = 40001, // 0x00009C41 + + /// + /// 公众号:不合法的凭证类型 + /// 小程序:暂无生成权限 + /// + 不合法的凭证类型 = 40002, // 0x00009C42 + + 不合法的OpenID = 40003, // 0x00009C43 + 不合法的媒体文件类型 = 40004, // 0x00009C44 + 不合法的文件类型 = 40005, // 0x00009C45 + 不合法的文件大小 = 40006, // 0x00009C46 + 不合法的媒体文件id = 40007, // 0x00009C47 + 不合法的消息类型_40008 = 40008, // 0x00009C48 + 不合法的图片文件大小 = 40009, // 0x00009C49 + 不合法的语音文件大小 = 40010, // 0x00009C4A + 不合法的视频文件大小 = 40011, // 0x00009C4B + 不合法的缩略图文件大小 = 40012, // 0x00009C4C + + /// + /// 微信:不合法的APPID + /// 小程序:生成权限被封禁 + /// + 不合法的APPID = 40013, // 0x00009C4D + + 不合法的access_token = 40014, // 0x00009C4E + 不合法的菜单类型 = 40015, // 0x00009C4F + 不合法的按钮个数1 = 40016, // 0x00009C50 + 不合法的按钮个数2 = 40017, // 0x00009C51 + 不合法的按钮名字长度 = 40018, // 0x00009C52 + 不合法的按钮KEY长度 = 40019, // 0x00009C53 + 不合法的按钮URL长度 = 40020, // 0x00009C54 + 不合法的菜单版本号 = 40021, // 0x00009C55 + 不合法的子菜单级数 = 40022, // 0x00009C56 + 不合法的子菜单按钮个数 = 40023, // 0x00009C57 + 不合法的子菜单按钮类型 = 40024, // 0x00009C58 + 不合法的子菜单按钮名字长度 = 40025, // 0x00009C59 + 不合法的子菜单按钮KEY长度 = 40026, // 0x00009C5A + 不合法的子菜单按钮URL长度 = 40027, // 0x00009C5B + 不合法的自定义菜单使用用户 = 40028, // 0x00009C5C + 不合法的oauth_code = 40029, // 0x00009C5D + 不合法的refresh_token = 40030, // 0x00009C5E + 不合法的openid列表 = 40031, // 0x00009C5F + 不合法的openid列表长度 = 40032, // 0x00009C60 + 不合法的请求字符不能包含uxxxx格式的字符 = 40033, // 0x00009C61 + 不合法的参数 = 40035, // 0x00009C63 + template_id不正确 = 40037, // 0x00009C65 + 不合法的请求格式 = 40038, // 0x00009C66 + 不合法的URL长度 = 40039, // 0x00009C67 + 不合法的分组id = 40050, // 0x00009C72 + 分组名字不合法 = 40051, // 0x00009C73 + + /// + /// 公众号:输入参数有误 + /// 小程序:参数expire_time填写错误 + /// + 输入参数有误 = 40097, // 0x00009CA1 + + appsecret不正确 = 40125, // 0x00009CBD + 调用接口的IP地址不在白名单中 = 40164, // 0x00009CE4 + 参数path填写错误 = 40165, // 0x00009CE5 + 小程序Appid不存在 = 40166, // 0x00009CE6 + 参数query填写错误 = 40212, // 0x00009D14 + 缺少access_token参数 = 41001, // 0x0000A029 + 缺少appid参数 = 41002, // 0x0000A02A + 缺少refresh_token参数 = 41003, // 0x0000A02B + 缺少secret参数 = 41004, // 0x0000A02C + 缺少多媒体文件数据 = 41005, // 0x0000A02D + 缺少media_id参数 = 41006, // 0x0000A02E + 缺少子菜单数据 = 41007, // 0x0000A02F + 缺少oauth_code = 41008, // 0x0000A030 + 缺少openid = 41009, // 0x0000A031 + form_id不正确_或者过期 = 41028, // 0x0000A044 + form_id已被使用 = 41029, // 0x0000A045 + page不正确 = 41030, // 0x0000A046 + access_token超时 = 42001, // 0x0000A411 + refresh_token超时 = 42002, // 0x0000A412 + oauth_code超时 = 42003, // 0x0000A413 + 需要GET请求 = 43001, // 0x0000A7F9 + 需要POST请求 = 43002, // 0x0000A7FA + 需要HTTPS请求 = 43003, // 0x0000A7FB + 需要接收者关注 = 43004, // 0x0000A7FC + 需要好友关系 = 43005, // 0x0000A7FD + + /// [小程序订阅消息]用户拒绝接受消息,如果用户之前曾经订阅过,则表示用户取消了订阅关系 + 用户拒绝接受消息 = 43101, // 0x0000A85D + + 没有权限 = 43104, // 0x0000A860 + 多媒体文件为空 = 44001, // 0x0000ABE1 + POST的数据包为空 = 44002, // 0x0000ABE2 + 图文消息内容为空 = 44003, // 0x0000ABE3 + 文本消息内容为空 = 44004, // 0x0000ABE4 + 多媒体文件大小超过限制 = 45001, // 0x0000AFC9 + 消息内容超过限制 = 45002, // 0x0000AFCA + 标题字段超过限制 = 45003, // 0x0000AFCB + 描述字段超过限制 = 45004, // 0x0000AFCC + 链接字段超过限制 = 45005, // 0x0000AFCD + 图片链接字段超过限制 = 45006, // 0x0000AFCE + 语音播放时间超过限制 = 45007, // 0x0000AFCF + 图文消息超过限制 = 45008, // 0x0000AFD0 + 接口调用超过限制 = 45009, // 0x0000AFD1 + 创建菜单个数超过限制 = 45010, // 0x0000AFD2 + 回复时间超过限制 = 45015, // 0x0000AFD7 + 系统分组不允许修改 = 45016, // 0x0000AFD8 + 分组名字过长 = 45017, // 0x0000AFD9 + 分组数量超过上限 = 45018, // 0x0000AFDA + 超出响应数量限制 = 45047, // 0x0000AFF7 + 创建的标签数过多请注意不能超过100个 = 45056, // 0x0000B000 + 标签名非法请注意不能和其他标签重名 = 45157, // 0x0000B065 + 标签名长度超过30个字节 = 45158, // 0x0000B066 + 不存在媒体数据 = 46001, // 0x0000B3B1 + 不存在的菜单版本 = 46002, // 0x0000B3B2 + 不存在的菜单数据 = 46003, // 0x0000B3B3 + 解析JSON_XML内容错误 = 47001, // 0x0000B799 + + /// [小程序订阅消息]模板参数不准确,可能为空或者不满足规则,errmsg会提示具体是哪个字段出错 + 模板参数不准确 = 47003, // 0x0000B79B + + api功能未授权 = 48001, // 0x0000BB81 + 用户未授权该api = 50001, // 0x0000C351 + 名称格式不合法 = 53010, // 0x0000CF12 + 名称检测命中频率限制 = 53011, // 0x0000CF13 + 禁止使用该名称 = 53012, // 0x0000CF14 + 公众号_名称与已有公众号名称重复_小程序_该名称与已有小程序名称重复 = 53013, // 0x0000CF15 + 公众号_公众号已有_名称A_时_需与该帐号相同主体才可申请_名称A_小程序_小程序已有_名称A_时_需与该帐号相同主体才可申请_名称A_ = 53014, // 0x0000CF16 + 公众号_该名称与已有小程序名称重复_需与该小程序帐号相同主体才可申请_小程序_该名称与已有公众号名称重复_需与该公众号帐号相同主体才可申请 = 53015, // 0x0000CF17 + 公众号_该名称与已有多个小程序名称重复_暂不支持申请_小程序_该名称与已有多个公众号名称重复_暂不支持申请 = 53016, // 0x0000CF18 + 公众号_小程序已有_名称A_时_需与该帐号相同主体才可申请_名称A_小程序_公众号已有_名称A_时_需与该帐号相同主体才可申请_名称A = 53017, // 0x0000CF19 + 名称命中微信号 = 53018, // 0x0000CF1A + 名称在保护期内 = 53019, // 0x0000CF1B + 法人姓名与微信号不一致 = 61070, // 0x0000EE8E + 系统错误system_error = 61450, // 0x0000F00A + 参数错误invalid_parameter = 61451, // 0x0000F00B + 无效客服账号invalid_kf_account = 61452, // 0x0000F00C + 客服帐号已存在kf_account_exsited = 61453, // 0x0000F00D + + /// + /// 客服帐号名长度超过限制(仅允许10个英文字符,不包括@及@后的公众号的微信号)(invalid kf_acount length) + /// + 客服帐号名长度超过限制 = 61454, // 0x0000F00E + + /// + /// 客服帐号名包含非法字符(仅允许英文+数字)(illegal character in kf_account) + /// + 客服帐号名包含非法字符 = 61455, // 0x0000F00F + + /// 客服帐号个数超过限制(10个客服账号)(kf_account count exceeded) + 客服帐号个数超过限制 = 61456, // 0x0000F010 + + 无效头像文件类型invalid_file_type = 61457, // 0x0000F011 + 日期格式错误 = 61500, // 0x0000F03C + 日期范围错误 = 61501, // 0x0000F03D + 发送消息失败_该用户已被加入黑名单_无法向此发送消息 = 62751, // 0x0000F51F + 门店不存在 = 65115, // 0x0000FE5B + 该门店状态不允许更新 = 65118, // 0x0000FE5E + 标签格式错误 = 85006, // 0x00014C0E + 页面路径错误 = 85007, // 0x00014C0F + 类目填写错误 = 85008, // 0x00014C10 + 已经有正在审核的版本 = 85009, // 0x00014C11 + item_list有项目为空 = 85010, // 0x00014C12 + 标题填写错误 = 85011, // 0x00014C13 + 无效的审核id = 85012, // 0x00014C14 + 版本输入错误 = 85015, // 0x00014C17 + 没有审核版本 = 85019, // 0x00014C1B + 审核状态未满足发布 = 85020, // 0x00014C1C + 状态不可变 = 85021, // 0x00014C1D + action非法 = 85022, // 0x00014C1E + 审核列表填写的项目数不在1到5以内 = 85023, // 0x00014C1F + 需要补充相应资料_填写org_code和other_files参数 = 85024, // 0x00014C20 + 管理员手机登记数量已超过上限 = 85025, // 0x00014C21 + 该微信号已绑定5个管理员 = 85026, // 0x00014C22 + 管理员身份证已登记过5次 = 85027, // 0x00014C23 + 该主体登记数量已超过上限 = 85028, // 0x00014C24 + 商家名称已被占用 = 85029, // 0x00014C25 + 不能使用该名称 = 85031, // 0x00014C27 + 该名称在侵权投诉保护期 = 85032, // 0x00014C28 + 名称包含违规内容或微信等保留字 = 85033, // 0x00014C29 + 商家名称在改名15天保护期内 = 85034, // 0x00014C2A + 需与该帐号相同主体才可申请 = 85035, // 0x00014C2B + 介绍中含有虚假混淆内容 = 85036, // 0x00014C2C + 头像或者简介修改达到每个月上限 = 85049, // 0x00014C39 + 正在审核中_请勿重复提交 = 85050, // 0x00014C3A + 请先成功创建门店后再调用 = 85053, // 0x00014C3D + 临时mediaid无效 = 85056, // 0x00014C40 + 链接错误 = 85066, // 0x00014C4A + 测试链接不是子链接 = 85068, // 0x00014C4C + 校验文件失败 = 85069, // 0x00014C4D + 个人类型小程序无法设置二维码规则 = 85070, // 0x00014C4E + 已添加该链接_请勿重复添加 = 85071, // 0x00014C4F + 该链接已被占用 = 85072, // 0x00014C50 + 二维码规则已满 = 85073, // 0x00014C51 + 小程序未发布_小程序必须先发布代码才可以发布二维码跳转规则 = 85074, // 0x00014C52 + 个人类型小程序无法设置二维码规则1 = 85075, // 0x00014C53 + 小程序没有线上版本_不能进行灰度 = 85079, // 0x00014C57 + 小程序提交的审核未审核通过 = 85080, // 0x00014C58 + 无效的发布比例 = 85081, // 0x00014C59 + 当前的发布比例需要比之前设置的高 = 85082, // 0x00014C5A + 小程序提审数量已达本月上限 = 85085, // 0x00014C5D + 提交代码审核之前需提前上传代码 = 85086, // 0x00014C5E + 小程序已使用_api_navigateToMiniProgram_请声明跳转_appid_列表后再次提交 = 85087, // 0x00014C5F + 不是由第三方代小程序进行调用 = 86000, // 0x00014FF0 + 不存在第三方的已经提交的代码 = 86001, // 0x00014FF1 + 小程序还未设置昵称_头像_简介_请先设置完后再重新提交 = 86002, // 0x00014FF2 + 无效微信号 = 86004, // 0x00014FF4 + + /// + /// 小程序为“签名错误”。对应公众号: 87009, “errmsg” : “reply is not exists” //该回复不存在 + /// + 签名错误 = 87009, // 0x000153E1 + + 现网已经在灰度发布_不能进行版本回退 = 87011, // 0x000153E3 + 该版本不能回退_可能的原因_1_无上一个线上版用于回退_2_此版本为已回退版本_不能回退_3_此版本为回退功能上线之前的版本_不能回退 = 87012, // 0x000153E4 + 内容含有违法违规内容 = 87014, // 0x000153E6 + 没有留言权限 = 88000, // 0x000157C0 + 该图文不存在 = 88001, // 0x000157C1 + 文章存在敏感信息 = 88002, // 0x000157C2 + 精选评论数已达上限 = 88003, // 0x000157C3 + 已被用户删除_无法精选 = 88004, // 0x000157C4 + 已经回复过了 = 88005, // 0x000157C5 + 回复超过长度限制或为0 = 88007, // 0x000157C7 + 该评论不存在 = 88008, // 0x000157C8 + 获取评论数目不合法 = 88010, // 0x000157CA + 该公众号_小程序已经绑定了开放平台帐号 = 89000, // 0x00015BA8 + 业务域名无更改_无需重复设置 = 89019, // 0x00015BBB + 尚未设置小程序业务域名_请先在第三方平台中设置小程序业务域名后在调用本接口 = 89020, // 0x00015BBC + 请求保存的域名不是第三方平台中已设置的小程序业务域名或子域名 = 89021, // 0x00015BBD + 业务域名数量超过限制_最多可以添加100个业务域名 = 89029, // 0x00015BC5 + 个人小程序不支持调用_setwebviewdomain_接口 = 89231, // 0x00015C8F + 内部错误 = 89247, // 0x00015C9F + 企业代码类型无效_请选择正确类型填写 = 89248, // 0x00015CA0 + 该主体已有任务执行中_距上次任务24h后再试 = 89249, // 0x00015CA1 + 未找到该任务 = 89250, // 0x00015CA2 + 待法人人脸核身校验 = 89251, // 0x00015CA3 + 法人_企业信息一致性校验中 = 89252, // 0x00015CA4 + 缺少参数 = 89253, // 0x00015CA5 + 第三方权限集不全_补全权限集全网发布后生效 = 89254, // 0x00015CA6 + 系统不稳定_请稍后再试_如多次失败请通过社区反馈 = 89401, // 0x00015D39 + 该审核单不在待审核队列_请检查是否已提交审核或已审完 = 89402, // 0x00015D3A + 本单属于平台不支持加急种类_请等待正常审核流程 = 89403, // 0x00015D3B + 本单已加速成功_请勿重复提交 = 89404, // 0x00015D3C + 本月加急额度不足_请提升提审质量以获取更多额度 = 89405, // 0x00015D3D + 该经营资质已添加_请勿重复添加 = 92000, // 0x00016760 + 附近地点添加数量达到上线_无法继续添加 = 92002, // 0x00016762 + 地点已被其它小程序占用 = 92003, // 0x00016763 + 附近功能被封禁 = 92004, // 0x00016764 + 地点正在审核中 = 92005, // 0x00016765 + 地点正在展示小程序 = 92006, // 0x00016766 + 地点审核失败 = 92007, // 0x00016767 + 程序未展示在该地点 = 92008, // 0x00016768 + 小程序未上架或不可见 = 92009, // 0x00016769 + 地点不存在 = 93010, // 0x00016B52 + 个人类型小程序不可用 = 93011, // 0x00016B53 + 已下发的模板消息法人并未确认且已超时_24h_未进行身份证校验 = 100001, // 0x000186A1 + 已下发的模板消息法人并未确认且已超时_24h_未进行人脸识别校验 = 100002, // 0x000186A2 + 已下发的模板消息法人并未确认且已超时_24h = 100003, // 0x000186A3 + 此账号已被封禁_无法操作 = 200011, // 0x00030D4B + 私有模板数已达上限_上限_50_个 = 200012, // 0x00030D4C + 此模版已被封禁_无法选用 = 200013, // 0x00030D4D + 模版tid参数错误 = 200014, // 0x00030D4E + 关键词列表kidList参数错误 = 200020, // 0x00030D54 + 场景描述sceneDesc参数错误 = 200021, // 0x00030D55 +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Enum/YesNoEnum.cs b/Admin.NET/Admin.NET.Core/Enum/YesNoEnum.cs new file mode 100644 index 0000000..b241a67 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Enum/YesNoEnum.cs @@ -0,0 +1,26 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 是否枚举 +/// +[Description("是否枚举")] +public enum YesNoEnum +{ + /// + /// 是 + /// + [Description("是")] + Y = 1, + + /// + /// 否 + /// + [Description("否")] + N = 2 +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/EventBus/AppEventSubscriber.cs b/Admin.NET/Admin.NET.Core/EventBus/AppEventSubscriber.cs new file mode 100644 index 0000000..01949dd --- /dev/null +++ b/Admin.NET/Admin.NET.Core/EventBus/AppEventSubscriber.cs @@ -0,0 +1,56 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 事件订阅 +/// +public class AppEventSubscriber : IEventSubscriber, ISingleton, IDisposable +{ + private readonly IServiceScope _serviceScope; + + public AppEventSubscriber(IServiceScopeFactory scopeFactory) + { + _serviceScope = scopeFactory.CreateScope(); + } + + /// + /// 增加异常日志 + /// + /// + /// + [EventSubscribe("Add:ExLog")] + public async Task CreateExLog(EventHandlerExecutingContext context) + { + var rep = _serviceScope.ServiceProvider.GetRequiredService>(); + await rep.InsertAsync((SysLogEx)context.Source.Payload); + } + + /// + /// 发送异常邮件 + /// + /// + /// + [EventSubscribe("Send:ErrorMail")] + public async Task SendOrderErrorMail(EventHandlerExecutingContext context) + { + //var mailTempPath = Path.Combine(App.WebHostEnvironment.WebRootPath, "Temp\\ErrorMail.tp"); + //var mailTemp = File.ReadAllText(mailTempPath); + //var mail = await _serviceScope.ServiceProvider.GetRequiredService().RunCompileFromCachedAsync(mailTemp, ); + + var title = "Admin.NET 系统异常"; + await _serviceScope.ServiceProvider.GetRequiredService().SendEmail(JSON.Serialize(context.Source.Payload), title); + } + + /// + /// 释放服务作用域 + /// + public void Dispose() + { + _serviceScope.Dispose(); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/EventBus/EventConsumer.cs b/Admin.NET/Admin.NET.Core/EventBus/EventConsumer.cs new file mode 100644 index 0000000..595bc89 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/EventBus/EventConsumer.cs @@ -0,0 +1,112 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// Redis 消息扩展 +/// +/// +public class EventConsumer : IDisposable +{ + private Task _consumerTask; + private CancellationTokenSource _consumerCts; + + /// + /// 消费者 + /// + public IProducerConsumer Consumer { get; } + + /// + /// ConsumerBuilder + /// + public FullRedis Builder { get; set; } + + /// + /// 消息回调 + /// + public event EventHandler Received; + + /// + /// 构造函数 + /// + public EventConsumer(FullRedis redis, string routeKey) + { + Builder = redis; + Consumer = Builder.GetQueue(routeKey); + } + + /// + /// 启动 + /// + /// + public void Start() + { + if (Consumer is null) + { + throw new InvalidOperationException("Subscribe first using the Consumer.Subscribe() function"); + } + if (_consumerTask != null) + { + return; + } + _consumerCts = new CancellationTokenSource(); + var ct = _consumerCts.Token; + _consumerTask = Task.Factory.StartNew(() => + { + while (!ct.IsCancellationRequested) + { + var cr = Consumer.TakeOne(10); + if (cr == null) continue; + Received?.Invoke(this, cr); + } + }, ct, TaskCreationOptions.LongRunning, TaskScheduler.Default); + } + + /// + /// 停止 + /// + /// + public async Task Stop() + { + if (_consumerCts == null || _consumerTask == null) return; + _consumerCts.Cancel(); + try + { + await _consumerTask; + } + finally + { + _consumerTask = null; + _consumerCts = null; + } + } + + /// + /// 释放 + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// 释放 + /// + /// + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + if (_consumerTask != null) + { + Stop().Wait(); + } + Builder.Dispose(); + } + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/EventBus/RabbitMQEventSourceStore.cs b/Admin.NET/Admin.NET.Core/EventBus/RabbitMQEventSourceStore.cs new file mode 100644 index 0000000..0372eb0 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/EventBus/RabbitMQEventSourceStore.cs @@ -0,0 +1,132 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using RabbitMQ.Client; +using RabbitMQ.Client.Events; +using System.Threading.Channels; + +namespace Admin.NET.Core; + +/// +/// RabbitMQ自定义事件源存储器 +/// +public class RabbitMQEventSourceStore : IEventSourceStorer +{ + /// + /// 内存通道事件源存储器 + /// + private readonly Channel _channel; + + /// + /// 通道对象 + /// + private readonly IModel _model; + + /// + /// 连接对象 + /// + private readonly IConnection _connection; + + /// + /// 路由键 + /// + private readonly string _routeKey; + + /// + /// 构造函数 + /// + /// 连接工厂 + /// 路由键 + /// 存储器最多能够处理多少消息,超过该容量进入等待写入 + public RabbitMQEventSourceStore(ConnectionFactory factory, string routeKey, int capacity) + { + // 配置通道,设置超出默认容量后进入等待 + var boundedChannelOptions = new BoundedChannelOptions(capacity) + { + FullMode = BoundedChannelFullMode.Wait + }; + + // 创建有限容量通道 + _channel = Channel.CreateBounded(boundedChannelOptions); + + // 创建连接 + _connection = factory.CreateConnection(); + _routeKey = routeKey; + + // 创建通道 + _model = _connection.CreateModel(); + + // 声明路由队列 + _model.QueueDeclare(routeKey, false, false, false, null); + + // 创建消息订阅者 + var consumer = new EventingBasicConsumer(_model); + + // 订阅消息并写入内存 Channel + consumer.Received += (ch, ea) => + { + // 读取原始消息 + var stringEventSource = Encoding.UTF8.GetString(ea.Body.ToArray()); + + // 转换为 IEventSource,如果自定义了 EventSource,注意属性是可读可写 + var eventSource = JSON.Deserialize(stringEventSource); + + // 写入内存管道存储器 + _channel.Writer.WriteAsync(eventSource); + + // 确认该消息已被消费 + _model.BasicAck(ea.DeliveryTag, false); + }; + + // 启动消费者且设置为手动应答消息 + _model.BasicConsume(routeKey, false, consumer); + } + + /// + /// 将事件源写入存储器 + /// + /// 事件源对象 + /// 取消任务 Token + /// + public async ValueTask WriteAsync(IEventSource eventSource, CancellationToken cancellationToken) + { + if (eventSource == default) + throw new ArgumentNullException(nameof(eventSource)); + + // 判断是否是 ChannelEventSource 或自定义的 EventSource + if (eventSource is ChannelEventSource source) + { + // 序列化及发布 + var data = Encoding.UTF8.GetBytes(JSON.Serialize(source)); + _model.BasicPublish("", _routeKey, null, data); + } + else + { + // 处理动态订阅 + await _channel.Writer.WriteAsync(eventSource, cancellationToken); + } + } + + /// + /// 从存储器中读取一条事件源 + /// + /// 取消任务 Token + /// 事件源对象 + public async ValueTask ReadAsync(CancellationToken cancellationToken) + { + var eventSource = await _channel.Reader.ReadAsync(cancellationToken); + return eventSource; + } + + /// + /// 释放非托管资源 + /// + public void Dispose() + { + _model.Dispose(); + _connection.Dispose(); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/EventBus/RedisEventSourceStorer.cs b/Admin.NET/Admin.NET.Core/EventBus/RedisEventSourceStorer.cs new file mode 100644 index 0000000..975a3dc --- /dev/null +++ b/Admin.NET/Admin.NET.Core/EventBus/RedisEventSourceStorer.cs @@ -0,0 +1,132 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using System.Threading.Channels; + +namespace Admin.NET.Core; + +/// +/// Redis自定义事件源存储器 +/// +public sealed class RedisEventSourceStorer : IEventSourceStorer, IDisposable +{ + /// + /// 消费者 + /// + private readonly EventConsumer _eventConsumer; + + /// + /// 内存通道事件源存储器 + /// + private readonly Channel _channel; + + /// + /// Redis 连接对象 + /// + private readonly FullRedis _redis; + + /// + /// 路由键 + /// + private readonly string _routeKey; + + /// + /// 构造函数 + /// + /// Redis 连接对象 + /// 路由键 + /// 存储器最多能够处理多少消息,超过该容量进入等待写入 + public RedisEventSourceStorer(ICache redis, string routeKey, int capacity) + { + // 配置通道,设置超出默认容量后进入等待 + var boundedChannelOptions = new BoundedChannelOptions(capacity) + { + FullMode = BoundedChannelFullMode.Wait + }; + + // 创建有限容量通道 + _channel = Channel.CreateBounded(boundedChannelOptions); + + _redis = redis as FullRedis; + _routeKey = routeKey; + + // 创建消息订阅者 + _eventConsumer = new EventConsumer(_redis, _routeKey); + + // 订阅消息写入 Channel + _eventConsumer.Received += (send, cr) => + { + // 反序列化消息 + //var eventSource = JsonConvert.DeserializeObject(cr); + + // 写入内存管道存储器 + Task.Run(async () => + { + await _channel.Writer.WriteAsync(cr); + }); + }; + + // 启动消费者 + _eventConsumer.Start(); + } + + /// + /// 将事件源写入存储器 + /// + /// 事件源对象 + /// 取消任务 Token + /// + public async ValueTask WriteAsync(IEventSource eventSource, CancellationToken cancellationToken) + { + // 空检查 + if (eventSource == default) + { + throw new ArgumentNullException(nameof(eventSource)); + } + + // 这里判断是否是 ChannelEventSource 或者 自定义的 EventSource + if (eventSource is ChannelEventSource source) + { + // 序列化消息 + //var data = JsonSerializer.Serialize(source); + + // 获取一个订阅对象 + var queue = _redis.GetQueue(_routeKey); + + // 异步发布 + await Task.Factory.StartNew(() => + { + queue.Add(source); + }, cancellationToken, TaskCreationOptions.LongRunning, System.Threading.Tasks.TaskScheduler.Default); + } + else + { + // 这里处理动态订阅问题 + await _channel.Writer.WriteAsync(eventSource, cancellationToken); + } + } + + /// + /// 从存储器中读取一条事件源 + /// + /// 取消任务 Token + /// 事件源对象 + public async ValueTask ReadAsync(CancellationToken cancellationToken) + { + // 读取一条事件源 + var eventSource = await _channel.Reader.ReadAsync(cancellationToken); + return eventSource; + } + + /// + /// 释放非托管资源 + /// + public async void Dispose() + { + await _eventConsumer.Stop(); + GC.SuppressFinalize(this); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/EventBus/RedisQueue.cs b/Admin.NET/Admin.NET.Core/EventBus/RedisQueue.cs new file mode 100644 index 0000000..3659642 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/EventBus/RedisQueue.cs @@ -0,0 +1,150 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using NewLife.Caching.Queues; + +namespace Admin.NET.Core; + +/// +/// Redis 消息队列 +/// +public static class RedisQueue +{ + private static readonly ICache _cache = App.GetRequiredService(); + + /// + /// 获取可信队列,需要确认 + /// + /// + /// + /// + public static RedisReliableQueue GetRedisReliableQueue(string topic) + { + var queue = (_cache as FullRedis).GetReliableQueue(topic); + return queue; + } + + /// + /// 可信队列回滚 + /// + /// + /// + /// + public static int RollbackAllAck(string topic, int retryInterval = 60) + { + var queue = GetRedisReliableQueue(topic); + queue.RetryInterval = retryInterval; + return queue.RollbackAllAck(); + } + + /// + /// 发送一个数据列表到可信队列 + /// + /// + /// + /// + /// + public static int AddReliableQueueList(string topic, List value) + { + var queue = (_cache as FullRedis).GetReliableQueue(topic); + var count = queue.Count; + var result = queue.Add(value.ToArray()); + return result - count; + } + + /// + /// 发送一条数据到可信队列 + /// + /// + /// + /// + /// + public static int AddReliableQueue(string topic, T value) + { + var queue = (_cache as FullRedis).GetReliableQueue(topic); + var count = queue.Count; + var result = queue.Add(value); + return result - count; + } + + /// + /// 获取延迟队列 + /// + /// + /// + /// + public static RedisDelayQueue GetDelayQueue(string topic) + { + var queue = (_cache as FullRedis).GetDelayQueue(topic); + return queue; + } + + /// + /// 发送一条数据到延迟队列 + /// + /// + /// + /// 延迟时间。单位秒 + /// + /// + public static int AddDelayQueue(string topic, T value, int delay) + { + var queue = GetDelayQueue(topic); + return queue.Add(value, delay); + } + + /// + /// 发送数据列表到延迟队列 + /// + /// + /// + /// + /// 延迟时间。单位秒 + /// + public static int AddDelayQueue(string topic, List value, int delay) + { + var queue = GetDelayQueue(topic); + queue.Delay = delay; + return queue.Add(value.ToArray()); + } + + /// + /// 在可信队列获取一条数据 + /// + /// + /// + /// + public static T ReliableTakeOne(string topic) + { + var queue = GetRedisReliableQueue(topic); + return queue.TakeOne(1); + } + + /// + /// 异步在可信队列获取一条数据 + /// + /// + /// + /// + public static async Task ReliableTakeOneAsync(string topic) + { + var queue = GetRedisReliableQueue(topic); + return await queue.TakeOneAsync(1); + } + + /// + /// 在可信队列获取多条数据 + /// + /// + /// + /// + /// + public static List ReliableTake(string topic, int count) + { + var queue = GetRedisReliableQueue(topic); + return queue.Take(count).ToList(); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/EventBus/RetryEventHandlerExecutor.cs b/Admin.NET/Admin.NET.Core/EventBus/RetryEventHandlerExecutor.cs new file mode 100644 index 0000000..f53f575 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/EventBus/RetryEventHandlerExecutor.cs @@ -0,0 +1,22 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 事件执行器-超时控制、失败重试熔断等等 +/// +public class RetryEventHandlerExecutor : IEventHandlerExecutor +{ + public async Task ExecuteAsync(EventHandlerExecutingContext context, Func handler) + { + // 如果执行失败,每隔 1s 重试,最多三次 + await Retry.InvokeAsync(async () => + { + await handler(context); + }, 3, 1000); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Extension/ConsoleLogoSetup.cs b/Admin.NET/Admin.NET.Core/Extension/ConsoleLogoSetup.cs new file mode 100644 index 0000000..be20e97 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Extension/ConsoleLogoSetup.cs @@ -0,0 +1,27 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 控制台logo +/// +public static class ConsoleLogoSetup +{ + public static void AddConsoleLogo(this IServiceCollection services) + { + Console.ForegroundColor = ConsoleColor.Blue; + Console.WriteLine(@" + _ _ _ _ ______ _______ + /\ | | (_) | \ | | ____|__ __| + / \ __| |_ __ ___ _ _ __ | \| | |__ | | + / /\ \ / _` | '_ ` _ \| | '_ \ | . ` | __| | | + / ____ \ (_| | | | | | | | | | |_| |\ | |____ | | + /_/ \_\__,_|_| |_| |_|_|_| |_(_)_| \_|______| |_| "); + Console.ForegroundColor = ConsoleColor.Yellow; + Console.WriteLine(@"让.NET更简单、更通用、更流行!"); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Extension/EnumExtension.cs b/Admin.NET/Admin.NET.Core/Extension/EnumExtension.cs new file mode 100644 index 0000000..72cf34f --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Extension/EnumExtension.cs @@ -0,0 +1,231 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 枚举拓展 +/// +public static class EnumExtension +{ + // 枚举显示字典缓存 + private static readonly ConcurrentDictionary> EnumDisplayValueDict = new(); + + // 枚举值字典缓存 + private static readonly ConcurrentDictionary> EnumNameValueDict = new(); + + // 枚举类型缓存 + private static ConcurrentDictionary _enumTypeDict; + + /// + /// 获取枚举对象Key与名称的字典(缓存) + /// + /// + /// + public static Dictionary GetEnumDictionary(this Type enumType) + { + if (!enumType.IsEnum) + throw new ArgumentException("Type '" + enumType.Name + "' is not an enum."); + + // 查询缓存 + var enumDic = EnumNameValueDict.ContainsKey(enumType) ? EnumNameValueDict[enumType] : new Dictionary(); + if (enumDic.Count != 0) + return enumDic; + // 取枚举类型的Key/Value字典集合 + enumDic = GetEnumDictionaryItems(enumType); + + // 缓存 + EnumNameValueDict[enumType] = enumDic; + + return enumDic; + } + + /// + /// 获取枚举对象Key与名称的字典 + /// + /// + /// + private static Dictionary GetEnumDictionaryItems(this Type enumType) + { + // 获取类型的字段,初始化一个有限长度的字典 + var enumFields = enumType.GetFields(BindingFlags.Public | BindingFlags.Static); + Dictionary enumDic = new(enumFields.Length); + + // 遍历字段数组获取key和name + foreach (var enumField in enumFields) + { + var intValue = (int)enumField.GetValue(enumType); + enumDic[intValue] = enumField.Name; + } + + return enumDic; + } + + /// + /// 获取枚举类型key与描述的字典(缓存) + /// + /// + /// + /// + public static Dictionary GetEnumDescDictionary(this Type enumType) + { + if (!enumType.IsEnum) + throw new ArgumentException("Type '" + enumType.Name + "' is not an enum."); + + // 查询缓存 + var enumDic = EnumDisplayValueDict.ContainsKey(enumType) + ? EnumDisplayValueDict[enumType] + : new Dictionary(); + if (enumDic.Count != 0) + return enumDic; + // 取枚举类型的Key/Value字典集合 + enumDic = GetEnumDescDictionaryItems(enumType); + + // 缓存 + EnumDisplayValueDict[enumType] = enumDic; + + return enumDic; + } + + /// + /// 获取枚举类型key与描述的字典(没有描述则获取name) + /// + /// + /// + /// + private static Dictionary GetEnumDescDictionaryItems(this Type enumType) + { + // 获取类型的字段,初始化一个有限长度的字典 + var enumFields = enumType.GetFields(BindingFlags.Public | BindingFlags.Static); + Dictionary enumDic = new(enumFields.Length); + + // 遍历字段数组获取key和name + foreach (var enumField in enumFields) + { + var intValue = (int)enumField.GetValue(enumType); + var desc = enumField.GetDescriptionValue(); + enumDic[intValue] = desc != null && !string.IsNullOrEmpty(desc.Description) ? desc.Description : enumField.Name; + } + + return enumDic; + } + + /// + /// 从程序集中查找指定枚举类型 + /// + /// + /// + /// + public static Type TryToGetEnumType(Assembly assembly, string typeName) + { + // 枚举缓存为空则重新加载枚举类型字典 + _enumTypeDict ??= LoadEnumTypeDict(assembly); + + // 按名称查找 + return _enumTypeDict.ContainsKey(typeName) ? _enumTypeDict[typeName] : null; + } + + /// + /// 从程序集中加载所有枚举类型 + /// + /// + /// + private static ConcurrentDictionary LoadEnumTypeDict(Assembly assembly) + { + // 取程序集中所有类型 + var typeArray = assembly.GetTypes(); + + // 过滤非枚举类型,转成字典格式并返回 + var dict = typeArray.Where(o => o.IsEnum).ToDictionary(o => o.Name, o => o); + ConcurrentDictionary enumTypeDict = new(dict); + return enumTypeDict; + } + + /// + /// 获取枚举的Description + /// + /// + /// + public static string GetDescription(this System.Enum value) + { + return value.GetType().GetMember(value.ToString()).FirstOrDefault()?.GetCustomAttribute() + ?.Description; + } + + /// + /// 获取枚举的Description + /// + /// + /// + public static string GetDescription(this object value) + { + return value.GetType().GetMember(value.ToString() ?? string.Empty).FirstOrDefault() + ?.GetCustomAttribute()?.Description; + } + + /// + /// 将枚举转成枚举信息集合 + /// + /// + /// + public static List EnumToList(this Type type) + { + if (!type.IsEnum) + throw new ArgumentException("Type '" + type.Name + "' is not an enum."); + var arr = System.Enum.GetNames(type); + return arr.Select(sl => + { + var item = System.Enum.Parse(type, sl); + return new EnumEntity + { + Name = item.ToString(), + Describe = item.GetDescription() ?? item.ToString(), + Value = item.GetHashCode() + }; + }).ToList(); + } + + /// + /// 枚举ToList + /// + /// + /// + /// + public static List EnumToList(this Type type) + { + if (!type.IsEnum) + throw new ArgumentException("Type '" + type.Name + "' is not an enum."); + var arr = System.Enum.GetNames(type); + return arr.Select(name => (T)System.Enum.Parse(type, name)).ToList(); + } +} + +/// +/// 枚举实体 +/// +public class EnumEntity +{ + /// + /// 枚举的描述 + /// + public string Describe { set; get; } + + /// + /// 枚举名称 + /// + public string Name { set; get; } + + + /// + /// 枚举的样式 + /// + public string Theme { set; get; } + + /// + /// 枚举对象的值 + /// + public int Value { set; get; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Extension/ListExtensions.cs b/Admin.NET/Admin.NET.Core/Extension/ListExtensions.cs new file mode 100644 index 0000000..77d8c90 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Extension/ListExtensions.cs @@ -0,0 +1,26 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +public static class ListExtensions +{ + public static async Task ForEachAsync(this List list, Func func) + { + foreach (var value in list) + { + await func(value); + } + } + + public static async Task ForEachAsync(this IEnumerable source, Func action) + { + foreach (var value in source) + { + await action(value); + } + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Extension/ObjectExtension.cs b/Admin.NET/Admin.NET.Core/Extension/ObjectExtension.cs new file mode 100644 index 0000000..cbf321e --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Extension/ObjectExtension.cs @@ -0,0 +1,318 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 对象拓展 +/// +[SuppressSniffer] +public static partial class ObjectExtension +{ + /// + /// 判断类型是否实现某个泛型 + /// + /// 类型 + /// 泛型类型 + /// bool + public static bool HasImplementedRawGeneric(this Type type, Type generic) + { + // 检查接口类型 + var isTheRawGenericType = type.GetInterfaces().Any(IsTheRawGenericType); + if (isTheRawGenericType) return true; + + // 检查类型 + while (type != null && type != typeof(object)) + { + isTheRawGenericType = IsTheRawGenericType(type); + if (isTheRawGenericType) return true; + type = type.BaseType; + } + + return false; + + // 判断逻辑 + bool IsTheRawGenericType(Type type) => generic == (type.IsGenericType ? type.GetGenericTypeDefinition() : type); + } + + /// + /// 将字典转化为QueryString格式 + /// + /// + /// + /// + public static string ToQueryString(this Dictionary dict, bool urlEncode = true) + { + return string.Join("&", dict.Select(p => $"{(urlEncode ? p.Key?.UrlEncode() : "")}={(urlEncode ? p.Value?.UrlEncode() : "")}")); + } + + /// + /// 将字符串URL编码 + /// + /// + /// + public static string UrlEncode(this string str) + { + return string.IsNullOrEmpty(str) ? "" : System.Uri.EscapeDataString(str); + } + + /// + /// 对象序列化成Json字符串 + /// + /// + /// + public static string ToJson(this object obj) + { + return JSON.GetJsonSerializer().Serialize(obj); + } + + /// + /// Json字符串反序列化成对象 + /// + /// + /// + /// + public static T ToObject(this string json) + { + return JSON.GetJsonSerializer().Deserialize(json); + } + + /// + /// 将object转换为long,若失败则返回0 + /// + /// + /// + public static long ParseToLong(this object obj) + { + try + { + return long.Parse(obj.ToString()); + } + catch + { + return 0L; + } + } + + /// + /// 将object转换为long,若失败则返回指定值 + /// + /// + /// + /// + public static long ParseToLong(this string str, long defaultValue) + { + try + { + return long.Parse(str); + } + catch + { + return defaultValue; + } + } + + /// + /// 将object转换为double,若失败则返回0 + /// + /// + /// + public static double ParseToDouble(this object obj) + { + try + { + return double.Parse(obj.ToString()); + } + catch + { + return 0; + } + } + + /// + /// 将object转换为double,若失败则返回指定值 + /// + /// + /// + /// + public static double ParseToDouble(this object str, double defaultValue) + { + try + { + return double.Parse(str.ToString()); + } + catch + { + return defaultValue; + } + } + + /// + /// 将string转换为DateTime,若失败则返回日期最小值 + /// + /// + /// + public static DateTime ParseToDateTime(this string str) + { + try + { + if (string.IsNullOrWhiteSpace(str)) + { + return DateTime.MinValue; + } + if (str.Contains('-') || str.Contains('/')) + { + return DateTime.Parse(str); + } + else + { + int length = str.Length; + switch (length) + { + case 4: + return DateTime.ParseExact(str, "yyyy", System.Globalization.CultureInfo.CurrentCulture); + + case 6: + return DateTime.ParseExact(str, "yyyyMM", System.Globalization.CultureInfo.CurrentCulture); + + case 8: + return DateTime.ParseExact(str, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture); + + case 10: + return DateTime.ParseExact(str, "yyyyMMddHH", System.Globalization.CultureInfo.CurrentCulture); + + case 12: + return DateTime.ParseExact(str, "yyyyMMddHHmm", System.Globalization.CultureInfo.CurrentCulture); + + case 14: + return DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture); + + default: + return DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture); + } + } + } + catch + { + return DateTime.MinValue; + } + } + + /// + /// 将string转换为DateTime,若失败则返回默认值 + /// + /// + /// + /// + public static DateTime ParseToDateTime(this string str, DateTime? defaultValue) + { + try + { + if (string.IsNullOrWhiteSpace(str)) + { + return defaultValue.GetValueOrDefault(); + } + if (str.Contains('-') || str.Contains('/')) + { + return DateTime.Parse(str); + } + else + { + int length = str.Length; + switch (length) + { + case 4: + return DateTime.ParseExact(str, "yyyy", System.Globalization.CultureInfo.CurrentCulture); + + case 6: + return DateTime.ParseExact(str, "yyyyMM", System.Globalization.CultureInfo.CurrentCulture); + + case 8: + return DateTime.ParseExact(str, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture); + + case 10: + return DateTime.ParseExact(str, "yyyyMMddHH", System.Globalization.CultureInfo.CurrentCulture); + + case 12: + return DateTime.ParseExact(str, "yyyyMMddHHmm", System.Globalization.CultureInfo.CurrentCulture); + + case 14: + return DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture); + + default: + return DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture); + } + } + } + catch + { + return defaultValue.GetValueOrDefault(); + } + } + + /// + /// 是否有值 + /// + /// + /// + public static bool IsNullOrEmpty(this object obj) + { + return obj == null || string.IsNullOrEmpty(obj.ToString()); + } + + /// + /// 字符串掩码 + /// + /// 字符串 + /// 掩码符 + /// + public static string Mask(this string str, char mask = '*') + { + if (string.IsNullOrWhiteSpace(str?.Trim())) + return str; + + str = str.Trim(); + var masks = mask.ToString().PadLeft(4, mask); + return str.Length switch + { + >= 11 => Regex.Replace(str, "(.{3}).*(.{4})", $"$1{masks}$2"), + 10 => Regex.Replace(str, "(.{3}).*(.{3})", $"$1{masks}$2"), + 9 => Regex.Replace(str, "(.{2}).*(.{3})", $"$1{masks}$2"), + 8 => Regex.Replace(str, "(.{2}).*(.{2})", $"$1{masks}$2"), + 7 => Regex.Replace(str, "(.{1}).*(.{2})", $"$1{masks}$2"), + 6 => Regex.Replace(str, "(.{1}).*(.{1})", $"$1{masks}$2"), + _ => Regex.Replace(str, "(.{1}).*", $"$1{masks}") + }; + } + + /// + /// 身份证号掩码 + /// + /// 身份证号 + /// 掩码符 + /// + public static string MaskIdCard(this string idCard, char mask = '*') + { + if (!idCard.TryValidate(ValidationTypes.IDCard).IsValid) return idCard; + + var masks = mask.ToString().PadLeft(8, mask); + return Regex.Replace(idCard, @"^(.{6})(.*)(.{4})$", $"$1{masks}$3"); + } + + /// + /// 邮箱掩码 + /// + /// 邮箱 + /// 掩码符 + /// + public static string MaskEmail(this string email, char mask = '*') + { + if (!email.TryValidate(ValidationTypes.EmailAddress).IsValid) return email; + + var masks = mask.ToString().PadLeft(4, mask); + return email.Replace(@"^([^\.]+)\.?", $"$1{masks}$2"); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Extension/ObjectIdConverter.cs b/Admin.NET/Admin.NET.Core/Extension/ObjectIdConverter.cs new file mode 100644 index 0000000..b5cf2f1 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Extension/ObjectIdConverter.cs @@ -0,0 +1,54 @@ +using MongoDB.Bson; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core; +public class ObjectIdConverter : JsonConverter +{ + public override ObjectId ReadJson(JsonReader reader, Type objectType, ObjectId existingValue, bool hasExistingValue, JsonSerializer serializer) + { + if (reader.Value is string value && ObjectId.TryParse(value, out var objectId)) + { + return objectId; + } + + return existingValue; + } + + public override void WriteJson(JsonWriter writer, ObjectId value, JsonSerializer serializer) + { + writer.WriteValue(value.ToString()); + } +} + + +// 自定义 JsonConverter +public class CustomListConverter : JsonConverter> +{ + public override List ReadJson(JsonReader reader, Type objectType, List existingValue, bool hasExistingValue, JsonSerializer serializer) + { + // 处理空值的情况 + if (reader.TokenType == JsonToken.Null) + return new List(); + + // 使用默认的 List 反序列化 + return serializer.Deserialize>(reader); + } + + public override void WriteJson(JsonWriter writer, List value, JsonSerializer serializer) + { + // 序列化时将空的 List 转换为 null + if (value == null || value.Count == 0) + writer.WriteNull(); + else + serializer.Serialize(writer, value); + } +} + + + + diff --git a/Admin.NET/Admin.NET.Core/Extension/RepositoryExtension.cs b/Admin.NET/Admin.NET.Core/Extension/RepositoryExtension.cs new file mode 100644 index 0000000..c0b518a --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Extension/RepositoryExtension.cs @@ -0,0 +1,407 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using MapsterMapper; + +namespace Admin.NET.Core; + +public static class RepositoryExtension +{ + /// + /// 实体假删除 _rep.FakeDelete(entity) + /// + /// + /// + /// + /// + public static int FakeDelete(this ISugarRepository repository, T entity) where T : EntityBase, new() + { + return repository.Context.FakeDelete(entity); + } + + /// + /// 实体假删除 db.FakeDelete(entity) + /// + /// + /// + /// + /// + public static int FakeDelete(this ISqlSugarClient db, T entity) where T : EntityBase, new() + { + return db.Updateable(entity).AS().ReSetValue(x => { x.IsDelete = true; }) + .IgnoreColumns(ignoreAllNullColumns: true) + .EnableDiffLogEvent() // 记录差异日志 + .UpdateColumns(x => new { x.IsDelete, x.UpdateTime, x.UpdateUserId }) // 允许更新的字段-AOP拦截自动设置UpdateTime、UpdateUserId + .ExecuteCommand(); + } + + /// + /// 实体集合批量假删除 _rep.FakeDelete(entity) + /// + /// + /// + /// + /// + public static int FakeDelete(this ISugarRepository repository, List entity) where T : EntityBase, new() + { + return repository.Context.FakeDelete(entity); + } + + /// + /// 实体集合批量假删除 db.FakeDelete(entity) + /// + /// + /// + /// + /// + public static int FakeDelete(this ISqlSugarClient db, List entity) where T : EntityBase, new() + { + return db.Updateable(entity).AS().ReSetValue(x => { x.IsDelete = true; }) + .IgnoreColumns(ignoreAllNullColumns: true) + .EnableDiffLogEvent() // 记录差异日志 + .UpdateColumns(x => new { x.IsDelete, x.UpdateTime, x.UpdateUserId }) // 允许更新的字段-AOP拦截自动设置UpdateTime、UpdateUserId + .ExecuteCommand(); + } + + /// + /// 实体假删除异步 _rep.FakeDeleteAsync(entity) + /// + /// + /// + /// + /// + public static Task FakeDeleteAsync(this ISugarRepository repository, T entity) where T : EntityBase, new() + { + return repository.Context.FakeDeleteAsync(entity); + } + + /// + /// 实体假删除 db.FakeDelete(entity) + /// + /// + /// + /// + /// + public static Task FakeDeleteAsync(this ISqlSugarClient db, T entity) where T : EntityBase, new() + { + return db.Updateable(entity).AS().ReSetValue(x => { x.IsDelete = true; }) + .IgnoreColumns(ignoreAllNullColumns: true) + .EnableDiffLogEvent() // 记录差异日志 + .UpdateColumns(x => new { x.IsDelete, x.UpdateTime, x.UpdateUserId }) // 允许更新的字段-AOP拦截自动设置UpdateTime、UpdateUserId + .ExecuteCommandAsync(); + } + + /// + /// 实体集合批量假删除异步 _rep.FakeDeleteAsync(entity) + /// + /// + /// + /// + /// + public static Task FakeDeleteAsync(this ISugarRepository repository, List entity) where T : EntityBase, new() + { + return repository.Context.FakeDeleteAsync(entity); + } + + /// + /// 实体集合批量假删除 db.FakeDelete(entity) + /// + /// + /// + /// + /// + public static Task FakeDeleteAsync(this ISqlSugarClient db, List entity) where T : EntityBase, new() + { + return db.Updateable(entity).AS().ReSetValue(x => { x.IsDelete = true; }) + .IgnoreColumns(ignoreAllNullColumns: true) + .EnableDiffLogEvent() // 记录差异日志 + .UpdateColumns(x => new { x.IsDelete, x.UpdateTime, x.UpdateUserId }) // 允许更新的字段-AOP拦截自动设置UpdateTime、UpdateUserId + .ExecuteCommandAsync(); + } + + /// + /// 排序方式(默认降序) + /// + /// + /// + /// + /// 默认排序字段 + /// 是否降序 + /// + public static ISugarQueryable OrderBuilder(this ISugarQueryable queryable, BasePageInput pageInput, string prefix = "", string defaultSortField = "Id", bool descSort = true) + { + // 约定默认每张表都有Id排序 + var orderStr = string.IsNullOrWhiteSpace(defaultSortField) ? "" : $"{prefix}{defaultSortField}" + (descSort ? " Desc" : " Asc"); + + TypeAdapterConfig typeAdapterConfig = new(); + typeAdapterConfig.ForType().IgnoreNullValues(true); + Mapper mapper = new(typeAdapterConfig); // 务必将mapper设为单实例 + var nowPagerInput = mapper.Map(pageInput); + // 排序是否可用-排序字段和排序顺序都为非空才启用排序 + if (!string.IsNullOrEmpty(nowPagerInput.Field) && !string.IsNullOrEmpty(nowPagerInput.Order)) + { + var col = queryable.Context.EntityMaintenance.GetEntityInfo().Columns.FirstOrDefault(u => u.PropertyName.Equals(nowPagerInput.Field, StringComparison.CurrentCultureIgnoreCase)); + orderStr = col != null + ? $"{prefix}{col.DbColumnName} {(nowPagerInput.Order == nowPagerInput.DescStr ? "Desc" : "Asc")}" + : $"{prefix}{nowPagerInput.Field} {(nowPagerInput.Order == nowPagerInput.DescStr ? "Desc" : "Asc")}"; + } + return queryable.OrderByIF(!string.IsNullOrWhiteSpace(orderStr), orderStr); + } + + /// + /// 更新实体并记录差异日志 _rep.UpdateWithDiffLog(entity) + /// + /// + /// + /// + /// + /// + public static int UpdateWithDiffLog(this ISugarRepository repository, T entity, bool ignoreAllNullColumns = true) where T : EntityBase, new() + { + return repository.Context.UpdateWithDiffLog(entity, ignoreAllNullColumns); + } + + /// + /// 更新实体并记录差异日志 _rep.UpdateWithDiffLog(entity) + /// + /// + /// + /// + /// + /// + public static int UpdateWithDiffLog(this ISqlSugarClient db, T entity, bool ignoreAllNullColumns = true) where T : EntityBase, new() + { + return db.Updateable(entity).AS() + .IgnoreColumns(ignoreAllNullColumns: ignoreAllNullColumns) + .EnableDiffLogEvent() + .ExecuteCommand(); + } + + /// + /// 更新实体并记录差异日志 _rep.UpdateWithDiffLogAsync(entity) + /// + /// + /// + /// + /// + /// + public static Task UpdateWithDiffLogAsync(this ISugarRepository repository, T entity, bool ignoreAllNullColumns = true) where T : EntityBase, new() + { + return repository.Context.UpdateWithDiffLogAsync(entity, ignoreAllNullColumns); + } + + /// + /// 更新实体并记录差异日志 _rep.UpdateWithDiffLogAsync(entity) + /// + /// + /// + /// + /// + /// + public static Task UpdateWithDiffLogAsync(this ISqlSugarClient db, T entity, bool ignoreAllNullColumns = true) where T : EntityBase, new() + { + return db.Updateable(entity) + .IgnoreColumns(ignoreAllNullColumns: ignoreAllNullColumns) + .EnableDiffLogEvent() + .ExecuteCommandAsync(); + } + + /// + /// 新增实体并记录差异日志 _rep.InsertWithDiffLog(entity) + /// + /// + /// + /// + /// + public static int InsertWithDiffLog(this ISugarRepository repository, T entity) where T : EntityBase, new() + { + return repository.Context.InsertWithDiffLog(entity); + } + + /// + /// 新增实体并记录差异日志 _rep.InsertWithDiffLog(entity) + /// + /// + /// + /// + /// + public static int InsertWithDiffLog(this ISqlSugarClient db, T entity) where T : EntityBase, new() + { + return db.Insertable(entity).AS().EnableDiffLogEvent().ExecuteCommand(); + } + + /// + /// 新增实体并记录差异日志 _rep.InsertWithDiffLogAsync(entity) + /// + /// + /// + /// + /// + public static Task InsertWithDiffLogAsync(this ISugarRepository repository, T entity) where T : EntityBase, new() + { + return repository.Context.InsertWithDiffLogAsync(entity); + } + + /// + /// 新增实体并记录差异日志 _rep.InsertWithDiffLog(entity) + /// + /// + /// + /// + /// + public static Task InsertWithDiffLogAsync(this ISqlSugarClient db, T entity) where T : EntityBase, new() + { + return db.Insertable(entity).AS().EnableDiffLogEvent().ExecuteCommandAsync(); + } + + /// + /// 多库查询 + /// + /// + /// + public static ISugarQueryable AS(this ISugarQueryable queryable) + { + var info = GetTableInfo(); + return queryable.AS($"{info.Item1}.{info.Item2}"); + } + + /// + /// 多库查询 + /// + /// + /// + /// + /// + public static ISugarQueryable AS(this ISugarQueryable queryable) + { + var info = GetTableInfo(); + return queryable.AS($"{info.Item1}.{info.Item2}"); + } + + /// + /// 多库更新 + /// + /// + /// + public static IUpdateable AS(this IUpdateable updateable) where T : EntityBase, new() + { + var info = GetTableInfo(); + return updateable.AS($"{info.Item1}.{info.Item2}"); + } + + /// + /// 多库新增 + /// + /// + /// + public static IInsertable AS(this IInsertable insertable) where T : EntityBase, new() + { + var info = GetTableInfo(); + return insertable.AS($"{info.Item1}.{info.Item2}"); + } + + /// + /// 多库删除 + /// + /// + /// + public static IDeleteable AS(this IDeleteable deleteable) where T : EntityBase, new() + { + var info = GetTableInfo(); + return deleteable.AS($"{info.Item1}.{info.Item2}"); + } + + /// + /// 根据实体类型获取表信息 + /// + /// + /// + private static Tuple GetTableInfo() + { + var entityType = typeof(T); + var attr = entityType.GetCustomAttribute(); + var configId = attr == null ? SqlSugarConst.MainConfigId : attr.configId.ToString(); + var tableName = entityType.GetCustomAttribute().TableName; + return new Tuple(configId, tableName); + } + + /// + /// 禁用过滤器-适用于更新和删除操作(只对当前请求有效,禁止使用异步) + /// + /// + /// 禁止异步 + /// + public static void RunWithoutFilter(this ISugarRepository repository, Action action) + { + repository.Context.QueryFilter.ClearAndBackup(); // 清空并备份过滤器 + action.Invoke(); + repository.Context.QueryFilter.Restore(); // 还原过滤器 + + // 用例 + //_rep.RunWithoutFilter(() => + //{ + // 执行更新或者删除 + // 禁止使用异步函数 + //}); + } + + /// + /// 忽略租户 + /// + /// + /// 是否忽略 默认true + /// + public static ISugarQueryable IgnoreTenant(this ISugarQueryable queryable, bool ignore = true) + { + return ignore ? queryable.ClearFilter() : queryable; + } + + /// + /// 导航+子表过滤 创建一个扩展函数,默认是Class不支持Where + /// + /// + /// + /// + /// + public static List Where(this T thisValue, Func whereExpression) where T : class, new() + { + return new List() { thisValue }; + } + + /// + /// 导航+子表过滤 创建一个扩展函数,默认是Class不支持WhereIF + /// + /// + /// + /// + /// + /// + public static List WhereIF(this T thisValue, bool isWhere, Func whereExpression) where T : class, new() + { + return new List() { thisValue }; + } + + /// + /// 只更新某些列 + /// + /// + /// + /// + /// + public static IUpdateable OnlyUpdateColumn(this IUpdateable updateable) where T : EntityBase, new() where R : class, new() + { + if (updateable.UpdateBuilder.UpdateColumns == null) + updateable.UpdateBuilder.UpdateColumns = new List(); + + foreach (PropertyInfo info in typeof(R).GetProperties()) + { + // 判断是否是相同属性 + if (typeof(T).GetProperty(info.Name) != null) + updateable.UpdateBuilder.UpdateColumns.Add(info.Name); + } + return updateable; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/GlobalUsings.cs b/Admin.NET/Admin.NET.Core/GlobalUsings.cs new file mode 100644 index 0000000..0997e4b --- /dev/null +++ b/Admin.NET/Admin.NET.Core/GlobalUsings.cs @@ -0,0 +1,60 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +global using Admin.NET.Core.Service; +global using Furion; +global using Furion.ConfigurableOptions; +global using Furion.DatabaseAccessor; +global using Furion.DataEncryption; +global using Furion.DataValidation; +global using Furion.DependencyInjection; +global using Furion.DynamicApiController; +global using Furion.EventBus; +global using Furion.FriendlyException; +global using Furion.JsonSerialization; +global using Furion.Logging; +global using Furion.Schedule; +global using Furion.UnifyResult; +global using Furion.ViewEngine; +global using Magicodes.ExporterAndImporter.Core; +global using Magicodes.ExporterAndImporter.Core.Extension; +global using Magicodes.ExporterAndImporter.Excel; +global using Mapster; +global using Microsoft.AspNetCore.Authorization; +global using Microsoft.AspNetCore.Http; +global using Microsoft.AspNetCore.Mvc; +global using Microsoft.AspNetCore.Mvc.Filters; +global using Microsoft.Extensions.Configuration; +global using Microsoft.Extensions.DependencyInjection; +global using Microsoft.Extensions.Hosting; +global using Microsoft.Extensions.Logging; +global using Microsoft.Extensions.Options; +global using NewLife; +global using NewLife.Caching; +global using Newtonsoft.Json.Linq; +global using SKIT.FlurlHttpClient; +global using SKIT.FlurlHttpClient.Wechat.Api; +global using SKIT.FlurlHttpClient.Wechat.Api.Models; +global using SKIT.FlurlHttpClient.Wechat.TenpayV3; +global using SKIT.FlurlHttpClient.Wechat.TenpayV3.Events; +global using SKIT.FlurlHttpClient.Wechat.TenpayV3.Models; +global using SKIT.FlurlHttpClient.Wechat.TenpayV3.Settings; +global using SqlSugar; +global using System.Collections; +global using System.Collections.Concurrent; +global using System.ComponentModel; +global using System.ComponentModel.DataAnnotations; +global using System.Data; +global using System.Diagnostics; +global using System.Linq.Dynamic.Core; +global using System.Linq.Expressions; +global using System.Reflection; +global using System.Runtime.InteropServices; +global using System.Text; +global using System.Text.RegularExpressions; +global using System.Web; +global using UAParser; +global using Yitter.IdGenerator; \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Hub/Dto/OnlineUserHubInput.cs b/Admin.NET/Admin.NET.Core/Hub/Dto/OnlineUserHubInput.cs new file mode 100644 index 0000000..386ad74 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Hub/Dto/OnlineUserHubInput.cs @@ -0,0 +1,12 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +public class OnlineUserHubInput +{ + public string ConnectionId { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Hub/Dto/OnlineUserHubOutput.cs b/Admin.NET/Admin.NET.Core/Hub/Dto/OnlineUserHubOutput.cs new file mode 100644 index 0000000..90c4425 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Hub/Dto/OnlineUserHubOutput.cs @@ -0,0 +1,16 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +public class OnlineUserList +{ + public string RealName { get; set; } + + public bool Online { get; set; } + + public List UserList { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Hub/IOnlineUserHub.cs b/Admin.NET/Admin.NET.Core/Hub/IOnlineUserHub.cs new file mode 100644 index 0000000..64fa9a2 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Hub/IOnlineUserHub.cs @@ -0,0 +1,38 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +public interface IOnlineUserHub +{ + /// + /// 在线用户列表 + /// + /// + /// + Task OnlineUserList(OnlineUserList context); + + /// + /// 强制下线 + /// + /// + /// + Task ForceOffline(object context); + + /// + /// 发布站内消息 + /// + /// + /// + Task PublicNotice(SysNotice context); + + /// + /// 接收消息 + /// + /// + /// + Task ReceiveMessage(object context); +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Hub/OnlineUserHub.cs b/Admin.NET/Admin.NET.Core/Hub/OnlineUserHub.cs new file mode 100644 index 0000000..ff16c11 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Hub/OnlineUserHub.cs @@ -0,0 +1,153 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Furion.InstantMessaging; +using Microsoft.AspNetCore.SignalR; + +namespace Admin.NET.Core; + +/// +/// 在线用户集线器 +/// +[MapHub("/hubs/onlineUser")] +public class OnlineUserHub : Hub +{ + private const string GROUP_ONLINE = "GROUP_ONLINE_"; // 租户分组前缀 + + private readonly SqlSugarRepository _sysOnlineUerRep; + private readonly SysMessageService _sysMessageService; + private readonly IHubContext _onlineUserHubContext; + private readonly SysCacheService _sysCacheService; + + public OnlineUserHub(SqlSugarRepository sysOnlineUerRep, + SysMessageService sysMessageService, + IHubContext onlineUserHubContext, + SysCacheService sysCacheService) + { + _sysOnlineUerRep = sysOnlineUerRep; + _sysMessageService = sysMessageService; + _onlineUserHubContext = onlineUserHubContext; + _sysCacheService = sysCacheService; + } + + /// + /// 连接 + /// + /// + public override async Task OnConnectedAsync() + { + var httpContext = Context.GetHttpContext(); + var token = httpContext.Request.Query["access_token"]; + var claims = JWTEncryption.ReadJwtToken(token)?.Claims; + var client = Parser.GetDefault().Parse(httpContext.Request.Headers["User-Agent"]); + + var userId = claims?.FirstOrDefault(u => u.Type == ClaimConst.UserId)?.Value; + var tenantId = claims?.FirstOrDefault(u => u.Type == ClaimConst.TenantId)?.Value; + var user = new SysOnlineUser + { + ConnectionId = Context.ConnectionId, + UserId = string.IsNullOrWhiteSpace(userId) ? 0 : long.Parse(userId), + UserName = claims?.FirstOrDefault(u => u.Type == ClaimConst.Account)?.Value, + RealName = claims?.FirstOrDefault(u => u.Type == ClaimConst.RealName)?.Value, + Time = DateTime.Now, + Ip = httpContext.Connection.RemoteIpAddress.MapToIPv4().ToString(), + Browser = client.UA.Family + client.UA.Major, + Os = client.OS.Family + client.OS.Major, + TenantId = string.IsNullOrWhiteSpace(tenantId) ? 0 : Convert.ToInt64(tenantId), + }; + await _sysOnlineUerRep.InsertAsync(user); + _sysCacheService.Set(CacheConst.KeyUserOnline + user.UserId, user); + + // 以租户Id进行分组 + var groupName = $"{GROUP_ONLINE}{user.TenantId}"; + await _onlineUserHubContext.Groups.AddToGroupAsync(Context.ConnectionId, groupName); + + var userList = await _sysOnlineUerRep.AsQueryable().Filter("", true) + .Where(u => u.TenantId == user.TenantId).Take(10).ToListAsync(); + await _onlineUserHubContext.Clients.Groups(groupName).OnlineUserList(new OnlineUserList + { + RealName = user.RealName, + Online = true, + UserList = userList + }); + } + + /// + /// 断开 + /// + /// + /// + public override async Task OnDisconnectedAsync(Exception exception) + { + if (string.IsNullOrEmpty(Context.ConnectionId)) return; + + var user = await _sysOnlineUerRep.AsQueryable().Filter("", true).FirstAsync(u => u.ConnectionId == Context.ConnectionId); + if (user == null) return; + + await _sysOnlineUerRep.DeleteAsync(u => u.Id == user.Id); + _sysCacheService.Remove(CacheConst.KeyUserOnline + user.UserId); + + // 通知当前组用户变动 + var userList = await _sysOnlineUerRep.AsQueryable().Filter("", true) + .Where(u => u.TenantId == user.TenantId).Take(10).ToListAsync(); + await _onlineUserHubContext.Clients.Groups($"{GROUP_ONLINE}{user.TenantId}").OnlineUserList(new OnlineUserList + { + RealName = user.RealName, + Online = false, + UserList = userList + }); + } + + /// + /// 强制下线 + /// + /// + /// + public async Task ForceOffline(OnlineUserHubInput input) + { + await _onlineUserHubContext.Clients.Client(input.ConnectionId).ForceOffline("强制下线"); + } + + /// + /// 发送信息给某个人 + /// + /// + /// + public async Task ClientsSendMessage(MessageInput message) + { + await _sysMessageService.SendUser(message); + } + + /// + /// 发送信息给所有人 + /// + /// + /// + public async Task ClientsSendMessagetoAll(MessageInput message) + { + await _sysMessageService.SendAllUser(message); + } + + /// + /// 发送消息给某些人(除了本人) + /// + /// + /// + public async Task ClientsSendMessagetoOther(MessageInput message) + { + await _sysMessageService.SendOtherUser(message); + } + + /// + /// 发送消息给某些人 + /// + /// + /// + public async Task ClientsSendMessagetoUsers(MessageInput message) + { + await _sysMessageService.SendUsers(message); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Hub/UserIdProvider.cs b/Admin.NET/Admin.NET.Core/Hub/UserIdProvider.cs new file mode 100644 index 0000000..fa6dec8 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Hub/UserIdProvider.cs @@ -0,0 +1,17 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Microsoft.AspNetCore.SignalR; + +namespace Admin.NET.Core; + +public interface UserIdProvider : IUserIdProvider +{ + public new string GetUserId(HubConnectionContext connection) + { + return connection.User?.Claims?.FirstOrDefault(u => u.Type == ClaimConst.UserId)?.Value; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Hub/WeMinPro/IWeMinProHub.cs b/Admin.NET/Admin.NET.Core/Hub/WeMinPro/IWeMinProHub.cs new file mode 100644 index 0000000..b88b2a6 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Hub/WeMinPro/IWeMinProHub.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + public interface IWeMinProHub + { + /// + /// 强制用户下线 + /// + /// 提示信息 + /// + Task ForceOffline(string msg); + + /// + /// 提醒即将下线 + /// + /// 提示信息 + /// + Task SendWarn(string msg); + + /// + /// 在线用户列表推送 + /// + /// 用户列表 + /// + Task OnlineUserList(OnlineUserList list); + } + +} diff --git a/Admin.NET/Admin.NET.Core/Hub/WeMinPro/WeMinProHub.cs b/Admin.NET/Admin.NET.Core/Hub/WeMinPro/WeMinProHub.cs new file mode 100644 index 0000000..ed0c342 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Hub/WeMinPro/WeMinProHub.cs @@ -0,0 +1,318 @@ +using Admin.NET.Core; +using Furion.InstantMessaging; +using Microsoft.AspNetCore.SignalR; +using UAParser; +using System.Security.Claims; +using Admin.NET.Core.Service; +using MongoDB.Driver.Core.Connections; +using MaxMind.GeoIP2.Model; +using Flurl.Http; +using System.Security.Cryptography; + +namespace AAdmin.NET.Core +{ + /// + /// 小程序进入房间时间统计 + /// + [MapHub("/hubs/weminpro")] + public class WeMinProHub : Hub + { + private readonly IHubContext _hubContext; + private readonly SysCacheService _cache; + private readonly IServiceScopeFactory _scopeFactory; + + // private const int MAX_MINUTES = 60; + private const int WARN_MINUTES = 15; + private const string CACHE_PREFIX = "MPUSER_"; + public const string CACHE_ROOM = "ROOM_"; + + public WeMinProHub( + IHubContext hubContext, + SysCacheService cache, + IServiceScopeFactory scopeFactory) + { + _hubContext = hubContext; + _cache = cache; + _scopeFactory = scopeFactory; + } + + /// + /// 用户连接时,首次上线或重连 + /// + /// + public override async Task OnConnectedAsync() + { + var context = Context.GetHttpContext(); + var token = context.Request.Query["access_token"]; + var roomId = context.Request.Query["roomId"]; + var claims = JWTEncryption.ReadJwtToken(token)?.Claims; + var client = Parser.GetDefault().Parse(context.Request.Headers["User-Agent"]); + + var userIdStr = claims?.FirstOrDefault(c => c.Type == ClaimConst.UserId)?.Value; + var tenantIdStr = claims?.FirstOrDefault(c => c.Type == ClaimConst.TenantId)?.Value; + if (!long.TryParse(userIdStr, out var userId)) return; + + var tenantId = string.IsNullOrWhiteSpace(tenantIdStr) ? 0 : 1300000000001; + + // 检查缓存中是否已有在线用户信息 + var cacheKey = CACHE_PREFIX + userId; + var cachedUser = _cache.Get(cacheKey); + + if (cachedUser == null) + { + using var scope = _scopeFactory.CreateScope(); + var _onlineUserService = scope.ServiceProvider.GetRequiredService>(); + var user = await _onlineUserService.GetByIdAsync(userId); + if (user == null) + { + user = new SysOnlineUser + { + UserId = userId, + TenantId = tenantId, + UserName = claims?.FirstOrDefault(c => c.Type == ClaimConst.Account)?.Value, + RealName = claims?.FirstOrDefault(c => c.Type == ClaimConst.RealName)?.Value, + Time = DateTime.Now, + ConnectionId = Context.ConnectionId, + Ip = context.Connection.RemoteIpAddress?.MapToIPv4().ToString(), + Browser = client.UA.Family + client.UA.Major, + Os = client.OS.Family + client.OS.Major, + TotalOnlineSeconds = 0 + }; + await _onlineUserService.InsertAsync(user); + } + else + { + if (user.LastOfflineTime.HasValue) + { + var lastOnlineSpan = (user.LastOfflineTime.Value - user.Time.GetValueOrDefault()).TotalSeconds; + user.TotalOnlineSeconds += (int)Math.Max(0, lastOnlineSpan); + } + + user.ConnectionId = Context.ConnectionId; + user.LastOfflineTime = null; + await _onlineUserService.UpdateAsync(user); + } + + _cache.Set(cacheKey, user, TimeSpan.FromHours(1)); + cachedUser = user; + + var _weChatUserScope = scope.ServiceProvider.GetRequiredService>(); + var wechatUserinfo = await _weChatUserScope.GetFirstAsync(c => c.WxId == user.UserId); + if (wechatUserinfo != null) + { + _cache.Set("WxVIP_" + user.UserId, wechatUserinfo.IsVIP, TimeSpan.FromHours(1)); + } + + if (!_cache.ExistKey(CACHE_ROOM + user.UserId)) + { + _cache.Set(CACHE_ROOM + user.UserId, roomId, TimeSpan.FromHours(1)); + } + } + + // 启动监控线程 + // _ = MonitorUserOnlineAsync(cachedUser); + + await base.OnConnectedAsync(); + } + + + + /// + /// 退出房间 + /// + /// + /// + [NonAction] + private async Task OfflineRoom(string userId) + { + var roomId = _cache.Get(CACHE_ROOM + userId); + if (!string.IsNullOrWhiteSpace(roomId)) + { + await "https://aigc.ycymedu.com/api/proxyaigc?Name=stop&Action=StopVoiceChat&Version=2024-12-01".PostJsonAsync(new WeMinProOfficeDto() + { + AppId = "67e11a296ff39301ed7429aa", + RoomId = roomId, + TaskId = userId + }); + _cache.Remove(CACHE_ROOM + userId); + } + } + + public override async Task OnDisconnectedAsync(Exception exception) + { + var context = Context.GetHttpContext(); + var token = context.Request.Query["access_token"]; + var claims = JWTEncryption.ReadJwtToken(token)?.Claims; + var userIdStr = claims?.FirstOrDefault(c => c.Type == ClaimConst.UserId)?.Value; + if (!long.TryParse(userIdStr, out var userId)) return; + var connectionId = Context.ConnectionId; + _cache.Remove(CACHE_PREFIX + userId); + using (var scope = _scopeFactory.CreateScope()) + { + var _onlineUserService = scope.ServiceProvider.GetRequiredService>(); + var user = await _onlineUserService.GetFirstAsync(c => c.UserId == userId); + if (user != null) + { + var onlineSpan = (DateTime.Now - user.Time.GetValueOrDefault()).TotalSeconds; + user.TotalOnlineSeconds += (int)onlineSpan; + user.LastOfflineTime = DateTime.Now; + await _onlineUserService.UpdateAsync(user); + } + } + await base.OnDisconnectedAsync(exception); + } + + /// + /// 强制下线用户 + /// + /// + /// + //public async Task ForceOffline(OnlineUserHubInput input) + //{ + + // var context = Context.GetHttpContext(); + // var token = context.Request.Query["access_token"]; + // var claims = JWTEncryption.ReadJwtToken(token)?.Claims; + // var userIdStr = claims?.FirstOrDefault(c => c.Type == ClaimConst.UserId)?.Value; + // if (!long.TryParse(userIdStr, out var userId)) return; + + // _cache.Remove(CACHE_PREFIX + input.ConnectionId); + + // using (var scope = _scopeFactory.CreateScope()) + // { + // var _onlineUserService = scope.ServiceProvider.GetRequiredService>(); + // var user = await _onlineUserService.GetFirstAsync(c => c.ConnectionId == input.ConnectionId); + // if (user != null) + // { + // user.LastOfflineTime = DateTime.Now; + // await _onlineUserService.UpdateAsync(user); + // } + + // await OfflineRoom(user.UserId.ToString()); + // await _hubContext.Clients.Client(input.ConnectionId).ForceOffline("已强制退出"); + // } + + //} + + /// + /// 监控用户在线时长并提醒(此处后面可将用户vip信息写入redis缓存) + /// + /// + /// + private async Task MonitorUserOnlineAsync(SysOnlineUser user) + { + var connectionId = user.ConnectionId; + var isVip = _cache.Get("WxVIP_" + user.UserId) ?? false; + var dbWriteKey = "DbWrite_" + user.UserId; + var writeDbInterval = TimeSpan.FromMinutes(1); // 最小数据库写入间隔 + var lastDbWrite = DateTime.Now; + var pingKey = $"{CACHE_PREFIX}{user.UserId}_ping"; + DingDingHook.DingTalkHookMessage("weminHub", $"CACHE_PREFIX:{CACHE_PREFIX + user.UserId};ExistKey:{_cache.ExistKey(CACHE_PREFIX + user.UserId)}"); + while (_cache.ExistKey(CACHE_PREFIX + user.UserId)) + { + var cachedUser = _cache.Get(CACHE_PREFIX + user.UserId); + DingDingHook.DingTalkHookMessage("weminHub0", $"cachedUser:" + cachedUser.ToJson()); + if (cachedUser == null) break; + + using (var scope = _scopeFactory.CreateScope()) + { + var _onlineUserService = scope.ServiceProvider.GetRequiredService>(); + var userInDb = await _onlineUserService.GetFirstAsync(c => c.UserId == user.UserId); + if (userInDb == null) break; + + // 检查心跳时间 + var lastPing = _cache.Get(pingKey); + DingDingHook.DingTalkHookMessage("weminHub0", $"TotalSeconds:" + (DateTime.Now - lastPing).TotalSeconds); + if (lastPing != DateTime.MinValue && (DateTime.Now - lastPing).TotalSeconds > 10) + { + // 掉线处理 + await _hubContext.Clients.Client(connectionId).ForceOffline("长时间未响应,系统自动下线"); + _cache.Remove(CACHE_PREFIX + user.UserId); + _cache.Remove(pingKey); + + // 计算本次在线时长 + var currentOnlineSpan = (DateTime.Now - userInDb.Time.GetValueOrDefault()).TotalSeconds; + userInDb.LastOfflineTime = DateTime.Now; + // 更新总在线时长 + userInDb.TotalOnlineSeconds += (int)currentOnlineSpan; + // 更新用户上线时间为当前时间,避免重复计算 + userInDb.Time = DateTime.Now; + + await _onlineUserService.UpdateAsync(userInDb); + await OfflineRoom(userInDb.UserId.ToString()); + break; + } + + // 计算本次新增的在线时长 + var newOnlineSpan = (DateTime.Now - (userInDb.Time ?? DateTime.Now)).TotalSeconds; + cachedUser.TotalOnlineSeconds = userInDb.TotalOnlineSeconds + (int)newOnlineSpan; + cachedUser.Time = userInDb.Time; + + // 先判断缓存项是否存在,不存在时才设置 + if (!_cache.ExistKey(CACHE_PREFIX + user.UserId)) + { + _cache.Set(CACHE_PREFIX + user.UserId, cachedUser, TimeSpan.FromHours(1)); + } + + var totalMinutes = cachedUser.TotalOnlineSeconds / 60.0; + int MAX_MINUTES = isVip ? 30 : 1; + if (totalMinutes >= MAX_MINUTES) + { + // DingDingHook.DingTalkHookMessage("weminHub", $"totalMinutes:" + totalMinutes); + await _hubContext.Clients.Client(connectionId).ForceOffline("您的体验时间已到,系统自动下线"); + _cache.Remove(CACHE_PREFIX + user.UserId); + _cache.Remove(pingKey); + userInDb.LastOfflineTime = DateTime.Now; + userInDb.TotalOnlineSeconds = cachedUser.TotalOnlineSeconds; + userInDb.Time = DateTime.Now; // 更新时间 + await _onlineUserService.UpdateAsync(userInDb); + break; + } + else if (totalMinutes >= WARN_MINUTES) + { + await _hubContext.Clients.Client(connectionId).SendWarn("您即将被系统下线!"); + } + + // 每5分钟写一次数据库 + if ((DateTime.Now - lastDbWrite) >= writeDbInterval) + { + userInDb.TotalOnlineSeconds = cachedUser.TotalOnlineSeconds; + userInDb.Time = DateTime.Now; // 更新时间 + await _onlineUserService.UpdateAsync(userInDb); + lastDbWrite = DateTime.Now; + } + } + // DingDingHook.DingTalkHookMessage("Ping", $"MonitorUserOnline:{Context.ConnectionId}|Ping:" + DateTime.Now.ToString("yyyyMMddHHmmssfff")); + await Task.Delay(TimeSpan.FromSeconds(5)); // 每5秒检查一次 + } + } + + + /// + /// 心跳 + /// 缓存中存在,则更新时间,否则删除 + /// + /// + public async Task Ping() + { + var context = Context.GetHttpContext(); + var token = context.Request.Query["access_token"]; + var claims = JWTEncryption.ReadJwtToken(token)?.Claims; + var userIdStr = claims?.FirstOrDefault(c => c.Type == ClaimConst.UserId)?.Value; + if (!long.TryParse(userIdStr, out var userId)) return; + // DingDingHook.DingTalkHookMessage("Ping", $"ConnectionId:{Context.ConnectionId}|Ping:" + DateTime.Now.ToString()); + var key = $"{CACHE_PREFIX}{userId}_ping"; + _cache.Set(key, DateTime.Now, TimeSpan.FromMinutes(2)); + } + + /// + /// 发送信息给小程序用户 + /// + /// + /// + public async Task ClientsSendMessage(MinProMessageInput message) + { + await _hubContext.Clients.Client(message.ConnectionId).SendWarn(message.Content); + } + } +} diff --git a/Admin.NET/Admin.NET.Core/Hub/WeMinPro/WeMinProOfficeDto.cs b/Admin.NET/Admin.NET.Core/Hub/WeMinPro/WeMinProOfficeDto.cs new file mode 100644 index 0000000..96564c5 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Hub/WeMinPro/WeMinProOfficeDto.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + public class WeMinProOfficeDto + { + public string AppId { get; set; } + + public string RoomId { get; set; } + + public string TaskId { get; set; } + + } +} diff --git a/Admin.NET/Admin.NET.Core/Job/DynamicJobCompiler.cs b/Admin.NET/Admin.NET.Core/Job/DynamicJobCompiler.cs new file mode 100644 index 0000000..67eb8fa --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Job/DynamicJobCompiler.cs @@ -0,0 +1,25 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 动态作业编译 +/// +public class DynamicJobCompiler : ISingleton +{ + /// + /// 编译代码并返回其中实现 IJob 的类型 + /// + /// 动态编译的作业代码 + /// + public Type BuildJob(string script) + { + var jobAssembly = Schedular.CompileCSharpClassCode(script); + var jobType = jobAssembly.GetTypes().FirstOrDefault(u => typeof(IJob).IsAssignableFrom(u)); + return jobType; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Job/DynamicOrdersJob.cs b/Admin.NET/Admin.NET.Core/Job/DynamicOrdersJob.cs new file mode 100644 index 0000000..75d2b12 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Job/DynamicOrdersJob.cs @@ -0,0 +1,140 @@ +using MongoDB.Driver.Core.Configuration; +using MySqlConnector; +using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Threading.Tasks; +using static SKIT.FlurlHttpClient.Wechat.Api.Models.ComponentTCBCreateCloudBaseRunServerVersionRequest.Types; +using static SKIT.FlurlHttpClient.Wechat.TenpayV3.Models.CreateRefundDomesticRefundRequest.Types.Amount.Types; + +namespace Admin.NET.Core; + +[JobDetail("job_orderSync", Description = "同步用户已支付订单", GroupName = "default", Concurrent = false)] +public class DynamicOrdersJob : IJob +{ + private readonly IServiceProvider _serviceProvider; + private readonly ILogger _logger; + + + // 数据库连接字符串和 Webhook 配置 + private const string ConnectionString = "DataSource=192.168.104.103; Port=3306;SslMode=None;Database=crmeb; Uid=root; Pwd=mysql_Fz7crZ;CharSet=utf8mb4;"; + private static readonly HttpClient HttpClient = new(); + public DynamicOrdersJob(IServiceProvider serviceProvider, ILoggerFactory loggerFactory) + { + _serviceProvider = serviceProvider; + _logger = loggerFactory.CreateLogger(CommonConst.SysLogCategoryName); + + } + + public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken) + { + await CheckAndSendWebhooksAsync(); + string msg = $"【{DateTime.Now}】同步用户已支付订单..."; + var originColor = Console.ForegroundColor; + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine(msg); + Console.ForegroundColor = originColor; + _logger.LogInformation(msg); + } + + + private async Task CheckAndSendWebhooksAsync() + { + // 使用独立的连接创建命令 + using (var connection = new MySqlConnection(ConnectionString)) + { + await connection.OpenAsync(); // 每次执行时打开一个新的连接 + + // 使用现有连接查询未处理事件 + using var command = new MySqlCommand(@" + SELECT + we.event_id, + we.order_id, + we.unionid, + we.cart_id, + we.phone, + we.amount, + es.title + FROM + webhook_events we + LEFT JOIN + eb_special es + ON + we.cart_id = es.id + WHERE + we.processed = FALSE", connection); + using var reader = await command.ExecuteReaderAsync(); + + while (await reader.ReadAsync()) + { + int eventId = reader.GetInt32("event_id"); + string orderId = reader.GetString("order_id"); + string cartId = reader.GetString("cart_id"); // 商品id + string phone = reader.GetString("phone"); // 手机号 + string amount = reader.GetString("amount"); + string cartName = reader.GetString("title"); + string unionid = reader.GetString("unionid"); + // 发送 Webhook 请求 + if (await SendWebhookAsync(new SysWechatUserMapCarts() + { + Amount = amount, + cartId = cartId, + CreateTime = DateTime.Now, + CreateUserName = "system", + Unionid = unionid, + IsDelete = false, + OrderId = orderId, + cartName = cartName, + Phone = phone, + UpdateTime = DateTime.Now, + UpdateUserName = "system", + })) + { + // 如果发送成功,将事件标记为已处理 + await MarkEventAsProcessedAsync(eventId); + } + } + + await reader.CloseAsync(); // 确保每次查询结束后关闭读取器 + } + } + + + /// + /// 同步订单信息 + /// + /// + /// + private async Task SendWebhookAsync(SysWechatUserMapCarts carts) + { + using var serviceScope = _serviceProvider.CreateScope(); + ////获取用户仓储 + var rep = serviceScope.ServiceProvider.GetService>(); + if (string.IsNullOrWhiteSpace(carts.Phone) && !string.IsNullOrWhiteSpace(carts.Unionid)) + { + var user = serviceScope.ServiceProvider.GetService>();//判断是否有该用户 + var wxUser = await user.GetFirstAsync(e => e.UnionId == carts.Unionid); + if (wxUser != null) + { + carts.Phone = wxUser.Mobile; + } + } + return !await rep.IsAnyAsync(e => e.OrderId == carts.OrderId && e.IsDelete == false) ? await rep.InsertAsync(carts) : false; + } + + private async Task MarkEventAsProcessedAsync(int eventId) + { + // 使用 using 确保连接使用后正确释放 + using (var connection = new MySqlConnection(ConnectionString)) + { + await connection.OpenAsync(); // 打开连接 + var command = new MySqlCommand("UPDATE webhook_events SET processed = TRUE WHERE event_id = @eventId", connection); + command.Parameters.AddWithValue("@eventId", eventId); + + await command.ExecuteNonQueryAsync(); // 执行更新操作 + } + } +} diff --git a/Admin.NET/Admin.NET.Core/Job/EnumToDictJob.cs b/Admin.NET/Admin.NET.Core/Job/EnumToDictJob.cs new file mode 100644 index 0000000..478ac3e --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Job/EnumToDictJob.cs @@ -0,0 +1,175 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using AngleSharp.Common; + +namespace Admin.NET.Core; + +/// +/// 枚举转字典 +/// +[JobDetail("job_EnumToDictJob", Description = "枚举转字典", GroupName = "default", Concurrent = false)] +[PeriodSeconds(1, TriggerId = "trigger_EnumToDictJob", Description = "枚举转字典", MaxNumberOfRuns = 1, RunOnStart = true)] +public class EnumToDictJob : IJob +{ + private readonly IServiceScopeFactory _scopeFactory; + private const int OrderOffset = 10; + private const string DefaultTagType = "info"; + + public EnumToDictJob(IServiceScopeFactory scopeFactory) + { + _scopeFactory = scopeFactory; + } + + public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken) + { + using var serviceScope = _scopeFactory.CreateScope(); + var sysEnumService = serviceScope.ServiceProvider.GetRequiredService(); + // 获取数据库连接 + var db = serviceScope.ServiceProvider.GetRequiredService().CopyNew(); + + // 获取枚举类型列表 + var enumTypeList = sysEnumService.GetEnumTypeList(); + var enumCodeList = enumTypeList.Select(u => u.TypeName); + // 查询数据库中已存在的枚举类型代码 + var sysDictTypeList = await db.Queryable() + .Includes(d => d.Children) + .Where(d => enumCodeList.Contains(d.Code)) + .ToListAsync(stoppingToken); + // 更新的枚举转换字典 + var updatedEnumCodes = sysDictTypeList.Select(u => u.Code); + var updatedEnumType = enumTypeList.Where(u => updatedEnumCodes.Contains(u.TypeName)).ToList(); + var sysDictTypeDict = sysDictTypeList.ToDictionary(u => u.Code, u => u); + var (updatedDictTypes, updatedDictDatas) = GetUpdatedDicts(updatedEnumType, sysDictTypeDict); + + // 新增的枚举转换字典 + var newEnumType = enumTypeList.Where(u => !updatedEnumCodes.Contains(u.TypeName)).ToList(); + var (newDictTypes, newDictDatas) = GetNewSysDicts(newEnumType); + + // 执行数据库操作 + try + { + db.BeginTran(); + + if (updatedDictTypes.Count > 0) + await db.Updateable(updatedDictTypes).ExecuteCommandAsync(stoppingToken); + + if (updatedDictDatas.Count > 0) + await db.Updateable(updatedDictDatas).ExecuteCommandAsync(stoppingToken); + + if (newDictTypes.Count > 0) + await db.Insertable(newDictTypes).ExecuteCommandAsync(stoppingToken); + + if (newDictDatas.Count > 0) + await db.Insertable(newDictDatas).ExecuteCommandAsync(stoppingToken); + + db.CommitTran(); + } + catch (Exception error) + { + db.RollbackTran(); + Log.Error($"系统枚举转换字典操作错误:{error.Message}\n堆栈跟踪:{error.StackTrace}", error); + throw; + } + var originColor = Console.ForegroundColor; + Console.ForegroundColor = ConsoleColor.Green; + Console.WriteLine($"【{DateTime.Now}】系统枚举转换字典"); + Console.ForegroundColor = originColor; + } + + /// + /// 获取需要新增的字典列表 + /// + /// + /// + /// 一个元组,包含以下元素: + /// + /// SysDictTypes字典类型列表 + /// SysDictDatas字典数据列表 + /// + /// + private (List, List) GetNewSysDicts(List addEnumType) + { + var newDictType = new List(); + var newDictData = new List(); + if (addEnumType.Count > 0) + { + // 新增字典类型 + newDictType = addEnumType.Select(u => new SysDictType + { + Id = YitIdHelper.NextId(), + Code = u.TypeName, + Name = u.TypeDescribe, + Remark = u.TypeRemark, + Status = StatusEnum.Enable + }).ToList(); + + // 新增字典数据 + newDictData = addEnumType.Join(newDictType, t1 => t1.TypeName, t2 => t2.Code, (t1, t2) => new + { + Data = t1.EnumEntities.Select(u => new SysDictData + { + Id = YitIdHelper.NextId(), + DictTypeId = t2.Id, + Name = u.Describe, + Value = u.Value.ToString(), + Code = u.Name, + Remark = t2.Remark, + OrderNo = u.Value + OrderOffset, + TagType = u.Theme != "" ? u.Theme : DefaultTagType, + }).ToList() + }).SelectMany(x => x.Data).ToList(); + } + return (newDictType, newDictData); + } + + /// + /// 获取需要更新的字典列表 + /// + /// + /// + /// + /// 一个元组,包含以下元素: + /// + /// SysDictTypes字典类型列表 + /// + /// SysDictDatas字典数据列表 + /// + /// + /// + private (List, List) GetUpdatedDicts(List updatedEnumType, Dictionary sysDictTypeDict) + { + var updatedSysDictTypes = new List(); + var updatedSysDictData = new List(); + foreach (var e in updatedEnumType) + { + if (sysDictTypeDict.TryGetValue(e.TypeName, out var value)) + { + var updatedDictType = value; + updatedDictType.Name = e.TypeDescribe; + updatedDictType.Remark = e.TypeRemark; + updatedSysDictTypes.Add(updatedDictType); + var updatedDictData = updatedDictType.Children.Where(u => u.DictTypeId == updatedDictType.Id).ToList(); + + // 遍历需要更新的字典数据 + foreach (var dictData in updatedDictData) + { + var enumData = e.EnumEntities.Where(u => dictData.Code == u.Name).FirstOrDefault(); + if (enumData != null) + { + dictData.Value = enumData.Value.ToString(); + dictData.OrderNo = enumData.Value + OrderOffset; + dictData.Name = enumData.Describe; + dictData.TagType = enumData.Theme != "" ? enumData.Theme : dictData.TagType != "" ? dictData.TagType : DefaultTagType; + updatedSysDictData.Add(dictData); + } + } + } + } + + return (updatedSysDictTypes, updatedSysDictData); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Job/LogJob.cs b/Admin.NET/Admin.NET.Core/Job/LogJob.cs new file mode 100644 index 0000000..fef539c --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Job/LogJob.cs @@ -0,0 +1,46 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 清理日志作业任务 +/// +[JobDetail("job_log", Description = "清理操作日志", GroupName = "default", Concurrent = false)] +[Daily(TriggerId = "trigger_log", Description = "清理操作日志")] +public class LogJob : IJob +{ + private readonly IServiceScopeFactory _scopeFactory; + private readonly ILogger _logger; + + public LogJob(IServiceScopeFactory scopeFactory, ILoggerFactory loggerFactory) + { + _scopeFactory = scopeFactory; + _logger = loggerFactory.CreateLogger(CommonConst.SysLogCategoryName); + } + + public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken) + { + using var serviceScope = _scopeFactory.CreateScope(); + + var db = serviceScope.ServiceProvider.GetRequiredService().CopyNew(); + var sysConfigService = serviceScope.ServiceProvider.GetRequiredService(); + + var daysAgo = await sysConfigService.GetConfigValue(CommonConst.SysLogRetentionDays); // 日志保留天数 + await db.Deleteable().Where(u => u.CreateTime < DateTime.Now.AddDays(-daysAgo)).ExecuteCommandAsync(stoppingToken); // 删除访问日志 + await db.Deleteable().Where(u => u.CreateTime < DateTime.Now.AddDays(-daysAgo)).ExecuteCommandAsync(stoppingToken); // 删除操作日志 + await db.Deleteable().Where(u => u.CreateTime < DateTime.Now.AddDays(-daysAgo)).ExecuteCommandAsync(stoppingToken); // 删除差异日志 + + string msg = $"【{DateTime.Now}】清理系统日志成功,删除 {daysAgo} 天前的日志数据!"; + var originColor = Console.ForegroundColor; + Console.ForegroundColor = ConsoleColor.Yellow; + Console.WriteLine(msg); + Console.ForegroundColor = originColor; + + // 自定义日志 + _logger.LogInformation(msg); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Job/OnlineUserJob.cs b/Admin.NET/Admin.NET.Core/Job/OnlineUserJob.cs new file mode 100644 index 0000000..7e49e69 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Job/OnlineUserJob.cs @@ -0,0 +1,46 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Furion.Logging.Extensions; + +namespace Admin.NET.Core; + +/// +/// 清理在线用户作业任务 +/// +[JobDetail("job_onlineUser", Description = "清理在线用户", GroupName = "default", Concurrent = false)] +[PeriodSeconds(1, TriggerId = "trigger_onlineUser", Description = "清理在线用户", MaxNumberOfRuns = 1, RunOnStart = true)] +public class OnlineUserJob : IJob +{ + private readonly IServiceScopeFactory _scopeFactory; + private readonly ILogger _logger; + + public OnlineUserJob(IServiceScopeFactory scopeFactory, ILoggerFactory loggerFactory) + { + _scopeFactory = scopeFactory; + _logger = loggerFactory.CreateLogger(CommonConst.SysLogCategoryName); + } + + public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken) + { + using var serviceScope = _scopeFactory.CreateScope(); + + var db = serviceScope.ServiceProvider.GetRequiredService().CopyNew(); + await db.Deleteable().ExecuteCommandAsync(stoppingToken); + + string msg = $"【{DateTime.Now}】清理在线用户成功!服务已重启..."; + var originColor = Console.ForegroundColor; + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine(msg); + Console.ForegroundColor = originColor; + + // 自定义日志 + _logger.LogInformation(msg); + + // 缓存租户列表 + await serviceScope.ServiceProvider.GetRequiredService().CacheTenant(); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Logging/DatabaseLoggingWriter.cs b/Admin.NET/Admin.NET.Core/Logging/DatabaseLoggingWriter.cs new file mode 100644 index 0000000..8a86b1d --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Logging/DatabaseLoggingWriter.cs @@ -0,0 +1,224 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using IPTools.Core; + +namespace Admin.NET.Core; + +/// +/// 数据库日志写入器 +/// +public class DatabaseLoggingWriter : IDatabaseLoggingWriter, IDisposable +{ + private readonly IServiceScope _serviceScope; + private readonly ISqlSugarClient _db; + private readonly SysConfigService _sysConfigService; // 参数配置服务 + private readonly ILogger _logger; // 日志组件 + + public DatabaseLoggingWriter(IServiceScopeFactory scopeFactory) + { + _serviceScope = scopeFactory.CreateScope(); + //_db = _serviceScope.ServiceProvider.GetRequiredService(); + _sysConfigService = _serviceScope.ServiceProvider.GetRequiredService(); + _logger = _serviceScope.ServiceProvider.GetRequiredService>(); + + // 切换日志独立数据库 + _db = SqlSugarSetup.ITenant.IsAnyConnection(SqlSugarConst.LogConfigId) + ? SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.LogConfigId) + : SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId); + } + + public async Task WriteAsync(LogMessage logMsg, bool flush) + { + var jsonStr = logMsg.Context?.Get("loggingMonitor")?.ToString(); + if (string.IsNullOrWhiteSpace(jsonStr)) + { + await _db.Insertable(new SysLogOp + { + DisplayTitle = "自定义操作日志", + LogDateTime = logMsg.LogDateTime, + EventId = logMsg.EventId.Id, + ThreadId = logMsg.ThreadId, + TraceId = logMsg.TraceId, + Exception = logMsg.Exception == null ? null : JSON.Serialize(logMsg.Exception), + Message = logMsg.Message, + LogLevel = logMsg.LogLevel + }).ExecuteCommandAsync(); + return; + } + + var loggingMonitor = JSON.Deserialize(jsonStr); + // 不记录数据校验日志 + if (loggingMonitor.validation != null) return; + + // 获取当前操作者 + string account = "", realName = "", userId = "", tenantId = ""; + if (loggingMonitor.authorizationClaims != null) + { + foreach (var item in loggingMonitor.authorizationClaims) + { + if (item.type == ClaimConst.Account) + account = item.value; + if (item.type == ClaimConst.RealName) + realName = item.value; + if (item.type == ClaimConst.TenantId) + tenantId = item.value; + if (item.type == ClaimConst.UserId) + userId = item.value; + } + } + + string remoteIPv4 = loggingMonitor.remoteIPv4; + (string ipLocation, double? longitude, double? latitude) = GetIpAddress(remoteIPv4); + + var browser = ""; + var os = ""; + if (loggingMonitor.userAgent != null) + { + var client = Parser.GetDefault().Parse(loggingMonitor.userAgent.ToString()); + browser = $"{client.UA.Family} {client.UA.Major}.{client.UA.Minor} / {client.Device.Family}"; + os = $"{client.OS.Family} {client.OS.Major} {client.OS.Minor}"; + } + + // 捕捉异常,否则会由于 unhandled exception 导致程序崩溃 + try + { + // 记录异常日志-发送邮件 + if (logMsg.Exception != null || loggingMonitor.exception != null) + { + await _db.Insertable(new SysLogEx + { + ControllerName = loggingMonitor.controllerName, + ActionName = loggingMonitor.actionTypeName, + DisplayTitle = loggingMonitor.displayTitle, + Status = loggingMonitor.returnInformation?.httpStatusCode, + RemoteIp = remoteIPv4, + Location = ipLocation, + Longitude = longitude, + Latitude = latitude, + Browser = browser, // loggingMonitor.userAgent, + Os = os, // loggingMonitor.osDescription + " " + loggingMonitor.osArchitecture, + Elapsed = loggingMonitor.timeOperationElapsedMilliseconds, + LogDateTime = logMsg.LogDateTime, + Account = account, + RealName = realName, + HttpMethod = loggingMonitor.httpMethod, + RequestUrl = loggingMonitor.requestUrl, + RequestParam = (loggingMonitor.parameters == null || loggingMonitor.parameters.Count == 0) ? null : JSON.Serialize(loggingMonitor.parameters[0].value), + ReturnResult = loggingMonitor.returnInformation == null ? null : JSON.Serialize(loggingMonitor.returnInformation), + EventId = logMsg.EventId.Id, + ThreadId = logMsg.ThreadId, + TraceId = logMsg.TraceId, + Exception = JSON.Serialize(loggingMonitor.exception), + Message = logMsg.Message, + CreateUserId = string.IsNullOrWhiteSpace(userId) ? 0 : long.Parse(userId), + TenantId = string.IsNullOrWhiteSpace(tenantId) ? 0 : long.Parse(tenantId), + LogLevel = logMsg.LogLevel + }).ExecuteCommandAsync(); + + // 将异常日志发送到邮件 + if (await _sysConfigService.GetConfigValue(CommonConst.SysErrorMail)) + { + await App.GetRequiredService().PublishAsync("Send:ErrorMail", loggingMonitor.exception); + } + + return; + } + + // 记录访问日志-登录退出 + if (loggingMonitor.actionName == "userInfo" || loggingMonitor.actionName == "logout") + { + await _db.Insertable(new SysLogVis + { + ControllerName = loggingMonitor.controllerName, + ActionName = loggingMonitor.actionTypeName, + DisplayTitle = loggingMonitor.displayTitle, + Status = loggingMonitor.returnInformation?.httpStatusCode, + RemoteIp = remoteIPv4, + Location = ipLocation, + Longitude = longitude, + Latitude = latitude, + Browser = browser, // loggingMonitor.userAgent, + Os = os, // loggingMonitor.osDescription + " " + loggingMonitor.osArchitecture, + Elapsed = loggingMonitor.timeOperationElapsedMilliseconds, + LogDateTime = logMsg.LogDateTime, + Account = account, + RealName = realName, + CreateUserId = string.IsNullOrWhiteSpace(userId) ? 0 : long.Parse(userId), + TenantId = string.IsNullOrWhiteSpace(tenantId) ? 0 : long.Parse(tenantId), + LogLevel = logMsg.LogLevel + }).ExecuteCommandAsync(); + return; + } + + // 记录操作日志 + if (!(await _sysConfigService.GetConfigValue(CommonConst.SysOpLog))) return; + await _db.Insertable(new SysLogOp + { + ControllerName = loggingMonitor.controllerName, + ActionName = loggingMonitor.actionTypeName, + DisplayTitle = loggingMonitor.displayTitle, + Status = loggingMonitor.returnInformation?.httpStatusCode, + RemoteIp = remoteIPv4, + Location = ipLocation, + Longitude = longitude, + Latitude = latitude, + Browser = browser, // loggingMonitor.userAgent, + Os = os, // loggingMonitor.osDescription + " " + loggingMonitor.osArchitecture, + Elapsed = loggingMonitor.timeOperationElapsedMilliseconds, + LogDateTime = logMsg.LogDateTime, + Account = account, + RealName = realName, + HttpMethod = loggingMonitor.httpMethod, + RequestUrl = loggingMonitor.requestUrl, + RequestParam = (loggingMonitor.parameters == null || loggingMonitor.parameters.Count == 0) ? null : JSON.Serialize(loggingMonitor.parameters[0].value), + ReturnResult = loggingMonitor.returnInformation == null ? null : JSON.Serialize(loggingMonitor.returnInformation), + EventId = logMsg.EventId.Id, + ThreadId = logMsg.ThreadId, + TraceId = logMsg.TraceId, + Exception = loggingMonitor.exception == null ? null : JSON.Serialize(loggingMonitor.exception), + Message = logMsg.Message, + CreateUserId = string.IsNullOrWhiteSpace(userId) ? 0 : long.Parse(userId), + TenantId = string.IsNullOrWhiteSpace(tenantId) ? 0 : long.Parse(tenantId), + LogLevel = logMsg.LogLevel + }).ExecuteCommandAsync(); + + await Task.Delay(50); // 延迟 0.05 秒写入数据库,有效减少高频写入数据库导致死锁问题 + } + catch (Exception ex) + { + _logger.LogError(ex, "操作日志入库"); + } + } + + /// + /// 解析IP地址 + /// + /// + /// + internal static (string ipLocation, double? longitude, double? latitude) GetIpAddress(string ip) + { + try + { + var ipInfo = IpTool.SearchWithI18N(ip); // 国际化查询,默认中文 中文zh-CN、英文en + var addressList = new List() { ipInfo.Country, ipInfo.Province, ipInfo.City, ipInfo.NetworkOperator }; + return (string.Join(" ", addressList.Where(u => u != "0" && !string.IsNullOrWhiteSpace(u)).ToList()), ipInfo.Longitude, ipInfo.Latitude); // 去掉0及空并用空格连接 + } + catch + { + // 不做处理 + } + return ("未知", 0, 0); + } + + /// + /// 释放服务作用域 + /// + public void Dispose() + { + _serviceScope.Dispose(); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Logging/ElasticSearchLoggingWriter.cs b/Admin.NET/Admin.NET.Core/Logging/ElasticSearchLoggingWriter.cs new file mode 100644 index 0000000..731647f --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Logging/ElasticSearchLoggingWriter.cs @@ -0,0 +1,101 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Elastic.Clients.Elasticsearch; + +namespace Admin.NET.Core; + +/// +/// ES日志写入器 +/// +public class ElasticSearchLoggingWriter : IDatabaseLoggingWriter, IDisposable +{ + private readonly IServiceScope _serviceScope; + private readonly ElasticsearchClient _esClient; + private readonly SysConfigService _sysConfigService; + + public ElasticSearchLoggingWriter(IServiceScopeFactory scopeFactory) + { + _serviceScope = scopeFactory.CreateScope(); + _esClient = _serviceScope.ServiceProvider.GetRequiredService(); + _sysConfigService = _serviceScope.ServiceProvider.GetRequiredService(); + } + + public async Task WriteAsync(LogMessage logMsg, bool flush) + { + // 是否启用操作日志 + var sysOpLogEnabled = await _sysConfigService.GetConfigValue(CommonConst.SysOpLog); + if (!sysOpLogEnabled) return; + + var jsonStr = logMsg.Context?.Get("loggingMonitor")?.ToString(); + if (string.IsNullOrWhiteSpace(jsonStr)) return; + + var loggingMonitor = JSON.Deserialize(jsonStr); + + // 不记录登录退出日志 + if (loggingMonitor.actionName == "userInfo" || loggingMonitor.actionName == "logout") + return; + + // 获取当前操作者 + string account = "", realName = "", userId = "", tenantId = ""; + if (loggingMonitor.authorizationClaims != null) + { + foreach (var item in loggingMonitor.authorizationClaims) + { + if (item.type == ClaimConst.Account) + account = item.value; + if (item.type == ClaimConst.RealName) + realName = item.value; + if (item.type == ClaimConst.TenantId) + tenantId = item.value; + if (item.type == ClaimConst.UserId) + userId = item.value; + } + } + + string remoteIPv4 = loggingMonitor.remoteIPv4; + (string ipLocation, double? longitude, double? latitude) = DatabaseLoggingWriter.GetIpAddress(remoteIPv4); + + var sysLogOp = new SysLogOp + { + Id = DateTime.Now.Ticks, + ControllerName = loggingMonitor.controllerName, + ActionName = loggingMonitor.actionTypeName, + DisplayTitle = loggingMonitor.displayTitle, + Status = loggingMonitor.returnInformation.httpStatusCode, + RemoteIp = remoteIPv4, + Location = ipLocation, + Longitude = longitude, + Latitude = latitude, + Browser = loggingMonitor.userAgent, + Os = loggingMonitor.osDescription + " " + loggingMonitor.osArchitecture, + Elapsed = loggingMonitor.timeOperationElapsedMilliseconds, + LogDateTime = logMsg.LogDateTime, + Account = account, + RealName = realName, + HttpMethod = loggingMonitor.httpMethod, + RequestUrl = loggingMonitor.requestUrl, + RequestParam = (loggingMonitor.parameters == null || loggingMonitor.parameters.Count == 0) ? null : JSON.Serialize(loggingMonitor.parameters[0].value), + ReturnResult = JSON.Serialize(loggingMonitor.returnInformation), + EventId = logMsg.EventId.Id, + ThreadId = logMsg.ThreadId, + TraceId = logMsg.TraceId, + Exception = (loggingMonitor.exception == null) ? null : JSON.Serialize(loggingMonitor.exception), + Message = logMsg.Message, + CreateUserId = string.IsNullOrWhiteSpace(userId) ? 0 : long.Parse(userId), + TenantId = string.IsNullOrWhiteSpace(tenantId) ? 0 : long.Parse(tenantId) + }; + await _esClient.IndexAsync(sysLogOp); + } + + /// + /// 释放服务作用域 + /// + public void Dispose() + { + _serviceScope.Dispose(); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Logging/ElasticSearchSetup.cs b/Admin.NET/Admin.NET.Core/Logging/ElasticSearchSetup.cs new file mode 100644 index 0000000..aa53c17 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Logging/ElasticSearchSetup.cs @@ -0,0 +1,53 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Elastic.Clients.Elasticsearch; +using Elastic.Transport; + +namespace Admin.NET.Core; + +/// +/// ES服务注册 +/// +public static class ElasticSearchSetup +{ + public static void AddElasticSearch(this IServiceCollection services) + { + var option = App.GetConfig("Logging:ElasticSearch"); + if (!option.Enabled) return; + + var uris = option.ServerUris.Select(u => new Uri(u)); + // 集群 + var connectionPool = new StaticNodePool(uris); + var connectionSettings = new ElasticsearchClientSettings(connectionPool).DefaultIndex(option.DefaultIndex); + // 单连接 + //var connectionSettings = new ElasticsearchClientSettings(new StaticNodePool(new List { uris.FirstOrDefault() })).DefaultIndex(option.DefaultIndex); + + // 认证类型 + if (option.AuthType == ElasticSearchAuthTypeEnum.Basic) // Basic 认证 + { + connectionSettings.Authentication(new BasicAuthentication(option.User, option.Password)); + } + else if (option.AuthType == ElasticSearchAuthTypeEnum.ApiKey) // ApiKey 认证 + { + connectionSettings.Authentication(new ApiKey(option.ApiKey)); + } + else if (option.AuthType == ElasticSearchAuthTypeEnum.Base64ApiKey) // Base64ApiKey 认证 + { + connectionSettings.Authentication(new Base64ApiKey(option.Base64ApiKey)); + } + else return; + + // ES使用Https时的证书指纹 + if (!string.IsNullOrEmpty(option.Fingerprint)) + { + connectionSettings.CertificateFingerprint(option.Fingerprint); + } + + var client = new ElasticsearchClient(connectionSettings); + services.AddSingleton(client); // 单例注册 + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Logging/LogExceptionHandler.cs b/Admin.NET/Admin.NET.Core/Logging/LogExceptionHandler.cs new file mode 100644 index 0000000..7895563 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Logging/LogExceptionHandler.cs @@ -0,0 +1,53 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +//using Microsoft.AspNetCore.Mvc.Controllers; +//using System.Security.Claims; + +//namespace Admin.NET.Core.Logging; + +///// +///// 全局异常处理 +///// +//public class LogExceptionHandler : IGlobalExceptionHandler, ISingleton +//{ +// private readonly IEventPublisher _eventPublisher; + +// public LogExceptionHandler(IEventPublisher eventPublisher) +// { +// _eventPublisher = eventPublisher; +// } + +// public async Task OnExceptionAsync(ExceptionContext context) +// { +// var actionMethod = (context.ActionDescriptor as ControllerActionDescriptor)?.MethodInfo; +// var displayNameAttribute = actionMethod.IsDefined(typeof(DisplayNameAttribute), true) ? actionMethod.GetCustomAttribute(true) : default; + +// var sysLogEx = new SysLogEx +// { +// Account = App.User?.FindFirstValue(ClaimConst.Account), +// RealName = App.User?.FindFirstValue(ClaimConst.RealName), +// ControllerName = actionMethod.DeclaringType.FullName, +// ActionName = actionMethod.Name, +// DisplayTitle = displayNameAttribute?.DisplayName, +// Exception = $"异常信息:{context.Exception.Message} 异常来源:{context.Exception.Source} 堆栈信息:{context.Exception.StackTrace}", +// Message = "全局异常", +// RequestParam = context.Exception.TargetSite.GetParameters().ToString(), +// HttpMethod = context.HttpContext.Request.Method, +// RequestUrl = context.HttpContext.Request.GetRequestUrlAddress(), +// RemoteIp = context.HttpContext.GetRemoteIpAddressToIPv4(), +// Browser = context.HttpContext.Request.Headers["User-Agent"], +// TraceId = App.GetTraceId(), +// ThreadId = App.GetThreadId(), +// LogDateTime = DateTime.Now, +// LogLevel = LogLevel.Error +// }; + +// await _eventPublisher.PublishAsync(new ChannelEventSource("Add:ExLog", sysLogEx)); + +// await _eventPublisher.PublishAsync("Send:ErrorMail", sysLogEx); +// } +//} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Logging/LoggingSetup.cs b/Admin.NET/Admin.NET.Core/Logging/LoggingSetup.cs new file mode 100644 index 0000000..4f8979a --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Logging/LoggingSetup.cs @@ -0,0 +1,98 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +public static class LoggingSetup +{ + /// + /// 日志注册 + /// + /// + public static void AddLoggingSetup(this IServiceCollection services) + { + // 日志监听 + services.AddMonitorLogging(options => + { + options.IgnorePropertyNames = new[] { "Byte" }; + options.IgnorePropertyTypes = new[] { typeof(byte[]) }; + }); + + // 控制台日志 + var consoleLog = App.GetConfig("Logging:Monitor:ConsoleLog", true); + services.AddConsoleFormatter(options => + { + options.DateFormat = "yyyy-MM-dd HH:mm:ss(zzz) dddd"; + //options.WithTraceId = true; // 显示线程Id + //options.WithStackFrame = true; // 显示程序集 + options.WriteFilter = (logMsg) => + { + return consoleLog; + }; + }); + + // 日志写入文件 + if (App.GetConfig("Logging:File:Enabled", true)) + { + var loggingMonitorSettings = App.GetConfig("Logging:Monitor", true); + Array.ForEach(new[] { LogLevel.Information, LogLevel.Warning, LogLevel.Error }, logLevel => + { + services.AddFileLogging(options => + { + options.WithTraceId = true; // 显示线程Id + options.WithStackFrame = true; // 显示程序集 + options.FileNameRule = fileName => string.Format(fileName, DateTime.Now, logLevel.ToString()); // 每天创建一个文件 + options.WriteFilter = logMsg => logMsg.LogLevel == logLevel; // 日志级别 + options.HandleWriteError = (writeError) => // 写入失败时启用备用文件 + { + writeError.UseRollbackFileName(Path.GetFileNameWithoutExtension(writeError.CurrentFileName) + "-oops" + Path.GetExtension(writeError.CurrentFileName)); + }; + if (loggingMonitorSettings.JsonBehavior == JsonBehavior.OnlyJson) + { + options.MessageFormat = LoggerFormatter.Json; + // options.MessageFormat = LoggerFormatter.JsonIndented; + options.MessageFormat = (logMsg) => + { + var jsonString = logMsg.Context.Get("loggingMonitor"); + return jsonString?.ToString(); + }; + } + }); + }); + } + + // 日志写入ElasticSearch + if (App.GetConfig("Logging:ElasticSearch:Enabled", true)) + { + services.AddDatabaseLogging(options => + { + options.WithTraceId = true; // 显示线程Id + options.WithStackFrame = true; // 显示程序集 + options.IgnoreReferenceLoop = false; // 忽略循环检测 + options.MessageFormat = LoggerFormatter.Json; + options.WriteFilter = (logMsg) => + { + return logMsg.LogName == "System.Logging.LoggingMonitor"; // 只写LoggingMonitor日志 + }; + }); + } + + // 日志写入数据库 + if (App.GetConfig("Logging:Database:Enabled", true)) + { + services.AddDatabaseLogging(options => + { + options.WithTraceId = true; // 显示线程Id + options.WithStackFrame = true; // 显示程序集 + options.IgnoreReferenceLoop = false; // 忽略循环检测 + options.WriteFilter = (logMsg) => + { + return logMsg.LogName == "System.Logging.LoggingMonitor"; // 只写LoggingMonitor日志 + }; + }); + } + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/OAuth/OAuthSetup.cs b/Admin.NET/Admin.NET.Core/OAuth/OAuthSetup.cs new file mode 100644 index 0000000..4c156d5 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/OAuth/OAuthSetup.cs @@ -0,0 +1,50 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authentication.Cookies; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.Builder; + +namespace Admin.NET.Core; + +public static class OAuthSetup +{ + /// + /// 三方授权登录OAuth注册 + /// + /// + public static void AddOAuth(this IServiceCollection services) + { + var authOpt = App.GetConfig("OAuth", true); + services.AddAuthentication(options => + { + options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; + options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + }) + .AddCookie(options => + { + options.Cookie.SameSite = SameSiteMode.Lax; + }) + .AddWeixin(options => + { + options.ClientId = authOpt.Weixin?.ClientId; + options.ClientSecret = authOpt.Weixin?.ClientSecret; + }) + .AddGitee(options => + { + options.ClientId = authOpt.Gitee?.ClientId; + options.ClientSecret = authOpt.Gitee?.ClientSecret; + + options.ClaimActions.MapJsonKey(OAuthClaim.GiteeAvatarUrl, "avatar_url"); + }); + } + + public static void UseOAuth(this IApplicationBuilder app) + { + app.UseCookiePolicy(new CookiePolicyOptions { MinimumSameSitePolicy = SameSiteMode.Lax }); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Option/APIJSONOptions.cs b/Admin.NET/Admin.NET.Core/Option/APIJSONOptions.cs new file mode 100644 index 0000000..c12625a --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Option/APIJSONOptions.cs @@ -0,0 +1,70 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// APIJSON配置选项 +/// +public sealed class APIJSONOptions : IConfigurableOptions +{ + /// + /// 角色集合 + /// + public List Roles { get; set; } +} + +/// +/// APIJSON角色权限 +/// +public class APIJSON_Role +{ + /// + /// 角色名称 + /// + public string RoleName { get; set; } + + /// + /// 查询 + /// + public APIJSON_RoleItem Select { get; set; } + + /// + /// 增加 + /// + public APIJSON_RoleItem Insert { get; set; } + + /// + /// 更新 + /// + public APIJSON_RoleItem Update { get; set; } + + /// + /// 删除 + /// + public APIJSON_RoleItem Delete { get; set; } +} + +/// +/// APIJSON角色权限内容 +/// +public class APIJSON_RoleItem +{ + /// + /// 表集合 + /// + public string[] Table { get; set; } + + /// + /// 列集合 + /// + public string[] Column { get; set; } + + /// + /// 过滤器 + /// + public string[] Filter { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Option/CacheOptions.cs b/Admin.NET/Admin.NET.Core/Option/CacheOptions.cs new file mode 100644 index 0000000..4bd9910 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Option/CacheOptions.cs @@ -0,0 +1,155 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 缓存配置选项 +/// +public sealed class CacheOptions : IConfigurableOptions +{ + /// + /// 缓存前缀 + /// + public string Prefix { get; set; } + + /// + /// 缓存类型 + /// + public string CacheType { get; set; } + + /// + /// Redis缓存 + /// + public RedisOption Redis { get; set; } + + public void PostConfigure(CacheOptions options, IConfiguration configuration) + { + options.Prefix = string.IsNullOrWhiteSpace(options.Prefix) ? "" : options.Prefix.Trim(); + } +} + + +public sealed class MongoDbOptions : IConfigurableOptions +{ + public string Url { get;set; } +} + +public sealed class OutExApi : IConfigurableOptions +{ + public string BaseUrl { get; set; } + +} + + +/// +/// Redis缓存 +/// +public sealed class RedisOption : RedisOptions +{ + /// + /// 最大消息大小 + /// + public int MaxMessageSize { get; set; } +} + +/// +/// 集群配置选项 +/// +public sealed class ClusterOptions : IConfigurableOptions +{ + /// + /// 是否启用 + /// + public bool Enabled { get; set; } + + /// + /// 服务器标识 + /// + public string ServerId { get; set; } + + /// + /// 服务器IP + /// + public string ServerIp { get; set; } + + /// + /// SignalR配置 + /// + public ClusterSignalR SignalR { get; set; } + + /// + /// 数据保护key + /// + public string DataProtecteKey { get; set; } + + /// + /// 是否哨兵模式 + /// + public bool IsSentinel { get; set; } + + /// + /// 哨兵配置 + /// + public StackExchangeSentinelConfig SentinelConfig { get; set; } +} + +/// +/// 集群SignalR配置 +/// +public sealed class ClusterSignalR +{ + /// + /// Redis连接字符串 + /// + public string RedisConfiguration { get; set; } + + /// + /// 缓存前缀 + /// + public string ChannelPrefix { get; set; } +} + +/// +/// 哨兵配置 +/// +public sealed class StackExchangeSentinelConfig +{ + /// + /// master名称 + /// + public string ServiceName { get; set; } + + /// + /// master访问密码 + /// + public string Password { get; set; } + + /// + /// 哨兵访问密码 + /// + public string SentinelPassword { get; set; } + + /// + /// 哨兵端口 + /// + public List EndPoints { get; set; } + + /// + /// 默认库 + /// + public int DefaultDb { get; set; } + + /// + /// 主前缀 + /// + public string MainPrefix { get; set; } + + /// + /// SignalR前缀 + /// + public string SignalRChannelPrefix { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Option/CodeGenOptions.cs b/Admin.NET/Admin.NET.Core/Option/CodeGenOptions.cs new file mode 100644 index 0000000..021beb7 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Option/CodeGenOptions.cs @@ -0,0 +1,38 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 代码生成配置选项 +/// +public sealed class CodeGenOptions : IConfigurableOptions +{ + /// + /// 数据库实体程序集名称集合 + /// + public List EntityAssemblyNames { get; set; } + + /// + /// 数据库基础实体名称集合 + /// + public List BaseEntityNames { get; set; } + + /// + /// 基础实体名 + /// + public Dictionary EntityBaseColumn { get; set; } + + /// + /// 前端文件根目录 + /// + public string FrontRootPath { get; set; } + + /// + /// 后端生成到的项目 + /// + public List BackendApplicationNamespaces { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Option/CryptogramOptions.cs b/Admin.NET/Admin.NET.Core/Option/CryptogramOptions.cs new file mode 100644 index 0000000..44a43ec --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Option/CryptogramOptions.cs @@ -0,0 +1,43 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 密码配置选项 +/// +public sealed class CryptogramOptions : IConfigurableOptions +{ + /// + /// 是否开启密码强度验证 + /// + public bool StrongPassword { get; set; } + + /// + /// 密码强度验证正则表达式 + /// + public string PasswordStrengthValidation { get; set; } + + /// + /// 密码强度验证提示 + /// + public string PasswordStrengthValidationMsg { get; set; } + + /// + /// 密码类型 + /// + public string CryptoType { get; set; } + + /// + /// 公钥 + /// + public string PublicKey { get; set; } + + /// + /// 私钥 + /// + public string PrivateKey { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Option/DbConnectionOptions.cs b/Admin.NET/Admin.NET.Core/Option/DbConnectionOptions.cs new file mode 100644 index 0000000..e1c8619 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Option/DbConnectionOptions.cs @@ -0,0 +1,106 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 数据库配置选项 +/// +public sealed class DbConnectionOptions : IConfigurableOptions +{ + /// + /// 启用控制台打印SQL + /// + public bool EnableConsoleSql { get; set; } + + /// + /// 数据库集合 + /// + public List ConnectionConfigs { get; set; } + + public void PostConfigure(DbConnectionOptions options, IConfiguration configuration) + { + foreach (var dbConfig in options.ConnectionConfigs) + { + if (dbConfig.ConfigId == null || string.IsNullOrWhiteSpace(dbConfig.ConfigId.ToString())) + dbConfig.ConfigId = SqlSugarConst.MainConfigId; + } + } +} + +/// +/// 数据库连接配置 +/// +public sealed class DbConnectionConfig : ConnectionConfig +{ + /// + /// 数据库配置 + /// + public DbSettings DbSettings { get; set; } + + /// + /// 表配置 + /// + public TableSettings TableSettings { get; set; } + + /// + /// 种子配置 + /// + public SeedSettings SeedSettings { get; set; } +} + +/// +/// 数据库配置 +/// +public sealed class DbSettings +{ + /// + /// 启用库表初始化 + /// + public bool EnableInitDb { get; set; } + + /// + /// 启用库表差异日志 + /// + public bool EnableDiffLog { get; set; } + + /// + /// 启用驼峰转下划线 + /// + public bool EnableUnderLine { get; set; } +} + +/// +/// 表配置 +/// +public sealed class TableSettings +{ + /// + /// 启用表初始化 + /// + public bool EnableInitTable { get; set; } + + /// + /// 启用表增量更新 + /// + public bool EnableIncreTable { get; set; } +} + +/// +/// 种子配置 +/// +public sealed class SeedSettings +{ + /// + /// 启用种子初始化 + /// + public bool EnableInitSeed { get; set; } + + /// + /// 启用种子增量更新 + /// + public bool EnableIncreSeed { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Option/ElasticSearchOptions.cs b/Admin.NET/Admin.NET.Core/Option/ElasticSearchOptions.cs new file mode 100644 index 0000000..1e6f73a --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Option/ElasticSearchOptions.cs @@ -0,0 +1,64 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// ES配置选项 +/// +public class ElasticSearchOptions +{ + /// + /// 是否启用 + /// + public bool Enabled { get; set; } = false; + + /// + /// ES认证类型,可选 Basic、ApiKey、Base64ApiKey + /// + public ElasticSearchAuthTypeEnum AuthType { get; set; } + + /// + /// Basic认证的用户名 + /// + public string User { get; set; } + + /// + /// Basic认证的密码 + /// + public string Password { get; set; } + + /// + /// ApiKey认证的ApiId + /// + public string ApiId { get; set; } + + /// + /// ApiKey认证的ApiKey + /// + public string ApiKey { get; set; } + + /// + /// Base64ApiKey认证时加密的加密字符串 + /// + public string Base64ApiKey { get; set; } + + /// + /// ES使用Https时的证书指纹,使用证书请自行实现 + /// https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/connecting.html + /// + public string Fingerprint { get; set; } + + /// + /// 地址 + /// + public List ServerUris { get; set; } = new List(); + + /// + /// 索引 + /// + public string DefaultIndex { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Option/EmailOptions.cs b/Admin.NET/Admin.NET.Core/Option/EmailOptions.cs new file mode 100644 index 0000000..10933b4 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Option/EmailOptions.cs @@ -0,0 +1,58 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 邮件配置选项 +/// +public sealed class EmailOptions : IConfigurableOptions +{ + /// + /// 主机 + /// + public string Host { get; set; } + + /// + /// 端口 + /// + public int Port { get; set; } + + /// + /// 默认发件者邮箱 + /// + public string DefaultFromEmail { get; set; } + + /// + /// 默认接收人邮箱 + /// + public string DefaultToEmail { get; set; } + + /// + /// 启用SSL + /// + public bool EnableSsl { get; set; } + + ///// + ///// 是否使用默认凭据 + ///// + //public bool UseDefaultCredentials { get; set; } + + /// + /// 邮箱账号 + /// + public string UserName { get; set; } + + /// + /// 邮箱密码 + /// + public string Password { get; set; } + + /// + /// 默认邮件标题 + /// + public string DefaultFromName { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Option/EnumOptions.cs b/Admin.NET/Admin.NET.Core/Option/EnumOptions.cs new file mode 100644 index 0000000..2da8992 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Option/EnumOptions.cs @@ -0,0 +1,18 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 枚举配置选项 +/// +public sealed class EnumOptions : IConfigurableOptions +{ + /// + /// 枚举实体程序集名称集合 + /// + public List EntityAssemblyNames { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Option/EventBusOptions.cs b/Admin.NET/Admin.NET.Core/Option/EventBusOptions.cs new file mode 100644 index 0000000..45e7261 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Option/EventBusOptions.cs @@ -0,0 +1,44 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 事件总线配置选项 +/// +public sealed class EventBusOptions : IConfigurableOptions +{ + /// + /// RabbitMQ + /// + public RabbitMQSettings RabbitMQ { get; set; } +} + +/// +/// RabbitMQ +/// +public sealed class RabbitMQSettings +{ + /// + /// 账号 + /// + public string UserName { get; set; } + + /// + /// 密码 + /// + public string Password { get; set; } + + /// + /// 主机 + /// + public string HostName { get; set; } + + /// + /// 端口 + /// + public int Port { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Option/OAuthOptions.cs b/Admin.NET/Admin.NET.Core/Option/OAuthOptions.cs new file mode 100644 index 0000000..419e588 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Option/OAuthOptions.cs @@ -0,0 +1,29 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 第三方登录授权配置选项 +/// +public sealed class OAuthOptions : IConfigurableOptions +{ + /// + /// Weixin配置 + /// + public Microsoft.AspNetCore.Authentication.OAuth.OAuthOptions Weixin { get; set; } + + /// + /// Gitee配置 + /// + public Microsoft.AspNetCore.Authentication.OAuth.OAuthOptions Gitee { get; set; } + + /// + /// 自有服务配置 + /// + public Microsoft.AspNetCore.Authentication.OAuth.OAuthOptions SSO { get; set; } + +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Option/PayCallBackOptions.cs b/Admin.NET/Admin.NET.Core/Option/PayCallBackOptions.cs new file mode 100644 index 0000000..b110fd0 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Option/PayCallBackOptions.cs @@ -0,0 +1,33 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 支付回调配置选项 +/// +public sealed class PayCallBackOptions : IConfigurableOptions +{ + /// + /// 微信支付回调 + /// + public string WechatPayUrl { get; set; } + + /// + /// 微信退款回调 + /// + public string WechatRefundUrl { get; set; } + + /// + /// 支付宝支付回调 + /// + public string AlipayUrl { get; set; } + + /// + /// 支付宝退款回调 + /// + public string AlipayRefundUrl { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Option/RateLimitOptions.cs b/Admin.NET/Admin.NET.Core/Option/RateLimitOptions.cs new file mode 100644 index 0000000..057166a --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Option/RateLimitOptions.cs @@ -0,0 +1,37 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using AspNetCoreRateLimit; + +namespace Admin.NET.Core; + +/// +/// IP限流配置选项 +/// +public sealed class IpRateLimitingOptions : IpRateLimitOptions +{ +} + +/// +/// IP限流策略配置选项 +/// +public sealed class IpRateLimitPoliciesOptions : IpRateLimitPolicies, IConfigurableOptions +{ +} + +/// +/// 客户端限流配置选项 +/// +public sealed class ClientRateLimitingOptions : ClientRateLimitOptions, IConfigurableOptions +{ +} + +/// +/// 客户端限流策略配置选项 +/// +public sealed class ClientRateLimitPoliciesOptions : ClientRateLimitPolicies, IConfigurableOptions +{ +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Option/SMSOptions.cs b/Admin.NET/Admin.NET.Core/Option/SMSOptions.cs new file mode 100644 index 0000000..6d27683 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Option/SMSOptions.cs @@ -0,0 +1,41 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 短信配置选项 +/// +public sealed class SMSOptions : IConfigurableOptions +{ + /// + /// Aliyun + /// + public SMSSettings Aliyun { get; set; } +} + +public sealed class SMSSettings +{ + /// + /// AccessKey ID + /// + public string AccessKeyId { get; set; } + + /// + /// AccessKey Secret + /// + public string AccessKeySecret { get; set; } + + /// + /// 短信签名 + /// + public string SignName { get; set; } + + /// + /// 短信模板 + /// + public string TemplateCode { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Option/SnowIdOptions.cs b/Admin.NET/Admin.NET.Core/Option/SnowIdOptions.cs new file mode 100644 index 0000000..07b2b53 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Option/SnowIdOptions.cs @@ -0,0 +1,18 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 雪花Id配置选项 +/// +public sealed class SnowIdOptions : IdGeneratorOptions, IConfigurableOptions +{ + /// + /// 缓存前缀 + /// + public string WorkerPrefix { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Option/UploadOptions.cs b/Admin.NET/Admin.NET.Core/Option/UploadOptions.cs new file mode 100644 index 0000000..83615d6 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Option/UploadOptions.cs @@ -0,0 +1,53 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using OnceMi.AspNetCore.OSS; + +namespace Admin.NET.Core; + +/// +/// 文件上传配置选项 +/// +public sealed class UploadOptions : IConfigurableOptions +{ + /// + /// 路径 + /// + public string Path { get; set; } + + /// + /// 大小 + /// + public long MaxSize { get; set; } + + /// + /// 上传格式 + /// + public List ContentType { get; set; } + + /// + /// 启用文件MD5验证 + /// + /// 防止重复上传 + public bool EnableMd5 { get; set; } +} + +/// +/// 对象存储配置选项 +/// +public sealed class OSSProviderOptions : OSSOptions, IConfigurableOptions +{ + /// + /// 是否启用OSS存储 + /// + public bool IsEnable { get; set; } + + /// + /// 自定义桶名称 不能直接使用Provider来替代桶名称 + /// 例:阿里云 1.只能包括小写字母,数字,短横线(-)2.必须以小写字母或者数字开头 3.长度必须在3-63字节之间 + /// + public string Bucket { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Option/WechatOptions.cs b/Admin.NET/Admin.NET.Core/Option/WechatOptions.cs new file mode 100644 index 0000000..1c47b6d --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Option/WechatOptions.cs @@ -0,0 +1,43 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 微信相关配置选项 +/// +public sealed class WechatOptions : IConfigurableOptions +{ + // 公众号 + public string WechatAppId { get; set; } + + public string WechatAppSecret { get; set; } + + /// + /// 微信公众号服务器配置中的令牌(Token) + /// + public string WechatToken { get; set; } + + /// + /// 微信公众号服务器配置中的消息加解密密钥(EncodingAESKey) + /// + public string WechatEncodingAESKey { get; set; } + + // 小程序 + public string WxOpenAppId { get; set; } + + public string WxOpenAppSecret { get; set; } + + /// + /// 小程序消息推送中的令牌(Token) + /// + public string WxToken { get; set; } + + /// + /// 小程序消息推送中的消息加解密密钥(EncodingAESKey) + /// + public string WxEncodingAESKey { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Option/WechatPayOptions.cs b/Admin.NET/Admin.NET.Core/Option/WechatPayOptions.cs new file mode 100644 index 0000000..cca5bb6 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Option/WechatPayOptions.cs @@ -0,0 +1,18 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 微信支付配置选项 +/// +public sealed class WechatPayOptions : WechatTenpayClientOptions, IConfigurableOptions +{ + /// + /// 微信公众平台AppId、开放平台AppId、小程序AppId、企业微信CorpId + /// + public string AppId { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SeedData/SysConfigSeedData.cs b/Admin.NET/Admin.NET.Core/SeedData/SysConfigSeedData.cs new file mode 100644 index 0000000..b62d00c --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SeedData/SysConfigSeedData.cs @@ -0,0 +1,35 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统配置表种子数据 +/// +public class SysConfigSeedData : ISqlSugarEntitySeedData +{ + /// + /// 种子数据 + /// + /// + public IEnumerable HasData() + { + return new[] + { + new SysConfig{ Id=1300000000101, Name="演示环境", Code="sys_demo", Value="False", SysFlag=YesNoEnum.Y, Remark="演示环境", OrderNo=1, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysConfig{ Id=1300000000102, Name="默认密码", Code="sys_password", Value="123456", SysFlag=YesNoEnum.Y, Remark="默认密码", OrderNo=2, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysConfig{ Id=1300000000103, Name="记录操作日志", Code="sys_oplog", Value="True", SysFlag=YesNoEnum.Y, Remark="是否记录操作日志", OrderNo=3, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysConfig{ Id=1300000000104, Name="开启单设备登录", Code="sys_single_login", Value="False", SysFlag=YesNoEnum.Y, Remark="是否开启单设备登录", OrderNo=4, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysConfig{ Id=1300000000105, Name="开启登录二次验证", Code="sys_second_ver", Value="False", SysFlag=YesNoEnum.Y, Remark="是否开启登录二次验证", OrderNo=5, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysConfig{ Id=1300000000106, Name="开启图形验证码", Code="sys_captcha", Value="True", SysFlag=YesNoEnum.Y, Remark="是否开启图形验证码", OrderNo=6, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysConfig{ Id=1300000000107, Name="开启水印", Code="sys_watermark", Value="False", SysFlag=YesNoEnum.Y, Remark="是否开启水印", OrderNo=7, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysConfig{ Id=1300000000108, Name="Token过期时间", Code="sys_token_expire", Value="10080", SysFlag=YesNoEnum.Y, Remark="Token过期时间(分钟)", OrderNo=8, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysConfig{ Id=1300000000109, Name="刷新Token过期时间", Code="sys_refresh_token_expire", Value="20160", SysFlag=YesNoEnum.Y, Remark="刷新Token过期时间(分钟)(一般 refresh_token 的有效时间 > 2 * access_token 的有效时间)", OrderNo=9, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysConfig{ Id=1300000000110, Name="发送异常日志邮件", Code="sys_error_mail", Value="True", SysFlag=YesNoEnum.Y, Remark="是否发送异常日志邮件", OrderNo=10, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysConfig{ Id=1300000000111, Name="开启域登录验证", Code="sys_domain_login", Value="False", SysFlag=YesNoEnum.Y, Remark="是否开启域登录验证", OrderNo=11, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + }; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SeedData/SysDictDataSeedData.cs b/Admin.NET/Admin.NET.Core/SeedData/SysDictDataSeedData.cs new file mode 100644 index 0000000..e7b962c --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SeedData/SysDictDataSeedData.cs @@ -0,0 +1,80 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统字典值表种子数据 +/// +public class SysDictDataSeedData : ISqlSugarEntitySeedData +{ + /// + /// 种子数据 + /// + /// + public IEnumerable HasData() + { + return new[] + { + new SysDictData{ Id=1300000000101, DictTypeId=1300000000101, Value="输入框", Code="Input", OrderNo=100, Remark="输入框", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000102, DictTypeId=1300000000101, Value="外键", Code="fk", OrderNo=100, Remark="外键", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000103, DictTypeId=1300000000101, Value="时间选择", Code="DatePicker", OrderNo=100, Remark="时间选择", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000104, DictTypeId=1300000000101, Value="选择器", Code="Select", OrderNo=100, Remark="选择器", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000105, DictTypeId=1300000000101, Value="数字输入框", Code="InputNumber", OrderNo=100, Remark="数字输入框", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000106, DictTypeId=1300000000101, Value="文本域", Code="InputTextArea", OrderNo=100, Remark="文本域", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000107, DictTypeId=1300000000101, Value="上传", Code="Upload", OrderNo=100, Remark="上传", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000108, DictTypeId=1300000000101, Value="树选择", Code="ApiTreeSelect", OrderNo=100, Remark="树选择", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000109, DictTypeId=1300000000101, Value="开关", Code="Switch", OrderNo=100, Remark="开关", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000110, DictTypeId=1300000000101, Value="常量选择器", Code="ConstSelector", OrderNo=100, Remark="常量选择器", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000111, DictTypeId=1300000000101, Value="枚举选择器", Code="EnumSelector", OrderNo=100, Remark="枚举选择器", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + + new SysDictData{ Id=1300000000201, DictTypeId=1300000000102, Value="等于", Code="==", OrderNo=1, Remark="等于", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000202, DictTypeId=1300000000102, Value="模糊", Code="like", OrderNo=1, Remark="模糊", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000203, DictTypeId=1300000000102, Value="大于", Code=">", OrderNo=1, Remark="大于", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000204, DictTypeId=1300000000102, Value="小于", Code="<", OrderNo=1, Remark="小于", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000205, DictTypeId=1300000000102, Value="不等于", Code="!=", OrderNo=1, Remark="不等于", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000206, DictTypeId=1300000000102, Value="大于等于", Code=">=", OrderNo=1, Remark="大于等于", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000207, DictTypeId=1300000000102, Value="小于等于", Code="<=", OrderNo=1, Remark="小于等于", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000208, DictTypeId=1300000000102, Value="不为空", Code="isNotNull", OrderNo=1, Remark="不为空", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000209, DictTypeId=1300000000102, Value="时间范围", Code="~", OrderNo=1, Remark="时间范围", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + + new SysDictData{ Id=1300000000301, DictTypeId=1300000000103, Value="long", Code="long", OrderNo=1, Remark="long", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000302, DictTypeId=1300000000103, Value="string", Code="string", OrderNo=1, Remark="string", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000303, DictTypeId=1300000000103, Value="DateTime", Code="DateTime", OrderNo=1, Remark="DateTime", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000304, DictTypeId=1300000000103, Value="bool", Code="bool", OrderNo=1, Remark="bool", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000305, DictTypeId=1300000000103, Value="int", Code="int", OrderNo=1, Remark="int", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000306, DictTypeId=1300000000103, Value="double", Code="double", OrderNo=1, Remark="double", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000307, DictTypeId=1300000000103, Value="float", Code="float", OrderNo=1, Remark="float", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000308, DictTypeId=1300000000103, Value="decimal", Code="decimal", OrderNo=1, Remark="decimal", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000309, DictTypeId=1300000000103, Value="Guid", Code="Guid", OrderNo=1, Remark="Guid", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000310, DictTypeId=1300000000103, Value="DateTimeOffset", Code="DateTimeOffset", OrderNo=1, Remark="DateTimeOffset", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + + new SysDictData{ Id=1300000000401, DictTypeId=1300000000104, Value="下载压缩包", Code="100", OrderNo=1, Remark="下载压缩包", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000402, DictTypeId=1300000000104, Value="下载压缩包(前端)", Code="111", OrderNo=2, Remark="下载压缩包(前端)", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000403, DictTypeId=1300000000104, Value="下载压缩包(后端)", Code="121", OrderNo=3, Remark="下载压缩包(后端)", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000404, DictTypeId=1300000000104, Value="生成到本项目", Code="200", OrderNo=4, Remark="生成到本项目", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000405, DictTypeId=1300000000104, Value="生成到本项目(前端)", Code="211", OrderNo=5, Remark="生成到本项目(前端)", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000406, DictTypeId=1300000000104, Value="生成到本项目(后端)", Code="221", OrderNo=6, Remark="生成到本项目(后端)", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + + new SysDictData{ Id=1300000000501, DictTypeId=1300000000105, Value="EntityBaseId【基础实体Id】", Code="EntityBaseId", OrderNo=1, Remark="【基础实体Id】", Status=StatusEnum.Disable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000502, DictTypeId=1300000000105, Value="EntityBase【基础实体】", Code="EntityBase", OrderNo=1, Remark="【基础实体】", Status=StatusEnum.Disable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000503, DictTypeId=1300000000105, Value="EntityTenantId【租户实体Id】", Code="EntityTenantId", OrderNo=1, Remark="【租户实体Id】", Status=StatusEnum.Disable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000504, DictTypeId=1300000000105, Value="EntityTenant【租户实体】", Code="EntityTenant", OrderNo=1, Remark="【租户实体】", Status=StatusEnum.Disable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000505, DictTypeId=1300000000105, Value="EntityBaseData【业务实体】", Code="EntityBaseData", OrderNo=1, Remark="【业务实体】", Status=StatusEnum.Disable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000506, DictTypeId=1300000000105, Value="EntityTenantBaseData【租户业务实体】", Code="EntityTenantBaseData", OrderNo=1, Remark="【租户业务实体】", Status=StatusEnum.Disable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictData{ Id=1300000000507, DictTypeId=1300000000105, Value="无基类", Code="", OrderNo=1, Remark="【无基类】", Status=StatusEnum.Disable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + + new SysDictData{ Id=1300000000601, DictTypeId=1300000000106, Value="不需要", Code="off", OrderNo=100, Remark="不需要打印支持", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2023-12-04 00:00:00") }, + new SysDictData{ Id=1300000000602, DictTypeId=1300000000106, Value="绑定打印模版", Code="custom", OrderNo=101, Remark="绑定打印模版", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2023-12-04 00:00:00") }, + + new SysDictData{ Id=1300000000701, DictTypeId=1300000000201, Value="集团", Code="101", OrderNo=100, Remark="集团", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2023-02-10 00:00:00") }, + new SysDictData{ Id=1300000000702, DictTypeId=1300000000201, Value="公司", Code="201", OrderNo=101, Remark="公司", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2023-02-10 00:00:00") }, + new SysDictData{ Id=1300000000703, DictTypeId=1300000000201, Value="部门", Code="301", OrderNo=102, Remark="部门", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2023-02-10 00:00:00") }, + new SysDictData{ Id=1300000000704, DictTypeId=1300000000201, Value="区域", Code="401", OrderNo=103, Remark="区域", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2023-02-10 00:00:00") }, + new SysDictData{ Id=1300000000705, DictTypeId=1300000000201, Value="组", Code="501", OrderNo=104, Remark="组", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2023-02-10 00:00:00") }, + }; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SeedData/SysDictTypeSeedData.cs b/Admin.NET/Admin.NET.Core/SeedData/SysDictTypeSeedData.cs new file mode 100644 index 0000000..9117084 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SeedData/SysDictTypeSeedData.cs @@ -0,0 +1,31 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统字典类型表种子数据 +/// +public class SysDictTypeSeedData : ISqlSugarEntitySeedData +{ + /// + /// 种子数据 + /// + /// + public IEnumerable HasData() + { + return new[] + { + new SysDictType{ Id=1300000000101, Name="代码生成控件类型", Code="code_gen_effect_type", OrderNo=100, Remark="代码生成控件类型", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictType{ Id=1300000000102, Name="代码生成查询类型", Code="code_gen_query_type", OrderNo=101, Remark="代码生成查询类型", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictType{ Id=1300000000103, Name="代码生成.NET类型", Code="code_gen_net_type", OrderNo=102, Remark="代码生成.NET类型", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictType{ Id=1300000000104, Name="代码生成方式", Code="code_gen_create_type", OrderNo=103, Remark="代码生成方式", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictType{ Id=1300000000105, Name="代码生成基类", Code="code_gen_base_class", OrderNo=104, Remark="代码生成基类", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + new SysDictType{ Id=1300000000106, Name="代码生成打印类型", Code="code_gen_print_type", OrderNo=105, Remark="代码生成打印类型", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2023-12-04 00:00:00") }, + new SysDictType{ Id=1300000000201, Name="机构类型", Code="org_type", OrderNo=201, Remark="机构类型", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2023-02-10 00:00:00") }, + }; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SeedData/SysMenuSeedData.cs b/Admin.NET/Admin.NET.Core/SeedData/SysMenuSeedData.cs new file mode 100644 index 0000000..6d782b6 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SeedData/SysMenuSeedData.cs @@ -0,0 +1,194 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统菜单表种子数据 +/// +public class SysMenuSeedData : ISqlSugarEntitySeedData +{ + /// + /// 种子数据 + /// + /// + public IEnumerable HasData() + { + return new[] + { + new SysMenu{ Id=1300000000101, Pid=0, Title="工作台", Path="/dashboard", Name="dashboard", Component="Layout", Icon="ele-HomeFilled", Type=MenuTypeEnum.Dir, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=0 }, + new SysMenu{ Id=1300000000111, Pid=1300000000101, Title="工作台", Path="/dashboard/home", Name="home", Component="/home/index", IsAffix=true, Icon="ele-HomeFilled", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1300000000121, Pid=1300000000101, Title="站内信", Path="/dashboard/notice", Name="notice", Component="/home/notice/index", Icon="ele-Bell", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=101 }, + + // 建议此处Id范围之间放置具体业务应用菜单 + + new SysMenu{ Id=1310000000101, Pid=0, Title="系统管理", Path="/system", Name="system", Component="Layout", Icon="ele-Setting", Type=MenuTypeEnum.Dir, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=10000 }, + + new SysMenu{ Id=1310000000111, Pid=1310000000101, Title="账号管理", Path="/system/user", Name="sysUser", Component="/system/user/index", Icon="ele-User", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000112, Pid=1310000000111, Title="查询", Permission="sysUser:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000113, Pid=1310000000111, Title="编辑", Permission="sysUser:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000114, Pid=1310000000111, Title="增加", Permission="sysUser:add", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000115, Pid=1310000000111, Title="删除", Permission="sysUser:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000116, Pid=1310000000111, Title="详情", Permission="sysUser:detail", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000117, Pid=1310000000111, Title="授权角色", Permission="sysUser:grantRole", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000118, Pid=1310000000111, Title="重置密码", Permission="sysUser:resetPwd", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000119, Pid=1310000000111, Title="设置状态", Permission="sysUser:setStatus", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000120, Pid=1310000000111, Title="强制下线", Permission="sysOnlineUser:forceOffline", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000121, Pid=1310000000111, Title="解除锁定", Permission="sysUser:unlockLogin", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + + new SysMenu{ Id=1310000000131, Pid=1310000000101, Title="角色管理", Path="/system/role", Name="sysRole", Component="/system/role/index", Icon="ele-Help", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=110 }, + new SysMenu{ Id=1310000000132, Pid=1310000000131, Title="查询", Permission="sysRole:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000133, Pid=1310000000131, Title="编辑", Permission="sysRole:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000134, Pid=1310000000131, Title="增加", Permission="sysRole:add", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000135, Pid=1310000000131, Title="删除", Permission="sysRole:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000136, Pid=1310000000131, Title="授权菜单", Permission="sysRole:grantMenu", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000137, Pid=1310000000131, Title="授权数据", Permission="sysRole:grantDataScope", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000138, Pid=1310000000131, Title="设置状态", Permission="sysRole:setStatus", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + + new SysMenu{ Id=1310000000141, Pid=1310000000101, Title="机构管理", Path="/system/org", Name="sysOrg", Component="/system/org/index", Icon="ele-OfficeBuilding", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=120 }, + //new SysMenu{ Id=1310000000142, Pid=1310000000141, Title="查询", Permission="sysOrg:list", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000143, Pid=1310000000141, Title="编辑", Permission="sysOrg:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000144, Pid=1310000000141, Title="增加", Permission="sysOrg:add", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000145, Pid=1310000000141, Title="删除", Permission="sysOrg:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + + new SysMenu{ Id=1310000000151, Pid=1310000000101, Title="职位管理", Path="/system/pos", Name="sysPos", Component="/system/pos/index",Icon="ele-Mug", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=130 }, + new SysMenu{ Id=1310000000152, Pid=1310000000151, Title="查询", Permission="sysPos:list", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000153, Pid=1310000000151, Title="编辑", Permission="sysPos:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000154, Pid=1310000000151, Title="增加", Permission="sysPos:add", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000155, Pid=1310000000151, Title="删除", Permission="sysPos:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + + new SysMenu{ Id=1310000000161, Pid=1310000000101, Title="个人中心", Path="/system/userCenter", Name="sysUserCenter", Component="/system/user/component/userCenter",Icon="ele-Medal", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=140 }, + new SysMenu{ Id=1310000000162, Pid=1310000000161, Title="修改密码", Permission="sysUser:changePwd", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000163, Pid=1310000000161, Title="基本信息", Permission="sysUser:baseInfo", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000164, Pid=1310000000161, Title="电子签名", Permission="sysFile:uploadSignature", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000165, Pid=1310000000161, Title="上传头像", Permission="sysFile:uploadAvatar", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + + new SysMenu{ Id=1310000000171, Pid=1310000000101, Title="通知公告", Path="/system/notice", Name="sysNotice", Component="/system/notice/index",Icon="ele-Bell", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=150 }, + new SysMenu{ Id=1310000000172, Pid=1310000000171, Title="查询", Permission="sysNotice:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000173, Pid=1310000000171, Title="编辑", Permission="sysNotice:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000174, Pid=1310000000171, Title="增加", Permission="sysNotice:add", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000175, Pid=1310000000171, Title="删除", Permission="sysNotice:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000176, Pid=1310000000171, Title="发布", Permission="sysNotice:public", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000177, Pid=1310000000171, Title="撤回", Permission="sysNotice:cancel", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + + new SysMenu{ Id=1310000000181, Pid=1310000000101, Title="三方账号", Path="/system/weChatUser", Name="sysWechatUser", Component="/system/weChatUser/index",Icon="ele-ChatDotRound", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=160 }, + new SysMenu{ Id=1310000000182, Pid=1310000000181, Title="查询", Permission="sysWechatUser:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000183, Pid=1310000000181, Title="编辑", Permission="sysWechatUser:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000184, Pid=1310000000181, Title="增加", Permission="sysWechatUser:add", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000185, Pid=1310000000181, Title="删除", Permission="sysWechatUser:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + + new SysMenu{ Id=1310000000191, Pid=1310000000101, Title="AD域配置", Path="/system/ldap", Name="sysLdap", Component="/system/ldap/index",Icon="ele-Place", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=170 }, + new SysMenu{ Id=1310000000192, Pid=1310000000191, Title="查询", Permission="sysLdap:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000193, Pid=1310000000191, Title="详情", Permission="sysLdap:detail", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=110 }, + new SysMenu{ Id=1310000000194, Pid=1310000000191, Title="编辑", Permission="sysLdap:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=120 }, + new SysMenu{ Id=1310000000195, Pid=1310000000191, Title="增加", Permission="sysLdap:add", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=130 }, + new SysMenu{ Id=1310000000196, Pid=1310000000191, Title="删除", Permission="sysLdap:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=140 }, + new SysMenu{ Id=1310000000197, Pid=1310000000191, Title="同步域账户", Permission="sysLdap:syncUser", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=150 }, + new SysMenu{ Id=1310000000198, Pid=1310000000191, Title="同步域组织", Permission="sysLdap:syncOrg", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=160 }, + + new SysMenu{ Id=1310000000301, Pid=0, Title="平台管理", Path="/platform", Name="platform", Component="Layout", Icon="ele-Menu", Type=MenuTypeEnum.Dir, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=11000 }, + + new SysMenu{ Id=1310000000311, Pid=1310000000301, Title="租户管理", Path="/platform/tenant", Name="sysTenant", Component="/system/tenant/index", Icon="ele-School", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000312, Pid=1310000000311, Title="查询", Permission="sysTenant:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000313, Pid=1310000000311, Title="编辑", Permission="sysTenant:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000314, Pid=1310000000311, Title="增加", Permission="sysTenant:add", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000315, Pid=1310000000311, Title="删除", Permission="sysTenant:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000316, Pid=1310000000311, Title="授权菜单", Permission="sysTenant:grantMenu", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000317, Pid=1310000000311, Title="重置密码", Permission="sysTenant:resetPwd", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000318, Pid=1310000000311, Title="生成库", Permission="sysTenant:createDb", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000319, Pid=1310000000311, Title="设置状态", Permission="sysTenant:setStatus", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + + new SysMenu{ Id=1310000000321, Pid=1310000000301, Title="菜单管理", Path="/platform/menu", Name="sysMenu", Component="/system/menu/index", Icon="ele-Menu", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=110 }, + new SysMenu{ Id=1310000000322, Pid=1310000000321, Title="查询", Permission="sysMenu:list", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000323, Pid=1310000000321, Title="编辑", Permission="sysMenu:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000324, Pid=1310000000321, Title="增加", Permission="sysMenu:add", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000325, Pid=1310000000321, Title="删除", Permission="sysMenu:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + + new SysMenu{ Id=1310000000331, Pid=1310000000301, Title="参数配置", Path="/platform/config", Name="sysConfig", Component="/system/config/index", Icon="ele-DocumentCopy", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=120 }, + new SysMenu{ Id=1310000000332, Pid=1310000000331, Title="查询", Permission="sysConfig:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000333, Pid=1310000000331, Title="编辑", Permission="sysConfig:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000334, Pid=1310000000331, Title="增加", Permission="sysConfig:add", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000335, Pid=1310000000331, Title="删除", Permission="sysConfig:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + + new SysMenu{ Id=1310000000341, Pid=1310000000301, Title="字典管理", Path="/platform/dict", Name="sysDict", Component="/system/dict/index", Icon="ele-Collection", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=130 }, + new SysMenu{ Id=1310000000342, Pid=1310000000341, Title="查询", Permission="sysDictType:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000343, Pid=1310000000341, Title="编辑", Permission="sysDictType:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000344, Pid=1310000000341, Title="增加", Permission="sysDictType:add", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000345, Pid=1310000000341, Title="删除", Permission="sysDictType:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + + new SysMenu{ Id=1310000000351, Pid=1310000000301, Title="任务调度", Path="/platform/job", Name="sysJob", Component="/system/job/index", Icon="ele-AlarmClock", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=140 }, + new SysMenu{ Id=1310000000352, Pid=1310000000351, Title="查询", Permission="sysJob:pageJobDetail", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000353, Pid=1310000000351, Title="编辑", Permission="sysJob:updateJobDetail", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000354, Pid=1310000000351, Title="增加", Permission="sysJob:addJobDetail", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000355, Pid=1310000000351, Title="删除", Permission="sysJob:deleteJobDetail", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + + new SysMenu{ Id=1310000000361, Pid=1310000000301, Title="系统监控", Path="/platform/server", Name="sysServer", Component="/system/server/index", Icon="ele-Monitor", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=150 }, + + new SysMenu{ Id=1310000000371, Pid=1310000000301, Title="缓存管理", Path="/platform/cache", Name="sysCache", Component="/system/cache/index", Icon="ele-Loading", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=160 }, + new SysMenu{ Id=1310000000372, Pid=1310000000371, Title="查询", Permission="sysCache:keyList", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000373, Pid=1310000000371, Title="删除", Permission="sysCache:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + + new SysMenu{ Id=1310000000381, Pid=1310000000301, Title="行政区域", Path="/platform/region", Name="sysRegion", Component="/system/region/index", Icon="ele-LocationInformation", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=170 }, + new SysMenu{ Id=1310000000382, Pid=1310000000381, Title="查询", Permission="sysRegion:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000383, Pid=1310000000381, Title="编辑", Permission="sysRegion:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000384, Pid=1310000000381, Title="增加", Permission="sysRegion:add", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000385, Pid=1310000000381, Title="删除", Permission="sysRegion:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000386, Pid=1310000000381, Title="同步", Permission="sysRegion:sync", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + + new SysMenu{ Id=1310000000391, Pid=1310000000301, Title="文件管理", Path="/platform/file", Name="sysFile", Component="/system/file/index", Icon="ele-Document", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=180 }, + new SysMenu{ Id=1310000000392, Pid=1310000000391, Title="查询", Permission="sysFile:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000393, Pid=1310000000391, Title="上传", Permission="sysFile:uploadFile", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000394, Pid=1310000000391, Title="下载", Permission="sysFile:downloadFile", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000395, Pid=1310000000391, Title="删除", Permission="sysFile:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000396, Pid=1310000000391, Title="编辑", Permission="sysFile:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2023-10-27 00:00:00"), OrderNo=100 }, + + new SysMenu{ Id=1310000000401, Pid=1310000000301, Title="打印模板", Path="/platform/print", Name="sysPrint", Component="/system/print/index", Icon="ele-Printer", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=190 }, + new SysMenu{ Id=1310000000402, Pid=1310000000401, Title="查询", Permission="sysPrint:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000403, Pid=1310000000401, Title="编辑", Permission="sysPrint:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000404, Pid=1310000000401, Title="增加", Permission="sysPrint:add", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000405, Pid=1310000000401, Title="删除", Permission="sysPrint:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + + new SysMenu{ Id=1310000000411, Pid=1310000000301, Title="动态插件", Path="/platform/plugin", Name="sysPlugin", Component="/system/plugin/index", Icon="ele-Connection", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=200 }, + new SysMenu{ Id=1310000000412, Pid=1310000000411, Title="查询", Permission="sysPlugin:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000413, Pid=1310000000411, Title="编辑", Permission="sysPlugin:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000414, Pid=1310000000411, Title="增加", Permission="sysPlugin:add", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000415, Pid=1310000000411, Title="删除", Permission="sysPlugin:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + + new SysMenu{ Id=1310000000421, Pid=1310000000301, Title="开放接口", Path="/platform/openAccess", Name="sysOpenAccess", Component="/system/openAccess/index", Icon="ele-Link", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=210 }, + new SysMenu{ Id=1310000000422, Pid=1310000000421, Title="查询", Permission="sysOpenAccess:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000423, Pid=1310000000421, Title="编辑", Permission="sysOpenAccess:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000424, Pid=1310000000421, Title="增加", Permission="sysOpenAccess:add", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000425, Pid=1310000000421, Title="删除", Permission="sysOpenAccess:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + + new SysMenu{ Id=1310000000501, Pid=0, Title="日志管理", Path="/log", Name="log", Component="Layout", Icon="ele-DocumentCopy", Type=MenuTypeEnum.Dir, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=12000 }, + new SysMenu{ Id=1310000000511, Pid=1310000000501, Title="访问日志", Path="/log/vislog", Name="sysVisLog", Component="/system/log/vislog/index", Icon="ele-Document", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000512, Pid=1310000000511, Title="查询", Permission="sysVislog:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000513, Pid=1310000000511, Title="清空", Permission="sysVislog:clear", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000521, Pid=1310000000501, Title="操作日志", Path="/log/oplog", Name="sysOpLog", Component="/system/log/oplog/index", Icon="ele-Document", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=110 }, + new SysMenu{ Id=1310000000522, Pid=1310000000521, Title="查询", Permission="sysOplog:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000523, Pid=1310000000521, Title="清空", Permission="sysOplog:clear", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000524, Pid=1310000000521, Title="导出", Permission="sysOplog:export", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000531, Pid=1310000000501, Title="异常日志", Path="/log/exlog", Name="sysExLog", Component="/system/log/exlog/index", Icon="ele-Document", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=120 }, + new SysMenu{ Id=1310000000532, Pid=1310000000531, Title="查询", Permission="sysExlog:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000533, Pid=1310000000531, Title="清空", Permission="sysExlog:clear", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000534, Pid=1310000000531, Title="导出", Permission="sysExlog:export", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000541, Pid=1310000000501, Title="差异日志", Path="/log/difflog", Name="sysDiffLog", Component="/system/log/difflog/index", Icon="ele-Document", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=130 }, + new SysMenu{ Id=1310000000542, Pid=1310000000541, Title="查询", Permission="sysDifflog:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000543, Pid=1310000000541, Title="清空", Permission="sysDifflog:clear", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + + new SysMenu{ Id=1310000000601, Pid=0, Title="开发工具", Path="/develop", Name="develop", Component="Layout", Icon="ele-Cpu", Type=MenuTypeEnum.Dir, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=13000 }, + new SysMenu{ Id=1310000000611, Pid=1310000000601, Title="库表管理", Path="/develop/database", Name="sysDatabase", Component="/system/database/index",Icon="ele-Coin", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000621, Pid=1310000000601, Title="代码生成", Path="/develop/codeGen", Name="sysCodeGen", Component="/system/codeGen/index", Icon="ele-Crop", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=110 }, + new SysMenu{ Id=1310000000631, Pid=1310000000601, Title="表单设计", Path="/develop/formDes", Name="sysFormDes", Component="/system/formDes/index", Icon="ele-Edit", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=120 }, + new SysMenu{ Id=1310000000641, Pid=1310000000601, Title="系统接口", Path="/develop/api", Name="sysApi", Component="layout/routerView/iframe", IsIframe=true, OutLink="http://localhost:5005", Icon="ele-Help", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=130 }, + + new SysMenu{ Id=1310000000701, Pid=0, Title="帮助文档", Path="/doc", Name="doc", Component="Layout", Icon="ele-Notebook", Type=MenuTypeEnum.Dir, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=14000 }, + new SysMenu{ Id=1310000000711, Pid=1310000000701, Title="后台教程", Path="/doc/furion", Name="sysFurion", Component="layout/routerView/link", IsIframe=false, IsKeepAlive=false, OutLink="https://furion.baiqian.ltd/", Icon="ele-Promotion", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 }, + new SysMenu{ Id=1310000000712, Pid=1310000000701, Title="前端教程", Path="/doc/element", Name="sysElement", Component="layout/routerView/link", IsIframe=false, IsKeepAlive=false, OutLink="https://element-plus.gitee.io/zh-CN/", Icon="ele-Position", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=110 }, + new SysMenu{ Id=1310000000713, Pid=1310000000701, Title="SqlSugar", Path="/doc/SqlSugar", Name="sysSqlSugar", Component="layout/routerView/link", IsIframe=false, IsKeepAlive=false, OutLink="https://www.donet5.com/Home/Doc", Icon="ele-Coin", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=120 }, + }; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SeedData/SysOrgSeedData.cs b/Admin.NET/Admin.NET.Core/SeedData/SysOrgSeedData.cs new file mode 100644 index 0000000..0113eb7 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SeedData/SysOrgSeedData.cs @@ -0,0 +1,40 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统机构表种子数据 +/// +public class SysOrgSeedData : ISqlSugarEntitySeedData +{ + /// + /// 种子数据 + /// + /// + public IEnumerable HasData() + { + return new[] + { + new SysOrg{ Id=1300000000101, Pid=0, Name="XXX公司", Code="1001", Type="101", Level=1, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="XXX公司", TenantId=1300000000001 }, + new SysOrg{ Id=1300000000102, Pid=1300000000101, Name="市场部", Code="100101", Level=2, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="市场部", TenantId=1300000000001 }, + new SysOrg{ Id=1300000000103, Pid=1300000000101, Name="研发部", Code="100102", Level=2, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="研发部", TenantId=1300000000001 }, + new SysOrg{ Id=1300000000104, Pid=1300000000101, Name="财务部", Code="100103", Level=2, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="财务部", TenantId=1300000000001 }, + new SysOrg{ Id=1300000000105, Pid=1300000000104, Name="财务部1", Code="10010301", Level=3, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="财务部1", TenantId=1300000000001 }, + new SysOrg{ Id=1300000000106, Pid=1300000000104, Name="财务部2", Code="10010302", Level=3, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="财务部2", TenantId=1300000000001 }, + + new SysOrg{ Id=1300000000201, Pid=0, Name="分公司1", Code="1002", Type="201", Level=1, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="分公司1", TenantId=1300000000001 }, + new SysOrg{ Id=1300000000202, Pid=1300000000201, Name="市场部", Code="100201", Level=2, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="市场部", TenantId=1300000000001 }, + new SysOrg{ Id=1300000000203, Pid=1300000000201, Name="研发部", Code="100202", Level=2, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="研发部", TenantId=1300000000001 }, + new SysOrg{ Id=1300000000204, Pid=1300000000201, Name="财务部", Code="100203", Level=2, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="财务部", TenantId=1300000000001 }, + + new SysOrg{ Id=1300000000301, Pid=0, Name="分公司2", Code="1003", Type="201", Level=1, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="分公司2", TenantId=1300000000001 }, + new SysOrg{ Id=1300000000302, Pid=1300000000301, Name="市场部", Code="100301", Level=2, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="市场部", TenantId=1300000000001 }, + new SysOrg{ Id=1300000000303, Pid=1300000000301, Name="研发部", Code="100302", Level=2, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="市场部", TenantId=1300000000001 }, + new SysOrg{ Id=1300000000304, Pid=1300000000301, Name="财务部", Code="100303", Level=2, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="市场部", TenantId=1300000000001 }, + }; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SeedData/SysPosSeedData.cs b/Admin.NET/Admin.NET.Core/SeedData/SysPosSeedData.cs new file mode 100644 index 0000000..5626c26 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SeedData/SysPosSeedData.cs @@ -0,0 +1,40 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统职位表种子数据 +/// +public class SysPosSeedData : ISqlSugarEntitySeedData +{ + /// + /// 种子数据 + /// + /// + public IEnumerable HasData() + { + return new[] + { + new SysPos{ Id=1300000000101, Name="党委书记", Code="dwsj", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="党委书记", TenantId=1300000000001 }, + new SysPos{ Id=1300000000102, Name="董事长", Code="dsz", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="董事长", TenantId=1300000000001 }, + new SysPos{ Id=1300000000103, Name="副董事长", Code="fdsz", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="副董事长", TenantId=1300000000001 }, + new SysPos{ Id=1300000000104, Name="总经理", Code="zjl", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="总经理", TenantId=1300000000001 }, + new SysPos{ Id=1300000000105, Name="副总经理", Code="fzjl", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="副总经理", TenantId=1300000000001 }, + new SysPos{ Id=1300000000106, Name="部门经理", Code="bmjl", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="部门经理", TenantId=1300000000001 }, + new SysPos{ Id=1300000000107, Name="部门副经理", Code="bmfjl", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="部门副经理", TenantId=1300000000001 }, + new SysPos{ Id=1300000000108, Name="主任", Code="zr", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="主任", TenantId=1300000000001 }, + new SysPos{ Id=1300000000109, Name="副主任", Code="fzr", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="副主任", TenantId=1300000000001 }, + new SysPos{ Id=1300000000110, Name="局长", Code="jz", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="局长", TenantId=1300000000001 }, + new SysPos{ Id=1300000000111, Name="副局长", Code="fjz", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="副局长", TenantId=1300000000001 }, + new SysPos{ Id=1300000000112, Name="科长", Code="kz", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="科长", TenantId=1300000000001 }, + new SysPos{ Id=1300000000113, Name="副科长", Code="fkz", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="副科长", TenantId=1300000000001 }, + new SysPos{ Id=1300000000114, Name="财务", Code="cw", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="财务", TenantId=1300000000001 }, + new SysPos{ Id=1300000000115, Name="职员", Code="zy", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="职员", TenantId=1300000000001 }, + new SysPos{ Id=1300000000116, Name="其他", Code="qt", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="其他", TenantId=1300000000001 }, + }; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SeedData/SysRoleMenuSeedData.cs b/Admin.NET/Admin.NET.Core/SeedData/SysRoleMenuSeedData.cs new file mode 100644 index 0000000..4b125c9 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SeedData/SysRoleMenuSeedData.cs @@ -0,0 +1,183 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统角色菜单表种子数据 +/// +public class SysRoleMenuSeedData : ISqlSugarEntitySeedData +{ + /// + /// 种子数据 + /// + /// + public IEnumerable HasData() + { + return new[] + { + // 数据面板【admin/1300000000101】 + new SysRoleMenu{ Id=1300000000101, RoleId=1300000000101, MenuId=1300000000101 }, + new SysRoleMenu{ Id=1300000000102, RoleId=1300000000101, MenuId=1300000000111 }, + new SysRoleMenu{ Id=1300000000103, RoleId=1300000000101, MenuId=1300000000121 }, + + // 系统管理 + new SysRoleMenu{ Id=1300000000111, RoleId=1300000000101, MenuId=1310000000101 }, + // 账号管理 + new SysRoleMenu{ Id=1300000000121, RoleId=1300000000101, MenuId=1310000000111 }, + new SysRoleMenu{ Id=1300000000122, RoleId=1300000000101, MenuId=1310000000112 }, + new SysRoleMenu{ Id=1300000000123, RoleId=1300000000101, MenuId=1310000000113 }, + new SysRoleMenu{ Id=1300000000124, RoleId=1300000000101, MenuId=1310000000114 }, + new SysRoleMenu{ Id=1300000000125, RoleId=1300000000101, MenuId=1310000000115 }, + new SysRoleMenu{ Id=1300000000126, RoleId=1300000000101, MenuId=1310000000116 }, + new SysRoleMenu{ Id=1300000000127, RoleId=1300000000101, MenuId=1310000000117 }, + new SysRoleMenu{ Id=1300000000128, RoleId=1300000000101, MenuId=1310000000118 }, + new SysRoleMenu{ Id=1300000000129, RoleId=1300000000101, MenuId=1310000000119 }, + new SysRoleMenu{ Id=1300000000130, RoleId=1300000000101, MenuId=1310000000120 }, + // 角色管理 + new SysRoleMenu{ Id=1300000000141, RoleId=1300000000101, MenuId=1310000000131 }, + new SysRoleMenu{ Id=1300000000142, RoleId=1300000000101, MenuId=1310000000132 }, + new SysRoleMenu{ Id=1300000000143, RoleId=1300000000101, MenuId=1310000000133 }, + new SysRoleMenu{ Id=1300000000144, RoleId=1300000000101, MenuId=1310000000134 }, + new SysRoleMenu{ Id=1300000000145, RoleId=1300000000101, MenuId=1310000000135 }, + new SysRoleMenu{ Id=1300000000146, RoleId=1300000000101, MenuId=1310000000136 }, + new SysRoleMenu{ Id=1300000000147, RoleId=1300000000101, MenuId=1310000000137 }, + new SysRoleMenu{ Id=1300000000148, RoleId=1300000000101, MenuId=1310000000138 }, + // 机构管理 + new SysRoleMenu{ Id=1300000000151, RoleId=1300000000101, MenuId=1310000000141 }, + new SysRoleMenu{ Id=1300000000152, RoleId=1300000000101, MenuId=1310000000142 }, + new SysRoleMenu{ Id=1300000000153, RoleId=1300000000101, MenuId=1310000000143 }, + new SysRoleMenu{ Id=1300000000154, RoleId=1300000000101, MenuId=1310000000144 }, + new SysRoleMenu{ Id=1300000000155, RoleId=1300000000101, MenuId=1310000000145 }, + // 职位管理 + new SysRoleMenu{ Id=1300000000161, RoleId=1300000000101, MenuId=1310000000151 }, + new SysRoleMenu{ Id=1300000000162, RoleId=1300000000101, MenuId=1310000000152 }, + new SysRoleMenu{ Id=1300000000163, RoleId=1300000000101, MenuId=1310000000153 }, + new SysRoleMenu{ Id=1300000000164, RoleId=1300000000101, MenuId=1310000000154 }, + new SysRoleMenu{ Id=1300000000165, RoleId=1300000000101, MenuId=1310000000155 }, + // 个人中心 + new SysRoleMenu{ Id=1300000000171, RoleId=1300000000101, MenuId=1310000000161 }, + new SysRoleMenu{ Id=1300000000172, RoleId=1300000000101, MenuId=1310000000162 }, + new SysRoleMenu{ Id=1300000000173, RoleId=1300000000101, MenuId=1310000000163 }, + new SysRoleMenu{ Id=1300000000174, RoleId=1300000000101, MenuId=1310000000164 }, + new SysRoleMenu{ Id=1300000000175, RoleId=1300000000101, MenuId=1310000000165 }, + // 通知公告 + new SysRoleMenu{ Id=1300000000181, RoleId=1300000000101, MenuId=1310000000171 }, + new SysRoleMenu{ Id=1300000000182, RoleId=1300000000101, MenuId=1310000000172 }, + new SysRoleMenu{ Id=1300000000183, RoleId=1300000000101, MenuId=1310000000173 }, + new SysRoleMenu{ Id=1300000000184, RoleId=1300000000101, MenuId=1310000000174 }, + new SysRoleMenu{ Id=1300000000185, RoleId=1300000000101, MenuId=1310000000175 }, + new SysRoleMenu{ Id=1300000000186, RoleId=1300000000101, MenuId=1310000000176 }, + new SysRoleMenu{ Id=1300000000187, RoleId=1300000000101, MenuId=1310000000177 }, + // 三方账号 + new SysRoleMenu{ Id=1300000000191, RoleId=1300000000101, MenuId=1310000000181 }, + new SysRoleMenu{ Id=1300000000192, RoleId=1300000000101, MenuId=1310000000182 }, + new SysRoleMenu{ Id=1300000000193, RoleId=1300000000101, MenuId=1310000000183 }, + new SysRoleMenu{ Id=1300000000194, RoleId=1300000000101, MenuId=1310000000184 }, + new SysRoleMenu{ Id=1300000000195, RoleId=1300000000101, MenuId=1310000000185 }, + + //// 平台管理 + //new SysRoleMenu{ Id=1300000000201, RoleId=1300000000101, MenuId=1310000000301 }, + // 任务调度 + new SysRoleMenu{ Id=1300000000251, RoleId=1300000000101, MenuId=1310000000351 }, + new SysRoleMenu{ Id=1300000000252, RoleId=1300000000101, MenuId=1310000000352 }, + new SysRoleMenu{ Id=1300000000253, RoleId=1300000000101, MenuId=1310000000353 }, + new SysRoleMenu{ Id=1300000000254, RoleId=1300000000101, MenuId=1310000000354 }, + new SysRoleMenu{ Id=1300000000255, RoleId=1300000000101, MenuId=1310000000355 }, + // 系统监控 + new SysRoleMenu{ Id=1300000000261, RoleId=1300000000101, MenuId=1310000000361 }, + // 缓存管理 + new SysRoleMenu{ Id=1300000000271, RoleId=1300000000101, MenuId=1310000000371 }, + new SysRoleMenu{ Id=1300000000272, RoleId=1300000000101, MenuId=1310000000372 }, + new SysRoleMenu{ Id=1300000000273, RoleId=1300000000101, MenuId=1310000000373 }, + // 行政区域 + new SysRoleMenu{ Id=1300000000281, RoleId=1300000000101, MenuId=1310000000381 }, + new SysRoleMenu{ Id=1300000000282, RoleId=1300000000101, MenuId=1310000000382 }, + new SysRoleMenu{ Id=1300000000283, RoleId=1300000000101, MenuId=1310000000383 }, + new SysRoleMenu{ Id=1300000000284, RoleId=1300000000101, MenuId=1310000000384 }, + new SysRoleMenu{ Id=1300000000285, RoleId=1300000000101, MenuId=1310000000385 }, + new SysRoleMenu{ Id=1300000000286, RoleId=1300000000101, MenuId=1310000000386 }, + // 文件管理 + new SysRoleMenu{ Id=1300000000291, RoleId=1300000000101, MenuId=1310000000391 }, + new SysRoleMenu{ Id=1300000000292, RoleId=1300000000101, MenuId=1310000000392 }, + new SysRoleMenu{ Id=1300000000293, RoleId=1300000000101, MenuId=1310000000393 }, + new SysRoleMenu{ Id=1300000000294, RoleId=1300000000101, MenuId=1310000000394 }, + new SysRoleMenu{ Id=1300000000295, RoleId=1300000000101, MenuId=1310000000395 }, + new SysRoleMenu{ Id=1300000000296, RoleId=1300000000101, MenuId=1310000000396 }, + + //// 日志管理 + //new SysRoleMenu{ Id=1300000000301, RoleId=1300000000101, MenuId=1310000000501 }, + new SysRoleMenu{ Id=1300000000311, RoleId=1300000000101, MenuId=1310000000511 }, + new SysRoleMenu{ Id=1300000000312, RoleId=1300000000101, MenuId=1310000000512 }, + new SysRoleMenu{ Id=1300000000313, RoleId=1300000000101, MenuId=1310000000513 }, + new SysRoleMenu{ Id=1300000000321, RoleId=1300000000101, MenuId=1310000000521 }, + new SysRoleMenu{ Id=1300000000322, RoleId=1300000000101, MenuId=1310000000522 }, + new SysRoleMenu{ Id=1300000000323, RoleId=1300000000101, MenuId=1310000000523 }, + new SysRoleMenu{ Id=1300000000324, RoleId=1300000000101, MenuId=1310000000524 }, + new SysRoleMenu{ Id=1300000000331, RoleId=1300000000101, MenuId=1310000000531 }, + new SysRoleMenu{ Id=1300000000332, RoleId=1300000000101, MenuId=1310000000532 }, + new SysRoleMenu{ Id=1300000000333, RoleId=1300000000101, MenuId=1310000000543 }, + + // 帮助文档 + new SysRoleMenu{ Id=1300000000401, RoleId=1300000000101, MenuId=1310000000701 }, + new SysRoleMenu{ Id=1300000000402, RoleId=1300000000101, MenuId=1310000000711 }, + new SysRoleMenu{ Id=1300000000403, RoleId=1300000000101, MenuId=1310000000712 }, + + // 其他角色默认菜单 + // 数据面板【1300000000102】 + new SysRoleMenu{ Id=1300000000501, RoleId=1300000000102, MenuId=1300000000101 }, + new SysRoleMenu{ Id=1300000000502, RoleId=1300000000102, MenuId=1300000000111 }, + new SysRoleMenu{ Id=1300000000503, RoleId=1300000000102, MenuId=1300000000121 }, + // 机构管理 + new SysRoleMenu{ Id=1300000000511, RoleId=1300000000102, MenuId=1310000000142 }, + // 个人中心 + new SysRoleMenu{ Id=1300000000521, RoleId=1300000000102, MenuId=1310000000161 }, + new SysRoleMenu{ Id=1300000000522, RoleId=1300000000102, MenuId=1310000000162 }, + new SysRoleMenu{ Id=1300000000523, RoleId=1300000000102, MenuId=1310000000163 }, + new SysRoleMenu{ Id=1300000000524, RoleId=1300000000102, MenuId=1310000000164 }, + new SysRoleMenu{ Id=1300000000525, RoleId=1300000000102, MenuId=1310000000165 }, + + // 数据面板【1300000000103】 + new SysRoleMenu{ Id=1300000000601, RoleId=1300000000103, MenuId=1300000000101 }, + new SysRoleMenu{ Id=1300000000602, RoleId=1300000000103, MenuId=1300000000111 }, + new SysRoleMenu{ Id=1300000000603, RoleId=1300000000103, MenuId=1300000000121 }, + // 机构管理 + new SysRoleMenu{ Id=1300000000611, RoleId=1300000000103, MenuId=1310000000142 }, + // 个人中心 + new SysRoleMenu{ Id=1300000000621, RoleId=1300000000103, MenuId=1310000000161 }, + new SysRoleMenu{ Id=1300000000622, RoleId=1300000000103, MenuId=1310000000162 }, + new SysRoleMenu{ Id=1300000000623, RoleId=1300000000103, MenuId=1310000000163 }, + new SysRoleMenu{ Id=1300000000624, RoleId=1300000000103, MenuId=1310000000164 }, + new SysRoleMenu{ Id=1300000000625, RoleId=1300000000103, MenuId=1310000000165 }, + + // 数据面板【1300000000104】 + new SysRoleMenu{ Id=1300000000701, RoleId=1300000000104, MenuId=1300000000101 }, + new SysRoleMenu{ Id=1300000000702, RoleId=1300000000104, MenuId=1300000000111 }, + new SysRoleMenu{ Id=1300000000703, RoleId=1300000000104, MenuId=1300000000121 }, + // 机构管理 + new SysRoleMenu{ Id=1300000000711, RoleId=1300000000104, MenuId=1310000000142 }, + // 个人中心 + new SysRoleMenu{ Id=1300000000721, RoleId=1300000000104, MenuId=1310000000161 }, + new SysRoleMenu{ Id=1300000000722, RoleId=1300000000104, MenuId=1310000000162 }, + new SysRoleMenu{ Id=1300000000723, RoleId=1300000000104, MenuId=1310000000163 }, + new SysRoleMenu{ Id=1300000000724, RoleId=1300000000104, MenuId=1310000000164 }, + new SysRoleMenu{ Id=1300000000725, RoleId=1300000000104, MenuId=1310000000165 }, + + // 数据面板【1300000000105】 + new SysRoleMenu{ Id=1300000000801, RoleId=1300000000105, MenuId=1300000000101 }, + new SysRoleMenu{ Id=1300000000802, RoleId=1300000000105, MenuId=1300000000111 }, + new SysRoleMenu{ Id=1300000000803, RoleId=1300000000105, MenuId=1300000000121 }, + // 机构管理 + new SysRoleMenu{ Id=1300000000811, RoleId=1300000000105, MenuId=1310000000142 }, + // 个人中心 + new SysRoleMenu{ Id=1300000000821, RoleId=1300000000105, MenuId=1310000000161 }, + new SysRoleMenu{ Id=1300000000822, RoleId=1300000000105, MenuId=1310000000162 }, + new SysRoleMenu{ Id=1300000000823, RoleId=1300000000105, MenuId=1310000000163 }, + new SysRoleMenu{ Id=1300000000824, RoleId=1300000000105, MenuId=1310000000164 }, + new SysRoleMenu{ Id=1300000000825, RoleId=1300000000105, MenuId=1310000000165 }, + }; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SeedData/SysRoleSeedData.cs b/Admin.NET/Admin.NET.Core/SeedData/SysRoleSeedData.cs new file mode 100644 index 0000000..97bf229 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SeedData/SysRoleSeedData.cs @@ -0,0 +1,29 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统角色表种子数据 +/// +public class SysRoleSeedData : ISqlSugarEntitySeedData +{ + /// + /// 种子数据 + /// + /// + public IEnumerable HasData() + { + return new[] + { + new SysRole{ Id=1300000000101, Name="系统管理员", DataScope=DataScopeEnum.All, Code="sys_admin", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="系统管理员", TenantId=1300000000001 }, + new SysRole{ Id=1300000000102, Name="本部门及以下数据", DataScope=DataScopeEnum.DeptChild, Code="sys_deptChild", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="本部门及以下数据", TenantId=1300000000001 }, + new SysRole{ Id=1300000000103, Name="本部门数据", DataScope=DataScopeEnum.Dept, Code="sys_dept", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="本部门数据", TenantId=1300000000001 }, + new SysRole{ Id=1300000000104, Name="仅本人数据", DataScope=DataScopeEnum.Self, Code="sys_self", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="仅本人数据", TenantId=1300000000001 }, + new SysRole{ Id=1300000000105, Name="自定义数据", DataScope=DataScopeEnum.Define, Code="sys_define", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="自定义数据", TenantId=1300000000001 }, + }; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SeedData/SysTenantSeedData.cs b/Admin.NET/Admin.NET.Core/SeedData/SysTenantSeedData.cs new file mode 100644 index 0000000..7355377 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SeedData/SysTenantSeedData.cs @@ -0,0 +1,27 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统租户表种子数据 +/// +public class SysTenantSeedData : ISqlSugarEntitySeedData +{ + /// + /// 种子数据 + /// + /// + public IEnumerable HasData() + { + var defaultDbConfig = App.GetOptions().ConnectionConfigs[0]; + + return new[] + { + new SysTenant{ Id=1300000000001, OrgId=1300000000101, UserId=1300000000111, Host="https://gitee.com", TenantType=TenantTypeEnum.Id, DbType=defaultDbConfig.DbType, Connection=defaultDbConfig.ConnectionString, ConfigId=SqlSugarConst.MainConfigId, Remark="系统默认", CreateTime=DateTime.Parse("2022-02-10 00:00:00") }, + }; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SeedData/SysUserExtOrgSeedData.cs b/Admin.NET/Admin.NET.Core/SeedData/SysUserExtOrgSeedData.cs new file mode 100644 index 0000000..c3f4bbd --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SeedData/SysUserExtOrgSeedData.cs @@ -0,0 +1,26 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统用户扩展机构表种子数据 +/// +public class SysUserExtOrgSeedData : ISqlSugarEntitySeedData +{ + /// + /// 种子数据 + /// + /// + public IEnumerable HasData() + { + return new[] + { + new SysUserExtOrg{ Id=1300000000101, UserId=1300000000111, OrgId=1300000000202, PosId=1300000000106 }, + new SysUserExtOrg{ Id=1300000000102, UserId=1300000000114, OrgId=1300000000302, PosId=1300000000108 } + }; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SeedData/SysUserRoleSeedData.cs b/Admin.NET/Admin.NET.Core/SeedData/SysUserRoleSeedData.cs new file mode 100644 index 0000000..8f34bd0 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SeedData/SysUserRoleSeedData.cs @@ -0,0 +1,29 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统用户角色表种子数据 +/// +public class SysUserRoleSeedData : ISqlSugarEntitySeedData +{ + /// + /// 种子数据 + /// + /// + public IEnumerable HasData() + { + return new[] + { + new SysUserRole{ Id=1300000000101, UserId=1300000000111, RoleId=1300000000101 }, + new SysUserRole{ Id=1300000000102, UserId=1300000000112, RoleId=1300000000102 }, + new SysUserRole{ Id=1300000000103, UserId=1300000000113, RoleId=1300000000103 }, + new SysUserRole{ Id=1300000000104, UserId=1300000000114, RoleId=1300000000104 }, + new SysUserRole{ Id=1300000000105, UserId=1300000000115, RoleId=1300000000105 }, + }; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SeedData/SysUserSeedData.cs b/Admin.NET/Admin.NET.Core/SeedData/SysUserSeedData.cs new file mode 100644 index 0000000..de8dc9d --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SeedData/SysUserSeedData.cs @@ -0,0 +1,32 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 系统用户表种子数据 +/// +public class SysUserSeedData : ISqlSugarEntitySeedData +{ + /// + /// 种子数据 + /// + /// + public IEnumerable HasData() + { + var encryptPassword = CryptogramUtil.Encrypt("123456"); + + return new[] + { + new SysUser{ Id=1300000000101, Account="superadmin", Password=encryptPassword, NickName="超级管理员", RealName="超级管理员", Phone="18012345678", Birthday=DateTime.Parse("2000-01-01"), Sex=GenderEnum.Male, AccountType=AccountTypeEnum.SuperAdmin, Remark="超级管理员", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), TenantId=1300000000001 }, + new SysUser{ Id=1300000000111, Account="admin", Password=encryptPassword, NickName="系统管理员", RealName="系统管理员", Phone="18012345678", Birthday=DateTime.Parse("2000-01-01"), Sex=GenderEnum.Male, AccountType=AccountTypeEnum.SysAdmin, Remark="系统管理员", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrgId=1300000000101, PosId=1300000000102, TenantId=1300000000001 }, + new SysUser{ Id=1300000000112, Account="user1", Password=encryptPassword, NickName="部门主管", RealName="部门主管", Phone="18012345678", Birthday=DateTime.Parse("2000-01-01"), Sex=GenderEnum.Female, AccountType=AccountTypeEnum.NormalUser, Remark="部门主管", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrgId=1300000000102, PosId=1300000000108, TenantId=1300000000001 }, + new SysUser{ Id=1300000000113, Account="user2", Password=encryptPassword, NickName="部门职员", RealName="部门职员", Phone="18012345678", Birthday=DateTime.Parse("2000-01-01"), Sex=GenderEnum.Female, AccountType=AccountTypeEnum.NormalUser, Remark="部门职员", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrgId=1300000000103, PosId=1300000000110, TenantId=1300000000001 }, + new SysUser{ Id=1300000000114, Account="user3", Password=encryptPassword, NickName="普通用户", RealName="普通用户", Phone="18012345678", Birthday=DateTime.Parse("2000-01-01"), Sex=GenderEnum.Female, AccountType=AccountTypeEnum.NormalUser, Remark="普通用户", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrgId=1300000000104, PosId=1300000000115, TenantId=1300000000001 }, + new SysUser{ Id=1300000000115, Account="user4", Password=encryptPassword, NickName="其他", RealName="其他", Phone="18012345678", Birthday=DateTime.Parse("2000-01-01"), Sex=GenderEnum.Female, AccountType=AccountTypeEnum.Member, Remark="会员", CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrgId=1300000000105, PosId=1300000000116, TenantId=1300000000001 }, + }; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/APIJSON/APIJSONService.cs b/Admin.NET/Admin.NET.Core/Service/APIJSON/APIJSONService.cs new file mode 100644 index 0000000..8a86418 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/APIJSON/APIJSONService.cs @@ -0,0 +1,206 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// APIJSON服务 🧩 +/// +[ApiDescriptionSettings(Order = 100)] +public class APIJSONService : IDynamicApiController, ITransient +{ + private readonly ISqlSugarClient _db; + private readonly IdentityService _identityService; + private readonly TableMapper _tableMapper; + private readonly SelectTable _selectTable; + + public APIJSONService(ISqlSugarClient db, + IdentityService identityService, + TableMapper tableMapper) + { + _db = db; + _tableMapper = tableMapper; + _identityService = identityService; + _selectTable = new SelectTable(_identityService, _tableMapper, _db); + } + + /// + /// 统一查询入口 🔖 + /// + /// + /// 参数:{"[]":{"SYSLOGOP":{}}} + /// + [HttpPost("get")] + [DisplayName("APIJSON统一查询")] + public JObject Query([FromBody] JObject jobject) + { + return _selectTable.Query(jobject); + } + + /// + /// 查询 🔖 + /// + /// + /// + /// + [HttpPost("get/{table}")] + [DisplayName("APIJSON查询")] + public JObject QueryByTable([FromRoute] string table, [FromBody] JObject jobject) + { + var ht = new JObject + { + { table + "[]", jobject } + }; + + // 自动添加总计数量 + if (jobject["query"] != null && jobject["query"].ToString() != "0" && jobject["total@"] == null) + ht.Add("total@", ""); + + // 每页最大1000条数据 + if (jobject["count"] != null && int.Parse(jobject["count"].ToString()) > 1000) + throw Oops.Bah("count分页数量最大不能超过1000"); + + jobject.Remove("@debug"); + + var hasTableKey = false; + var ignoreConditions = new List { "page", "count", "query" }; + var tableConditions = new JObject(); // 表的其它查询条件,比如过滤、字段等 + foreach (var item in jobject) + { + if (item.Key.Equals(table, StringComparison.CurrentCultureIgnoreCase)) + { + hasTableKey = true; + break; + } + if (!ignoreConditions.Contains(item.Key.ToLower())) + tableConditions.Add(item.Key, item.Value); + } + + foreach (var removeKey in tableConditions) + { + jobject.Remove(removeKey.Key); + } + + if (!hasTableKey) + jobject.Add(table, tableConditions); + + return Query(ht); + } + + /// + /// 新增 🔖 + /// + /// 表对象或数组,若没有传Id则后端生成Id + /// + [HttpPost("add")] + [DisplayName("APIJSON新增")] + [UnitOfWork] + public JObject Add([FromBody] JObject tables) + { + var ht = new JObject(); + foreach (var table in tables) + { + var talbeName = table.Key.Trim(); + var role = _identityService.GetRole(); + if (!role.Insert.Table.Contains(talbeName, StringComparer.CurrentCultureIgnoreCase)) + throw Oops.Bah($"没权限添加{talbeName}"); + + JToken result; + // 批量插入 + if (table.Value is JArray) + { + var ids = new List(); + foreach (var record in table.Value) + { + var cols = record.ToObject(); + var id = _selectTable.InsertSingle(talbeName, cols, role); + ids.Add(id); + } + result = JToken.FromObject(new { id = ids, count = ids.Count }); + } + // 单条插入 + else + { + var cols = table.Value.ToObject(); + var id = _selectTable.InsertSingle(talbeName, cols, role); + result = JToken.FromObject(new { id }); + } + ht.Add(talbeName, result); + } + return ht; + } + + /// + /// 更新(只支持Id作为条件) 🔖 + /// + /// 支持多表、多Id批量更新 + /// + [HttpPost("update")] + [DisplayName("APIJSON更新")] + [UnitOfWork] + public JObject Edit([FromBody] JObject tables) + { + var ht = new JObject(); + foreach (var table in tables) + { + var tableName = table.Key.Trim(); + var role = _identityService.GetRole(); + var count = _selectTable.UpdateSingleTable(tableName, table.Value, role); + ht.Add(tableName, JToken.FromObject(new { count })); + } + return ht; + } + + /// + /// 删除(支持非Id条件、支持批量) 🔖 + /// + /// + /// + [HttpPost("delete")] + [DisplayName("APIJSON删除")] + [UnitOfWork] + public JObject Delete([FromBody] JObject tables) + { + var ht = new JObject(); + var role = _identityService.GetRole(); + foreach (var table in tables) + { + var talbeName = table.Key.Trim(); + if (role.Delete == null || role.Delete.Table == null) + throw Oops.Bah("delete权限未配置"); + if (!role.Delete.Table.Contains(talbeName, StringComparer.CurrentCultureIgnoreCase)) + throw Oops.Bah($"没权限删除{talbeName}"); + //if (!value.ContainsKey("id")) + // throw Oops.Bah("未传主键id"); + + var value = JObject.Parse(table.Value.ToString()); + var sb = new StringBuilder(100); + var parameters = new List(); + foreach (var f in value) + { + if (f.Value is JArray) + { + sb.Append($"{f.Key} in (@{f.Key}) and "); + var paraArray = FuncList.TransJArrayToSugarPara(f.Value); + parameters.Add(new SugarParameter($"@{f.Key}", paraArray)); + } + else + { + sb.Append($"{f.Key}=@{f.Key} and "); + parameters.Add(new SugarParameter($"@{f.Key}", FuncList.TransJObjectToSugarPara(f.Value))); + } + } + if (!parameters.Any()) + throw Oops.Bah("请输入删除条件"); + + var whereSql = sb.ToString().TrimEnd(" and "); + var count = _db.Deleteable().AS(talbeName).Where(whereSql, parameters).ExecuteCommand(); // 无实体删除 + value.Add("count", count); // 命中数量 + ht.Add(talbeName, value); + } + return ht; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/APIJSON/FuncList.cs b/Admin.NET/Admin.NET.Core/Service/APIJSON/FuncList.cs new file mode 100644 index 0000000..139e02f --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/APIJSON/FuncList.cs @@ -0,0 +1,116 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 自定义方法 +/// +public class FuncList +{ + /// + /// 字符串相加 + /// + /// + /// + /// + public string Merge(object a, object b) + { + return a.ToString() + b.ToString(); + } + + /// + /// 对象合并 + /// + /// + /// + /// + public object MergeObj(object a, object b) + { + return new { a, b }; + } + + /// + /// 是否包含 + /// + /// + /// + /// + public bool IsContain(object a, object b) + { + return a.ToString().Split(',').Contains(b); + } + + /// + /// 根据jtoken的实际类型来转换SugarParameter,避免全转成字符串 + /// + /// + /// + public static dynamic TransJObjectToSugarPara(JToken jToken) + { + JTokenType jTokenType = jToken.Type; + return jTokenType switch + { + JTokenType.Integer => jToken.ToObject(typeof(long)), + JTokenType.Float => jToken.ToObject(typeof(decimal)), + JTokenType.Boolean => jToken.ToObject(typeof(bool)), + JTokenType.Date => jToken.ToObject(typeof(DateTime)), + JTokenType.Bytes => jToken.ToObject(typeof(byte)), + JTokenType.Guid => jToken.ToObject(typeof(Guid)), + JTokenType.TimeSpan => jToken.ToObject(typeof(TimeSpan)), + JTokenType.Array => TransJArrayToSugarPara(jToken), + _ => jToken + }; + } + + /// + /// 根据jArray的实际类型来转换SugarParameter,避免全转成字符串 + /// + /// + /// + public static dynamic TransJArrayToSugarPara(JToken jToken) + { + if (jToken is not JArray) return jToken; + if (jToken.Any()) + { + JTokenType jTokenType = jToken.First().Type; + return jTokenType switch + { + JTokenType.Integer => jToken.ToObject(), + JTokenType.Float => jToken.ToObject(), + JTokenType.Boolean => jToken.ToObject(), + JTokenType.Date => jToken.ToObject(), + JTokenType.Bytes => jToken.ToObject(), + JTokenType.Guid => jToken.ToObject(), + JTokenType.TimeSpan => jToken.ToObject(), + _ => jToken.ToArray() + }; + } + + return (JArray)jToken; + } + + /// + /// 获取字符串里的值的真正类型 + /// + /// + /// + public static string GetValueCSharpType(string input) + { + if (DateTime.TryParse(input, out _)) + return "DateTime"; + else if (int.TryParse(input, out _)) + return "int"; + else if (long.TryParse(input, out _)) + return "long"; + else if (decimal.TryParse(input, out _)) + return "decimal"; + else if (bool.TryParse(input, out _)) + return "bool"; + else + return "string"; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/APIJSON/IdentityService.cs b/Admin.NET/Admin.NET.Core/Service/APIJSON/IdentityService.cs new file mode 100644 index 0000000..f62bde5 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/APIJSON/IdentityService.cs @@ -0,0 +1,96 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using System.Security.Claims; + +namespace Admin.NET.Core.Service; + +/// +/// 权限验证 +/// +public class IdentityService : ITransient +{ + private readonly IHttpContextAccessor _context; + private readonly List _roles; + + public IdentityService(IHttpContextAccessor context, IOptions roles) + { + _context = context ?? throw new ArgumentNullException(nameof(context)); + _roles = roles.Value.Roles; + } + + /// + /// 获取当前用户Id + /// + /// + public string GetUserIdentity() + { + return _context.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier); + } + + /// + /// 获取当前用户权限名称 + /// + /// + public string GetUserRoleName() + { + return _context.HttpContext.User.FindFirstValue(ClaimTypes.Role); + } + + /// + /// 获取当前用户权限 + /// + /// + public APIJSON_Role GetRole() + { + var role = string.IsNullOrEmpty(GetUserRoleName()) + ? _roles.FirstOrDefault() + : _roles.FirstOrDefault(it => it.RoleName.Equals(GetUserRoleName(), StringComparison.CurrentCultureIgnoreCase)); + return role; + } + + /// + /// 获取当前表的可查询字段 + /// + /// + /// + public (bool, string) GetSelectRole(string table) + { + var role = GetRole(); + if (role == null || role.Select == null || role.Select.Table == null) + return (false, $"appsettings.json权限配置不正确!"); + + var tablerole = role.Select.Table.FirstOrDefault(it => it == "*" || it.Equals(table, StringComparison.CurrentCultureIgnoreCase)); + if (string.IsNullOrEmpty(tablerole)) + return (false, $"表名{table}没权限查询!"); + + var index = Array.IndexOf(role.Select.Table, tablerole); + var selectrole = role.Select.Column[index]; + return (true, selectrole); + } + + /// + /// 当前列是否在角色里面 + /// + /// + /// + /// + public bool ColIsRole(string col, string[] selectrole) + { + if (selectrole.Contains("*")) return true; + + if (col.Contains('(') && col.Contains(')')) + { + var reg = new Regex(@"\(([^)]*)\)"); + var match = reg.Match(col); + return selectrole.Contains(match.Result("$1"), StringComparer.CurrentCultureIgnoreCase); + } + else + { + return selectrole.Contains(col, StringComparer.CurrentCultureIgnoreCase); + } + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/APIJSON/SelectTable.cs b/Admin.NET/Admin.NET.Core/Service/APIJSON/SelectTable.cs new file mode 100644 index 0000000..9b6f0ec --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/APIJSON/SelectTable.cs @@ -0,0 +1,974 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using AspectCore.Extensions.Reflection; +using System.Dynamic; + +namespace Admin.NET.Core.Service; + +/// +/// +/// +public class SelectTable : ISingleton +{ + private readonly IdentityService _identitySvc; + private readonly TableMapper _tableMapper; + private readonly ISqlSugarClient _db; + + public SelectTable(IdentityService identityService, TableMapper tableMapper, ISqlSugarClient dbClient) + { + _identitySvc = identityService; + _tableMapper = tableMapper; + _db = dbClient; + } + + /// + /// 判断表名是否正确,若不正确则抛异常 + /// + /// + /// + public virtual bool IsTable(string table) + { + return _db.DbMaintenance.GetTableInfoList().Any(it => it.Name.Equals(table, StringComparison.CurrentCultureIgnoreCase)) + ? true + : throw new Exception($"表名【{table}】不正确!"); + } + + /// + /// 判断表的列名是否正确,如果不正确则抛异常,更早地暴露给调用方 + /// + /// + /// + /// + public virtual bool IsCol(string table, string col) + { + return _db.DbMaintenance.GetColumnInfosByTableName(table).Any(it => it.DbColumnName.Equals(col, StringComparison.CurrentCultureIgnoreCase)) + ? true + : throw new Exception($"表【{table}】不存在列【{col}】!请检查输入参数"); + } + + /// + /// 查询列表数据 + /// + /// + /// + /// + /// + /// + /// + /// + public virtual Tuple GetTableData(string subtable, int page, int count, int query, string json, JObject dd) + { + var role = _identitySvc.GetSelectRole(subtable); + if (!role.Item1) + throw new Exception(role.Item2); + + var selectrole = role.Item2; + subtable = _tableMapper.GetTableName(subtable); + + var values = JObject.Parse(json); + page = values["page"] == null ? page : int.Parse(values["page"].ToString()); + count = values["count"] == null ? count : int.Parse(values["count"].ToString()); + query = values["query"] == null ? query : int.Parse(values["query"].ToString()); + values.Remove("page"); + values.Remove("count"); + // 构造查询过程 + var tb = SugarQueryable(subtable, selectrole, values, dd); + + // 实际会在这里执行 + if (query == 1) // 1-总数 + { + return new Tuple(null, tb.MergeTable().Count()); + } + else + { + if (page > 0) // 分页 + { + int total = 0; + if (query == 0) + return new Tuple(tb.ToPageList(page, count), total); // 0-对象 + else + return new Tuple(tb.ToPageList(page, count, ref total), total); // 2-以上全部 + } + else // 列表 + { + IList l = tb.ToList(); + return query == 0 ? new Tuple(l, 0) : new Tuple(l, l.Count); + } + } + } + + /// + /// 解析并查询 + /// + /// + /// + public virtual JObject Query(string queryJson) + { + var queryJobj = JObject.Parse(queryJson); + return Query(queryJobj); + } + + /// + /// 单表查询 + /// + /// + /// 返回数据的节点名称 默认为 infos + /// + public virtual JObject QuerySingle(JObject queryObj, string nodeName = "infos") + { + var resultObj = new JObject(); + + var total = 0; + foreach (var item in queryObj) + { + var key = item.Key.Trim(); + if (key.EndsWith("[]")) + { + total = QuerySingleList(resultObj, item, nodeName); + } + else if (key.Equals("func")) + { + ExecFunc(resultObj, item); + } + else if (key.Equals("total@") || key.Equals("total")) + { + resultObj.Add("total", total); + } + } + return resultObj; + } + + /// + /// 获取查询语句 + /// + /// + /// + public virtual string ToSql(JObject queryObj) + { + foreach (var item in queryObj) + { + if (item.Key.Trim().EndsWith("[]")) + return ToSql(item); + } + return string.Empty; + } + + /// + /// 解析并查询 + /// + /// + /// + public virtual JObject Query(JObject queryObj) + { + var resultObj = new JObject(); + + int total; + foreach (var item in queryObj) + { + var key = item.Key.Trim(); + if (key.Equals("[]")) // 列表 + { + total = QueryMoreList(resultObj, item); + resultObj.Add("total", total); // 只要是列表查询都自动返回总数 + } + else if (key.EndsWith("[]")) + { + total = QuerySingleList(resultObj, item); + } + else if (key.Equals("func")) + { + ExecFunc(resultObj, item); + } + else if (key.Equals("total@") || key.Equals("total")) + { + // resultObj.Add("total", total); + continue; + } + else // 单条 + { + var template = GetFirstData(key, item.Value.ToString(), resultObj); + if (template != null) + resultObj.Add(key, JToken.FromObject(template)); + } + } + return resultObj; + } + + // 动态调用方法 + private static object ExecFunc(string funcname, object[] param, Type[] types) + { + var method = typeof(FuncList).GetMethod(funcname); + var reflector = method.GetReflector(); + var result = reflector.Invoke(new FuncList(), param); + return result; + } + + // 生成sql + private string ToSql(string subtable, int page, int count, int query, string json) + { + var values = JObject.Parse(json); + page = values["page"] == null ? page : int.Parse(values["page"].ToString()); + count = values["count"] == null ? count : int.Parse(values["count"].ToString()); + _ = values["query"] == null ? query : int.Parse(values["query"].ToString()); + values.Remove("page"); + values.Remove("count"); + subtable = _tableMapper.GetTableName(subtable); + var tb = SugarQueryable(subtable, "*", values, null); + var sqlObj = tb.Skip((page - 1) * count).Take(10).ToSql(); + return sqlObj.Key; + } + + /// + /// 查询第一条数据 + /// + /// + /// + /// + /// + /// + private dynamic GetFirstData(string subtable, string json, JObject job) + { + var role = _identitySvc.GetSelectRole(subtable); + if (!role.Item1) + throw new Exception(role.Item2); + + var selectrole = role.Item2; + subtable = _tableMapper.GetTableName(subtable); + + var values = JObject.Parse(json); + values.Remove("page"); + values.Remove("count"); + var tb = SugarQueryable(subtable, selectrole, values, job).First(); + var dic = (IDictionary)tb; + foreach (var item in values.Properties().Where(it => it.Name.EndsWith("()"))) + { + if (item.Value.IsNullOrEmpty()) + { + var func = item.Value.ToString().Substring(0, item.Value.ToString().IndexOf("(")); + var param = item.Value.ToString().Substring(item.Value.ToString().IndexOf("(") + 1).TrimEnd(')'); + var types = new List(); + var paramss = new List(); + foreach (var va in param.Split(',')) + { + types.Add(typeof(object)); + paramss.Add(tb.Where(it => it.Key.Equals(va)).Select(i => i.Value)); + } + dic[item.Name] = ExecFunc(func, paramss.ToArray(), types.ToArray()); + } + } + return tb; + } + + // 单表查询,返回的数据在指定的NodeName节点 + private int QuerySingleList(JObject resultObj, KeyValuePair item, string nodeName) + { + var key = item.Key.Trim(); + var jb = JObject.Parse(item.Value.ToString()); + int page = jb["page"] == null ? 0 : int.Parse(jb["page"].ToString()); + int count = jb["count"] == null ? 10 : int.Parse(jb["count"].ToString()); + int query = jb["query"] == null ? 2 : int.Parse(jb["query"].ToString()); // 默认输出数据和数量 + int total = 0; + + jb.Remove("page"); jb.Remove("count"); jb.Remove("query"); + + var htt = new JArray(); + foreach (var t in jb) + { + var datas = GetTableData(t.Key, page, count, query, t.Value.ToString(), null); + if (query > 0) + total = datas.Item2; + + foreach (var data in datas.Item1) + { + htt.Add(JToken.FromObject(data)); + } + } + + if (!string.IsNullOrEmpty(nodeName)) + resultObj.Add(nodeName, htt); + else + resultObj.Add(key, htt); + + return total; + } + + // 生成sql + private string ToSql(KeyValuePair item) + { + var jb = JObject.Parse(item.Value.ToString()); + int page = jb["page"] == null ? 0 : int.Parse(jb["page"].ToString()); + int count = jb["count"] == null ? 10 : int.Parse(jb["count"].ToString()); + int query = jb["query"] == null ? 2 : int.Parse(jb["query"].ToString()); // 默认输出数据和数量 + + jb.Remove("page"); jb.Remove("count"); jb.Remove("query"); + foreach (var t in jb) + { + return ToSql(t.Key, page, count, query, t.Value.ToString()); + } + return string.Empty; + } + + // 单表查询 + private int QuerySingleList(JObject resultObj, KeyValuePair item) + { + var key = item.Key.TrimEnd("[]"); + return QuerySingleList(resultObj, item, key); + } + + /// + /// 多列表查询 + /// + /// + /// + /// + private int QueryMoreList(JObject resultObj, KeyValuePair item) + { + int total = 0; + + var jb = JObject.Parse(item.Value.ToString()); + var page = jb["page"] == null ? 0 : int.Parse(jb["page"].ToString()); + var count = jb["count"] == null ? 10 : int.Parse(jb["count"].ToString()); + var query = jb["query"] == null ? 2 : int.Parse(jb["query"].ToString()); // 默认输出数据和数量 + jb.Remove("page"); jb.Remove("count"); jb.Remove("query"); + var htt = new JArray(); + List tables = new List(), where = new List(); + foreach (var t in jb) + { + tables.Add(t.Key); where.Add(t.Value.ToString()); + } + if (tables.Count > 0) + { + string table = tables[0].TrimEnd("[]"); + var temp = GetTableData(table, page, count, query, where[0], null); + if (query > 0) + total = temp.Item2; + + // 关联查询,先查子表数据,再根据外键循环查询主表 + foreach (var dd in temp.Item1) + { + var zht = new JObject + { + { table, JToken.FromObject(dd) } + }; + for (int i = 1; i < tables.Count; i++) // 从第二个表开始循环 + { + string subtable = tables[i]; + // 有bug,暂不支持[]分支 + //if (subtable.EndsWith("[]")) + //{ + // string tableName = subtable.TrimEnd("[]".ToCharArray()); + // var jbb = JObject.Parse(where[i]); + // page = jbb["page"] == null ? 0 : int.Parse(jbb["page"].ToString()); + // count = jbb["count"] == null ? 0 : int.Parse(jbb["count"].ToString()); + + // var lt = new JArray(); + // foreach (var d in GetTableData(tableName, page, count, query, item.Value[subtable].ToString(), zht).Item1) + // { + // lt.Add(JToken.FromObject(d)); + // } + // zht.Add(tables[i], lt); + //} + //else + //{ + var ddf = GetFirstData(subtable, where[i].ToString(), zht); + if (ddf != null) + zht.Add(subtable, JToken.FromObject(ddf)); + } + htt.Add(zht); + } + } + if (query != 1) + resultObj.Add("[]", htt); + + // 分页自动添加当前页数和数量 + if (page > 0 && count > 0) + { + resultObj.Add("page", page); + resultObj.Add("count", count); + resultObj.Add("max", (int)Math.Ceiling((decimal)total / count)); + } + + return total; + } + + // 执行方法 + private void ExecFunc(JObject resultObj, KeyValuePair item) + { + var jb = JObject.Parse(item.Value.ToString()); + + var dataJObj = new JObject(); + foreach (var f in jb) + { + var types = new List(); + var param = new List(); + foreach (var va in JArray.Parse(f.Value.ToString())) + { + types.Add(typeof(object)); + param.Add(va); + } + dataJObj.Add(f.Key, JToken.FromObject(ExecFunc(f.Key, param.ToArray(), types.ToArray()))); + } + resultObj.Add("func", dataJObj); + } + + /// + /// 构造查询过程 + /// + /// + /// + /// + /// + /// + private ISugarQueryable SugarQueryable(string subtable, string selectrole, JObject values, JObject dd) + { + IsTable(subtable); + + var tb = _db.Queryable(subtable, "tb"); + + // select + if (!values["@column"].IsNullOrEmpty()) + { + ProcessColumn(subtable, selectrole, values, tb); + } + else + { + tb.Select(selectrole); + } + + // 前几行 + ProcessLimit(values, tb); + + // where + ProcessWhere(subtable, values, tb, dd); + + // 排序 + ProcessOrder(subtable, values, tb); + + // 分组 + PrccessGroup(subtable, values, tb); + + // Having + ProcessHaving(values, tb); + + return tb; + } + + // 处理字段重命名 "@column":"toId:parentId",对应SQL是toId AS parentId,将查询的字段toId变为parentId返回 + private void ProcessColumn(string subtable, string selectrole, JObject values, ISugarQueryable tb) + { + var str = new System.Text.StringBuilder(100); + foreach (var item in values["@column"].ToString().Split(',')) + { + var ziduan = item.Split(':'); + var colName = ziduan[0]; + var ma = new Regex(@"\((\w+)\)").Match(colName); + // 处理max、min这样的函数 + if (ma.Success && ma.Groups.Count > 1) + colName = ma.Groups[1].Value; + + // 判断列表是否有权限 sum(1)、sum(*)、Count(1)这样的值直接有效 + if (colName == "*" || int.TryParse(colName, out int colNumber) || (IsCol(subtable, colName) && _identitySvc.ColIsRole(colName, selectrole.Split(',')))) + { + if (ziduan.Length > 1) + { + if (ziduan[1].Length > 20) + throw new Exception("别名不能超过20个字符"); + + str.Append(ziduan[0] + " as `" + ReplaceSQLChar(ziduan[1]) + "`,"); + } + // 不对函数加``,解决sum(*)、Count(1)等不能使用的问题 + else if (ziduan[0].Contains('(')) + { + str.Append(ziduan[0] + ","); + } + else + str.Append("`" + ziduan[0] + "`" + ","); + } + } + if (string.IsNullOrEmpty(str.ToString())) + throw new Exception($"表名{subtable}没有可查询的字段!"); + + tb.Select(str.ToString().TrimEnd(',')); + } + + /// + /// 构造查询条件 where + /// + /// + /// + /// + /// + private void ProcessWhere(string subtable, JObject values, ISugarQueryable tb, JObject dd) + { + var conModels = new List(); + if (!values["identity"].IsNullOrEmpty()) + conModels.Add(new ConditionalModel() { FieldName = values["identity"].ToString(), ConditionalType = ConditionalType.Equal, FieldValue = _identitySvc.GetUserIdentity() }); + + foreach (var va in values) + { + string key = va.Key.Trim(); + string fieldValue = va.Value.ToString(); + if (key.StartsWith("@")) + { + continue; + } + if (key.EndsWith("$")) // 模糊查询 + { + FuzzyQuery(subtable, conModels, va); + } + else if (key.EndsWith("{}")) // 逻辑运算 + { + ConditionQuery(subtable, conModels, va); + } + else if (key.EndsWith("%")) // bwtween查询 + { + ConditionBetween(subtable, conModels, va, tb); + } + else if (key.EndsWith("@")) // 关联上一个table + { + if (dd == null) + continue; + + var str = fieldValue.Split('/'); + var lastTableRecord = ((JObject)dd[str[^2]]); + if (!lastTableRecord.ContainsKey(str[^1])) + throw new Exception($"找不到关联列:{str},请在{str[^2]}@column中设置"); + + var value = lastTableRecord[str[^1]].ToString(); + conModels.Add(new ConditionalModel() { FieldName = key.TrimEnd('@'), ConditionalType = ConditionalType.Equal, FieldValue = value }); + } + else if (key.EndsWith("~")) // 不等于(应该是正则匹配) + { + //conModels.Add(new ConditionalModel() { FieldName = key.TrimEnd('~'), ConditionalType = ConditionalType.NoEqual, FieldValue = fieldValue }); + } + else if (IsCol(subtable, key.TrimEnd('!'))) // 其他where条件 + { + ConditionEqual(subtable, conModels, va); + } + } + if (conModels.Any()) + tb.Where(conModels); + } + + // "@having":"function0(...)?value0;function1(...)?value1;function2(...)?value2...", + // SQL函数条件,一般和 @group一起用,函数一般在 @column里声明 + private static void ProcessHaving(JObject values, ISugarQueryable tb) + { + if (!values["@having"].IsNullOrEmpty()) + { + var hw = new List(); + var havingItems = new List(); + if (values["@having"].HasValues) + { + havingItems = values["@having"].Select(p => p.ToString()).ToList(); + } + else + { + havingItems.Add(values["@having"].ToString()); + } + foreach (var item in havingItems) + { + var and = item.ToString(); + var model = new ConditionalModel(); + if (and.Contains(">=")) + { + model.FieldName = and.Split(new string[] { ">=" }, StringSplitOptions.RemoveEmptyEntries)[0]; + model.ConditionalType = ConditionalType.GreaterThanOrEqual; + model.FieldValue = and.Split(new string[] { ">=" }, StringSplitOptions.RemoveEmptyEntries)[1]; + } + else if (and.Contains("<=")) + { + model.FieldName = and.Split(new string[] { "<=" }, StringSplitOptions.RemoveEmptyEntries)[0]; + model.ConditionalType = ConditionalType.LessThanOrEqual; + model.FieldValue = and.Split(new string[] { "<=" }, StringSplitOptions.RemoveEmptyEntries)[1]; + } + else if (and.Contains('>')) + { + model.FieldName = and.Split(new string[] { ">" }, StringSplitOptions.RemoveEmptyEntries)[0]; + model.ConditionalType = ConditionalType.GreaterThan; + model.FieldValue = and.Split(new string[] { ">" }, StringSplitOptions.RemoveEmptyEntries)[1]; + } + else if (and.Contains('<')) + { + model.FieldName = and.Split(new string[] { "<" }, StringSplitOptions.RemoveEmptyEntries)[0]; + model.ConditionalType = ConditionalType.LessThan; + model.FieldValue = and.Split(new string[] { "<" }, StringSplitOptions.RemoveEmptyEntries)[1]; + } + else if (and.Contains("!=")) + { + model.FieldName = and.Split(new string[] { "!=" }, StringSplitOptions.RemoveEmptyEntries)[0]; + model.ConditionalType = ConditionalType.NoEqual; + model.FieldValue = and.Split(new string[] { "!=" }, StringSplitOptions.RemoveEmptyEntries)[1]; + } + else if (and.Contains('=')) + { + model.FieldName = and.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries)[0]; + model.ConditionalType = ConditionalType.Equal; + model.FieldValue = and.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries)[1]; + } + hw.Add(model); + } + //var d = db.Context.Utilities.ConditionalModelToSql(hw); + //tb.Having(d.Key, d.Value); + tb.Having(string.Join(",", havingItems)); + } + } + + // "@group":"column0,column1...",分组方式。如果 @column里声明了Table的id,则id也必须在 @group中声明;其它情况下必须满足至少一个条件: + // 1.分组的key在 @column里声明 + // 2.Table主键在 @group中声明 + private void PrccessGroup(string subtable, JObject values, ISugarQueryable tb) + { + if (!values["@group"].IsNullOrEmpty()) + { + var groupList = new List(); // 多库兼容写法 + foreach (var col in values["@group"].ToString().Split(',')) + { + if (IsCol(subtable, col)) + { + // str.Append(and + ","); + groupList.Add(new GroupByModel() { FieldName = col }); + } + } + if (groupList.Any()) + tb.GroupBy(groupList); + } + } + + // 处理排序 "@order":"name-,id"查询按 name降序、id默认顺序 排序的User数组 + private void ProcessOrder(string subtable, JObject values, ISugarQueryable tb) + { + if (!values["@order"].IsNullOrEmpty()) + { + var orderList = new List(); // 多库兼容写法 + foreach (var item in values["@order"].ToString().Split(',')) + { + string col = item.Replace("-", "").Replace("+", "").Replace(" desc", "").Replace(" asc", ""); // 增加对原生排序的支持 + if (IsCol(subtable, col)) + { + orderList.Add(new OrderByModel() + { + FieldName = col, + OrderByType = item.EndsWith("-") || item.EndsWith(" desc") ? OrderByType.Desc : OrderByType.Asc + }); + } + } + + if (orderList.Any()) + tb.OrderBy(orderList); + } + } + + /// + /// 表内参数"@count"(int):查询前几行,不能同时使用count和@count函数 + /// + /// + /// + private static void ProcessLimit(JObject values, ISugarQueryable tb) + { + if (!values["@count"].IsNullOrEmpty()) + { + int c = values["@count"].ToObject(); + tb.Take(c); + } + } + + // 条件查询 "key{}":"条件0,条件1...",条件为任意SQL比较表达式字符串,非Number类型必须用''包含条件的值,如'a' + // &, |, ! 逻辑运算符,对应数据库 SQL 中的 AND, OR, NOT。 + // 横或纵与:同一字段的值内条件默认 | 或连接,不同字段的条件默认 & 与连接。 + // ① & 可用于"key&{}":"条件"等 + // ② | 可用于"key|{}":"条件", "key|{}":[] 等,一般可省略 + // ③ ! 可单独使用,如"key!":Object,也可像&,|一样配合其他功能符使用 + private void ConditionQuery(string subtable, List conModels, KeyValuePair va) + { + var vakey = va.Key.Trim(); + var field = vakey.TrimEnd("{}".ToCharArray()); + var columnName = field.TrimEnd(new char[] { '&', '|' }); + IsCol(subtable, columnName); + var ddt = new List>(); + foreach (var and in va.Value.ToString().Split(',')) + { + var model = new ConditionalModel + { + FieldName = columnName + }; + + if (and.StartsWith(">=")) + { + model.ConditionalType = ConditionalType.GreaterThanOrEqual; + model.FieldValue = and.TrimStart(">=".ToCharArray()); + } + else if (and.StartsWith("<=")) + { + model.ConditionalType = ConditionalType.LessThanOrEqual; + model.FieldValue = and.TrimStart("<=".ToCharArray()); + } + else if (and.StartsWith(">")) + { + model.ConditionalType = ConditionalType.GreaterThan; + model.FieldValue = and.TrimStart('>'); + } + else if (and.StartsWith("<")) + { + model.ConditionalType = ConditionalType.LessThan; + model.FieldValue = and.TrimStart('<'); + } + model.CSharpTypeName = FuncList.GetValueCSharpType(model.FieldValue); + ddt.Add(new KeyValuePair(field.EndsWith("!") ? WhereType.Or : WhereType.And, model)); + } + conModels.Add(new ConditionalCollections() { ConditionalList = ddt }); + } + + /// + /// "key%":"start,end" => "key%":["start,end"],其中 start 和 end 都只能为 Boolean, Number, String 中的一种,如 "2017-01-01,2019-01-01" ,["1,90000", "82001,100000"] ,可用于连续范围内的筛选 + /// 目前不支持数组形式 + /// + /// + /// + /// + /// + private static void ConditionBetween(string subtable, List conModels, KeyValuePair va, ISugarQueryable tb) + { + var vakey = va.Key.Trim(); + var field = vakey.TrimEnd("%".ToCharArray()); + var inValues = new List(); + if (va.Value.HasValues) + { + foreach (var cm in va.Value) + { + inValues.Add(cm.ToString()); + } + } + else + { + inValues.Add(va.Value.ToString()); + } + + for (var i = 0; i < inValues.Count; i++) + { + var fileds = inValues[i].Split(','); + if (fileds.Length == 2) + { + var type = FuncList.GetValueCSharpType(fileds[0]); + ObjectFuncModel f = ObjectFuncModel.Create("between", field, $"{{{type}}}:{fileds[0]}", $"{{{type}}}:{fileds[1]}"); + tb.Where(f); + } + } + } + + /// + /// 等于、不等于、in 、not in + /// + /// + /// + /// + private void ConditionEqual(string subtable, List conModels, KeyValuePair va) + { + var key = va.Key; + var fieldValue = va.Value.ToString(); + // in / not in + if (va.Value is JArray) + { + conModels.Add(new ConditionalModel() + { + FieldName = key.TrimEnd('!'), + ConditionalType = key.EndsWith("!") ? ConditionalType.NotIn : ConditionalType.In, + FieldValue = va.Value.ToObject().Aggregate((a, b) => a + "," + b) + }); + } + else + { + if (string.IsNullOrEmpty(fieldValue)) + { + // is not null or '' + if (key.EndsWith("!")) + { + conModels.Add(new ConditionalModel() { FieldName = key.TrimEnd('!'), ConditionalType = ConditionalType.IsNot, FieldValue = null }); + conModels.Add(new ConditionalModel() { FieldName = key.TrimEnd('!'), ConditionalType = ConditionalType.IsNot, FieldValue = "" }); + } + //is null or '' + else + { + conModels.Add(new ConditionalModel() { FieldName = key.TrimEnd('!'), FieldValue = null }); + } + } + // = / != + else + { + conModels.Add(new ConditionalModel() + { + FieldName = key.TrimEnd('!'), + ConditionalType = key.EndsWith("!") ? ConditionalType.NoEqual : ConditionalType.Equal, + FieldValue = fieldValue + }); + } + } + } + + // 模糊搜索 "key$":"SQL搜索表达式" => "key$":["SQL搜索表达式"],任意SQL搜索表达式字符串,如 %key%(包含key), key%(以key开始), %k%e%y%(包含字母k,e,y) 等,%表示任意字符 + private void FuzzyQuery(string subtable, List conModels, KeyValuePair va) + { + var vakey = va.Key.Trim(); + var fieldValue = va.Value.ToString(); + var conditionalType = ConditionalType.Like; + if (IsCol(subtable, vakey.TrimEnd('$'))) + { + // 支持三种like查询 + if (fieldValue.StartsWith("%") && fieldValue.EndsWith("%")) + { + conditionalType = ConditionalType.Like; + } + else if (fieldValue.StartsWith("%")) + { + conditionalType = ConditionalType.LikeRight; + } + else if (fieldValue.EndsWith("%")) + { + conditionalType = ConditionalType.LikeLeft; + } + conModels.Add(new ConditionalModel() { FieldName = vakey.TrimEnd('$'), ConditionalType = conditionalType, FieldValue = fieldValue.TrimEnd("%".ToArray()).TrimStart("%".ToArray()) }); + } + } + + // 处理sql注入 + private string ReplaceSQLChar(string str) + { + if (string.IsNullOrWhiteSpace(str)) + return string.Empty; + + str = str.Replace("'", ""); + str = str.Replace(";", ""); + str = str.Replace(",", ""); + str = str.Replace("?", ""); + str = str.Replace("<", ""); + str = str.Replace(">", ""); + str = str.Replace("(", ""); + str = str.Replace(")", ""); + str = str.Replace("@", ""); + str = str.Replace("=", ""); + str = str.Replace("+", ""); + str = str.Replace("*", ""); + str = str.Replace("&", ""); + str = str.Replace("#", ""); + str = str.Replace("%", ""); + str = str.Replace("$", ""); + str = str.Replace("\"", ""); + + // 删除与数据库相关的词 + str = Regex.Replace(str, "delete from", "", RegexOptions.IgnoreCase); + str = Regex.Replace(str, "drop table", "", RegexOptions.IgnoreCase); + str = Regex.Replace(str, "truncate", "", RegexOptions.IgnoreCase); + str = Regex.Replace(str, "xp_cmdshell", "", RegexOptions.IgnoreCase); + str = Regex.Replace(str, "exec master", "", RegexOptions.IgnoreCase); + str = Regex.Replace(str, "net localgroup administrators", "", RegexOptions.IgnoreCase); + str = Regex.Replace(str, "net user", "", RegexOptions.IgnoreCase); + str = Regex.Replace(str, "-", "", RegexOptions.IgnoreCase); + str = Regex.Replace(str, "truncate", "", RegexOptions.IgnoreCase); + return str; + } + + /// + /// 单条插入 + /// + /// + /// + /// + /// (各种类型的)id + public object InsertSingle(string tableName, JObject cols, APIJSON_Role role = null) + { + role ??= _identitySvc.GetRole(); + var dt = new Dictionary(); + + foreach (var f in cols) // 遍历字段 + { + if (//f.Key.ToLower() != "id" && //是否一定要传id + IsCol(tableName, f.Key) && + (role.Insert.Column.Contains("*") || role.Insert.Column.Contains(f.Key, StringComparer.CurrentCultureIgnoreCase))) + dt.Add(f.Key, FuncList.TransJObjectToSugarPara(f.Value)); + } + // 如果外部没传Id,就后端生成或使用数据库默认值,如果都没有会出错 + object id; + if (!dt.ContainsKey("id")) + { + id = YitIdHelper.NextId();//自己生成id的方法,可以由外部传入 + dt.Add("id", id); + } + else + { + id = dt["id"]; + } + _db.Insertable(dt).AS(tableName).ExecuteCommand();//根据主键类型设置返回雪花或自增,目前返回条数 + + return id; + } + + /// + /// 为每天记录创建udpate sql + /// + /// + /// + /// + /// + public int UpdateSingleRecord(string tableName, JObject record, APIJSON_Role role = null) + { + role ??= _identitySvc.GetRole(); + if (!record.ContainsKey("id")) + throw Oops.Bah("未传主键id"); + + var dt = new Dictionary(); + var sb = new StringBuilder(100); + object id = null; + foreach (var f in record)//遍历每个字段 + { + if (f.Key.Equals("id", StringComparison.OrdinalIgnoreCase)) + { + if (f.Value is JArray) + { + sb.Append($"{f.Key} in (@{f.Key})"); + id = FuncList.TransJArrayToSugarPara(f.Value); + } + else + { + sb.Append($"{f.Key}=@{f.Key}"); + id = FuncList.TransJObjectToSugarPara(f.Value); + } + } + else if (IsCol(tableName, f.Key) && (role.Update.Column.Contains("*") || role.Update.Column.Contains(f.Key, StringComparer.CurrentCultureIgnoreCase))) + { + dt.Add(f.Key, FuncList.TransJObjectToSugarPara(f.Value)); + } + } + string whereSql = sb.ToString(); + int count = _db.Updateable(dt).AS(tableName).Where(whereSql, new { id }).ExecuteCommand(); + return count; + } + + /// + /// 更新单表,支持同表多条记录 + /// + /// + /// + /// + /// + public int UpdateSingleTable(string tableName, JToken records, APIJSON_Role role = null) + { + role ??= _identitySvc.GetRole(); + int count = 0; + if (records is JArray) + { + foreach (var record in records.ToObject()) + { + count += UpdateSingleRecord(tableName, record, role); + } + } + else + { + count = UpdateSingleRecord(tableName, records.ToObject(), role); + } + return count; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/APIJSON/TableMapper.cs b/Admin.NET/Admin.NET.Core/Service/APIJSON/TableMapper.cs new file mode 100644 index 0000000..1cbb5ff --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/APIJSON/TableMapper.cs @@ -0,0 +1,33 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 表名映射 +/// +public class TableMapper : ITransient +{ + private readonly Dictionary _options = new(StringComparer.OrdinalIgnoreCase); + + public TableMapper(IOptions> options) + { + foreach (var item in options.Value) + { + _options.Add(item.Key, item.Value); + } + } + + /// + /// 获取表别名 + /// + /// + /// + public string GetTableName(string oldname) + { + return _options.ContainsKey(oldname) ? _options[oldname] : oldname; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/APIJSON/用例APIFOX.json b/Admin.NET/Admin.NET.Core/Service/APIJSON/用例APIFOX.json new file mode 100644 index 0000000..b000e18 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/APIJSON/用例APIFOX.json @@ -0,0 +1 @@ +{"apifoxProject":"1.0.0","$schema":{"app":"apifox","type":"project","version":"1.2.0"},"info":{"name":"Admin.Net","description":"","mockRule":{"rules":[],"enableSystemRule":true}},"apiCollection":[{"name":"根目录","id":29711526,"auth":{},"parentId":0,"serverId":"","description":"","identityPattern":{"httpApi":{"type":"methodAndPath","bodyType":""}},"preProcessors":[{"id":"inheritProcessors","type":"inheritProcessors","data":{}}],"postProcessors":[{"id":"inheritProcessors","type":"inheritProcessors","data":{}}],"inheritPostProcessors":{},"inheritPreProcessors":{},"items":[{"name":"aPIJSON","id":29711668,"auth":{},"parentId":0,"serverId":"","description":"说明文档:https://github.com/Tencent/APIJSON/blob/master/Document.md#3.1","identityPattern":{"httpApi":{"type":"inherit","bodyType":""}},"preProcessors":[{"id":"inheritProcessors","type":"inheritProcessors","data":{}}],"postProcessors":[{"id":"inheritProcessors","type":"inheritProcessors","data":{}}],"inheritPostProcessors":{},"inheritPreProcessors":{},"items":[{"name":"统一查询入口","api":{"id":"151219333","method":"post","path":"/api/aPIJSON/get","parameters":{"query":[],"path":[],"cookie":[],"header":[]},"auth":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"405647728","name":"成功","code":200,"contentType":"json","jsonSchema":{"type":"object","properties":{"code":{"type":"integer"},"type":{"type":"string"},"message":{"type":"string"},"result":{"type":"object","properties":{"[]":{"type":"array","items":{"type":"object","properties":{},"x-apifox-orders":[]}},"page":{"type":"integer","description":"当前页码"},"count":{"type":"integer","description":"每页条数"},"max":{"type":"integer","description":"最大页数"},"total":{"type":"integer","description":"总条数"}},"x-apifox-orders":["[]","page","count","max","total"]},"extras":{"type":"null"},"time":{"type":"string"}},"required":["code","type","message","result","extras","time"],"x-apifox-orders":["code","type","message","result","extras","time"]}}],"responseExamples":[],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","additionalProperties":{"$ref":"#/definitions/84275307"},"x-apifox-orders":[],"properties":{}},"example":"{\r\n \"table1\": {\r\n \"@column\": \"id\",\r\n \"httpmethod\": \"Get\",\r\n }\r\n}"},"description":"参数:{\"[]\":{\"SYS_LOG_OP\":{}}}","tags":["aPIJSON"],"status":"released","serverId":"","operationId":"api-aPIJSON-Post","sourceUrl":"","ordering":0,"cases":[{"id":143284761,"type":"http","path":null,"name":"单条查询","responseId":405647728,"parameters":{"query":[],"path":[],"cookie":[],"header":[]},"commonParameters":{"query":[],"body":[],"header":[],"cookie":[]},"requestBody":{"parameters":[],"data":"{\r\n \"table1\": {\r\n \"@column\": \"id,createtime,Actionname,loglevel,httpmethod,RequestParam\",//显示列\r\n //\"Actionname\":\"SwaggerCheckUrl\",\r\n //\"loglevel\":2,\r\n //\"httpmethod!\":[\"POST\",\"GET\"],//! not in\r\n \"createtime{}\": \">=2024-3-1\", //逻辑运算\r\n //\"isdelete\":0, //bool 支持 1、0、true、false \r\n \"RequestParam!\": null //not null\r\n }\r\n}","generateMode":"normal"},"auth":{},"advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":2,"disableUrlEncoding":false},"requestResult":"{\"id\":\"temp.decba6c4-b3e2-40af-a30e-8c8d09865bf1\",\"cursor\":{\"position\":0,\"iteration\":0,\"length\":1,\"cycles\":1,\"empty\":false,\"eof\":false,\"bof\":true,\"cr\":false,\"ref\":\"decba6c4-b3e2-40af-a30e-8c8d09865bf1\",\"requestIndex\":0,\"httpRequestId\":\"7e107ae6-74d4-44c8-8582-e9bfefb5e611\"},\"type\":\"http\",\"response\":{\"id\":\"7b5fc148-4f73-4e56-b054-26bebe9db57a\",\"status\":\"OK\",\"code\":200,\"header\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Wed, 13 Mar 2024 08:19:05 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.45\"},{\"key\":\"Admin.NET\",\"value\":\"Admin.NET\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86375\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-14T07:18:51.6721222Z\"}],\"trailer\":[],\"stream\":{\"type\":\"Buffer\",\"data\":[123,34,99,111,100,101,34,58,50,48,48,44,34,116,121,112,101,34,58,34,115,117,99,99,101,115,115,34,44,34,109,101,115,115,97,103,101,34,58,34,34,44,34,114,101,115,117,108,116,34,58,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,52,54,57,54,51,53,53,48,48,50,49,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,48,58,51,51,58,50,51,46,51,56,55,53,57,48,51,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,76,111,103,76,101,118,101,108,34,58,50,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,91,93,92,34,58,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,125,44,92,34,112,97,103,101,92,34,58,51,44,92,34,99,111,117,110,116,92,34,58,50,44,92,34,113,117,101,114,121,92,34,58,51,125,44,92,34,116,111,116,97,108,64,92,34,58,92,34,47,91,93,47,116,111,116,97,108,92,34,125,34,125,125,44,34,101,120,116,114,97,115,34,58,110,117,108,108,44,34,116,105,109,101,34,58,34,50,48,50,52,45,48,51,45,49,51,32,49,54,58,49,57,58,48,54,34,125]},\"cookie\":[],\"responseTime\":99,\"responseSize\":328,\"type\":\"http\",\"tempFilePath\":\"\",\"timingPhases\":{\"prepare\":2.698800027370453,\"wait\":0.3564000129699707,\"dns\":0,\"tcp\":0,\"firstByte\":96.46359997987747,\"download\":1.736199975013733,\"process\":0.03470003604888916,\"total\":101.28970003128052}},\"request\":{\"url\":{\"protocol\":\"http\",\"port\":\"5005\",\"path\":[\"api\",\"aPIJSON\",\"get\"],\"host\":[\"localhost\"],\"query\":[],\"variable\":[]},\"header\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\",\"system\":true},{\"key\":\"Accept\",\"value\":\"*/*\",\"system\":true},{\"key\":\"Host\",\"value\":\"localhost:5005\",\"system\":true},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\",\"system\":true},{\"key\":\"Connection\",\"value\":\"keep-alive\",\"system\":true},{\"key\":\"Content-Length\",\"value\":157,\"system\":true}],\"method\":\"POST\",\"baseUrl\":\"http://localhost:5005\",\"body\":{\"mode\":\"raw\",\"raw\":\"{\\n \\\"table1\\\": {\\n \\\"@column\\\": \\\"id,createtime,Actionname,loglevel,httpmethod,RequestParam\\\",\\n \\\"createtime{}\\\": \\\">=2024-3-1\\\",\\n \\\"RequestParam!\\\": null\\n }\\n}\",\"generateMode\":\"normal\",\"type\":\"application/json\"},\"auth\":{\"type\":\"bearer\",\"bearer\":[{\"type\":\"any\",\"value\":\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\",\"key\":\"token\"}]},\"type\":\"http\"},\"history\":{\"execution\":{\"verbose\":false,\"sessions\":{},\"data\":[{\"request\":{\"method\":\"POST\",\"href\":\"http://localhost:5005/api/aPIJSON/get\",\"headers\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\"},{\"key\":\"Accept\",\"value\":\"*/*\"},{\"key\":\"Host\",\"value\":\"localhost:5005\"},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\"},{\"key\":\"Connection\",\"value\":\"keep-alive\"},{\"key\":\"Content-Length\",\"value\":\"157\"}],\"httpVersion\":\"1.1\"},\"response\":{\"statusCode\":200,\"headers\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Wed, 13 Mar 2024 08:19:05 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.45\"},{\"key\":\"Admin.NET\",\"value\":\"Admin.NET\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86375\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-14T07:18:51.6721222Z\"}],\"httpVersion\":\"1.1\"},\"timings\":{\"start\":1710317946491,\"requestStart\":1710317946493,\"offset\":{\"request\":2.698800027370453,\"socket\":3.0552000403404236,\"response\":99.5188000202179,\"end\":101.25499999523163,\"lookup\":3.0552000403404236,\"connect\":3.0552000403404236,\"done\":101.28970003128052}}}]}},\"responseValidation\":{\"schema\":{\"valid\":true,\"message\":\"\",\"errors\":null},\"responseCode\":{\"valid\":true}},\"passed\":true,\"metaInfo\":{\"httpApiId\":151219333,\"httpApiCaseId\":143284761,\"httpApiName\":\"统一入口\",\"httpApiPath\":\"/api/aPIJSON/get\",\"httpApiMethod\":\"post\",\"httpApiCaseName\":\"单条查询\"}}","preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}},{"id":143272865,"type":"http","path":null,"name":"列表查询","responseId":0,"parameters":{"query":[],"path":[],"cookie":[],"header":[]},"commonParameters":{"query":[],"body":[],"header":[],"cookie":[]},"requestBody":{"parameters":[],"data":"{\r\n \"[]\": {\r\n \"table1\": {\r\n \"@column\": \"id,createtime,httpmethod,RequestUrl,actionname,RequestParam,Elapsed\",//需要显示的列名\r\n //\"httpmethod\": \"POST\",//条件查询\r\n //\"RequestUrl$\": \"%swagger%\", //$模糊查询\r\n //\"@order\": \"RequestParam desc,createtime,actionname desc\", //按最新时间排序:-/desc 均为倒序 \r\n //\"@count\": \"10\", //前n条 很少用到 \r\n //\"RequestParam\":null,//匹配null or '',\r\n \"createtime%\":\"2024-3-5,2024-3-14\",// between 日期过滤\r\n \"Elapsed%\":\"1,20\"\r\n }\r\n}","generateMode":"normal"},"auth":{},"advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":2,"disableUrlEncoding":false},"requestResult":"{\"id\":\"temp.1c48ba22-4372-4ab1-a874-a79449144e5d\",\"cursor\":{\"position\":0,\"iteration\":0,\"length\":1,\"cycles\":1,\"empty\":false,\"eof\":false,\"bof\":true,\"cr\":false,\"ref\":\"1c48ba22-4372-4ab1-a874-a79449144e5d\",\"requestIndex\":0,\"httpRequestId\":\"70f19533-b333-460b-beeb-2e5ecbc5298c\"},\"type\":\"http\",\"response\":{\"id\":\"0f169b35-6729-4512-956d-2081d9fdb91d\",\"status\":\"OK\",\"code\":200,\"header\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Thu, 14 Mar 2024 02:00:47 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.45\"},{\"key\":\"Admin.NET\",\"value\":\"Admin.NET\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86398\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-15T02:00:05.6689995Z\"}],\"trailer\":[],\"stream\":{\"type\":\"Buffer\",\"data\":[123,34,99,111,100,101,34,58,50,48,48,44,34,116,121,112,101,34,58,34,115,117,99,99,101,115,115,34,44,34,109,101,115,115,97,103,101,34,58,34,34,44,34,114,101,115,117,108,116,34,58,123,34,91,93,34,58,91,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,51,48,49,56,48,54,55,57,50,51,55,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,53,32,49,54,58,50,48,58,52,53,46,50,57,56,49,57,49,57,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,115,119,97,103,103,101,114,47,99,104,101,99,107,85,114,108,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,83,119,97,103,103,101,114,67,104,101,99,107,85,114,108,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,110,117,108,108,44,34,69,108,97,112,115,101,100,34,58,49,56,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,52,54,50,54,50,54,48,51,48,55,55,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,48,57,58,52,55,58,52,53,46,51,49,51,48,53,50,53,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,115,119,97,103,103,101,114,47,99,104,101,99,107,85,114,108,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,83,119,97,103,103,101,114,67,104,101,99,107,85,114,108,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,110,117,108,108,44,34,69,108,97,112,115,101,100,34,58,49,55,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,52,54,51,50,57,56,51,50,55,55,51,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,48,57,58,53,50,58,48,55,46,57,50,57,50,54,52,57,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,115,119,97,103,103,101,114,47,99,104,101,99,107,85,114,108,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,83,119,97,103,103,101,114,67,104,101,99,107,85,114,108,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,110,117,108,108,44,34,69,108,97,112,115,101,100,34,58,49,53,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,52,54,51,54,51,52,53,55,56,54,49,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,48,57,58,53,52,58,49,57,46,50,55,55,52,54,53,55,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,115,119,97,103,103,101,114,47,99,104,101,99,107,85,114,108,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,83,119,97,103,103,101,114,67,104,101,99,107,85,114,108,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,110,117,108,108,44,34,69,108,97,112,115,101,100,34,58,49,57,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,52,54,51,56,54,55,57,55,56,57,51,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,48,57,58,53,53,58,53,48,46,52,52,57,55,52,57,54,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,115,119,97,103,103,101,114,47,99,104,101,99,107,85,114,108,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,83,119,97,103,103,101,114,67,104,101,99,107,85,114,108,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,110,117,108,108,44,34,69,108,97,112,115,101,100,34,58,49,53,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,52,54,57,50,57,50,49,52,50,55,55,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,48,58,51,49,58,48,57,46,50,54,51,55,53,49,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,115,119,97,103,103,101,114,47,99,104,101,99,107,85,114,108,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,83,119,97,103,103,101,114,67,104,101,99,107,85,114,108,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,110,117,108,108,44,34,69,108,97,112,115,101,100,34,58,49,54,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,52,55,48,50,52,48,55,57,57,52,49,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,48,58,51,55,58,49,57,46,56,51,50,49,53,50,56,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,97,112,105,47,97,80,73,74,83,79,78,47,103,101,116,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,91,93,92,34,58,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,125,44,92,34,112,97,103,101,92,34,58,49,44,92,34,99,111,117,110,116,92,34,58,50,44,92,34,113,117,101,114,121,92,34,58,51,125,44,92,34,116,111,116,97,108,64,92,34,58,92,34,47,91,93,47,116,111,116,97,108,92,34,125,34,44,34,69,108,97,112,115,101,100,34,58,49,55,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,52,55,49,56,56,53,57,57,49,48,57,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,48,58,52,56,58,48,50,46,52,56,53,55,57,50,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,97,112,105,47,97,80,73,74,83,79,78,47,83,89,83,76,79,71,79,80,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,66,121,84,97,98,108,101,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,92,34,83,89,83,76,79,71,79,80,92,34,34,44,34,69,108,97,112,115,101,100,34,58,49,57,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,52,55,53,52,57,57,55,57,52,54,49,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,49,58,49,49,58,51,52,46,49,50,55,53,49,56,55,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,97,112,105,47,97,80,73,74,83,79,78,47,103,101,116,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,91,93,92,34,58,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,125,44,92,34,112,97,103,101,92,34,58,49,44,92,34,99,111,117,110,116,92,34,58,50,44,92,34,113,117,101,114,121,92,34,58,49,125,44,92,34,116,111,116,97,108,64,92,34,58,92,34,47,91,93,47,116,111,116,97,108,92,34,125,34,44,34,69,108,97,112,115,101,100,34,58,49,56,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,52,55,53,53,52,49,49,53,57,48,57,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,49,58,49,49,58,53,48,46,50,56,53,52,56,54,52,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,97,112,105,47,97,80,73,74,83,79,78,47,103,101,116,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,91,93,92,34,58,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,125,44,92,34,112,97,103,101,92,34,58,49,44,92,34,99,111,117,110,116,92,34,58,50,44,92,34,113,117,101,114,121,92,34,58,48,125,44,92,34,116,111,116,97,108,64,92,34,58,92,34,47,91,93,47,116,111,116,97,108,92,34,125,34,44,34,69,108,97,112,115,101,100,34,58,49,51,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,52,55,53,53,55,51,56,52,48,48,53,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,49,58,49,50,58,48,51,46,48,53,49,50,55,54,54,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,97,112,105,47,97,80,73,74,83,79,78,47,103,101,116,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,91,93,92,34,58,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,125,44,92,34,112,97,103,101,92,34,58,49,44,92,34,99,111,117,110,116,92,34,58,50,125,44,92,34,116,111,116,97,108,64,92,34,58,92,34,47,91,93,47,116,111,116,97,108,92,34,125,34,44,34,69,108,97,112,115,101,100,34,58,49,54,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,52,55,53,54,54,57,51,57,57,55,51,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,49,58,49,50,58,52,48,46,51,55,57,52,48,56,55,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,97,112,105,47,97,80,73,74,83,79,78,47,103,101,116,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,91,93,92,34,58,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,125,44,92,34,112,97,103,101,92,34,58,49,44,92,34,99,111,117,110,116,92,34,58,50,125,125,34,44,34,69,108,97,112,115,101,100,34,58,49,52,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,52,56,49,56,50,52,56,53,51,49,55,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,49,58,53,50,58,52,52,46,56,53,51,53,57,52,54,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,115,119,97,103,103,101,114,47,99,104,101,99,107,85,114,108,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,83,119,97,103,103,101,114,67,104,101,99,107,85,114,108,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,110,117,108,108,44,34,69,108,97,112,115,101,100,34,58,49,57,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,48,50,57,49,51,50,52,55,52,49,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,52,58,49,48,58,48,50,46,53,48,55,49,56,48,52,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,115,119,97,103,103,101,114,47,99,104,101,99,107,85,114,108,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,83,119,97,103,103,101,114,67,104,101,99,107,85,114,108,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,110,117,108,108,44,34,69,108,97,112,115,101,100,34,58,49,56,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,48,52,50,50,50,57,55,49,53,55,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,52,58,49,56,58,51,52,46,49,49,56,52,57,56,53,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,97,112,105,47,97,80,73,74,83,79,78,47,103,101,116,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,125,44,92,34,116,111,116,97,108,64,92,34,58,92,34,47,91,93,47,116,111,116,97,108,92,34,125,34,44,34,69,108,97,112,115,101,100,34,58,49,54,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,48,52,51,48,57,53,54,56,54,57,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,52,58,49,57,58,48,55,46,57,52,53,57,49,56,55,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,97,112,105,47,97,80,73,74,83,79,78,47,103,101,116,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,125,44,92,34,116,111,116,97,108,64,92,34,58,92,34,47,91,93,47,116,111,116,97,108,92,34,125,34,44,34,69,108,97,112,115,101,100,34,58,49,54,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,48,52,52,56,49,56,55,55,49,55,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,52,58,50,48,58,49,53,46,50,53,51,55,52,49,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,97,112,105,47,97,80,73,74,83,79,78,47,103,101,116,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,92,34,113,117,101,114,121,92,34,58,92,34,50,92,34,125,44,92,34,116,111,116,97,108,64,92,34,58,92,34,47,91,93,47,116,111,116,97,108,92,34,125,34,44,34,69,108,97,112,115,101,100,34,58,49,55,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,49,48,52,49,52,53,53,52,50,57,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,52,58,53,56,58,53,50,46,55,48,53,55,50,56,53,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,97,112,105,47,97,80,73,74,83,79,78,47,103,101,116,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,92,34,64,99,111,108,117,109,110,92,34,58,92,34,105,100,92,34,125,125,34,44,34,69,108,97,112,115,101,100,34,58,49,57,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,49,50,52,52,54,54,50,53,57,55,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,53,58,49,50,58,48,54,46,52,56,51,53,49,52,53,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,97,112,105,47,97,80,73,74,83,79,78,47,103,101,116,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,92,34,64,99,111,108,117,109,110,92,34,58,92,34,105,100,92,34,44,92,34,64,111,114,100,101,114,92,34,58,92,34,105,100,45,92,34,125,125,34,44,34,69,108,97,112,115,101,100,34,58,50,48,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,49,50,52,54,51,53,51,50,50,49,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,53,58,49,50,58,49,51,46,48,56,54,57,57,50,54,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,97,112,105,47,97,80,73,74,83,79,78,47,103,101,116,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,92,34,64,99,111,108,117,109,110,92,34,58,92,34,105,100,92,34,44,92,34,64,111,114,100,101,114,92,34,58,92,34,105,100,43,92,34,125,125,34,44,34,69,108,97,112,115,101,100,34,58,49,57,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,49,50,52,55,55,57,53,50,54,57,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,53,58,49,50,58,49,56,46,55,50,48,51,52,54,57,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,97,112,105,47,97,80,73,74,83,79,78,47,103,101,116,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,92,34,64,99,111,108,117,109,110,92,34,58,92,34,105,100,92,34,44,92,34,64,111,114,100,101,114,92,34,58,92,34,105,100,92,34,125,125,34,44,34,69,108,97,112,115,101,100,34,58,49,57,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,49,50,53,50,55,51,52,50,55,55,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,53,58,49,50,58,51,56,46,48,49,51,48,56,48,56,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,97,112,105,47,97,80,73,74,83,79,78,47,103,101,116,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,92,34,64,99,111,108,117,109,110,92,34,58,92,34,105,100,44,99,114,101,97,116,101,116,105,109,101,92,34,44,92,34,64,111,114,100,101,114,92,34,58,92,34,99,114,101,97,116,101,116,105,109,101,92,34,125,125,34,44,34,69,108,97,112,115,101,100,34,58,49,53,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,49,50,53,53,49,56,53,50,50,49,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,53,58,49,50,58,52,55,46,53,56,55,53,49,52,53,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,97,112,105,47,97,80,73,74,83,79,78,47,103,101,116,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,92,34,64,99,111,108,117,109,110,92,34,58,92,34,105,100,44,99,114,101,97,116,101,116,105,109,101,92,34,44,92,34,64,111,114,100,101,114,92,34,58,92,34,99,114,101,97,116,101,116,105,109,101,45,92,34,125,125,34,44,34,69,108,97,112,115,101,100,34,58,49,53,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,49,51,57,57,55,52,57,55,48,49,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,53,58,50,50,58,49,50,46,50,57,50,57,51,57,49,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,97,112,105,47,97,80,73,74,83,79,78,47,103,101,116,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,91,93,92,34,58,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,92,34,64,99,111,108,117,109,110,92,34,58,92,34,105,100,44,99,114,101,97,116,101,116,105,109,101,92,34,44,92,34,64,111,114,100,101,114,92,34,58,92,34,99,114,101,97,116,101,116,105,109,101,45,92,34,125,125,125,34,44,34,69,108,97,112,115,101,100,34,58,49,56,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,49,52,55,48,54,51,51,48,50,57,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,53,58,50,54,58,52,57,46,49,56,48,51,57,54,54,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,97,112,105,47,97,80,73,74,83,79,78,47,103,101,116,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,91,93,92,34,58,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,92,34,64,99,111,108,117,109,110,92,34,58,92,34,105,100,44,99,114,101,97,116,101,116,105,109,101,92,34,44,92,34,64,111,114,100,101,114,92,34,58,92,34,99,114,101,97,116,101,116,105,109,101,45,92,34,125,44,92,34,112,97,103,101,92,34,58,49,44,92,34,99,111,117,110,116,92,34,58,53,48,44,92,34,113,117,101,114,121,92,34,58,50,125,44,92,34,116,111,116,97,108,64,92,34,58,92,34,92,34,125,34,44,34,69,108,97,112,115,101,100,34,58,49,57,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,49,53,49,52,50,48,56,48,54,57,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,53,58,50,57,58,51,57,46,51,57,53,52,54,52,56,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,115,119,97,103,103,101,114,47,99,104,101,99,107,85,114,108,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,83,119,97,103,103,101,114,67,104,101,99,107,85,114,108,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,110,117,108,108,44,34,69,108,97,112,115,101,100,34,58,49,54,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,49,53,49,57,52,57,53,50,51,55,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,53,58,51,48,58,48,48,46,48,52,56,49,51,52,52,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,97,112,105,47,97,80,73,74,83,79,78,47,103,101,116,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,91,93,92,34,58,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,92,34,64,99,111,108,117,109,110,92,34,58,92,34,105,100,44,99,114,101,97,116,101,116,105,109,101,92,34,44,92,34,64,111,114,100,101,114,92,34,58,92,34,99,114,101,97,116,101,116,105,109,101,45,92,34,125,44,92,34,112,97,103,101,92,34,58,49,44,92,34,99,111,117,110,116,92,34,58,53,48,44,92,34,113,117,101,114,121,92,34,58,50,125,44,92,34,116,111,116,97,108,92,34,58,92,34,92,34,125,34,44,34,69,108,97,112,115,101,100,34,58,49,57,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,49,54,48,57,52,49,56,48,53,51,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,53,58,51,53,58,53,49,46,51,48,57,56,56,51,55,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,115,119,97,103,103,101,114,47,99,104,101,99,107,85,114,108,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,83,119,97,103,103,101,114,67,104,101,99,107,85,114,108,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,110,117,108,108,44,34,69,108,97,112,115,101,100,34,58,50,48,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,49,54,52,48,51,49,54,52,56,53,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,53,58,51,55,58,53,50,46,48,48,54,56,55,49,52,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,97,112,105,47,97,80,73,74,83,79,78,47,103,101,116,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,92,34,64,99,111,108,117,109,110,92,34,58,92,34,105,100,44,99,114,101,97,116,101,116,105,109,101,92,34,44,92,34,105,100,92,34,58,92,34,51,50,54,53,49,54,48,57,52,49,56,48,53,51,92,34,125,125,34,44,34,69,108,97,112,115,101,100,34,58,49,56,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,50,50,48,49,50,52,57,54,48,53,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,54,58,49,52,58,50,51,46,49,53,49,54,53,53,50,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,115,119,97,103,103,101,114,47,99,104,101,99,107,85,114,108,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,83,119,97,103,103,101,114,67,104,101,99,107,85,114,108,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,110,117,108,108,44,34,69,108,97,112,115,101,100,34,58,49,53,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,50,50,50,52,48,55,48,57,56,49,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,54,58,49,53,58,53,50,46,50,57,55,55,48,50,52,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,97,112,105,47,97,80,73,74,83,79,78,47,103,101,116,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,92,34,64,99,111,108,117,109,110,92,34,58,92,34,99,111,117,110,116,40,105,100,41,58,115,92,34,125,125,34,44,34,69,108,97,112,115,101,100,34,58,49,57,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,50,50,50,54,54,55,48,54,54,49,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,54,58,49,54,58,48,50,46,52,53,50,52,56,51,56,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,97,112,105,47,97,80,73,74,83,79,78,47,103,101,116,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,92,34,64,99,111,108,117,109,110,92,34,58,92,34,99,111,117,110,116,40,49,41,58,115,92,34,125,125,34,44,34,69,108,97,112,115,101,100,34,58,49,53,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,50,50,51,48,53,51,57,51,51,51,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,54,58,49,54,58,49,55,46,53,54,52,54,54,55,51,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,97,112,105,47,97,80,73,74,83,79,78,47,103,101,116,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,92,34,64,99,111,108,117,109,110,92,34,58,92,34,99,111,117,110,116,40,49,41,58,99,111,117,110,116,92,34,125,125,34,44,34,69,108,97,112,115,101,100,34,58,49,57,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,50,50,51,53,48,48,48,51,56,57,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,54,58,49,54,58,51,52,46,57,57,48,54,50,51,50,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,97,112,105,47,97,80,73,74,83,79,78,47,103,101,116,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,92,34,64,99,111,108,117,109,110,92,34,58,92,34,99,111,117,110,116,40,49,41,58,230,149,176,233,135,143,92,34,125,125,34,44,34,69,108,97,112,115,101,100,34,58,49,55,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,50,50,51,57,48,54,52,51,56,57,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,54,58,49,54,58,53,48,46,56,54,53,56,49,49,57,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,97,112,105,47,97,80,73,74,83,79,78,47,103,101,116,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,92,34,64,99,111,108,117,109,110,92,34,58,92,34,99,111,117,110,116,40,49,41,58,230,157,161,230,149,176,92,34,125,125,34,44,34,69,108,97,112,115,101,100,34,58,49,56,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,50,57,57,51,49,57,51,55,57,55,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,55,58,48,53,58,53,54,46,54,56,51,50,51,48,57,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,115,119,97,103,103,101,114,47,99,104,101,99,107,85,114,108,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,83,119,97,103,103,101,114,67,104,101,99,107,85,114,108,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,110,117,108,108,44,34,69,108,97,112,115,101,100,34,58,49,53,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,51,50,54,54,50,50,48,51,53,55,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,55,58,50,51,58,52,51,46,49,57,51,54,55,53,52,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,85,84,34,44,34,82,101,113,117,101,115,116,85,114,108,34,58,34,104,116,116,112,58,47,47,108,111,99,97,108,104,111,115,116,58,53,48,48,53,47,115,119,97,103,103,101,114,47,99,104,101,99,107,85,114,108,34,44,34,65,99,116,105,111,110,78,97,109,101,34,58,34,83,119,97,103,103,101,114,67,104,101,99,107,85,114,108,34,44,34,82,101,113,117,101,115,116,80,97,114,97,109,34,58,34,123,92,34,83,89,83,76,79,71,79,80,92,34,58,123,92,34,64,99,111,108,117,109,110,92,34,58,92,34,105,100,44,99,114,101,97,116,101,116,105,109,101,92,34,44,92,34,105,100,92,34,58,92,34,51,50,54,53,49,54,48,57,52,49,56,48,53,51,92,34,125,125,34,44,34,69,108,97,112,115,101,100,34,58,49,54,125,125,93,44,34,116,111,116,97,108,34,58,51,55,125,44,34,101,120,116,114,97,115,34,58,110,117,108,108,44,34,116,105,109,101,34,58,34,50,48,50,52,45,48,51,45,49,52,32,49,48,58,48,48,58,52,55,34,125]},\"cookie\":[],\"responseTime\":137,\"responseSize\":9324,\"type\":\"http\",\"tempFilePath\":\"\",\"timingPhases\":{\"prepare\":1.5074999928474426,\"wait\":0.32520002126693726,\"dns\":0,\"tcp\":0,\"firstByte\":135.28540003299713,\"download\":1.2343999743461609,\"process\":0.05519998073577881,\"total\":138.40770000219345}},\"request\":{\"url\":{\"protocol\":\"http\",\"port\":\"5005\",\"path\":[\"api\",\"aPIJSON\",\"get\"],\"host\":[\"localhost\"],\"query\":[],\"variable\":[]},\"header\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\",\"system\":true},{\"key\":\"Accept\",\"value\":\"*/*\",\"system\":true},{\"key\":\"Host\",\"value\":\"localhost:5005\",\"system\":true},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\",\"system\":true},{\"key\":\"Connection\",\"value\":\"keep-alive\",\"system\":true},{\"key\":\"Content-Length\",\"value\":195,\"system\":true}],\"method\":\"POST\",\"baseUrl\":\"http://localhost:5005\",\"body\":{\"mode\":\"raw\",\"raw\":\"{\\n \\\"[]\\\": {\\n \\\"table1\\\": {\\n \\\"@column\\\": \\\"id,createtime,httpmethod,RequestUrl,actionname,RequestParam,Elapsed\\\",\\n \\\"createtime%\\\": \\\"2024-3-5,2024-3-14\\\",\\n \\\"Elapsed%\\\": \\\"1,20\\\"\\n }\\n }\\n}\",\"generateMode\":\"normal\",\"type\":\"application/json\"},\"auth\":{\"type\":\"bearer\",\"bearer\":[{\"type\":\"any\",\"value\":\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\",\"key\":\"token\"}]},\"type\":\"http\"},\"history\":{\"execution\":{\"verbose\":false,\"sessions\":{},\"data\":[{\"request\":{\"method\":\"POST\",\"href\":\"http://localhost:5005/api/aPIJSON/get\",\"headers\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\"},{\"key\":\"Accept\",\"value\":\"*/*\"},{\"key\":\"Host\",\"value\":\"localhost:5005\"},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\"},{\"key\":\"Connection\",\"value\":\"keep-alive\"},{\"key\":\"Content-Length\",\"value\":\"195\"}],\"httpVersion\":\"1.1\"},\"response\":{\"statusCode\":200,\"headers\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Thu, 14 Mar 2024 02:00:47 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.45\"},{\"key\":\"Admin.NET\",\"value\":\"Admin.NET\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86398\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-15T02:00:05.6689995Z\"}],\"httpVersion\":\"1.1\"},\"timings\":{\"start\":1710381647691,\"requestStart\":1710381647692,\"offset\":{\"request\":1.5074999928474426,\"socket\":1.8327000141143799,\"response\":137.1181000471115,\"end\":138.35250002145767,\"lookup\":1.8327000141143799,\"connect\":1.8327000141143799,\"done\":138.40770000219345}}}]}},\"responseValidation\":{},\"passed\":true,\"metaInfo\":{\"httpApiId\":151219333,\"httpApiCaseId\":143272865,\"httpApiName\":\"统一入口\",\"httpApiPath\":\"/api/aPIJSON/get\",\"httpApiMethod\":\"post\",\"httpApiCaseName\":\"列表查询\"}}","preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}},{"id":143191882,"type":"http","path":null,"name":"分页查询","responseId":405647728,"parameters":{"query":[],"path":[],"cookie":[],"header":[]},"commonParameters":{"query":[],"body":[],"header":[],"cookie":[]},"requestBody":{"parameters":[],"data":"{\r\n \"[]\": {//列表\r\n \"SYSLOGOP\": {//表名\r\n \"@column\": \"id,createtime\",//只查询两列\r\n \"@order\":\"createtime-\" //-倒序排序\r\n },\r\n \"page\": 1, //分页查询:第1页\r\n \"count\": 3, //每页3条\r\n //\"query\": 1 //查询内容: 0-对象,1-总数,2-数据、总数,默认为2\r\n },\r\n //\"total\": \"\", //总数 默认返回总数,不用传\r\n \r\n}","generateMode":"normal"},"auth":{},"advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":2,"disableUrlEncoding":false},"requestResult":"{\"id\":\"temp.bcfe838e-0335-42f2-ae40-05fb07285447\",\"cursor\":{\"position\":0,\"iteration\":0,\"length\":1,\"cycles\":1,\"empty\":false,\"eof\":false,\"bof\":true,\"cr\":false,\"ref\":\"bcfe838e-0335-42f2-ae40-05fb07285447\",\"requestIndex\":0,\"httpRequestId\":\"74d59ab7-76bd-4c77-9bcf-714ff5eb470e\"},\"type\":\"http\",\"response\":{\"id\":\"673bc01a-a4df-4514-b2e9-b13172c5eca8\",\"status\":\"OK\",\"code\":200,\"header\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Tue, 12 Mar 2024 08:29:32 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.45\"},{\"key\":\"Admin.NET\",\"value\":\"Admin.NET\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86398\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-13T08:27:50.0233019Z\"}],\"trailer\":[],\"stream\":{\"type\":\"Buffer\",\"data\":[123,34,99,111,100,101,34,58,50,48,48,44,34,116,121,112,101,34,58,34,115,117,99,99,101,115,115,34,44,34,109,101,115,115,97,103,101,34,58,34,34,44,34,114,101,115,117,108,116,34,58,123,34,91,93,34,58,91,123,34,83,89,83,76,79,71,79,80,34,58,123,34,73,100,34,58,51,50,55,56,53,49,52,51,50,52,49,53,52,49,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,49,50,32,49,54,58,50,57,58,50,55,46,56,48,55,57,53,49,52,34,125,125,44,123,34,83,89,83,76,79,71,79,80,34,58,123,34,73,100,34,58,51,50,55,56,53,49,49,56,51,48,53,56,54,49,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,49,50,32,49,54,58,50,55,58,53,48,46,52,48,50,49,56,34,125,125,44,123,34,83,89,83,76,79,71,79,80,34,58,123,34,73,100,34,58,51,50,55,56,53,49,49,53,55,51,54,51,56,57,44,34,67,114,101,97,116,101,84,105,109,101,34,58,34,50,48,50,52,45,48,51,45,49,50,32,49,54,58,50,55,58,52,48,46,51,54,53,57,51,48,54,34,125,125,93,44,34,112,97,103,101,34,58,49,44,34,99,111,117,110,116,34,58,51,44,34,109,97,120,34,58,49,50,49,44,34,116,111,116,97,108,34,58,51,54,49,125,44,34,101,120,116,114,97,115,34,58,110,117,108,108,44,34,116,105,109,101,34,58,34,50,48,50,52,45,48,51,45,49,50,32,49,54,58,50,57,58,51,51,34,125]},\"cookie\":[],\"responseTime\":72,\"responseSize\":376,\"type\":\"http\",\"tempFilePath\":\"\",\"timingPhases\":{\"prepare\":1.7229999899864197,\"wait\":0.46160000562667847,\"dns\":0,\"tcp\":0,\"firstByte\":69.22839999198914,\"download\":1.886900007724762,\"process\":0.04899996519088745,\"total\":73.34889996051788}},\"request\":{\"url\":{\"protocol\":\"http\",\"port\":\"5005\",\"path\":[\"api\",\"aPIJSON\",\"get\"],\"host\":[\"localhost\"],\"query\":[],\"variable\":[]},\"header\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\",\"system\":true},{\"key\":\"Accept\",\"value\":\"*/*\",\"system\":true},{\"key\":\"Host\",\"value\":\"localhost:5005\",\"system\":true},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\",\"system\":true},{\"key\":\"Connection\",\"value\":\"keep-alive\",\"system\":true},{\"key\":\"Content-Length\",\"value\":136,\"system\":true}],\"method\":\"POST\",\"baseUrl\":\"http://localhost:5005\",\"body\":{\"mode\":\"raw\",\"raw\":\"{\\n \\\"[]\\\": {\\n \\\"SYSLOGOP\\\": {\\n \\\"@column\\\": \\\"id,createtime\\\",\\n \\\"@order\\\": \\\"createtime-\\\"\\n },\\n \\\"page\\\": 1,\\n \\\"count\\\": 3\\n }\\n}\",\"generateMode\":\"normal\",\"type\":\"application/json\"},\"auth\":{\"type\":\"bearer\",\"bearer\":[{\"type\":\"any\",\"value\":\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\",\"key\":\"token\"}]},\"type\":\"http\"},\"history\":{\"execution\":{\"verbose\":false,\"sessions\":{},\"data\":[{\"request\":{\"method\":\"POST\",\"href\":\"http://localhost:5005/api/aPIJSON/get\",\"headers\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\"},{\"key\":\"Accept\",\"value\":\"*/*\"},{\"key\":\"Host\",\"value\":\"localhost:5005\"},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\"},{\"key\":\"Connection\",\"value\":\"keep-alive\"},{\"key\":\"Content-Length\",\"value\":\"136\"}],\"httpVersion\":\"1.1\"},\"response\":{\"statusCode\":200,\"headers\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Tue, 12 Mar 2024 08:29:32 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.45\"},{\"key\":\"Admin.NET\",\"value\":\"Admin.NET\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86398\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-13T08:27:50.0233019Z\"}],\"httpVersion\":\"1.1\"},\"timings\":{\"start\":1710232173277,\"requestStart\":1710232173279,\"offset\":{\"request\":1.7229999899864197,\"socket\":2.184599995613098,\"response\":71.41299998760223,\"end\":73.299899995327,\"lookup\":2.184599995613098,\"connect\":2.184599995613098,\"done\":73.34889996051788}}}]}},\"responseValidation\":{},\"passed\":true,\"metaInfo\":{\"httpApiId\":151219333,\"httpApiCaseId\":143191882,\"httpApiName\":\"统一入口\",\"httpApiPath\":\"/api/aPIJSON/get\",\"httpApiMethod\":\"post\",\"httpApiCaseName\":\"分页查询\"}}","preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}},{"id":143312444,"type":"http","path":null,"name":"查询数量(聚合函数)","responseId":0,"parameters":{"query":[],"path":[],"cookie":[],"header":[]},"commonParameters":{"query":[],"body":[],"header":[],"cookie":[]},"requestBody":{"parameters":[],"data":"{\r\n \"SYSLOGOP\": {\r\n \"@column\": \"count(1):数量,sum(id):合计\",//支持聚合函数count、sum等, :后跟别名\r\n \"httpmethod\":\"GET\"\r\n }\r\n}","generateMode":"normal"},"auth":{},"advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":2,"disableUrlEncoding":false},"requestResult":"{\"id\":\"temp.8cdec2eb-2a6e-4b14-b841-d45980eb6969\",\"cursor\":{\"position\":0,\"iteration\":0,\"length\":1,\"cycles\":1,\"empty\":false,\"eof\":false,\"bof\":true,\"cr\":false,\"ref\":\"8cdec2eb-2a6e-4b14-b841-d45980eb6969\",\"requestIndex\":0,\"httpRequestId\":\"b833e53d-ca56-464c-a0f3-bf293186f3c0\"},\"type\":\"http\",\"response\":{\"id\":\"c4a883ba-8b68-4bcf-b155-5300deb9b77e\",\"status\":\"OK\",\"code\":200,\"header\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Tue, 12 Mar 2024 03:49:08 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.45\"},{\"key\":\"Admin.NET\",\"value\":\"Admin.NET\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86393\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-13T03:46:44.5267221Z\"}],\"trailer\":[],\"stream\":{\"type\":\"Buffer\",\"data\":[123,34,99,111,100,101,34,58,50,48,48,44,34,116,121,112,101,34,58,34,115,117,99,99,101,115,115,34,44,34,109,101,115,115,97,103,101,34,58,34,34,44,34,114,101,115,117,108,116,34,58,123,34,83,89,83,76,79,71,79,80,34,58,123,34,230,149,176,233,135,143,34,58,54,44,34,229,144,136,232,174,161,34,58,49,57,53,56,55,56,50,53,54,53,53,56,55,53,48,125,125,44,34,101,120,116,114,97,115,34,58,110,117,108,108,44,34,116,105,109,101,34,58,34,50,48,50,52,45,48,51,45,49,50,32,49,49,58,52,57,58,48,56,34,125]},\"cookie\":[],\"responseTime\":57,\"responseSize\":145,\"type\":\"http\",\"tempFilePath\":\"\",\"timingPhases\":{\"prepare\":2.178399980068207,\"wait\":0.46469998359680176,\"dns\":0,\"tcp\":0,\"firstByte\":54.569000005722046,\"download\":1.8371000289916992,\"process\":0.08829998970031738,\"total\":59.13749998807907}},\"request\":{\"url\":{\"protocol\":\"http\",\"port\":\"5005\",\"path\":[\"api\",\"aPIJSON\",\"get\"],\"host\":[\"localhost\"],\"query\":[],\"variable\":[]},\"header\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\",\"system\":true},{\"key\":\"Accept\",\"value\":\"*/*\",\"system\":true},{\"key\":\"Host\",\"value\":\"localhost:5005\",\"system\":true},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\",\"system\":true},{\"key\":\"Connection\",\"value\":\"keep-alive\",\"system\":true},{\"key\":\"Content-Length\",\"value\":96,\"system\":true}],\"method\":\"POST\",\"baseUrl\":\"http://localhost:5005\",\"body\":{\"mode\":\"raw\",\"raw\":\"{\\n \\\"SYSLOGOP\\\": {\\n \\\"@column\\\": \\\"count(1):数量,sum(id):合计\\\",\\n \\\"httpmethod\\\": \\\"GET\\\"\\n }\\n}\",\"generateMode\":\"normal\",\"type\":\"application/json\"},\"auth\":{\"type\":\"bearer\",\"bearer\":[{\"type\":\"any\",\"value\":\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\",\"key\":\"token\"}]},\"type\":\"http\"},\"history\":{\"execution\":{\"verbose\":false,\"sessions\":{},\"data\":[{\"request\":{\"method\":\"POST\",\"href\":\"http://localhost:5005/api/aPIJSON/get\",\"headers\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\"},{\"key\":\"Accept\",\"value\":\"*/*\"},{\"key\":\"Host\",\"value\":\"localhost:5005\"},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\"},{\"key\":\"Connection\",\"value\":\"keep-alive\"},{\"key\":\"Content-Length\",\"value\":\"96\"}],\"httpVersion\":\"1.1\"},\"response\":{\"statusCode\":200,\"headers\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Tue, 12 Mar 2024 03:49:08 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.45\"},{\"key\":\"Admin.NET\",\"value\":\"Admin.NET\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86393\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-13T03:46:44.5267221Z\"}],\"httpVersion\":\"1.1\"},\"timings\":{\"start\":1710215348896,\"requestStart\":1710215348898,\"offset\":{\"request\":2.178399980068207,\"socket\":2.6430999636650085,\"response\":57.212099969387054,\"end\":59.049199998378754,\"lookup\":2.6430999636650085,\"connect\":2.6430999636650085,\"done\":59.13749998807907}}}]}},\"responseValidation\":{},\"passed\":true,\"metaInfo\":{\"httpApiId\":151219333,\"httpApiCaseId\":143312444,\"httpApiName\":\"统一入口\",\"httpApiPath\":\"/api/aPIJSON/get\",\"httpApiMethod\":\"post\",\"httpApiCaseName\":\"查询数量(聚合函数)\"}}","preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}},{"id":143871046,"type":"http","path":null,"name":"关联查询","responseId":0,"parameters":{"query":[],"path":[],"cookie":[],"header":[]},"commonParameters":{"query":[],"body":[],"header":[],"cookie":[]},"requestBody":{"parameters":[],"data":"//用于子表补充数据,没有实现join\r\n{\r\n \"[]\": {\r\n //必须先查子表,再循环补充主表数据\r\n \"table3\": {\r\n //\"@column\": \"id\",//必须在此返回后面的关联列\r\n \"text\": \"update3\",\r\n \"@order\": \"id-\", //只能在第一个表排序\r\n },\r\n \"table2\": {\r\n \"id@\": \"/table3/table2id\",\r\n //\"@order\": \"id-\", //这里排序无效\r\n },\r\n \"table1\": {\r\n \"@column\": \"id,httpmethod\",\r\n \"id@\": \"/table2/table1id\",\r\n },\r\n \"table4\": {\r\n \"id@\": \"/table3/table4id\",\r\n },\r\n \"page\": 1,\r\n \"count\": 3\r\n }\r\n}","generateMode":"normal"},"auth":{},"advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":2,"disableUrlEncoding":false},"requestResult":"{\"id\":\"temp.59b633e1-8099-48e6-9943-d0e27e50cae7\",\"cursor\":{\"position\":0,\"iteration\":0,\"length\":1,\"cycles\":1,\"empty\":false,\"eof\":false,\"bof\":true,\"cr\":false,\"ref\":\"59b633e1-8099-48e6-9943-d0e27e50cae7\",\"requestIndex\":0,\"httpRequestId\":\"a04d8d6c-aad7-4eaa-8fe4-11d3edaf05e7\"},\"type\":\"http\",\"response\":{\"id\":\"1a94a35f-3d89-44ef-8923-0f9c5d54e59d\",\"status\":\"OK\",\"code\":200,\"header\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Thu, 14 Mar 2024 03:53:26 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.45\"},{\"key\":\"Admin.NET\",\"value\":\"Admin.NET\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86399\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-15T03:53:27.0136472Z\"}],\"trailer\":[],\"stream\":{\"type\":\"Buffer\",\"data\":[123,34,99,111,100,101,34,58,50,48,48,44,34,116,121,112,101,34,58,34,115,117,99,99,101,115,115,34,44,34,109,101,115,115,97,103,101,34,58,34,34,44,34,114,101,115,117,108,116,34,58,123,34,91,93,34,58,91,123,34,116,97,98,108,101,51,34,58,123,34,105,100,34,58,51,51,51,44,34,116,97,98,108,101,50,105,100,34,58,50,51,44,34,116,101,120,116,34,58,34,117,112,100,97,116,101,51,34,44,34,116,97,98,108,101,52,105,100,34,58,52,52,125,44,34,116,97,98,108,101,50,34,58,123,34,105,100,34,58,50,51,44,34,116,101,120,116,34,58,34,110,101,119,103,101,116,34,44,34,116,97,98,108,101,49,105,100,34,58,51,50,54,53,51,50,51,54,56,53,48,55,53,55,44,34,105,115,68,101,108,101,116,101,34,58,48,125,44,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,51,50,51,54,56,53,48,55,53,55,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,68,69,76,69,84,69,34,125,44,34,116,97,98,108,101,52,34,58,123,34,105,100,34,58,52,52,44,34,116,101,120,116,34,58,34,52,52,34,125,125,44,123,34,116,97,98,108,101,51,34,58,123,34,105,100,34,58,51,51,44,34,116,97,98,108,101,50,105,100,34,58,50,51,44,34,116,101,120,116,34,58,34,117,112,100,97,116,101,51,34,44,34,116,97,98,108,101,52,105,100,34,58,52,51,125,44,34,116,97,98,108,101,50,34,58,123,34,105,100,34,58,50,51,44,34,116,101,120,116,34,58,34,110,101,119,103,101,116,34,44,34,116,97,98,108,101,49,105,100,34,58,51,50,54,53,51,50,51,54,56,53,48,55,53,55,44,34,105,115,68,101,108,101,116,101,34,58,48,125,44,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,51,50,51,54,56,53,48,55,53,55,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,68,69,76,69,84,69,34,125,125,44,123,34,116,97,98,108,101,51,34,58,123,34,105,100,34,58,51,50,44,34,116,97,98,108,101,50,105,100,34,58,50,50,44,34,116,101,120,116,34,58,34,117,112,100,97,116,101,51,34,44,34,116,97,98,108,101,52,105,100,34,58,52,50,125,44,34,116,97,98,108,101,50,34,58,123,34,105,100,34,58,50,50,44,34,116,101,120,116,34,58,34,110,101,119,103,101,116,34,44,34,116,97,98,108,101,49,105,100,34,58,51,50,54,53,51,50,51,56,56,48,48,57,54,53,44,34,105,115,68,101,108,101,116,101,34,58,48,125,44,34,116,97,98,108,101,49,34,58,123,34,73,100,34,58,51,50,54,53,51,50,51,56,56,48,48,57,54,53,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,71,69,84,34,125,44,34,116,97,98,108,101,52,34,58,123,34,105,100,34,58,52,50,44,34,116,101,120,116,34,58,34,52,50,34,125,125,93,44,34,112,97,103,101,34,58,49,44,34,99,111,117,110,116,34,58,51,44,34,109,97,120,34,58,50,44,34,116,111,116,97,108,34,58,52,125,44,34,101,120,116,114,97,115,34,58,110,117,108,108,44,34,116,105,109,101,34,58,34,50,48,50,52,45,48,51,45,49,52,32,49,49,58,53,51,58,50,55,34,125]},\"cookie\":[],\"responseTime\":590,\"responseSize\":779,\"type\":\"http\",\"tempFilePath\":\"\",\"timingPhases\":{\"prepare\":2.1902999877929688,\"wait\":1.2958000302314758,\"dns\":0.8892999887466431,\"tcp\":0.6733999848365784,\"firstByte\":584.8849999904633,\"download\":1.787600040435791,\"process\":0.033399999141693115,\"total\":591.7548000216484}},\"request\":{\"url\":{\"protocol\":\"http\",\"port\":\"5005\",\"path\":[\"api\",\"aPIJSON\",\"get\"],\"host\":[\"localhost\"],\"query\":[],\"variable\":[]},\"header\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\",\"system\":true},{\"key\":\"Accept\",\"value\":\"*/*\",\"system\":true},{\"key\":\"Host\",\"value\":\"localhost:5005\",\"system\":true},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\",\"system\":true},{\"key\":\"Connection\",\"value\":\"keep-alive\",\"system\":true},{\"key\":\"Content-Length\",\"value\":316,\"system\":true}],\"method\":\"POST\",\"baseUrl\":\"http://localhost:5005\",\"body\":{\"mode\":\"raw\",\"raw\":\"{\\n \\\"[]\\\": {\\n \\\"table3\\\": {\\n \\\"text\\\": \\\"update3\\\",\\n \\\"@order\\\": \\\"id-\\\"\\n },\\n \\\"table2\\\": {\\n \\\"id@\\\": \\\"/table3/table2id\\\"\\n },\\n \\\"table1\\\": {\\n \\\"@column\\\": \\\"id,httpmethod\\\",\\n \\\"id@\\\": \\\"/table2/table1id\\\"\\n },\\n \\\"table4\\\": {\\n \\\"id@\\\": \\\"/table3/table4id\\\"\\n },\\n \\\"page\\\": 1,\\n \\\"count\\\": 3\\n }\\n}\",\"generateMode\":\"normal\",\"type\":\"application/json\"},\"auth\":{\"type\":\"bearer\",\"bearer\":[{\"type\":\"any\",\"value\":\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\",\"key\":\"token\"}]},\"type\":\"http\"},\"history\":{\"execution\":{\"verbose\":false,\"sessions\":{},\"data\":[{\"request\":{\"method\":\"POST\",\"href\":\"http://localhost:5005/api/aPIJSON/get\",\"headers\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\"},{\"key\":\"Accept\",\"value\":\"*/*\"},{\"key\":\"Host\",\"value\":\"localhost:5005\"},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\"},{\"key\":\"Connection\",\"value\":\"keep-alive\"},{\"key\":\"Content-Length\",\"value\":\"316\"}],\"httpVersion\":\"1.1\"},\"response\":{\"statusCode\":200,\"headers\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Thu, 14 Mar 2024 03:53:26 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.45\"},{\"key\":\"Admin.NET\",\"value\":\"Admin.NET\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86399\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-15T03:53:27.0136472Z\"}],\"httpVersion\":\"1.1\"},\"timings\":{\"start\":1710388406828,\"requestStart\":1710388406830,\"offset\":{\"request\":2.1902999877929688,\"socket\":3.4861000180244446,\"lookup\":4.375400006771088,\"connect\":5.048799991607666,\"response\":589.9337999820709,\"end\":591.7214000225067,\"done\":591.7548000216484}}}]}},\"responseValidation\":{},\"passed\":true,\"metaInfo\":{\"httpApiId\":151219333,\"httpApiCaseId\":143871046,\"httpApiName\":\"统一查询入口\",\"httpApiPath\":\"/api/aPIJSON/get\",\"httpApiMethod\":\"post\",\"httpApiCaseName\":\"关联查询\"}}","preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}},{"id":143975340,"type":"http","path":null,"name":"group by","responseId":0,"parameters":{"query":[],"path":[],"cookie":[],"header":[]},"commonParameters":{"query":[],"body":[],"header":[],"cookie":[]},"requestBody":{"parameters":[],"data":"{\r\n \"[]\": {\r\n \"table1\": {\r\n \"@column\": \"actionname,httpmethod,max(id)\",\r\n \"@group\": \"actionname,httpmethod\",\r\n },\r\n }\r\n}","generateMode":"normal"},"auth":{},"advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":2,"disableUrlEncoding":false},"requestResult":"{\"id\":\"temp.00314312-a9fe-4ad2-859c-b7555f9a0d3e\",\"cursor\":{\"position\":0,\"iteration\":0,\"length\":1,\"cycles\":1,\"empty\":false,\"eof\":false,\"bof\":true,\"cr\":false,\"ref\":\"00314312-a9fe-4ad2-859c-b7555f9a0d3e\",\"requestIndex\":0,\"httpRequestId\":\"e6ba19a4-e4f9-4412-9b45-f48e81bb7277\"},\"type\":\"http\",\"response\":{\"id\":\"6134deb2-55f4-419b-9387-38ae669f137f\",\"status\":\"OK\",\"code\":200,\"header\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Fri, 08 Mar 2024 08:23:12 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.32\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86397\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-09T08:14:42.5201051Z\"}],\"trailer\":[],\"stream\":{\"type\":\"Buffer\",\"data\":[123,34,99,111,100,101,34,58,50,48,48,44,34,116,121,112,101,34,58,34,115,117,99,99,101,115,115,34,44,34,109,101,115,115,97,103,101,34,58,34,34,44,34,114,101,115,117,108,116,34,58,123,34,91,93,34,58,91,123,34,116,97,98,108,101,49,34,58,123,34,65,99,116,105,111,110,78,97,109,101,34,58,34,80,111,115,116,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,109,97,120,40,105,100,41,34,58,51,50,53,50,49,51,57,56,52,53,52,51,52,49,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,109,97,120,40,105,100,41,34,58,51,50,54,53,51,50,51,56,56,48,48,57,54,53,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,65,99,116,105,111,110,78,97,109,101,34,58,34,81,117,101,114,121,66,121,84,97,98,108,101,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,109,97,120,40,105,100,41,34,58,51,50,54,52,55,52,52,57,50,50,54,51,48,57,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,65,99,116,105,111,110,78,97,109,101,34,58,34,82,101,109,111,118,101,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,109,97,120,40,105,100,41,34,58,51,50,54,53,51,49,53,48,50,48,55,53,53,55,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,65,99,116,105,111,110,78,97,109,101,34,58,34,83,119,97,103,103,101,114,67,104,101,99,107,85,114,108,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,109,97,120,40,105,100,41,34,58,51,50,54,53,51,50,54,54,50,50,48,51,53,55,125,125,44,123,34,116,97,98,108,101,49,34,58,123,34,65,99,116,105,111,110,78,97,109,101,34,58,34,83,119,97,103,103,101,114,83,117,98,109,105,116,85,114,108,34,44,34,72,116,116,112,77,101,116,104,111,100,34,58,34,80,79,83,84,34,44,34,109,97,120,40,105,100,41,34,58,51,50,54,53,48,52,50,57,50,50,50,50,49,51,125,125,93,125,44,34,101,120,116,114,97,115,34,58,110,117,108,108,44,34,116,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,56,32,49,54,58,50,51,58,49,51,34,125]},\"cookie\":[],\"responseTime\":8399,\"responseSize\":605,\"type\":\"http\",\"tempFilePath\":\"\",\"timingPhases\":{\"prepare\":2.243699997663498,\"wait\":0.2954000011086464,\"dns\":0,\"tcp\":0,\"firstByte\":8396.081299997866,\"download\":1.9274000003933907,\"process\":0.052000001072883606,\"total\":8400.599799998105}},\"request\":{\"url\":{\"protocol\":\"http\",\"port\":\"5005\",\"path\":[\"api\",\"aPIJSON\",\"get\"],\"host\":[\"localhost\"],\"query\":[],\"variable\":[]},\"header\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\",\"system\":true},{\"key\":\"Accept\",\"value\":\"*/*\",\"system\":true},{\"key\":\"Host\",\"value\":\"localhost:5005\",\"system\":true},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\",\"system\":true},{\"key\":\"Connection\",\"value\":\"keep-alive\",\"system\":true},{\"key\":\"Content-Length\",\"value\":162,\"system\":true}],\"method\":\"POST\",\"baseUrl\":\"http://localhost:5005\",\"body\":{\"mode\":\"raw\",\"raw\":\"{\\r\\n \\\"[]\\\": {\\r\\n \\\"table1\\\": {\\r\\n \\\"@column\\\": \\\"actionname,httpmethod,max(id)\\\",\\r\\n \\\"@group\\\": \\\"actionname,httpmethod\\\",\\r\\n },\\r\\n }\\r\\n}\",\"generateMode\":\"normal\",\"type\":\"application/json\"},\"auth\":{\"type\":\"bearer\",\"bearer\":[{\"type\":\"any\",\"value\":\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\",\"key\":\"token\"}]},\"type\":\"http\"},\"history\":{\"execution\":{\"verbose\":false,\"sessions\":{},\"data\":[{\"request\":{\"method\":\"POST\",\"href\":\"http://localhost:5005/api/aPIJSON/get\",\"headers\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\"},{\"key\":\"Accept\",\"value\":\"*/*\"},{\"key\":\"Host\",\"value\":\"localhost:5005\"},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\"},{\"key\":\"Connection\",\"value\":\"keep-alive\"},{\"key\":\"Content-Length\",\"value\":\"162\"}],\"httpVersion\":\"1.1\"},\"response\":{\"statusCode\":200,\"headers\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Fri, 08 Mar 2024 08:23:12 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.32\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86397\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-09T08:14:42.5201051Z\"}],\"httpVersion\":\"1.1\"},\"timings\":{\"start\":1709886184664,\"requestStart\":1709886184667,\"offset\":{\"request\":2.243699997663498,\"socket\":2.5390999987721443,\"response\":8398.620399996638,\"end\":8400.547799997032,\"lookup\":2.5390999987721443,\"connect\":2.5390999987721443,\"done\":8400.599799998105}}}]}},\"responseValidation\":{},\"passed\":true,\"metaInfo\":{\"httpApiId\":151219333,\"httpApiCaseId\":143975340,\"httpApiName\":\"统一入口\",\"httpApiPath\":\"/api/aPIJSON/get\",\"httpApiMethod\":\"post\",\"httpApiCaseName\":\"group by\"}}","preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{}},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.405647728"],"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"新增","api":{"id":"152848473","method":"post","path":"/api/aPIJSON/post","parameters":{"query":[],"path":[],"cookie":[],"header":[]},"auth":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"408753512","name":"Success","code":200,"contentType":"json","jsonSchema":{"$ref":"#/definitions/84275190"}}],"responseExamples":[],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","additionalProperties":{"$ref":"#/definitions/84275307"},"x-apifox-orders":[]},"example":"{\r\n \"table2\": \r\n {\r\n //\"id\": 236, //如果传id,就用前端id,如果没有,就后端生成\r\n \"text\": \"newget\"\r\n }\r\n\r\n}"},"description":"","tags":["aPIJSON"],"status":"released","serverId":"","operationId":"api-aPIJSON-post-Post","sourceUrl":"","ordering":12,"cases":[{"id":144371019,"type":"http","path":null,"name":"单条","responseId":0,"parameters":{"query":[],"header":[],"cookie":[],"path":[]},"commonParameters":{"query":[],"body":[],"header":[],"cookie":[]},"requestBody":{"parameters":[],"data":"{\r\n \"table2\": \r\n {\r\n //\"id\": 236, //如果传id,就用前端id,如果没有,就后端生成\r\n \"text\": \"newget\"\r\n }\r\n\r\n}","type":"application/json"},"auth":{},"advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":2,"disableUrlEncoding":false},"requestResult":"{\"id\":\"temp.04906a0f-2a35-491b-8335-13c224a6e496\",\"cursor\":{\"position\":0,\"iteration\":0,\"length\":1,\"cycles\":1,\"empty\":false,\"eof\":false,\"bof\":true,\"cr\":false,\"ref\":\"04906a0f-2a35-491b-8335-13c224a6e496\",\"requestIndex\":0,\"httpRequestId\":\"8b54192a-17b5-4a20-b7c0-115533d436f3\"},\"type\":\"http\",\"response\":{\"id\":\"000965cc-02df-4aae-8b23-18368ab61ecb\",\"status\":\"OK\",\"code\":200,\"header\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Mon, 11 Mar 2024 06:58:40 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.32\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86395\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-12T06:48:49.8348531Z\"}],\"trailer\":[],\"stream\":{\"type\":\"Buffer\",\"data\":[123,34,99,111,100,101,34,58,50,48,48,44,34,116,121,112,101,34,58,34,115,117,99,99,101,115,115,34,44,34,109,101,115,115,97,103,101,34,58,34,34,44,34,114,101,115,117,108,116,34,58,123,34,116,97,98,108,101,50,34,58,91,51,50,55,54,49,54,51,48,53,50,52,57,57,55,44,50,51,56,93,44,34,116,97,98,108,101,51,34,58,51,50,55,54,49,54,51,48,53,50,56,48,54,57,125,44,34,101,120,116,114,97,115,34,58,110,117,108,108,44,34,116,105,109,101,34,58,34,50,48,50,52,45,48,51,45,49,49,32,49,52,58,53,56,58,52,49,34,125]},\"cookie\":[],\"responseTime\":118,\"responseSize\":150,\"type\":\"http\",\"tempFilePath\":\"\",\"timingPhases\":{\"prepare\":2.154699981212616,\"wait\":0.394599974155426,\"dns\":0,\"tcp\":0,\"firstByte\":114.57359999418259,\"download\":2.3081000447273254,\"process\":0.08730000257492065,\"total\":119.51829999685287}},\"request\":{\"url\":{\"protocol\":\"http\",\"port\":\"5005\",\"path\":[\"api\",\"aPIJSON\",\"post\"],\"host\":[\"localhost\"],\"query\":[],\"variable\":[]},\"header\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\",\"system\":true},{\"key\":\"Accept\",\"value\":\"*/*\",\"system\":true},{\"key\":\"Host\",\"value\":\"localhost:5005\",\"system\":true},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\",\"system\":true},{\"key\":\"Connection\",\"value\":\"keep-alive\",\"system\":true},{\"key\":\"Content-Length\",\"value\":171,\"system\":true}],\"method\":\"POST\",\"baseUrl\":\"http://localhost:5005\",\"body\":{\"mode\":\"raw\",\"raw\":\"{\\n \\\"table2\\\": [\\n {\\n \\\"text\\\": \\\"newget\\\"\\n },\\n {\\n \\\"id\\\": 238,\\n \\\"text\\\": \\\"newget2\\\"\\n }\\n ],\\n \\\"table3\\\": {\\n \\\"table2id\\\": 238,\\n \\\"text\\\": \\\"newget\\\"\\n }\\n}\",\"type\":\"application/json\"},\"auth\":{\"type\":\"bearer\",\"bearer\":[{\"type\":\"any\",\"value\":\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\",\"key\":\"token\"}]},\"type\":\"http\"},\"history\":{\"execution\":{\"verbose\":false,\"sessions\":{},\"data\":[{\"request\":{\"method\":\"POST\",\"href\":\"http://localhost:5005/api/aPIJSON/post\",\"headers\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\"},{\"key\":\"Accept\",\"value\":\"*/*\"},{\"key\":\"Host\",\"value\":\"localhost:5005\"},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\"},{\"key\":\"Connection\",\"value\":\"keep-alive\"},{\"key\":\"Content-Length\",\"value\":\"171\"}],\"httpVersion\":\"1.1\"},\"response\":{\"statusCode\":200,\"headers\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Mon, 11 Mar 2024 06:58:40 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.32\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86395\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-12T06:48:49.8348531Z\"}],\"httpVersion\":\"1.1\"},\"timings\":{\"start\":1710140321198,\"requestStart\":1710140321200,\"offset\":{\"request\":2.154699981212616,\"socket\":2.549299955368042,\"response\":117.12289994955063,\"end\":119.43099999427795,\"lookup\":2.549299955368042,\"connect\":2.549299955368042,\"done\":119.51829999685287}}}]}},\"responseValidation\":{},\"passed\":true,\"metaInfo\":{\"httpApiId\":152848473,\"httpApiName\":\"新增\",\"httpApiPath\":\"/api/aPIJSON/post\",\"httpApiMethod\":\"post\",\"httpApiCaseName\":\"成功\"}}","preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}},{"id":144370602,"type":"http","path":null,"name":"多表批量","responseId":0,"parameters":{"query":[],"path":[],"cookie":[],"header":[]},"commonParameters":{"query":[],"body":[],"header":[],"cookie":[]},"requestBody":{"parameters":[],"data":"{\r\n \"table2\": [\r\n {\r\n //\"id\": 236, //如果传id,就用前端id,如果没有,就后端生成\r\n \"text\": \"newget\"\r\n },\r\n {\r\n \"id\": 240,\r\n \"text\": \"newget2\"\r\n }\r\n ],\r\n \"table3\":{\r\n \"table2id\":240,\r\n \"text\":\"newget\"\r\n }\r\n}","generateMode":"normal"},"auth":{},"advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":2,"disableUrlEncoding":false},"requestResult":"{\"id\":\"temp.89a3b724-e244-47bd-8332-b18d13b87f39\",\"cursor\":{\"position\":0,\"iteration\":0,\"length\":1,\"cycles\":1,\"empty\":false,\"eof\":false,\"bof\":true,\"cr\":false,\"ref\":\"89a3b724-e244-47bd-8332-b18d13b87f39\",\"requestIndex\":0,\"httpRequestId\":\"c4ff5552-4d6b-4816-bac7-951f9acbd466\"},\"type\":\"http\",\"response\":{\"id\":\"a2e99ccb-e877-4151-9d9e-157c49c50e65\",\"status\":\"OK\",\"code\":200,\"header\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Mon, 11 Mar 2024 07:32:24 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.32\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86398\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-12T07:30:34.5282454Z\"}],\"trailer\":[],\"stream\":{\"type\":\"Buffer\",\"data\":[123,34,99,111,100,101,34,58,50,48,48,44,34,116,121,112,101,34,58,34,115,117,99,99,101,115,115,34,44,34,109,101,115,115,97,103,101,34,58,34,34,44,34,114,101,115,117,108,116,34,58,123,34,116,97,98,108,101,50,34,58,123,34,105,100,34,58,91,51,50,55,54,50,49,52,56,54,49,48,54,50,57,44,50,52,48,93,44,34,99,111,117,110,116,34,58,50,125,44,34,116,97,98,108,101,51,34,58,123,34,105,100,34,58,51,50,55,54,50,49,52,56,54,49,55,53,52,49,125,125,44,34,101,120,116,114,97,115,34,58,110,117,108,108,44,34,116,105,109,101,34,58,34,50,48,50,52,45,48,51,45,49,49,32,49,53,58,51,50,58,50,53,34,125]},\"cookie\":[],\"responseTime\":168,\"responseSize\":174,\"type\":\"http\",\"tempFilePath\":\"\",\"timingPhases\":{\"prepare\":1.51419997215271,\"wait\":0.2290000319480896,\"dns\":0,\"tcp\":0,\"firstByte\":165.6187999844551,\"download\":1.2360000014305115,\"process\":0.05760002136230469,\"total\":168.65560001134872}},\"request\":{\"url\":{\"protocol\":\"http\",\"port\":\"5005\",\"path\":[\"api\",\"aPIJSON\",\"post\"],\"host\":[\"localhost\"],\"query\":[],\"variable\":[]},\"header\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\",\"system\":true},{\"key\":\"Accept\",\"value\":\"*/*\",\"system\":true},{\"key\":\"Host\",\"value\":\"localhost:5005\",\"system\":true},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\",\"system\":true},{\"key\":\"Connection\",\"value\":\"keep-alive\",\"system\":true},{\"key\":\"Content-Length\",\"value\":171,\"system\":true}],\"method\":\"POST\",\"baseUrl\":\"http://localhost:5005\",\"body\":{\"mode\":\"raw\",\"raw\":\"{\\n \\\"table2\\\": [\\n {\\n \\\"text\\\": \\\"newget\\\"\\n },\\n {\\n \\\"id\\\": 240,\\n \\\"text\\\": \\\"newget2\\\"\\n }\\n ],\\n \\\"table3\\\": {\\n \\\"table2id\\\": 240,\\n \\\"text\\\": \\\"newget\\\"\\n }\\n}\",\"generateMode\":\"normal\",\"type\":\"application/json\"},\"auth\":{\"type\":\"bearer\",\"bearer\":[{\"type\":\"any\",\"value\":\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\",\"key\":\"token\"}]},\"type\":\"http\"},\"history\":{\"execution\":{\"verbose\":false,\"sessions\":{},\"data\":[{\"request\":{\"method\":\"POST\",\"href\":\"http://localhost:5005/api/aPIJSON/post\",\"headers\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\"},{\"key\":\"Accept\",\"value\":\"*/*\"},{\"key\":\"Host\",\"value\":\"localhost:5005\"},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\"},{\"key\":\"Connection\",\"value\":\"keep-alive\"},{\"key\":\"Content-Length\",\"value\":\"171\"}],\"httpVersion\":\"1.1\"},\"response\":{\"statusCode\":200,\"headers\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Mon, 11 Mar 2024 07:32:24 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.32\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86398\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-12T07:30:34.5282454Z\"}],\"httpVersion\":\"1.1\"},\"timings\":{\"start\":1710142344933,\"requestStart\":1710142344934,\"offset\":{\"request\":1.51419997215271,\"socket\":1.7432000041007996,\"response\":167.3619999885559,\"end\":168.59799998998642,\"lookup\":1.7432000041007996,\"connect\":1.7432000041007996,\"done\":168.65560001134872}}}]}},\"responseValidation\":{},\"passed\":true,\"metaInfo\":{\"httpApiId\":152848473,\"httpApiCaseId\":144370602,\"httpApiName\":\"新增\",\"httpApiPath\":\"/api/aPIJSON/post\",\"httpApiMethod\":\"post\",\"httpApiCaseName\":\"多表批量\"}}","preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{}},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.408753512"],"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"修改","api":{"id":"152848474","method":"post","path":"/api/aPIJSON/put","parameters":{"path":[],"query":[],"cookie":[],"header":[]},"auth":{},"commonParameters":{},"responses":[{"id":"408753513","name":"Success","code":200,"contentType":"json","jsonSchema":{"$ref":"#/definitions/84275190"}}],"responseExamples":[],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","additionalProperties":{"$ref":"#/definitions/84275307"},"x-apifox-orders":[]},"example":""},"description":"","tags":["aPIJSON"],"status":"released","serverId":"","operationId":"api-aPIJSON-put-Post","sourceUrl":"","ordering":18,"cases":[{"id":144398604,"type":"http","path":null,"name":"通过id单条更新","responseId":0,"parameters":{"query":[],"path":[],"cookie":[],"header":[]},"commonParameters":{"query":[],"body":[],"header":[],"cookie":[]},"requestBody":{"parameters":[],"data":"{\r\n \"table3\": {\r\n \"id\": 32762120351813,\r\n \"text\": \"edit\",\r\n \"table2id\":255\r\n }\r\n}","generateMode":"normal"},"auth":{},"advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":2,"disableUrlEncoding":false},"requestResult":"{\"id\":\"temp.3c2d26df-ff36-4408-84d1-ba86a03a15d9\",\"cursor\":{\"position\":0,\"iteration\":0,\"length\":1,\"cycles\":1,\"empty\":false,\"eof\":false,\"bof\":true,\"cr\":false,\"ref\":\"3c2d26df-ff36-4408-84d1-ba86a03a15d9\",\"requestIndex\":0,\"httpRequestId\":\"01efc573-4df9-4ee4-8f19-329b479d8f83\"},\"type\":\"http\",\"response\":{\"id\":\"c0132dd1-a39d-491a-a497-7a91230bfbc7\",\"status\":\"OK\",\"code\":200,\"header\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Mon, 11 Mar 2024 08:24:50 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.32\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86399\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-12T08:24:51.3365034Z\"}],\"trailer\":[],\"stream\":{\"type\":\"Buffer\",\"data\":[123,34,99,111,100,101,34,58,50,48,48,44,34,116,121,112,101,34,58,34,115,117,99,99,101,115,115,34,44,34,109,101,115,115,97,103,101,34,58,34,34,44,34,114,101,115,117,108,116,34,58,123,34,116,97,98,108,101,51,34,58,123,34,99,111,100,101,34,58,50,48,48,44,34,109,115,103,34,58,34,115,117,99,99,101,115,115,34,44,34,105,100,34,58,34,51,50,55,54,50,49,50,48,51,53,49,56,49,51,34,125,125,44,34,101,120,116,114,97,115,34,58,110,117,108,108,44,34,116,105,109,101,34,58,34,50,48,50,52,45,48,51,45,49,49,32,49,54,58,50,52,58,53,49,34,125]},\"cookie\":[],\"responseTime\":626,\"responseSize\":156,\"type\":\"http\",\"tempFilePath\":\"\",\"timingPhases\":{\"prepare\":2.3127999901771545,\"wait\":1.4280999898910522,\"dns\":0.35510003566741943,\"tcp\":0.7379999756813049,\"firstByte\":621.6582000255585,\"download\":1.3226999640464783,\"process\":0.029600024223327637,\"total\":627.8445000052452}},\"request\":{\"url\":{\"protocol\":\"http\",\"port\":\"5005\",\"path\":[\"api\",\"aPIJSON\",\"put\"],\"host\":[\"localhost\"],\"query\":[],\"variable\":[]},\"header\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\",\"system\":true},{\"key\":\"Accept\",\"value\":\"*/*\",\"system\":true},{\"key\":\"Host\",\"value\":\"localhost:5005\",\"system\":true},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\",\"system\":true},{\"key\":\"Connection\",\"value\":\"keep-alive\",\"system\":true},{\"key\":\"Content-Length\",\"value\":108,\"system\":true}],\"method\":\"POST\",\"baseUrl\":\"http://localhost:5005\",\"body\":{\"mode\":\"raw\",\"raw\":\"{\\r\\n \\\"table3\\\": {\\r\\n \\\"id\\\": 32762120351813,\\r\\n \\\"text\\\": \\\"edit\\\",\\r\\n \\\"table2id\\\":255\\r\\n }\\r\\n}\",\"generateMode\":\"normal\",\"type\":\"application/json\"},\"auth\":{\"type\":\"bearer\",\"bearer\":[{\"type\":\"any\",\"value\":\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\",\"key\":\"token\"}]},\"type\":\"http\"},\"history\":{\"execution\":{\"verbose\":false,\"sessions\":{},\"data\":[{\"request\":{\"method\":\"POST\",\"href\":\"http://localhost:5005/api/aPIJSON/put\",\"headers\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\"},{\"key\":\"Accept\",\"value\":\"*/*\"},{\"key\":\"Host\",\"value\":\"localhost:5005\"},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\"},{\"key\":\"Connection\",\"value\":\"keep-alive\"},{\"key\":\"Content-Length\",\"value\":\"108\"}],\"httpVersion\":\"1.1\"},\"response\":{\"statusCode\":200,\"headers\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Mon, 11 Mar 2024 08:24:50 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.32\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86399\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-12T08:24:51.3365034Z\"}],\"httpVersion\":\"1.1\"},\"timings\":{\"start\":1710145491156,\"requestStart\":1710145491158,\"offset\":{\"request\":2.3127999901771545,\"socket\":3.740899980068207,\"lookup\":4.096000015735626,\"connect\":4.833999991416931,\"response\":626.4922000169754,\"end\":627.8148999810219,\"done\":627.8445000052452}}}]}},\"responseValidation\":{},\"passed\":true,\"metaInfo\":{\"httpApiId\":152848474,\"httpApiCaseId\":144398604,\"httpApiName\":\"修改\",\"httpApiPath\":\"/api/aPIJSON/put\",\"httpApiMethod\":\"post\",\"httpApiCaseName\":\"单条更新\"}}","preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}},{"id":144399593,"type":"http","path":null,"name":"多表多id批量更新","responseId":0,"parameters":{"query":[],"path":[],"cookie":[],"header":[]},"commonParameters":{"query":[],"body":[],"header":[],"cookie":[]},"requestBody":{"parameters":[],"data":"{\r\n \"table3\": [\r\n {\r\n \"id\": [31,32,33],\r\n \"text\": \"update3\"\r\n },\r\n {\r\n \"id\": 32762148617541,\r\n \"text\": \"update2\"\r\n }\r\n ],\r\n \"table2\": {\r\n \"id\": 32761658134341,\r\n \"text\": \"update\"\r\n }\r\n}","generateMode":"normal"},"auth":{},"advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":2,"disableUrlEncoding":false},"requestResult":"{\"id\":\"temp.a347f44c-82a5-437f-afef-bef75f5f55f4\",\"cursor\":{\"position\":0,\"iteration\":0,\"length\":1,\"cycles\":1,\"empty\":false,\"eof\":false,\"bof\":true,\"cr\":false,\"ref\":\"a347f44c-82a5-437f-afef-bef75f5f55f4\",\"requestIndex\":0,\"httpRequestId\":\"1ee88481-8f7b-480f-adf0-3a74acff8426\"},\"type\":\"http\",\"response\":{\"id\":\"6d9b1b3d-167c-4fe8-832e-f336630e6e64\",\"status\":\"OK\",\"code\":200,\"header\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Mon, 11 Mar 2024 09:38:05 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.32\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86397\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-12T09:36:21.4486506Z\"}],\"trailer\":[],\"stream\":{\"type\":\"Buffer\",\"data\":[123,34,99,111,100,101,34,58,50,48,48,44,34,116,121,112,101,34,58,34,115,117,99,99,101,115,115,34,44,34,109,101,115,115,97,103,101,34,58,34,34,44,34,114,101,115,117,108,116,34,58,123,34,116,97,98,108,101,51,34,58,123,34,99,111,117,110,116,34,58,52,125,44,34,116,97,98,108,101,50,34,58,123,34,99,111,117,110,116,34,58,49,125,125,44,34,101,120,116,114,97,115,34,58,110,117,108,108,44,34,116,105,109,101,34,58,34,50,48,50,52,45,48,51,45,49,49,32,49,55,58,51,56,58,48,53,34,125]},\"cookie\":[],\"responseTime\":135,\"responseSize\":138,\"type\":\"http\",\"tempFilePath\":\"\",\"timingPhases\":{\"prepare\":1.440500020980835,\"wait\":0.2959999442100525,\"dns\":0,\"tcp\":0,\"firstByte\":132.63910001516342,\"download\":1.2211000323295593,\"process\":0.04819995164871216,\"total\":135.64489996433258}},\"request\":{\"url\":{\"protocol\":\"http\",\"port\":\"5005\",\"path\":[\"api\",\"aPIJSON\",\"put\"],\"host\":[\"localhost\"],\"query\":[],\"variable\":[]},\"header\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\",\"system\":true},{\"key\":\"Accept\",\"value\":\"*/*\",\"system\":true},{\"key\":\"Host\",\"value\":\"localhost:5005\",\"system\":true},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\",\"system\":true},{\"key\":\"Connection\",\"value\":\"keep-alive\",\"system\":true},{\"key\":\"Content-Length\",\"value\":283,\"system\":true}],\"method\":\"POST\",\"baseUrl\":\"http://localhost:5005\",\"body\":{\"mode\":\"raw\",\"raw\":\"{\\r\\n \\\"table3\\\": [\\r\\n {\\r\\n \\\"id\\\": [31,32,33],\\r\\n \\\"text\\\": \\\"update3\\\"\\r\\n },\\r\\n {\\r\\n \\\"id\\\": 32762148617541,\\r\\n \\\"text\\\": \\\"update2\\\"\\r\\n }\\r\\n ],\\r\\n \\\"table2\\\": {\\r\\n \\\"id\\\": 32761658134341,\\r\\n \\\"text\\\": \\\"update\\\"\\r\\n }\\r\\n}\",\"generateMode\":\"normal\",\"type\":\"application/json\"},\"auth\":{\"type\":\"bearer\",\"bearer\":[{\"type\":\"any\",\"value\":\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\",\"key\":\"token\"}]},\"type\":\"http\"},\"history\":{\"execution\":{\"verbose\":false,\"sessions\":{},\"data\":[{\"request\":{\"method\":\"POST\",\"href\":\"http://localhost:5005/api/aPIJSON/put\",\"headers\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\"},{\"key\":\"Accept\",\"value\":\"*/*\"},{\"key\":\"Host\",\"value\":\"localhost:5005\"},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\"},{\"key\":\"Connection\",\"value\":\"keep-alive\"},{\"key\":\"Content-Length\",\"value\":\"283\"}],\"httpVersion\":\"1.1\"},\"response\":{\"statusCode\":200,\"headers\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Mon, 11 Mar 2024 09:38:05 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.32\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86397\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-12T09:36:21.4486506Z\"}],\"httpVersion\":\"1.1\"},\"timings\":{\"start\":1710149885351,\"requestStart\":1710149885352,\"offset\":{\"request\":1.440500020980835,\"socket\":1.7364999651908875,\"response\":134.3755999803543,\"end\":135.59670001268387,\"lookup\":1.7364999651908875,\"connect\":1.7364999651908875,\"done\":135.64489996433258}}}]}},\"responseValidation\":{},\"passed\":true,\"metaInfo\":{\"httpApiId\":152848474,\"httpApiCaseId\":144399593,\"httpApiName\":\"修改\",\"httpApiPath\":\"/api/aPIJSON/put\",\"httpApiMethod\":\"post\",\"httpApiCaseName\":\"多表更新\"}}","preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{}},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":[],"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}},{"name":"删除","api":{"id":"152848475","method":"post","path":"/api/aPIJSON/delete","parameters":{"query":[],"path":[],"cookie":[],"header":[]},"auth":{},"commonParameters":{"query":[],"body":[],"cookie":[],"header":[]},"responses":[{"id":"408753514","name":"Success","code":200,"contentType":"json","jsonSchema":{"$ref":"#/definitions/84275190"}}],"responseExamples":[],"requestBody":{"type":"application/json","parameters":[],"jsonSchema":{"type":"object","additionalProperties":{"$ref":"#/definitions/84275307"},"x-apifox-orders":[]},"example":"{\r\n \"table1\": {\r\n \"id\": [32520112744261,32520179315781,32520200693573],\r\n }\r\n}"},"description":"","tags":["aPIJSON"],"status":"released","serverId":"","operationId":"api-aPIJSON-delete-Post","sourceUrl":"","ordering":24,"cases":[{"id":143343716,"type":"http","path":null,"name":"删除单条数据","responseId":0,"parameters":{"query":[],"header":[],"cookie":[],"path":[]},"commonParameters":{"query":[],"body":[],"header":[],"cookie":[]},"requestBody":{"parameters":[],"data":"{\r\n \"table1\": {\r\n \"id\": \"32520494044741\",\r\n }\r\n}","type":"application/json"},"auth":{},"advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":2,"disableUrlEncoding":false},"requestResult":"{\"id\":\"temp.26698a36-85d0-4cbb-b880-abbb4872dddf\",\"cursor\":{\"position\":0,\"iteration\":0,\"length\":1,\"cycles\":1,\"empty\":false,\"eof\":false,\"bof\":true,\"cr\":false,\"ref\":\"26698a36-85d0-4cbb-b880-abbb4872dddf\",\"requestIndex\":0,\"httpRequestId\":\"e91c2ef7-03a4-41fa-b114-138973559bec\"},\"type\":\"http\",\"response\":{\"id\":\"a6999ac7-bec5-4b65-a905-42dbe74794e7\",\"status\":\"OK\",\"code\":200,\"header\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Wed, 06 Mar 2024 09:16:09 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.32\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86398\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-07T09:15:13.4609976Z\"}],\"trailer\":[],\"stream\":{\"type\":\"Buffer\",\"data\":[123,34,99,111,100,101,34,58,50,48,48,44,34,116,121,112,101,34,58,34,115,117,99,99,101,115,115,34,44,34,109,101,115,115,97,103,101,34,58,34,34,44,34,114,101,115,117,108,116,34,58,123,34,116,97,98,108,101,49,34,58,123,34,99,111,100,101,34,58,50,48,48,44,34,109,115,103,34,58,34,115,117,99,99,101,115,115,34,44,34,105,100,34,58,34,51,50,53,50,48,52,57,52,48,52,52,55,52,49,34,125,125,44,34,101,120,116,114,97,115,34,58,110,117,108,108,44,34,116,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,54,32,49,55,58,49,54,58,48,57,34,125]},\"cookie\":[],\"responseTime\":111,\"responseSize\":156,\"type\":\"http\",\"tempFilePath\":\"\",\"timingPhases\":{\"prepare\":1.5057999789714813,\"wait\":0.2891000211238861,\"dns\":0,\"tcp\":0,\"firstByte\":109.1957999765873,\"download\":1.360700011253357,\"process\":0.034900009632110596,\"total\":112.38629999756813}},\"request\":{\"url\":{\"protocol\":\"http\",\"port\":\"5005\",\"path\":[\"api\",\"aPIJSON\",\"delete\"],\"host\":[\"localhost\"],\"query\":[],\"variable\":[]},\"header\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTE5NzE1MiwibmJmIjoxNzA5MTk3MTUyLCJleHAiOjE3MDk4MDE5NTIsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.96Y2rBegXqiYjuXcXeVyuXV75Cmzu8FpILylDcougt8\",\"system\":true},{\"key\":\"Accept\",\"value\":\"*/*\",\"system\":true},{\"key\":\"Host\",\"value\":\"localhost:5005\",\"system\":true},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\",\"system\":true},{\"key\":\"Connection\",\"value\":\"keep-alive\",\"system\":true},{\"key\":\"Content-Length\",\"value\":61,\"system\":true}],\"method\":\"POST\",\"baseUrl\":\"http://localhost:5005\",\"body\":{\"mode\":\"raw\",\"raw\":\"{\\r\\n \\\"table1\\\": {\\r\\n \\\"id\\\": \\\"32520494044741\\\",\\r\\n }\\r\\n}\",\"type\":\"application/json\"},\"auth\":{\"type\":\"bearer\",\"bearer\":[{\"type\":\"any\",\"value\":\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTE5NzE1MiwibmJmIjoxNzA5MTk3MTUyLCJleHAiOjE3MDk4MDE5NTIsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.96Y2rBegXqiYjuXcXeVyuXV75Cmzu8FpILylDcougt8\",\"key\":\"token\"}]},\"type\":\"http\"},\"history\":{\"execution\":{\"verbose\":false,\"sessions\":{},\"data\":[{\"request\":{\"method\":\"POST\",\"href\":\"http://localhost:5005/api/aPIJSON/delete\",\"headers\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTE5NzE1MiwibmJmIjoxNzA5MTk3MTUyLCJleHAiOjE3MDk4MDE5NTIsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.96Y2rBegXqiYjuXcXeVyuXV75Cmzu8FpILylDcougt8\"},{\"key\":\"Accept\",\"value\":\"*/*\"},{\"key\":\"Host\",\"value\":\"localhost:5005\"},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\"},{\"key\":\"Connection\",\"value\":\"keep-alive\"},{\"key\":\"Content-Length\",\"value\":\"61\"}],\"httpVersion\":\"1.1\"},\"response\":{\"statusCode\":200,\"headers\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Wed, 06 Mar 2024 09:16:09 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.32\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86398\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-07T09:15:13.4609976Z\"}],\"httpVersion\":\"1.1\"},\"timings\":{\"start\":1709716569879,\"requestStart\":1709716569880,\"offset\":{\"request\":1.5057999789714813,\"socket\":1.7949000000953674,\"response\":110.99069997668266,\"end\":112.35139998793602,\"lookup\":1.7949000000953674,\"connect\":1.7949000000953674,\"done\":112.38629999756813}}}]}},\"responseValidation\":{},\"passed\":true,\"metaInfo\":{\"httpApiId\":152848475,\"httpApiName\":\"删除\",\"httpApiPath\":\"/api/aPIJSON/delete\",\"httpApiMethod\":\"post\",\"httpApiCaseName\":\"成功\"}}","preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}},{"id":143368262,"type":"http","path":null,"name":"批量删除id","responseId":0,"parameters":{"query":[],"path":[],"cookie":[],"header":[]},"commonParameters":{"query":[],"body":[],"header":[],"cookie":[]},"requestBody":{"parameters":[],"data":"{\r\n \"table3\": {\r\n \"id\": [\r\n 32761630528069,\r\n 239\r\n ]\r\n }\r\n}","generateMode":"normal"},"auth":{},"advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":2,"disableUrlEncoding":false},"requestResult":"{\"id\":\"temp.c39182fc-fc2f-4357-b3b7-32e41ef1fb57\",\"cursor\":{\"position\":0,\"iteration\":0,\"length\":1,\"cycles\":1,\"empty\":false,\"eof\":false,\"bof\":true,\"cr\":false,\"ref\":\"c39182fc-fc2f-4357-b3b7-32e41ef1fb57\",\"requestIndex\":0,\"httpRequestId\":\"7443b4a1-f762-4a24-8dd2-ad33ce1c8da7\"},\"type\":\"http\",\"response\":{\"id\":\"43956c21-adae-41c7-a722-c856c7c7c0aa\",\"status\":\"OK\",\"code\":200,\"header\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Mon, 11 Mar 2024 07:34:26 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.32\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86396\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-12T07:26:16.5966009Z\"}],\"trailer\":[],\"stream\":{\"type\":\"Buffer\",\"data\":[123,34,99,111,100,101,34,58,50,48,48,44,34,116,121,112,101,34,58,34,115,117,99,99,101,115,115,34,44,34,109,101,115,115,97,103,101,34,58,34,34,44,34,114,101,115,117,108,116,34,58,123,34,116,97,98,108,101,51,34,58,123,34,105,100,34,58,91,51,50,55,54,49,54,51,48,53,50,56,48,54,57,44,50,51,57,93,44,34,99,111,117,110,116,34,58,49,125,125,44,34,101,120,116,114,97,115,34,58,110,117,108,108,44,34,116,105,109,101,34,58,34,50,48,50,52,45,48,51,45,49,49,32,49,53,58,51,52,58,50,55,34,125]},\"cookie\":[],\"responseTime\":158,\"responseSize\":143,\"type\":\"http\",\"tempFilePath\":\"\",\"timingPhases\":{\"prepare\":2.1498000025749207,\"wait\":0.36399996280670166,\"dns\":0,\"tcp\":0,\"firstByte\":156.0023000240326,\"download\":1.451200008392334,\"process\":0.04890000820159912,\"total\":160.01620000600815}},\"request\":{\"url\":{\"protocol\":\"http\",\"port\":\"5005\",\"path\":[\"api\",\"aPIJSON\",\"delete\"],\"host\":[\"localhost\"],\"query\":[],\"variable\":[]},\"header\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\",\"system\":true},{\"key\":\"Accept\",\"value\":\"*/*\",\"system\":true},{\"key\":\"Host\",\"value\":\"localhost:5005\",\"system\":true},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\",\"system\":true},{\"key\":\"Connection\",\"value\":\"keep-alive\",\"system\":true},{\"key\":\"Content-Length\",\"value\":55,\"system\":true}],\"method\":\"POST\",\"baseUrl\":\"http://localhost:5005\",\"body\":{\"mode\":\"raw\",\"raw\":\"{\\r\\n \\\"table3\\\": {\\r\\n\\\"id\\\":[32761630528069,239]\\r\\n }\\r\\n}\",\"generateMode\":\"normal\",\"type\":\"application/json\"},\"auth\":{\"type\":\"bearer\",\"bearer\":[{\"type\":\"any\",\"value\":\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\",\"key\":\"token\"}]},\"type\":\"http\"},\"history\":{\"execution\":{\"verbose\":false,\"sessions\":{},\"data\":[{\"request\":{\"method\":\"POST\",\"href\":\"http://localhost:5005/api/aPIJSON/delete\",\"headers\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\"},{\"key\":\"Accept\",\"value\":\"*/*\"},{\"key\":\"Host\",\"value\":\"localhost:5005\"},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\"},{\"key\":\"Connection\",\"value\":\"keep-alive\"},{\"key\":\"Content-Length\",\"value\":\"55\"}],\"httpVersion\":\"1.1\"},\"response\":{\"statusCode\":200,\"headers\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Mon, 11 Mar 2024 07:34:26 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.32\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86396\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-12T07:26:16.5966009Z\"}],\"httpVersion\":\"1.1\"},\"timings\":{\"start\":1710142466906,\"requestStart\":1710142466908,\"offset\":{\"request\":2.1498000025749207,\"socket\":2.5137999653816223,\"response\":158.51609998941422,\"end\":159.96729999780655,\"lookup\":2.5137999653816223,\"connect\":2.5137999653816223,\"done\":160.01620000600815}}}]}},\"responseValidation\":{},\"passed\":true,\"metaInfo\":{\"httpApiId\":152848475,\"httpApiCaseId\":143368262,\"httpApiName\":\"删除\",\"httpApiPath\":\"/api/aPIJSON/delete\",\"httpApiMethod\":\"post\",\"httpApiCaseName\":\"批量删除id\"}}","preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}},{"id":143543753,"type":"http","path":null,"name":"批量删除(匹配条件)","responseId":0,"parameters":{"query":[],"path":[],"cookie":[],"header":[]},"commonParameters":{"query":[],"body":[],"header":[],"cookie":[]},"requestBody":{"parameters":[],"data":"{\r\n \"table1\": {\r\n \"httpmethod\": [\"GET\",\"POST\"],\r\n \"ThreadId\": [37,39],\"Actionname\":\"SwaggerCheckUrl\",\"loglevel\":2.5,\"isdelete\":false\r\n }\r\n}","generateMode":"normal"},"auth":{},"advancedSettings":{"disabledSystemHeaders":{},"isDefaultUrlEncoding":2,"disableUrlEncoding":false},"requestResult":"{\"id\":\"temp.44a9ebb3-1e3d-4049-936a-a412fb468f00\",\"cursor\":{\"position\":0,\"iteration\":0,\"length\":1,\"cycles\":1,\"empty\":false,\"eof\":false,\"bof\":true,\"cr\":false,\"ref\":\"44a9ebb3-1e3d-4049-936a-a412fb468f00\",\"requestIndex\":0,\"httpRequestId\":\"2365b41d-b930-4f24-85d5-12b1198e2c4d\"},\"type\":\"http\",\"response\":{\"id\":\"097a32a0-1cbe-410f-979f-e1170b268276\",\"status\":\"OK\",\"code\":200,\"header\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Thu, 07 Mar 2024 10:10:46 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.32\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86399\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-08T10:10:47.0961001Z\"}],\"trailer\":[],\"stream\":{\"type\":\"Buffer\",\"data\":[123,34,99,111,100,101,34,58,50,48,48,44,34,116,121,112,101,34,58,34,115,117,99,99,101,115,115,34,44,34,109,101,115,115,97,103,101,34,58,34,34,44,34,114,101,115,117,108,116,34,58,123,34,116,97,98,108,101,49,34,58,123,34,104,116,116,112,109,101,116,104,111,100,34,58,91,34,71,69,84,34,44,34,80,79,83,84,34,93,44,34,84,104,114,101,97,100,73,100,34,58,91,51,55,44,51,57,93,44,34,65,99,116,105,111,110,110,97,109,101,34,58,34,83,119,97,103,103,101,114,67,104,101,99,107,85,114,108,34,44,34,108,111,103,108,101,118,101,108,34,58,50,46,53,44,34,105,115,100,101,108,101,116,101,34,58,102,97,108,115,101,44,34,99,111,117,110,116,34,58,48,125,125,44,34,101,120,116,114,97,115,34,58,110,117,108,108,44,34,116,105,109,101,34,58,34,50,48,50,52,45,48,51,45,48,55,32,49,56,58,49,48,58,52,55,34,125]},\"cookie\":[],\"responseTime\":602,\"responseSize\":227,\"type\":\"http\",\"tempFilePath\":\"\"},\"request\":{\"url\":{\"protocol\":\"http\",\"port\":\"5005\",\"path\":[\"api\",\"aPIJSON\",\"delete\"],\"host\":[\"localhost\"],\"query\":[],\"variable\":[]},\"header\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\",\"system\":true},{\"key\":\"Accept\",\"value\":\"*/*\",\"system\":true},{\"key\":\"Host\",\"value\":\"localhost:5005\",\"system\":true},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\",\"system\":true},{\"key\":\"Connection\",\"value\":\"keep-alive\",\"system\":true},{\"key\":\"Content-Length\",\"value\":159,\"system\":true}],\"method\":\"POST\",\"baseUrl\":\"http://localhost:5005\",\"body\":{\"mode\":\"raw\",\"raw\":\"{\\r\\n \\\"table1\\\": {\\r\\n \\\"httpmethod\\\": [\\\"GET\\\",\\\"POST\\\"],\\r\\n \\\"ThreadId\\\": [37,39],\\\"Actionname\\\":\\\"SwaggerCheckUrl\\\",\\\"loglevel\\\":2.5,\\\"isdelete\\\":false\\r\\n }\\r\\n}\",\"generateMode\":\"normal\",\"type\":\"application/json\"},\"auth\":{\"type\":\"bearer\",\"bearer\":[{\"type\":\"any\",\"value\":\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\",\"key\":\"token\"}]},\"type\":\"http\"},\"history\":{\"execution\":{\"verbose\":false,\"sessions\":{},\"data\":[{\"request\":{\"method\":\"POST\",\"href\":\"http://localhost:5005/api/aPIJSON/delete\",\"headers\":[{\"key\":\"User-Agent\",\"value\":\"Apifox/1.0.0 (https://apifox.com)\"},{\"key\":\"Content-Type\",\"value\":\"application/json\"},{\"key\":\"Authorization\",\"value\":\"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec\"},{\"key\":\"Accept\",\"value\":\"*/*\"},{\"key\":\"Host\",\"value\":\"localhost:5005\"},{\"key\":\"Accept-Encoding\",\"value\":\"gzip, deflate, br\"},{\"key\":\"Connection\",\"value\":\"keep-alive\"},{\"key\":\"Content-Length\",\"value\":\"159\"}],\"httpVersion\":\"1.1\"},\"response\":{\"statusCode\":200,\"headers\":[{\"key\":\"Content-Type\",\"value\":\"application/json; charset=utf-8\"},{\"key\":\"Date\",\"value\":\"Thu, 07 Mar 2024 10:10:46 GMT\"},{\"key\":\"Server\",\"value\":\"Kestrel\"},{\"key\":\"Content-Language\",\"value\":\"zh-CN\"},{\"key\":\"Transfer-Encoding\",\"value\":\"chunked\"},{\"key\":\"environment\",\"value\":\"Development\"},{\"key\":\"Furion\",\"value\":\"4.9.1.32\"},{\"key\":\"X-Rate-Limit-Limit\",\"value\":\"1d\"},{\"key\":\"X-Rate-Limit-Remaining\",\"value\":\"86399\"},{\"key\":\"X-Rate-Limit-Reset\",\"value\":\"2024-03-08T10:10:47.0961001Z\"}],\"httpVersion\":\"1.1\"},\"timings\":{\"start\":1709806246909,\"requestStart\":1709806246912,\"offset\":{\"request\":2.155799984931946,\"socket\":3.6095999479293823,\"lookup\":3.9983999729156494,\"connect\":4.8549999594688416,\"response\":602.0516999959946,\"end\":603.2913999557495,\"done\":603.3172999620438}}}]}},\"responseValidation\":{},\"passed\":true,\"metaInfo\":{\"httpApiId\":152848475,\"httpApiCaseId\":143543753,\"httpApiName\":\"删除\",\"httpApiPath\":\"/api/aPIJSON/delete\",\"httpApiMethod\":\"post\",\"httpApiCaseName\":\"批量删除2\"}}","preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}],"mocks":[],"customApiFields":"{}","advancedSettings":{"disabledSystemHeaders":{}},"mockScript":{},"codeSamples":[],"commonResponseStatus":{},"responseChildren":["BLANK.408753514"],"preProcessors":[],"postProcessors":[],"inheritPostProcessors":{},"inheritPreProcessors":{}}}]}]}],"socketCollection":[],"docCollection":[],"schemaCollection":[{"name":"根目录","items":[{"name":"Schemas","items":[{"name":"AccountTypeEnum","displayName":"","id":"#/definitions/84275167","description":"账号类型枚举
 会员 Member = 666
 普通账号 NormalUser = 777
 系统管理员 SysAdmin = 888
 超级管理员 SuperAdmin = 999
","schema":{"jsonSchema":{"enum":[666,777,888,999],"type":"integer","description":"账号类型枚举
 会员 Member = 666
 普通账号 NormalUser = 777
 系统管理员 SysAdmin = 888
 超级管理员 SuperAdmin = 999
","format":"int32"}}},{"name":"AddCodeGenInput","displayName":"","id":"#/definitions/84275168","description":"","schema":{"jsonSchema":{"required":["authorName","busName","generateType","menuPid","nameSpace","tableName"],"type":"object","properties":{"page":{"type":"integer","description":"当前页码","format":"int32"},"pageSize":{"type":"integer","description":"页码容量","format":"int32"},"field":{"type":["string","null"],"description":"排序字段"},"order":{"type":["string","null"],"description":"排序方向"},"descStr":{"type":["string","null"],"description":"降序排序"},"className":{"type":["string","null"],"description":"类名"},"tablePrefix":{"type":["string","null"],"description":"是否移除表前缀"},"configId":{"type":["string","null"],"description":"库定位器名"},"dbName":{"type":["string","null"],"description":"数据库名(保留字段)"},"dbType":{"type":["string","null"],"description":"数据库类型"},"connectionString":{"type":["string","null"],"description":"数据库链接"},"tableComment":{"type":["string","null"],"description":"功能名(数据库表名称)"},"menuApplication":{"type":["string","null"],"description":"菜单应用分类(应用编码)"},"printType":{"type":["string","null"],"description":"支持打印类型"},"printName":{"type":["string","null"],"description":"打印模版名称"},"tableName":{"minLength":1,"type":"string","description":"数据库表名"},"busName":{"minLength":1,"type":"string","description":"业务名(业务代码包名称)"},"nameSpace":{"minLength":1,"type":"string","description":"命名空间"},"authorName":{"minLength":1,"type":"string","description":"作者姓名"},"generateType":{"minLength":1,"type":"string","description":"生成方式"},"menuPid":{"type":"integer","description":"菜单父级","format":"int64"}},"additionalProperties":false,"x-apifox-orders":["page","pageSize","field","order","descStr","className","tablePrefix","configId","dbName","dbType","connectionString","tableComment","menuApplication","printType","printName","tableName","busName","nameSpace","authorName","generateType","menuPid"]}}},{"name":"AddConfigInput","displayName":"","id":"#/definitions/84275169","description":"","schema":{"jsonSchema":{"required":["name"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"name":{"maxLength":64,"minLength":1,"type":"string","description":"名称"},"code":{"maxLength":64,"type":["string","null"],"description":"编码"},"value":{"maxLength":64,"type":["string","null"],"description":"属性值"},"sysFlag":{"$ref":"#/definitions/84275444"},"groupCode":{"maxLength":64,"type":["string","null"],"description":"分组编码"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"remark":{"maxLength":256,"type":["string","null"],"description":"备注"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","name","code","value","sysFlag","groupCode","orderNo","remark"]}}},{"name":"AddDictDataInput","displayName":"","id":"#/definitions/84275170","description":"","schema":{"jsonSchema":{"required":["code","value"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"dictTypeId":{"type":"integer","description":"字典类型Id","format":"int64"},"value":{"maxLength":128,"minLength":1,"type":"string","description":"值"},"code":{"maxLength":64,"minLength":1,"type":"string","description":"编码"},"tagType":{"maxLength":16,"type":["string","null"],"description":"显示样式-标签颜色"},"styleSetting":{"maxLength":512,"type":["string","null"],"description":"显示样式-Style(控制显示样式)"},"classSetting":{"maxLength":512,"type":["string","null"],"description":"显示样式-Class(控制显示样式)"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"remark":{"maxLength":2048,"type":["string","null"],"description":"备注"},"extData":{"type":["string","null"],"description":"拓展数据(保存业务功能的配置项)"},"status":{"$ref":"#/definitions/84275375"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","dictTypeId","value","code","tagType","styleSetting","classSetting","orderNo","remark","extData","status"]}}},{"name":"AddDictTypeInput","displayName":"","id":"#/definitions/84275171","description":"","schema":{"jsonSchema":{"required":["code","name"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"name":{"maxLength":64,"minLength":1,"type":"string","description":"名称"},"code":{"maxLength":64,"minLength":1,"type":"string","description":"编码"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"remark":{"maxLength":256,"type":["string","null"],"description":"备注"},"status":{"$ref":"#/definitions/84275375"},"children":{"type":["array","null"],"items":{"$ref":"#/definitions/84275379"},"description":"字典值集合"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","name","code","orderNo","remark","status","children"]}}},{"name":"AddJobDetailInput","displayName":"","id":"#/definitions/84275172","description":"","schema":{"jsonSchema":{"required":["jobId"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"groupName":{"maxLength":128,"type":["string","null"],"description":"组名称"},"jobType":{"maxLength":128,"type":["string","null"],"description":"作业类型FullName"},"assemblyName":{"maxLength":128,"type":["string","null"],"description":"程序集Name"},"description":{"maxLength":128,"type":["string","null"],"description":"描述信息"},"concurrent":{"type":"boolean","description":"是否并行执行"},"includeAnnotations":{"type":"boolean","description":"是否扫描特性触发器"},"properties":{"type":["string","null"],"description":"额外数据"},"updatedTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createType":{"$ref":"#/definitions/84275308"},"scriptCode":{"type":["string","null"],"description":"脚本代码"},"jobId":{"minLength":2,"type":"string","description":"作业Id"}},"additionalProperties":false,"x-apifox-orders":["id","groupName","jobType","assemblyName","description","concurrent","includeAnnotations","properties","updatedTime","createType","scriptCode","jobId"]}}},{"name":"AddJobTriggerInput","displayName":"","id":"#/definitions/84275173","description":"","schema":{"jsonSchema":{"required":["jobId","triggerId"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"triggerType":{"maxLength":128,"type":["string","null"],"description":"触发器类型FullName"},"assemblyName":{"maxLength":128,"type":["string","null"],"description":"程序集Name"},"args":{"maxLength":128,"type":["string","null"],"description":"参数"},"description":{"maxLength":128,"type":["string","null"],"description":"描述信息"},"status":{"$ref":"#/definitions/84275411"},"startTime":{"type":["string","null"],"description":"起始时间","format":"date-time"},"endTime":{"type":["string","null"],"description":"结束时间","format":"date-time"},"lastRunTime":{"type":["string","null"],"description":"最近运行时间","format":"date-time"},"nextRunTime":{"type":["string","null"],"description":"下一次运行时间","format":"date-time"},"numberOfRuns":{"type":"integer","description":"触发次数","format":"int64"},"maxNumberOfRuns":{"type":"integer","description":"最大触发次数(0:不限制,n:N次)","format":"int64"},"numberOfErrors":{"type":"integer","description":"出错次数","format":"int64"},"maxNumberOfErrors":{"type":"integer","description":"最大出错次数(0:不限制,n:N次)","format":"int64"},"numRetries":{"type":"integer","description":"重试次数","format":"int32"},"retryTimeout":{"type":"integer","description":"重试间隔时间(ms)","format":"int32"},"startNow":{"type":"boolean","description":"是否立即启动"},"runOnStart":{"type":"boolean","description":"是否启动时执行一次"},"resetOnlyOnce":{"type":"boolean","description":"是否在启动时重置最大触发次数等于一次的作业"},"updatedTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"jobId":{"minLength":2,"type":"string","description":"作业Id"},"triggerId":{"minLength":2,"type":"string","description":"触发器Id"}},"additionalProperties":false,"x-apifox-orders":["id","triggerType","assemblyName","args","description","status","startTime","endTime","lastRunTime","nextRunTime","numberOfRuns","maxNumberOfRuns","numberOfErrors","maxNumberOfErrors","numRetries","retryTimeout","startNow","runOnStart","resetOnlyOnce","updatedTime","jobId","triggerId"]}}},{"name":"AddMenuInput","displayName":"","id":"#/definitions/84275174","description":"","schema":{"jsonSchema":{"required":["title"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"pid":{"type":"integer","description":"父Id","format":"int64"},"type":{"$ref":"#/definitions/84275319"},"name":{"maxLength":64,"type":["string","null"],"description":"路由名称"},"path":{"maxLength":128,"type":["string","null"],"description":"路由地址"},"component":{"maxLength":128,"type":["string","null"],"description":"组件路径"},"redirect":{"maxLength":128,"type":["string","null"],"description":"重定向"},"permission":{"maxLength":128,"type":["string","null"],"description":"权限标识"},"icon":{"maxLength":128,"type":["string","null"],"description":"图标"},"isIframe":{"type":"boolean","description":"是否内嵌"},"outLink":{"maxLength":256,"type":["string","null"],"description":"外链链接"},"isHide":{"type":"boolean","description":"是否隐藏"},"isKeepAlive":{"type":"boolean","description":"是否缓存"},"isAffix":{"type":"boolean","description":"是否固定"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"status":{"$ref":"#/definitions/84275375"},"remark":{"maxLength":256,"type":["string","null"],"description":"备注"},"children":{"type":["array","null"],"items":{"$ref":"#/definitions/84275390"},"description":"菜单子项"},"title":{"minLength":1,"type":"string","description":"名称"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","pid","type","name","path","component","redirect","permission","icon","isIframe","outLink","isHide","isKeepAlive","isAffix","orderNo","status","remark","children","title"]}}},{"name":"AddNoticeInput","displayName":"","id":"#/definitions/84275175","description":"","schema":{"jsonSchema":{"required":["content","title"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"title":{"maxLength":32,"minLength":1,"type":"string","description":"标题"},"content":{"minLength":1,"type":"string","description":"内容"},"type":{"$ref":"#/definitions/84275325"},"publicUserId":{"type":"integer","description":"发布人Id","format":"int64"},"publicUserName":{"maxLength":32,"type":["string","null"],"description":"发布人姓名"},"publicOrgId":{"type":"integer","description":"发布机构Id","format":"int64"},"publicOrgName":{"maxLength":64,"type":["string","null"],"description":"发布机构名称"},"publicTime":{"type":["string","null"],"description":"发布时间","format":"date-time"},"cancelTime":{"type":["string","null"],"description":"撤回时间","format":"date-time"},"status":{"$ref":"#/definitions/84275324"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","title","content","type","publicUserId","publicUserName","publicOrgId","publicOrgName","publicTime","cancelTime","status"]}}},{"name":"AddOpenAccessInput","displayName":"","id":"#/definitions/84275176","description":"","schema":{"jsonSchema":{"required":["accessKey","accessSecret","bindUserId"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"bindTenantId":{"type":"integer","description":"绑定租户Id","format":"int64"},"accessKey":{"minLength":1,"type":"string","description":"身份标识"},"accessSecret":{"minLength":1,"type":"string","description":"密钥"},"bindUserId":{"type":"integer","description":"绑定用户Id","format":"int64"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","bindTenantId","accessKey","accessSecret","bindUserId"]}}},{"name":"AddOrgInput","displayName":"","id":"#/definitions/84275177","description":"","schema":{"jsonSchema":{"required":["name"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"tenantId":{"type":["integer","null"],"description":"租户Id","format":"int64"},"pid":{"type":"integer","description":"父Id","format":"int64"},"code":{"maxLength":64,"type":["string","null"],"description":"编码"},"level":{"type":["integer","null"],"description":"级别","format":"int32"},"type":{"maxLength":64,"type":["string","null"],"description":"机构类型-数据字典"},"directorId":{"type":["integer","null"],"description":"负责人Id","format":"int64"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"status":{"$ref":"#/definitions/84275375"},"remark":{"maxLength":128,"type":["string","null"],"description":"备注"},"children":{"type":["array","null"],"items":{"$ref":"#/definitions/84275395"},"description":"机构子项"},"disabled":{"type":"boolean","description":"是否禁止选中"},"name":{"minLength":1,"type":"string","description":"名称"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","tenantId","pid","code","level","type","directorId","orderNo","status","remark","children","disabled","name"]}}},{"name":"AddPluginInput","displayName":"","id":"#/definitions/84275178","description":"","schema":{"jsonSchema":{"required":["csharpCode","name"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"tenantId":{"type":["integer","null"],"description":"租户Id","format":"int64"},"csharpCode":{"minLength":1,"type":"string","description":"C#代码"},"assemblyName":{"maxLength":512,"type":["string","null"],"description":"程序集名称"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"status":{"$ref":"#/definitions/84275375"},"remark":{"maxLength":128,"type":["string","null"],"description":"备注"},"name":{"minLength":1,"type":"string","description":"名称"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","tenantId","csharpCode","assemblyName","orderNo","status","remark","name"]}}},{"name":"AddPosInput","displayName":"","id":"#/definitions/84275179","description":"","schema":{"jsonSchema":{"required":["name"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"tenantId":{"type":["integer","null"],"description":"租户Id","format":"int64"},"code":{"maxLength":64,"type":["string","null"],"description":"编码"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"remark":{"maxLength":128,"type":["string","null"],"description":"备注"},"status":{"$ref":"#/definitions/84275375"},"name":{"minLength":1,"type":"string","description":"名称"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","tenantId","code","orderNo","remark","status","name"]}}},{"name":"AddPrintInput","displayName":"","id":"#/definitions/84275180","description":"","schema":{"jsonSchema":{"required":["name","template"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"tenantId":{"type":["integer","null"],"description":"租户Id","format":"int64"},"template":{"minLength":1,"type":"string","description":"打印模板"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"status":{"$ref":"#/definitions/84275375"},"remark":{"maxLength":128,"type":["string","null"],"description":"备注"},"name":{"minLength":1,"type":"string","description":"名称"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","tenantId","template","orderNo","status","remark","name"]}}},{"name":"AddRegionInput","displayName":"","id":"#/definitions/84275181","description":"","schema":{"jsonSchema":{"required":["name"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"pid":{"type":"integer","description":"父Id","format":"int64"},"shortName":{"maxLength":32,"type":["string","null"],"description":"简称"},"mergerName":{"maxLength":64,"type":["string","null"],"description":"组合名"},"code":{"maxLength":32,"type":["string","null"],"description":"行政代码"},"zipCode":{"maxLength":6,"type":["string","null"],"description":"邮政编码"},"cityCode":{"maxLength":6,"type":["string","null"],"description":"区号"},"level":{"type":"integer","description":"层级","format":"int32"},"pinYin":{"maxLength":128,"type":["string","null"],"description":"拼音"},"lng":{"type":"number","description":"经度","format":"float"},"lat":{"type":"number","description":"维度","format":"float"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"remark":{"maxLength":128,"type":["string","null"],"description":"备注"},"children":{"type":["array","null"],"items":{"$ref":"#/definitions/84275399"},"description":"机构子项"},"name":{"minLength":1,"type":"string","description":"名称"}},"additionalProperties":false,"x-apifox-orders":["id","pid","shortName","mergerName","code","zipCode","cityCode","level","pinYin","lng","lat","orderNo","remark","children","name"]}}},{"name":"AddRoleInput","displayName":"","id":"#/definitions/84275182","description":"","schema":{"jsonSchema":{"required":["name"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"tenantId":{"type":["integer","null"],"description":"租户Id","format":"int64"},"code":{"maxLength":64,"type":["string","null"],"description":"编码"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"dataScope":{"$ref":"#/definitions/84275269"},"remark":{"maxLength":128,"type":["string","null"],"description":"备注"},"status":{"$ref":"#/definitions/84275375"},"name":{"minLength":1,"type":"string","description":"名称"},"menuIdList":{"type":["array","null"],"items":{"type":"integer","format":"int64"},"description":"菜单Id集合"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","tenantId","code","orderNo","dataScope","remark","status","name","menuIdList"]}}},{"name":"AddSubscribeMessageTemplateInput","displayName":"","id":"#/definitions/84275183","description":"增加订阅消息模板","schema":{"jsonSchema":{"required":["keyworkIdList","sceneDescription","templateTitleId"],"type":"object","properties":{"templateTitleId":{"minLength":1,"type":"string","description":"模板标题Id"},"keyworkIdList":{"type":"array","items":{"type":"integer","format":"int32"},"description":"模板关键词列表,例如 [3,5,4]"},"sceneDescription":{"minLength":1,"type":"string","description":"服务场景描述,15个字以内"}},"additionalProperties":false,"description":"增加订阅消息模板","x-apifox-orders":["templateTitleId","keyworkIdList","sceneDescription"]}}},{"name":"AddTenantInput","displayName":"","id":"#/definitions/84275184","description":"","schema":{"jsonSchema":{"required":["adminAccount","name"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"userId":{"type":"integer","description":"用户Id","format":"int64"},"orgId":{"type":"integer","description":"机构Id","format":"int64"},"host":{"maxLength":128,"type":["string","null"],"description":"主机"},"tenantType":{"$ref":"#/definitions/84275409"},"dbType":{"$ref":"#/definitions/84275276"},"connection":{"maxLength":256,"type":["string","null"],"description":"数据库连接"},"configId":{"maxLength":64,"type":["string","null"],"description":"数据库标识"},"slaveConnections":{"type":["string","null"],"description":"从库连接/读写分离"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"remark":{"maxLength":128,"type":["string","null"],"description":"备注"},"status":{"$ref":"#/definitions/84275375"},"email":{"type":["string","null"],"description":"电子邮箱"},"phone":{"type":["string","null"],"description":"电话"},"name":{"minLength":2,"type":"string","description":"租户名称"},"adminAccount":{"minLength":3,"type":"string","description":"租管账号"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","userId","orgId","host","tenantType","dbType","connection","configId","slaveConnections","orderNo","remark","status","email","phone","name","adminAccount"]}}},{"name":"AddUserInput","displayName":"","id":"#/definitions/84275185","description":"增加用户输入参数","schema":{"jsonSchema":{"required":["account","realName"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"tenantId":{"type":["integer","null"],"description":"租户Id","format":"int64"},"nickName":{"maxLength":32,"type":["string","null"],"description":"昵称"},"avatar":{"maxLength":512,"type":["string","null"],"description":"头像"},"sex":{"$ref":"#/definitions/84275305"},"age":{"type":"integer","description":"年龄","format":"int32"},"birthday":{"type":["string","null"],"description":"出生日期","format":"date-time"},"nation":{"maxLength":32,"type":["string","null"],"description":"民族"},"phone":{"maxLength":16,"type":["string","null"],"description":"手机号码"},"cardType":{"$ref":"#/definitions/84275258"},"idCardNum":{"maxLength":32,"type":["string","null"],"description":"身份证号"},"email":{"maxLength":64,"type":["string","null"],"description":"邮箱"},"address":{"maxLength":256,"type":["string","null"],"description":"地址"},"cultureLevel":{"$ref":"#/definitions/84275267"},"politicalOutlook":{"maxLength":16,"type":["string","null"],"description":"政治面貌"},"college":{"maxLength":128,"type":["string","null"],"description":"毕业院校"},"officePhone":{"maxLength":16,"type":["string","null"],"description":"办公电话"},"emergencyContact":{"maxLength":32,"type":["string","null"],"description":"紧急联系人"},"emergencyPhone":{"maxLength":16,"type":["string","null"],"description":"紧急联系人电话"},"emergencyAddress":{"maxLength":256,"type":["string","null"],"description":"紧急联系人地址"},"introduction":{"maxLength":512,"type":["string","null"],"description":"个人简介"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"status":{"$ref":"#/definitions/84275375"},"remark":{"maxLength":256,"type":["string","null"],"description":"备注"},"accountType":{"$ref":"#/definitions/84275167"},"orgId":{"type":"integer","description":"直属机构Id","format":"int64"},"sysOrg":{"$ref":"#/definitions/84275395"},"managerUserId":{"type":["integer","null"],"description":"直属主管Id","format":"int64"},"posId":{"type":"integer","description":"职位Id","format":"int64"},"jobNum":{"maxLength":32,"type":["string","null"],"description":"工号"},"posLevel":{"maxLength":32,"type":["string","null"],"description":"职级"},"posTitle":{"maxLength":32,"type":["string","null"],"description":"职称"},"expertise":{"maxLength":32,"type":["string","null"],"description":"擅长领域"},"officeZone":{"maxLength":32,"type":["string","null"],"description":"办公区域"},"office":{"maxLength":32,"type":["string","null"],"description":"办公室"},"joinDate":{"type":["string","null"],"description":"入职日期","format":"date-time"},"lastLoginIp":{"maxLength":256,"type":["string","null"],"description":"最新登录Ip"},"lastLoginAddress":{"maxLength":128,"type":["string","null"],"description":"最新登录地点"},"lastLoginTime":{"type":["string","null"],"description":"最新登录时间","format":"date-time"},"lastLoginDevice":{"maxLength":128,"type":["string","null"],"description":"最新登录设备"},"signature":{"maxLength":512,"type":["string","null"],"description":"电子签名"},"account":{"minLength":1,"type":"string","description":"账号"},"realName":{"minLength":1,"type":"string","description":"真实姓名"},"roleIdList":{"type":["array","null"],"items":{"type":"integer","format":"int64"},"description":"角色集合"},"extOrgIdList":{"type":["array","null"],"items":{"$ref":"#/definitions/84275402"},"description":"扩展机构集合"}},"additionalProperties":false,"description":"增加用户输入参数","x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","tenantId","nickName","avatar","sex","age","birthday","nation","phone","cardType","idCardNum","email","address","cultureLevel","politicalOutlook","college","officePhone","emergencyContact","emergencyPhone","emergencyAddress","introduction","orderNo","status","remark","accountType","orgId","sysOrg","managerUserId","posId","jobNum","posLevel","posTitle","expertise","officeZone","office","joinDate","lastLoginIp","lastLoginAddress","lastLoginTime","lastLoginDevice","signature","account","realName","roleIdList","extOrgIdList"]}}},{"name":"AdminResult_Boolean","displayName":"","id":"#/definitions/84275186","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":"boolean","description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_IActionResult","displayName":"","id":"#/definitions/84275187","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275306"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_Int32","displayName":"","id":"#/definitions/84275188","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":"integer","description":"数据","format":"int32"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_Int64","displayName":"","id":"#/definitions/84275189","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":"integer","description":"数据","format":"int64"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_JObject","displayName":"","id":"#/definitions/84275190","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["object","null"],"additionalProperties":{"$ref":"#/definitions/84275307"},"description":"数据","x-apifox-orders":[]},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_ApiOutput","displayName":"","id":"#/definitions/84275191","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275257"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_CodeGenConfig","displayName":"","id":"#/definitions/84275192","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275261"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_ColumnOuput","displayName":"","id":"#/definitions/84275193","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275263"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_ConstOutput","displayName":"","id":"#/definitions/84275194","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275264"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_DatabaseOutput","displayName":"","id":"#/definitions/84275195","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275270"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_DbColumnOutput","displayName":"","id":"#/definitions/84275196","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275272"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_DbTableInfo","displayName":"","id":"#/definitions/84275197","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275274"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_EnumEntity","displayName":"","id":"#/definitions/84275198","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275301"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_EnumTypeOutput","displayName":"","id":"#/definitions/84275199","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275302"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_Int64","displayName":"","id":"#/definitions/84275200","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"type":"integer","format":"int64"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_MenuOutput","displayName":"","id":"#/definitions/84275201","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275318"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_RoleOutput","displayName":"","id":"#/definitions/84275202","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275349"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_String","displayName":"","id":"#/definitions/84275203","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"type":"string"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_SysConfig","displayName":"","id":"#/definitions/84275204","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275378"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_SysDictData","displayName":"","id":"#/definitions/84275205","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275379"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_SysDictType","displayName":"","id":"#/definitions/84275206","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275380"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_SysFile","displayName":"","id":"#/definitions/84275207","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275381"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_SysJobCluster","displayName":"","id":"#/definitions/84275208","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275382"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_SysJobTrigger","displayName":"","id":"#/definitions/84275209","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275384"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_SysMenu","displayName":"","id":"#/definitions/84275210","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275390"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_SysNotice","displayName":"","id":"#/definitions/84275211","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275392"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_SysOrg","displayName":"","id":"#/definitions/84275212","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275395"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_SysPos","displayName":"","id":"#/definitions/84275213","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275397"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_SysRegion","displayName":"","id":"#/definitions/84275214","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275399"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_SysUser","displayName":"","id":"#/definitions/84275215","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275401"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_SysUserExtOrg","displayName":"","id":"#/definitions/84275216","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275402"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_List_TableOutput","displayName":"","id":"#/definitions/84275217","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["array","null"],"items":{"$ref":"#/definitions/84275405"},"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_LoginOutput","displayName":"","id":"#/definitions/84275218","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275315"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_LoginUserOutput","displayName":"","id":"#/definitions/84275219","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275317"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_Object","displayName":"","id":"#/definitions/84275220","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"additionalProperties":false,"description":"数据","type":"null"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SmKeyPairOutput","displayName":"","id":"#/definitions/84275221","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275352"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SqlSugarPagedList_JobDetailOutput","displayName":"","id":"#/definitions/84275222","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275353"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SqlSugarPagedList_OpenAccessOutput","displayName":"","id":"#/definitions/84275223","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275354"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SqlSugarPagedList_SysCodeGen","displayName":"","id":"#/definitions/84275224","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275355"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SqlSugarPagedList_SysConfig","displayName":"","id":"#/definitions/84275225","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275356"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SqlSugarPagedList_SysDictData","displayName":"","id":"#/definitions/84275226","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275357"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SqlSugarPagedList_SysDictType","displayName":"","id":"#/definitions/84275227","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275358"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SqlSugarPagedList_SysFile","displayName":"","id":"#/definitions/84275228","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275359"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SqlSugarPagedList_SysJobTriggerRecord","displayName":"","id":"#/definitions/84275229","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275360"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SqlSugarPagedList_SysLogDiff","displayName":"","id":"#/definitions/84275230","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275361"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SqlSugarPagedList_SysLogEx","displayName":"","id":"#/definitions/84275231","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275362"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SqlSugarPagedList_SysLogOp","displayName":"","id":"#/definitions/84275232","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275363"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SqlSugarPagedList_SysLogVis","displayName":"","id":"#/definitions/84275233","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275364"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SqlSugarPagedList_SysNotice","displayName":"","id":"#/definitions/84275234","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275365"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SqlSugarPagedList_SysNoticeUser","displayName":"","id":"#/definitions/84275235","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275366"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SqlSugarPagedList_SysOnlineUser","displayName":"","id":"#/definitions/84275236","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275367"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SqlSugarPagedList_SysPlugin","displayName":"","id":"#/definitions/84275237","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275368"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SqlSugarPagedList_SysPrint","displayName":"","id":"#/definitions/84275238","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275369"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SqlSugarPagedList_SysRegion","displayName":"","id":"#/definitions/84275239","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275370"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SqlSugarPagedList_SysRole","displayName":"","id":"#/definitions/84275240","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275371"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SqlSugarPagedList_SysWechatUser","displayName":"","id":"#/definitions/84275241","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275372"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SqlSugarPagedList_TenantOutput","displayName":"","id":"#/definitions/84275242","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275373"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SqlSugarPagedList_UserOutput","displayName":"","id":"#/definitions/84275243","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275374"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_String","displayName":"","id":"#/definitions/84275244","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"type":["string","null"],"description":"数据"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SysCodeGen","displayName":"","id":"#/definitions/84275245","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275376"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SysCodeGenConfig","displayName":"","id":"#/definitions/84275246","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275377"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SysConfig","displayName":"","id":"#/definitions/84275247","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275378"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SysDictData","displayName":"","id":"#/definitions/84275248","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275379"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SysDictType","displayName":"","id":"#/definitions/84275249","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275380"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SysFile","displayName":"","id":"#/definitions/84275250","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275381"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SysPrint","displayName":"","id":"#/definitions/84275251","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275398"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SysUser","displayName":"","id":"#/definitions/84275252","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275401"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_SysWechatPay","displayName":"","id":"#/definitions/84275253","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275403"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_WechatPayOutput","displayName":"","id":"#/definitions/84275254","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275436"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_WxOpenIdOutput","displayName":"","id":"#/definitions/84275255","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275442"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"AdminResult_WxPhoneOutput","displayName":"","id":"#/definitions/84275256","description":"全局返回结果","schema":{"jsonSchema":{"type":"object","properties":{"code":{"type":"integer","description":"状态码","format":"int32"},"type":{"type":["string","null"],"description":"类型success、warning、error"},"message":{"type":["string","null"],"description":"错误信息"},"result":{"$ref":"#/definitions/84275443"},"extras":{"additionalProperties":false,"description":"附加数据","type":"null"},"time":{"type":"string","description":"时间","format":"date-time"}},"additionalProperties":false,"description":"全局返回结果","x-apifox-orders":["code","type","message","result","extras","time"]}}},{"name":"ApiOutput","displayName":"","id":"#/definitions/84275257","description":"接口/动态API输出","schema":{"jsonSchema":{"type":"object","properties":{"groupName":{"type":["string","null"],"description":"组名称"},"displayName":{"type":["string","null"],"description":"接口名称"},"routeName":{"type":["string","null"],"description":"路由名称"}},"additionalProperties":false,"description":"接口/动态API输出","x-apifox-orders":["groupName","displayName","routeName"]}}},{"name":"CardTypeEnum","displayName":"","id":"#/definitions/84275258","description":"证件类型枚举
 身份证 IdCard = 0
 护照 PassportCard = 1
 出生证 BirthCard = 2
 港澳台通行证 GatCard = 3
 外国人居留证 ForeignCard = 4
 营业执照 License = 5
","schema":{"jsonSchema":{"enum":[0,1,2,3,4,5],"type":"integer","description":"证件类型枚举
 身份证 IdCard = 0
 护照 PassportCard = 1
 出生证 BirthCard = 2
 港澳台通行证 GatCard = 3
 外国人居留证 ForeignCard = 4
 营业执照 License = 5
","format":"int32"}}},{"name":"ChangePwdInput","displayName":"","id":"#/definitions/84275259","description":"修改用户密码输入参数","schema":{"jsonSchema":{"required":["passwordNew","passwordOld"],"type":"object","properties":{"passwordOld":{"minLength":1,"type":"string","description":"当前密码"},"passwordNew":{"maxLength":20,"minLength":5,"type":"string","description":"新密码"}},"additionalProperties":false,"description":"修改用户密码输入参数","x-apifox-orders":["passwordOld","passwordNew"]}}},{"name":"ClusterStatus","displayName":"","id":"#/definitions/84275260","description":"
  Crashed = 0
  Working = 1
  Waiting = 2
","schema":{"jsonSchema":{"enum":[0,1,2],"type":"integer","description":"
  Crashed = 0
  Working = 1
  Waiting = 2
","format":"int32"}}},{"name":"CodeGenConfig","displayName":"","id":"#/definitions/84275261","description":"代码生成详细配置参数","schema":{"jsonSchema":{"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"},"codeGenId":{"type":"integer","description":"代码生成主表ID","format":"int64"},"columnName":{"type":["string","null"],"description":"数据库字段名"},"propertyName":{"type":["string","null"],"description":"实体属性名"},"columnLength":{"type":"integer","description":"字段数据长度","format":"int32"},"lowerPropertyName":{"type":["string","null"],"description":"数据库字段名(首字母小写)","readOnly":true},"columnComment":{"type":["string","null"],"description":"字段描述"},"netType":{"type":["string","null"],"description":".NET类型"},"effectType":{"type":["string","null"],"description":"作用类型(字典)"},"fkEntityName":{"type":["string","null"],"description":"外键实体名称"},"fkTableName":{"type":["string","null"],"description":"外键表名称"},"lowerFkEntityName":{"type":["string","null"],"description":"外键实体名称(首字母小写)","readOnly":true},"fkColumnName":{"type":["string","null"],"description":"外键显示字段"},"lowerFkColumnName":{"type":["string","null"],"description":"外键显示字段(首字母小写)","readOnly":true},"fkColumnNetType":{"type":["string","null"],"description":"外键显示字段.NET类型"},"dictTypeCode":{"type":["string","null"],"description":"字典code"},"whetherRetract":{"type":["string","null"],"description":"列表是否缩进(字典)"},"whetherRequired":{"type":["string","null"],"description":"是否必填(字典)"},"whetherSortable":{"type":["string","null"],"description":"是否可排序(字典)"},"queryWhether":{"type":["string","null"],"description":"是否是查询条件"},"queryType":{"type":["string","null"],"description":"查询方式"},"whetherTable":{"type":["string","null"],"description":"列表显示"},"whetherAddUpdate":{"type":["string","null"],"description":"增改"},"columnKey":{"type":["string","null"],"description":"主外键"},"dataType":{"type":["string","null"],"description":"数据库中类型(物理类型)"},"whetherCommon":{"type":["string","null"],"description":"是否是通用字段"},"tableNickName":{"type":["string","null"],"description":"表的别名 Table as XXX","readOnly":true},"displayColumn":{"type":["string","null"],"description":"显示文本字段"},"valueColumn":{"type":["string","null"],"description":"选中值字段"},"pidColumn":{"type":["string","null"],"description":"父级字段"},"orderNo":{"type":"integer","description":"排序","format":"int32"}},"additionalProperties":false,"description":"代码生成详细配置参数","x-apifox-orders":["id","codeGenId","columnName","propertyName","columnLength","lowerPropertyName","columnComment","netType","effectType","fkEntityName","fkTableName","lowerFkEntityName","fkColumnName","lowerFkColumnName","fkColumnNetType","dictTypeCode","whetherRetract","whetherRequired","whetherSortable","queryWhether","queryType","whetherTable","whetherAddUpdate","columnKey","dataType","whetherCommon","tableNickName","displayColumn","valueColumn","pidColumn","orderNo"]}}},{"name":"CodeGenInput","displayName":"","id":"#/definitions/84275262","description":"代码生成参数类","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"当前页码","format":"int32"},"pageSize":{"type":"integer","description":"页码容量","format":"int32"},"field":{"type":["string","null"],"description":"排序字段"},"order":{"type":["string","null"],"description":"排序方向"},"descStr":{"type":["string","null"],"description":"降序排序"},"authorName":{"type":["string","null"],"description":"作者姓名"},"className":{"type":["string","null"],"description":"类名"},"tablePrefix":{"type":["string","null"],"description":"是否移除表前缀"},"configId":{"type":["string","null"],"description":"库定位器名"},"dbName":{"type":["string","null"],"description":"数据库名(保留字段)"},"dbType":{"type":["string","null"],"description":"数据库类型"},"connectionString":{"type":["string","null"],"description":"数据库链接"},"generateType":{"type":["string","null"],"description":"生成方式"},"tableName":{"type":["string","null"],"description":"数据库表名"},"nameSpace":{"type":["string","null"],"description":"命名空间"},"busName":{"type":["string","null"],"description":"业务名(业务代码包名称)"},"tableComment":{"type":["string","null"],"description":"功能名(数据库表名称)"},"menuApplication":{"type":["string","null"],"description":"菜单应用分类(应用编码)"},"menuPid":{"type":"integer","description":"菜单父级","format":"int64"},"printType":{"type":["string","null"],"description":"支持打印类型"},"printName":{"type":["string","null"],"description":"打印模版名称"}},"additionalProperties":false,"description":"代码生成参数类","x-apifox-orders":["page","pageSize","field","order","descStr","authorName","className","tablePrefix","configId","dbName","dbType","connectionString","generateType","tableName","nameSpace","busName","tableComment","menuApplication","menuPid","printType","printName"]}}},{"name":"ColumnOuput","displayName":"","id":"#/definitions/84275263","description":"数据库表列","schema":{"jsonSchema":{"type":"object","properties":{"columnName":{"type":["string","null"],"description":"字段名"},"propertyName":{"type":["string","null"],"description":"实体的Property名"},"columnLength":{"type":"integer","description":"字段数据长度","format":"int32"},"dataType":{"type":["string","null"],"description":"数据库中类型"},"isPrimarykey":{"type":"boolean","description":"是否为主键"},"isNullable":{"type":"boolean","description":"是否允许为空"},"netType":{"type":["string","null"],"description":".NET字段类型"},"columnComment":{"type":["string","null"],"description":"字段描述"},"columnKey":{"type":["string","null"],"description":"主外键"}},"additionalProperties":false,"description":"数据库表列","x-apifox-orders":["columnName","propertyName","columnLength","dataType","isPrimarykey","isNullable","netType","columnComment","columnKey"]}}},{"name":"ConstOutput","displayName":"","id":"#/definitions/84275264","description":"","schema":{"jsonSchema":{"type":"object","properties":{"name":{"type":["string","null"],"description":"名称"},"code":{"additionalProperties":false,"description":"编码","type":"null"},"data":{"additionalProperties":false,"description":"扩展字段","type":"null"}},"additionalProperties":false,"x-apifox-orders":["name","code","data"]}}},{"name":"CreateEntityInput","displayName":"","id":"#/definitions/84275265","description":"","schema":{"jsonSchema":{"type":"object","properties":{"tableName":{"type":["string","null"],"description":"表名","examples":["student"]},"entityName":{"type":["string","null"],"description":"实体名","examples":["Student"]},"baseClassName":{"type":["string","null"],"description":"基类名","examples":["AutoIncrementEntity"]},"position":{"type":["string","null"],"description":"导出位置","examples":["Web.Application"]},"configId":{"type":["string","null"],"description":"库标识"}},"additionalProperties":false,"x-apifox-orders":["tableName","entityName","baseClassName","position","configId"]}}},{"name":"CreateSeedDataInput","displayName":"","id":"#/definitions/84275266","description":"","schema":{"jsonSchema":{"type":"object","properties":{"configId":{"type":["string","null"],"description":"库标识"},"tableName":{"type":["string","null"],"description":"表名","examples":["student"]},"entityName":{"type":["string","null"],"description":"实体名称","examples":["Student"]},"seedDataName":{"type":["string","null"],"description":"种子名称","examples":["Student"]},"position":{"type":["string","null"],"description":"导出位置","examples":["Web.Application"]},"suffix":{"type":["string","null"],"description":"后缀","examples":["Web.Application"]}},"additionalProperties":false,"x-apifox-orders":["configId","tableName","entityName","seedDataName","position","suffix"]}}},{"name":"CultureLevelEnum","displayName":"","id":"#/definitions/84275267","description":"文化程度枚举
 其他 Level0 = 0
 小学 Level1 = 1
 初中 Level2 = 2
 普通高中 Level3 = 3
 技工学校 Level4 = 4
 职业教育 Level5 = 5
 职业高中 Level6 = 6
 中等专科 Level7 = 7
 大学专科 Level8 = 8
 大学本科 Level9 = 9
 硕士研究生 Level10 = 10
 博士研究生 Level11 = 11
","schema":{"jsonSchema":{"enum":[0,1,2,3,4,5,6,7,8,9,10,11],"type":"integer","description":"文化程度枚举
 其他 Level0 = 0
 小学 Level1 = 1
 初中 Level2 = 2
 普通高中 Level3 = 3
 技工学校 Level4 = 4
 职业教育 Level5 = 5
 职业高中 Level6 = 6
 中等专科 Level7 = 7
 大学专科 Level8 = 8
 大学本科 Level9 = 9
 硕士研究生 Level10 = 10
 博士研究生 Level11 = 11
","format":"int32"}}},{"name":"DataItem","displayName":"","id":"#/definitions/84275268","description":"","schema":{"jsonSchema":{"type":"object","properties":{"value":{"type":["string","null"]}},"additionalProperties":false,"x-apifox-orders":["value"]}}},{"name":"DataScopeEnum","displayName":"","id":"#/definitions/84275269","description":"角色数据范围枚举
 全部数据 All = 1
 本部门及以下数据 DeptChild = 2
 本部门数据 Dept = 3
 仅本人数据 Self = 4
 自定义数据 Define = 5
","schema":{"jsonSchema":{"enum":[1,2,3,4,5],"type":"integer","description":"角色数据范围枚举
 全部数据 All = 1
 本部门及以下数据 DeptChild = 2
 本部门数据 Dept = 3
 仅本人数据 Self = 4
 自定义数据 Define = 5
","format":"int32"}}},{"name":"DatabaseOutput","displayName":"","id":"#/definitions/84275270","description":"数据库","schema":{"jsonSchema":{"type":"object","properties":{"configId":{"type":["string","null"],"description":"库定位器名"},"dbType":{"$ref":"#/definitions/84275276"},"connectionString":{"type":["string","null"],"description":"数据库连接字符串"}},"additionalProperties":false,"description":"数据库","x-apifox-orders":["configId","dbType","connectionString"]}}},{"name":"DbColumnInput","displayName":"","id":"#/definitions/84275271","description":"","schema":{"jsonSchema":{"type":"object","properties":{"configId":{"type":["string","null"]},"tableName":{"type":["string","null"]},"dbColumnName":{"type":["string","null"]},"dataType":{"type":["string","null"]},"length":{"type":"integer","format":"int32"},"columnDescription":{"type":["string","null"]},"isNullable":{"type":"integer","format":"int32"},"isIdentity":{"type":"integer","format":"int32"},"isPrimarykey":{"type":"integer","format":"int32"},"decimalDigits":{"type":"integer","format":"int32"}},"additionalProperties":false,"x-apifox-orders":["configId","tableName","dbColumnName","dataType","length","columnDescription","isNullable","isIdentity","isPrimarykey","decimalDigits"]}}},{"name":"DbColumnOutput","displayName":"","id":"#/definitions/84275272","description":"","schema":{"jsonSchema":{"type":"object","properties":{"tableName":{"type":["string","null"]},"tableId":{"type":"integer","format":"int32"},"dbColumnName":{"type":["string","null"]},"propertyName":{"type":["string","null"]},"dataType":{"type":["string","null"]},"propertyType":{"additionalProperties":false,"type":"null"},"length":{"type":"integer","format":"int32"},"columnDescription":{"type":["string","null"]},"defaultValue":{"type":["string","null"]},"isNullable":{"type":"boolean"},"isIdentity":{"type":"boolean"},"isPrimarykey":{"type":"boolean"},"value":{"additionalProperties":false,"type":"null"},"decimalDigits":{"type":"integer","format":"int32"},"scale":{"type":"integer","format":"int32"},"isArray":{"type":"boolean"},"isJson":{"type":"boolean"},"isUnsigned":{"type":["boolean","null"]},"createTableFieldSort":{"type":"integer","format":"int32"}},"additionalProperties":false,"x-apifox-orders":["tableName","tableId","dbColumnName","propertyName","dataType","propertyType","length","columnDescription","defaultValue","isNullable","isIdentity","isPrimarykey","value","decimalDigits","scale","isArray","isJson","isUnsigned","createTableFieldSort"]}}},{"name":"DbObjectType","displayName":"","id":"#/definitions/84275273","description":"","schema":{"jsonSchema":{"enum":[0,1,2],"type":"integer","format":"int32"}}},{"name":"DbTableInfo","displayName":"","id":"#/definitions/84275274","description":"","schema":{"jsonSchema":{"type":"object","properties":{"name":{"type":["string","null"]},"description":{"type":["string","null"]},"dbObjectType":{"$ref":"#/definitions/84275273"}},"additionalProperties":false,"x-apifox-orders":["name","description","dbObjectType"]}}},{"name":"DbTableInput","displayName":"","id":"#/definitions/84275275","description":"","schema":{"jsonSchema":{"type":"object","properties":{"configId":{"type":["string","null"]},"tableName":{"type":["string","null"]},"description":{"type":["string","null"]},"dbColumnInfoList":{"type":["array","null"],"items":{"$ref":"#/definitions/84275271"}}},"additionalProperties":false,"x-apifox-orders":["configId","tableName","description","dbColumnInfoList"]}}},{"name":"DbType","displayName":"","id":"#/definitions/84275276","description":"","schema":{"jsonSchema":{"enum":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,900],"type":"integer","format":"int32"}}},{"name":"DeleteCodeGenInput","displayName":"","id":"#/definitions/84275277","description":"","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"代码生成器Id","format":"int64"}},"additionalProperties":false,"x-apifox-orders":["id"]}}},{"name":"DeleteConfigInput","displayName":"","id":"#/definitions/84275278","description":"","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"}},"additionalProperties":false,"x-apifox-orders":["id"]}}},{"name":"DeleteDbColumnInput","displayName":"","id":"#/definitions/84275279","description":"","schema":{"jsonSchema":{"type":"object","properties":{"configId":{"type":["string","null"]},"tableName":{"type":["string","null"]},"dbColumnName":{"type":["string","null"]}},"additionalProperties":false,"x-apifox-orders":["configId","tableName","dbColumnName"]}}},{"name":"DeleteDbTableInput","displayName":"","id":"#/definitions/84275280","description":"","schema":{"jsonSchema":{"type":"object","properties":{"configId":{"type":["string","null"]},"tableName":{"type":["string","null"]}},"additionalProperties":false,"x-apifox-orders":["configId","tableName"]}}},{"name":"DeleteDictDataInput","displayName":"","id":"#/definitions/84275281","description":"","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"}},"additionalProperties":false,"x-apifox-orders":["id"]}}},{"name":"DeleteDictTypeInput","displayName":"","id":"#/definitions/84275282","description":"","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"}},"additionalProperties":false,"x-apifox-orders":["id"]}}},{"name":"DeleteFileInput","displayName":"","id":"#/definitions/84275283","description":"","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"}},"additionalProperties":false,"x-apifox-orders":["id"]}}},{"name":"DeleteJobDetailInput","displayName":"","id":"#/definitions/84275284","description":"","schema":{"jsonSchema":{"type":"object","properties":{"jobId":{"type":["string","null"],"description":"作业Id"}},"additionalProperties":false,"x-apifox-orders":["jobId"]}}},{"name":"DeleteJobTriggerInput","displayName":"","id":"#/definitions/84275285","description":"","schema":{"jsonSchema":{"type":"object","properties":{"jobId":{"type":["string","null"],"description":"作业Id"},"triggerId":{"type":["string","null"],"description":"触发器Id"}},"additionalProperties":false,"x-apifox-orders":["jobId","triggerId"]}}},{"name":"DeleteMenuInput","displayName":"","id":"#/definitions/84275286","description":"","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"}},"additionalProperties":false,"x-apifox-orders":["id"]}}},{"name":"DeleteMessageTemplateInput","displayName":"","id":"#/definitions/84275287","description":"删除消息模板","schema":{"jsonSchema":{"required":["templateId"],"type":"object","properties":{"templateId":{"minLength":1,"type":"string","description":"订阅模板Id"}},"additionalProperties":false,"description":"删除消息模板","x-apifox-orders":["templateId"]}}},{"name":"DeleteNoticeInput","displayName":"","id":"#/definitions/84275288","description":"","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"}},"additionalProperties":false,"x-apifox-orders":["id"]}}},{"name":"DeleteOpenAccessInput","displayName":"","id":"#/definitions/84275289","description":"","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"}},"additionalProperties":false,"x-apifox-orders":["id"]}}},{"name":"DeleteOrgInput","displayName":"","id":"#/definitions/84275290","description":"","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"}},"additionalProperties":false,"x-apifox-orders":["id"]}}},{"name":"DeletePluginInput","displayName":"","id":"#/definitions/84275291","description":"","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"}},"additionalProperties":false,"x-apifox-orders":["id"]}}},{"name":"DeletePosInput","displayName":"","id":"#/definitions/84275292","description":"","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"}},"additionalProperties":false,"x-apifox-orders":["id"]}}},{"name":"DeletePrintInput","displayName":"","id":"#/definitions/84275293","description":"","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"}},"additionalProperties":false,"x-apifox-orders":["id"]}}},{"name":"DeleteRegionInput","displayName":"","id":"#/definitions/84275294","description":"","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"}},"additionalProperties":false,"x-apifox-orders":["id"]}}},{"name":"DeleteRoleInput","displayName":"","id":"#/definitions/84275295","description":"","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"}},"additionalProperties":false,"x-apifox-orders":["id"]}}},{"name":"DeleteTenantInput","displayName":"","id":"#/definitions/84275296","description":"","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"}},"additionalProperties":false,"x-apifox-orders":["id"]}}},{"name":"DeleteUserInput","displayName":"","id":"#/definitions/84275297","description":"删除用户输入参数","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"},"orgId":{"type":"integer","description":"机构Id","format":"int64"}},"additionalProperties":false,"description":"删除用户输入参数","x-apifox-orders":["id","orgId"]}}},{"name":"DeleteWechatUserInput","displayName":"","id":"#/definitions/84275298","description":"","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"}},"additionalProperties":false,"x-apifox-orders":["id"]}}},{"name":"DictDataInput","displayName":"","id":"#/definitions/84275299","description":"","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"},"status":{"$ref":"#/definitions/84275375"}},"additionalProperties":false,"x-apifox-orders":["id","status"]}}},{"name":"DictTypeInput","displayName":"","id":"#/definitions/84275300","description":"","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"},"status":{"$ref":"#/definitions/84275375"}},"additionalProperties":false,"x-apifox-orders":["id","status"]}}},{"name":"EnumEntity","displayName":"","id":"#/definitions/84275301","description":"枚举实体","schema":{"jsonSchema":{"type":"object","properties":{"describe":{"type":["string","null"],"description":"枚举的描述"},"name":{"type":["string","null"],"description":"枚举名称"},"value":{"type":"integer","description":"枚举对象的值","format":"int32"}},"additionalProperties":false,"description":"枚举实体","x-apifox-orders":["describe","name","value"]}}},{"name":"EnumTypeOutput","displayName":"","id":"#/definitions/84275302","description":"枚举类型输出参数","schema":{"jsonSchema":{"type":"object","properties":{"typeDescribe":{"type":["string","null"],"description":"枚举类型描述"},"typeName":{"type":["string","null"],"description":"枚举类型名称"},"typeRemark":{"type":["string","null"],"description":"枚举类型备注"}},"additionalProperties":false,"description":"枚举类型输出参数","x-apifox-orders":["typeDescribe","typeName","typeRemark"]}}},{"name":"FileInput","displayName":"","id":"#/definitions/84275303","description":"","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"},"fileName":{"type":["string","null"],"description":"文件名称"},"url":{"type":["string","null"],"description":"文件Url"}},"additionalProperties":false,"x-apifox-orders":["id","fileName","url"]}}},{"name":"GenAuthUrlInput","displayName":"","id":"#/definitions/84275304","description":"生成网页授权Url","schema":{"jsonSchema":{"type":"object","properties":{"redirectUrl":{"type":["string","null"],"description":"RedirectUrl"},"scope":{"type":["string","null"],"description":"Scope"}},"additionalProperties":false,"description":"生成网页授权Url","x-apifox-orders":["redirectUrl","scope"]}}},{"name":"GenderEnum","displayName":"","id":"#/definitions/84275305","description":"性别枚举
 男 Male = 1
 女 Female = 2
 其他 Other = 3
","schema":{"jsonSchema":{"enum":[1,2,3],"type":"integer","description":"性别枚举
 男 Male = 1
 女 Female = 2
 其他 Other = 3
","format":"int32"}}},{"name":"IActionResult","displayName":"","id":"#/definitions/84275306","description":"","schema":{"jsonSchema":{"type":"object","additionalProperties":false,"x-apifox-orders":[]}}},{"name":"JToken","displayName":"","id":"#/definitions/84275307","description":"","schema":{"jsonSchema":{"type":"array","items":{"$ref":"#/definitions/84275307"}}}},{"name":"JobCreateTypeEnum","displayName":"","id":"#/definitions/84275308","description":"作业创建类型枚举
 内置 BuiltIn = 0
 脚本 Script = 1
 HTTP请求 Http = 2
","schema":{"jsonSchema":{"enum":[0,1,2],"type":"integer","description":"作业创建类型枚举
 内置 BuiltIn = 0
 脚本 Script = 1
 HTTP请求 Http = 2
","format":"int32"}}},{"name":"JobDetailInput","displayName":"","id":"#/definitions/84275309","description":"","schema":{"jsonSchema":{"type":"object","properties":{"jobId":{"type":["string","null"],"description":"作业Id"}},"additionalProperties":false,"x-apifox-orders":["jobId"]}}},{"name":"JobDetailOutput","displayName":"","id":"#/definitions/84275310","description":"","schema":{"jsonSchema":{"type":"object","properties":{"jobDetail":{"$ref":"#/definitions/84275383"},"jobTriggers":{"type":["array","null"],"items":{"$ref":"#/definitions/84275384"},"description":"触发器集合"}},"additionalProperties":false,"x-apifox-orders":["jobDetail","jobTriggers"]}}},{"name":"JobTriggerInput","displayName":"","id":"#/definitions/84275311","description":"","schema":{"jsonSchema":{"type":"object","properties":{"jobId":{"type":["string","null"],"description":"作业Id"},"triggerId":{"type":["string","null"],"description":"触发器Id"}},"additionalProperties":false,"x-apifox-orders":["jobId","triggerId"]}}},{"name":"LogInput","displayName":"","id":"#/definitions/84275312","description":"","schema":{"jsonSchema":{"type":"object","properties":{"startTime":{"type":["string","null"],"description":"开始时间","format":"date-time"},"endTime":{"type":["string","null"],"description":"结束时间","format":"date-time"}},"additionalProperties":false,"x-apifox-orders":["startTime","endTime"]}}},{"name":"LogLevel","displayName":"","id":"#/definitions/84275313","description":"","schema":{"jsonSchema":{"enum":[0,1,2,3,4,5,6],"type":"integer","format":"int32"}}},{"name":"LoginInput","displayName":"","id":"#/definitions/84275314","description":"用户登录参数","schema":{"jsonSchema":{"required":["account","password"],"type":"object","properties":{"account":{"minLength":2,"type":"string","description":"账号","examples":["admin"]},"password":{"minLength":3,"type":"string","description":"密码","examples":["123456"]},"codeId":{"type":"integer","description":"验证码Id","format":"int64"},"code":{"type":["string","null"],"description":"验证码"}},"additionalProperties":false,"description":"用户登录参数","x-apifox-orders":["account","password","codeId","code"]}}},{"name":"LoginOutput","displayName":"","id":"#/definitions/84275315","description":"用户登录结果","schema":{"jsonSchema":{"type":"object","properties":{"accessToken":{"type":["string","null"],"description":"令牌Token"},"refreshToken":{"type":["string","null"],"description":"刷新Token"}},"additionalProperties":false,"description":"用户登录结果","x-apifox-orders":["accessToken","refreshToken"]}}},{"name":"LoginPhoneInput","displayName":"","id":"#/definitions/84275316","description":"","schema":{"jsonSchema":{"required":["code","phone"],"type":"object","properties":{"phone":{"minLength":1,"type":"string","description":"手机号码","examples":["admin"]},"code":{"minLength":4,"type":"string","description":"验证码","examples":["123456"]}},"additionalProperties":false,"x-apifox-orders":["phone","code"]}}},{"name":"LoginUserOutput","displayName":"","id":"#/definitions/84275317","description":"用户登录信息","schema":{"jsonSchema":{"type":"object","properties":{"id":{"type":"integer","description":"用户id","format":"int64"},"account":{"type":["string","null"],"description":"账号名称"},"realName":{"type":["string","null"],"description":"真实姓名"},"phone":{"type":["string","null"],"description":"电话"},"idCardNum":{"type":["string","null"],"description":"身份证"},"email":{"type":["string","null"],"description":"邮箱"},"accountType":{"$ref":"#/definitions/84275167"},"avatar":{"type":["string","null"],"description":"头像"},"introduction":{"type":["string","null"],"description":"个人简介"},"address":{"type":["string","null"],"description":"地址"},"signature":{"type":["string","null"],"description":"电子签名"},"orgId":{"type":"integer","description":"机构Id","format":"int64"},"orgName":{"type":["string","null"],"description":"机构名称"},"orgType":{"type":["string","null"],"description":"机构类型"},"posName":{"type":["string","null"],"description":"职位名称"},"buttons":{"type":["array","null"],"items":{"type":"string"},"description":"按钮权限集合"},"roleIds":{"type":["array","null"],"items":{"type":"integer","format":"int64"},"description":"角色集合"}},"additionalProperties":false,"description":"用户登录信息","x-apifox-orders":["id","account","realName","phone","idCardNum","email","accountType","avatar","introduction","address","signature","orgId","orgName","orgType","posName","buttons","roleIds"]}}},{"name":"MenuOutput","displayName":"","id":"#/definitions/84275318","description":"系统菜单返回结果","schema":{"jsonSchema":{"type":"object","properties":{"id":{"type":"integer","description":"Id","format":"int64"},"pid":{"type":"integer","description":"父Id","format":"int64"},"type":{"$ref":"#/definitions/84275319"},"name":{"type":["string","null"],"description":"名称"},"path":{"type":["string","null"],"description":"路由地址"},"component":{"type":["string","null"],"description":"组件路径"},"permission":{"type":["string","null"],"description":"权限标识"},"redirect":{"type":["string","null"],"description":"重定向"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"status":{"$ref":"#/definitions/84275375"},"remark":{"type":["string","null"],"description":"备注"},"createTime":{"type":"string","description":"创建时间","format":"date-time"},"updateTime":{"type":"string","description":"更新时间","format":"date-time"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"meta":{"$ref":"#/definitions/84275391"},"children":{"type":["array","null"],"items":{"$ref":"#/definitions/84275318"},"description":"菜单子项"}},"additionalProperties":false,"description":"系统菜单返回结果","x-apifox-orders":["id","pid","type","name","path","component","permission","redirect","orderNo","status","remark","createTime","updateTime","createUserName","updateUserName","meta","children"]}}},{"name":"MenuTypeEnum","displayName":"","id":"#/definitions/84275319","description":"系统菜单类型枚举
 目录 Dir = 1
 菜单 Menu = 2
 按钮 Btn = 3
","schema":{"jsonSchema":{"enum":[1,2,3],"type":"integer","description":"系统菜单类型枚举
 目录 Dir = 1
 菜单 Menu = 2
 按钮 Btn = 3
","format":"int32"}}},{"name":"MessageInput","displayName":"","id":"#/definitions/84275320","description":"","schema":{"jsonSchema":{"type":"object","properties":{"userId":{"type":"integer","description":"用户ID","format":"int64"},"userIds":{"type":["array","null"],"items":{"type":"integer","format":"int64"},"description":"用户ID列表"},"title":{"type":["string","null"],"description":"消息标题"},"messageType":{"$ref":"#/definitions/84275322"},"message":{"type":["string","null"],"description":"消息内容"}},"additionalProperties":false,"x-apifox-orders":["userId","userIds","title","messageType","message"]}}},{"name":"MessageTemplateSendInput","displayName":"","id":"#/definitions/84275321","description":"获取消息模板列表","schema":{"jsonSchema":{"required":["data","templateId","toUserOpenId"],"type":"object","properties":{"templateId":{"minLength":1,"type":"string","description":"订阅模板Id"},"toUserOpenId":{"minLength":1,"type":"string","description":"接收者的OpenId"},"data":{"type":"object","additionalProperties":{"$ref":"#/definitions/84275268"},"description":"模板数据,格式形如 { \"key1\": { \"value\": any }, \"key2\": { \"value\": any } }","x-apifox-orders":[]},"url":{"type":["string","null"],"description":"模板跳转链接"},"miniProgramPagePath":{"type":["string","null"],"description":"所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar)"}},"additionalProperties":false,"description":"获取消息模板列表","x-apifox-orders":["templateId","toUserOpenId","data","url","miniProgramPagePath"]}}},{"name":"MessageTypeEnum","displayName":"","id":"#/definitions/84275322","description":"消息类型枚举
 消息 Info = 0
 成功 Success = 1
 警告 Warning = 2
 错误 Error = 3
","schema":{"jsonSchema":{"enum":[0,1,2,3],"type":"integer","description":"消息类型枚举
 消息 Info = 0
 成功 Success = 1
 警告 Warning = 2
 错误 Error = 3
","format":"int32"}}},{"name":"NoticeInput","displayName":"","id":"#/definitions/84275323","description":"","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"}},"additionalProperties":false,"x-apifox-orders":["id"]}}},{"name":"NoticeStatusEnum","displayName":"","id":"#/definitions/84275324","description":"通知公告状态枚举
 草稿 DRAFT = 0
 发布 PUBLIC = 1
 撤回 CANCEL = 2
 删除 DELETED = 3
","schema":{"jsonSchema":{"enum":[0,1,2,3],"type":"integer","description":"通知公告状态枚举
 草稿 DRAFT = 0
 发布 PUBLIC = 1
 撤回 CANCEL = 2
 删除 DELETED = 3
","format":"int32"}}},{"name":"NoticeTypeEnum","displayName":"","id":"#/definitions/84275325","description":"通知公告状类型枚举
 通知 NOTICE = 1
 公告 ANNOUNCEMENT = 2
","schema":{"jsonSchema":{"enum":[1,2],"type":"integer","description":"通知公告状类型枚举
 通知 NOTICE = 1
 公告 ANNOUNCEMENT = 2
","format":"int32"}}},{"name":"NoticeUserStatusEnum","displayName":"","id":"#/definitions/84275326","description":"通知公告用户状态枚举
 未读 UNREAD = 0
 已读 READ = 1
","schema":{"jsonSchema":{"enum":[0,1],"type":"integer","description":"通知公告用户状态枚举
 未读 UNREAD = 0
 已读 READ = 1
","format":"int32"}}},{"name":"OpenAccessInput","displayName":"","id":"#/definitions/84275327","description":"开放接口身份输入参数","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"当前页码","format":"int32"},"pageSize":{"type":"integer","description":"页码容量","format":"int32"},"field":{"type":["string","null"],"description":"排序字段"},"order":{"type":["string","null"],"description":"排序方向"},"descStr":{"type":["string","null"],"description":"降序排序"},"accessKey":{"type":["string","null"],"description":"身份标识"}},"additionalProperties":false,"description":"开放接口身份输入参数","x-apifox-orders":["page","pageSize","field","order","descStr","accessKey"]}}},{"name":"OpenAccessOutput","displayName":"","id":"#/definitions/84275328","description":"","schema":{"jsonSchema":{"required":["accessKey","accessSecret"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"accessKey":{"maxLength":128,"minLength":1,"type":"string","description":"身份标识"},"accessSecret":{"maxLength":256,"minLength":1,"type":"string","description":"密钥"},"bindTenantId":{"type":"integer","description":"绑定租户Id","format":"int64"},"bindUserId":{"type":"integer","description":"绑定用户Id","format":"int64"},"bindUserAccount":{"type":["string","null"],"description":"绑定用户账号"},"bindTenantName":{"type":["string","null"],"description":"绑定租户名称"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","accessKey","accessSecret","bindTenantId","bindUserId","bindUserAccount","bindTenantName"]}}},{"name":"PageConfigInput","displayName":"","id":"#/definitions/84275329","description":"","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"当前页码","format":"int32"},"pageSize":{"type":"integer","description":"页码容量","format":"int32"},"field":{"type":["string","null"],"description":"排序字段"},"order":{"type":["string","null"],"description":"排序方向"},"descStr":{"type":["string","null"],"description":"降序排序"},"name":{"type":["string","null"],"description":"名称"},"code":{"type":["string","null"],"description":"编码"},"groupCode":{"type":["string","null"],"description":"分组编码"}},"additionalProperties":false,"x-apifox-orders":["page","pageSize","field","order","descStr","name","code","groupCode"]}}},{"name":"PageDictDataInput","displayName":"","id":"#/definitions/84275330","description":"","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"当前页码","format":"int32"},"pageSize":{"type":"integer","description":"页码容量","format":"int32"},"field":{"type":["string","null"],"description":"排序字段"},"order":{"type":["string","null"],"description":"排序方向"},"descStr":{"type":["string","null"],"description":"降序排序"},"dictTypeId":{"type":"integer","description":"字典类型Id","format":"int64"},"value":{"type":["string","null"],"description":"值"},"code":{"type":["string","null"],"description":"编码"}},"additionalProperties":false,"x-apifox-orders":["page","pageSize","field","order","descStr","dictTypeId","value","code"]}}},{"name":"PageDictTypeInput","displayName":"","id":"#/definitions/84275331","description":"","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"当前页码","format":"int32"},"pageSize":{"type":"integer","description":"页码容量","format":"int32"},"field":{"type":["string","null"],"description":"排序字段"},"order":{"type":["string","null"],"description":"排序方向"},"descStr":{"type":["string","null"],"description":"降序排序"},"name":{"type":["string","null"],"description":"名称"},"code":{"type":["string","null"],"description":"编码"}},"additionalProperties":false,"x-apifox-orders":["page","pageSize","field","order","descStr","name","code"]}}},{"name":"PageFileInput","displayName":"","id":"#/definitions/84275332","description":"","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"当前页码","format":"int32"},"pageSize":{"type":"integer","description":"页码容量","format":"int32"},"field":{"type":["string","null"],"description":"排序字段"},"order":{"type":["string","null"],"description":"排序方向"},"descStr":{"type":["string","null"],"description":"降序排序"},"fileName":{"type":["string","null"],"description":"文件名称"},"startTime":{"type":["string","null"],"description":"开始时间","format":"date-time"},"endTime":{"type":["string","null"],"description":"结束时间","format":"date-time"}},"additionalProperties":false,"x-apifox-orders":["page","pageSize","field","order","descStr","fileName","startTime","endTime"]}}},{"name":"PageJobDetailInput","displayName":"","id":"#/definitions/84275333","description":"","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"当前页码","format":"int32"},"pageSize":{"type":"integer","description":"页码容量","format":"int32"},"field":{"type":["string","null"],"description":"排序字段"},"order":{"type":["string","null"],"description":"排序方向"},"descStr":{"type":["string","null"],"description":"降序排序"},"jobId":{"type":["string","null"],"description":"作业Id"},"description":{"type":["string","null"],"description":"描述信息"}},"additionalProperties":false,"x-apifox-orders":["page","pageSize","field","order","descStr","jobId","description"]}}},{"name":"PageJobTriggerRecordInput","displayName":"","id":"#/definitions/84275334","description":"","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"当前页码","format":"int32"},"pageSize":{"type":"integer","description":"页码容量","format":"int32"},"field":{"type":["string","null"],"description":"排序字段"},"order":{"type":["string","null"],"description":"排序方向"},"descStr":{"type":["string","null"],"description":"降序排序"},"jobId":{"type":["string","null"],"description":"作业Id"},"triggerId":{"type":["string","null"],"description":"触发器Id"}},"additionalProperties":false,"x-apifox-orders":["page","pageSize","field","order","descStr","jobId","triggerId"]}}},{"name":"PageLogInput","displayName":"","id":"#/definitions/84275335","description":"","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"当前页码","format":"int32"},"pageSize":{"type":"integer","description":"页码容量","format":"int32"},"field":{"type":["string","null"],"description":"排序字段"},"order":{"type":["string","null"],"description":"排序方向"},"descStr":{"type":["string","null"],"description":"降序排序"},"startTime":{"type":["string","null"],"description":"开始时间","format":"date-time"},"endTime":{"type":["string","null"],"description":"结束时间","format":"date-time"}},"additionalProperties":false,"x-apifox-orders":["page","pageSize","field","order","descStr","startTime","endTime"]}}},{"name":"PageNoticeInput","displayName":"","id":"#/definitions/84275336","description":"","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"当前页码","format":"int32"},"pageSize":{"type":"integer","description":"页码容量","format":"int32"},"field":{"type":["string","null"],"description":"排序字段"},"order":{"type":["string","null"],"description":"排序方向"},"descStr":{"type":["string","null"],"description":"降序排序"},"title":{"type":["string","null"],"description":"标题"},"type":{"$ref":"#/definitions/84275325"}},"additionalProperties":false,"x-apifox-orders":["page","pageSize","field","order","descStr","title","type"]}}},{"name":"PageOnlineUserInput","displayName":"","id":"#/definitions/84275337","description":"","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"当前页码","format":"int32"},"pageSize":{"type":"integer","description":"页码容量","format":"int32"},"field":{"type":["string","null"],"description":"排序字段"},"order":{"type":["string","null"],"description":"排序方向"},"descStr":{"type":["string","null"],"description":"降序排序"},"userName":{"type":["string","null"],"description":"账号名称"},"realName":{"type":["string","null"],"description":"真实姓名"}},"additionalProperties":false,"x-apifox-orders":["page","pageSize","field","order","descStr","userName","realName"]}}},{"name":"PagePluginInput","displayName":"","id":"#/definitions/84275338","description":"","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"当前页码","format":"int32"},"pageSize":{"type":"integer","description":"页码容量","format":"int32"},"field":{"type":["string","null"],"description":"排序字段"},"order":{"type":["string","null"],"description":"排序方向"},"descStr":{"type":["string","null"],"description":"降序排序"},"name":{"type":["string","null"],"description":"名称"},"code":{"type":["string","null"],"description":"编码"}},"additionalProperties":false,"x-apifox-orders":["page","pageSize","field","order","descStr","name","code"]}}},{"name":"PagePrintInput","displayName":"","id":"#/definitions/84275339","description":"","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"当前页码","format":"int32"},"pageSize":{"type":"integer","description":"页码容量","format":"int32"},"field":{"type":["string","null"],"description":"排序字段"},"order":{"type":["string","null"],"description":"排序方向"},"descStr":{"type":["string","null"],"description":"降序排序"},"name":{"type":["string","null"],"description":"名称"},"code":{"type":["string","null"],"description":"编码"}},"additionalProperties":false,"x-apifox-orders":["page","pageSize","field","order","descStr","name","code"]}}},{"name":"PageRegionInput","displayName":"","id":"#/definitions/84275340","description":"","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"当前页码","format":"int32"},"pageSize":{"type":"integer","description":"页码容量","format":"int32"},"field":{"type":["string","null"],"description":"排序字段"},"order":{"type":["string","null"],"description":"排序方向"},"descStr":{"type":["string","null"],"description":"降序排序"},"pid":{"type":"integer","description":"父节点Id","format":"int64"},"name":{"type":["string","null"],"description":"名称"},"code":{"type":["string","null"],"description":"编码"}},"additionalProperties":false,"x-apifox-orders":["page","pageSize","field","order","descStr","pid","name","code"]}}},{"name":"PageRoleInput","displayName":"","id":"#/definitions/84275341","description":"","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"当前页码","format":"int32"},"pageSize":{"type":"integer","description":"页码容量","format":"int32"},"field":{"type":["string","null"],"description":"排序字段"},"order":{"type":["string","null"],"description":"排序方向"},"descStr":{"type":["string","null"],"description":"降序排序"},"name":{"type":["string","null"],"description":"名称"},"code":{"type":["string","null"],"description":"编码"}},"additionalProperties":false,"x-apifox-orders":["page","pageSize","field","order","descStr","name","code"]}}},{"name":"PageTenantInput","displayName":"","id":"#/definitions/84275342","description":"","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"当前页码","format":"int32"},"pageSize":{"type":"integer","description":"页码容量","format":"int32"},"field":{"type":["string","null"],"description":"排序字段"},"order":{"type":["string","null"],"description":"排序方向"},"descStr":{"type":["string","null"],"description":"降序排序"},"name":{"type":["string","null"],"description":"名称"},"phone":{"type":["string","null"],"description":"电话"}},"additionalProperties":false,"x-apifox-orders":["page","pageSize","field","order","descStr","name","phone"]}}},{"name":"PageUserInput","displayName":"","id":"#/definitions/84275343","description":"获取用户分页列表输入参数","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"当前页码","format":"int32"},"pageSize":{"type":"integer","description":"页码容量","format":"int32"},"field":{"type":["string","null"],"description":"排序字段"},"order":{"type":["string","null"],"description":"排序方向"},"descStr":{"type":["string","null"],"description":"降序排序"},"account":{"type":["string","null"],"description":"账号"},"realName":{"type":["string","null"],"description":"姓名"},"phone":{"type":["string","null"],"description":"手机号"},"orgId":{"type":"integer","description":"查询时所选机构Id","format":"int64"}},"additionalProperties":false,"description":"获取用户分页列表输入参数","x-apifox-orders":["page","pageSize","field","order","descStr","account","realName","phone","orgId"]}}},{"name":"PlatformTypeEnum","displayName":"","id":"#/definitions/84275344","description":"平台类型枚举
 微信公众号 微信公众号 = 1
 微信小程序 微信小程序 = 2
 QQ QQ = 3
 支付宝 Alipay = 4
 Gitee Gitee = 5
","schema":{"jsonSchema":{"enum":[1,2,3,4,5],"type":"integer","description":"平台类型枚举
 微信公众号 微信公众号 = 1
 微信小程序 微信小程序 = 2
 QQ QQ = 3
 支付宝 Alipay = 4
 Gitee Gitee = 5
","format":"int32"}}},{"name":"ResetPwdUserInput","displayName":"","id":"#/definitions/84275345","description":"重置用户密码输入参数","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"}},"additionalProperties":false,"description":"重置用户密码输入参数","x-apifox-orders":["id"]}}},{"name":"RoleInput","displayName":"","id":"#/definitions/84275346","description":"","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"},"status":{"$ref":"#/definitions/84275375"}},"additionalProperties":false,"x-apifox-orders":["id","status"]}}},{"name":"RoleMenuInput","displayName":"","id":"#/definitions/84275347","description":"授权角色菜单","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"},"menuIdList":{"type":["array","null"],"items":{"type":"integer","format":"int64"},"description":"菜单Id集合"}},"additionalProperties":false,"description":"授权角色菜单","x-apifox-orders":["id","menuIdList"]}}},{"name":"RoleOrgInput","displayName":"","id":"#/definitions/84275348","description":"授权角色机构","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"},"dataScope":{"type":"integer","description":"数据范围","format":"int32"},"orgIdList":{"type":["array","null"],"items":{"type":"integer","format":"int64"},"description":"机构Id集合"}},"additionalProperties":false,"description":"授权角色机构","x-apifox-orders":["id","dataScope","orgIdList"]}}},{"name":"RoleOutput","displayName":"","id":"#/definitions/84275349","description":"角色列表输出参数","schema":{"jsonSchema":{"type":"object","properties":{"id":{"type":"integer","description":"Id","format":"int64"},"name":{"type":["string","null"],"description":"名称"},"code":{"type":["string","null"],"description":"编码"}},"additionalProperties":false,"description":"角色列表输出参数","x-apifox-orders":["id","name","code"]}}},{"name":"SendSubscribeMessageInput","displayName":"","id":"#/definitions/84275350","description":"发送订阅消息","schema":{"jsonSchema":{"required":["data","templateId","toUserOpenId"],"type":"object","properties":{"templateId":{"minLength":1,"type":"string","description":"订阅模板Id"},"toUserOpenId":{"minLength":1,"type":"string","description":"接收者的OpenId"},"data":{"type":"object","additionalProperties":{"$ref":"#/definitions/84275268"},"description":"模板内容,格式形如 { \"key1\": { \"value\": any }, \"key2\": { \"value\": any } }","x-apifox-orders":[]},"miniprogramState":{"type":["string","null"],"description":"跳转小程序类型"},"language":{"type":["string","null"],"description":"语言类型"},"miniProgramPagePath":{"type":["string","null"],"description":"点击模板卡片后的跳转页面(仅限本小程序内的页面),支持带参数(示例pages/app/index?foo=bar)"}},"additionalProperties":false,"description":"发送订阅消息","x-apifox-orders":["templateId","toUserOpenId","data","miniprogramState","language","miniProgramPagePath"]}}},{"name":"SignatureInput","displayName":"","id":"#/definitions/84275351","description":"获取配置签名","schema":{"jsonSchema":{"type":"object","properties":{"url":{"type":["string","null"],"description":"Url"}},"additionalProperties":false,"description":"获取配置签名","x-apifox-orders":["url"]}}},{"name":"SmKeyPairOutput","displayName":"","id":"#/definitions/84275352","description":"国密公钥私钥对输出","schema":{"jsonSchema":{"type":"object","properties":{"privateKey":{"type":["string","null"],"description":"私匙"},"publicKey":{"type":["string","null"],"description":"公匙"}},"additionalProperties":false,"description":"国密公钥私钥对输出","x-apifox-orders":["privateKey","publicKey"]}}},{"name":"SqlSugarPagedList_JobDetailOutput","displayName":"","id":"#/definitions/84275353","description":"分页泛型集合","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"页码","format":"int32"},"pageSize":{"type":"integer","description":"页容量","format":"int32"},"total":{"type":"integer","description":"总条数","format":"int32"},"totalPages":{"type":"integer","description":"总页数","format":"int32"},"items":{"type":["array","null"],"items":{"$ref":"#/definitions/84275310"},"description":"当前页集合"},"hasPrevPage":{"type":"boolean","description":"是否有上一页"},"hasNextPage":{"type":"boolean","description":"是否有下一页"}},"additionalProperties":false,"description":"分页泛型集合","x-apifox-orders":["page","pageSize","total","totalPages","items","hasPrevPage","hasNextPage"]}}},{"name":"SqlSugarPagedList_OpenAccessOutput","displayName":"","id":"#/definitions/84275354","description":"分页泛型集合","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"页码","format":"int32"},"pageSize":{"type":"integer","description":"页容量","format":"int32"},"total":{"type":"integer","description":"总条数","format":"int32"},"totalPages":{"type":"integer","description":"总页数","format":"int32"},"items":{"type":["array","null"],"items":{"$ref":"#/definitions/84275328"},"description":"当前页集合"},"hasPrevPage":{"type":"boolean","description":"是否有上一页"},"hasNextPage":{"type":"boolean","description":"是否有下一页"}},"additionalProperties":false,"description":"分页泛型集合","x-apifox-orders":["page","pageSize","total","totalPages","items","hasPrevPage","hasNextPage"]}}},{"name":"SqlSugarPagedList_SysCodeGen","displayName":"","id":"#/definitions/84275355","description":"分页泛型集合","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"页码","format":"int32"},"pageSize":{"type":"integer","description":"页容量","format":"int32"},"total":{"type":"integer","description":"总条数","format":"int32"},"totalPages":{"type":"integer","description":"总页数","format":"int32"},"items":{"type":["array","null"],"items":{"$ref":"#/definitions/84275376"},"description":"当前页集合"},"hasPrevPage":{"type":"boolean","description":"是否有上一页"},"hasNextPage":{"type":"boolean","description":"是否有下一页"}},"additionalProperties":false,"description":"分页泛型集合","x-apifox-orders":["page","pageSize","total","totalPages","items","hasPrevPage","hasNextPage"]}}},{"name":"SqlSugarPagedList_SysConfig","displayName":"","id":"#/definitions/84275356","description":"分页泛型集合","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"页码","format":"int32"},"pageSize":{"type":"integer","description":"页容量","format":"int32"},"total":{"type":"integer","description":"总条数","format":"int32"},"totalPages":{"type":"integer","description":"总页数","format":"int32"},"items":{"type":["array","null"],"items":{"$ref":"#/definitions/84275378"},"description":"当前页集合"},"hasPrevPage":{"type":"boolean","description":"是否有上一页"},"hasNextPage":{"type":"boolean","description":"是否有下一页"}},"additionalProperties":false,"description":"分页泛型集合","x-apifox-orders":["page","pageSize","total","totalPages","items","hasPrevPage","hasNextPage"]}}},{"name":"SqlSugarPagedList_SysDictData","displayName":"","id":"#/definitions/84275357","description":"分页泛型集合","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"页码","format":"int32"},"pageSize":{"type":"integer","description":"页容量","format":"int32"},"total":{"type":"integer","description":"总条数","format":"int32"},"totalPages":{"type":"integer","description":"总页数","format":"int32"},"items":{"type":["array","null"],"items":{"$ref":"#/definitions/84275379"},"description":"当前页集合"},"hasPrevPage":{"type":"boolean","description":"是否有上一页"},"hasNextPage":{"type":"boolean","description":"是否有下一页"}},"additionalProperties":false,"description":"分页泛型集合","x-apifox-orders":["page","pageSize","total","totalPages","items","hasPrevPage","hasNextPage"]}}},{"name":"SqlSugarPagedList_SysDictType","displayName":"","id":"#/definitions/84275358","description":"分页泛型集合","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"页码","format":"int32"},"pageSize":{"type":"integer","description":"页容量","format":"int32"},"total":{"type":"integer","description":"总条数","format":"int32"},"totalPages":{"type":"integer","description":"总页数","format":"int32"},"items":{"type":["array","null"],"items":{"$ref":"#/definitions/84275380"},"description":"当前页集合"},"hasPrevPage":{"type":"boolean","description":"是否有上一页"},"hasNextPage":{"type":"boolean","description":"是否有下一页"}},"additionalProperties":false,"description":"分页泛型集合","x-apifox-orders":["page","pageSize","total","totalPages","items","hasPrevPage","hasNextPage"]}}},{"name":"SqlSugarPagedList_SysFile","displayName":"","id":"#/definitions/84275359","description":"分页泛型集合","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"页码","format":"int32"},"pageSize":{"type":"integer","description":"页容量","format":"int32"},"total":{"type":"integer","description":"总条数","format":"int32"},"totalPages":{"type":"integer","description":"总页数","format":"int32"},"items":{"type":["array","null"],"items":{"$ref":"#/definitions/84275381"},"description":"当前页集合"},"hasPrevPage":{"type":"boolean","description":"是否有上一页"},"hasNextPage":{"type":"boolean","description":"是否有下一页"}},"additionalProperties":false,"description":"分页泛型集合","x-apifox-orders":["page","pageSize","total","totalPages","items","hasPrevPage","hasNextPage"]}}},{"name":"SqlSugarPagedList_SysJobTriggerRecord","displayName":"","id":"#/definitions/84275360","description":"分页泛型集合","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"页码","format":"int32"},"pageSize":{"type":"integer","description":"页容量","format":"int32"},"total":{"type":"integer","description":"总条数","format":"int32"},"totalPages":{"type":"integer","description":"总页数","format":"int32"},"items":{"type":["array","null"],"items":{"$ref":"#/definitions/84275385"},"description":"当前页集合"},"hasPrevPage":{"type":"boolean","description":"是否有上一页"},"hasNextPage":{"type":"boolean","description":"是否有下一页"}},"additionalProperties":false,"description":"分页泛型集合","x-apifox-orders":["page","pageSize","total","totalPages","items","hasPrevPage","hasNextPage"]}}},{"name":"SqlSugarPagedList_SysLogDiff","displayName":"","id":"#/definitions/84275361","description":"分页泛型集合","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"页码","format":"int32"},"pageSize":{"type":"integer","description":"页容量","format":"int32"},"total":{"type":"integer","description":"总条数","format":"int32"},"totalPages":{"type":"integer","description":"总页数","format":"int32"},"items":{"type":["array","null"],"items":{"$ref":"#/definitions/84275386"},"description":"当前页集合"},"hasPrevPage":{"type":"boolean","description":"是否有上一页"},"hasNextPage":{"type":"boolean","description":"是否有下一页"}},"additionalProperties":false,"description":"分页泛型集合","x-apifox-orders":["page","pageSize","total","totalPages","items","hasPrevPage","hasNextPage"]}}},{"name":"SqlSugarPagedList_SysLogEx","displayName":"","id":"#/definitions/84275362","description":"分页泛型集合","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"页码","format":"int32"},"pageSize":{"type":"integer","description":"页容量","format":"int32"},"total":{"type":"integer","description":"总条数","format":"int32"},"totalPages":{"type":"integer","description":"总页数","format":"int32"},"items":{"type":["array","null"],"items":{"$ref":"#/definitions/84275387"},"description":"当前页集合"},"hasPrevPage":{"type":"boolean","description":"是否有上一页"},"hasNextPage":{"type":"boolean","description":"是否有下一页"}},"additionalProperties":false,"description":"分页泛型集合","x-apifox-orders":["page","pageSize","total","totalPages","items","hasPrevPage","hasNextPage"]}}},{"name":"SqlSugarPagedList_SysLogOp","displayName":"","id":"#/definitions/84275363","description":"分页泛型集合","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"页码","format":"int32"},"pageSize":{"type":"integer","description":"页容量","format":"int32"},"total":{"type":"integer","description":"总条数","format":"int32"},"totalPages":{"type":"integer","description":"总页数","format":"int32"},"items":{"type":["array","null"],"items":{"$ref":"#/definitions/84275388"},"description":"当前页集合"},"hasPrevPage":{"type":"boolean","description":"是否有上一页"},"hasNextPage":{"type":"boolean","description":"是否有下一页"}},"additionalProperties":false,"description":"分页泛型集合","x-apifox-orders":["page","pageSize","total","totalPages","items","hasPrevPage","hasNextPage"]}}},{"name":"SqlSugarPagedList_SysLogVis","displayName":"","id":"#/definitions/84275364","description":"分页泛型集合","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"页码","format":"int32"},"pageSize":{"type":"integer","description":"页容量","format":"int32"},"total":{"type":"integer","description":"总条数","format":"int32"},"totalPages":{"type":"integer","description":"总页数","format":"int32"},"items":{"type":["array","null"],"items":{"$ref":"#/definitions/84275389"},"description":"当前页集合"},"hasPrevPage":{"type":"boolean","description":"是否有上一页"},"hasNextPage":{"type":"boolean","description":"是否有下一页"}},"additionalProperties":false,"description":"分页泛型集合","x-apifox-orders":["page","pageSize","total","totalPages","items","hasPrevPage","hasNextPage"]}}},{"name":"SqlSugarPagedList_SysNotice","displayName":"","id":"#/definitions/84275365","description":"分页泛型集合","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"页码","format":"int32"},"pageSize":{"type":"integer","description":"页容量","format":"int32"},"total":{"type":"integer","description":"总条数","format":"int32"},"totalPages":{"type":"integer","description":"总页数","format":"int32"},"items":{"type":["array","null"],"items":{"$ref":"#/definitions/84275392"},"description":"当前页集合"},"hasPrevPage":{"type":"boolean","description":"是否有上一页"},"hasNextPage":{"type":"boolean","description":"是否有下一页"}},"additionalProperties":false,"description":"分页泛型集合","x-apifox-orders":["page","pageSize","total","totalPages","items","hasPrevPage","hasNextPage"]}}},{"name":"SqlSugarPagedList_SysNoticeUser","displayName":"","id":"#/definitions/84275366","description":"分页泛型集合","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"页码","format":"int32"},"pageSize":{"type":"integer","description":"页容量","format":"int32"},"total":{"type":"integer","description":"总条数","format":"int32"},"totalPages":{"type":"integer","description":"总页数","format":"int32"},"items":{"type":["array","null"],"items":{"$ref":"#/definitions/84275393"},"description":"当前页集合"},"hasPrevPage":{"type":"boolean","description":"是否有上一页"},"hasNextPage":{"type":"boolean","description":"是否有下一页"}},"additionalProperties":false,"description":"分页泛型集合","x-apifox-orders":["page","pageSize","total","totalPages","items","hasPrevPage","hasNextPage"]}}},{"name":"SqlSugarPagedList_SysOnlineUser","displayName":"","id":"#/definitions/84275367","description":"分页泛型集合","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"页码","format":"int32"},"pageSize":{"type":"integer","description":"页容量","format":"int32"},"total":{"type":"integer","description":"总条数","format":"int32"},"totalPages":{"type":"integer","description":"总页数","format":"int32"},"items":{"type":["array","null"],"items":{"$ref":"#/definitions/84275394"},"description":"当前页集合"},"hasPrevPage":{"type":"boolean","description":"是否有上一页"},"hasNextPage":{"type":"boolean","description":"是否有下一页"}},"additionalProperties":false,"description":"分页泛型集合","x-apifox-orders":["page","pageSize","total","totalPages","items","hasPrevPage","hasNextPage"]}}},{"name":"SqlSugarPagedList_SysPlugin","displayName":"","id":"#/definitions/84275368","description":"分页泛型集合","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"页码","format":"int32"},"pageSize":{"type":"integer","description":"页容量","format":"int32"},"total":{"type":"integer","description":"总条数","format":"int32"},"totalPages":{"type":"integer","description":"总页数","format":"int32"},"items":{"type":["array","null"],"items":{"$ref":"#/definitions/84275396"},"description":"当前页集合"},"hasPrevPage":{"type":"boolean","description":"是否有上一页"},"hasNextPage":{"type":"boolean","description":"是否有下一页"}},"additionalProperties":false,"description":"分页泛型集合","x-apifox-orders":["page","pageSize","total","totalPages","items","hasPrevPage","hasNextPage"]}}},{"name":"SqlSugarPagedList_SysPrint","displayName":"","id":"#/definitions/84275369","description":"分页泛型集合","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"页码","format":"int32"},"pageSize":{"type":"integer","description":"页容量","format":"int32"},"total":{"type":"integer","description":"总条数","format":"int32"},"totalPages":{"type":"integer","description":"总页数","format":"int32"},"items":{"type":["array","null"],"items":{"$ref":"#/definitions/84275398"},"description":"当前页集合"},"hasPrevPage":{"type":"boolean","description":"是否有上一页"},"hasNextPage":{"type":"boolean","description":"是否有下一页"}},"additionalProperties":false,"description":"分页泛型集合","x-apifox-orders":["page","pageSize","total","totalPages","items","hasPrevPage","hasNextPage"]}}},{"name":"SqlSugarPagedList_SysRegion","displayName":"","id":"#/definitions/84275370","description":"分页泛型集合","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"页码","format":"int32"},"pageSize":{"type":"integer","description":"页容量","format":"int32"},"total":{"type":"integer","description":"总条数","format":"int32"},"totalPages":{"type":"integer","description":"总页数","format":"int32"},"items":{"type":["array","null"],"items":{"$ref":"#/definitions/84275399"},"description":"当前页集合"},"hasPrevPage":{"type":"boolean","description":"是否有上一页"},"hasNextPage":{"type":"boolean","description":"是否有下一页"}},"additionalProperties":false,"description":"分页泛型集合","x-apifox-orders":["page","pageSize","total","totalPages","items","hasPrevPage","hasNextPage"]}}},{"name":"SqlSugarPagedList_SysRole","displayName":"","id":"#/definitions/84275371","description":"分页泛型集合","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"页码","format":"int32"},"pageSize":{"type":"integer","description":"页容量","format":"int32"},"total":{"type":"integer","description":"总条数","format":"int32"},"totalPages":{"type":"integer","description":"总页数","format":"int32"},"items":{"type":["array","null"],"items":{"$ref":"#/definitions/84275400"},"description":"当前页集合"},"hasPrevPage":{"type":"boolean","description":"是否有上一页"},"hasNextPage":{"type":"boolean","description":"是否有下一页"}},"additionalProperties":false,"description":"分页泛型集合","x-apifox-orders":["page","pageSize","total","totalPages","items","hasPrevPage","hasNextPage"]}}},{"name":"SqlSugarPagedList_SysWechatUser","displayName":"","id":"#/definitions/84275372","description":"分页泛型集合","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"页码","format":"int32"},"pageSize":{"type":"integer","description":"页容量","format":"int32"},"total":{"type":"integer","description":"总条数","format":"int32"},"totalPages":{"type":"integer","description":"总页数","format":"int32"},"items":{"type":["array","null"],"items":{"$ref":"#/definitions/84275404"},"description":"当前页集合"},"hasPrevPage":{"type":"boolean","description":"是否有上一页"},"hasNextPage":{"type":"boolean","description":"是否有下一页"}},"additionalProperties":false,"description":"分页泛型集合","x-apifox-orders":["page","pageSize","total","totalPages","items","hasPrevPage","hasNextPage"]}}},{"name":"SqlSugarPagedList_TenantOutput","displayName":"","id":"#/definitions/84275373","description":"分页泛型集合","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"页码","format":"int32"},"pageSize":{"type":"integer","description":"页容量","format":"int32"},"total":{"type":"integer","description":"总条数","format":"int32"},"totalPages":{"type":"integer","description":"总页数","format":"int32"},"items":{"type":["array","null"],"items":{"$ref":"#/definitions/84275408"},"description":"当前页集合"},"hasPrevPage":{"type":"boolean","description":"是否有上一页"},"hasNextPage":{"type":"boolean","description":"是否有下一页"}},"additionalProperties":false,"description":"分页泛型集合","x-apifox-orders":["page","pageSize","total","totalPages","items","hasPrevPage","hasNextPage"]}}},{"name":"SqlSugarPagedList_UserOutput","displayName":"","id":"#/definitions/84275374","description":"分页泛型集合","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"页码","format":"int32"},"pageSize":{"type":"integer","description":"页容量","format":"int32"},"total":{"type":"integer","description":"总条数","format":"int32"},"totalPages":{"type":"integer","description":"总页数","format":"int32"},"items":{"type":["array","null"],"items":{"$ref":"#/definitions/84275434"},"description":"当前页集合"},"hasPrevPage":{"type":"boolean","description":"是否有上一页"},"hasNextPage":{"type":"boolean","description":"是否有下一页"}},"additionalProperties":false,"description":"分页泛型集合","x-apifox-orders":["page","pageSize","total","totalPages","items","hasPrevPage","hasNextPage"]}}},{"name":"StatusEnum","displayName":"","id":"#/definitions/84275375","description":"通用状态枚举
 启用 Enable = 1
 停用 Disable = 2
","schema":{"jsonSchema":{"enum":[1,2],"type":"integer","description":"通用状态枚举
 启用 Enable = 1
 停用 Disable = 2
","format":"int32"}}},{"name":"SysCodeGen","displayName":"","id":"#/definitions/84275376","description":"代码生成表","schema":{"jsonSchema":{"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"authorName":{"maxLength":32,"type":["string","null"],"description":"作者姓名"},"tablePrefix":{"maxLength":8,"type":["string","null"],"description":"是否移除表前缀"},"generateType":{"maxLength":32,"type":["string","null"],"description":"生成方式"},"configId":{"maxLength":64,"type":["string","null"],"description":"库定位器名"},"dbName":{"maxLength":64,"type":["string","null"],"description":"数据库名(保留字段)"},"dbType":{"maxLength":64,"type":["string","null"],"description":"数据库类型"},"connectionString":{"maxLength":256,"type":["string","null"],"description":"数据库链接"},"tableName":{"maxLength":128,"type":["string","null"],"description":"数据库表名"},"nameSpace":{"maxLength":128,"type":["string","null"],"description":"命名空间"},"busName":{"maxLength":128,"type":["string","null"],"description":"业务名"},"menuPid":{"type":"integer","description":"菜单编码","format":"int64"},"printType":{"maxLength":32,"type":["string","null"],"description":"支持打印类型"},"printName":{"maxLength":32,"type":["string","null"],"description":"打印模版名称"}},"additionalProperties":false,"description":"代码生成表","x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","authorName","tablePrefix","generateType","configId","dbName","dbType","connectionString","tableName","nameSpace","busName","menuPid","printType","printName"]}}},{"name":"SysCodeGenConfig","displayName":"","id":"#/definitions/84275377","description":"代码生成字段配置表","schema":{"jsonSchema":{"required":["columnName","propertyName"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"codeGenId":{"type":"integer","description":"代码生成主表Id","format":"int64"},"columnName":{"maxLength":128,"minLength":1,"type":"string","description":"数据库字段名"},"propertyName":{"maxLength":128,"minLength":1,"type":"string","description":"实体属性名"},"columnLength":{"type":"integer","description":"字段数据长度","format":"int32"},"columnComment":{"maxLength":128,"type":["string","null"],"description":"字段描述"},"netType":{"maxLength":64,"type":["string","null"],"description":".NET数据类型"},"effectType":{"maxLength":64,"type":["string","null"],"description":"作用类型(字典)"},"fkEntityName":{"maxLength":64,"type":["string","null"],"description":"外键实体名称"},"fkTableName":{"maxLength":128,"type":["string","null"],"description":"外键表名称"},"fkColumnName":{"maxLength":64,"type":["string","null"],"description":"外键显示字段"},"fkColumnNetType":{"maxLength":64,"type":["string","null"],"description":"外键显示字段.NET类型"},"dictTypeCode":{"maxLength":64,"type":["string","null"],"description":"字典编码"},"whetherRetract":{"maxLength":8,"type":["string","null"],"description":"列表是否缩进(字典)"},"whetherRequired":{"maxLength":8,"type":["string","null"],"description":"是否必填(字典)"},"whetherSortable":{"maxLength":8,"type":["string","null"],"description":"是否可排序(字典)"},"queryWhether":{"maxLength":8,"type":["string","null"],"description":"是否是查询条件"},"queryType":{"maxLength":16,"type":["string","null"],"description":"查询方式"},"whetherTable":{"maxLength":8,"type":["string","null"],"description":"列表显示"},"whetherAddUpdate":{"maxLength":8,"type":["string","null"],"description":"增改"},"columnKey":{"maxLength":8,"type":["string","null"],"description":"主键"},"dataType":{"maxLength":64,"type":["string","null"],"description":"数据库中类型(物理类型)"},"whetherCommon":{"maxLength":8,"type":["string","null"],"description":"是否通用字段"},"displayColumn":{"type":["string","null"],"description":"显示文本字段"},"valueColumn":{"maxLength":128,"type":["string","null"],"description":"选中值字段"},"pidColumn":{"maxLength":128,"type":["string","null"],"description":"父级字段"},"orderNo":{"type":"integer","description":"排序","format":"int32"}},"additionalProperties":false,"description":"代码生成字段配置表","x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","codeGenId","columnName","propertyName","columnLength","columnComment","netType","effectType","fkEntityName","fkTableName","fkColumnName","fkColumnNetType","dictTypeCode","whetherRetract","whetherRequired","whetherSortable","queryWhether","queryType","whetherTable","whetherAddUpdate","columnKey","dataType","whetherCommon","displayColumn","valueColumn","pidColumn","orderNo"]}}},{"name":"SysConfig","displayName":"","id":"#/definitions/84275378","description":"系统参数配置表","schema":{"jsonSchema":{"required":["name"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"name":{"maxLength":64,"minLength":1,"type":"string","description":"名称"},"code":{"maxLength":64,"type":["string","null"],"description":"编码"},"value":{"maxLength":64,"type":["string","null"],"description":"属性值"},"sysFlag":{"$ref":"#/definitions/84275444"},"groupCode":{"maxLength":64,"type":["string","null"],"description":"分组编码"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"remark":{"maxLength":256,"type":["string","null"],"description":"备注"}},"additionalProperties":false,"description":"系统参数配置表","x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","name","code","value","sysFlag","groupCode","orderNo","remark"]}}},{"name":"SysDictData","displayName":"","id":"#/definitions/84275379","description":"系统字典值表","schema":{"jsonSchema":{"required":["code","value"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"dictTypeId":{"type":"integer","description":"字典类型Id","format":"int64"},"value":{"maxLength":128,"minLength":1,"type":"string","description":"值"},"code":{"maxLength":64,"minLength":1,"type":"string","description":"编码"},"tagType":{"maxLength":16,"type":["string","null"],"description":"显示样式-标签颜色"},"styleSetting":{"maxLength":512,"type":["string","null"],"description":"显示样式-Style(控制显示样式)"},"classSetting":{"maxLength":512,"type":["string","null"],"description":"显示样式-Class(控制显示样式)"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"remark":{"maxLength":2048,"type":["string","null"],"description":"备注"},"extData":{"type":["string","null"],"description":"拓展数据(保存业务功能的配置项)"},"status":{"$ref":"#/definitions/84275375"}},"additionalProperties":false,"description":"系统字典值表","x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","dictTypeId","value","code","tagType","styleSetting","classSetting","orderNo","remark","extData","status"]}}},{"name":"SysDictType","displayName":"","id":"#/definitions/84275380","description":"系统字典类型表","schema":{"jsonSchema":{"required":["code","name"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"name":{"maxLength":64,"minLength":1,"type":"string","description":"名称"},"code":{"maxLength":64,"minLength":1,"type":"string","description":"编码"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"remark":{"maxLength":256,"type":["string","null"],"description":"备注"},"status":{"$ref":"#/definitions/84275375"},"children":{"type":["array","null"],"items":{"$ref":"#/definitions/84275379"},"description":"字典值集合"}},"additionalProperties":false,"description":"系统字典类型表","x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","name","code","orderNo","remark","status","children"]}}},{"name":"SysFile","displayName":"","id":"#/definitions/84275381","description":"系统文件表","schema":{"jsonSchema":{"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"provider":{"maxLength":128,"type":["string","null"],"description":"提供者"},"bucketName":{"maxLength":128,"type":["string","null"],"description":"仓储名称"},"fileName":{"maxLength":128,"type":["string","null"],"description":"文件名称(源文件名)"},"suffix":{"maxLength":16,"type":["string","null"],"description":"文件后缀"},"filePath":{"maxLength":128,"type":["string","null"],"description":"存储路径"},"sizeKb":{"maxLength":16,"type":["string","null"],"description":"文件大小KB"},"sizeInfo":{"maxLength":64,"type":["string","null"],"description":"文件大小信息-计算后的"},"url":{"maxLength":512,"type":["string","null"],"description":"外链地址-OSS上传后生成外链地址方便前端预览"},"fileMd5":{"maxLength":128,"type":["string","null"],"description":"文件MD5"}},"additionalProperties":false,"description":"系统文件表","x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","provider","bucketName","fileName","suffix","filePath","sizeKb","sizeInfo","url","fileMd5"]}}},{"name":"SysJobCluster","displayName":"","id":"#/definitions/84275382","description":"系统作业集群表","schema":{"jsonSchema":{"required":["clusterId"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"clusterId":{"maxLength":64,"minLength":1,"type":"string","description":"作业集群Id"},"description":{"maxLength":128,"type":["string","null"],"description":"描述信息"},"status":{"$ref":"#/definitions/84275260"},"updatedTime":{"type":["string","null"],"description":"更新时间","format":"date-time"}},"additionalProperties":false,"description":"系统作业集群表","x-apifox-orders":["id","clusterId","description","status","updatedTime"]}}},{"name":"SysJobDetail","displayName":"","id":"#/definitions/84275383","description":"系统作业信息表","schema":{"jsonSchema":{"required":["jobId"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"jobId":{"maxLength":64,"minLength":1,"type":"string","description":"作业Id"},"groupName":{"maxLength":128,"type":["string","null"],"description":"组名称"},"jobType":{"maxLength":128,"type":["string","null"],"description":"作业类型FullName"},"assemblyName":{"maxLength":128,"type":["string","null"],"description":"程序集Name"},"description":{"maxLength":128,"type":["string","null"],"description":"描述信息"},"concurrent":{"type":"boolean","description":"是否并行执行"},"includeAnnotations":{"type":"boolean","description":"是否扫描特性触发器"},"properties":{"type":["string","null"],"description":"额外数据"},"updatedTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createType":{"$ref":"#/definitions/84275308"},"scriptCode":{"type":["string","null"],"description":"脚本代码"}},"additionalProperties":false,"description":"系统作业信息表","x-apifox-orders":["id","jobId","groupName","jobType","assemblyName","description","concurrent","includeAnnotations","properties","updatedTime","createType","scriptCode"]}}},{"name":"SysJobTrigger","displayName":"","id":"#/definitions/84275384","description":"系统作业触发器表","schema":{"jsonSchema":{"required":["jobId","triggerId"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"triggerId":{"maxLength":64,"minLength":1,"type":"string","description":"触发器Id"},"jobId":{"maxLength":64,"minLength":1,"type":"string","description":"作业Id"},"triggerType":{"maxLength":128,"type":["string","null"],"description":"触发器类型FullName"},"assemblyName":{"maxLength":128,"type":["string","null"],"description":"程序集Name"},"args":{"maxLength":128,"type":["string","null"],"description":"参数"},"description":{"maxLength":128,"type":["string","null"],"description":"描述信息"},"status":{"$ref":"#/definitions/84275411"},"startTime":{"type":["string","null"],"description":"起始时间","format":"date-time"},"endTime":{"type":["string","null"],"description":"结束时间","format":"date-time"},"lastRunTime":{"type":["string","null"],"description":"最近运行时间","format":"date-time"},"nextRunTime":{"type":["string","null"],"description":"下一次运行时间","format":"date-time"},"numberOfRuns":{"type":"integer","description":"触发次数","format":"int64"},"maxNumberOfRuns":{"type":"integer","description":"最大触发次数(0:不限制,n:N次)","format":"int64"},"numberOfErrors":{"type":"integer","description":"出错次数","format":"int64"},"maxNumberOfErrors":{"type":"integer","description":"最大出错次数(0:不限制,n:N次)","format":"int64"},"numRetries":{"type":"integer","description":"重试次数","format":"int32"},"retryTimeout":{"type":"integer","description":"重试间隔时间(ms)","format":"int32"},"startNow":{"type":"boolean","description":"是否立即启动"},"runOnStart":{"type":"boolean","description":"是否启动时执行一次"},"resetOnlyOnce":{"type":"boolean","description":"是否在启动时重置最大触发次数等于一次的作业"},"updatedTime":{"type":["string","null"],"description":"更新时间","format":"date-time"}},"additionalProperties":false,"description":"系统作业触发器表","x-apifox-orders":["id","triggerId","jobId","triggerType","assemblyName","args","description","status","startTime","endTime","lastRunTime","nextRunTime","numberOfRuns","maxNumberOfRuns","numberOfErrors","maxNumberOfErrors","numRetries","retryTimeout","startNow","runOnStart","resetOnlyOnce","updatedTime"]}}},{"name":"SysJobTriggerRecord","displayName":"","id":"#/definitions/84275385","description":"系统作业触发器运行记录表","schema":{"jsonSchema":{"required":["jobId","triggerId"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"jobId":{"maxLength":64,"minLength":1,"type":"string","description":"作业Id"},"triggerId":{"maxLength":64,"minLength":1,"type":"string","description":"触发器Id"},"numberOfRuns":{"type":"integer","description":"当前运行次数","format":"int64"},"lastRunTime":{"type":["string","null"],"description":"最近运行时间","format":"date-time"},"nextRunTime":{"type":["string","null"],"description":"下一次运行时间","format":"date-time"},"status":{"$ref":"#/definitions/84275411"},"result":{"maxLength":128,"type":["string","null"],"description":"本次执行结果"},"elapsedTime":{"type":"integer","description":"本次执行耗时","format":"int64"},"createdTime":{"type":["string","null"],"description":"创建时间","format":"date-time"}},"additionalProperties":false,"description":"系统作业触发器运行记录表","x-apifox-orders":["id","jobId","triggerId","numberOfRuns","lastRunTime","nextRunTime","status","result","elapsedTime","createdTime"]}}},{"name":"SysLogDiff","displayName":"","id":"#/definitions/84275386","description":"系统差异日志表","schema":{"jsonSchema":{"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"beforeData":{"type":["string","null"],"description":"操作前记录"},"afterData":{"type":["string","null"],"description":"操作后记录"},"sql":{"type":["string","null"],"description":"Sql"},"parameters":{"type":["string","null"],"description":"参数 手动传入的参数"},"businessData":{"type":["string","null"],"description":"业务对象"},"diffType":{"type":["string","null"],"description":"差异操作"},"elapsed":{"type":["integer","null"],"description":"耗时","format":"int64"}},"additionalProperties":false,"description":"系统差异日志表","x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","beforeData","afterData","sql","parameters","businessData","diffType","elapsed"]}}},{"name":"SysLogEx","displayName":"","id":"#/definitions/84275387","description":"系统异常日志表","schema":{"jsonSchema":{"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"tenantId":{"type":["integer","null"],"description":"租户Id","format":"int64"},"controllerName":{"maxLength":256,"type":["string","null"],"description":"模块名称"},"actionName":{"maxLength":256,"type":["string","null"],"description":"方法名称"},"displayTitle":{"maxLength":256,"type":["string","null"],"description":"显示名称"},"status":{"maxLength":32,"type":["string","null"],"description":"执行状态"},"remoteIp":{"maxLength":256,"type":["string","null"],"description":"IP地址"},"location":{"maxLength":128,"type":["string","null"],"description":"登录地点"},"longitude":{"type":["number","null"],"description":"经度","format":"double"},"latitude":{"type":["number","null"],"description":"维度","format":"double"},"browser":{"maxLength":1024,"type":["string","null"],"description":"浏览器"},"os":{"maxLength":256,"type":["string","null"],"description":"操作系统"},"elapsed":{"type":["integer","null"],"description":"操作用时","format":"int64"},"logDateTime":{"type":["string","null"],"description":"日志时间","format":"date-time"},"logLevel":{"$ref":"#/definitions/84275313"},"account":{"maxLength":32,"type":["string","null"],"description":"账号"},"realName":{"maxLength":32,"type":["string","null"],"description":"真实姓名"},"httpMethod":{"maxLength":32,"type":["string","null"],"description":"请求方式"},"requestUrl":{"type":["string","null"],"description":"请求地址"},"requestParam":{"type":["string","null"],"description":"请求参数"},"returnResult":{"type":["string","null"],"description":"返回结果"},"eventId":{"type":["integer","null"],"description":"事件Id","format":"int32"},"threadId":{"type":["integer","null"],"description":"线程Id","format":"int32"},"traceId":{"maxLength":128,"type":["string","null"],"description":"请求跟踪Id"},"exception":{"type":["string","null"],"description":"异常信息"},"message":{"type":["string","null"],"description":"日志消息Json"}},"additionalProperties":false,"description":"系统异常日志表","x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","tenantId","controllerName","actionName","displayTitle","status","remoteIp","location","longitude","latitude","browser","os","elapsed","logDateTime","logLevel","account","realName","httpMethod","requestUrl","requestParam","returnResult","eventId","threadId","traceId","exception","message"]}}},{"name":"SysLogOp","displayName":"","id":"#/definitions/84275388","description":"系统操作日志表","schema":{"jsonSchema":{"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"tenantId":{"type":["integer","null"],"description":"租户Id","format":"int64"},"controllerName":{"maxLength":256,"type":["string","null"],"description":"模块名称"},"actionName":{"maxLength":256,"type":["string","null"],"description":"方法名称"},"displayTitle":{"maxLength":256,"type":["string","null"],"description":"显示名称"},"status":{"maxLength":32,"type":["string","null"],"description":"执行状态"},"remoteIp":{"maxLength":256,"type":["string","null"],"description":"IP地址"},"location":{"maxLength":128,"type":["string","null"],"description":"登录地点"},"longitude":{"type":["number","null"],"description":"经度","format":"double"},"latitude":{"type":["number","null"],"description":"维度","format":"double"},"browser":{"maxLength":1024,"type":["string","null"],"description":"浏览器"},"os":{"maxLength":256,"type":["string","null"],"description":"操作系统"},"elapsed":{"type":["integer","null"],"description":"操作用时","format":"int64"},"logDateTime":{"type":["string","null"],"description":"日志时间","format":"date-time"},"logLevel":{"$ref":"#/definitions/84275313"},"account":{"maxLength":32,"type":["string","null"],"description":"账号"},"realName":{"maxLength":32,"type":["string","null"],"description":"真实姓名"},"httpMethod":{"maxLength":32,"type":["string","null"],"description":"请求方式"},"requestUrl":{"type":["string","null"],"description":"请求地址"},"requestParam":{"type":["string","null"],"description":"请求参数"},"returnResult":{"type":["string","null"],"description":"返回结果"},"eventId":{"type":["integer","null"],"description":"事件Id","format":"int32"},"threadId":{"type":["integer","null"],"description":"线程Id","format":"int32"},"traceId":{"maxLength":128,"type":["string","null"],"description":"请求跟踪Id"},"exception":{"type":["string","null"],"description":"异常信息"},"message":{"type":["string","null"],"description":"日志消息Json"}},"additionalProperties":false,"description":"系统操作日志表","x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","tenantId","controllerName","actionName","displayTitle","status","remoteIp","location","longitude","latitude","browser","os","elapsed","logDateTime","logLevel","account","realName","httpMethod","requestUrl","requestParam","returnResult","eventId","threadId","traceId","exception","message"]}}},{"name":"SysLogVis","displayName":"","id":"#/definitions/84275389","description":"系统访问日志表","schema":{"jsonSchema":{"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"tenantId":{"type":["integer","null"],"description":"租户Id","format":"int64"},"controllerName":{"maxLength":256,"type":["string","null"],"description":"模块名称"},"actionName":{"maxLength":256,"type":["string","null"],"description":"方法名称"},"displayTitle":{"maxLength":256,"type":["string","null"],"description":"显示名称"},"status":{"maxLength":32,"type":["string","null"],"description":"执行状态"},"remoteIp":{"maxLength":256,"type":["string","null"],"description":"IP地址"},"location":{"maxLength":128,"type":["string","null"],"description":"登录地点"},"longitude":{"type":["number","null"],"description":"经度","format":"double"},"latitude":{"type":["number","null"],"description":"维度","format":"double"},"browser":{"maxLength":1024,"type":["string","null"],"description":"浏览器"},"os":{"maxLength":256,"type":["string","null"],"description":"操作系统"},"elapsed":{"type":["integer","null"],"description":"操作用时","format":"int64"},"logDateTime":{"type":["string","null"],"description":"日志时间","format":"date-time"},"logLevel":{"$ref":"#/definitions/84275313"},"account":{"maxLength":32,"type":["string","null"],"description":"账号"},"realName":{"maxLength":32,"type":["string","null"],"description":"真实姓名"}},"additionalProperties":false,"description":"系统访问日志表","x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","tenantId","controllerName","actionName","displayTitle","status","remoteIp","location","longitude","latitude","browser","os","elapsed","logDateTime","logLevel","account","realName"]}}},{"name":"SysMenu","displayName":"","id":"#/definitions/84275390","description":"系统菜单表","schema":{"jsonSchema":{"required":["title"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"pid":{"type":"integer","description":"父Id","format":"int64"},"type":{"$ref":"#/definitions/84275319"},"name":{"maxLength":64,"type":["string","null"],"description":"路由名称"},"path":{"maxLength":128,"type":["string","null"],"description":"路由地址"},"component":{"maxLength":128,"type":["string","null"],"description":"组件路径"},"redirect":{"maxLength":128,"type":["string","null"],"description":"重定向"},"permission":{"maxLength":128,"type":["string","null"],"description":"权限标识"},"title":{"maxLength":64,"minLength":1,"type":"string","description":"菜单名称"},"icon":{"maxLength":128,"type":["string","null"],"description":"图标"},"isIframe":{"type":"boolean","description":"是否内嵌"},"outLink":{"maxLength":256,"type":["string","null"],"description":"外链链接"},"isHide":{"type":"boolean","description":"是否隐藏"},"isKeepAlive":{"type":"boolean","description":"是否缓存"},"isAffix":{"type":"boolean","description":"是否固定"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"status":{"$ref":"#/definitions/84275375"},"remark":{"maxLength":256,"type":["string","null"],"description":"备注"},"children":{"type":["array","null"],"items":{"$ref":"#/definitions/84275390"},"description":"菜单子项"}},"additionalProperties":false,"description":"系统菜单表","x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","pid","type","name","path","component","redirect","permission","title","icon","isIframe","outLink","isHide","isKeepAlive","isAffix","orderNo","status","remark","children"]}}},{"name":"SysMenuMeta","displayName":"","id":"#/definitions/84275391","description":"菜单Meta配置","schema":{"jsonSchema":{"type":"object","properties":{"title":{"type":["string","null"],"description":"标题"},"icon":{"type":["string","null"],"description":"图标"},"isIframe":{"type":"boolean","description":"是否内嵌"},"isLink":{"type":["string","null"],"description":"外链链接"},"isHide":{"type":"boolean","description":"是否隐藏"},"isKeepAlive":{"type":"boolean","description":"是否缓存"},"isAffix":{"type":"boolean","description":"是否固定"}},"additionalProperties":false,"description":"菜单Meta配置","x-apifox-orders":["title","icon","isIframe","isLink","isHide","isKeepAlive","isAffix"]}}},{"name":"SysNotice","displayName":"","id":"#/definitions/84275392","description":"系统通知公告表","schema":{"jsonSchema":{"required":["content","title"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"title":{"maxLength":32,"minLength":1,"type":"string","description":"标题"},"content":{"minLength":1,"type":"string","description":"内容"},"type":{"$ref":"#/definitions/84275325"},"publicUserId":{"type":"integer","description":"发布人Id","format":"int64"},"publicUserName":{"maxLength":32,"type":["string","null"],"description":"发布人姓名"},"publicOrgId":{"type":"integer","description":"发布机构Id","format":"int64"},"publicOrgName":{"maxLength":64,"type":["string","null"],"description":"发布机构名称"},"publicTime":{"type":["string","null"],"description":"发布时间","format":"date-time"},"cancelTime":{"type":["string","null"],"description":"撤回时间","format":"date-time"},"status":{"$ref":"#/definitions/84275324"}},"additionalProperties":false,"description":"系统通知公告表","x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","title","content","type","publicUserId","publicUserName","publicOrgId","publicOrgName","publicTime","cancelTime","status"]}}},{"name":"SysNoticeUser","displayName":"","id":"#/definitions/84275393","description":"系统通知公告用户表","schema":{"jsonSchema":{"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"noticeId":{"type":"integer","description":"通知公告Id","format":"int64"},"sysNotice":{"$ref":"#/definitions/84275392"},"userId":{"type":"integer","description":"用户Id","format":"int64"},"readTime":{"type":["string","null"],"description":"阅读时间","format":"date-time"},"readStatus":{"$ref":"#/definitions/84275326"}},"additionalProperties":false,"description":"系统通知公告用户表","x-apifox-orders":["id","noticeId","sysNotice","userId","readTime","readStatus"]}}},{"name":"SysOnlineUser","displayName":"","id":"#/definitions/84275394","description":"系统在线用户表","schema":{"jsonSchema":{"required":["userName"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"tenantId":{"type":["integer","null"],"description":"租户Id","format":"int64"},"connectionId":{"type":["string","null"],"description":"连接Id"},"userId":{"type":"integer","description":"用户Id","format":"int64"},"userName":{"maxLength":32,"minLength":1,"type":"string","description":"账号"},"realName":{"maxLength":32,"type":["string","null"],"description":"真实姓名"},"time":{"type":["string","null"],"description":"连接时间","format":"date-time"},"ip":{"maxLength":256,"type":["string","null"],"description":"连接IP"},"browser":{"maxLength":128,"type":["string","null"],"description":"浏览器"},"os":{"maxLength":128,"type":["string","null"],"description":"操作系统"}},"additionalProperties":false,"description":"系统在线用户表","x-apifox-orders":["id","tenantId","connectionId","userId","userName","realName","time","ip","browser","os"]}}},{"name":"SysOrg","displayName":"","id":"#/definitions/84275395","description":"系统机构表","schema":{"jsonSchema":{"required":["name"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"tenantId":{"type":["integer","null"],"description":"租户Id","format":"int64"},"pid":{"type":"integer","description":"父Id","format":"int64"},"name":{"maxLength":64,"minLength":1,"type":"string","description":"名称"},"code":{"maxLength":64,"type":["string","null"],"description":"编码"},"level":{"type":["integer","null"],"description":"级别","format":"int32"},"type":{"maxLength":64,"type":["string","null"],"description":"机构类型-数据字典"},"directorId":{"type":["integer","null"],"description":"负责人Id","format":"int64"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"status":{"$ref":"#/definitions/84275375"},"remark":{"maxLength":128,"type":["string","null"],"description":"备注"},"children":{"type":["array","null"],"items":{"$ref":"#/definitions/84275395"},"description":"机构子项"},"disabled":{"type":"boolean","description":"是否禁止选中"}},"additionalProperties":false,"description":"系统机构表","x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","tenantId","pid","name","code","level","type","directorId","orderNo","status","remark","children","disabled"]}}},{"name":"SysPlugin","displayName":"","id":"#/definitions/84275396","description":"系统动态插件表","schema":{"jsonSchema":{"required":["csharpCode","name"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"tenantId":{"type":["integer","null"],"description":"租户Id","format":"int64"},"name":{"maxLength":64,"minLength":1,"type":"string","description":"名称"},"csharpCode":{"minLength":1,"type":"string","description":"C#代码"},"assemblyName":{"maxLength":512,"type":["string","null"],"description":"程序集名称"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"status":{"$ref":"#/definitions/84275375"},"remark":{"maxLength":128,"type":["string","null"],"description":"备注"}},"additionalProperties":false,"description":"系统动态插件表","x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","tenantId","name","csharpCode","assemblyName","orderNo","status","remark"]}}},{"name":"SysPos","displayName":"","id":"#/definitions/84275397","description":"系统职位表","schema":{"jsonSchema":{"required":["name"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"tenantId":{"type":["integer","null"],"description":"租户Id","format":"int64"},"name":{"maxLength":64,"minLength":1,"type":"string","description":"名称"},"code":{"maxLength":64,"type":["string","null"],"description":"编码"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"remark":{"maxLength":128,"type":["string","null"],"description":"备注"},"status":{"$ref":"#/definitions/84275375"}},"additionalProperties":false,"description":"系统职位表","x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","tenantId","name","code","orderNo","remark","status"]}}},{"name":"SysPrint","displayName":"","id":"#/definitions/84275398","description":"系统打印模板表","schema":{"jsonSchema":{"required":["name","template"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"tenantId":{"type":["integer","null"],"description":"租户Id","format":"int64"},"name":{"maxLength":64,"minLength":1,"type":"string","description":"名称"},"template":{"minLength":1,"type":"string","description":"打印模板"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"status":{"$ref":"#/definitions/84275375"},"remark":{"maxLength":128,"type":["string","null"],"description":"备注"}},"additionalProperties":false,"description":"系统打印模板表","x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","tenantId","name","template","orderNo","status","remark"]}}},{"name":"SysRegion","displayName":"","id":"#/definitions/84275399","description":"系统行政地区表","schema":{"jsonSchema":{"required":["name"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"pid":{"type":"integer","description":"父Id","format":"int64"},"name":{"maxLength":128,"minLength":1,"type":"string","description":"名称"},"shortName":{"maxLength":32,"type":["string","null"],"description":"简称"},"mergerName":{"maxLength":64,"type":["string","null"],"description":"组合名"},"code":{"maxLength":32,"type":["string","null"],"description":"行政代码"},"zipCode":{"maxLength":6,"type":["string","null"],"description":"邮政编码"},"cityCode":{"maxLength":6,"type":["string","null"],"description":"区号"},"level":{"type":"integer","description":"层级","format":"int32"},"pinYin":{"maxLength":128,"type":["string","null"],"description":"拼音"},"lng":{"type":"number","description":"经度","format":"float"},"lat":{"type":"number","description":"维度","format":"float"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"remark":{"maxLength":128,"type":["string","null"],"description":"备注"},"children":{"type":["array","null"],"items":{"$ref":"#/definitions/84275399"},"description":"机构子项"}},"additionalProperties":false,"description":"系统行政地区表","x-apifox-orders":["id","pid","name","shortName","mergerName","code","zipCode","cityCode","level","pinYin","lng","lat","orderNo","remark","children"]}}},{"name":"SysRole","displayName":"","id":"#/definitions/84275400","description":"系统角色表","schema":{"jsonSchema":{"required":["name"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"tenantId":{"type":["integer","null"],"description":"租户Id","format":"int64"},"name":{"maxLength":64,"minLength":1,"type":"string","description":"名称"},"code":{"maxLength":64,"type":["string","null"],"description":"编码"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"dataScope":{"$ref":"#/definitions/84275269"},"remark":{"maxLength":128,"type":["string","null"],"description":"备注"},"status":{"$ref":"#/definitions/84275375"}},"additionalProperties":false,"description":"系统角色表","x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","tenantId","name","code","orderNo","dataScope","remark","status"]}}},{"name":"SysUser","displayName":"","id":"#/definitions/84275401","description":"系统用户表","schema":{"jsonSchema":{"required":["account"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"tenantId":{"type":["integer","null"],"description":"租户Id","format":"int64"},"account":{"maxLength":32,"minLength":1,"type":"string","description":"账号"},"realName":{"maxLength":32,"type":["string","null"],"description":"真实姓名"},"nickName":{"maxLength":32,"type":["string","null"],"description":"昵称"},"avatar":{"maxLength":512,"type":["string","null"],"description":"头像"},"sex":{"$ref":"#/definitions/84275305"},"age":{"type":"integer","description":"年龄","format":"int32"},"birthday":{"type":["string","null"],"description":"出生日期","format":"date-time"},"nation":{"maxLength":32,"type":["string","null"],"description":"民族"},"phone":{"maxLength":16,"type":["string","null"],"description":"手机号码"},"cardType":{"$ref":"#/definitions/84275258"},"idCardNum":{"maxLength":32,"type":["string","null"],"description":"身份证号"},"email":{"maxLength":64,"type":["string","null"],"description":"邮箱"},"address":{"maxLength":256,"type":["string","null"],"description":"地址"},"cultureLevel":{"$ref":"#/definitions/84275267"},"politicalOutlook":{"maxLength":16,"type":["string","null"],"description":"政治面貌"},"college":{"maxLength":128,"type":["string","null"],"description":"毕业院校"},"officePhone":{"maxLength":16,"type":["string","null"],"description":"办公电话"},"emergencyContact":{"maxLength":32,"type":["string","null"],"description":"紧急联系人"},"emergencyPhone":{"maxLength":16,"type":["string","null"],"description":"紧急联系人电话"},"emergencyAddress":{"maxLength":256,"type":["string","null"],"description":"紧急联系人地址"},"introduction":{"maxLength":512,"type":["string","null"],"description":"个人简介"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"status":{"$ref":"#/definitions/84275375"},"remark":{"maxLength":256,"type":["string","null"],"description":"备注"},"accountType":{"$ref":"#/definitions/84275167"},"orgId":{"type":"integer","description":"直属机构Id","format":"int64"},"sysOrg":{"$ref":"#/definitions/84275395"},"managerUserId":{"type":["integer","null"],"description":"直属主管Id","format":"int64"},"posId":{"type":"integer","description":"职位Id","format":"int64"},"jobNum":{"maxLength":32,"type":["string","null"],"description":"工号"},"posLevel":{"maxLength":32,"type":["string","null"],"description":"职级"},"posTitle":{"maxLength":32,"type":["string","null"],"description":"职称"},"expertise":{"maxLength":32,"type":["string","null"],"description":"擅长领域"},"officeZone":{"maxLength":32,"type":["string","null"],"description":"办公区域"},"office":{"maxLength":32,"type":["string","null"],"description":"办公室"},"joinDate":{"type":["string","null"],"description":"入职日期","format":"date-time"},"lastLoginIp":{"maxLength":256,"type":["string","null"],"description":"最新登录Ip"},"lastLoginAddress":{"maxLength":128,"type":["string","null"],"description":"最新登录地点"},"lastLoginTime":{"type":["string","null"],"description":"最新登录时间","format":"date-time"},"lastLoginDevice":{"maxLength":128,"type":["string","null"],"description":"最新登录设备"},"signature":{"maxLength":512,"type":["string","null"],"description":"电子签名"}},"additionalProperties":false,"description":"系统用户表","x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","tenantId","account","realName","nickName","avatar","sex","age","birthday","nation","phone","cardType","idCardNum","email","address","cultureLevel","politicalOutlook","college","officePhone","emergencyContact","emergencyPhone","emergencyAddress","introduction","orderNo","status","remark","accountType","orgId","sysOrg","managerUserId","posId","jobNum","posLevel","posTitle","expertise","officeZone","office","joinDate","lastLoginIp","lastLoginAddress","lastLoginTime","lastLoginDevice","signature"]}}},{"name":"SysUserExtOrg","displayName":"","id":"#/definitions/84275402","description":"系统用户扩展机构表","schema":{"jsonSchema":{"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"userId":{"type":"integer","description":"用户Id","format":"int64"},"orgId":{"type":"integer","description":"机构Id","format":"int64"},"posId":{"type":"integer","description":"职位Id","format":"int64"},"jobNum":{"maxLength":32,"type":["string","null"],"description":"工号"},"posLevel":{"maxLength":32,"type":["string","null"],"description":"职级"},"joinDate":{"type":["string","null"],"description":"入职日期","format":"date-time"}},"additionalProperties":false,"description":"系统用户扩展机构表","x-apifox-orders":["id","userId","orgId","posId","jobNum","posLevel","joinDate"]}}},{"name":"SysWechatPay","displayName":"","id":"#/definitions/84275403","description":"系统微信支付表","schema":{"jsonSchema":{"required":["appId","merchantId","outTradeNumber","transactionId"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"merchantId":{"minLength":1,"type":"string","description":"微信商户号"},"appId":{"minLength":1,"type":"string","description":"服务商AppId"},"outTradeNumber":{"minLength":1,"type":"string","description":"商户订单号"},"transactionId":{"minLength":1,"type":"string","description":"支付订单号"},"tradeType":{"type":["string","null"],"description":"交易类型"},"tradeState":{"type":["string","null"],"description":"交易状态"},"tradeStateDescription":{"type":["string","null"],"description":"交易状态描述"},"bankType":{"type":["string","null"],"description":"付款银行类型"},"total":{"type":"integer","description":"订单总金额","format":"int32"},"payerTotal":{"type":["integer","null"],"description":"用户支付金额","format":"int32"},"successTime":{"type":["string","null"],"description":"支付完成时间","format":"date-time"},"expireTime":{"type":["string","null"],"description":"交易结束时间","format":"date-time"},"description":{"type":["string","null"],"description":"商品描述"},"scene":{"type":["string","null"],"description":"场景信息"},"attachment":{"type":["string","null"],"description":"附加数据"},"goodsTag":{"type":["string","null"],"description":"优惠标记"},"settlement":{"type":["string","null"],"description":"结算信息"},"notifyUrl":{"type":["string","null"],"description":"回调通知地址"},"remark":{"type":["string","null"],"description":"备注"},"openId":{"type":["string","null"],"description":"微信OpenId标识"},"subMerchantId":{"type":["string","null"],"description":"子商户号"},"subAppId":{"type":["string","null"],"description":"子商户AppId"},"subOpenId":{"type":["string","null"],"description":"子商户唯一标识"}},"additionalProperties":false,"description":"系统微信支付表","x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","merchantId","appId","outTradeNumber","transactionId","tradeType","tradeState","tradeStateDescription","bankType","total","payerTotal","successTime","expireTime","description","scene","attachment","goodsTag","settlement","notifyUrl","remark","openId","subMerchantId","subAppId","subOpenId"]}}},{"name":"SysWechatUser","displayName":"","id":"#/definitions/84275404","description":"系统微信用户表","schema":{"jsonSchema":{"required":["openId"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"userId":{"type":"integer","description":"系统用户Id","format":"int64"},"platformType":{"$ref":"#/definitions/84275344"},"openId":{"maxLength":64,"minLength":1,"type":"string","description":"OpenId"},"sessionKey":{"maxLength":256,"type":["string","null"],"description":"会话密钥"},"unionId":{"maxLength":64,"type":["string","null"],"description":"UnionId"},"nickName":{"maxLength":64,"type":["string","null"],"description":"昵称"},"avatar":{"maxLength":256,"type":["string","null"],"description":"头像"},"mobile":{"maxLength":16,"type":["string","null"],"description":"手机号码"},"sex":{"type":["integer","null"],"description":"性别","format":"int32"},"language":{"maxLength":64,"type":["string","null"],"description":"语言"},"city":{"maxLength":64,"type":["string","null"],"description":"城市"},"province":{"maxLength":64,"type":["string","null"],"description":"省"},"country":{"maxLength":64,"type":["string","null"],"description":"国家"},"accessToken":{"type":["string","null"],"description":"AccessToken"},"refreshToken":{"type":["string","null"],"description":"RefreshToken"},"expiresIn":{"type":["integer","null"],"description":"过期时间","format":"int32"},"scope":{"maxLength":64,"type":["string","null"],"description":"用户授权的作用域,使用逗号分隔"}},"additionalProperties":false,"description":"系统微信用户表","x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","userId","platformType","openId","sessionKey","unionId","nickName","avatar","mobile","sex","language","city","province","country","accessToken","refreshToken","expiresIn","scope"]}}},{"name":"TableOutput","displayName":"","id":"#/definitions/84275405","description":"数据库表","schema":{"jsonSchema":{"type":"object","properties":{"configId":{"type":["string","null"],"description":"库定位器名"},"tableName":{"type":["string","null"],"description":"表名(字母形式的)"},"entityName":{"type":["string","null"],"description":"实体名称"},"createTime":{"type":["string","null"],"description":"创建时间"},"updateTime":{"type":["string","null"],"description":"更新时间"},"tableComment":{"type":["string","null"],"description":"表名称描述(功能名)"}},"additionalProperties":false,"description":"数据库表","x-apifox-orders":["configId","tableName","entityName","createTime","updateTime","tableComment"]}}},{"name":"TenantIdInput","displayName":"","id":"#/definitions/84275406","description":"","schema":{"jsonSchema":{"type":"object","properties":{"tenantId":{"type":"integer","description":"租户Id","format":"int64"}},"additionalProperties":false,"x-apifox-orders":["tenantId"]}}},{"name":"TenantInput","displayName":"","id":"#/definitions/84275407","description":"","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"},"status":{"$ref":"#/definitions/84275375"}},"additionalProperties":false,"x-apifox-orders":["id","status"]}}},{"name":"TenantOutput","displayName":"","id":"#/definitions/84275408","description":"","schema":{"jsonSchema":{"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"userId":{"type":"integer","description":"用户Id","format":"int64"},"orgId":{"type":"integer","description":"机构Id","format":"int64"},"host":{"maxLength":128,"type":["string","null"],"description":"主机"},"tenantType":{"$ref":"#/definitions/84275409"},"dbType":{"$ref":"#/definitions/84275276"},"connection":{"maxLength":256,"type":["string","null"],"description":"数据库连接"},"configId":{"maxLength":64,"type":["string","null"],"description":"数据库标识"},"slaveConnections":{"type":["string","null"],"description":"从库连接/读写分离"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"remark":{"maxLength":128,"type":["string","null"],"description":"备注"},"status":{"$ref":"#/definitions/84275375"},"name":{"type":["string","null"],"description":"租户名称"},"adminAccount":{"type":["string","null"],"description":"管理员账号"},"email":{"type":["string","null"],"description":"电子邮箱"},"phone":{"type":["string","null"],"description":"电话"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","userId","orgId","host","tenantType","dbType","connection","configId","slaveConnections","orderNo","remark","status","name","adminAccount","email","phone"]}}},{"name":"TenantTypeEnum","displayName":"","id":"#/definitions/84275409","description":"租户类型枚举
 Id隔离 Id = 0
 库隔离 Db = 1
","schema":{"jsonSchema":{"enum":[0,1],"type":"integer","description":"租户类型枚举
 Id隔离 Id = 0
 库隔离 Db = 1
","format":"int32"}}},{"name":"TenantUserInput","displayName":"","id":"#/definitions/84275410","description":"","schema":{"jsonSchema":{"type":"object","properties":{"userId":{"type":"integer","description":"用户Id","format":"int64"}},"additionalProperties":false,"x-apifox-orders":["userId"]}}},{"name":"TriggerStatus","displayName":"","id":"#/definitions/84275411","description":"
  Backlog = 0
  Ready = 1
  Running = 2
  Pause = 3
  Blocked = 4
  ErrorToReady = 5
  Archived = 6
  Panic = 7
  Overrun = 8
  Unoccupied = 9
  NotStart = 10
  Unknown = 11
  Unhandled = 12
","schema":{"jsonSchema":{"enum":[0,1,2,3,4,5,6,7,8,9,10,11,12],"type":"integer","description":"
  Backlog = 0
  Ready = 1
  Running = 2
  Pause = 3
  Blocked = 4
  ErrorToReady = 5
  Archived = 6
  Panic = 7
  Overrun = 8
  Unoccupied = 9
  NotStart = 10
  Unknown = 11
  Unhandled = 12
","format":"int32"}}},{"name":"UnlockLoginInput","displayName":"","id":"#/definitions/84275412","description":"解除登录锁定输入参数","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"}},"additionalProperties":false,"description":"解除登录锁定输入参数","x-apifox-orders":["id"]}}},{"name":"UpdateCodeGenInput","displayName":"","id":"#/definitions/84275413","description":"","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"page":{"type":"integer","description":"当前页码","format":"int32"},"pageSize":{"type":"integer","description":"页码容量","format":"int32"},"field":{"type":["string","null"],"description":"排序字段"},"order":{"type":["string","null"],"description":"排序方向"},"descStr":{"type":["string","null"],"description":"降序排序"},"authorName":{"type":["string","null"],"description":"作者姓名"},"className":{"type":["string","null"],"description":"类名"},"tablePrefix":{"type":["string","null"],"description":"是否移除表前缀"},"configId":{"type":["string","null"],"description":"库定位器名"},"dbName":{"type":["string","null"],"description":"数据库名(保留字段)"},"dbType":{"type":["string","null"],"description":"数据库类型"},"connectionString":{"type":["string","null"],"description":"数据库链接"},"generateType":{"type":["string","null"],"description":"生成方式"},"tableName":{"type":["string","null"],"description":"数据库表名"},"nameSpace":{"type":["string","null"],"description":"命名空间"},"busName":{"type":["string","null"],"description":"业务名(业务代码包名称)"},"tableComment":{"type":["string","null"],"description":"功能名(数据库表名称)"},"menuApplication":{"type":["string","null"],"description":"菜单应用分类(应用编码)"},"menuPid":{"type":"integer","description":"菜单父级","format":"int64"},"printType":{"type":["string","null"],"description":"支持打印类型"},"printName":{"type":["string","null"],"description":"打印模版名称"},"id":{"type":"integer","description":"代码生成器Id","format":"int64"}},"additionalProperties":false,"x-apifox-orders":["page","pageSize","field","order","descStr","authorName","className","tablePrefix","configId","dbName","dbType","connectionString","generateType","tableName","nameSpace","busName","tableComment","menuApplication","menuPid","printType","printName","id"]}}},{"name":"UpdateConfigInput","displayName":"","id":"#/definitions/84275414","description":"","schema":{"jsonSchema":{"required":["name"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"name":{"maxLength":64,"minLength":1,"type":"string","description":"名称"},"code":{"maxLength":64,"type":["string","null"],"description":"编码"},"value":{"maxLength":64,"type":["string","null"],"description":"属性值"},"sysFlag":{"$ref":"#/definitions/84275444"},"groupCode":{"maxLength":64,"type":["string","null"],"description":"分组编码"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"remark":{"maxLength":256,"type":["string","null"],"description":"备注"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","name","code","value","sysFlag","groupCode","orderNo","remark"]}}},{"name":"UpdateDbColumnInput","displayName":"","id":"#/definitions/84275415","description":"","schema":{"jsonSchema":{"type":"object","properties":{"configId":{"type":["string","null"]},"tableName":{"type":["string","null"]},"columnName":{"type":["string","null"]},"oldColumnName":{"type":["string","null"]},"description":{"type":["string","null"]}},"additionalProperties":false,"x-apifox-orders":["configId","tableName","columnName","oldColumnName","description"]}}},{"name":"UpdateDbTableInput","displayName":"","id":"#/definitions/84275416","description":"","schema":{"jsonSchema":{"type":"object","properties":{"configId":{"type":["string","null"]},"tableName":{"type":["string","null"]},"oldTableName":{"type":["string","null"]},"description":{"type":["string","null"]}},"additionalProperties":false,"x-apifox-orders":["configId","tableName","oldTableName","description"]}}},{"name":"UpdateDictDataInput","displayName":"","id":"#/definitions/84275417","description":"","schema":{"jsonSchema":{"required":["code","value"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"dictTypeId":{"type":"integer","description":"字典类型Id","format":"int64"},"value":{"maxLength":128,"minLength":1,"type":"string","description":"值"},"code":{"maxLength":64,"minLength":1,"type":"string","description":"编码"},"tagType":{"maxLength":16,"type":["string","null"],"description":"显示样式-标签颜色"},"styleSetting":{"maxLength":512,"type":["string","null"],"description":"显示样式-Style(控制显示样式)"},"classSetting":{"maxLength":512,"type":["string","null"],"description":"显示样式-Class(控制显示样式)"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"remark":{"maxLength":2048,"type":["string","null"],"description":"备注"},"extData":{"type":["string","null"],"description":"拓展数据(保存业务功能的配置项)"},"status":{"$ref":"#/definitions/84275375"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","dictTypeId","value","code","tagType","styleSetting","classSetting","orderNo","remark","extData","status"]}}},{"name":"UpdateDictTypeInput","displayName":"","id":"#/definitions/84275418","description":"","schema":{"jsonSchema":{"required":["code","name"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"name":{"maxLength":64,"minLength":1,"type":"string","description":"名称"},"code":{"maxLength":64,"minLength":1,"type":"string","description":"编码"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"remark":{"maxLength":256,"type":["string","null"],"description":"备注"},"status":{"$ref":"#/definitions/84275375"},"children":{"type":["array","null"],"items":{"$ref":"#/definitions/84275379"},"description":"字典值集合"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","name","code","orderNo","remark","status","children"]}}},{"name":"UpdateJobDetailInput","displayName":"","id":"#/definitions/84275419","description":"","schema":{"jsonSchema":{"required":["jobId"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"groupName":{"maxLength":128,"type":["string","null"],"description":"组名称"},"jobType":{"maxLength":128,"type":["string","null"],"description":"作业类型FullName"},"assemblyName":{"maxLength":128,"type":["string","null"],"description":"程序集Name"},"description":{"maxLength":128,"type":["string","null"],"description":"描述信息"},"concurrent":{"type":"boolean","description":"是否并行执行"},"includeAnnotations":{"type":"boolean","description":"是否扫描特性触发器"},"properties":{"type":["string","null"],"description":"额外数据"},"updatedTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createType":{"$ref":"#/definitions/84275308"},"scriptCode":{"type":["string","null"],"description":"脚本代码"},"jobId":{"minLength":2,"type":"string","description":"作业Id"}},"additionalProperties":false,"x-apifox-orders":["id","groupName","jobType","assemblyName","description","concurrent","includeAnnotations","properties","updatedTime","createType","scriptCode","jobId"]}}},{"name":"UpdateJobTriggerInput","displayName":"","id":"#/definitions/84275420","description":"","schema":{"jsonSchema":{"required":["jobId","triggerId"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"triggerType":{"maxLength":128,"type":["string","null"],"description":"触发器类型FullName"},"assemblyName":{"maxLength":128,"type":["string","null"],"description":"程序集Name"},"args":{"maxLength":128,"type":["string","null"],"description":"参数"},"description":{"maxLength":128,"type":["string","null"],"description":"描述信息"},"status":{"$ref":"#/definitions/84275411"},"startTime":{"type":["string","null"],"description":"起始时间","format":"date-time"},"endTime":{"type":["string","null"],"description":"结束时间","format":"date-time"},"lastRunTime":{"type":["string","null"],"description":"最近运行时间","format":"date-time"},"nextRunTime":{"type":["string","null"],"description":"下一次运行时间","format":"date-time"},"numberOfRuns":{"type":"integer","description":"触发次数","format":"int64"},"maxNumberOfRuns":{"type":"integer","description":"最大触发次数(0:不限制,n:N次)","format":"int64"},"numberOfErrors":{"type":"integer","description":"出错次数","format":"int64"},"maxNumberOfErrors":{"type":"integer","description":"最大出错次数(0:不限制,n:N次)","format":"int64"},"numRetries":{"type":"integer","description":"重试次数","format":"int32"},"retryTimeout":{"type":"integer","description":"重试间隔时间(ms)","format":"int32"},"startNow":{"type":"boolean","description":"是否立即启动"},"runOnStart":{"type":"boolean","description":"是否启动时执行一次"},"resetOnlyOnce":{"type":"boolean","description":"是否在启动时重置最大触发次数等于一次的作业"},"updatedTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"jobId":{"minLength":2,"type":"string","description":"作业Id"},"triggerId":{"minLength":2,"type":"string","description":"触发器Id"}},"additionalProperties":false,"x-apifox-orders":["id","triggerType","assemblyName","args","description","status","startTime","endTime","lastRunTime","nextRunTime","numberOfRuns","maxNumberOfRuns","numberOfErrors","maxNumberOfErrors","numRetries","retryTimeout","startNow","runOnStart","resetOnlyOnce","updatedTime","jobId","triggerId"]}}},{"name":"UpdateMenuInput","displayName":"","id":"#/definitions/84275421","description":"","schema":{"jsonSchema":{"required":["title"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"pid":{"type":"integer","description":"父Id","format":"int64"},"type":{"$ref":"#/definitions/84275319"},"name":{"maxLength":64,"type":["string","null"],"description":"路由名称"},"path":{"maxLength":128,"type":["string","null"],"description":"路由地址"},"component":{"maxLength":128,"type":["string","null"],"description":"组件路径"},"redirect":{"maxLength":128,"type":["string","null"],"description":"重定向"},"permission":{"maxLength":128,"type":["string","null"],"description":"权限标识"},"icon":{"maxLength":128,"type":["string","null"],"description":"图标"},"isIframe":{"type":"boolean","description":"是否内嵌"},"outLink":{"maxLength":256,"type":["string","null"],"description":"外链链接"},"isHide":{"type":"boolean","description":"是否隐藏"},"isKeepAlive":{"type":"boolean","description":"是否缓存"},"isAffix":{"type":"boolean","description":"是否固定"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"status":{"$ref":"#/definitions/84275375"},"remark":{"maxLength":256,"type":["string","null"],"description":"备注"},"children":{"type":["array","null"],"items":{"$ref":"#/definitions/84275390"},"description":"菜单子项"},"title":{"minLength":1,"type":"string","description":"名称"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","pid","type","name","path","component","redirect","permission","icon","isIframe","outLink","isHide","isKeepAlive","isAffix","orderNo","status","remark","children","title"]}}},{"name":"UpdateNoticeInput","displayName":"","id":"#/definitions/84275422","description":"","schema":{"jsonSchema":{"required":["content","title"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"title":{"maxLength":32,"minLength":1,"type":"string","description":"标题"},"content":{"minLength":1,"type":"string","description":"内容"},"type":{"$ref":"#/definitions/84275325"},"publicUserId":{"type":"integer","description":"发布人Id","format":"int64"},"publicUserName":{"maxLength":32,"type":["string","null"],"description":"发布人姓名"},"publicOrgId":{"type":"integer","description":"发布机构Id","format":"int64"},"publicOrgName":{"maxLength":64,"type":["string","null"],"description":"发布机构名称"},"publicTime":{"type":["string","null"],"description":"发布时间","format":"date-time"},"cancelTime":{"type":["string","null"],"description":"撤回时间","format":"date-time"},"status":{"$ref":"#/definitions/84275324"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","title","content","type","publicUserId","publicUserName","publicOrgId","publicOrgName","publicTime","cancelTime","status"]}}},{"name":"UpdateOpenAccessInput","displayName":"","id":"#/definitions/84275423","description":"","schema":{"jsonSchema":{"required":["accessKey","accessSecret","bindUserId"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"bindTenantId":{"type":"integer","description":"绑定租户Id","format":"int64"},"accessKey":{"minLength":1,"type":"string","description":"身份标识"},"accessSecret":{"minLength":1,"type":"string","description":"密钥"},"bindUserId":{"type":"integer","description":"绑定用户Id","format":"int64"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","bindTenantId","accessKey","accessSecret","bindUserId"]}}},{"name":"UpdateOrgInput","displayName":"","id":"#/definitions/84275424","description":"","schema":{"jsonSchema":{"required":["name"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"tenantId":{"type":["integer","null"],"description":"租户Id","format":"int64"},"pid":{"type":"integer","description":"父Id","format":"int64"},"code":{"maxLength":64,"type":["string","null"],"description":"编码"},"level":{"type":["integer","null"],"description":"级别","format":"int32"},"type":{"maxLength":64,"type":["string","null"],"description":"机构类型-数据字典"},"directorId":{"type":["integer","null"],"description":"负责人Id","format":"int64"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"status":{"$ref":"#/definitions/84275375"},"remark":{"maxLength":128,"type":["string","null"],"description":"备注"},"children":{"type":["array","null"],"items":{"$ref":"#/definitions/84275395"},"description":"机构子项"},"disabled":{"type":"boolean","description":"是否禁止选中"},"name":{"minLength":1,"type":"string","description":"名称"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","tenantId","pid","code","level","type","directorId","orderNo","status","remark","children","disabled","name"]}}},{"name":"UpdatePluginInput","displayName":"","id":"#/definitions/84275425","description":"","schema":{"jsonSchema":{"required":["csharpCode","name"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"tenantId":{"type":["integer","null"],"description":"租户Id","format":"int64"},"csharpCode":{"minLength":1,"type":"string","description":"C#代码"},"assemblyName":{"maxLength":512,"type":["string","null"],"description":"程序集名称"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"status":{"$ref":"#/definitions/84275375"},"remark":{"maxLength":128,"type":["string","null"],"description":"备注"},"name":{"minLength":1,"type":"string","description":"名称"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","tenantId","csharpCode","assemblyName","orderNo","status","remark","name"]}}},{"name":"UpdatePosInput","displayName":"","id":"#/definitions/84275426","description":"","schema":{"jsonSchema":{"required":["name"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"tenantId":{"type":["integer","null"],"description":"租户Id","format":"int64"},"code":{"maxLength":64,"type":["string","null"],"description":"编码"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"remark":{"maxLength":128,"type":["string","null"],"description":"备注"},"status":{"$ref":"#/definitions/84275375"},"name":{"minLength":1,"type":"string","description":"名称"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","tenantId","code","orderNo","remark","status","name"]}}},{"name":"UpdatePrintInput","displayName":"","id":"#/definitions/84275427","description":"","schema":{"jsonSchema":{"required":["name","template"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"tenantId":{"type":["integer","null"],"description":"租户Id","format":"int64"},"template":{"minLength":1,"type":"string","description":"打印模板"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"status":{"$ref":"#/definitions/84275375"},"remark":{"maxLength":128,"type":["string","null"],"description":"备注"},"name":{"minLength":1,"type":"string","description":"名称"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","tenantId","template","orderNo","status","remark","name"]}}},{"name":"UpdateRegionInput","displayName":"","id":"#/definitions/84275428","description":"","schema":{"jsonSchema":{"required":["name"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"pid":{"type":"integer","description":"父Id","format":"int64"},"shortName":{"maxLength":32,"type":["string","null"],"description":"简称"},"mergerName":{"maxLength":64,"type":["string","null"],"description":"组合名"},"code":{"maxLength":32,"type":["string","null"],"description":"行政代码"},"zipCode":{"maxLength":6,"type":["string","null"],"description":"邮政编码"},"cityCode":{"maxLength":6,"type":["string","null"],"description":"区号"},"level":{"type":"integer","description":"层级","format":"int32"},"pinYin":{"maxLength":128,"type":["string","null"],"description":"拼音"},"lng":{"type":"number","description":"经度","format":"float"},"lat":{"type":"number","description":"维度","format":"float"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"remark":{"maxLength":128,"type":["string","null"],"description":"备注"},"children":{"type":["array","null"],"items":{"$ref":"#/definitions/84275399"},"description":"机构子项"},"name":{"minLength":1,"type":"string","description":"名称"}},"additionalProperties":false,"x-apifox-orders":["id","pid","shortName","mergerName","code","zipCode","cityCode","level","pinYin","lng","lat","orderNo","remark","children","name"]}}},{"name":"UpdateRoleInput","displayName":"","id":"#/definitions/84275429","description":"","schema":{"jsonSchema":{"required":["name"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"tenantId":{"type":["integer","null"],"description":"租户Id","format":"int64"},"code":{"maxLength":64,"type":["string","null"],"description":"编码"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"dataScope":{"$ref":"#/definitions/84275269"},"remark":{"maxLength":128,"type":["string","null"],"description":"备注"},"status":{"$ref":"#/definitions/84275375"},"name":{"minLength":1,"type":"string","description":"名称"},"menuIdList":{"type":["array","null"],"items":{"type":"integer","format":"int64"},"description":"菜单Id集合"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","tenantId","code","orderNo","dataScope","remark","status","name","menuIdList"]}}},{"name":"UpdateTenantInput","displayName":"","id":"#/definitions/84275430","description":"","schema":{"jsonSchema":{"required":["adminAccount","name"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"userId":{"type":"integer","description":"用户Id","format":"int64"},"orgId":{"type":"integer","description":"机构Id","format":"int64"},"host":{"maxLength":128,"type":["string","null"],"description":"主机"},"tenantType":{"$ref":"#/definitions/84275409"},"dbType":{"$ref":"#/definitions/84275276"},"connection":{"maxLength":256,"type":["string","null"],"description":"数据库连接"},"configId":{"maxLength":64,"type":["string","null"],"description":"数据库标识"},"slaveConnections":{"type":["string","null"],"description":"从库连接/读写分离"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"remark":{"maxLength":128,"type":["string","null"],"description":"备注"},"status":{"$ref":"#/definitions/84275375"},"email":{"type":["string","null"],"description":"电子邮箱"},"phone":{"type":["string","null"],"description":"电话"},"name":{"minLength":2,"type":"string","description":"租户名称"},"adminAccount":{"minLength":3,"type":"string","description":"租管账号"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","userId","orgId","host","tenantType","dbType","connection","configId","slaveConnections","orderNo","remark","status","email","phone","name","adminAccount"]}}},{"name":"UpdateUserInput","displayName":"","id":"#/definitions/84275431","description":"更新用户输入参数","schema":{"jsonSchema":{"required":["account","realName"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"tenantId":{"type":["integer","null"],"description":"租户Id","format":"int64"},"nickName":{"maxLength":32,"type":["string","null"],"description":"昵称"},"avatar":{"maxLength":512,"type":["string","null"],"description":"头像"},"sex":{"$ref":"#/definitions/84275305"},"age":{"type":"integer","description":"年龄","format":"int32"},"birthday":{"type":["string","null"],"description":"出生日期","format":"date-time"},"nation":{"maxLength":32,"type":["string","null"],"description":"民族"},"phone":{"maxLength":16,"type":["string","null"],"description":"手机号码"},"cardType":{"$ref":"#/definitions/84275258"},"idCardNum":{"maxLength":32,"type":["string","null"],"description":"身份证号"},"email":{"maxLength":64,"type":["string","null"],"description":"邮箱"},"address":{"maxLength":256,"type":["string","null"],"description":"地址"},"cultureLevel":{"$ref":"#/definitions/84275267"},"politicalOutlook":{"maxLength":16,"type":["string","null"],"description":"政治面貌"},"college":{"maxLength":128,"type":["string","null"],"description":"毕业院校"},"officePhone":{"maxLength":16,"type":["string","null"],"description":"办公电话"},"emergencyContact":{"maxLength":32,"type":["string","null"],"description":"紧急联系人"},"emergencyPhone":{"maxLength":16,"type":["string","null"],"description":"紧急联系人电话"},"emergencyAddress":{"maxLength":256,"type":["string","null"],"description":"紧急联系人地址"},"introduction":{"maxLength":512,"type":["string","null"],"description":"个人简介"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"status":{"$ref":"#/definitions/84275375"},"remark":{"maxLength":256,"type":["string","null"],"description":"备注"},"accountType":{"$ref":"#/definitions/84275167"},"orgId":{"type":"integer","description":"直属机构Id","format":"int64"},"sysOrg":{"$ref":"#/definitions/84275395"},"managerUserId":{"type":["integer","null"],"description":"直属主管Id","format":"int64"},"posId":{"type":"integer","description":"职位Id","format":"int64"},"jobNum":{"maxLength":32,"type":["string","null"],"description":"工号"},"posLevel":{"maxLength":32,"type":["string","null"],"description":"职级"},"posTitle":{"maxLength":32,"type":["string","null"],"description":"职称"},"expertise":{"maxLength":32,"type":["string","null"],"description":"擅长领域"},"officeZone":{"maxLength":32,"type":["string","null"],"description":"办公区域"},"office":{"maxLength":32,"type":["string","null"],"description":"办公室"},"joinDate":{"type":["string","null"],"description":"入职日期","format":"date-time"},"lastLoginIp":{"maxLength":256,"type":["string","null"],"description":"最新登录Ip"},"lastLoginAddress":{"maxLength":128,"type":["string","null"],"description":"最新登录地点"},"lastLoginTime":{"type":["string","null"],"description":"最新登录时间","format":"date-time"},"lastLoginDevice":{"maxLength":128,"type":["string","null"],"description":"最新登录设备"},"signature":{"maxLength":512,"type":["string","null"],"description":"电子签名"},"account":{"minLength":1,"type":"string","description":"账号"},"realName":{"minLength":1,"type":"string","description":"真实姓名"},"roleIdList":{"type":["array","null"],"items":{"type":"integer","format":"int64"},"description":"角色集合"},"extOrgIdList":{"type":["array","null"],"items":{"$ref":"#/definitions/84275402"},"description":"扩展机构集合"}},"additionalProperties":false,"description":"更新用户输入参数","x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","tenantId","nickName","avatar","sex","age","birthday","nation","phone","cardType","idCardNum","email","address","cultureLevel","politicalOutlook","college","officePhone","emergencyContact","emergencyPhone","emergencyAddress","introduction","orderNo","status","remark","accountType","orgId","sysOrg","managerUserId","posId","jobNum","posLevel","posTitle","expertise","officeZone","office","joinDate","lastLoginIp","lastLoginAddress","lastLoginTime","lastLoginDevice","signature","account","realName","roleIdList","extOrgIdList"]}}},{"name":"UploadFileFromBase64Input","displayName":"","id":"#/definitions/84275432","description":"","schema":{"jsonSchema":{"type":"object","properties":{"fileDataBase64":{"type":["string","null"],"description":"文件内容"},"contentType":{"type":["string","null"],"description":"文件类型( \"image/jpeg\",)"},"fileName":{"type":["string","null"],"description":"文件名称"},"path":{"type":["string","null"],"description":"保存路径"}},"additionalProperties":false,"x-apifox-orders":["fileDataBase64","contentType","fileName","path"]}}},{"name":"UserInput","displayName":"","id":"#/definitions/84275433","description":"设置用户状态输入参数","schema":{"jsonSchema":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"主键Id","format":"int64"},"status":{"$ref":"#/definitions/84275375"}},"additionalProperties":false,"description":"设置用户状态输入参数","x-apifox-orders":["id","status"]}}},{"name":"UserOutput","displayName":"","id":"#/definitions/84275434","description":"","schema":{"jsonSchema":{"required":["account"],"type":"object","properties":{"id":{"type":"integer","description":"雪花Id","format":"int64"},"createTime":{"type":["string","null"],"description":"创建时间","format":"date-time"},"updateTime":{"type":["string","null"],"description":"更新时间","format":"date-time"},"createUserId":{"type":["integer","null"],"description":"创建者Id","format":"int64"},"createUserName":{"type":["string","null"],"description":"创建者姓名"},"updateUserId":{"type":["integer","null"],"description":"修改者Id","format":"int64"},"updateUserName":{"type":["string","null"],"description":"修改者姓名"},"isDelete":{"type":"boolean","description":"软删除"},"tenantId":{"type":["integer","null"],"description":"租户Id","format":"int64"},"account":{"maxLength":32,"minLength":1,"type":"string","description":"账号"},"realName":{"maxLength":32,"type":["string","null"],"description":"真实姓名"},"nickName":{"maxLength":32,"type":["string","null"],"description":"昵称"},"avatar":{"maxLength":512,"type":["string","null"],"description":"头像"},"sex":{"$ref":"#/definitions/84275305"},"age":{"type":"integer","description":"年龄","format":"int32"},"birthday":{"type":["string","null"],"description":"出生日期","format":"date-time"},"nation":{"maxLength":32,"type":["string","null"],"description":"民族"},"phone":{"maxLength":16,"type":["string","null"],"description":"手机号码"},"cardType":{"$ref":"#/definitions/84275258"},"idCardNum":{"maxLength":32,"type":["string","null"],"description":"身份证号"},"email":{"maxLength":64,"type":["string","null"],"description":"邮箱"},"address":{"maxLength":256,"type":["string","null"],"description":"地址"},"cultureLevel":{"$ref":"#/definitions/84275267"},"politicalOutlook":{"maxLength":16,"type":["string","null"],"description":"政治面貌"},"college":{"maxLength":128,"type":["string","null"],"description":"毕业院校"},"officePhone":{"maxLength":16,"type":["string","null"],"description":"办公电话"},"emergencyContact":{"maxLength":32,"type":["string","null"],"description":"紧急联系人"},"emergencyPhone":{"maxLength":16,"type":["string","null"],"description":"紧急联系人电话"},"emergencyAddress":{"maxLength":256,"type":["string","null"],"description":"紧急联系人地址"},"introduction":{"maxLength":512,"type":["string","null"],"description":"个人简介"},"orderNo":{"type":"integer","description":"排序","format":"int32"},"status":{"$ref":"#/definitions/84275375"},"remark":{"maxLength":256,"type":["string","null"],"description":"备注"},"accountType":{"$ref":"#/definitions/84275167"},"orgId":{"type":"integer","description":"直属机构Id","format":"int64"},"sysOrg":{"$ref":"#/definitions/84275395"},"managerUserId":{"type":["integer","null"],"description":"直属主管Id","format":"int64"},"posId":{"type":"integer","description":"职位Id","format":"int64"},"jobNum":{"maxLength":32,"type":["string","null"],"description":"工号"},"posLevel":{"maxLength":32,"type":["string","null"],"description":"职级"},"posTitle":{"maxLength":32,"type":["string","null"],"description":"职称"},"expertise":{"maxLength":32,"type":["string","null"],"description":"擅长领域"},"officeZone":{"maxLength":32,"type":["string","null"],"description":"办公区域"},"office":{"maxLength":32,"type":["string","null"],"description":"办公室"},"joinDate":{"type":["string","null"],"description":"入职日期","format":"date-time"},"lastLoginIp":{"maxLength":256,"type":["string","null"],"description":"最新登录Ip"},"lastLoginAddress":{"maxLength":128,"type":["string","null"],"description":"最新登录地点"},"lastLoginTime":{"type":["string","null"],"description":"最新登录时间","format":"date-time"},"lastLoginDevice":{"maxLength":128,"type":["string","null"],"description":"最新登录设备"},"signature":{"maxLength":512,"type":["string","null"],"description":"电子签名"},"orgName":{"type":["string","null"],"description":"机构名称"},"posName":{"type":["string","null"],"description":"职位名称"},"roleName":{"type":["string","null"],"description":"角色名称"}},"additionalProperties":false,"x-apifox-orders":["id","createTime","updateTime","createUserId","createUserName","updateUserId","updateUserName","isDelete","tenantId","account","realName","nickName","avatar","sex","age","birthday","nation","phone","cardType","idCardNum","email","address","cultureLevel","politicalOutlook","college","officePhone","emergencyContact","emergencyPhone","emergencyAddress","introduction","orderNo","status","remark","accountType","orgId","sysOrg","managerUserId","posId","jobNum","posLevel","posTitle","expertise","officeZone","office","joinDate","lastLoginIp","lastLoginAddress","lastLoginTime","lastLoginDevice","signature","orgName","posName","roleName"]}}},{"name":"UserRoleInput","displayName":"","id":"#/definitions/84275435","description":"授权用户角色","schema":{"jsonSchema":{"type":"object","properties":{"userId":{"type":"integer","description":"用户Id","format":"int64"},"roleIdList":{"type":["array","null"],"items":{"type":"integer","format":"int64"},"description":"角色Id集合"}},"additionalProperties":false,"description":"授权用户角色","x-apifox-orders":["userId","roleIdList"]}}},{"name":"WechatPayOutput","displayName":"","id":"#/definitions/84275436","description":"","schema":{"jsonSchema":{"type":"object","properties":{"openId":{"type":["string","null"],"description":"OpenId"},"total":{"type":"integer","description":"订单金额","format":"int32"},"attachment":{"type":["string","null"],"description":"附加数据"},"goodsTag":{"type":["string","null"],"description":"优惠标记"}},"additionalProperties":false,"x-apifox-orders":["openId","total","attachment","goodsTag"]}}},{"name":"WechatPayParaInput","displayName":"","id":"#/definitions/84275437","description":"","schema":{"jsonSchema":{"type":"object","properties":{"prepayId":{"type":["string","null"],"description":"订单Id"}},"additionalProperties":false,"x-apifox-orders":["prepayId"]}}},{"name":"WechatPayTransactionInput","displayName":"","id":"#/definitions/84275438","description":"","schema":{"jsonSchema":{"type":"object","properties":{"openId":{"type":["string","null"],"description":"OpenId"},"total":{"type":"integer","description":"订单金额","format":"int32"},"description":{"type":["string","null"],"description":"商品描述"},"attachment":{"type":["string","null"],"description":"附加数据"},"goodsTag":{"type":["string","null"],"description":"优惠标记"}},"additionalProperties":false,"x-apifox-orders":["openId","total","description","attachment","goodsTag"]}}},{"name":"WechatUserInput","displayName":"","id":"#/definitions/84275439","description":"","schema":{"jsonSchema":{"type":"object","properties":{"page":{"type":"integer","description":"当前页码","format":"int32"},"pageSize":{"type":"integer","description":"页码容量","format":"int32"},"field":{"type":["string","null"],"description":"排序字段"},"order":{"type":["string","null"],"description":"排序方向"},"descStr":{"type":["string","null"],"description":"降序排序"},"nickName":{"type":["string","null"],"description":"昵称"},"phoneNumber":{"type":["string","null"],"description":"手机号码"}},"additionalProperties":false,"x-apifox-orders":["page","pageSize","field","order","descStr","nickName","phoneNumber"]}}},{"name":"WechatUserLogin","displayName":"","id":"#/definitions/84275440","description":"微信用户登录","schema":{"jsonSchema":{"required":["openId"],"type":"object","properties":{"openId":{"minLength":10,"type":"string","description":"OpenId"}},"additionalProperties":false,"description":"微信用户登录","x-apifox-orders":["openId"]}}},{"name":"WxOpenIdLoginInput","displayName":"","id":"#/definitions/84275441","description":"微信小程序登录","schema":{"jsonSchema":{"required":["openId"],"type":"object","properties":{"openId":{"minLength":10,"type":"string","description":"OpenId"}},"additionalProperties":false,"description":"微信小程序登录","x-apifox-orders":["openId"]}}},{"name":"WxOpenIdOutput","displayName":"","id":"#/definitions/84275442","description":"","schema":{"jsonSchema":{"type":"object","properties":{"openId":{"type":["string","null"]}},"additionalProperties":false,"x-apifox-orders":["openId"]}}},{"name":"WxPhoneOutput","displayName":"","id":"#/definitions/84275443","description":"","schema":{"jsonSchema":{"type":"object","properties":{"phoneNumber":{"type":["string","null"]}},"additionalProperties":false,"x-apifox-orders":["phoneNumber"]}}},{"name":"YesNoEnum","displayName":"","id":"#/definitions/84275444","description":"是否枚举
 是 Y = 1
 否 N = 2
","schema":{"jsonSchema":{"enum":[1,2],"type":"integer","description":"是否枚举
 是 Y = 1
 否 N = 2
","format":"int32"}}}]}]}],"responseCollection":[{"id":4088603,"createdAt":"2024-02-29T09:40:10.000Z","updatedAt":"2024-02-29T09:40:10.000Z","deletedAt":null,"name":"根目录","type":"root","description":"","children":[],"auth":{},"projectId":4084018,"projectBranchId":0,"parentId":0,"createdById":1145276,"updatedById":1145276,"items":[]}],"environments":[{"name":"开发环境","parameters":{"cookie":[],"query":[],"header":[],"body":[]},"variables":[],"type":"normal","visibility":"protected","ordering":0,"tags":[{"name":"","color":"#9373EE"}],"id":"18499638","baseUrl":"http://localhost:5005","baseUrls":{"default":"http://localhost:5005"}}],"commonScripts":[],"globalVariables":[],"commonParameters":null,"projectSetting":{"id":"4084141","auth":{"type":"bearer","bearer":{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjEzMDAwMDAwMDAxMTEsIlRlbmFudElkIjoxMzAwMDAwMDAwMDAxLCJBY2NvdW50IjoiYWRtaW4iLCJSZWFsTmFtZSI6Iuezu-e7n-euoeeQhuWRmCIsIkFjY291bnRUeXBlIjo4ODgsIk9yZ0lkIjoxMzAwMDAwMDAwMTAxLCJPcmdOYW1lIjoi5aSn5ZCN56eR5oqAIiwiT3JnVHlwZSI6IjEwMSIsImlhdCI6MTcwOTgwMjI5NiwibmJmIjoxNzA5ODAyMjk2LCJleHAiOjE3MTA0MDcwOTYsImlzcyI6IkFkbWluLk5FVCIsImF1ZCI6IkFkbWluLk5FVCJ9.w18JSugPFU50eMOkaLDwq2gWxPNO_3znLeUTgu2i7Ec"}},"servers":[{"id":"default","name":"默认服务"}],"gateway":[],"language":"zh-CN","apiStatuses":["developing","testing","released","deprecated"],"mockSettings":{},"preProcessors":[],"postProcessors":[],"advancedSettings":{"responseValidate":false,"enableJsonc":true,"isDefaultUrlEncoding":2,"enableBigint":false,"preferredHttpVersion":{},"enableTestScenarioSetting":false,"enableYAPICompatScript":false},"initialDisabledMockIds":[],"cloudMock":{"security":"free","enable":false,"tokenKey":"apifoxToken"}},"projectAssociations":[]} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginInput.cs b/Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginInput.cs new file mode 100644 index 0000000..929d28f --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginInput.cs @@ -0,0 +1,55 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 用户登录参数 +/// +public class LoginInput +{ + /// + /// 账号 + /// + /// admin + [Required(ErrorMessage = "账号不能为空"), MinLength(2, ErrorMessage = "账号不能少于2个字符")] + public string Account { get; set; } + + /// + /// 密码 + /// + /// 123456 + [Required(ErrorMessage = "密码不能为空"), MinLength(3, ErrorMessage = "密码不能少于3个字符")] + public string Password { get; set; } + + /// + /// 验证码Id + /// + public long CodeId { get; set; } + + /// + /// 验证码 + /// + public string Code { get; set; } +} + +public class LoginPhoneInput +{ + /// + /// 手机号码 + /// + /// admin + [Required(ErrorMessage = "手机号码不能为空")] + [DataValidation(ValidationTypes.PhoneNumber, ErrorMessage = "手机号码不正确")] + public string Phone { get; set; } + + /// + /// 验证码 + /// + /// 123456 + [Required(ErrorMessage = "验证码不能为空"), MinLength(4, ErrorMessage = "验证码不能少于4个字符")] + public string Code { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginOutput.cs b/Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginOutput.cs new file mode 100644 index 0000000..1ee6ba5 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginOutput.cs @@ -0,0 +1,23 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 用户登录结果 +/// +public class LoginOutput +{ + /// + /// 令牌Token + /// + public string AccessToken { get; set; } + + /// + /// 刷新Token + /// + public string RefreshToken { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginUserOutput.cs b/Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginUserOutput.cs new file mode 100644 index 0000000..d573a19 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Auth/Dto/LoginUserOutput.cs @@ -0,0 +1,98 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 用户登录信息 +/// +public class LoginUserOutput +{ + /// + /// 用户id + /// + public long Id { get; set; } + + /// + /// 账号名称 + /// + public string Account { get; set; } + + /// + /// 真实姓名 + /// + public string RealName { get; set; } + + /// + /// 电话 + /// + public string Phone { get; set; } + + /// + /// 身份证 + /// + public string IdCardNum { get; set; } + + /// + /// 邮箱 + /// + public string Email { get; set; } + + /// + /// 账号类型 + /// + public AccountTypeEnum AccountType { get; set; } = AccountTypeEnum.NormalUser; + + /// + /// 头像 + /// + public string Avatar { get; set; } + + /// + /// 个人简介 + /// + public string Introduction { get; set; } + + /// + /// 地址 + /// + public string Address { get; set; } + + /// + /// 电子签名 + /// + public string Signature { get; set; } + + /// + /// 机构Id + /// + public long OrgId { get; set; } + + /// + /// 机构名称 + /// + public string OrgName { get; set; } + + /// + /// 机构类型 + /// + public string OrgType { get; set; } + + /// + /// 职位名称 + /// + public string PosName { get; set; } + + /// + /// 按钮权限集合 + /// + public List Buttons { get; set; } + + /// + /// 角色集合 + /// + public List RoleIds { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Auth/Dto/SysLdapInput.cs b/Admin.NET/Admin.NET.Core/Service/Auth/Dto/SysLdapInput.cs new file mode 100644 index 0000000..009000b --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Auth/Dto/SysLdapInput.cs @@ -0,0 +1,43 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统域登录信息配置输入参数 +/// +public class SysLdapInput : BasePageInput +{ + /// + /// 关键字查询 + /// + public string? SearchKey { get; set; } + + /// + /// 主机 + /// + public string? Host { get; set; } +} + +public class AddSysLdapInput : SysLdap +{ +} + +public class UpdateSysLdapInput : SysLdap +{ +} + +public class DeleteSysLdapInput : BaseIdInput +{ +} + +public class DetailSysLdapInput : BaseIdInput +{ +} + +public class SyncSysLdapInput : BaseIdInput +{ +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs b/Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs new file mode 100644 index 0000000..5f89586 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs @@ -0,0 +1,383 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Furion.SpecificationDocument; +using Lazy.Captcha.Core; + +namespace Admin.NET.Core.Service; + +/// +/// 系统登录授权服务 🧩 +/// +[ApiDescriptionSettings(Order = 500)] +public class SysAuthService : IDynamicApiController, ITransient +{ + private readonly UserManager _userManager; + private readonly SqlSugarRepository _sysUserRep; + private readonly SqlSugarRepository _sysUserLdap; + private readonly IHttpContextAccessor _httpContextAccessor; + private readonly SysMenuService _sysMenuService; + private readonly SysOnlineUserService _sysOnlineUserService; + private readonly SysConfigService _sysConfigService; + private readonly ICaptcha _captcha; + private readonly SysCacheService _sysCacheService; + private readonly SysLdapService _sysLdapService; + + public SysAuthService(UserManager userManager, + SqlSugarRepository sysUserRep, + SqlSugarRepository sysUserLdapRep, + IHttpContextAccessor httpContextAccessor, + SysMenuService sysMenuService, + SysOnlineUserService sysOnlineUserService, + SysConfigService sysConfigService, + ICaptcha captcha, + SysCacheService sysCacheService, + SysLdapService sysLdapService) + { + _userManager = userManager; + _sysUserRep = sysUserRep; + _sysUserLdap = sysUserLdapRep; + _httpContextAccessor = httpContextAccessor; + _sysMenuService = sysMenuService; + _sysOnlineUserService = sysOnlineUserService; + _sysConfigService = sysConfigService; + _captcha = captcha; + _sysCacheService = sysCacheService; + _sysLdapService = sysLdapService; + } + + /// + /// 账号密码登录 🔖 + /// + /// + /// 用户名/密码:superadmin/123456 + /// + [AllowAnonymous] + [DisplayName("账号密码登录")] + public virtual async Task Login([Required] LoginInput input) + { + //// 可以根据域名获取具体租户 + //var host = _httpContextAccessor.HttpContext.Request.Host; + + // 判断密码错误次数(默认5次,缓存30分钟) + var keyErrorPasswordCount = $"{CacheConst.KeyErrorPasswordCount}{input.Account}"; + var errorPasswordCount = _sysCacheService.Get(keyErrorPasswordCount); + if (errorPasswordCount >= 5) + throw Oops.Oh(ErrorCodeEnum.D1027); + + // 是否开启验证码 + if (await _sysConfigService.GetConfigValue(CommonConst.SysCaptcha)) + { + // 判断验证码 + if (!_captcha.Validate(input.CodeId.ToString(), input.Code)) + throw Oops.Oh(ErrorCodeEnum.D0008); + } + + // 账号是否存在 + var user = await _sysUserRep.AsQueryable().Includes(t => t.SysOrg).ClearFilter().FirstAsync(u => u.Account.Equals(input.Account)); + _ = user ?? throw Oops.Oh(ErrorCodeEnum.D0009); + + // 账号是否被冻结 + if (user.Status == StatusEnum.Disable) + throw Oops.Oh(ErrorCodeEnum.D1017); + + // 租户是否被禁用 + var tenant = await _sysUserRep.ChangeRepository>().GetFirstAsync(u => u.Id == user.TenantId); + if (tenant != null && tenant.Status == StatusEnum.Disable) + throw Oops.Oh(ErrorCodeEnum.Z1003); + + // 国密SM2解密(前端密码传输SM2加密后的) + input.Password = CryptogramUtil.SM2Decrypt(input.Password); + + // 是否开启域登录验证 + if (await _sysConfigService.GetConfigValue(CommonConst.SysDomainLogin)) + { + var userLdap = await _sysUserLdap.GetFirstAsync(u => u.UserId == user.Id && u.TenantId == tenant.Id); + if (userLdap == null) + { + VerifyPassword(input, keyErrorPasswordCount, errorPasswordCount, user); + } + else if (!await _sysLdapService.AuthAccount(tenant.Id, userLdap.Account, input.Password)) + { + _sysCacheService.Set(keyErrorPasswordCount, ++errorPasswordCount, TimeSpan.FromMinutes(30)); + throw Oops.Oh(ErrorCodeEnum.D1000); + } + } + else + VerifyPassword(input, keyErrorPasswordCount, errorPasswordCount, user); + + // 登录成功则清空密码错误次数 + _sysCacheService.Remove(keyErrorPasswordCount); + + return await CreateToken(user); + } + + /// + /// 验证用户密码 + /// + /// + /// + /// + /// + private void VerifyPassword(LoginInput input, string keyErrorPasswordCount, int errorPasswordCount, SysUser user) + { + if (CryptogramUtil.CryptoType == CryptogramEnum.MD5.ToString()) + { + if (!user.Password.Equals(MD5Encryption.Encrypt(input.Password))) + { + _sysCacheService.Set(keyErrorPasswordCount, ++errorPasswordCount, TimeSpan.FromMinutes(30)); + throw Oops.Oh(ErrorCodeEnum.D1000); + } + } + else + { + if (!CryptogramUtil.Decrypt(user.Password).Equals(input.Password)) + { + _sysCacheService.Set(keyErrorPasswordCount, ++errorPasswordCount, TimeSpan.FromMinutes(30)); + throw Oops.Oh(ErrorCodeEnum.D1000); + } + } + } + + /// + /// 验证锁屏密码 🔖 + /// + /// + /// + [DisplayName("验证锁屏密码")] + public virtual async Task UnLockScreen([Required, FromQuery] string password) + { + // 账号是否存在 + var user = await _sysUserRep.GetFirstAsync(u => u.Id == _userManager.UserId); + _ = user ?? throw Oops.Oh(ErrorCodeEnum.D0009); + + // 国密SM2解密(前端密码传输SM2加密后的) + password = CryptogramUtil.SM2Decrypt(password); + + // 密码是否正确 + if (CryptogramUtil.CryptoType == CryptogramEnum.MD5.ToString()) + { + if (!user.Password.Equals(MD5Encryption.Encrypt(password))) + throw Oops.Oh(ErrorCodeEnum.D1000); + } + else + { + if (!CryptogramUtil.Decrypt(user.Password).Equals(password)) + throw Oops.Oh(ErrorCodeEnum.D1000); + } + + return true; + } + + /// + /// 手机号登录 🔖 + /// + /// + /// + [AllowAnonymous] + [DisplayName("手机号登录")] + public virtual async Task LoginPhone([Required] LoginPhoneInput input) + { + var verifyCode = _sysCacheService.Get($"{CacheConst.KeyPhoneVerCode}{input.Phone}"); + if (string.IsNullOrWhiteSpace(verifyCode)) + throw Oops.Oh("验证码不存在或已失效,请重新获取!"); + if (verifyCode != input.Code) + throw Oops.Oh("验证码错误!"); + + // 账号是否存在 + var user = await _sysUserRep.AsQueryable().Includes(t => t.SysOrg).ClearFilter().FirstAsync(u => u.Phone.Equals(input.Phone)); + _ = user ?? throw Oops.Oh(ErrorCodeEnum.D0009); + + return await CreateToken(user); + } + + /// + /// 生成Token令牌 🔖 + /// + /// + /// + [NonAction] + public virtual async Task CreateToken(SysUser user) + { + // 单用户登录 + await _sysOnlineUserService.SingleLogin(user.Id); + + // 生成Token令牌 + var tokenExpire = await _sysConfigService.GetTokenExpire(); + var accessToken = JWTEncryption.Encrypt(new Dictionary + { + { ClaimConst.UserId, user.Id }, + { ClaimConst.TenantId, user.TenantId }, + { ClaimConst.Account, user.Account }, + { ClaimConst.RealName, user.RealName }, + { ClaimConst.AccountType, user.AccountType }, + { ClaimConst.OrgId, user.OrgId }, + { ClaimConst.OrgName, user.SysOrg?.Name }, + { ClaimConst.OrgType, user.SysOrg?.Type }, + }, tokenExpire); + + // 生成刷新Token令牌 + var refreshTokenExpire = await _sysConfigService.GetRefreshTokenExpire(); + var refreshToken = JWTEncryption.GenerateRefreshToken(accessToken, refreshTokenExpire); + + // 设置响应报文头 + _httpContextAccessor.HttpContext.SetTokensOfResponseHeaders(accessToken, refreshToken); + + // Swagger Knife4UI-AfterScript登录脚本 + // ke.global.setAllHeader('Authorization', 'Bearer ' + ke.response.headers['access-token']); + + return new LoginOutput + { + AccessToken = accessToken, + RefreshToken = refreshToken + }; + } + + /// + /// 获取登录账号 🔖 + /// + /// + [DisplayName("获取登录账号")] + public virtual async Task GetUserInfo() + { + var user = await _sysUserRep.GetFirstAsync(u => u.Id == _userManager.UserId) ?? throw Oops.Oh(ErrorCodeEnum.D1011).StatusCode(401); + // 获取机构 + var org = await _sysUserRep.ChangeRepository>().GetFirstAsync(u => u.Id == user.OrgId); + // 获取职位 + var pos = await _sysUserRep.ChangeRepository>().GetFirstAsync(u => u.Id == user.PosId); + // 获取拥有按钮权限集合 + var buttons = await _sysMenuService.GetOwnBtnPermList(); + // 获取权限集合 + var roleIds = await _sysUserRep.ChangeRepository>().AsQueryable() + .Where(u => u.UserId == user.Id).Select(u => u.RoleId).ToListAsync(); + + return new LoginUserOutput + { + Id = user.Id, + Account = user.Account, + RealName = user.RealName, + Phone = user.Phone, + IdCardNum = user.IdCardNum, + Email = user.Email, + AccountType = user.AccountType, + Avatar = user.Avatar, + Address = user.Address, + Signature = user.Signature, + OrgId = user.OrgId, + OrgName = org?.Name, + OrgType = org?.Type, + PosName = pos?.Name, + Buttons = buttons, + RoleIds = roleIds + }; + } + + /// + /// 获取刷新Token 🔖 + /// + /// + /// + [DisplayName("获取刷新Token")] + public virtual string GetRefreshToken([FromQuery] string accessToken) + { + var refreshTokenExpire = _sysConfigService.GetRefreshTokenExpire().GetAwaiter().GetResult(); + return JWTEncryption.GenerateRefreshToken(accessToken, refreshTokenExpire); + } + + /// + /// 退出系统 🔖 + /// + [DisplayName("退出系统")] + public void Logout() + { + if (string.IsNullOrWhiteSpace(_userManager.Account)) + throw Oops.Oh(ErrorCodeEnum.D1011); + + _httpContextAccessor.HttpContext.SignoutToSwagger(); + } + + /// + /// 获取登录配置 🔖 + /// + /// + [AllowAnonymous] + [SuppressMonitor] + [DisplayName("获取登录配置")] + public async Task GetLoginConfig() + { + var secondVerEnabled = await _sysConfigService.GetConfigValue(CommonConst.SysSecondVer); + var captchaEnabled = await _sysConfigService.GetConfigValue(CommonConst.SysCaptcha); + return new { SecondVerEnabled = secondVerEnabled, CaptchaEnabled = captchaEnabled }; + } + + /// + /// 获取水印配置 🔖 + /// + /// + [SuppressMonitor] + [DisplayName("获取水印配置")] + public async Task GetWatermarkConfig() + { + var watermarkEnabled = await _sysConfigService.GetConfigValue(CommonConst.SysWatermark); + return new { WatermarkEnabled = watermarkEnabled }; + } + + /// + /// 获取验证码 🔖 + /// + /// + [AllowAnonymous] + [SuppressMonitor] + [DisplayName("获取验证码")] + public dynamic GetCaptcha() + { + var codeId = YitIdHelper.NextId().ToString(); + var captcha = _captcha.Generate(codeId); + return new { Id = codeId, Img = captcha.Base64 }; + } + + /// + /// Swagger登录检查 🔖 + /// + /// + [AllowAnonymous] + [HttpPost("/api/swagger/checkUrl"), NonUnify] + [DisplayName("Swagger登录检查")] + public int SwaggerCheckUrl() + { + return _httpContextAccessor.HttpContext.User.Identity.IsAuthenticated ? 200 : 401; + } + + /// + /// Swagger登录提交 🔖 + /// + /// + /// + [AllowAnonymous] + [HttpPost("/api/swagger/submitUrl"), NonUnify] + [DisplayName("Swagger登录提交")] + public async Task SwaggerSubmitUrl([FromForm] SpecificationAuth auth) + { + try + { + _sysCacheService.Set(CommonConst.SysCaptcha, false); + + await Login(new LoginInput + { + Account = auth.UserName, + Password = CryptogramUtil.SM2Encrypt(auth.Password), + }); + + _sysCacheService.Remove(CommonConst.SysCaptcha); + + return 200; + } + catch (Exception) + { + return 401; + } + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Auth/SysLdapService.cs b/Admin.NET/Admin.NET.Core/Service/Auth/SysLdapService.cs new file mode 100644 index 0000000..2514891 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Auth/SysLdapService.cs @@ -0,0 +1,402 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Novell.Directory.Ldap; + +namespace Admin.NET.Core; + +/// +/// 系统域登录配置服务 🧩 +/// +[ApiDescriptionSettings(Order = 496)] +public class SysLdapService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _sysLdapRep; + + public SysLdapService(SqlSugarRepository sysLdapRep) + { + _sysLdapRep = sysLdapRep; + } + + /// + /// 获取系统域登录配置分页列表 🔖 + /// + /// + /// + [DisplayName("获取系统域登录配置分页列表")] + public async Task> Page(SysLdapInput input) + { + return await _sysLdapRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => u.Host.Contains(input.SearchKey.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Host), u => u.Host.Contains(input.Host.Trim())) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 增加系统域登录配置 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Add"), HttpPost] + [DisplayName("增加系统域登录配置")] + public async Task Add(AddSysLdapInput input) + { + var entity = input.Adapt(); + entity.BindPass = CryptogramUtil.Encrypt(input.BindPass); + await _sysLdapRep.InsertAsync(entity); + return entity.Id; + } + + /// + /// 更新系统域登录配置 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Update"), HttpPost] + [DisplayName("更新系统域登录配置")] + public async Task Update(UpdateSysLdapInput input) + { + var entity = input.Adapt(); + if (!string.IsNullOrEmpty(input.BindPass) && input.BindPass.Length < 32) + { + entity.BindPass = CryptogramUtil.Encrypt(input.BindPass); // 加密 + } + + await _sysLdapRep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); + } + + /// + /// 删除系统域登录配置 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + [DisplayName("删除系统域登录配置")] + public async Task Delete(DeleteSysLdapInput input) + { + var entity = await _sysLdapRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + await _sysLdapRep.FakeDeleteAsync(entity); // 假删除 + //await _rep.DeleteAsync(entity); // 真删除 + } + + /// + /// 获取系统域登录配置详情 🔖 + /// + /// + /// + [DisplayName("获取系统域登录配置详情")] + public async Task GetDetail([FromQuery] DetailSysLdapInput input) + { + return await _sysLdapRep.GetFirstAsync(u => u.Id == input.Id); + } + + /// + /// 获取系统域登录配置列表 🔖 + /// + /// + [DisplayName("获取系统域登录配置列表")] + public async Task> GetList() + { + return await _sysLdapRep.AsQueryable().Select().ToListAsync(); + } + + /// + /// 验证账号 + /// + /// 域用户 + /// 密码 + /// 租户 + /// + [NonAction] + public async Task AuthAccount(long tenantId, string account, string password) + { + var sysLdap = await _sysLdapRep.GetFirstAsync(u => u.TenantId == tenantId) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + var ldapConn = new LdapConnection(); + try + { + ldapConn.Connect(sysLdap.Host, sysLdap.Port); + ldapConn.Bind(sysLdap.Version, sysLdap.BindDn, sysLdap.BindPass); + var ldapSearchResults = ldapConn.Search(sysLdap.BaseDn, LdapConnection.ScopeSub, sysLdap.AuthFilter.Replace("$s", account), null, false); + string dn = string.Empty; + while (ldapSearchResults.HasMore()) + { + var ldapEntry = ldapSearchResults.Next(); + var sAMAccountName = ldapEntry.GetAttribute(sysLdap.AuthFilter)?.StringValue; + if (!string.IsNullOrEmpty(sAMAccountName)) + { + dn = ldapEntry.Dn; + break; + } + } + + if (string.IsNullOrEmpty(dn)) throw Oops.Oh(ErrorCodeEnum.D1002); + // var attr = new LdapAttribute("userPassword", password); + ldapConn.Bind(dn, password); + } + catch (LdapException e) + { + return e.ResultCode switch + { + LdapException.NoSuchObject or LdapException.NoSuchAttribute => throw Oops.Oh(ErrorCodeEnum.D0009), + LdapException.InvalidCredentials => false, + _ => throw Oops.Oh(e.Message), + }; + } + finally + { + ldapConn.Disconnect(); + } + + return true; + } + + /// + /// 同步域用户 🔖 + /// + /// + /// + [DisplayName("同步域用户")] + public async Task SyncUser(SyncSysLdapInput input) + { + var sysLdap = await _sysLdapRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + var ldapConn = new LdapConnection(); + try + { + ldapConn.Connect(sysLdap.Host, sysLdap.Port); + ldapConn.Bind(sysLdap.Version, sysLdap.BindDn, sysLdap.BindPass); + var ldapSearchResults = ldapConn.Search(sysLdap.BaseDn, LdapConnection.ScopeOne, "(objectClass=*)", null, false); + var userLdapList = new List(); + while (ldapSearchResults.HasMore()) + { + LdapEntry ldapEntry; + try + { + ldapEntry = ldapSearchResults.Next(); + if (ldapEntry == null) continue; + } + catch (LdapException) + { + continue; + } + + var attrs = ldapEntry.GetAttributeSet(); + var deptCode = GetDepartmentCode(attrs, sysLdap.BindAttrCode); + if (attrs.Count == 0 || attrs.ContainsKey("OU")) + { + SearchDnLdapUser(ldapConn, sysLdap, userLdapList, ldapEntry.Dn, deptCode); + } + else + { + var sysUserLdap = CreateSysUserLdap(attrs, sysLdap.BindAttrAccount, sysLdap.BindAttrEmployeeId, deptCode); + if (string.IsNullOrEmpty(sysUserLdap.EmployeeId)) continue; + userLdapList.Add(sysUserLdap); + } + } + + if (userLdapList.Count == 0) + return; + + await App.GetRequiredService().InsertUserLdaps(sysLdap.TenantId!.Value, userLdapList); + } + catch (LdapException e) + { + throw e.ResultCode switch + { + LdapException.NoSuchObject or LdapException.NoSuchAttribute => Oops.Oh(ErrorCodeEnum.D0009), + _ => Oops.Oh(e.Message), + }; + } + finally + { + ldapConn.Disconnect(); + } + } + + /// + /// 获取部门代码 + /// + /// + /// + /// + private static string GetDepartmentCode(LdapAttributeSet attrs, string bindAttrCode) + { + return bindAttrCode == "objectGUID" + ? new Guid(attrs.GetAttribute(bindAttrCode)?.ByteValue).ToString() + : attrs.GetAttribute(bindAttrCode)?.StringValue ?? "0"; + } + + /// + /// 创建同步对象 + /// + /// + /// + /// + /// + /// + private static SysUserLdap CreateSysUserLdap(LdapAttributeSet attrs, string bindAttrAccount, string bindAttrEmployeeId, string deptCode) + { + return new SysUserLdap + { + Account = !attrs.ContainsKey(bindAttrAccount) ? null : attrs.GetAttribute(bindAttrAccount)?.StringValue, + EmployeeId = !attrs.ContainsKey(bindAttrEmployeeId) ? null : attrs.GetAttribute(bindAttrEmployeeId)?.StringValue, + DeptCode = deptCode + }; + } + + /// + /// 遍历查询域用户 + /// + /// + /// + /// + /// + /// + private static void SearchDnLdapUser(LdapConnection ldapConn, SysLdap sysLdap, List userLdapList, string baseDn, string deptCode) + { + var ldapSearchResults = ldapConn.Search(baseDn, LdapConnection.ScopeOne, "(objectClass=*)", null, false); + while (ldapSearchResults.HasMore()) + { + LdapEntry ldapEntry; + try + { + ldapEntry = ldapSearchResults.Next(); + if (ldapEntry == null) continue; + } + catch (LdapException) + { + continue; + } + + var attrs = ldapEntry.GetAttributeSet(); + deptCode = GetDepartmentCode(attrs, sysLdap.BindAttrCode); + + if (attrs.Count == 0 || attrs.ContainsKey("OU")) + SearchDnLdapUser(ldapConn, sysLdap, userLdapList, ldapEntry.Dn, deptCode); + else + { + var sysUserLdap = CreateSysUserLdap(attrs, sysLdap.BindAttrAccount, sysLdap.BindAttrEmployeeId, deptCode); + + if (string.IsNullOrEmpty(sysUserLdap.EmployeeId)) continue; + userLdapList.Add(sysUserLdap); + } + } + } + + /// + /// 同步域组织 🔖 + /// + /// + /// + [DisplayName("同步域组织")] + public async Task SyncDept(SyncSysLdapInput input) + { + var sysLdap = await _sysLdapRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + var ldapConn = new LdapConnection(); + try + { + ldapConn.Connect(sysLdap.Host, sysLdap.Port); + ldapConn.Bind(sysLdap.Version, sysLdap.BindDn, sysLdap.BindPass); + var ldapSearchResults = ldapConn.Search(sysLdap.BaseDn, LdapConnection.ScopeOne, "(objectClass=*)", null, false); + var orgList = new List(); + while (ldapSearchResults.HasMore()) + { + LdapEntry ldapEntry; + try + { + ldapEntry = ldapSearchResults.Next(); + if (ldapEntry == null) continue; + } + catch (LdapException) + { + continue; + } + + var attrs = ldapEntry.GetAttributeSet(); + if (attrs.Count == 0 || attrs.ContainsKey("OU")) + { + var sysOrg = CreateSysOrg(attrs, sysLdap, orgList, new SysOrg { Id = 0, Level = 0 }); + orgList.Add(sysOrg); + + SearchDnLdapDept(ldapConn, sysLdap, orgList, ldapEntry.Dn, sysOrg); + } + } + + if (orgList.Count == 0) + return; + + await App.GetRequiredService().BatchAddOrgs(orgList); + } + catch (LdapException e) + { + throw e.ResultCode switch + { + LdapException.NoSuchObject or LdapException.NoSuchAttribute => Oops.Oh(ErrorCodeEnum.D0009), + _ => Oops.Oh(e.Message), + }; + } + finally + { + ldapConn.Disconnect(); + } + } + + /// + /// 遍历查询域用户 + /// + /// + /// + /// + /// + /// + private static void SearchDnLdapDept(LdapConnection ldapConn, SysLdap sysLdap, List listOrgs, string baseDn, SysOrg org) + { + var ldapSearchResults = ldapConn.Search(baseDn, LdapConnection.ScopeOne, "(objectClass=*)", null, false); + while (ldapSearchResults.HasMore()) + { + LdapEntry ldapEntry; + try + { + ldapEntry = ldapSearchResults.Next(); + if (ldapEntry == null) continue; + } + catch (LdapException) + { + continue; + } + + var attrs = ldapEntry.GetAttributeSet(); + if (attrs.Count == 0 || attrs.ContainsKey("OU")) + { + var sysOrg = CreateSysOrg(attrs, sysLdap, listOrgs, org); + listOrgs.Add(sysOrg); + + SearchDnLdapDept(ldapConn, sysLdap, listOrgs, ldapEntry.Dn, sysOrg); + } + } + } + + /// + /// 创建架构对象 + /// + /// + /// + /// + /// + /// + private static SysOrg CreateSysOrg(LdapAttributeSet attrs, SysLdap sysLdap, List listOrgs, SysOrg org) + { + return new SysOrg + { + Pid = org.Id, + Id = YitIdHelper.NextId(), + Code = !attrs.ContainsKey(sysLdap.BindAttrCode) ? null : new Guid(attrs.GetAttribute(sysLdap.BindAttrCode)?.ByteValue).ToString(), + Level = org.Level + 1, + Name = !attrs.ContainsKey(sysLdap.BindAttrAccount) ? null : attrs.GetAttribute(sysLdap.BindAttrAccount)?.StringValue, + OrderNo = listOrgs.Count + 1, + }; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/BaseService.cs b/Admin.NET/Admin.NET.Core/Service/BaseService.cs new file mode 100644 index 0000000..51a46a6 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/BaseService.cs @@ -0,0 +1,90 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 实体操作基服务 +/// +/// +public class BaseService : IDynamicApiController where TEntity : class, new() +{ + private readonly SqlSugarRepository _rep; + + public BaseService(SqlSugarRepository rep) + { + _rep = rep; + } + + /// + /// 获取详情 🔖 + /// + /// + /// + [DisplayName("获取详情")] + public virtual async Task GetDetail(long id) + { + return await _rep.GetByIdAsync(id); + } + + /// + /// 获取集合 🔖 + /// + /// + [DisplayName("获取集合")] + public virtual async Task> GetList() + { + return await _rep.GetListAsync(); + } + + ///// + ///// 获取实体分页 🔖 + ///// + ///// + ///// + //[ApiDescriptionSettings(Name = "Page")] + //[DisplayName("获取实体分页")] + //public async Task> GetPage([FromQuery] BasePageInput input) + //{ + // return await _rep.AsQueryable().ToPagedListAsync(input.Page, input.PageSize); + //} + + /// + /// 增加 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Add"), HttpPost] + [DisplayName("增加")] + public virtual async Task Add(TEntity entity) + { + return await _rep.InsertAsync(entity); + } + + /// + /// 更新 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Update"), HttpPost] + [DisplayName("更新")] + public virtual async Task Update(TEntity entity) + { + return await _rep.AsUpdateable(entity).IgnoreColumns(true).ExecuteCommandAsync(); + } + + /// + /// 删除 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + [DisplayName("删除")] + public virtual async Task Delete(long id) + { + return await _rep.DeleteByIdAsync(id); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Cache/SysCacheService.cs b/Admin.NET/Admin.NET.Core/Service/Cache/SysCacheService.cs new file mode 100644 index 0000000..ea6dd91 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Cache/SysCacheService.cs @@ -0,0 +1,281 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using NewLife.Caching.Models; + +namespace Admin.NET.Core.Service; + +/// +/// 系统缓存服务 🧩 +/// +[ApiDescriptionSettings(Order = 400)] +public class SysCacheService : IDynamicApiController, ISingleton +{ + private readonly ICache _cache; + private readonly CacheOptions _cacheOptions; + + public SysCacheService(ICache cache, IOptions cacheOptions) + { + _cache = cache; + _cacheOptions = cacheOptions.Value; + } + + /// + /// 获取缓存键名集合 🔖 + /// + /// + [DisplayName("获取缓存键名集合")] + public List GetKeyList() + { + return _cache == Cache.Default + ? _cache.Keys.Where(u => u.StartsWith(_cacheOptions.Prefix)).Select(u => u[_cacheOptions.Prefix.Length..]).OrderBy(u => u).ToList() + : ((FullRedis)_cache).Search($"{_cacheOptions.Prefix}*", int.MaxValue).Select(u => u[_cacheOptions.Prefix.Length..]).OrderBy(u => u).ToList(); + } + + /// + /// 增加缓存 + /// + /// + /// + /// + [NonAction] + public bool Set(string key, object value) + { + if (string.IsNullOrWhiteSpace(key)) return false; + return _cache.Set($"{_cacheOptions.Prefix}{key}", value); + } + + /// + /// 增加缓存并设置过期时间 + /// + /// + /// + /// + /// + [NonAction] + public bool Set(string key, object value, TimeSpan expire) + { + if (string.IsNullOrWhiteSpace(key)) return false; + return _cache.Set($"{_cacheOptions.Prefix}{key}", value, expire); + } + + /// + /// 获取缓存 + /// + /// + /// + /// + [NonAction] + public T Get(string key) + { + return _cache.Get($"{_cacheOptions.Prefix}{key}"); + } + + /// + /// 删除缓存 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + [DisplayName("删除缓存")] + public int Remove(string key) + { + return _cache.Remove($"{_cacheOptions.Prefix}{key}"); + } + + /// + /// 检查缓存是否存在 + /// + /// 键 + /// + [NonAction] + public bool ExistKey(string key) + { + return _cache.ContainsKey($"{_cacheOptions.Prefix}{key}"); + } + + /// + /// 根据键名前缀删除缓存 🔖 + /// + /// 键名前缀 + /// + [ApiDescriptionSettings(Name = "DeleteByPreKey"), HttpPost] + [DisplayName("根据键名前缀删除缓存")] + public int RemoveByPrefixKey(string prefixKey) + { + var delKeys = _cache == Cache.Default + ? _cache.Keys.Where(u => u.StartsWith($"{_cacheOptions.Prefix}{prefixKey}")).ToArray() + : ((FullRedis)_cache).Search($"{_cacheOptions.Prefix}{prefixKey}*", int.MaxValue).ToArray(); + return _cache.Remove(delKeys); + } + + /// + /// 根据键名前缀获取键名集合 🔖 + /// + /// 键名前缀 + /// + [DisplayName("根据键名前缀获取键名集合")] + public List GetKeysByPrefixKey(string prefixKey) + { + return _cache == Cache.Default + ? _cache.Keys.Where(u => u.StartsWith($"{_cacheOptions.Prefix}{prefixKey}")).Select(u => u[_cacheOptions.Prefix.Length..]).ToList() + : ((FullRedis)_cache).Search($"{_cacheOptions.Prefix}{prefixKey}*", int.MaxValue).Select(u => u[_cacheOptions.Prefix.Length..]).ToList(); + } + + /// + /// 获取缓存值 🔖 + /// + /// + /// + [DisplayName("获取缓存值")] + public object GetValue(string key) + { + return _cache == Cache.Default + ? _cache.Get($"{_cacheOptions.Prefix}{key}") + : _cache.Get($"{_cacheOptions.Prefix}{key}"); + } + + /// + /// 获取或添加缓存(在数据不存在时执行委托请求数据) + /// + /// + /// + /// + /// 过期时间,单位秒 + /// + [NonAction] + public T GetOrAdd(string key, Func callback, int expire = -1) + { + if (string.IsNullOrWhiteSpace(key)) return default; + return _cache.GetOrAdd($"{_cacheOptions.Prefix}{key}", callback, expire); + } + + /// + /// Hash匹配 + /// + /// + /// + /// + [NonAction] + public RedisHash GetHashMap(string key) + { + return _cache.GetDictionary(key) as RedisHash; + } + + /// + /// 批量添加HASH + /// + /// + /// + /// + /// + [NonAction] + public bool HashSet(string key, Dictionary dic) + { + var hash = GetHashMap(key); + return hash.HMSet(dic); + } + + /// + /// 添加一条HASH + /// + /// + /// + /// + /// + [NonAction] + public void HashAdd(string key, string hashKey, T value) + { + var hash = GetHashMap(key); + hash.Add(hashKey, value); + } + + /// + /// 获取多条HASH + /// + /// + /// + /// + /// + [NonAction] + public List HashGet(string key, params string[] fields) + { + var hash = GetHashMap(key); + var result = hash.HMGet(fields); + return result.ToList(); + } + + /// + /// 获取一条HASH + /// + /// + /// + /// + /// + [NonAction] + public T HashGetOne(string key, string field) + { + var hash = GetHashMap(key); + var result = hash.HMGet(new string[] { field }); + return result[0]; + } + + /// + /// 根据KEY获取所有HASH + /// + /// + /// + /// + [NonAction] + public IDictionary HashGetAll(string key) + { + var hash = GetHashMap(key); + return hash.GetAll(); + } + + /// + /// 删除HASH + /// + /// + /// + /// + /// + [NonAction] + public int HashDel(string key, params string[] fields) + { + var hash = GetHashMap(key); + return hash.HDel(fields); + } + + /// + /// 搜索HASH + /// + /// + /// + /// + /// + [NonAction] + public List> HashSearch(string key, SearchModel searchModel) + { + var hash = GetHashMap(key); + return hash.Search(searchModel).ToList(); + } + + /// + /// 搜索HASH + /// + /// + /// + /// + /// + /// + [NonAction] + public List> HashSearch(string key, string pattern, int count) + { + var hash = GetHashMap(key); + return hash.Search(pattern, count).ToList(); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/CodeGen/CustomViewEngine.cs b/Admin.NET/Admin.NET.Core/Service/CodeGen/CustomViewEngine.cs new file mode 100644 index 0000000..9e84bc7 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/CodeGen/CustomViewEngine.cs @@ -0,0 +1,98 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class CustomViewEngine : ViewEngineModel +{ + private readonly ISqlSugarClient _db; + + public CustomViewEngine() + { + } + + public CustomViewEngine(ISqlSugarClient db) + { + _db = db; + } + + /// + /// 库定位器 + /// + public string ConfigId { get; set; } = SqlSugarConst.MainConfigId; + + public string AuthorName { get; set; } + + public string BusName { get; set; } + + public string NameSpace { get; set; } + + public string ClassName { get; set; } + + public string ProjectLastName { get; set; } + + public string LowerClassName + { + get + { + return ClassName[..1].ToLower() + ClassName[1..]; // 首字母小写 + } + } + + public bool IsJoinTable { get; set; } + + public bool IsUpload { get; set; } + + public string PrintType { get; set; } + + public string PrintName { get; set; } + + public List QueryWhetherList { get; set; } + + public List TableField { get; set; } + + private List ColumnList { get; set; } + + public string GetColumnNetType(object tbName, object colName) + { + if (tbName == null || colName == null) return null; + + var config = App.GetOptions().ConnectionConfigs.FirstOrDefault(u => u.ConfigId.ToString() == ConfigId); + ColumnList = GetColumnListByTableName(tbName.ToString()); + var col = ColumnList.Where(c => (config.DbSettings.EnableUnderLine + ? CodeGenUtil.CamelColumnName(c.ColumnName, Array.Empty()) + : c.ColumnName) == colName.ToString()).FirstOrDefault(); + return col.NetType; + } + + public List GetColumnListByTableName(string tableName) + { + // 多库代码生成切换库 + var provider = _db.AsTenant().GetConnectionScope(ConfigId != SqlSugarConst.MainConfigId ? ConfigId : SqlSugarConst.MainConfigId); + + // 获取实体类型属性 + var entityType = provider.DbMaintenance.GetTableInfoList().FirstOrDefault(u => u.Name == tableName); + + // 因为ConfigId的表通常也会用到主库的表来做连接,所以这里如果在ConfigId中找不到实体也尝试一下在主库中查找 + if (ConfigId == SqlSugarConst.MainConfigId && entityType == null) return null; + if (ConfigId != SqlSugarConst.MainConfigId) + { + provider = _db.AsTenant().GetConnectionScope(SqlSugarConst.MainConfigId); + entityType = provider.DbMaintenance.GetTableInfoList().FirstOrDefault(u => u.Name == tableName); + if (entityType == null) return null; + } + + // 按原始类型的顺序获取所有实体类型属性(不包含导航属性,会返回null) + return provider.DbMaintenance.GetColumnInfosByTableName(entityType.Name).Select(u => new ColumnOuput + { + ColumnName = u.DbColumnName, + ColumnKey = u.IsPrimarykey.ToString(), + DataType = u.DataType.ToString(), + NetType = CodeGenUtil.ConvertDataType(u, provider.CurrentConnectionConfig.DbType), + ColumnComment = u.ColumnDescription + }).ToList(); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/CodeGenConfig.cs b/Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/CodeGenConfig.cs new file mode 100644 index 0000000..0b842d8 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/CodeGenConfig.cs @@ -0,0 +1,185 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 代码生成详细配置参数 +/// +public class CodeGenConfig +{ + /// + /// 主键Id + /// + public long Id { get; set; } + + /// + /// 代码生成主表ID + /// + public long CodeGenId { get; set; } + + /// + /// 数据库字段名 + /// + public string ColumnName { get; set; } + + /// + /// 实体属性名 + /// + public string PropertyName { get; set; } + + /// + /// 字段数据长度 + /// + public int ColumnLength { get; set; } + + /// + /// 数据库字段名(首字母小写) + /// + public string LowerPropertyName => string.IsNullOrWhiteSpace(PropertyName) ? null : PropertyName[..1].ToLower() + PropertyName[1..]; + + /// + /// 字段描述 + /// + public string ColumnComment { get; set; } + + /// + /// .NET类型 + /// + public string NetType { get; set; } + + /// + /// 作用类型(字典) + /// + public string EffectType { get; set; } + + /// + /// 外键实体名称 + /// + public string FkEntityName { get; set; } + + /// + /// 外键表名称 + /// + public string FkTableName { get; set; } + + /// + /// 外键实体名称(首字母小写) + /// + public string LowerFkEntityName => + string.IsNullOrWhiteSpace(FkEntityName) ? null : FkEntityName[..1].ToLower() + FkEntityName[1..]; + + /// + /// 外键显示字段 + /// + public string FkColumnName { get; set; } + + /// + /// 外键显示字段(首字母小写) + /// + public string LowerFkColumnName => + string.IsNullOrWhiteSpace(FkColumnName) ? null : FkColumnName[..1].ToLower() + FkColumnName[1..]; + + /// + /// 外键显示字段.NET类型 + /// + public string FkColumnNetType { get; set; } + + /// + /// 字典code + /// + public string DictTypeCode { get; set; } + + /// + /// 列表是否缩进(字典) + /// + public string WhetherRetract { get; set; } + + /// + /// 是否必填(字典) + /// + public string WhetherRequired { get; set; } + + /// + /// 是否可排序(字典) + /// + public string WhetherSortable { get; set; } + + /// + /// 是否是查询条件 + /// + public string QueryWhether { get; set; } + + /// + /// 查询方式 + /// + public string QueryType { get; set; } + + /// + /// 列表显示 + /// + public string WhetherTable { get; set; } + + /// + /// 增改 + /// + public string WhetherAddUpdate { get; set; } + + /// + /// 主外键 + /// + public string ColumnKey { get; set; } + + /// + /// 数据库中类型(物理类型) + /// + public string DataType { get; set; } + + /// + /// 是否是通用字段 + /// + public string WhetherCommon { get; set; } + + /// + /// 表的别名 Table as XXX + /// + public string TableNickName + { + get + { + string str = ""; + if (EffectType == "fk") + { + str = LowerFkEntityName + "_FK_" + LowerFkColumnName; + } + else if (EffectType == "Upload") + { + str = "sysFile_FK_" + LowerPropertyName; + } + return str; + } + } + + /// + /// 显示文本字段 + /// + public string DisplayColumn { get; set; } + + /// + /// 选中值字段 + /// + public string ValueColumn { get; set; } + + /// + /// 父级字段 + /// + public string PidColumn { get; set; } + + /// + /// 排序 + /// + public int OrderNo { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/CodeGenInput.cs b/Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/CodeGenInput.cs new file mode 100644 index 0000000..2961075 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/CodeGenInput.cs @@ -0,0 +1,172 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 代码生成参数类 +/// +public class CodeGenInput : BasePageInput +{ + /// + /// 作者姓名 + /// + public virtual string AuthorName { get; set; } + + /// + /// 类名 + /// + public virtual string ClassName { get; set; } + + /// + /// 是否移除表前缀 + /// + public virtual string TablePrefix { get; set; } + + /// + /// 库定位器名 + /// + public virtual string ConfigId { get; set; } + + /// + /// 数据库名(保留字段) + /// + public virtual string DbName { get; set; } + + /// + /// 数据库类型 + /// + public virtual string DbType { get; set; } + + /// + /// 数据库链接 + /// + public virtual string ConnectionString { get; set; } + + /// + /// 生成方式 + /// + public virtual string GenerateType { get; set; } + + /// + /// 数据库表名 + /// + public virtual string TableName { get; set; } + + /// + /// 命名空间 + /// + public virtual string NameSpace { get; set; } + + /// + /// 业务名(业务代码包名称) + /// + public virtual string BusName { get; set; } + + /// + /// 功能名(数据库表名称) + /// + public virtual string TableComment { get; set; } + + /// + /// 菜单应用分类(应用编码) + /// + public virtual string MenuApplication { get; set; } + + /// + /// 菜单父级 + /// + public virtual long MenuPid { get; set; } + + /// + /// 支持打印类型 + /// + public virtual string PrintType { get; set; } + + /// + /// 打印模版名称 + /// + public virtual string PrintName { get; set; } +} + +public class AddCodeGenInput : CodeGenInput +{ + /// + /// 数据库表名 + /// + [Required(ErrorMessage = "数据库表名不能为空")] + public override string TableName { get; set; } + + /// + /// 业务名(业务代码包名称) + /// + [Required(ErrorMessage = "业务名不能为空")] + public override string BusName { get; set; } + + /// + /// 命名空间 + /// + [Required(ErrorMessage = "命名空间不能为空")] + public override string NameSpace { get; set; } + + /// + /// 作者姓名 + /// + [Required(ErrorMessage = "作者姓名不能为空")] + public override string AuthorName { get; set; } + + ///// + ///// 类名 + ///// + //[Required(ErrorMessage = "类名不能为空")] + //public override string ClassName { get; set; } + + ///// + ///// 是否移除表前缀 + ///// + //[Required(ErrorMessage = "是否移除表前缀不能为空")] + //public override string TablePrefix { get; set; } + + /// + /// 生成方式 + /// + [Required(ErrorMessage = "生成方式不能为空")] + public override string GenerateType { get; set; } + + ///// + ///// 功能名(数据库表名称) + ///// + //[Required(ErrorMessage = "数据库表名不能为空")] + //public override string TableComment { get; set; } + + /// + /// 菜单父级 + /// + [Required(ErrorMessage = "菜单父级不能为空")] + public override long MenuPid { get; set; } +} + +public class DeleteCodeGenInput +{ + /// + /// 代码生成器Id + /// + [Required(ErrorMessage = "代码生成器Id不能为空")] + public long Id { get; set; } +} + +public class UpdateCodeGenInput : CodeGenInput +{ + /// + /// 代码生成器Id + /// + [Required(ErrorMessage = "代码生成器Id不能为空")] + public long Id { get; set; } +} + +public class QueryCodeGenInput : DeleteCodeGenInput +{ +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/CodeGenOutput.cs b/Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/CodeGenOutput.cs new file mode 100644 index 0000000..6625771 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/CodeGenOutput.cs @@ -0,0 +1,78 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 代码生成参数类 +/// +public class CodeGenOutput +{ + /// + /// 代码生成器Id + /// + public long Id { get; set; } + + /// + /// 作者姓名 + /// + public string AuthorName { get; set; } + + /// + /// 类名 + /// + public string ClassName { get; set; } + + /// + /// 是否移除表前缀 + /// + public string TablePrefix { get; set; } + + /// + /// 生成方式 + /// + public string GenerateType { get; set; } + + /// + /// 数据库表名 + /// + public string TableName { get; set; } + + /// + /// 包名 + /// + public string PackageName { get; set; } + + /// + /// 业务名(业务代码包名称) + /// + public string BusName { get; set; } + + /// + /// 功能名(数据库表名称) + /// + public string TableComment { get; set; } + + /// + /// 菜单应用分类(应用编码) + /// + public string MenuApplication { get; set; } + + /// + /// 菜单父级 + /// + public long MenuPid { get; set; } + + /// + /// 支持打印类型 + /// + public string PrintType { get; set; } + + /// + /// 打印模版名称 + /// + public string PrintName { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/ColumnOuput.cs b/Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/ColumnOuput.cs new file mode 100644 index 0000000..6b3e88d --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/ColumnOuput.cs @@ -0,0 +1,58 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 数据库表列 +/// +public class ColumnOuput +{ + /// + /// 字段名 + /// + public string ColumnName { get; set; } + + /// + /// 实体的Property名 + /// + public string PropertyName { get; set; } + + /// + /// 字段数据长度 + /// + public int ColumnLength { get; set; } + + /// + /// 数据库中类型 + /// + public string DataType { get; set; } + + /// + /// 是否为主键 + /// + public bool IsPrimarykey { get; set; } + + /// + /// 是否允许为空 + /// + public bool IsNullable { get; set; } + + /// + /// .NET字段类型 + /// + public string NetType { get; set; } + + /// + /// 字段描述 + /// + public string ColumnComment { get; set; } + + /// + /// 主外键 + /// + public string ColumnKey { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/DatabaseOutput.cs b/Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/DatabaseOutput.cs new file mode 100644 index 0000000..5f6d81c --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/DatabaseOutput.cs @@ -0,0 +1,28 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 数据库 +/// +public class DatabaseOutput +{ + /// + /// 库定位器名 + /// + public string ConfigId { get; set; } + + /// + /// 数据库类型 + /// + public SqlSugar.DbType DbType { get; set; } + + /// + /// 数据库连接字符串 + /// + public string ConnectionString { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/TableOutput.cs b/Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/TableOutput.cs new file mode 100644 index 0000000..1bb8e81 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/TableOutput.cs @@ -0,0 +1,43 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 数据库表 +/// +public class TableOutput +{ + /// + /// 库定位器名 + /// + public string ConfigId { get; set; } + + /// + /// 表名(字母形式的) + /// + public string TableName { get; set; } + + /// + /// 实体名称 + /// + public string EntityName { get; set; } + + /// + /// 创建时间 + /// + public string CreateTime { get; set; } + + /// + /// 更新时间 + /// + public string UpdateTime { get; set; } + + /// + /// 表名称描述(功能名) + /// + public string TableComment { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenConfigService.cs b/Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenConfigService.cs new file mode 100644 index 0000000..f0a6bc4 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenConfigService.cs @@ -0,0 +1,153 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统代码生成配置服务 🧩 +/// +[ApiDescriptionSettings(Order = 260)] +public class SysCodeGenConfigService : IDynamicApiController, ITransient +{ + private readonly ISqlSugarClient _db; + + public SysCodeGenConfigService(ISqlSugarClient db) + { + _db = db; + } + + /// + /// 获取代码生成配置列表 🔖 + /// + /// + /// + [DisplayName("获取代码生成配置列表")] + public async Task> GetList([FromQuery] CodeGenConfig input) + { + return await _db.Queryable() + .Where(u => u.CodeGenId == input.CodeGenId) + .Select() + .Mapper(u => + { + u.NetType = (u.EffectType == "EnumSelector" || u.EffectType == "ConstSelector" ? u.DictTypeCode : u.NetType); + }) + .OrderBy(u => u.OrderNo) + .ToListAsync(); + } + + /// + /// 更新代码生成配置 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Update"), HttpPost] + [DisplayName("更新代码生成配置")] + public async Task UpdateCodeGenConfig(List inputList) + { + if (inputList == null || inputList.Count < 1) return; + await _db.Updateable(inputList.Adapt>()) + .IgnoreColumns(u => new { u.ColumnLength, u.ColumnName, u.PropertyName }) + .ExecuteCommandAsync(); + } + + /// + /// 删除代码生成配置 + /// + /// + /// + [NonAction] + public async Task DeleteCodeGenConfig(long codeGenId) + { + await _db.Deleteable().Where(u => u.CodeGenId == codeGenId).ExecuteCommandAsync(); + } + + /// + /// 获取代码生成配置详情 🔖 + /// + /// + /// + [DisplayName("获取代码生成配置详情")] + public async Task GetDetail([FromQuery] CodeGenConfig input) + { + return await _db.Queryable().FirstAsync(u => u.Id == input.Id); + } + + /// + /// 批量增加代码生成配置 + /// + /// + /// + [NonAction] + public void AddList(List tableColumnOutputList, SysCodeGen codeGenerate) + { + if (tableColumnOutputList == null) return; + + var codeGenConfigs = new List(); + var orderNo = 100; + foreach (var tableColumn in tableColumnOutputList) + { + var codeGenConfig = new SysCodeGenConfig(); + + var YesOrNo = YesNoEnum.Y.ToString(); + if (Convert.ToBoolean(tableColumn.ColumnKey)) + { + YesOrNo = YesNoEnum.N.ToString(); + } + + if (CodeGenUtil.IsCommonColumn(tableColumn.PropertyName)) + { + codeGenConfig.WhetherCommon = YesNoEnum.Y.ToString(); + YesOrNo = YesNoEnum.N.ToString(); + } + else + { + codeGenConfig.WhetherCommon = YesNoEnum.N.ToString(); + } + + codeGenConfig.CodeGenId = codeGenerate.Id; + codeGenConfig.ColumnName = tableColumn.ColumnName; // 字段名 + codeGenConfig.PropertyName = tableColumn.PropertyName;// 实体属性名 + codeGenConfig.ColumnLength = tableColumn.ColumnLength;// 长度 + codeGenConfig.ColumnComment = tableColumn.ColumnComment; + codeGenConfig.NetType = tableColumn.DataType; + codeGenConfig.WhetherRetract = YesNoEnum.N.ToString(); + + // 生成代码时,主键并不是必要输入项,故一定要排除主键字段 + codeGenConfig.WhetherRequired = (tableColumn.IsNullable || tableColumn.IsPrimarykey) ? YesNoEnum.N.ToString() : YesNoEnum.Y.ToString(); + codeGenConfig.QueryWhether = YesOrNo; + codeGenConfig.WhetherAddUpdate = YesOrNo; + codeGenConfig.WhetherTable = YesOrNo; + + codeGenConfig.ColumnKey = tableColumn.ColumnKey; + + codeGenConfig.DataType = tableColumn.DataType; + codeGenConfig.EffectType = CodeGenUtil.DataTypeToEff(codeGenConfig.NetType); + codeGenConfig.QueryType = GetDefaultQueryType(codeGenConfig); // QueryTypeEnum.eq.ToString(); + codeGenConfig.OrderNo = orderNo; + codeGenConfigs.Add(codeGenConfig); + + orderNo += 10; // 每个配置排序间隔10 + } + // 多库代码生成---这里要切回主库 + var provider = _db.AsTenant().GetConnectionScope(SqlSugarConst.MainConfigId); + provider.Insertable(codeGenConfigs).ExecuteCommand(); + } + + /// + /// 默认查询类型 + /// + /// + /// + private static string GetDefaultQueryType(SysCodeGenConfig codeGenConfig) + { + return (codeGenConfig.NetType?.TrimEnd('?')) switch + { + "string" => "like", + "DateTime" => "~", + _ => "==", + }; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs b/Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs new file mode 100644 index 0000000..9ea6d9a --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs @@ -0,0 +1,748 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using System.IO.Compression; + +namespace Admin.NET.Core.Service; + +/// +/// 系统代码生成器服务 🧩 +/// +[ApiDescriptionSettings(Order = 270)] +public class SysCodeGenService : IDynamicApiController, ITransient +{ + private readonly ISqlSugarClient _db; + + private readonly SysCodeGenConfigService _codeGenConfigService; + private readonly IViewEngine _viewEngine; + private readonly CodeGenOptions _codeGenOptions; + + public SysCodeGenService(ISqlSugarClient db, + SysCodeGenConfigService codeGenConfigService, + IViewEngine viewEngine, + IOptions codeGenOptions) + { + _db = db; + _codeGenConfigService = codeGenConfigService; + _viewEngine = viewEngine; + _codeGenOptions = codeGenOptions.Value; + } + + /// + /// 获取代码生成分页列表 🔖 + /// + /// + /// + [DisplayName("获取代码生成分页列表")] + public async Task> Page(CodeGenInput input) + { + return await _db.Queryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.TableName), u => u.TableName.Contains(input.TableName.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.BusName), u => u.BusName.Contains(input.BusName.Trim())) + .ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 增加代码生成 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Add"), HttpPost] + [DisplayName("增加代码生成")] + public async Task AddCodeGen(AddCodeGenInput input) + { + var isExist = await _db.Queryable().Where(u => u.TableName == input.TableName).AnyAsync(); + if (isExist) + throw Oops.Oh(ErrorCodeEnum.D1400); + + var codeGen = input.Adapt(); + var newCodeGen = await _db.Insertable(codeGen).ExecuteReturnEntityAsync(); + // 加入配置表中 + _codeGenConfigService.AddList(GetColumnList(input), newCodeGen); + } + + /// + /// 更新代码生成 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Update"), HttpPost] + [DisplayName("更新代码生成")] + public async Task UpdateCodeGen(UpdateCodeGenInput input) + { + var isExist = await _db.Queryable().AnyAsync(u => u.TableName == input.TableName && u.Id != input.Id); + if (isExist) + throw Oops.Oh(ErrorCodeEnum.D1400); + + await _db.Updateable(input.Adapt()).ExecuteCommandAsync(); + } + + /// + /// 删除代码生成 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + [DisplayName("删除代码生成")] + public async Task DeleteCodeGen(List inputs) + { + if (inputs == null || inputs.Count < 1) return; + + var codeGenConfigTaskList = new List(); + inputs.ForEach(u => + { + _db.Deleteable().In(u.Id).ExecuteCommand(); + + // 删除配置表中 + codeGenConfigTaskList.Add(_codeGenConfigService.DeleteCodeGenConfig(u.Id)); + }); + await Task.WhenAll(codeGenConfigTaskList); + } + + /// + /// 获取代码生成详情 🔖 + /// + /// + /// + [DisplayName("获取代码生成详情")] + public async Task GetDetail([FromQuery] QueryCodeGenInput input) + { + return await _db.Queryable().SingleAsync(u => u.Id == input.Id); + } + + /// + /// 获取数据库库集合 🔖 + /// + /// + [DisplayName("获取数据库库集合")] + public async Task> GetDatabaseList() + { + var dbConfigs = App.GetOptions().ConnectionConfigs; + return await Task.FromResult(dbConfigs.Adapt>()); + } + + /// + /// 获取数据库表(实体)集合 🔖 + /// + /// + [DisplayName("获取数据库表(实体)集合")] + public async Task> GetTableList(string configId = SqlSugarConst.MainConfigId) + { + var provider = _db.AsTenant().GetConnectionScope(configId); + var dbTableInfos = provider.DbMaintenance.GetTableInfoList(false); // 不能走缓存,否则切库不起作用 + + var config = App.GetOptions().ConnectionConfigs.FirstOrDefault(u => configId.Equals(u.ConfigId)); + + var dbTableNames = dbTableInfos.Select(u => u.Name.ToLower()).ToList(); + IEnumerable entityInfos = await GetEntityInfos(); + + var tableOutputList = new List(); + foreach (var item in entityInfos) + { + var table = dbTableInfos.FirstOrDefault(u => u.Name.ToLower() == (config.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(item.DbTableName) : item.DbTableName).ToLower()); + if (table == null) continue; + tableOutputList.Add(new TableOutput + { + ConfigId = configId, + EntityName = item.EntityName, + TableName = table.Name, + TableComment = item.TableDescription + }); + } + return tableOutputList; + } + + /// + /// 根据表名获取列集合 🔖 + /// + /// + [DisplayName("根据表名获取列集合")] + public List GetColumnListByTableName([Required] string tableName, string configId = SqlSugarConst.MainConfigId) + { + // 切库---多库代码生成用 + var provider = _db.AsTenant().GetConnectionScope(configId); + + var config = App.GetOptions().ConnectionConfigs.FirstOrDefault(u => u.ConfigId.ToString() == configId); + // 获取实体类型属性 + var entityType = provider.DbMaintenance.GetTableInfoList(false).FirstOrDefault(u => u.Name == tableName); + if (entityType == null) return null; + var entityBasePropertyNames = _codeGenOptions.EntityBaseColumn[nameof(EntityTenant)]; + // 按原始类型的顺序获取所有实体类型属性(不包含导航属性,会返回null) + return provider.DbMaintenance.GetColumnInfosByTableName(entityType.Name).Select(u => new ColumnOuput + { + ColumnName = config.DbSettings.EnableUnderLine ? CodeGenUtil.CamelColumnName(u.DbColumnName, entityBasePropertyNames) : u.DbColumnName, + ColumnKey = u.IsPrimarykey.ToString(), + DataType = u.DataType.ToString(), + NetType = CodeGenUtil.ConvertDataType(u, provider.CurrentConnectionConfig.DbType), + ColumnComment = u.ColumnDescription + }).ToList(); + } + + /// + /// 获取数据表列(实体属性)集合 + /// + /// + private List GetColumnList([FromQuery] AddCodeGenInput input) + { + var entityType = GetEntityInfos().GetAwaiter().GetResult().FirstOrDefault(u => u.EntityName == input.TableName); + if (entityType == null) + return null; + var config = App.GetOptions().ConnectionConfigs.FirstOrDefault(u => u.ConfigId.ToString() == input.ConfigId); + var dbTableName = config.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(entityType.DbTableName) : entityType.DbTableName; + + // 切库---多库代码生成用 + var provider = _db.AsTenant().GetConnectionScope(!string.IsNullOrEmpty(input.ConfigId) ? input.ConfigId : SqlSugarConst.MainConfigId); + + var entityBasePropertyNames = _codeGenOptions.EntityBaseColumn[nameof(EntityTenant)]; + var columnInfos = provider.DbMaintenance.GetColumnInfosByTableName(dbTableName, false); + var result = columnInfos.Select(u => new ColumnOuput + { + // 转下划线后的列名需要再转回来(暂时不转) + //ColumnName = config.DbSettings.EnableUnderLine ? CodeGenUtil.CamelColumnName(u.DbColumnName, entityBasePropertyNames) : u.DbColumnName, + ColumnName = u.DbColumnName, + ColumnLength = u.Length, + IsPrimarykey = u.IsPrimarykey, + IsNullable = u.IsNullable, + ColumnKey = u.IsPrimarykey.ToString(), + NetType = CodeGenUtil.ConvertDataType(u, provider.CurrentConnectionConfig.DbType), + DataType = CodeGenUtil.ConvertDataType(u, provider.CurrentConnectionConfig.DbType), + ColumnComment = string.IsNullOrWhiteSpace(u.ColumnDescription) ? u.DbColumnName : u.ColumnDescription + }).ToList(); + + // 获取实体的属性信息,赋值给PropertyName属性(CodeFirst模式应以PropertyName为实际使用名称) + var entityProperties = entityType.Type.GetProperties(); + + for (int i = result.Count - 1; i >= 0; i--) + { + var columnOutput = result[i]; + // 先找自定义字段名的,如果找不到就再找自动生成字段名的(并且过滤掉没有SugarColumn的属性) + var propertyInfo = entityProperties.FirstOrDefault(p => (p.GetCustomAttribute()?.ColumnName ?? "").ToLower() == columnOutput.ColumnName.ToLower()) ?? + entityProperties.FirstOrDefault(p => p.GetCustomAttribute() != null && p.Name.ToLower() == (config.DbSettings.EnableUnderLine + ? CodeGenUtil.CamelColumnName(columnOutput.ColumnName, entityBasePropertyNames).ToLower() + : columnOutput.ColumnName.ToLower())); + if (propertyInfo != null) + { + columnOutput.PropertyName = propertyInfo.Name; + columnOutput.ColumnComment = propertyInfo.GetCustomAttribute().ColumnDescription; + } + else + { + result.RemoveAt(i); // 移除没有定义此属性的字段 + } + } + return result; + } + + /// + /// 获取库表信息 + /// + /// + private async Task> GetEntityInfos() + { + var entityInfos = new List(); + + var type = typeof(SugarTable); + var types = new List(); + if (_codeGenOptions.EntityAssemblyNames != null) + { + foreach (var assemblyName in _codeGenOptions.EntityAssemblyNames) + { + Assembly asm = Assembly.Load(assemblyName); + types.AddRange(asm.GetExportedTypes().ToList()); + } + } + bool IsMyAttribute(Attribute[] o) + { + foreach (Attribute a in o) + { + if (a.GetType() == type) + return true; + } + return false; + } + Type[] cosType = types.Where(o => + { + return IsMyAttribute(Attribute.GetCustomAttributes(o, true)); + } + ).ToArray(); + + foreach (var c in cosType) + { + var sugarAttribute = c.GetCustomAttributes(type, true)?.FirstOrDefault(); + + var des = c.GetCustomAttributes(typeof(DescriptionAttribute), true); + var description = ""; + if (des.Length > 0) + { + description = ((DescriptionAttribute)des[0]).Description; + } + entityInfos.Add(new EntityInfo() + { + EntityName = c.Name, + DbTableName = sugarAttribute == null ? c.Name : ((SugarTable)sugarAttribute).TableName, + TableDescription = sugarAttribute == null ? description : ((SugarTable)sugarAttribute).TableDescription, + Type = c + }); + } + return await Task.FromResult(entityInfos); + } + + /// + /// 获取程序保存位置 🔖 + /// + /// + [DisplayName("获取程序保存位置")] + public List GetApplicationNamespaces() + { + return _codeGenOptions.BackendApplicationNamespaces; + } + + /// + /// 代码生成到本地 🔖 + /// + /// + [DisplayName("代码生成到本地")] + public async Task RunLocal(SysCodeGen input) + { + if (string.IsNullOrEmpty(input.GenerateType)) + input.GenerateType = "200"; + + // 先删除该表已生成的菜单列表 + var templatePathList = GetTemplatePathList(input); + List targetPathList; + var zipPath = Path.Combine(App.WebHostEnvironment.WebRootPath, "CodeGen", input.TableName); + if (input.GenerateType.StartsWith('1')) + { + targetPathList = GetZipPathList(input); + if (Directory.Exists(zipPath)) + Directory.Delete(zipPath, true); + } + else + targetPathList = GetTargetPathList(input); + + var tableFieldList = await _codeGenConfigService.GetList(new CodeGenConfig() { CodeGenId = input.Id }); // 字段集合 + var queryWhetherList = tableFieldList.Where(u => u.QueryWhether == YesNoEnum.Y.ToString()).ToList(); // 前端查询集合 + var joinTableList = tableFieldList.Where(u => u.EffectType == "Upload" || u.EffectType == "fk" || u.EffectType == "ApiTreeSelect").ToList(); // 需要连表查询的字段 + (string joinTableNames, string lowerJoinTableNames) = GetJoinTableStr(joinTableList); // 获取连表的实体名和别名 + + var data = new CustomViewEngine(_db) + { + ConfigId = input.ConfigId, + AuthorName = input.AuthorName, + BusName = input.BusName, + NameSpace = input.NameSpace, + ClassName = input.TableName, + ProjectLastName = input.NameSpace.Split('.').Last(), + QueryWhetherList = queryWhetherList, + TableField = tableFieldList, + IsJoinTable = joinTableList.Count > 0, + IsUpload = joinTableList.Where(u => u.EffectType == "Upload").Any(), + PrintType = input.PrintType, + PrintName = input.PrintName, + }; + + for (var i = 0; i < templatePathList.Count; i++) + { + if (!File.Exists(templatePathList[i])) continue; + var tContent = File.ReadAllText(templatePathList[i]); + var tResult = await _viewEngine.RunCompileFromCachedAsync(tContent, data, builderAction: builder => + { + builder.AddAssemblyReferenceByName("System.Linq"); + builder.AddAssemblyReferenceByName("System.Collections"); + builder.AddUsing("System.Collections.Generic"); + builder.AddUsing("System.Linq"); + }); + var dirPath = new DirectoryInfo(targetPathList[i]).Parent.FullName; + if (!Directory.Exists(dirPath)) + Directory.CreateDirectory(dirPath); + File.WriteAllText(targetPathList[i], tResult, Encoding.UTF8); + } + + await AddMenu(input.TableName, input.BusName, input.MenuPid, tableFieldList); + // 非ZIP压缩返回空 + if (!input.GenerateType.StartsWith('1')) + return null; + else + { + string downloadPath = zipPath + ".zip"; + // 判断是否存在同名称文件 + if (File.Exists(downloadPath)) + File.Delete(downloadPath); + ZipFile.CreateFromDirectory(zipPath, downloadPath); + return new { url = $"{App.HttpContext.Request.Scheme}://{App.HttpContext.Request.Host.Value}/CodeGen/{input.TableName}.zip" }; + } + } + + /// + /// 获取连表的实体名和别名 + /// + /// + /// + private static (string, string) GetJoinTableStr(List configs) + { + var uploads = configs.Where(u => u.EffectType == "Upload").ToList(); + var fks = configs.Where(u => u.EffectType == "fk").ToList(); + string str = ""; // + string lowerStr = ""; // (o, i, c) + foreach (var item in uploads) + { + lowerStr += "sysFile_FK_" + item.LowerPropertyName + ","; + str += "SysFile,"; + } + foreach (var item in fks) + { + lowerStr += item.LowerFkEntityName + "_FK_" + item.LowerFkColumnName + ","; + str += item.FkEntityName + ","; + } + return (str.TrimEnd(','), lowerStr.TrimEnd(',')); + } + + /// + /// 增加菜单 + /// + /// + /// + /// + /// + /// + private async Task AddMenu(string className, string busName, long pid, List tableFieldList) + { + var pPath = string.Empty; + // 若 pid=0 为顶级则创建菜单目录 + if (pid == 0) + { + // 目录 + var menuType0 = new SysMenu + { + Pid = 0, + Title = busName + "管理", + Type = MenuTypeEnum.Dir, + Icon = "robot", + Path = "/" + className.ToLower(), + Component = "Layout", + }; + // 若先前存在则删除本级和下级 + var menuList0 = await _db.Queryable().Where(u => u.Title == menuType0.Title && u.Type == menuType0.Type).ToListAsync(); + if (menuList0.Count > 0) + { + var listIds = menuList0.Select(u => u.Id).ToList(); + var childlistIds = new List(); + foreach (var item in listIds) + { + var childlist = await _db.Queryable().ToChildListAsync(u => u.Pid, item); + childlistIds.AddRange(childlist.Select(u => u.Id).ToList()); + } + listIds.AddRange(childlistIds); + await _db.Deleteable().Where(u => listIds.Contains(u.Id)).ExecuteCommandAsync(); + await _db.Deleteable().Where(u => listIds.Contains(u.MenuId)).ExecuteCommandAsync(); + } + pid = (await _db.Insertable(menuType0).ExecuteReturnEntityAsync()).Id; + } + else + { + var pMenu = await _db.Queryable().FirstAsync(u => u.Id == pid) ?? throw Oops.Oh(ErrorCodeEnum.D1505); + pPath = pMenu.Path; + } + + // 菜单 + var menuType1 = new SysMenu + { + Pid = pid, + Title = busName + "管理", + Name = className[..1].ToLower() + className[1..], + Type = MenuTypeEnum.Menu, + Path = pPath + "/" + className.ToLower(), + Component = "/main/" + className[..1].ToLower() + className[1..] + "/index", + }; + // 若先前存在则删除本级和下级 + var menuList1 = await _db.Queryable().Where(u => u.Title == menuType1.Title && u.Type == menuType1.Type).ToListAsync(); + if (menuList1.Count > 0) + { + var listIds = menuList1.Select(u => u.Id).ToList(); + var childlistIds = new List(); + foreach (var item in listIds) + { + var childlist = await _db.Queryable().ToChildListAsync(u => u.Pid, item); + childlistIds.AddRange(childlist.Select(u => u.Id).ToList()); + } + listIds.AddRange(childlistIds); + await _db.Deleteable().Where(u => listIds.Contains(u.Id)).ExecuteCommandAsync(); + await _db.Deleteable().Where(u => listIds.Contains(u.MenuId)).ExecuteCommandAsync(); + } + + var pid1 = (await _db.Insertable(menuType1).ExecuteReturnEntityAsync()).Id; + int menuOrder = 100; + // 按钮-page + var menuType2 = new SysMenu + { + Pid = pid1, + Title = "查询", + Type = MenuTypeEnum.Btn, + Permission = className[..1].ToLower() + className[1..] + ":page", + OrderNo = menuOrder + }; + menuOrder += 10; + + // 按钮-detail + var menuType2_1 = new SysMenu + { + Pid = pid1, + Title = "详情", + Type = MenuTypeEnum.Btn, + Permission = className[..1].ToLower() + className[1..] + ":detail", + OrderNo = menuOrder + }; + menuOrder += 10; + + // 按钮-add + var menuType2_2 = new SysMenu + { + Pid = pid1, + Title = "增加", + Type = MenuTypeEnum.Btn, + Permission = className[..1].ToLower() + className[1..] + ":add", + OrderNo = menuOrder + }; + menuOrder += 10; + + // 按钮-delete + var menuType2_3 = new SysMenu + { + Pid = pid1, + Title = "删除", + Type = MenuTypeEnum.Btn, + Permission = className[..1].ToLower() + className[1..] + ":delete", + OrderNo = menuOrder + }; + menuOrder += 10; + + // 按钮-update + var menuType2_4 = new SysMenu + { + Pid = pid1, + Title = "编辑", + Type = MenuTypeEnum.Btn, + Permission = className[..1].ToLower() + className[1..] + ":update", + OrderNo = menuOrder + }; + menuOrder += 10; + + var menuList = new List() { menuType2, menuType2_1, menuType2_2, menuType2_3, menuType2_4 }; + // 加入fk、Upload、ApiTreeSelect 等接口的权限 + // 在生成表格时,有些字段只是查询时显示,不需要填写(WhetherAddUpdate),所以这些字段没必要生成相应接口 + var fkTableList = tableFieldList.Where(u => u.EffectType == "fk" && (u.WhetherAddUpdate == "Y" || u.QueryWhether == "Y")).ToList(); + foreach (var @column in fkTableList) + { + var menuType = new SysMenu + { + Pid = pid1, + Title = "外键" + @column.ColumnName, + Type = MenuTypeEnum.Btn, + Permission = className[..1].ToLower() + className[1..] + ":" + column.FkEntityName + column.ColumnName + "Dropdown", + OrderNo = menuOrder + }; + menuOrder += 10; + menuList.Add(menuType); + } + var treeSelectTableList = tableFieldList.Where(u => u.EffectType == "ApiTreeSelect").ToList(); + foreach (var @column in treeSelectTableList) + { + var menuType = new SysMenu + { + Pid = pid1, + Title = "树型" + @column.ColumnName, + Type = MenuTypeEnum.Btn, + Permission = className[..1].ToLower() + className[1..] + ":" + column.FkEntityName + "Tree", + OrderNo = menuOrder + }; + menuOrder += 10; + menuList.Add(menuType); + } + var uploadTableList = tableFieldList.Where(u => u.EffectType == "Upload").ToList(); + foreach (var @column in uploadTableList) + { + var menuType = new SysMenu + { + Pid = pid1, + Title = "上传" + @column.ColumnName, + Type = MenuTypeEnum.Btn, + Permission = className[..1].ToLower() + className[1..] + ":Upload" + column.ColumnName, + OrderNo = menuOrder + }; + menuOrder += 10; + menuList.Add(menuType); + } + await _db.Insertable(menuList).ExecuteCommandAsync(); + } + + /// + /// 获取模板文件路径集合 + /// + /// + private static List GetTemplatePathList(SysCodeGen input) + { + var templatePath = Path.Combine(App.WebHostEnvironment.WebRootPath, "Template"); + if (input.GenerateType.Substring(1, 1).Contains('1')) + { + return new List() + { + Path.Combine(templatePath , "index.vue.vm"), + Path.Combine(templatePath , "editDialog.vue.vm"), + Path.Combine(templatePath , "manage.js.vm"), + }; + } + else if (input.GenerateType.Substring(1, 1).Contains('2')) + { + return new List() + { + Path.Combine(templatePath , "Service.cs.vm"), + Path.Combine(templatePath , "Input.cs.vm"), + Path.Combine(templatePath , "Output.cs.vm"), + Path.Combine(templatePath , "Dto.cs.vm"), + }; + } + else + { + return new List() + { + Path.Combine(templatePath , "Service.cs.vm"), + Path.Combine(templatePath , "Input.cs.vm"), + Path.Combine(templatePath , "Output.cs.vm"), + Path.Combine(templatePath , "Dto.cs.vm"), + Path.Combine(templatePath , "index.vue.vm"), + Path.Combine(templatePath , "editDialog.vue.vm"), + Path.Combine(templatePath , "manage.js.vm"), + }; + } + } + + /// + /// 获取模板文件路径集合 + /// + /// + private static List GetTemplatePathList() + { + var templatePath = Path.Combine(App.WebHostEnvironment.WebRootPath, "Template"); + return new List() + { + Path.Combine(templatePath , "Service.cs.vm"), + Path.Combine(templatePath , "Input.cs.vm"), + Path.Combine(templatePath , "Output.cs.vm"), + Path.Combine(templatePath , "Dto.cs.vm"), + Path.Combine(templatePath , "index.vue.vm"), + Path.Combine(templatePath , "editDialog.vue.vm"), + Path.Combine(templatePath , "manage.js.vm"), + }; + } + + /// + /// 设置生成文件路径 + /// + /// + /// + private List GetTargetPathList(SysCodeGen input) + { + //var backendPath = Path.Combine(new DirectoryInfo(App.WebHostEnvironment.ContentRootPath).Parent.FullName, _codeGenOptions.BackendApplicationNamespace, "Service", input.TableName); + var backendPath = Path.Combine(new DirectoryInfo(App.WebHostEnvironment.ContentRootPath).Parent.FullName, input.NameSpace, "Service", input.TableName); + var servicePath = Path.Combine(backendPath, input.TableName + "Service.cs"); + var inputPath = Path.Combine(backendPath, "Dto", input.TableName + "Input.cs"); + var outputPath = Path.Combine(backendPath, "Dto", input.TableName + "Output.cs"); + var viewPath = Path.Combine(backendPath, "Dto", input.TableName + "Dto.cs"); + var frontendPath = Path.Combine(new DirectoryInfo(App.WebHostEnvironment.ContentRootPath).Parent.Parent.FullName, _codeGenOptions.FrontRootPath, "src", "views", "main"); + var indexPath = Path.Combine(frontendPath, input.TableName[..1].ToLower() + input.TableName[1..], "index.vue");// + var formModalPath = Path.Combine(frontendPath, input.TableName[..1].ToLower() + input.TableName[1..], "component", "editDialog.vue"); + var apiJsPath = Path.Combine(new DirectoryInfo(App.WebHostEnvironment.ContentRootPath).Parent.Parent.FullName, _codeGenOptions.FrontRootPath, "src", "api", "main", input.TableName[..1].ToLower() + input.TableName[1..] + ".ts"); + + if (input.GenerateType.Substring(1, 1).Contains('1')) + { + // 生成到本项目(前端) + return new List() + { + indexPath, + formModalPath, + apiJsPath + }; + } + else if (input.GenerateType.Substring(1, 1).Contains('2')) + { + // 生成到本项目(后端) + return new List() + { + servicePath, + inputPath, + outputPath, + viewPath, + }; + } + else + { + // 前后端同时生成到本项目 + return new List() + { + servicePath, + inputPath, + outputPath, + viewPath, + indexPath, + formModalPath, + apiJsPath + }; + } + } + + /// + /// 设置生成文件路径 + /// + /// + /// + private List GetZipPathList(SysCodeGen input) + { + var zipPath = Path.Combine(App.WebHostEnvironment.WebRootPath, "CodeGen", input.TableName); + + //var backendPath = Path.Combine(zipPath, _codeGenOptions.BackendApplicationNamespace, "Service", input.TableName); + var backendPath = Path.Combine(zipPath, input.NameSpace, "Service", input.TableName); + var servicePath = Path.Combine(backendPath, input.TableName + "Service.cs"); + var inputPath = Path.Combine(backendPath, "Dto", input.TableName + "Input.cs"); + var outputPath = Path.Combine(backendPath, "Dto", input.TableName + "Output.cs"); + var viewPath = Path.Combine(backendPath, "Dto", input.TableName + "Dto.cs"); + var frontendPath = Path.Combine(zipPath, _codeGenOptions.FrontRootPath, "src", "views", "main"); + var indexPath = Path.Combine(frontendPath, input.TableName[..1].ToLower() + input.TableName[1..], "index.vue"); + var formModalPath = Path.Combine(frontendPath, input.TableName[..1].ToLower() + input.TableName[1..], "component", "editDialog.vue"); + var apiJsPath = Path.Combine(zipPath, _codeGenOptions.FrontRootPath, "src", "api", "main", input.TableName[..1].ToLower() + input.TableName[1..] + ".ts"); + if (input.GenerateType.StartsWith("11")) + { + return new List() + { + indexPath, + formModalPath, + apiJsPath + }; + } + else if (input.GenerateType.StartsWith("12")) + { + return new List() + { + servicePath, + inputPath, + outputPath, + viewPath + }; + } + else + { + return new List() + { + servicePath, + inputPath, + outputPath, + viewPath, + indexPath, + formModalPath, + apiJsPath + }; + } + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Common/Dto/ApiOutput.cs b/Admin.NET/Admin.NET.Core/Service/Common/Dto/ApiOutput.cs new file mode 100644 index 0000000..efd7901 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Common/Dto/ApiOutput.cs @@ -0,0 +1,28 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 接口/动态API输出 +/// +public class ApiOutput +{ + /// + /// 组名称 + /// + public string GroupName { get; set; } + + /// + /// 接口名称 + /// + public string DisplayName { get; set; } + + /// + /// 路由名称 + /// + public string RouteName { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Common/Dto/GEACityDTO.cs b/Admin.NET/Admin.NET.Core/Service/Common/Dto/GEACityDTO.cs new file mode 100644 index 0000000..899fde4 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Common/Dto/GEACityDTO.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service +{ + public class CityDTO + { + public string Name { get; set; } + public double Lng { get; set; } + public double Lat { get; set; } + } + + + public class CityResponseDto + { + + } + + // 定义一个类来表示城市数据 + public class CityData + { + public string LocationCode { get; set; } + public string CityName { get; set; } + public double Latitude { get; set; } + public double Longitude { get; set; } + } + + +} diff --git a/Admin.NET/Admin.NET.Core/Service/Common/Dto/SmKeyPairOutput.cs b/Admin.NET/Admin.NET.Core/Service/Common/Dto/SmKeyPairOutput.cs new file mode 100644 index 0000000..cc97d39 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Common/Dto/SmKeyPairOutput.cs @@ -0,0 +1,23 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 国密公钥私钥对输出 +/// +public class SmKeyPairOutput +{ + /// + /// 私匙 + /// + public string PrivateKey { get; set; } + + /// + /// 公匙 + /// + public string PublicKey { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Common/LocationService.cs b/Admin.NET/Admin.NET.Core/Service/Common/LocationService.cs new file mode 100644 index 0000000..513de22 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Common/LocationService.cs @@ -0,0 +1,105 @@ +using Microsoft.CodeAnalysis.CSharp.Syntax; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service +{ + + + /// + /// 根据经纬度获取城市 + /// + [ApiDescriptionSettings(Order = 101)] + [AllowAnonymous] + public class LocationService : IDynamicApiController, ITransient + { + private readonly SqlSugarRepository _region; + public LocationService(SqlSugarRepository reginService) + { + + this._region = reginService; + } + + /// + /// Haversine公式计算距离 + /// + /// + /// + /// + /// + /// + private double CalculateDistance(double lat1, double lon1, double lat2, double lon2) + { + const double R = 6371; // 地球半径,单位:千米 + double dLat = (lat2 - lat1) * (Math.PI / 180); + double dLon = (lon2 - lon1) * (Math.PI / 180); + double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) + + Math.Cos(lat1 * (Math.PI / 180)) * Math.Cos(lat2 * (Math.PI / 180)) * + Math.Sin(dLon / 2) * Math.Sin(dLon / 2); + double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a)); + return R * c; + } + + + // 根据传入的经纬度查找最近的城市 + [NonAction] + private CityData FindNearestCity(List _cityDataList, double targetLatitude, double targetLongitude) + { + if (_cityDataList.Count == 0) + { + return new CityData() { }; + } + + double minDistance = double.MaxValue; + var nearestCity = new CityData(); + + foreach (var cityData in _cityDataList) + { + double distance = CalculateDistance(targetLatitude, targetLongitude, cityData.Latitude, cityData.Longitude); + if (distance < minDistance) + { + minDistance = distance; + nearestCity = cityData; + } + } + + return nearestCity; + } + + + /// + /// 根据经纬度获取城市 + /// + /// + /// + /// + [HttpGet("getcity")] + public dynamic GetCity([FromQuery] double lng, [FromQuery] double lat) + { + var citylist = this._region.AsQueryable().Where(e => e.Level == 1).ToList(); + + List cities = citylist.Select(s => new CityData() + { + Latitude = s.Lat, + Longitude = s.Lng, + CityName = s.Name, + LocationCode = s.Code + }).ToList(); + return FindNearestCity(cities, lat, lng); + + } + + + + + + + + + } + +} diff --git a/Admin.NET/Admin.NET.Core/Service/Common/SysCommonService.cs b/Admin.NET/Admin.NET.Core/Service/Common/SysCommonService.cs new file mode 100644 index 0000000..d792164 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Common/SysCommonService.cs @@ -0,0 +1,70 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Microsoft.AspNetCore.Mvc.ApiExplorer; +using Org.BouncyCastle.Crypto.Parameters; +using Org.BouncyCastle.Utilities.Encoders; +using Swashbuckle.AspNetCore.SwaggerGen; + +namespace Admin.NET.Core.Service; + +/// +/// 系统通用服务 🧩 +/// +[ApiDescriptionSettings(Order = 101)] +[AllowAnonymous] +public class SysCommonService : IDynamicApiController, ITransient +{ + private readonly IApiDescriptionGroupCollectionProvider _apiProvider; + + public SysCommonService(IApiDescriptionGroupCollectionProvider apiProvider) + { + _apiProvider = apiProvider; + } + + /// + /// 获取国密公钥私钥对 🏆 + /// + /// + [DisplayName("获取国密公钥私钥对")] + public SmKeyPairOutput GetSmKeyPair() + { + var kp = GM.GenerateKeyPair(); + var privateKey = Hex.ToHexString(((ECPrivateKeyParameters)kp.Private).D.ToByteArray()).ToUpper(); + var publicKey = Hex.ToHexString(((ECPublicKeyParameters)kp.Public).Q.GetEncoded()).ToUpper(); + + return new SmKeyPairOutput + { + PrivateKey = privateKey, + PublicKey = publicKey, + }; + } + + /// + /// 获取所有接口/动态API 🔖 + /// + /// + [DisplayName("获取所有接口/动态API")] + public List GetApiList() + { + var apiList = new List(); + foreach (var item in _apiProvider.ApiDescriptionGroups.Items) + { + foreach (var apiDescription in item.Items) + { + var displayName = apiDescription.TryGetMethodInfo(out MethodInfo apiMethodInfo) ? apiMethodInfo.GetCustomAttribute(true)?.DisplayName : ""; + + apiList.Add(new ApiOutput + { + GroupName = item.GroupName, + DisplayName = displayName, + RouteName = apiDescription.RelativePath + }); + } + } + return apiList; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Config/Dto/ConfigInput.cs b/Admin.NET/Admin.NET.Core/Service/Config/Dto/ConfigInput.cs new file mode 100644 index 0000000..1fdc16b --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Config/Dto/ConfigInput.cs @@ -0,0 +1,41 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class ConfigInput : BaseIdInput +{ +} + +public class PageConfigInput : BasePageInput +{ + /// + /// 名称 + /// + public string Name { get; set; } + + /// + /// 编码 + /// + public string Code { get; set; } + + /// + /// 分组编码 + /// + public string GroupCode { get; set; } +} + +public class AddConfigInput : SysConfig +{ +} + +public class UpdateConfigInput : AddConfigInput +{ +} + +public class DeleteConfigInput : BaseIdInput +{ +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Config/SysConfigService.cs b/Admin.NET/Admin.NET.Core/Service/Config/SysConfigService.cs new file mode 100644 index 0000000..c51a586 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Config/SysConfigService.cs @@ -0,0 +1,190 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统参数配置服务 🧩 +/// +[ApiDescriptionSettings(Order = 440)] +public class SysConfigService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _sysConfigRep; + private readonly SysCacheService _sysCacheService; + + public SysConfigService(SqlSugarRepository sysConfigRep, + SysCacheService sysCacheService) + { + _sysConfigRep = sysConfigRep; + _sysCacheService = sysCacheService; + } + + /// + /// 获取参数配置分页列表 🔖 + /// + /// + /// + [DisplayName("获取参数配置分页列表")] + public async Task> Page(PageConfigInput input) + { + return await _sysConfigRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.Name?.Trim()), u => u.Name.Contains(input.Name)) + .WhereIF(!string.IsNullOrWhiteSpace(input.Code?.Trim()), u => u.Code.Contains(input.Code)) + .WhereIF(!string.IsNullOrWhiteSpace(input.GroupCode?.Trim()), u => u.GroupCode.Equals(input.GroupCode)) + .OrderBuilder(input) + .ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 获取参数配置列表 🔖 + /// + /// + [DisplayName("获取参数配置列表")] + public async Task> GetList() + { + return await _sysConfigRep.GetListAsync(); + } + + /// + /// 增加参数配置 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Add"), HttpPost] + [DisplayName("增加参数配置")] + public async Task AddConfig(AddConfigInput input) + { + var isExist = await _sysConfigRep.IsAnyAsync(u => u.Name == input.Name || u.Code == input.Code); + if (isExist) + throw Oops.Oh(ErrorCodeEnum.D9000); + + await _sysConfigRep.InsertAsync(input.Adapt()); + } + + /// + /// 更新参数配置 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Update"), HttpPost] + [DisplayName("更新参数配置")] + public async Task UpdateConfig(UpdateConfigInput input) + { + var isExist = await _sysConfigRep.IsAnyAsync(u => (u.Name == input.Name || u.Code == input.Code) && u.Id != input.Id); + if (isExist) + throw Oops.Oh(ErrorCodeEnum.D9000); + + var config = input.Adapt(); + await _sysConfigRep.AsUpdateable(config).IgnoreColumns(true).ExecuteCommandAsync(); + + _sysCacheService.Remove(config.Code); + } + + /// + /// 删除参数配置 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + [DisplayName("删除参数配置")] + public async Task DeleteConfig(DeleteConfigInput input) + { + var config = await _sysConfigRep.GetFirstAsync(u => u.Id == input.Id); + if (config.SysFlag == YesNoEnum.Y) // 禁止删除系统参数 + throw Oops.Oh(ErrorCodeEnum.D9001); + + await _sysConfigRep.DeleteAsync(config); + + _sysCacheService.Remove(config.Code); + } + + /// + /// 批量删除参数配置 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "BatchDelete"), HttpPost] + [DisplayName("批量删除参数配置")] + public async Task BatchDeleteConfig(List ids) + { + foreach (var id in ids) + { + var config = await _sysConfigRep.GetFirstAsync(u => u.Id == id); + if (config.SysFlag == YesNoEnum.Y) // 禁止删除系统参数 + continue; + + await _sysConfigRep.DeleteAsync(config); + + _sysCacheService.Remove(config.Code); + } + } + + /// + /// 获取参数配置详情 🔖 + /// + /// + /// + [DisplayName("获取参数配置详情")] + public async Task GetDetail([FromQuery] ConfigInput input) + { + return await _sysConfigRep.GetFirstAsync(u => u.Id == input.Id); + } + + /// + /// 获取参数配置值 + /// + /// + /// + [NonAction] + public async Task GetConfigValue(string code) + { + if (string.IsNullOrWhiteSpace(code)) return default; + + var value = _sysCacheService.Get(code); + if (string.IsNullOrEmpty(value)) + { + var config = await _sysConfigRep.GetFirstAsync(u => u.Code == code); + value = config != null ? config.Value : default; + _sysCacheService.Set(code, value); + } + if (string.IsNullOrWhiteSpace(value)) return default; + return (T)Convert.ChangeType(value, typeof(T)); + } + + /// + /// 获取分组列表 🔖 + /// + /// + [DisplayName("获取分组列表")] + public async Task> GetGroupList() + { + return await _sysConfigRep.AsQueryable().GroupBy(u => u.GroupCode).Select(u => u.GroupCode).ToListAsync(); + } + + /// + /// 获取 Token 过期时间 + /// + /// + [NonAction] + public async Task GetTokenExpire() + { + var tokenExpireStr = await GetConfigValue(CommonConst.SysTokenExpire); + _ = int.TryParse(tokenExpireStr, out var tokenExpire); + return tokenExpire == 0 ? 20 : tokenExpire; + } + + /// + /// 获取 RefreshToken 过期时间 + /// + /// + [NonAction] + public async Task GetRefreshTokenExpire() + { + var refreshTokenExpireStr = await GetConfigValue(CommonConst.SysRefreshTokenExpire); + _ = int.TryParse(refreshTokenExpireStr, out var refreshTokenExpire); + return refreshTokenExpire == 0 ? 40 : refreshTokenExpire; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Const/Dto/ConstOutput.cs b/Admin.NET/Admin.NET.Core/Service/Const/Dto/ConstOutput.cs new file mode 100644 index 0000000..698f957 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Const/Dto/ConstOutput.cs @@ -0,0 +1,25 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class ConstOutput +{ + /// + /// 名称 + /// + public string Name { get; set; } + + /// + /// 编码 + /// + public dynamic Code { get; set; } + + /// + /// 扩展字段 + /// + public dynamic Data { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Const/SysConstService.cs b/Admin.NET/Admin.NET.Core/Service/Const/SysConstService.cs new file mode 100644 index 0000000..2d901e9 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Const/SysConstService.cs @@ -0,0 +1,83 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统常量服务 🧩 +/// +[ApiDescriptionSettings(Order = 280)] +[AllowAnonymous] +public class SysConstService : IDynamicApiController, ITransient +{ + private readonly SysCacheService _sysCacheService; + + public SysConstService(SysCacheService sysCacheService) + { + _sysCacheService = sysCacheService; + } + + /// + /// 获取所有常量列表 🔖 + /// + /// + [DisplayName("获取所有常量列表")] + public async Task> GetList() + { + var key = $"{CacheConst.KeyConst}list"; + var constlist = _sysCacheService.Get>(key); + if (constlist == null) + { + var typeList = GetConstAttributeList(); + constlist = typeList.Select(u => new ConstOutput + { + Name = u.CustomAttributes.ToList().FirstOrDefault()?.ConstructorArguments.ToList().FirstOrDefault().Value?.ToString() ?? u.Name, + Code = u.Name, + Data = GetData(Convert.ToString(u.Name)) + }).ToList(); + _sysCacheService.Set(key, constlist); + } + return await Task.FromResult(constlist); + } + + /// + /// 根据类名获取常量数据 🔖 + /// + /// + /// + [DisplayName("根据类名获取常量数据")] + public async Task> GetData([Required] string typeName) + { + var key = $"{CacheConst.KeyConst}{typeName.ToUpper()}"; + var constlist = _sysCacheService.Get>(key); + if (constlist == null) + { + var typeList = GetConstAttributeList(); + var type = typeList.FirstOrDefault(u => u.Name == typeName); + + var isEnum = type.BaseType.Name == "Enum"; + constlist = type.GetFields()? + .Where(isEnum, u => u.FieldType.Name == typeName) + .Select(u => new ConstOutput + { + Name = u.Name, + Code = isEnum ? (int)u.GetValue(BindingFlags.Instance) : u.GetValue(BindingFlags.Instance) + }).ToList(); + _sysCacheService.Set(key, constlist); + } + return await Task.FromResult(constlist); + } + + /// + /// 获取常量特性类型列表 + /// + /// + private List GetConstAttributeList() + { + return AppDomain.CurrentDomain.GetAssemblies().SelectMany(u => u.GetTypes()) + .Where(u => u.CustomAttributes.Any(c => c.AttributeType == typeof(ConstAttribute))).ToList(); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/CreateEntityInput.cs b/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/CreateEntityInput.cs new file mode 100644 index 0000000..ffc3045 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/CreateEntityInput.cs @@ -0,0 +1,39 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class CreateEntityInput +{ + /// + /// 表名 + /// + /// student + public string TableName { get; set; } + + /// + /// 实体名 + /// + /// Student + public string EntityName { get; set; } + + /// + /// 基类名 + /// + /// AutoIncrementEntity + public string BaseClassName { get; set; } + + /// + /// 导出位置 + /// + /// Web.Application + public string Position { get; set; } + + /// + /// 库标识 + /// + public string ConfigId { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/CreateSeedDataInput.cs b/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/CreateSeedDataInput.cs new file mode 100644 index 0000000..e84385d --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/CreateSeedDataInput.cs @@ -0,0 +1,45 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class CreateSeedDataInput +{ + /// + /// 库标识 + /// + public string ConfigId { get; set; } + + /// + /// 表名 + /// + /// student + public string TableName { get; set; } + + /// + /// 实体名称 + /// + /// Student + public string EntityName { get; set; } + + /// + /// 种子名称 + /// + /// Student + public string SeedDataName { get; set; } + + /// + /// 导出位置 + /// + /// Web.Application + public string Position { get; set; } + + /// + /// 后缀 + /// + /// Web.Application + public string Suffix { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/DbColumnInput.cs b/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/DbColumnInput.cs new file mode 100644 index 0000000..b3f20c7 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/DbColumnInput.cs @@ -0,0 +1,52 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class DbColumnInput +{ + public string ConfigId { get; set; } + + public string TableName { get; set; } + + public string DbColumnName { get; set; } + + public string DataType { get; set; } + + public int Length { get; set; } + + public string ColumnDescription { get; set; } + + public int IsNullable { get; set; } + + public int IsIdentity { get; set; } + + public int IsPrimarykey { get; set; } + + public int DecimalDigits { get; set; } +} + +public class UpdateDbColumnInput +{ + public string ConfigId { get; set; } + + public string TableName { get; set; } + + public string ColumnName { get; set; } + + public string OldColumnName { get; set; } + + public string Description { get; set; } +} + +public class DeleteDbColumnInput +{ + public string ConfigId { get; set; } + + public string TableName { get; set; } + + public string DbColumnName { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/DbColumnOutput.cs b/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/DbColumnOutput.cs new file mode 100644 index 0000000..87e30b9 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/DbColumnOutput.cs @@ -0,0 +1,50 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class DbColumnOutput +{ + public string TableName { get; set; } + + public int TableId { get; set; } + + public string DbColumnName { get; set; } + + public string PropertyName { get; set; } + + public string DataType { get; set; } + + public object PropertyType { get; set; } + + public int Length { get; set; } + + public string ColumnDescription { get; set; } + + public string DefaultValue { get; set; } + + public bool IsNullable { get; set; } + + public bool IsIdentity { get; set; } + + public bool IsPrimarykey { get; set; } + + public object Value { get; set; } + + public int DecimalDigits { get; set; } + + public int Scale { get; set; } + + public bool IsArray { get; set; } + + public bool IsJson { get; set; } + + public bool? IsUnsigned { get; set; } + + public int CreateTableFieldSort { get; set; } + + internal object SqlParameterDbType { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/DbTableInput.cs b/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/DbTableInput.cs new file mode 100644 index 0000000..9c64d5d --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/DbTableInput.cs @@ -0,0 +1,36 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class DbTableInput +{ + public string ConfigId { get; set; } + + public string TableName { get; set; } + + public string Description { get; set; } + + public List DbColumnInfoList { get; set; } +} + +public class UpdateDbTableInput +{ + public string ConfigId { get; set; } + + public string TableName { get; set; } + + public string OldTableName { get; set; } + + public string Description { get; set; } +} + +public class DeleteDbTableInput +{ + public string ConfigId { get; set; } + + public string TableName { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/DbTableVisual.cs b/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/DbTableVisual.cs new file mode 100644 index 0000000..7349fee --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/DbTableVisual.cs @@ -0,0 +1,56 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 库表可视化 +/// +public class VisualDbTable +{ + public List VisualTableList { get; set; } + + public List VisualColumnList { get; set; } + + public List ColumnRelationList { get; set; } +} + +public class VisualTable +{ + public string TableName { get; set; } + + public string TableComents { get; set; } + + public int X { get; set; } + + public int Y { get; set; } +} + +public class VisualColumn +{ + public string TableName { get; set; } + + public string ColumnName { get; set; } + + public string DataType { get; set; } + + public string DataLength { get; set; } + + public string ColumnDescription { get; set; } +} + +public class ColumnRelation +{ + public string SourceTableName { get; set; } + + public string SourceColumnName { get; set; } + + public string Type { get; set; } + + public string TargetTableName { get; set; } + + public string TargetColumnName { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/JsonIgnoredPropertyData.cs b/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/JsonIgnoredPropertyData.cs new file mode 100644 index 0000000..4727626 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/JsonIgnoredPropertyData.cs @@ -0,0 +1,28 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 保存标注了JsonIgnore的Property的值信息 +/// +public class JsonIgnoredPropertyData +{ + /// + /// 记录索引 + /// + public int RecordIndex { get; set; } + + /// + /// 属性名 + /// + public string Name { get; set; } + + /// + /// 属性值描述 + /// + public string Value { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/DataBase/SysDatabaseService.cs b/Admin.NET/Admin.NET.Core/Service/DataBase/SysDatabaseService.cs new file mode 100644 index 0000000..4173413 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/DataBase/SysDatabaseService.cs @@ -0,0 +1,581 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using Npgsql; + +namespace Admin.NET.Core.Service; + +/// +/// 系统数据库管理服务 🧩 +/// +[ApiDescriptionSettings(Order = 250)] +public class SysDatabaseService : IDynamicApiController, ITransient +{ + private readonly ISqlSugarClient _db; + private readonly IViewEngine _viewEngine; + private readonly CodeGenOptions _codeGenOptions; + + public SysDatabaseService(ISqlSugarClient db, + IViewEngine viewEngine, + IOptions codeGenOptions) + { + _db = db; + _viewEngine = viewEngine; + _codeGenOptions = codeGenOptions.Value; + } + + /// + /// 获取库列表 🔖 + /// + /// + [DisplayName("获取库列表")] + public List GetList() + { + return App.GetOptions().ConnectionConfigs.Select(u => u.ConfigId.ToString()).ToList(); + } + + /// + /// 获取可视化库表结构 🔖 + /// + /// + [DisplayName("获取可视化库表结构")] + public VisualDbTable GetVisualDbTable() + { + var visualTableList = new List(); + var visualColumnList = new List(); + var columnRelationList = new List(); + + // 遍历所有实体获取所有库表结构 + var random = new Random(); + var entityTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass && u.IsDefined(typeof(SugarTable), false)).ToList(); + foreach (var entityType in entityTypes) + { + var entityInfo = _db.EntityMaintenance.GetEntityInfoNoCache(entityType); + + var visualTable = new VisualTable + { + TableName = entityInfo.DbTableName, + TableComents = entityInfo.TableDescription + entityInfo.DbTableName, + X = random.Next(5000), + Y = random.Next(5000) + }; + visualTableList.Add(visualTable); + + foreach (EntityColumnInfo columnInfo in entityInfo.Columns) + { + var visualColumn = new VisualColumn + { + TableName = columnInfo.DbTableName, + ColumnName = columnInfo.DbColumnName, + DataType = columnInfo.PropertyInfo.PropertyType.Name, + DataLength = columnInfo.Length.ToString(), + ColumnDescription = columnInfo.ColumnDescription, + }; + visualColumnList.Add(visualColumn); + + // 根据导航配置获取表之间关联关系 + if (columnInfo.Navigat != null) + { + var name1 = columnInfo.Navigat.GetName(); + var name2 = columnInfo.Navigat.GetName2(); + var relation = new ColumnRelation + { + SourceTableName = columnInfo.DbTableName, + SourceColumnName = name1, + Type = columnInfo.Navigat.GetNavigateType() == NavigateType.OneToOne ? "ONE_TO_ONE" : "ONE_TO_MANY", + TargetTableName = columnInfo.DbColumnName, + TargetColumnName = string.IsNullOrEmpty(name2) ? "Id" : name2 + }; + columnRelationList.Add(relation); + } + } + } + + return new VisualDbTable { VisualTableList = visualTableList, VisualColumnList = visualColumnList, ColumnRelationList = columnRelationList }; + } + + /// + /// 获取字段列表 🔖 + /// + /// 表名 + /// ConfigId + /// + [AllowAnonymous] + [DisplayName("获取字段列表")] + public List GetColumnList(string tableName, string configId = SqlSugarConst.MainConfigId) + { + var db = _db.AsTenant().GetConnectionScope(configId); + if (string.IsNullOrWhiteSpace(tableName)) + return new List(); + + return db.DbMaintenance.GetColumnInfosByTableName(tableName, false).Adapt>(); + } + + /// + /// 获取数据库数据类型列表 🔖 + /// + /// + /// + [DisplayName("获取数据库数据类型列表")] + public List GetDbTypeList(string configId = SqlSugarConst.MainConfigId) + { + var db = _db.AsTenant().GetConnectionScope(configId); + return db.DbMaintenance.GetDbTypes().OrderBy(u => u).ToList(); + } + + /// + /// 增加列 🔖 + /// + /// + [ApiDescriptionSettings(Name = "AddColumn"), HttpPost] + [DisplayName("增加列")] + public void AddColumn(DbColumnInput input) + { + var column = new DbColumnInfo + { + ColumnDescription = input.ColumnDescription, + DbColumnName = input.DbColumnName, + IsIdentity = input.IsIdentity == 1, + IsNullable = input.IsNullable == 1, + IsPrimarykey = input.IsPrimarykey == 1, + Length = input.Length, + DecimalDigits = input.DecimalDigits, + DataType = input.DataType + }; + var db = _db.AsTenant().GetConnectionScope(input.ConfigId); + db.DbMaintenance.AddColumn(input.TableName, column); + db.DbMaintenance.AddColumnRemark(input.DbColumnName, input.TableName, input.ColumnDescription); + if (column.IsPrimarykey) + db.DbMaintenance.AddPrimaryKey(input.TableName, input.DbColumnName); + } + + /// + /// 删除列 🔖 + /// + /// + [ApiDescriptionSettings(Name = "DeleteColumn"), HttpPost] + [DisplayName("删除列")] + public void DeleteColumn(DeleteDbColumnInput input) + { + var db = _db.AsTenant().GetConnectionScope(input.ConfigId); + db.DbMaintenance.DropColumn(input.TableName, input.DbColumnName); + } + + /// + /// 编辑列 🔖 + /// + /// + [ApiDescriptionSettings(Name = "UpdateColumn"), HttpPost] + [DisplayName("编辑列")] + public void UpdateColumn(UpdateDbColumnInput input) + { + var db = _db.AsTenant().GetConnectionScope(input.ConfigId); + db.DbMaintenance.RenameColumn(input.TableName, input.OldColumnName, input.ColumnName); + if (db.DbMaintenance.IsAnyColumnRemark(input.ColumnName, input.TableName)) + db.DbMaintenance.DeleteColumnRemark(input.ColumnName, input.TableName); + db.DbMaintenance.AddColumnRemark(input.ColumnName, input.TableName, string.IsNullOrWhiteSpace(input.Description) ? input.ColumnName : input.Description); + } + + /// + /// 获取表列表 🔖 + /// + /// ConfigId + /// + [DisplayName("获取表列表")] + public List GetTableList(string configId = SqlSugarConst.MainConfigId) + { + var db = _db.AsTenant().GetConnectionScope(configId); + return db.DbMaintenance.GetTableInfoList(false); + } + + /// + /// 增加表 🔖 + /// + /// + [ApiDescriptionSettings(Name = "AddTable"), HttpPost] + [DisplayName("增加表")] + public void AddTable(DbTableInput input) + { + if (input.DbColumnInfoList == null || !input.DbColumnInfoList.Any()) + throw Oops.Oh(ErrorCodeEnum.db1000); + + if (input.DbColumnInfoList.GroupBy(u => u.DbColumnName).Any(u => u.Count() > 1)) + throw Oops.Oh(ErrorCodeEnum.db1002); + + var config = App.GetOptions().ConnectionConfigs.FirstOrDefault(u => u.ConfigId.ToString() == input.ConfigId); + var db = _db.AsTenant().GetConnectionScope(input.ConfigId); + var typeBuilder = db.DynamicBuilder().CreateClass(input.TableName, new SugarTable() { TableName = input.TableName, TableDescription = input.Description }); + input.DbColumnInfoList.ForEach(u => + { + var dbColumnName = config.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(u.DbColumnName.Trim()) : u.DbColumnName.Trim(); + // 虚拟类都默认string类型,具体以列数据类型为准 + typeBuilder.CreateProperty(dbColumnName, typeof(string), new SugarColumn() + { + IsPrimaryKey = u.IsPrimarykey == 1, + IsIdentity = u.IsIdentity == 1, + ColumnDataType = u.DataType, + Length = u.Length, + IsNullable = u.IsNullable == 1, + DecimalDigits = u.DecimalDigits, + ColumnDescription = u.ColumnDescription, + }); + }); + db.CodeFirst.InitTables(typeBuilder.BuilderType()); + } + + /// + /// 删除表 🔖 + /// + /// + [ApiDescriptionSettings(Name = "DeleteTable"), HttpPost] + [DisplayName("删除表")] + public void DeleteTable(DeleteDbTableInput input) + { + var db = _db.AsTenant().GetConnectionScope(input.ConfigId); + db.DbMaintenance.DropTable(input.TableName); + } + + /// + /// 编辑表 🔖 + /// + /// + [ApiDescriptionSettings(Name = "UpdateTable"), HttpPost] + [DisplayName("编辑表")] + public void UpdateTable(UpdateDbTableInput input) + { + var db = _db.AsTenant().GetConnectionScope(input.ConfigId); + db.DbMaintenance.RenameTable(input.OldTableName, input.TableName); + try + { + if (db.DbMaintenance.IsAnyTableRemark(input.TableName)) + db.DbMaintenance.DeleteTableRemark(input.TableName); + else + db.DbMaintenance.AddTableRemark(input.TableName, input.Description); + } + catch (NotSupportedException ex) + { + throw Oops.Oh(ex.ToString()); + } + } + + /// + /// 创建实体 🔖 + /// + /// + [ApiDescriptionSettings(Name = "CreateEntity"), HttpPost] + [DisplayName("创建实体")] + public void CreateEntity(CreateEntityInput input) + { + var config = App.GetOptions().ConnectionConfigs.FirstOrDefault(u => u.ConfigId.ToString() == input.ConfigId); + input.Position = string.IsNullOrWhiteSpace(input.Position) ? "Admin.NET.Application" : input.Position; + input.EntityName = string.IsNullOrWhiteSpace(input.EntityName) ? (config.DbSettings.EnableUnderLine ? CodeGenUtil.CamelColumnName(input.TableName, null) : input.TableName) : input.EntityName; + string[] dbColumnNames = Array.Empty(); + // Entity.cs.vm中是允许创建没有基类的实体的,所以这里也要做出相同的判断 + if (!string.IsNullOrWhiteSpace(input.BaseClassName)) + { + _codeGenOptions.EntityBaseColumn.TryGetValue(input.BaseClassName, out dbColumnNames); + if (dbColumnNames is null || dbColumnNames is { Length: 0 }) + throw Oops.Oh("基类配置文件不存在此类型"); + } + var templatePath = GetEntityTemplatePath(); + var targetPath = GetEntityTargetPath(input); + var db = _db.AsTenant().GetConnectionScope(input.ConfigId); + DbTableInfo dbTableInfo = db.DbMaintenance.GetTableInfoList(false).FirstOrDefault(u => u.Name == input.TableName || u.Name == input.TableName.ToLower()) ?? throw Oops.Oh(ErrorCodeEnum.db1001); + List dbColumnInfos = db.DbMaintenance.GetColumnInfosByTableName(input.TableName, false); + dbColumnInfos.ForEach(u => + { + u.PropertyName = config.DbSettings.EnableUnderLine ? CodeGenUtil.CamelColumnName(u.DbColumnName, dbColumnNames) : u.DbColumnName; // 转下划线后的列名需要再转回来 + u.DataType = CodeGenUtil.ConvertDataType(u, config.DbType); + }); + if (_codeGenOptions.BaseEntityNames.Contains(input.BaseClassName, StringComparer.OrdinalIgnoreCase)) + dbColumnInfos = dbColumnInfos.Where(u => !dbColumnNames.Contains(u.PropertyName, StringComparer.OrdinalIgnoreCase)).ToList(); + + var tContent = File.ReadAllText(templatePath); + var tResult = _viewEngine.RunCompileFromCached(tContent, new + { + NameSpace = $"{input.Position}.Entity", + input.TableName, + input.EntityName, + BaseClassName = string.IsNullOrWhiteSpace(input.BaseClassName) ? "" : $" : {input.BaseClassName}", + input.ConfigId, + dbTableInfo.Description, + TableField = dbColumnInfos + }); + File.WriteAllText(targetPath, tResult, Encoding.UTF8); + } + + /// + /// 创建种子数据 🔖 + /// + /// + [ApiDescriptionSettings(Name = "CreateSeedData"), HttpPost] + [DisplayName("创建种子数据")] + public async void CreateSeedData(CreateSeedDataInput input) + { + var config = App.GetOptions().ConnectionConfigs.FirstOrDefault(u => u.ConfigId.ToString() == input.ConfigId); + input.Position = string.IsNullOrWhiteSpace(input.Position) ? "Admin.NET.Core" : input.Position; + + var templatePath = GetSeedDataTemplatePath(); + var db = _db.AsTenant().GetConnectionScope(input.ConfigId); + var tableInfo = db.DbMaintenance.GetTableInfoList(false).First(u => u.Name == input.TableName); // 表名 + List dbColumnInfos = db.DbMaintenance.GetColumnInfosByTableName(input.TableName, false); // 所有字段 + IEnumerable entityInfos = await GetEntityInfos(); + Type entityType = null; + foreach (var item in entityInfos) + { + if (tableInfo.Name.ToLower() != (config.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(item.DbTableName) : item.DbTableName).ToLower()) continue; + entityType = item.Type; + break; + } + + input.EntityName = entityType.Name; + input.SeedDataName = entityType.Name + "SeedData"; + if (!string.IsNullOrWhiteSpace(input.Suffix)) + input.SeedDataName += input.Suffix; + var targetPath = GetSeedDataTargetPath(input); + + // 查询所有数据 + var query = db.QueryableByObject(entityType); + DbColumnInfo orderField = null; // 排序字段 + // 优先用创建时间排序 + orderField = dbColumnInfos.Where(u => u.DbColumnName.ToLower() == "create_time" || u.DbColumnName.ToLower() == "createtime").FirstOrDefault(); + if (orderField != null) + query.OrderBy(orderField.DbColumnName); + // 其次用Id排序 + orderField = dbColumnInfos.Where(u => u.DbColumnName.ToLower() == "id").FirstOrDefault(); + if (orderField != null) + query.OrderBy(orderField.DbColumnName); + object records = query.ToList(); + var timeConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" }; + var recordsJSON = JsonConvert.SerializeObject(records, Formatting.Indented, timeConverter); + + // 检查有没有 System.Text.Json.Serialization.JsonIgnore 的属性 + var jsonIgnoreProperties = entityType.GetProperties().Where(p => (p.GetAttribute() != null || + p.GetAttribute() != null) && p.GetAttribute() != null).ToList(); + var jsonIgnoreInfo = new List>(); + if (jsonIgnoreProperties.Count > 0) + { + int recordIndex = 0; + foreach (var r in (IEnumerable)records) + { + List record = new(); + foreach (var item in jsonIgnoreProperties) + { + object v = item.GetValue(r); + string strValue = "null"; + if (v != null) + { + strValue = v.ToString(); + if (v.GetType() == typeof(string)) + strValue = "\"" + strValue + "\""; + else if (v.GetType() == typeof(DateTime)) + strValue = "DateTime.Parse(\"" + ((DateTime)v).ToString("yyyy-MM-dd HH:mm:ss") + "\")"; + } + record.Add(new JsonIgnoredPropertyData { RecordIndex = recordIndex, Name = item.Name, Value = strValue }); + } + recordIndex++; + jsonIgnoreInfo.Add(record); + } + } + + var tContent = File.ReadAllText(templatePath); + var data = new + { + NameSpace = $"{input.Position}.SeedData", + EntityNameSpace = entityType.Namespace, + input.TableName, + input.EntityName, + input.SeedDataName, + input.ConfigId, + tableInfo.Description, + JsonIgnoreInfo = jsonIgnoreInfo, + RecordsJSON = recordsJSON + }; + var tResult = _viewEngine.RunCompile(tContent, data, builderAction: builder => + { + builder.AddAssemblyReferenceByName("System.Linq"); + builder.AddAssemblyReferenceByName("System.Collections"); + builder.AddUsing("System.Collections.Generic"); + builder.AddUsing("System.Linq"); + }); + File.WriteAllText(targetPath, tResult, Encoding.UTF8); + } + + /// + /// 获取库表信息 + /// + /// + private async Task> GetEntityInfos() + { + var entityInfos = new List(); + + var type = typeof(SugarTable); + var types = new List(); + if (_codeGenOptions.EntityAssemblyNames != null) + { + foreach (var assemblyName in _codeGenOptions.EntityAssemblyNames) + { + Assembly asm = Assembly.Load(assemblyName); + types.AddRange(asm.GetExportedTypes().ToList()); + } + } + bool IsMyAttribute(Attribute[] o) + { + foreach (Attribute a in o) + { + if (a.GetType() == type) + return true; + } + return false; + } + Type[] cosType = types.Where(o => + { + return IsMyAttribute(Attribute.GetCustomAttributes(o, true)); + } + ).ToArray(); + + foreach (var c in cosType) + { + var sugarAttribute = c.GetCustomAttributes(type, true)?.FirstOrDefault(); + + var des = c.GetCustomAttributes(typeof(DescriptionAttribute), true); + var description = ""; + if (des.Length > 0) + { + description = ((DescriptionAttribute)des[0]).Description; + } + entityInfos.Add(new EntityInfo() + { + EntityName = c.Name, + DbTableName = sugarAttribute == null ? c.Name : ((SugarTable)sugarAttribute).TableName, + TableDescription = description, + Type = c + }); + } + return await Task.FromResult(entityInfos); + } + + /// + /// 获取实体模板文件路径 + /// + /// + private static string GetEntityTemplatePath() + { + var templatePath = Path.Combine(App.WebHostEnvironment.WebRootPath, "Template"); + return Path.Combine(templatePath, "Entity.cs.vm"); + } + + /// + /// 获取种子数据模板文件路径 + /// + /// + private static string GetSeedDataTemplatePath() + { + var templatePath = Path.Combine(App.WebHostEnvironment.WebRootPath, "Template"); + return Path.Combine(templatePath, "SeedData.cs.vm"); + } + + /// + /// 设置生成实体文件路径 + /// + /// + /// + private static string GetEntityTargetPath(CreateEntityInput input) + { + var backendPath = Path.Combine(new DirectoryInfo(App.WebHostEnvironment.ContentRootPath).Parent.FullName, input.Position, "Entity"); + if (!Directory.Exists(backendPath)) + Directory.CreateDirectory(backendPath); + return Path.Combine(backendPath, input.EntityName + ".cs"); + } + + /// + /// 设置生成种子数据文件路径 + /// + /// + /// + private static string GetSeedDataTargetPath(CreateSeedDataInput input) + { + var backendPath = Path.Combine(new DirectoryInfo(App.WebHostEnvironment.ContentRootPath).Parent.FullName, input.Position, "SeedData"); + if (!Directory.Exists(backendPath)) + Directory.CreateDirectory(backendPath); + return Path.Combine(backendPath, input.SeedDataName + ".cs"); + } + + /// + /// 备份数据库(PostgreSQL)🔖 + /// + /// + [HttpPost, NonUnify] + [DisplayName("备份数据库(PostgreSQL)")] + public async Task BackupDatabase() + { + if (_db.CurrentConnectionConfig.DbType != SqlSugar.DbType.PostgreSQL) + throw Oops.Oh("只支持 PostgreSQL 数据库 😁"); + + var npgsqlConn = new NpgsqlConnectionStringBuilder(_db.CurrentConnectionConfig.ConnectionString); + if (npgsqlConn == null || string.IsNullOrWhiteSpace(npgsqlConn.Host) || string.IsNullOrWhiteSpace(npgsqlConn.Username) || string.IsNullOrWhiteSpace(npgsqlConn.Password) || string.IsNullOrWhiteSpace(npgsqlConn.Database)) + throw Oops.Oh("PostgreSQL 数据库配置错误"); + + // 确保备份目录存在 + var backupDirectory = Path.Combine(Directory.GetCurrentDirectory(), "backups"); + Directory.CreateDirectory(backupDirectory); + + // 构建备份文件名 + string backupFileName = $"backup_{DateTime.Now:yyyyMMddHHmmss}.sql"; + string backupFilePath = Path.Combine(backupDirectory, backupFileName); + + // 启动pg_dump进程进行备份 + // 设置密码:export PGPASSWORD='xxxxxx' + var bash = $"-U {npgsqlConn.Username} -h {npgsqlConn.Host} -p {npgsqlConn.Port} -E UTF8 -F c -b -v -f {backupFilePath} {npgsqlConn.Database}"; + var startInfo = new ProcessStartInfo + { + FileName = "pg_dump", + Arguments = bash, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true, + EnvironmentVariables = + { + ["PGPASSWORD"] = npgsqlConn.Password + } + }; + + //_logger.LogInformation("备份数据库:pg_dump " + bash); + + //try + //{ + using (var backupProcess = Process.Start(startInfo)) + { + await backupProcess.WaitForExitAsync(); + + //var output = await backupProcess.StandardOutput.ReadToEndAsync(); + //var error = await backupProcess.StandardError.ReadToEndAsync(); + + // 检查备份是否成功 + if (backupProcess.ExitCode != 0) + { + throw Oops.Oh($"备份失败:ExitCode({backupProcess.ExitCode})"); + } + } + + // _logger.LogInformation($"备份成功:{backupFilePath}"); + //} + //catch (Exception ex) + //{ + // _logger.LogError(ex, $"备份失败:"); + // throw; + //} + + // 若备份成功则提供下载链接 + return new FileStreamResult(new FileStream(backupFilePath, FileMode.Open), "application/octet-stream") + { + FileDownloadName = backupFileName + }; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Dict/Dto/DictDataInput.cs b/Admin.NET/Admin.NET.Core/Service/Dict/Dto/DictDataInput.cs new file mode 100644 index 0000000..eccdff3 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Dict/Dto/DictDataInput.cs @@ -0,0 +1,68 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class DictDataInput : BaseIdInput +{ + /// + /// 状态 + /// + public StatusEnum Status { get; set; } +} + +public class PageDictDataInput : BasePageInput +{ + /// + /// 字典类型Id + /// + public long DictTypeId { get; set; } + + /// + /// 值 + /// + public string Value { get; set; } + + /// + /// 编码 + /// + public string Code { get; set; } +} + +public class AddDictDataInput : SysDictData +{ +} + +public class UpdateDictDataInput : AddDictDataInput +{ +} + +public class DeleteDictDataInput : BaseIdInput +{ +} + +public class GetDataDictDataInput +{ + /// + /// 字典类型Id + /// + [Required(ErrorMessage = "字典类型Id不能为空"), DataValidation(ValidationTypes.Numeric)] + public long DictTypeId { get; set; } +} + +public class QueryDictDataInput +{ + /// + /// 编码 + /// + [Required(ErrorMessage = "字典唯一编码不能为空")] + public string Code { get; set; } + + /// + /// 状态 + /// + public int? Status { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Dict/Dto/DictTypeInput.cs b/Admin.NET/Admin.NET.Core/Service/Dict/Dto/DictTypeInput.cs new file mode 100644 index 0000000..7884ada --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Dict/Dto/DictTypeInput.cs @@ -0,0 +1,49 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class DictTypeInput : BaseIdInput +{ + /// + /// 状态 + /// + public StatusEnum Status { get; set; } +} + +public class PageDictTypeInput : BasePageInput +{ + /// + /// 名称 + /// + public string Name { get; set; } + + /// + /// 编码 + /// + public string Code { get; set; } +} + +public class AddDictTypeInput : SysDictType +{ +} + +public class UpdateDictTypeInput : AddDictTypeInput +{ +} + +public class DeleteDictTypeInput : BaseIdInput +{ +} + +public class GetDataDictTypeInput +{ + /// + /// 编码 + /// + [Required(ErrorMessage = "字典类型编码不能为空")] + public string Code { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Dict/SysDictDataService.cs b/Admin.NET/Admin.NET.Core/Service/Dict/SysDictDataService.cs new file mode 100644 index 0000000..1b84478 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Dict/SysDictDataService.cs @@ -0,0 +1,202 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统字典值服务 🧩 +/// +[ApiDescriptionSettings(Order = 420)] +[AllowAnonymous] +public class SysDictDataService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _sysDictTypeRep; + private readonly SqlSugarRepository _sysDictDataRep; + + public SysDictDataService(SqlSugarRepository sysDictDataRep, SqlSugarRepository sysDictTypeRep) + { + _sysDictDataRep = sysDictDataRep; + _sysDictTypeRep = sysDictTypeRep; + } + + /// + /// 获取字典值分页列表 🔖 + /// + /// + /// + [DisplayName("获取字典值分页列表")] + public async Task> Page(PageDictDataInput input) + { + return await _sysDictDataRep.AsQueryable() + .Where(u => u.DictTypeId == input.DictTypeId) + .WhereIF(!string.IsNullOrEmpty(input.Code?.Trim()), u => u.Code.Contains(input.Code)) + .WhereIF(!string.IsNullOrEmpty(input.Value?.Trim()), u => u.Value.Contains(input.Value)) + .OrderBy(u => new { u.OrderNo, u.Code }) + .ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 获取字典值列表 🔖 + /// + /// + [DisplayName("获取字典值列表")] + public async Task> GetList([FromQuery] GetDataDictDataInput input) + { + return await GetDictDataListByDictTypeId(input.DictTypeId); + } + + /// + /// 增加字典值 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Add"), HttpPost] + [DisplayName("增加字典值")] + public async Task AddDictData(AddDictDataInput input) + { + var isExist = await _sysDictDataRep.IsAnyAsync(u => u.Code == input.Code && u.DictTypeId == input.DictTypeId); + if (isExist) + throw Oops.Oh(ErrorCodeEnum.D3003); + + await _sysDictDataRep.InsertAsync(input.Adapt()); + } + + /// + /// 更新字典值 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Update"), HttpPost] + [DisplayName("更新字典值")] + public async Task UpdateDictData(UpdateDictDataInput input) + { + var isExist = await _sysDictDataRep.IsAnyAsync(u => u.Id == input.Id); + if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3004); + + isExist = await _sysDictDataRep.IsAnyAsync(u => u.Code == input.Code && u.DictTypeId == input.DictTypeId && u.Id != input.Id); + if (isExist) throw Oops.Oh(ErrorCodeEnum.D3003); + + await _sysDictDataRep.UpdateAsync(input.Adapt()); + } + + /// + /// 删除字典值 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + [DisplayName("删除字典值")] + public async Task DeleteDictData(DeleteDictDataInput input) + { + var dictData = await _sysDictDataRep.GetFirstAsync(u => u.Id == input.Id); + if (dictData == null) + throw Oops.Oh(ErrorCodeEnum.D3004); + + await _sysDictDataRep.DeleteAsync(dictData); + } + + /// + /// 获取字典值详情 🔖 + /// + /// + /// + [DisplayName("获取字典值详情")] + public async Task GetDetail([FromQuery] DictDataInput input) + { + return await _sysDictDataRep.GetFirstAsync(u => u.Id == input.Id); + } + + + + /// + /// GetDicStatus 🔖 + /// + /// + /// + [DisplayName("GetDicStatus")] + [AllowAnonymous] + public async Task GetDicStatus([FromQuery] DictDataInput input) + { + return await _sysDictTypeRep.GetFirstAsync(u => u.Id == input.Id); + } + + + + /// + /// 修改字典值状态 🔖 + /// + /// + /// + [DisplayName("修改字典值状态")] + public async Task SetStatus(DictDataInput input) + { + var dictData = await _sysDictDataRep.GetFirstAsync(u => u.Id == input.Id); + if (dictData == null) + throw Oops.Oh(ErrorCodeEnum.D3004); + + if (!Enum.IsDefined(typeof(StatusEnum), input.Status)) + throw Oops.Oh(ErrorCodeEnum.D3005); + + dictData.Status = input.Status; + await _sysDictDataRep.UpdateAsync(dictData); + } + + /// + /// 根据字典类型Id获取字典值集合 + /// + /// + /// + [NonAction] + public async Task> GetDictDataListByDictTypeId(long dictTypeId) + { + return await _sysDictDataRep.AsQueryable() + .Where(u => u.DictTypeId == dictTypeId) + .OrderBy(u => new { u.OrderNo, u.Code }) + .ToListAsync(); + } + + /// + /// 根据字典类型编码获取字典值集合 🔖 + /// + /// + /// + [DisplayName("根据字典类型编码获取字典值集合")] + public async Task> GetDataList(string code) + { + return await _sysDictDataRep.Context.Queryable() + .LeftJoin((u, a) => u.Id == a.DictTypeId) + .Where((u, a) => u.Code == code && u.Status == StatusEnum.Enable && a.Status == StatusEnum.Enable) + .OrderBy((u, a) => new { a.OrderNo, a.Code }) + .Select((u, a) => a).ToListAsync(); + } + + /// + /// 根据查询条件获取字典值集合 🔖 + /// + /// + /// + [DisplayName("根据查询条件获取字典值集合")] + public async Task> GetDataList([FromQuery] QueryDictDataInput input) + { + return await _sysDictDataRep.Context.Queryable() + .LeftJoin((u, a) => u.Id == a.DictTypeId) + .Where((u, a) => u.Code == input.Code) + .WhereIF(input.Status.HasValue, (u, a) => a.Status == (StatusEnum)input.Status.Value) + .OrderBy((u, a) => new { a.OrderNo, a.Code }) + .Select((u, a) => a).ToListAsync(); + } + + /// + /// 根据字典类型Id删除字典值 + /// + /// + /// + [NonAction] + public async Task DeleteDictData(long dictTypeId) + { + await _sysDictDataRep.DeleteAsync(u => u.DictTypeId == dictTypeId); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Dict/SysDictTypeService.cs b/Admin.NET/Admin.NET.Core/Service/Dict/SysDictTypeService.cs new file mode 100644 index 0000000..63a4553 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Dict/SysDictTypeService.cs @@ -0,0 +1,173 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统字典类型服务 🧩 +/// +[ApiDescriptionSettings(Order = 430)] +[AllowAnonymous] +public class SysDictTypeService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _sysDictTypeRep; + private readonly SysDictDataService _sysDictDataService; + + public SysDictTypeService(SqlSugarRepository sysDictTypeRep, + SysDictDataService sysDictDataService) + { + _sysDictTypeRep = sysDictTypeRep; + _sysDictDataService = sysDictDataService; + } + + /// + /// 获取字典类型分页列表 🔖 + /// + /// + [DisplayName("获取字典类型分页列表")] + public async Task> Page(PageDictTypeInput input) + { + return await _sysDictTypeRep.AsQueryable() + .WhereIF(!string.IsNullOrEmpty(input.Code?.Trim()), u => u.Code.Contains(input.Code)) + .WhereIF(!string.IsNullOrEmpty(input.Name?.Trim()), u => u.Name.Contains(input.Name)) + .OrderBy(u => new { u.OrderNo, u.Code }) + .ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 获取字典类型列表 🔖 + /// + /// + [DisplayName("获取字典类型列表")] + public async Task> GetList() + { + return await _sysDictTypeRep.AsQueryable().OrderBy(u => new { u.OrderNo, u.Code }).ToListAsync(); + } + + /// + /// 获取字典类型-值列表 🔖 + /// + /// + /// + [AllowAnonymous] + [DisplayName("获取字典类型-值列表")] + public async Task> GetDataList([FromQuery] GetDataDictTypeInput input) + { + var dictType = await _sysDictTypeRep.GetFirstAsync(u => u.Code == input.Code); + if (dictType == null) + throw Oops.Oh(ErrorCodeEnum.D3000); + + return await _sysDictDataService.GetDictDataListByDictTypeId(dictType.Id); + } + + /// + /// 添加字典类型 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Add"), HttpPost] + [DisplayName("添加字典类型")] + public async Task AddDictType(AddDictTypeInput input) + { + var isExist = await _sysDictTypeRep.IsAnyAsync(u => u.Code == input.Code); + if (isExist) + throw Oops.Oh(ErrorCodeEnum.D3001); + + await _sysDictTypeRep.InsertAsync(input.Adapt()); + } + + /// + /// 更新字典类型 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Update"), HttpPost] + [DisplayName("更新字典类型")] + public async Task UpdateDictType(UpdateDictTypeInput input) + { + var isExist = await _sysDictTypeRep.IsAnyAsync(u => u.Id == input.Id); + if (!isExist) + throw Oops.Oh(ErrorCodeEnum.D3000); + + isExist = await _sysDictTypeRep.IsAnyAsync(u => u.Code == input.Code && u.Id != input.Id); + if (isExist) + throw Oops.Oh(ErrorCodeEnum.D3001); + + await _sysDictTypeRep.UpdateAsync(input.Adapt()); + } + + /// + /// 删除字典类型 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + [DisplayName("删除字典类型")] + public async Task DeleteDictType(DeleteDictTypeInput input) + { + var dictType = await _sysDictTypeRep.GetFirstAsync(u => u.Id == input.Id); + if (dictType == null) + throw Oops.Oh(ErrorCodeEnum.D3000); + + // 删除字典值 + await _sysDictTypeRep.DeleteAsync(dictType); + await _sysDictDataService.DeleteDictData(input.Id); + } + + /// + /// 获取字典类型详情 🔖 + /// + /// + /// + [DisplayName("获取字典类型详情")] + public async Task GetDetail([FromQuery] DictTypeInput input) + { + return await _sysDictTypeRep.GetFirstAsync(u => u.Id == input.Id); + } + + + + + + + + + /// + /// 修改字典类型状态 🔖 + /// + /// + /// + [DisplayName("修改字典类型状态")] + public async Task SetStatus(DictTypeInput input) + { + var dictType = await _sysDictTypeRep.GetFirstAsync(u => u.Id == input.Id); + if (dictType == null) + throw Oops.Oh(ErrorCodeEnum.D3000); + + if (!Enum.IsDefined(typeof(StatusEnum), input.Status)) + throw Oops.Oh(ErrorCodeEnum.D3005); + + dictType.Status = input.Status; + await _sysDictTypeRep.UpdateAsync(dictType); + } + + /// + /// 获取所有字典集合 🔖 + /// + /// + [AllowAnonymous] + [DisplayName("获取所有字典集合")] + public async Task> GetAllDictList() + { + var dictList = await _sysDictTypeRep.AsQueryable() + .Includes(u => u.Children) + .OrderBy(u => new { u.OrderNo, u.Code }) + .ToListAsync(); + // 字典数据项排序 + dictList.ForEach(u => u.Children = u.Children.OrderBy(c => c.OrderNo).ThenBy(c => c.Code).ToList()); + return dictList; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Enum/Dto/EnumInput.cs b/Admin.NET/Admin.NET.Core/Service/Enum/Dto/EnumInput.cs new file mode 100644 index 0000000..64506bb --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Enum/Dto/EnumInput.cs @@ -0,0 +1,37 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 枚举输入参数 +/// +public class EnumInput +{ + /// + /// 枚举类型名称 + /// + /// AccountTypeEnum + [Required(ErrorMessage = "枚举类型不能为空")] + public string EnumName { get; set; } +} + +public class QueryEnumDataInput +{ + /// + /// 实体名称 + /// + /// SysUser + [Required(ErrorMessage = "实体名称不能为空")] + public string EntityName { get; set; } + + /// + /// 字段名称 + /// + /// AccountType + [Required(ErrorMessage = "字段名称不能为空")] + public string FieldName { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Enum/Dto/EnumOutput.cs b/Admin.NET/Admin.NET.Core/Service/Enum/Dto/EnumOutput.cs new file mode 100644 index 0000000..f7b9006 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Enum/Dto/EnumOutput.cs @@ -0,0 +1,33 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 枚举类型输出参数 +/// +public class EnumTypeOutput +{ + /// + /// 枚举类型描述 + /// + public string TypeDescribe { get; set; } + + /// + /// 枚举类型名称 + /// + public string TypeName { get; set; } + + /// + /// 枚举类型备注 + /// + public string TypeRemark { get; set; } + + /// + /// 枚举实体 + /// + public List EnumEntities { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Enum/SysEnumService.cs b/Admin.NET/Admin.NET.Core/Service/Enum/SysEnumService.cs new file mode 100644 index 0000000..0a1481a --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Enum/SysEnumService.cs @@ -0,0 +1,97 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统枚举服务 🧩 +/// +[ApiDescriptionSettings(Order = 275)] +[AllowAnonymous] +public class SysEnumService : IDynamicApiController, ITransient +{ + private readonly EnumOptions _enumOptions; + + public SysEnumService(IOptions enumOptions) + { + _enumOptions = enumOptions.Value; + } + + /// + /// 获取所有枚举类型 🔖 + /// + /// + [DisplayName("获取所有枚举类型")] + public List GetEnumTypeList() + { + var enumTypeList = App.EffectiveTypes.Where(u => u.IsEnum && _enumOptions.EntityAssemblyNames.Contains(u.Assembly.GetName().Name)).OrderBy(u => u.Name).OrderBy(u => u.FullName).ToList(); + + var result = new List(); + foreach (var item in enumTypeList) + { + result.Add(GetEnumDescription(item)); + } + return result; + } + + /// + /// 获取字典描述 + /// + /// + /// + private static EnumTypeOutput GetEnumDescription(Type type) + { + string description = type.Name; + var attrs = type.GetCustomAttributes(typeof(DescriptionAttribute), false); + if (attrs.Any()) + { + var att = ((DescriptionAttribute[])attrs)[0]; + description = att.Description; + } + var enumType = App.EffectiveTypes.FirstOrDefault(t => t.IsEnum && t.Name == type.Name); + return new EnumTypeOutput + { + TypeDescribe = description, + TypeName = type.Name, + TypeRemark = description, + EnumEntities = enumType.EnumToList() + }; + } + + /// + /// 通过枚举类型获取枚举值集合 🔖 + /// + /// + /// + [DisplayName("通过枚举类型获取枚举值集合")] + public List GetEnumDataList([FromQuery] EnumInput input) + { + var enumType = App.EffectiveTypes.FirstOrDefault(u => u.IsEnum && u.Name == input.EnumName); + if (enumType is not { IsEnum: true }) + throw Oops.Oh(ErrorCodeEnum.D1503); + + return enumType.EnumToList(); + } + + /// + /// 通过实体的字段名获取相关枚举值集合(目前仅支持枚举类型) 🔖 + /// + /// + /// + [DisplayName("通过实体的字段名获取相关枚举值集合")] + public static List GetEnumDataListByField([FromQuery] QueryEnumDataInput input) + { + // 获取实体类型属性 + Type entityType = App.EffectiveTypes.FirstOrDefault(u => u.Name == input.EntityName) ?? throw Oops.Oh(ErrorCodeEnum.D1504); + + // 获取字段类型 + var fieldType = entityType.GetProperties().FirstOrDefault(u => u.Name == input.FieldName)?.PropertyType; + if (fieldType is not { IsEnum: true }) + throw Oops.Oh(ErrorCodeEnum.D1503); + + return fieldType.EnumToList(); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/File/Dto/FileInput.cs b/Admin.NET/Admin.NET.Core/Service/File/Dto/FileInput.cs new file mode 100644 index 0000000..02aaf87 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/File/Dto/FileInput.cs @@ -0,0 +1,65 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class FileInput : BaseIdInput +{ + /// + /// 文件名称 + /// + public string FileName { get; set; } + + /// + /// 文件Url + /// + public string? Url { get; set; } +} + +public class PageFileInput : BasePageInput +{ + /// + /// 文件名称 + /// + public string FileName { get; set; } + + /// + /// 开始时间 + /// + public DateTime? StartTime { get; set; } + + /// + /// 结束时间 + /// + public DateTime? EndTime { get; set; } +} + +public class DeleteFileInput : BaseIdInput +{ +} + +public class UploadFileFromBase64Input +{ + /// + /// 文件内容 + /// + public string FileDataBase64 { get; set; } + + /// + /// 文件类型( "image/jpeg",) + /// + public string ContentType { get; set; } + + /// + /// 文件名称 + /// + public string FileName { get; set; } + + /// + /// 保存路径 + /// + public string Path { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/File/SysFileService.cs b/Admin.NET/Admin.NET.Core/Service/File/SysFileService.cs new file mode 100644 index 0000000..ba9b612 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/File/SysFileService.cs @@ -0,0 +1,452 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Aliyun.OSS.Util; +using Flurl.Http; +using Furion.VirtualFileServer; +using OnceMi.AspNetCore.OSS; + +namespace Admin.NET.Core.Service; + +/// +/// 系统文件服务 🧩 +/// +[ApiDescriptionSettings(Order = 410)] +public class SysFileService : IDynamicApiController, ITransient +{ + private readonly UserManager _userManager; + private readonly SqlSugarRepository _sysFileRep; + private readonly OSSProviderOptions _OSSProviderOptions; + private readonly UploadOptions _uploadOptions; + private readonly IOSSService _OSSService; + private readonly string _imageType = ".jpg.png.bmp.gif.tif"; + + public SysFileService(UserManager userManager, + SqlSugarRepository sysFileRep, + IOptions oSSProviderOptions, + IOptions uploadOptions, + IOSSServiceFactory ossServiceFactory) + { + _userManager = userManager; + _sysFileRep = sysFileRep; + _OSSProviderOptions = oSSProviderOptions.Value; + _uploadOptions = uploadOptions.Value; + if (_OSSProviderOptions.IsEnable) + _OSSService = ossServiceFactory.Create(Enum.GetName(_OSSProviderOptions.Provider)); + } + + /// + /// 获取文件分页列表 🔖 + /// + /// + /// + [DisplayName("获取文件分页列表")] + public async Task> Page(PageFileInput input) + { + return await _sysFileRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.FileName), u => u.FileName.Contains(input.FileName.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()) && !string.IsNullOrWhiteSpace(input.EndTime.ToString()), + u => u.CreateTime >= input.StartTime && u.CreateTime <= input.EndTime) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 上传文件 🔖 + /// + /// + /// + /// + [DisplayName("上传文件")] + public async Task UploadFile([Required] IFormFile file, [FromQuery] string? path) + { + return await HandleUploadFile(file, path); + } + + [DisplayName("上传文件(自定义名称)")] + public async Task UploadFileReName([Required] IFormFile file, [FromQuery] string? path, string newfilename) + { + return await HandleUploadFile(file, path, ".json", newfilename); + } + + /// + /// 上传文件Base64 + /// + /// + /// + /// + /// + /// + private async Task UploadFileFromBase64(string strBase64, string fileName, string contentType, string? path) + { + byte[] fileData = Convert.FromBase64String(strBase64); + var ms = new MemoryStream(); + ms.Write(fileData); + ms.Seek(0, SeekOrigin.Begin); + if (string.IsNullOrEmpty(fileName)) + fileName = $"{YitIdHelper.NextId()}.jpg"; + if (string.IsNullOrEmpty(contentType)) + contentType = "image/jpg"; + IFormFile formFile = new FormFile(ms, 0, fileData.Length, "file", fileName) + { + Headers = new HeaderDictionary(), + ContentType = contentType + }; + return await UploadFile(formFile, path); + } + + /// + /// 上传文件Base64 🔖 + /// + /// + /// + [DisplayName("上传文件Base64")] + [HttpPost] + public async Task UploadFileFromBase64(UploadFileFromBase64Input input) + { + return await UploadFileFromBase64(input.FileDataBase64, input.FileName, input.ContentType, input.Path); + } + + /// + /// 上传多文件 🔖 + /// + /// + /// + [DisplayName("上传多文件")] + public async Task> UploadFiles([Required] List files) + { + var filelist = new List(); + foreach (var file in files) + { + filelist.Add(await UploadFile(file, "")); + } + return filelist; + } + + /// + /// 根据文件Id或Url下载 🔖 + /// + /// + /// + [DisplayName("根据文件Id或Url下载")] + public async Task DownloadFile(FileInput input) + { + var file = input.Id > 0 ? await GetFile(input) : await _sysFileRep.GetFirstAsync(u => u.Url == input.Url); + var fileName = HttpUtility.UrlEncode(file.FileName, Encoding.GetEncoding("UTF-8")); + if (_OSSProviderOptions.IsEnable) + { + var filePath = string.Concat(file.FilePath, "/", file.Id.ToString() + file.Suffix); + var stream = await (await _OSSService.PresignedGetObjectAsync(file.BucketName.ToString(), filePath, 5)).GetStreamAsync(); + return new FileStreamResult(stream, "application/octet-stream") { FileDownloadName = fileName + file.Suffix }; + } + else + { + var filePath = Path.Combine(file.FilePath, file.Id.ToString() + file.Suffix); + var path = Path.Combine(App.WebHostEnvironment.WebRootPath, filePath); + return new FileStreamResult(new FileStream(path, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName + file.Suffix }; + } + } + + /// + /// 下载指定文件Base64格式 🔖 + /// + /// + /// + [AllowAnonymous] + [DisplayName("下载指定文件Base64格式")] + public async Task DownloadFileBase64([FromBody] string url) + { + if (_OSSProviderOptions.IsEnable) + { + using var httpClient = new HttpClient(); + HttpResponseMessage response = await httpClient.GetAsync(url); + if (response.IsSuccessStatusCode) + { + // 读取文件内容并将其转换为 Base64 字符串 + byte[] fileBytes = await response.Content.ReadAsByteArrayAsync(); + return Convert.ToBase64String(fileBytes); + } + else + { + throw new HttpRequestException($"Request failed with status code: {response.StatusCode}"); + } + } + else + { + var sysFile = await _sysFileRep.GetFirstAsync(u => u.Url == url) ?? throw Oops.Oh($"文件不存在"); + var filePath = Path.Combine(App.WebHostEnvironment.WebRootPath, sysFile.FilePath); + if (!Directory.Exists(filePath)) + Directory.CreateDirectory(filePath); + + var realFile = Path.Combine(filePath, $"{sysFile.Id}{sysFile.Suffix}"); + if (!File.Exists(realFile)) + throw Oops.Oh($"文件[{realFile}]不在存"); + byte[] fileBytes = File.ReadAllBytes(realFile); + return Convert.ToBase64String(fileBytes); + } + } + + /// + /// 删除文件 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + [DisplayName("删除文件")] + public async Task DeleteFile(DeleteFileInput input) + { + var file = await _sysFileRep.GetFirstAsync(u => u.Id == input.Id); + if (file != null) + { + await _sysFileRep.DeleteAsync(file); + + if (_OSSProviderOptions.IsEnable) + { + await _OSSService.RemoveObjectAsync(file.BucketName.ToString(), string.Concat(file.FilePath, "/", $"{input.Id}{file.Suffix}")); + } + else + { + var filePath = Path.Combine(App.WebHostEnvironment.WebRootPath, file.FilePath, input.Id.ToString() + file.Suffix); + if (File.Exists(filePath)) + File.Delete(filePath); + } + } + } + + /// + /// 更新文件 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Update"), HttpPost] + [DisplayName("更新文件")] + public async Task UpdateFile(FileInput input) + { + var isExist = await _sysFileRep.IsAnyAsync(u => u.Id == input.Id); + if (!isExist) throw Oops.Oh(ErrorCodeEnum.D8000); + + await _sysFileRep.UpdateAsync(u => new SysFile() { FileName = input.FileName }, u => u.Id == input.Id); + } + + /// + /// 获取文件 + /// + /// + /// + private async Task GetFile([FromQuery] FileInput input) + { + var file = await _sysFileRep.GetFirstAsync(u => u.Id == input.Id); + return file ?? throw Oops.Oh(ErrorCodeEnum.D8000); + } + + /// + /// 上传文件 + /// + /// 文件 + /// 路径 + /// 允许格式:.jpg.png.gif.tif.bmp + /// 新文件名 + /// + private async Task HandleUploadFile(IFormFile file, string savePath, string allowSuffix = "", string newfilename = "") + { + if (file == null) throw Oops.Oh(ErrorCodeEnum.D8000); + + // 判断是否重复上传的文件 + var sizeKb = (long)(file.Length / 1024.0); // 大小KB + var fileMd5 = string.Empty; + if (_uploadOptions.EnableMd5) + { + using (var fileStream = file.OpenReadStream()) + { + fileMd5 = OssUtils.ComputeContentMd5(fileStream, fileStream.Length); + } + /* + * Mysql8 中如果使用了 utf8mb4_general_ci 之外的编码会出错,尽量避免在条件里使用.ToString() + * 因为 Squsugar 并不是把变量转换为字符串来构造SQL语句,而是构造了CAST(123 AS CHAR)这样的语句,这样这个返回值是utf8mb4_general_ci,所以容易出错。 + */ + var strSizeKb = sizeKb.ToString(); + var sysFile = await _sysFileRep.GetFirstAsync(u => u.FileMd5 == fileMd5 && (u.SizeKb == null || u.SizeKb == strSizeKb)); + if (sysFile != null) return sysFile; + } + + var path = savePath; + if (string.IsNullOrWhiteSpace(savePath)) + { + path = _uploadOptions.Path; + var reg = new Regex(@"(\{.+?})"); + var match = reg.Matches(path); + match.ToList().ForEach(a => + { + var str = DateTime.Now.ToString(a.ToString().Substring(1, a.Length - 2)); // 每天一个目录 + path = path.Replace(a.ToString(), str); + }); + } + + // 验证文件类型 + if (!_uploadOptions.ContentType.Contains(file.ContentType)) + throw Oops.Oh(ErrorCodeEnum.D8001); + + // 验证文件大小 + if (sizeKb > _uploadOptions.MaxSize) + throw Oops.Oh(ErrorCodeEnum.D8002); + + // 获取文件后缀 + var suffix = Path.GetExtension(file.FileName).ToLower(); // 后缀 + if (string.IsNullOrWhiteSpace(suffix)) + { + var contentTypeProvider = FS.GetFileExtensionContentTypeProvider(); + suffix = contentTypeProvider.Mappings.FirstOrDefault(u => u.Value == file.ContentType).Key; + // 修改 image/jpeg 类型返回的 .jpe 后缀 + if (suffix == ".jpe") + suffix = ".jpg"; + } + if (string.IsNullOrWhiteSpace(suffix)) + throw Oops.Oh(ErrorCodeEnum.D8003); + + // 防止客户端伪造文件类型 + if (!string.IsNullOrWhiteSpace(allowSuffix) && !allowSuffix.Contains(suffix)) + throw Oops.Oh(ErrorCodeEnum.D8003); + if (string.IsNullOrWhiteSpace(newfilename)) + { + if (!VerifyFileExtensionName.IsSameType(file.OpenReadStream(), suffix)) + throw Oops.Oh(ErrorCodeEnum.D8001); + } + + var newFile = new SysFile + { + Id = YitIdHelper.NextId(), + // BucketName = _OSSProviderOptions.IsEnable ? _OSSProviderOptions.Provider.ToString() : "Local", + // 阿里云对bucket名称有要求,1.只能包括小写字母,数字,短横线(-)2.必须以小写字母或者数字开头 3.长度必须在3-63字节之间 + // 无法使用Provider + BucketName = _OSSProviderOptions.IsEnable ? _OSSProviderOptions.Bucket : "Local", + FileName = Path.GetFileNameWithoutExtension(file.FileName), + Suffix = suffix, + SizeKb = sizeKb.ToString(), + FilePath = path, + FileMd5 = fileMd5, + }; + + var finalName = newFile.Id + suffix; // 文件最终名称 + if (!string.IsNullOrWhiteSpace(newfilename)) + { + newFile.FileName = newfilename; + finalName = newfilename; + } + if (_OSSProviderOptions.IsEnable) + { + newFile.Provider = Enum.GetName(_OSSProviderOptions.Provider); + var filePath = string.Concat(path, "/", finalName); + await _OSSService.PutObjectAsync(newFile.BucketName, filePath, file.OpenReadStream()); + // http://<你的bucket名字>.oss.aliyuncs.com/<你的object名字> + // 生成外链地址 方便前端预览 + switch (_OSSProviderOptions.Provider) + { + case OSSProvider.Aliyun: + newFile.Url = $"{(_OSSProviderOptions.IsEnableHttps ? "https" : "http")}://{newFile.BucketName}.{_OSSProviderOptions.Endpoint}/{filePath}"; + if (newFile.Url.Contains("static-ycymedu-minpro.oss-cn-shanghai.aliyuncs.com")) + { + newFile.Url= newFile.Url.Replace("static-ycymedu-minpro.oss-cn-shanghai.aliyuncs.com", "static-data.ycymedu.com"); + } + break; + + case OSSProvider.Minio: + // 获取Minio文件的下载或者预览地址 + // newFile.Url = await GetMinioPreviewFileUrl(newFile.BucketName, filePath);// 这种方法生成的Url是有7天有效期的,不能这样使用 + // 需要在MinIO中的Buckets开通对 Anonymous 的readonly权限 + newFile.Url = $"{(_OSSProviderOptions.IsEnableHttps ? "https" : "http")}://{_OSSProviderOptions.Endpoint}/{newFile.BucketName}/{filePath}"; + break; + } + } + else + { + newFile.Provider = ""; // 本地存储 Provider 显示为空 + var filePath = Path.Combine(App.WebHostEnvironment.WebRootPath, path); + if (!Directory.Exists(filePath)) + Directory.CreateDirectory(filePath); + + var realFile = Path.Combine(filePath, finalName); + //IDetector detector; + using (var stream = File.Create(realFile)) + { + await file.CopyToAsync(stream); + //detector = stream.DetectFiletype(); + } + //var realExt = detector.Extension; // 真实扩展名 + //// 二次校验扩展名 + //if (!string.Equals(realExt, suffix.Replace(".", ""), StringComparison.OrdinalIgnoreCase)) + //{ + // var delFilePath = Path.Combine(App.WebHostEnvironment.WebRootPath, realFile); + // if (File.Exists(delFilePath)) + // File.Delete(delFilePath); + // throw Oops.Oh(ErrorCodeEnum.D8001); + //} + + // 生成外链 + var host = CommonUtil.GetLocalhost(); + if (!host.EndsWith("/")) + host += "/"; + newFile.Url = $"{host}{newFile.FilePath}/{newFile.Id + newFile.Suffix}"; + } + await _sysFileRep.AsInsertable(newFile).ExecuteCommandAsync(); + return newFile; + } + + ///// + ///// 获取Minio文件的下载或者预览地址 + ///// + ///// 桶名 + ///// 文件名 + ///// + //private async Task GetMinioPreviewFileUrl(string bucketName, string fileName) + //{ + // return await _OSSService.PresignedGetObjectAsync(bucketName, fileName, 7); + //} + + /// + /// 上传头像 🔖 + /// + /// + /// + [DisplayName("上传头像")] + public async Task UploadAvatar([Required] IFormFile file) + { + var sysFile = await HandleUploadFile(file, "Upload/Avatar", _imageType); + + var sysUserRep = _sysFileRep.ChangeRepository>(); + var user = sysUserRep.GetFirst(u => u.Id == _userManager.UserId); + // 删除已有头像文件 + if (user != null && !string.IsNullOrWhiteSpace(user.Avatar)) + { + var fileId = Path.GetFileNameWithoutExtension(user.Avatar); + await DeleteFile(new DeleteFileInput { Id = long.Parse(fileId) }); + + await sysUserRep.UpdateAsync(u => new SysUser() { Avatar = sysFile.Url }, u => u.Id == user.Id); + } + return sysFile; + } + + /// + /// 上传电子签名 🔖 + /// + /// + /// + [DisplayName("上传电子签名")] + public async Task UploadSignature([Required] IFormFile file) + { + var sysFile = await HandleUploadFile(file, "Upload/Signature", _imageType); + + var sysUserRep = _sysFileRep.ChangeRepository>(); + var user = sysUserRep.GetFirst(u => u.Id == _userManager.UserId); + // 删除已有电子签名文件 + if (!string.IsNullOrWhiteSpace(user.Signature) && user.Signature.EndsWith(".png")) + { + var fileId = Path.GetFileNameWithoutExtension(user.Signature); + await DeleteFile(new DeleteFileInput { Id = long.Parse(fileId) }); + } + await sysUserRep.UpdateAsync(u => new SysUser() { Signature = sysFile.Url }, u => u.Id == user.Id); + return sysFile; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Job/DbJobPersistence.cs b/Admin.NET/Admin.NET.Core/Service/Job/DbJobPersistence.cs new file mode 100644 index 0000000..03679de --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Job/DbJobPersistence.cs @@ -0,0 +1,186 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 作业持久化(数据库) +/// +public class DbJobPersistence : IJobPersistence +{ + private readonly IServiceScopeFactory _serviceScopeFactory; + + public DbJobPersistence(IServiceScopeFactory serviceScopeFactory) + { + _serviceScopeFactory = serviceScopeFactory; + } + + /// + /// 作业调度服务启动时 + /// + /// + /// + /// + public async Task> PreloadAsync(CancellationToken stoppingToken) + { + using var scope = _serviceScopeFactory.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService().CopyNew(); + var dynamicJobCompiler = scope.ServiceProvider.GetRequiredService(); + + // 获取所有定义的作业 + var allJobs = App.EffectiveTypes.ScanToBuilders().ToList(); + // 若数据库不存在任何作业,则直接返回 + if (!db.Queryable().Any(u => true)) return allJobs; + + // 遍历所有定义的作业 + foreach (var schedulerBuilder in allJobs) + { + // 获取作业信息构建器 + var jobBuilder = schedulerBuilder.GetJobBuilder(); + + // 加载数据库数据 + var dbDetail = await db.Queryable().FirstAsync(u => u.JobId == jobBuilder.JobId, stoppingToken); + if (dbDetail == null) continue; + + // 同步数据库数据 + jobBuilder.LoadFrom(dbDetail); + + // 获取作业的所有数据库的触发器 + var dbTriggers = await db.Queryable().Where(u => u.JobId == jobBuilder.JobId).ToListAsync(stoppingToken); + // 遍历所有作业触发器 + foreach (var (_, triggerBuilder) in schedulerBuilder.GetEnumerable()) + { + // 加载数据库数据 + var dbTrigger = dbTriggers.FirstOrDefault(u => u.JobId == jobBuilder.JobId && u.TriggerId == triggerBuilder.TriggerId); + if (dbTrigger == null) continue; + + triggerBuilder.LoadFrom(dbTrigger).Updated(); // 标记更新 + } + // 遍历所有非编译时定义的触发器加入到作业中 + foreach (var dbTrigger in dbTriggers) + { + if (schedulerBuilder.GetTriggerBuilder(dbTrigger.TriggerId)?.JobId == jobBuilder.JobId) continue; + var triggerBuilder = TriggerBuilder.Create(dbTrigger.TriggerId).LoadFrom(dbTrigger); + schedulerBuilder.AddTriggerBuilder(triggerBuilder); // 先添加 + triggerBuilder.Updated(); // 再标记更新 + } + + // 标记更新 + schedulerBuilder.Updated(); + } + + // 获取数据库所有通过脚本创建的作业 + var allDbScriptJobs = await db.Queryable().Where(u => u.CreateType != JobCreateTypeEnum.BuiltIn).ToListAsync(stoppingToken); + foreach (var dbDetail in allDbScriptJobs) + { + // 动态创建作业 + Type jobType = dbDetail.CreateType switch + { + JobCreateTypeEnum.Script => dynamicJobCompiler.BuildJob(dbDetail.ScriptCode), + JobCreateTypeEnum.Http => typeof(HttpJob), + _ => throw new NotSupportedException(), + }; + + // 动态构建的 jobType 的程序集名称为随机名称,需重新设置 + dbDetail.AssemblyName = jobType.Assembly.FullName!.Split(',')[0]; + var jobBuilder = JobBuilder.Create(jobType).LoadFrom(dbDetail); + + // 强行设置为不扫描 IJob 实现类 [Trigger] 特性触发器,否则 SchedulerBuilder.Create 会再次扫描,导致重复添加同名触发器 + jobBuilder.SetIncludeAnnotations(false); + + // 获取作业的所有数据库的触发器加入到作业中 + var dbTriggers = await db.Queryable().Where(u => u.JobId == jobBuilder.JobId).ToListAsync(); + var triggerBuilders = dbTriggers.Select(u => TriggerBuilder.Create(u.TriggerId).LoadFrom(u).Updated()); + var schedulerBuilder = SchedulerBuilder.Create(jobBuilder, triggerBuilders.ToArray()); + + // 标记更新 + schedulerBuilder.Updated(); + + allJobs.Add(schedulerBuilder); + } + + return allJobs; + } + + /// + /// 作业计划初始化通知 + /// + /// + /// + /// + public Task OnLoadingAsync(SchedulerBuilder builder, CancellationToken stoppingToken) + { + return Task.FromResult(builder); + } + + /// + /// 作业计划Scheduler的JobDetail变化时 + /// + /// + /// + public async Task OnChangedAsync(PersistenceContext context) + { + using var scope = _serviceScopeFactory.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService().CopyNew(); + + var jobDetail = context.JobDetail.Adapt(); + switch (context.Behavior) + { + case PersistenceBehavior.Appended: + await db.Insertable(jobDetail).ExecuteCommandAsync(); + break; + + case PersistenceBehavior.Updated: + await db.Updateable(jobDetail).WhereColumns(u => new { u.JobId }).IgnoreColumns(u => new { u.Id, u.CreateType, u.ScriptCode }).ExecuteCommandAsync(); + break; + + case PersistenceBehavior.Removed: + await db.Deleteable().Where(u => u.JobId == jobDetail.JobId).ExecuteCommandAsync(); + break; + } + } + + /// + /// 作业计划Scheduler的触发器Trigger变化时 + /// + /// + /// + public async Task OnTriggerChangedAsync(PersistenceTriggerContext context) + { + using var scope = _serviceScopeFactory.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService().CopyNew(); + + var jobTrigger = context.Trigger.Adapt(); + switch (context.Behavior) + { + case PersistenceBehavior.Appended: + await db.Insertable(jobTrigger).ExecuteCommandAsync(); + break; + + case PersistenceBehavior.Updated: + await db.Updateable(jobTrigger).WhereColumns(u => new { u.TriggerId, u.JobId }).IgnoreColumns(u => new { u.Id }).ExecuteCommandAsync(); + break; + + case PersistenceBehavior.Removed: + await db.Deleteable().Where(u => u.TriggerId == jobTrigger.TriggerId && u.JobId == jobTrigger.JobId).ExecuteCommandAsync(); + break; + } + } + + /// + /// 作业触发器运行记录 + /// + /// + /// + public async Task OnExecutionRecordAsync(PersistenceExecutionRecordContext context) + { + using var scope = _serviceScopeFactory.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService().CopyNew(); + + var jobTriggerRecord = context.Timeline.Adapt(); + await db.Insertable(jobTriggerRecord).ExecuteCommandAsync(); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Job/Dto/JobDetailInput.cs b/Admin.NET/Admin.NET.Core/Service/Job/Dto/JobDetailInput.cs new file mode 100644 index 0000000..4f22fcc --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Job/Dto/JobDetailInput.cs @@ -0,0 +1,45 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class JobDetailInput +{ + /// + /// 作业Id + /// + public string JobId { get; set; } +} + +public class PageJobDetailInput : BasePageInput +{ + /// + /// 作业Id + /// + public string JobId { get; set; } + + /// + /// 描述信息 + /// + public string Description { get; set; } +} + +public class AddJobDetailInput : SysJobDetail +{ + /// + /// 作业Id + /// + [Required(ErrorMessage = "作业Id不能为空"), MinLength(2, ErrorMessage = "作业Id不能少于2个字符")] + public override string JobId { get; set; } +} + +public class UpdateJobDetailInput : AddJobDetailInput +{ +} + +public class DeleteJobDetailInput : JobDetailInput +{ +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Job/Dto/JobDetailOutput.cs b/Admin.NET/Admin.NET.Core/Service/Job/Dto/JobDetailOutput.cs new file mode 100644 index 0000000..a6efa85 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Job/Dto/JobDetailOutput.cs @@ -0,0 +1,20 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class JobDetailOutput +{ + /// + /// 作业信息 + /// + public SysJobDetail JobDetail { get; set; } + + /// + /// 触发器集合 + /// + public List JobTriggers { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Job/Dto/JobTriggerInput.cs b/Admin.NET/Admin.NET.Core/Service/Job/Dto/JobTriggerInput.cs new file mode 100644 index 0000000..334f2ba --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Job/Dto/JobTriggerInput.cs @@ -0,0 +1,43 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class JobTriggerInput +{ + /// + /// 作业Id + /// + public string JobId { get; set; } + + /// + /// 触发器Id + /// + public string TriggerId { get; set; } +} + +public class AddJobTriggerInput : SysJobTrigger +{ + /// + /// 作业Id + /// + [Required(ErrorMessage = "作业Id不能为空"), MinLength(2, ErrorMessage = "作业Id不能少于2个字符")] + public override string JobId { get; set; } + + /// + /// 触发器Id + /// + [Required(ErrorMessage = "触发器Id不能为空"), MinLength(2, ErrorMessage = "触发器Id不能少于2个字符")] + public override string TriggerId { get; set; } +} + +public class UpdateJobTriggerInput : AddJobTriggerInput +{ +} + +public class DeleteJobTriggerInput : JobTriggerInput +{ +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Job/Dto/JobTriggerRecordInput.cs b/Admin.NET/Admin.NET.Core/Service/Job/Dto/JobTriggerRecordInput.cs new file mode 100644 index 0000000..2b909b2 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Job/Dto/JobTriggerRecordInput.cs @@ -0,0 +1,20 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class PageJobTriggerRecordInput : BasePageInput +{ + /// + /// 作业Id + /// + public string JobId { get; set; } + + /// + /// 触发器Id + /// + public string TriggerId { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Job/JobClusterServer.cs b/Admin.NET/Admin.NET.Core/Service/Job/JobClusterServer.cs new file mode 100644 index 0000000..139b2ec --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Job/JobClusterServer.cs @@ -0,0 +1,107 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 作业集群控制 +/// +public class JobClusterServer : IJobClusterServer +{ + private readonly Random rd = new(DateTime.Now.Millisecond); + + public JobClusterServer() + { + } + + /// + /// 当前作业调度器启动通知 + /// + /// 作业集群服务上下文 + public async void Start(JobClusterContext context) + { + var _sysJobClusterRep = App.GetRequiredService>(); + // 在作业集群表中,如果 clusterId 不存在,则新增一条(否则更新一条),并设置 status 为 ClusterStatus.Waiting + if (await _sysJobClusterRep.IsAnyAsync(u => u.ClusterId == context.ClusterId)) + { + await _sysJobClusterRep.AsUpdateable().SetColumns(u => u.Status == ClusterStatus.Waiting).Where(u => u.ClusterId == context.ClusterId).ExecuteCommandAsync(); + } + else + { + await _sysJobClusterRep.AsInsertable(new SysJobCluster { ClusterId = context.ClusterId, Status = ClusterStatus.Waiting }).ExecuteCommandAsync(); + } + } + + /// + /// 等待被唤醒 + /// + /// 作业集群服务上下文 + /// + public async Task WaitingForAsync(JobClusterContext context) + { + var clusterId = context.ClusterId; + + while (true) + { + // 控制集群心跳频率(放在头部为了防止 IsAnyAsync continue 没sleep占用大量IO和CPU) + await Task.Delay(3000 + rd.Next(500, 1000)); // 错开集群同时启动 + + try + { + ICache _cache = App.GetRequiredService().Cache; + // 使用分布式锁 + using (_cache.AcquireLock("lock:JobClusterServer:WaitingForAsync", 1000)) + { + var _sysJobClusterRep = App.GetRequiredService>(); + // 在这里查询数据库,根据以下两种情况处理 + // 1) 如果作业集群表已有 status 为 ClusterStatus.Working 则继续循环 + // 2) 如果作业集群表中还没有其他服务或只有自己,则插入一条集群服务或调用 await WorkNowAsync(clusterId); 之后 return; + // 3) 如果作业集群表中没有 status 为 ClusterStatus.Working 的,调用 await WorkNowAsync(clusterId); 之后 return; + if (await _sysJobClusterRep.IsAnyAsync(u => u.Status == ClusterStatus.Working)) + continue; + + await WorkNowAsync(clusterId); + return; + } + } + catch { } + } + } + + /// + /// 当前作业调度器停止通知 + /// + /// 作业集群服务上下文 + public async void Stop(JobClusterContext context) + { + var _sysJobClusterRep = App.GetRequiredService>(); + // 在作业集群表中,更新 clusterId 的 status 为 ClusterStatus.Crashed + await _sysJobClusterRep.UpdateAsync(u => new SysJobCluster { Status = ClusterStatus.Crashed }, u => u.ClusterId == context.ClusterId); + } + + /// + /// 当前作业调度器宕机 + /// + /// 作业集群服务上下文 + public async void Crash(JobClusterContext context) + { + var _sysJobClusterRep = App.GetRequiredService>(); + // 在作业集群表中,更新 clusterId 的 status 为 ClusterStatus.Crashed + await _sysJobClusterRep.UpdateAsync(u => new SysJobCluster { Status = ClusterStatus.Crashed }, u => u.ClusterId == context.ClusterId); + } + + /// + /// 指示集群可以工作 + /// + /// 集群 Id + /// + private static async Task WorkNowAsync(string clusterId) + { + var _sysJobClusterRep = App.GetRequiredService>(); + // 在作业集群表中,更新 clusterId 的 status 为 ClusterStatus.Working + await _sysJobClusterRep.UpdateAsync(u => new SysJobCluster { Status = ClusterStatus.Working }, u => u.ClusterId == clusterId); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Job/JobMonitor.cs b/Admin.NET/Admin.NET.Core/Service/Job/JobMonitor.cs new file mode 100644 index 0000000..5dcb02e --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Job/JobMonitor.cs @@ -0,0 +1,39 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 作业执行监视器 +/// +public class JobMonitor : IJobMonitor +{ + private readonly IEventPublisher _eventPublisher; + private readonly IServiceScope _serviceScope; + private readonly SysConfigService _sysConfigService; + + public JobMonitor(IServiceScopeFactory scopeFactory) + { + _serviceScope = scopeFactory.CreateScope(); + _sysConfigService = _serviceScope.ServiceProvider.GetRequiredService(); + _eventPublisher = _serviceScope.ServiceProvider.GetRequiredService(); ; + } + + public Task OnExecutingAsync(JobExecutingContext context, CancellationToken stoppingToken) + { + return Task.CompletedTask; + } + + public async Task OnExecutedAsync(JobExecutedContext context, CancellationToken stoppingToken) + { + // 将异常作业发送到邮件 + if (await _sysConfigService.GetConfigValue(CommonConst.SysErrorMail) && context.Exception != null) + { + var errorInfo = $"【{context.Trigger.Description}】定时任务错误:{context.Exception}"; + await _eventPublisher.PublishAsync(CommonConst.SendErrorMail, errorInfo, stoppingToken); + } + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Job/SysJobService.cs b/Admin.NET/Admin.NET.Core/Service/Job/SysJobService.cs new file mode 100644 index 0000000..3ba906e --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Job/SysJobService.cs @@ -0,0 +1,359 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统作业任务服务 🧩 +/// +[ApiDescriptionSettings(Order = 320)] +public class SysJobService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _sysJobDetailRep; + private readonly SqlSugarRepository _sysJobTriggerRep; + private readonly SqlSugarRepository _sysJobTriggerRecordRep; + private readonly SqlSugarRepository _sysJobClusterRep; + private readonly ISchedulerFactory _schedulerFactory; + private readonly DynamicJobCompiler _dynamicJobCompiler; + + public SysJobService(SqlSugarRepository sysJobDetailRep, + SqlSugarRepository sysJobTriggerRep, + SqlSugarRepository sysJobTriggerRecordRep, + SqlSugarRepository sysJobClusterRep, + ISchedulerFactory schedulerFactory, + DynamicJobCompiler dynamicJobCompiler) + { + _sysJobDetailRep = sysJobDetailRep; + _sysJobTriggerRep = sysJobTriggerRep; + _sysJobTriggerRecordRep = sysJobTriggerRecordRep; + _sysJobClusterRep = sysJobClusterRep; + _schedulerFactory = schedulerFactory; + _dynamicJobCompiler = dynamicJobCompiler; + } + + /// + /// 获取作业分页列表 ⏰ + /// + [DisplayName("获取作业分页列表")] + public async Task> PageJobDetail(PageJobDetailInput input) + { + var jobDetails = await _sysJobDetailRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.JobId), u => u.JobId.Contains(input.JobId)) + .WhereIF(!string.IsNullOrWhiteSpace(input.Description), u => u.Description.Contains(input.Description)) + .Select(d => new JobDetailOutput + { + JobDetail = d, + }).ToPagedListAsync(input.Page, input.PageSize); + await _sysJobDetailRep.AsSugarClient().ThenMapperAsync(jobDetails.Items, async u => + { + u.JobTriggers = await _sysJobTriggerRep.GetListAsync(t => t.JobId == u.JobDetail.JobId); + }); + + // 提取中括号里面的参数值 + var rgx = new Regex(@"(?i)(?<=\[)(.*)(?=\])"); + foreach (var job in jobDetails.Items) + { + foreach (var jobTrigger in job.JobTriggers) + { + jobTrigger.Args = rgx.Match(jobTrigger.Args ?? "").Value; + } + } + return jobDetails; + } + + /// + /// 添加作业 ⏰ + /// + /// + [ApiDescriptionSettings(Name = "AddJobDetail"), HttpPost] + [DisplayName("添加作业")] + public async Task AddJobDetail(AddJobDetailInput input) + { + var isExist = await _sysJobDetailRep.IsAnyAsync(u => u.JobId == input.JobId && u.Id != input.Id); + if (isExist) + throw Oops.Oh(ErrorCodeEnum.D1006); + + // 动态创建作业 + Type jobType; + switch (input.CreateType) + { + case JobCreateTypeEnum.Script when string.IsNullOrEmpty(input.ScriptCode): + throw Oops.Oh(ErrorCodeEnum.D1701); + case JobCreateTypeEnum.Script: + { + jobType = _dynamicJobCompiler.BuildJob(input.ScriptCode); + + if (jobType.GetCustomAttributes(typeof(JobDetailAttribute)).FirstOrDefault() is not JobDetailAttribute jobDetailAttribute) + throw Oops.Oh(ErrorCodeEnum.D1702); + if (jobDetailAttribute.JobId != input.JobId) + throw Oops.Oh(ErrorCodeEnum.D1703); + break; + } + case JobCreateTypeEnum.Http: + jobType = typeof(HttpJob); + break; + + default: + throw new NotSupportedException(); + } + + _schedulerFactory.AddJob( + JobBuilder.Create(jobType) + .LoadFrom(input.Adapt()).SetJobType(jobType)); + + // 延迟一下等待持久化写入,再执行其他字段的更新 + await Task.Delay(500); + await _sysJobDetailRep.AsUpdateable() + .SetColumns(u => new SysJobDetail { CreateType = input.CreateType, ScriptCode = input.ScriptCode }) + .Where(u => u.JobId == input.JobId).ExecuteCommandAsync(); + } + + /// + /// 更新作业 ⏰ + /// + /// + [ApiDescriptionSettings(Name = "UpdateJobDetail"), HttpPost] + [DisplayName("更新作业")] + public async Task UpdateJobDetail(UpdateJobDetailInput input) + { + var isExist = await _sysJobDetailRep.IsAnyAsync(u => u.JobId == input.JobId && u.Id != input.Id); + if (isExist) + throw Oops.Oh(ErrorCodeEnum.D1006); + + var sysJobDetail = await _sysJobDetailRep.GetFirstAsync(u => u.Id == input.Id); + if (sysJobDetail.JobId != input.JobId) + throw Oops.Oh(ErrorCodeEnum.D1704); + + var scheduler = _schedulerFactory.GetJob(sysJobDetail.JobId); + var oldScriptCode = sysJobDetail.ScriptCode; // 旧脚本代码 + input.Adapt(sysJobDetail); + + if (input.CreateType == JobCreateTypeEnum.Script) + { + if (string.IsNullOrEmpty(input.ScriptCode)) + throw Oops.Oh(ErrorCodeEnum.D1701); + + if (input.ScriptCode != oldScriptCode) + { + // 动态创建作业 + var jobType = _dynamicJobCompiler.BuildJob(input.ScriptCode); + + if (jobType.GetCustomAttributes(typeof(JobDetailAttribute)).FirstOrDefault() is not JobDetailAttribute jobDetailAttribute) + throw Oops.Oh(ErrorCodeEnum.D1702); + if (jobDetailAttribute.JobId != input.JobId) + throw Oops.Oh(ErrorCodeEnum.D1703); + + scheduler?.UpdateDetail(JobBuilder.Create(jobType).LoadFrom(sysJobDetail).SetJobType(jobType)); + } + } + else + { + scheduler?.UpdateDetail(scheduler.GetJobBuilder().LoadFrom(sysJobDetail)); + } + + // Tip: 假如这次更新有变更了 JobId,变更 JobId 后触发的持久化更新执行,会由于找不到 JobId 而更新不到数据 + // 延迟一下等待持久化写入,再执行其他字段的更新 + await Task.Delay(500); + await _sysJobDetailRep.UpdateAsync(sysJobDetail); + } + + /// + /// 删除作业 ⏰ + /// + /// + [ApiDescriptionSettings(Name = "DeleteJobDetail"), HttpPost] + [DisplayName("删除作业")] + public async Task DeleteJobDetail(DeleteJobDetailInput input) + { + _schedulerFactory.RemoveJob(input.JobId); + + // 如果 _schedulerFactory 中不存在 JodId,则无法触发持久化,下面的代码确保作业和触发器能被删除 + await _sysJobDetailRep.DeleteAsync(u => u.JobId == input.JobId); + await _sysJobTriggerRep.DeleteAsync(u => u.JobId == input.JobId); + } + + /// + /// 获取触发器列表 ⏰ + /// + [DisplayName("获取触发器列表")] + public async Task> GetJobTriggerList([FromQuery] JobDetailInput input) + { + return await _sysJobTriggerRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.JobId), u => u.JobId.Contains(input.JobId)) + .ToListAsync(); + } + + /// + /// 添加触发器 ⏰ + /// + /// + [ApiDescriptionSettings(Name = "AddJobTrigger"), HttpPost] + [DisplayName("添加触发器")] + public async Task AddJobTrigger(AddJobTriggerInput input) + { + var isExist = await _sysJobTriggerRep.IsAnyAsync(u => u.TriggerId == input.TriggerId && u.Id != input.Id); + if (isExist) + throw Oops.Oh(ErrorCodeEnum.D1006); + + var jobTrigger = input.Adapt(); + jobTrigger.Args = "[" + jobTrigger.Args + "]"; + + var scheduler = _schedulerFactory.GetJob(input.JobId); + scheduler?.AddTrigger(Triggers.Create(input.AssemblyName, input.TriggerType).LoadFrom(jobTrigger)); + } + + /// + /// 更新触发器 ⏰ + /// + /// + [ApiDescriptionSettings(Name = "UpdateJobTrigger"), HttpPost] + [DisplayName("更新触发器")] + public async Task UpdateJobTrigger(UpdateJobTriggerInput input) + { + var isExist = await _sysJobTriggerRep.IsAnyAsync(u => u.TriggerId == input.TriggerId && u.Id != input.Id); + if (isExist) + throw Oops.Oh(ErrorCodeEnum.D1006); + + var jobTrigger = input.Adapt(); + jobTrigger.Args = "[" + jobTrigger.Args + "]"; + + var scheduler = _schedulerFactory.GetJob(input.JobId); + scheduler?.UpdateTrigger(Triggers.Create(input.AssemblyName, input.TriggerType).LoadFrom(jobTrigger)); + } + + /// + /// 删除触发器 ⏰ + /// + /// + [ApiDescriptionSettings(Name = "DeleteJobTrigger"), HttpPost] + [DisplayName("删除触发器")] + public async Task DeleteJobTrigger(DeleteJobTriggerInput input) + { + var scheduler = _schedulerFactory.GetJob(input.JobId); + scheduler?.RemoveTrigger(input.TriggerId); + + // 如果 _schedulerFactory 中不存在 JodId,则无法触发持久化,下行代码确保触发器能被删除 + await _sysJobTriggerRep.DeleteAsync(u => u.JobId == input.JobId && u.TriggerId == input.TriggerId); + } + + /// + /// 暂停所有作业 ⏰ + /// + /// + [DisplayName("暂停所有作业")] + public void PauseAllJob() + { + _schedulerFactory.PauseAll(); + } + + /// + /// 启动所有作业 ⏰ + /// + /// + [DisplayName("启动所有作业")] + public void StartAllJob() + { + _schedulerFactory.StartAll(); + } + + /// + /// 暂停作业 ⏰ + /// + [DisplayName("暂停作业")] + public void PauseJob(JobDetailInput input) + { + _schedulerFactory.TryPauseJob(input.JobId, out _); + } + + /// + /// 启动作业 ⏰ + /// + [DisplayName("启动作业")] + public void StartJob(JobDetailInput input) + { + _schedulerFactory.TryStartJob(input.JobId, out _); + } + + /// + /// 取消作业 ⏰ + /// + [DisplayName("取消作业")] + public void CancelJob(JobDetailInput input) + { + _schedulerFactory.TryCancelJob(input.JobId, out _); + } + + /// + /// 执行作业 ⏰ + /// + /// + [DisplayName("执行作业")] + public void RunJob(JobDetailInput input) + { + if (_schedulerFactory.TryRunJob(input.JobId, out _) != ScheduleResult.Succeed) + throw Oops.Oh(ErrorCodeEnum.D1705); + } + + /// + /// 暂停触发器 ⏰ + /// + [DisplayName("暂停触发器")] + public void PauseTrigger(JobTriggerInput input) + { + var scheduler = _schedulerFactory.GetJob(input.JobId); + scheduler?.PauseTrigger(input.TriggerId); + } + + /// + /// 启动触发器 ⏰ + /// + [DisplayName("启动触发器")] + public void StartTrigger(JobTriggerInput input) + { + var scheduler = _schedulerFactory.GetJob(input.JobId); + scheduler?.StartTrigger(input.TriggerId); + } + + /// + /// 强制唤醒作业调度器 ⏰ + /// + [DisplayName("强制唤醒作业调度器")] + public void CancelSleep() + { + _schedulerFactory.CancelSleep(); + } + + /// + /// 强制触发所有作业持久化 ⏰ + /// + [DisplayName("强制触发所有作业持久化")] + public void PersistAll() + { + _schedulerFactory.PersistAll(); + } + + /// + /// 获取集群列表 ⏰ + /// + [DisplayName("获取集群列表")] + public async Task> GetJobClusterList() + { + return await _sysJobClusterRep.GetListAsync(); + } + + /// + /// 获取作业触发器运行记录分页列表 ⏰ + /// + [DisplayName("获取作业触发器运行记录分页列表")] + public async Task> PageJobTriggerRecord(PageJobTriggerRecordInput input) + { + return await _sysJobTriggerRecordRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.JobId), u => u.JobId.Contains(input.JobId)) + .WhereIF(!string.IsNullOrWhiteSpace(input.TriggerId), u => u.TriggerId.Contains(input.TriggerId)) + .OrderByDescending(u => u.Id) + .ToPagedListAsync(input.Page, input.PageSize); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Logging/Dto/ExportLogDto.cs b/Admin.NET/Admin.NET.Core/Service/Logging/Dto/ExportLogDto.cs new file mode 100644 index 0000000..bd99c03 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Logging/Dto/ExportLogDto.cs @@ -0,0 +1,68 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 导出日志数据 +/// +[ExcelExporter(Name = "日志数据", TableStyle = OfficeOpenXml.Table.TableStyles.None, AutoFitAllColumn = true)] +public class ExportLogDto +{ + /// + /// 记录器类别名称 + /// + [ExporterHeader(DisplayName = "记录器类别名称", IsBold = true)] + public string LogName { get; set; } + + /// + /// 日志级别 + /// + [ExporterHeader(DisplayName = "日志级别", IsBold = true)] + public string LogLevel { get; set; } + + /// + /// 事件Id + /// + [ExporterHeader(DisplayName = "事件Id", IsBold = true)] + public string EventId { get; set; } + + /// + /// 日志消息 + /// + [ExporterHeader(DisplayName = "日志消息", IsBold = true)] + public string Message { get; set; } + + /// + /// 异常对象 + /// + [ExporterHeader(DisplayName = "异常对象", IsBold = true)] + public string Exception { get; set; } + + /// + /// 当前状态值 + /// + [ExporterHeader(DisplayName = "当前状态值", IsBold = true)] + public string State { get; set; } + + /// + /// 日志记录时间 + /// + [ExporterHeader(DisplayName = "日志记录时间", IsBold = true)] + public DateTime LogDateTime { get; set; } + + /// + /// 线程Id + /// + [ExporterHeader(DisplayName = "线程Id", IsBold = true)] + public int ThreadId { get; set; } + + /// + /// 请求跟踪Id + /// + [ExporterHeader(DisplayName = "请求跟踪Id", IsBold = true)] + public string TraceId { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Logging/Dto/LogInput.cs b/Admin.NET/Admin.NET.Core/Service/Logging/Dto/LogInput.cs new file mode 100644 index 0000000..a51b95c --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Logging/Dto/LogInput.cs @@ -0,0 +1,33 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class PageLogInput : BasePageInput +{ + /// + /// 开始时间 + /// + public DateTime? StartTime { get; set; } + + /// + /// 结束时间 + /// + public DateTime? EndTime { get; set; } +} + +public class LogInput +{ + /// + /// 开始时间 + /// + public DateTime? StartTime { get; set; } + + /// + /// 结束时间 + /// + public DateTime? EndTime { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Logging/SysLogDiffService.cs b/Admin.NET/Admin.NET.Core/Service/Logging/SysLogDiffService.cs new file mode 100644 index 0000000..438daeb --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Logging/SysLogDiffService.cs @@ -0,0 +1,47 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统差异日志服务 🧩 +/// +[ApiDescriptionSettings(Order = 330)] +public class SysLogDiffService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _sysLogDiffRep; + + public SysLogDiffService(SqlSugarRepository sysLogDiffRep) + { + _sysLogDiffRep = sysLogDiffRep; + } + + /// + /// 获取差异日志分页列表 🔖 + /// + /// + [SuppressMonitor] + [DisplayName("获取差异日志分页列表")] + public async Task> Page(PageLogInput input) + { + return await _sysLogDiffRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()), u => u.CreateTime >= input.StartTime) + .WhereIF(!string.IsNullOrWhiteSpace(input.EndTime.ToString()), u => u.CreateTime <= input.EndTime) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 清空差异日志 🔖 + /// + /// + [ApiDescriptionSettings(Name = "Clear"), HttpPost] + [DisplayName("清空差异日志")] + public async Task Clear() + { + return await _sysLogDiffRep.DeleteAsync(u => u.Id > 0); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Logging/SysLogExService.cs b/Admin.NET/Admin.NET.Core/Service/Logging/SysLogExService.cs new file mode 100644 index 0000000..79ee7ef --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Logging/SysLogExService.cs @@ -0,0 +1,67 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统异常日志服务 🧩 +/// +[ApiDescriptionSettings(Order = 350)] +public class SysLogExService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _sysLogExRep; + + public SysLogExService(SqlSugarRepository sysLogExRep) + { + _sysLogExRep = sysLogExRep; + } + + /// + /// 获取异常日志分页列表 🔖 + /// + /// + [SuppressMonitor] + [DisplayName("获取异常日志分页列表")] + public async Task> Page(PageLogInput input) + { + return await _sysLogExRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()), u => u.CreateTime >= input.StartTime) + .WhereIF(!string.IsNullOrWhiteSpace(input.EndTime.ToString()), u => u.CreateTime <= input.EndTime) + //.OrderBy(u => u.CreateTime, OrderByType.Desc) + .OrderBuilder(input) + .ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 清空异常日志 🔖 + /// + /// + [ApiDescriptionSettings(Name = "Clear"), HttpPost] + [DisplayName("清空异常日志")] + public async Task Clear() + { + return await _sysLogExRep.DeleteAsync(u => u.Id > 0); + } + + /// + /// 导出异常日志 🔖 + /// + /// + [ApiDescriptionSettings(Name = "Export"), NonUnify] + [DisplayName("导出异常日志")] + public async Task ExportLogEx(LogInput input) + { + var logExList = await _sysLogExRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()) && !string.IsNullOrWhiteSpace(input.EndTime.ToString()), + u => u.CreateTime >= input.StartTime && u.CreateTime <= input.EndTime) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .Select().ToListAsync(); + + IExcelExporter excelExporter = new ExcelExporter(); + var res = await excelExporter.ExportAsByteArray(logExList); + return new FileStreamResult(new MemoryStream(res), "application/octet-stream") { FileDownloadName = DateTime.Now.ToString("yyyyMMddHHmm") + "异常日志.xlsx" }; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Logging/SysLogOpService.cs b/Admin.NET/Admin.NET.Core/Service/Logging/SysLogOpService.cs new file mode 100644 index 0000000..3fe8ca2 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Logging/SysLogOpService.cs @@ -0,0 +1,67 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统操作日志服务 🧩 +/// +[ApiDescriptionSettings(Order = 360)] +public class SysLogOpService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _sysLogOpRep; + + public SysLogOpService(SqlSugarRepository sysLogOpRep) + { + _sysLogOpRep = sysLogOpRep; + } + + /// + /// 获取操作日志分页列表 🔖 + /// + /// + [SuppressMonitor] + [DisplayName("获取操作日志分页列表")] + public async Task> Page(PageLogInput input) + { + return await _sysLogOpRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()), u => u.CreateTime >= input.StartTime) + .WhereIF(!string.IsNullOrWhiteSpace(input.EndTime.ToString()), u => u.CreateTime <= input.EndTime) + //.OrderBy(u => u.CreateTime, OrderByType.Desc) + .OrderBuilder(input) + .ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 清空操作日志 🔖 + /// + /// + [ApiDescriptionSettings(Name = "Clear"), HttpPost] + [DisplayName("清空操作日志")] + public async Task Clear() + { + return await _sysLogOpRep.DeleteAsync(u => u.Id > 0); + } + + /// + /// 导出操作日志 🔖 + /// + /// + [ApiDescriptionSettings(Name = "Export"), NonUnify] + [DisplayName("导出操作日志")] + public async Task ExportLogOp(LogInput input) + { + var logOpList = await _sysLogOpRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()) && !string.IsNullOrWhiteSpace(input.EndTime.ToString()), + u => u.CreateTime >= input.StartTime && u.CreateTime <= input.EndTime) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .Select().ToListAsync(); + + IExcelExporter excelExporter = new ExcelExporter(); + var res = await excelExporter.ExportAsByteArray(logOpList); + return new FileStreamResult(new MemoryStream(res), "application/octet-stream") { FileDownloadName = DateTime.Now.ToString("yyyyMMddHHmm") + "操作日志.xlsx" }; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Logging/SysLogVisService.cs b/Admin.NET/Admin.NET.Core/Service/Logging/SysLogVisService.cs new file mode 100644 index 0000000..628bdd6 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Logging/SysLogVisService.cs @@ -0,0 +1,47 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统访问日志服务 🧩 +/// +[ApiDescriptionSettings(Order = 340)] +public class SysLogVisService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _sysLogVisRep; + + public SysLogVisService(SqlSugarRepository sysLogVisRep) + { + _sysLogVisRep = sysLogVisRep; + } + + /// + /// 获取访问日志分页列表 🔖 + /// + /// + [SuppressMonitor] + [DisplayName("获取访问日志分页列表")] + public async Task> Page(PageLogInput input) + { + return await _sysLogVisRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()), u => u.CreateTime >= input.StartTime) + .WhereIF(!string.IsNullOrWhiteSpace(input.EndTime.ToString()), u => u.CreateTime <= input.EndTime) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 清空访问日志 🔖 + /// + /// + [ApiDescriptionSettings(Name = "Clear"), HttpPost] + [DisplayName("清空访问日志")] + public async Task Clear() + { + return await _sysLogVisRep.DeleteAsync(u => u.Id > 0); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Menu/Dto/MenuInput.cs b/Admin.NET/Admin.NET.Core/Service/Menu/Dto/MenuInput.cs new file mode 100644 index 0000000..6a3837e --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Menu/Dto/MenuInput.cs @@ -0,0 +1,37 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class MenuInput +{ + /// + /// 标题 + /// + public string Title { get; set; } + + /// + /// 菜单类型(1目录 2菜单 3按钮) + /// + public MenuTypeEnum? Type { get; set; } +} + +public class AddMenuInput : SysMenu +{ + /// + /// 名称 + /// + [Required(ErrorMessage = "菜单名称不能为空")] + public override string Title { get; set; } +} + +public class UpdateMenuInput : AddMenuInput +{ +} + +public class DeleteMenuInput : BaseIdInput +{ +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Menu/Dto/MenuOutput.cs b/Admin.NET/Admin.NET.Core/Service/Menu/Dto/MenuOutput.cs new file mode 100644 index 0000000..ab7ad45 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Menu/Dto/MenuOutput.cs @@ -0,0 +1,157 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统菜单返回结果 +/// +public class MenuOutput +{ + /// + /// Id + /// + public long Id { get; set; } + + /// + /// 父Id + /// + public long Pid { get; set; } + + /// + /// 菜单类型(0目录 1菜单 2按钮) + /// + public MenuTypeEnum Type { get; set; } + + /// + /// 名称 + /// + public string Name { get; set; } + + /// + /// 路由地址 + /// + public string Path { get; set; } + + /// + /// 组件路径 + /// + public string Component { get; set; } + + /// + /// 权限标识 + /// + public string Permission { get; set; } + + /// + /// 重定向 + /// + public string Redirect { get; set; } + + /// + /// 排序 + /// + public int OrderNo { get; set; } + + /// + /// 状态 + /// + public StatusEnum Status { get; set; } + + /// + /// 备注 + /// + public string Remark { get; set; } + + /// + /// 创建时间 + /// + public virtual DateTime CreateTime { get; set; } + + /// + /// 更新时间 + /// + public virtual DateTime UpdateTime { get; set; } + + /// + /// 创建者姓名 + /// + public virtual string CreateUserName { get; set; } + + /// + /// 修改者姓名 + /// + public virtual string UpdateUserName { get; set; } + + /// + /// 菜单Meta + /// + public SysMenuMeta Meta { get; set; } + + /// + /// 菜单子项 + /// + public List Children { get; set; } +} + +/// +/// 菜单Meta配置 +/// +public class SysMenuMeta +{ + /// + /// 标题 + /// + public string Title { get; set; } + + /// + /// 图标 + /// + public string Icon { get; set; } + + /// + /// 是否内嵌 + /// + public bool IsIframe { get; set; } + + /// + /// 外链链接 + /// + public string IsLink { get; set; } + + /// + /// 是否隐藏 + /// + public bool IsHide { get; set; } + + /// + /// 是否缓存 + /// + public bool IsKeepAlive { get; set; } + + /// + /// 是否固定 + /// + public bool IsAffix { get; set; } +} + +/// +/// 配置菜单对象映射 +/// +public class SysMenuMapper : IRegister +{ + public void Register(TypeAdapterConfig config) + { + config.ForType() + .Map(t => t.Meta.Title, o => o.Title) + .Map(t => t.Meta.Icon, o => o.Icon) + .Map(t => t.Meta.IsIframe, o => o.IsIframe) + .Map(t => t.Meta.IsLink, o => o.OutLink) + .Map(t => t.Meta.IsHide, o => o.IsHide) + .Map(t => t.Meta.IsKeepAlive, o => o.IsKeepAlive) + .Map(t => t.Meta.IsAffix, o => o.IsAffix); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Menu/SysMenuService.cs b/Admin.NET/Admin.NET.Core/Service/Menu/SysMenuService.cs new file mode 100644 index 0000000..4349ef4 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Menu/SysMenuService.cs @@ -0,0 +1,292 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统菜单服务 🧩 +/// +[ApiDescriptionSettings(Order = 450)] +public class SysMenuService : IDynamicApiController, ITransient +{ + private readonly UserManager _userManager; + private readonly SqlSugarRepository _sysMenuRep; + private readonly SysRoleMenuService _sysRoleMenuService; + private readonly SysUserRoleService _sysUserRoleService; + private readonly SysCacheService _sysCacheService; + + public SysMenuService(UserManager userManager, + SqlSugarRepository sysMenuRep, + SysRoleMenuService sysRoleMenuService, + SysUserRoleService sysUserRoleService, + SysCacheService sysCacheService) + { + _userManager = userManager; + _sysMenuRep = sysMenuRep; + _sysRoleMenuService = sysRoleMenuService; + _sysUserRoleService = sysUserRoleService; + _sysCacheService = sysCacheService; + } + + /// + /// 获取登录菜单树 🔖 + /// + /// + [DisplayName("获取登录菜单树")] + public async Task> GetLoginMenuTree() + { + if (_userManager.SuperAdmin) + { + var menuList = await _sysMenuRep.AsQueryable() + .Where(u => u.Type != MenuTypeEnum.Btn && u.Status == StatusEnum.Enable) + .OrderBy(u => new { u.OrderNo, u.Id }).ToTreeAsync(u => u.Children, u => u.Pid, 0); + return menuList.Adapt>(); + } + else + { + var menuIdList = await GetMenuIdList(); + var menuTree = await _sysMenuRep.AsQueryable() + .Where(u => u.Status == StatusEnum.Enable) + .OrderBy(u => new { u.OrderNo, u.Id }).ToTreeAsync(u => u.Children, u => u.Pid, 0, menuIdList.Select(d => (object)d).ToArray()); + DeleteBtnFromMenuTree(menuTree); + return menuTree.Adapt>(); + } + } + + /// + /// 删除登录菜单树里面的按钮 + /// + private void DeleteBtnFromMenuTree(List menuList) + { + if (menuList == null) return; + for (var i = menuList.Count - 1; i >= 0; i--) + { + var menu = menuList[i]; + if (menu.Type == MenuTypeEnum.Btn) + menuList.Remove(menu); + else if (menu.Children.Count > 0) + DeleteBtnFromMenuTree(menu.Children); + } + } + + /// + /// 获取菜单列表 🔖 + /// + /// + [AllowAnonymous] + [DisplayName("获取菜单列表")] + public async Task> GetList([FromQuery] MenuInput input) + { + var menuIdList = _userManager.SuperAdmin ? new List() : await GetMenuIdList(); + + // 有筛选条件时返回list列表(防止构造不出树) + if (!string.IsNullOrWhiteSpace(input.Title) || input.Type is > 0) + { + return await _sysMenuRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.Title), u => u.Title.Contains(input.Title)) + .WhereIF(input.Type is > 0, u => u.Type == input.Type) + .WhereIF(menuIdList.Count > 1, u => menuIdList.Contains(u.Id)) + .OrderBy(u => u.OrderNo).ToListAsync(); + } + + return _userManager.SuperAdmin ? + await _sysMenuRep.AsQueryable().OrderBy(u => u.OrderNo).ToTreeAsync(u => u.Children, u => u.Pid, 0) : + await _sysMenuRep.AsQueryable() + .OrderBy(u => u.OrderNo).ToTreeAsync(u => u.Children, u => u.Pid, 0, menuIdList.Select(d => (object)d).ToArray()); // 角色菜单授权时 + } + + /// + /// 增加菜单 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Add"), HttpPost] + [DisplayName("增加菜单")] + public async Task AddMenu(AddMenuInput input) + { + var isExist = input.Type != MenuTypeEnum.Btn + ? await _sysMenuRep.IsAnyAsync(u => u.Title == input.Title && u.Pid == input.Pid) + : await _sysMenuRep.IsAnyAsync(u => u.Permission == input.Permission && u.Pid == input.Pid); + if (isExist) + throw Oops.Oh(ErrorCodeEnum.D4000); + + if (!string.IsNullOrWhiteSpace(input.Name)) + { + if (await _sysMenuRep.IsAnyAsync(u => u.Name == input.Name)) + throw Oops.Oh(ErrorCodeEnum.D4009); + } + + if (input.Pid != 0) + { + if (await _sysMenuRep.IsAnyAsync(u => u.Id == input.Pid && u.Type == MenuTypeEnum.Btn)) + throw Oops.Oh(ErrorCodeEnum.D4010); + } + + // 校验菜单参数 + var sysMenu = input.Adapt(); + CheckMenuParam(sysMenu); + + await _sysMenuRep.InsertAsync(sysMenu); + + // 清除缓存 + DeleteMenuCache(); + } + + /// + /// 更新菜单 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Update"), HttpPost] + [DisplayName("更新菜单")] + public async Task UpdateMenu(UpdateMenuInput input) + { + if (input.Id == input.Pid) + throw Oops.Oh(ErrorCodeEnum.D4008); + + var isExist = input.Type != MenuTypeEnum.Btn + ? await _sysMenuRep.IsAnyAsync(u => u.Title == input.Title && u.Type == input.Type && u.Pid == input.Pid && u.Id != input.Id) + : await _sysMenuRep.IsAnyAsync(u => u.Permission == input.Permission && u.Type == input.Type && u.Pid == input.Pid && u.Id != input.Id); + if (isExist) + throw Oops.Oh(ErrorCodeEnum.D4000); + + if (!string.IsNullOrWhiteSpace(input.Name)) + { + if (await _sysMenuRep.IsAnyAsync(u => u.Id != input.Id && u.Name == input.Name)) + throw Oops.Oh(ErrorCodeEnum.D4009); + } + + if (input.Pid != 0) + { + if (await _sysMenuRep.IsAnyAsync(u => u.Id == input.Pid && u.Type == MenuTypeEnum.Btn)) + throw Oops.Oh(ErrorCodeEnum.D4010); + } + + // 校验菜单参数 + var sysMenu = input.Adapt(); + CheckMenuParam(sysMenu); + + await _sysMenuRep.AsUpdateable(sysMenu).ExecuteCommandAsync(); + + // 清除缓存 + DeleteMenuCache(); + } + + /// + /// 删除菜单 🔖 + /// + /// + /// + [UnitOfWork] + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + [DisplayName("删除菜单")] + public async Task DeleteMenu(DeleteMenuInput input) + { + var menuTreeList = await _sysMenuRep.AsQueryable().ToChildListAsync(u => u.Pid, input.Id, true); + var menuIdList = menuTreeList.Select(u => u.Id).ToList(); + + await _sysMenuRep.DeleteAsync(u => menuIdList.Contains(u.Id)); + + // 级联删除角色菜单数据 + await _sysRoleMenuService.DeleteRoleMenuByMenuIdList(menuIdList); + + // 清除缓存 + DeleteMenuCache(); + } + + /// + /// 增加和编辑时检查菜单数据 + /// + /// + private static void CheckMenuParam(SysMenu menu) + { + var permission = menu.Permission; + if (menu.Type == MenuTypeEnum.Btn) + { + menu.Name = null; + menu.Path = null; + menu.Component = null; + menu.Icon = null; + menu.Redirect = null; + menu.OutLink = null; + menu.IsHide = false; + menu.IsKeepAlive = true; + menu.IsAffix = false; + menu.IsIframe = false; + + if (string.IsNullOrEmpty(permission)) + throw Oops.Oh(ErrorCodeEnum.D4003); + if (!permission.Contains(':')) + throw Oops.Oh(ErrorCodeEnum.D4004); + } + else + { + menu.Permission = null; + } + } + + /// + /// 获取用户拥有按钮权限集合(缓存) 🔖 + /// + /// + [DisplayName("获取按钮权限集合")] + public async Task> GetOwnBtnPermList() + { + var userId = _userManager.UserId; + var permissions = _sysCacheService.Get>(CacheConst.KeyUserButton + userId); + if (permissions == null) + { + var menuIdList = _userManager.SuperAdmin ? new List() : await GetMenuIdList(); + permissions = menuIdList.Count > 0 || _userManager.SuperAdmin + ? await _sysMenuRep.AsQueryable() + .Where(u => u.Type == MenuTypeEnum.Btn) + .WhereIF(menuIdList.Count > 0, u => menuIdList.Contains(u.Id)) + .Select(u => u.Permission).ToListAsync() + : new List(); + _sysCacheService.Set(CacheConst.KeyUserButton + userId, permissions, TimeSpan.FromDays(7)); + } + + return permissions; + } + + /// + /// 获取系统所有按钮权限集合(缓存) + /// + /// + [NonAction] + public async Task> GetAllBtnPermList() + { + var permissions = _sysCacheService.Get>(CacheConst.KeyUserButton + 0); + if (permissions == null || permissions.Count == 0) + { + permissions = await _sysMenuRep.AsQueryable() + .Where(u => u.Type == MenuTypeEnum.Btn) + .Select(u => u.Permission).ToListAsync(); + _sysCacheService.Set(CacheConst.KeyUserButton + 0, permissions); + } + + return permissions; + } + + /// + /// 清除菜单和按钮缓存 + /// + private void DeleteMenuCache() + { + // _sysCacheService.RemoveByPrefixKey(CacheConst.KeyUserMenu); + _sysCacheService.RemoveByPrefixKey(CacheConst.KeyUserButton); + } + + /// + /// 获取当前用户菜单Id集合 + /// + /// + private async Task> GetMenuIdList() + { + var roleIdList = await _sysUserRoleService.GetUserRoleIdList(_userManager.UserId); + return await _sysRoleMenuService.GetRoleMenuIdList(roleIdList); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Message/Dto/MessageInput.cs b/Admin.NET/Admin.NET.Core/Service/Message/Dto/MessageInput.cs new file mode 100644 index 0000000..65b2498 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Message/Dto/MessageInput.cs @@ -0,0 +1,42 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +public class MessageInput +{ + /// + /// 用户ID + /// + public long UserId { get; set; } + + /// + /// 用户ID列表 + /// + public List UserIds { get; set; } + + /// + /// 消息标题 + /// + public string Title { get; set; } + + /// + /// 消息类型 + /// + public MessageTypeEnum MessageType { get; set; } + + /// + /// 消息内容 + /// + public string Message { get; set; } +} + + +public class MinProMessageInput +{ + public string ConnectionId { get; set; } + public string Content { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Message/SysEmailService.cs b/Admin.NET/Admin.NET.Core/Service/Message/SysEmailService.cs new file mode 100644 index 0000000..e136ab2 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Message/SysEmailService.cs @@ -0,0 +1,51 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using MailKit.Net.Smtp; +using MimeKit; + +namespace Admin.NET.Core.Service; + +/// +/// 系统邮件发送服务 🧩 +/// +[ApiDescriptionSettings(Order = 370)] +public class SysEmailService : IDynamicApiController, ITransient +{ + private readonly EmailOptions _emailOptions; + + public SysEmailService(IOptions emailOptions) + { + _emailOptions = emailOptions.Value; + } + + /// + /// 发送邮件 📧 + /// + /// + /// + /// + [DisplayName("发送邮件")] + public async Task SendEmail([Required] string content, string title = "Admin.NET 系统邮件") + { + var message = new MimeMessage(); + message.From.Add(new MailboxAddress(_emailOptions.DefaultFromEmail, _emailOptions.DefaultFromEmail)); + message.To.Add(new MailboxAddress(_emailOptions.DefaultToEmail, _emailOptions.DefaultToEmail)); + message.Subject = title; + message.Body = new TextPart("html") + { + Text = content + }; + + using var client = new SmtpClient(); + client.Connect(_emailOptions.Host, _emailOptions.Port, _emailOptions.EnableSsl); + client.Authenticate(_emailOptions.UserName, _emailOptions.Password); + client.Send(message); + client.Disconnect(true); + + await Task.CompletedTask; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Message/SysMessageService.cs b/Admin.NET/Admin.NET.Core/Service/Message/SysMessageService.cs new file mode 100644 index 0000000..4192c6a --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Message/SysMessageService.cs @@ -0,0 +1,84 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Microsoft.AspNetCore.SignalR; + +namespace Admin.NET.Core.Service; + +/// +/// 系统消息发送服务 🧩 +/// +[ApiDescriptionSettings(Order = 370)] +public class SysMessageService : IDynamicApiController, ITransient +{ + private readonly SysCacheService _sysCacheService; + private readonly IHubContext _chatHubContext; + + public SysMessageService(SysCacheService sysCacheService, + IHubContext chatHubContext) + { + _sysCacheService = sysCacheService; + _chatHubContext = chatHubContext; + } + + /// + /// 发送消息给所有人 🔖 + /// + /// + /// + [DisplayName("发送消息给所有人")] + public async Task SendAllUser(MessageInput input) + { + await _chatHubContext.Clients.All.ReceiveMessage(input); + } + + /// + /// 发送消息给除了发送人的其他人 🔖 + /// + /// + /// + [DisplayName("发送消息给除了发送人的其他人")] + public async Task SendOtherUser(MessageInput input) + { + var user = _sysCacheService.Get(CacheConst.KeyUserOnline + input.UserId); + if (user != null) + { + await _chatHubContext.Clients.AllExcept(user.ConnectionId).ReceiveMessage(input); + } + } + + /// + /// 发送消息给某个人 🔖 + /// + /// + /// + [DisplayName("发送消息给某个人")] + public async Task SendUser(MessageInput input) + { + var user = _sysCacheService.Get(CacheConst.KeyUserOnline + input.UserId); + if (user == null) return; + await _chatHubContext.Clients.Client(user.ConnectionId).ReceiveMessage(input); + // 可以直接通过用户Id发消息 + //await _chatHubContext.Clients.User(user.UserId.ToString()).ReceiveMessage(input); + } + + /// + /// 发送消息给某些人 🔖 + /// + /// + /// + [DisplayName("发送消息给某些人")] + public async Task SendUsers(MessageInput input) + { + var userlist = new List(); + foreach (var userid in input.UserIds) + { + var user = _sysCacheService.Get(CacheConst.KeyUserOnline + userid); + if (user != null) userlist.Add(user.ConnectionId); + } + await _chatHubContext.Clients.Clients(userlist).ReceiveMessage(input); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Message/SysSmsService.cs b/Admin.NET/Admin.NET.Core/Service/Message/SysSmsService.cs new file mode 100644 index 0000000..94b072a --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Message/SysSmsService.cs @@ -0,0 +1,86 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using AlibabaCloud.SDK.Dysmsapi20170525.Models; + +namespace Admin.NET.Core.Service; + +/// +/// 系统短信服务 🧩 +/// +[AllowAnonymous] +[ApiDescriptionSettings(Order = 150)] +public class SysSmsService : IDynamicApiController, ITransient +{ + private readonly SMSOptions _smsOptions; + private readonly SysCacheService _sysCacheService; + + public SysSmsService(IOptions smsOptions, + SysCacheService sysCacheService) + { + _smsOptions = smsOptions.Value; + _sysCacheService = sysCacheService; + } + + /// + /// 发送短信 📨 + /// + /// + /// + [AllowAnonymous] + [DisplayName("发送短信")] + public async Task SendSms([Required] string phoneNumber) + { + if (!phoneNumber.TryValidate(ValidationTypes.PhoneNumber).IsValid) + throw Oops.Oh("请正确填写手机号码"); + + // 生成随机验证码 + var random = new Random(); + var verifyCode = random.Next(100000, 999999); + + var templateParam = new + { + code = verifyCode + }; + + var client = CreateClient(); + var sendSmsRequest = new SendSmsRequest + { + PhoneNumbers = phoneNumber, // 待发送手机号, 多个以逗号分隔 + SignName = _smsOptions.Aliyun.SignName, // 短信签名 + TemplateCode = _smsOptions.Aliyun.TemplateCode, // 短信模板 + TemplateParam = templateParam.ToString(), // 模板中的变量替换JSON串 + OutId = YitIdHelper.NextId().ToString() + }; + var sendSmsResponse = client.SendSms(sendSmsRequest); + if (sendSmsResponse.Body.Code == "OK" && sendSmsResponse.Body.Message == "OK") + { + // var bizId = sendSmsResponse.Body.BizId; + _sysCacheService.Set($"{CacheConst.KeyPhoneVerCode}{phoneNumber}", verifyCode, TimeSpan.FromSeconds(60)); + } + else + { + throw Oops.Oh($"短信发送失败:{sendSmsResponse.Body.Code}-{sendSmsResponse.Body.Message}"); + } + + await Task.CompletedTask; + } + + /// + /// 阿里云短信配置 + /// + /// + private AlibabaCloud.SDK.Dysmsapi20170525.Client CreateClient() + { + var config = new AlibabaCloud.OpenApiClient.Models.Config + { + AccessKeyId = _smsOptions.Aliyun.AccessKeyId, + AccessKeySecret = _smsOptions.Aliyun.AccessKeySecret, + Endpoint = "dysmsapi.aliyuncs.com" + }; + return new AlibabaCloud.SDK.Dysmsapi20170525.Client(config); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Notice/Dto/NoticeInput.cs b/Admin.NET/Admin.NET.Core/Service/Notice/Dto/NoticeInput.cs new file mode 100644 index 0000000..e433927 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Notice/Dto/NoticeInput.cs @@ -0,0 +1,36 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class PageNoticeInput : BasePageInput +{ + /// + /// 标题 + /// + public virtual string Title { get; set; } + + /// + /// 类型(1通知 2公告) + /// + public virtual NoticeTypeEnum? Type { get; set; } +} + +public class AddNoticeInput : SysNotice +{ +} + +public class UpdateNoticeInput : AddNoticeInput +{ +} + +public class DeleteNoticeInput : BaseIdInput +{ +} + +public class NoticeInput : BaseIdInput +{ +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Notice/SysNoticeService.cs b/Admin.NET/Admin.NET.Core/Service/Notice/SysNoticeService.cs new file mode 100644 index 0000000..c5896ba --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Notice/SysNoticeService.cs @@ -0,0 +1,178 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统通知公告服务 🧩 +/// +[ApiDescriptionSettings(Order = 380)] +public class SysNoticeService : IDynamicApiController, ITransient +{ + private readonly UserManager _userManager; + private readonly SqlSugarRepository _sysUserRep; + private readonly SqlSugarRepository _sysNoticeRep; + private readonly SqlSugarRepository _sysNoticeUserRep; + private readonly SysOnlineUserService _sysOnlineUserService; + + public SysNoticeService( + UserManager userManager, + SqlSugarRepository sysUserRep, + SqlSugarRepository sysNoticeRep, + SqlSugarRepository sysNoticeUserRep, + SysOnlineUserService sysOnlineUserService) + { + _userManager = userManager; + _sysUserRep = sysUserRep; + _sysNoticeRep = sysNoticeRep; + _sysNoticeUserRep = sysNoticeUserRep; + _sysOnlineUserService = sysOnlineUserService; + } + + /// + /// 获取通知公告分页列表 📢 + /// + /// + /// + [DisplayName("获取通知公告分页列表")] + public async Task> Page(PageNoticeInput input) + { + return await _sysNoticeRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.Title), u => u.Title.Contains(input.Title.Trim())) + .WhereIF(input.Type > 0, u => u.Type == input.Type) + .WhereIF(!_userManager.SuperAdmin, u => u.CreateUserId == _userManager.UserId) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 增加通知公告 📢 + /// + /// + /// + [ApiDescriptionSettings(Name = "Add"), HttpPost] + [DisplayName("增加通知公告")] + public async Task AddNotice(AddNoticeInput input) + { + var notice = input.Adapt(); + InitNoticeInfo(notice); + await _sysNoticeRep.InsertAsync(notice); + } + + /// + /// 更新通知公告 📢 + /// + /// + /// + [UnitOfWork] + [ApiDescriptionSettings(Name = "Update"), HttpPost] + [DisplayName("更新通知公告")] + public async Task UpdateNotice(UpdateNoticeInput input) + { + var notice = input.Adapt(); + InitNoticeInfo(notice); + await _sysNoticeRep.UpdateAsync(notice); + } + + /// + /// 删除通知公告 📢 + /// + /// + /// + [UnitOfWork] + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + [DisplayName("删除通知公告")] + public async Task DeleteNotice(DeleteNoticeInput input) + { + await _sysNoticeRep.DeleteAsync(u => u.Id == input.Id); + + await _sysNoticeUserRep.DeleteAsync(u => u.NoticeId == input.Id); + } + + /// + /// 发布通知公告 📢 + /// + /// + /// + [DisplayName("发布通知公告")] + public async Task Public(NoticeInput input) + { + // 更新发布状态和时间 + await _sysNoticeRep.UpdateAsync(u => new SysNotice() { Status = NoticeStatusEnum.PUBLIC, PublicTime = DateTime.Now }, u => u.Id == input.Id); + + var notice = await _sysNoticeRep.GetFirstAsync(u => u.Id == input.Id); + + // 通知到的人(所有账号) + var userIdList = await _sysUserRep.AsQueryable().Select(u => u.Id).ToListAsync(); + + await _sysNoticeUserRep.DeleteAsync(u => u.NoticeId == notice.Id); + var noticeUserList = userIdList.Select(u => new SysNoticeUser + { + NoticeId = notice.Id, + UserId = u, + }).ToList(); + await _sysNoticeUserRep.InsertRangeAsync(noticeUserList); + + // 广播所有在线账号 + await _sysOnlineUserService.PublicNotice(notice, userIdList); + } + + /// + /// 设置通知公告已读状态 📢 + /// + /// + /// + [DisplayName("设置通知公告已读状态")] + public async Task SetRead(NoticeInput input) + { + await _sysNoticeUserRep.UpdateAsync(u => new SysNoticeUser + { + ReadStatus = NoticeUserStatusEnum.READ, + ReadTime = DateTime.Now + }, u => u.NoticeId == input.Id && u.UserId == _userManager.UserId); + } + + /// + /// 获取接收的通知公告 + /// + /// + /// + [DisplayName("获取接收的通知公告")] + public async Task> GetPageReceived([FromQuery] PageNoticeInput input) + { + return await _sysNoticeUserRep.AsQueryable().Includes(u => u.SysNotice) + .Where(u => u.UserId == _userManager.UserId) + .WhereIF(!string.IsNullOrWhiteSpace(input.Title), u => u.SysNotice.Title.Contains(input.Title.Trim())) + .WhereIF(input.Type is > 0, u => u.SysNotice.Type == input.Type) + .OrderBy(u => u.SysNotice.CreateTime, OrderByType.Desc) + .ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 获取未读的通知公告 📢 + /// + /// + [DisplayName("获取未读的通知公告")] + public async Task> GetUnReadList() + { + var noticeUserList = await _sysNoticeUserRep.AsQueryable().Includes(u => u.SysNotice) + .Where(u => u.UserId == _userManager.UserId && u.ReadStatus == NoticeUserStatusEnum.UNREAD) + .OrderBy(u => u.SysNotice.CreateTime, OrderByType.Desc).ToListAsync(); + return noticeUserList.Select(t => t.SysNotice).ToList(); + } + + /// + /// 初始化通知公告信息 + /// + /// + [NonAction] + private void InitNoticeInfo(SysNotice notice) + { + notice.PublicUserId = _userManager.UserId; + notice.PublicUserName = _userManager.RealName; + notice.PublicOrgId = _userManager.OrgId; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/OAuth/HttpContextExtension.cs b/Admin.NET/Admin.NET.Core/Service/OAuth/HttpContextExtension.cs new file mode 100644 index 0000000..b210421 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/OAuth/HttpContextExtension.cs @@ -0,0 +1,32 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Microsoft.AspNetCore.Authentication; + +namespace Admin.NET.Core.Service; + +public static class HttpContextExtension +{ + public static async Task GetExternalProvidersAsync(this HttpContext context) + { + ArgumentNullException.ThrowIfNull(context); + + var schemes = context.RequestServices.GetRequiredService(); + + return (from scheme in await schemes.GetAllSchemesAsync() + where !string.IsNullOrEmpty(scheme.DisplayName) + select scheme).ToArray(); + } + + public static async Task IsProviderSupportedAsync(this HttpContext context, string provider) + { + ArgumentNullException.ThrowIfNull(context); + + return (from scheme in await context.GetExternalProvidersAsync() + where string.Equals(scheme.Name, provider, StringComparison.OrdinalIgnoreCase) + select scheme).Any(); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/OAuth/OAuthClaim.cs b/Admin.NET/Admin.NET.Core/Service/OAuth/OAuthClaim.cs new file mode 100644 index 0000000..db89229 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/OAuth/OAuthClaim.cs @@ -0,0 +1,12 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public static class OAuthClaim +{ + public const string GiteeAvatarUrl = "urn:gitee:avatar_url"; +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/OAuth/SysOAuthService.cs b/Admin.NET/Admin.NET.Core/Service/OAuth/SysOAuthService.cs new file mode 100644 index 0000000..3de147a --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/OAuth/SysOAuthService.cs @@ -0,0 +1,117 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Microsoft.AspNetCore.Authentication; +using System.Security.Claims; + +namespace Admin.NET.Core.Service; + +/// +/// 系统OAuth服务 🧩 +/// +[AllowAnonymous] +[ApiDescriptionSettings(Order = 498)] +public class SysOAuthService : IDynamicApiController, ITransient +{ + private readonly IHttpContextAccessor _httpContextAccessor; + private readonly SqlSugarRepository _sysWechatUserRep; + + public SysOAuthService(IHttpContextAccessor httpContextAccessor, + SqlSugarRepository sysWechatUserRep) + { + _httpContextAccessor = httpContextAccessor; + _sysWechatUserRep = sysWechatUserRep; + } + + /// + /// 第三方登录 🔖 + /// + /// + /// + /// + [ApiDescriptionSettings(Name = "SignIn"), HttpGet] + [DisplayName("第三方登录")] + public virtual async Task SignIn([FromQuery] string provider, [FromQuery] string redirectUrl) + { + if (string.IsNullOrWhiteSpace(provider) || !await _httpContextAccessor.HttpContext.IsProviderSupportedAsync(provider)) + throw Oops.Oh("不支持的OAuth类型"); + + var request = _httpContextAccessor.HttpContext.Request; + var url = $"{request.Scheme}://{request.Host}{request.PathBase}{request.Path}Callback?provider={provider}&redirectUrl={redirectUrl}"; + var properties = new AuthenticationProperties { RedirectUri = url }; + properties.Items["LoginProvider"] = provider; + return await Task.FromResult(new ChallengeResult(provider, properties)); + } + + /// + /// 授权回调 🔖 + /// + /// + /// + /// + [ApiDescriptionSettings(Name = "SignInCallback"), HttpGet] + [DisplayName("授权回调")] + public virtual async Task SignInCallback([FromQuery] string provider = null, [FromQuery] string redirectUrl = "") + { + if (string.IsNullOrWhiteSpace(provider) || !await _httpContextAccessor.HttpContext.IsProviderSupportedAsync(provider)) + throw Oops.Oh("不支持的OAuth类型"); + + var authenticateResult = await _httpContextAccessor.HttpContext.AuthenticateAsync(provider); + if (!authenticateResult.Succeeded) + throw Oops.Oh("授权失败"); + + var openIdClaim = authenticateResult.Principal.FindFirst(ClaimTypes.NameIdentifier); + if (openIdClaim == null || string.IsNullOrWhiteSpace(openIdClaim.Value)) + throw Oops.Oh("授权失败"); + + var name = authenticateResult.Principal.FindFirst(ClaimTypes.Name)?.Value; + var email = authenticateResult.Principal.FindFirst(ClaimTypes.Email)?.Value; + var mobilePhone = authenticateResult.Principal.FindFirst(ClaimTypes.MobilePhone)?.Value; + var dateOfBirth = authenticateResult.Principal.FindFirst(ClaimTypes.DateOfBirth)?.Value; + var gender = authenticateResult.Principal.FindFirst(ClaimTypes.Gender)?.Value; + var avatarUrl = ""; + + var platformType = PlatformTypeEnum.微信公众号; + if (provider == "Gitee") + { + platformType = PlatformTypeEnum.Gitee; + avatarUrl = authenticateResult.Principal.FindFirst(OAuthClaim.GiteeAvatarUrl)?.Value; + } + + // 若账号不存在则新建 + var wechatUser = await _sysWechatUserRep.AsQueryable().Includes(u => u.SysUser).ClearFilter().FirstAsync(u => u.OpenId == openIdClaim.Value); + if (wechatUser == null) + { + var userId = await App.GetRequiredService().AddUser(new AddUserInput() + { + Account = name, + RealName = name, + NickName = name, + Email = email, + Avatar = avatarUrl, + Phone = mobilePhone, + OrgId = 1300000000101, // 根组织架构 + RoleIdList = new List { 1300000000104 } // 仅本人数据角色 + }); + + await _sysWechatUserRep.InsertAsync(new SysWechatUser() + { + UserId = userId, + OpenId = openIdClaim.Value, + Avatar = avatarUrl, + NickName = name, + PlatformType = platformType + }); + + wechatUser = await _sysWechatUserRep.AsQueryable().Includes(u => u.SysUser).ClearFilter().FirstAsync(u => u.OpenId == openIdClaim.Value); + } + + // 构建Token令牌 + var token = await App.GetRequiredService().CreateToken(wechatUser.SysUser); + + return new RedirectResult($"{redirectUrl}/#/login?token={token.AccessToken}"); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/OnlineUser/Dto/OnlineUserInput.cs b/Admin.NET/Admin.NET.Core/Service/OnlineUser/Dto/OnlineUserInput.cs new file mode 100644 index 0000000..c7be833 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/OnlineUser/Dto/OnlineUserInput.cs @@ -0,0 +1,28 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class PageOnlineUserInput : BasePageInput +{ + /// + /// 账号名称 + /// + public string UserName { get; set; } + + /// + /// 真实姓名 + /// + public string RealName { get; set; } +} + +public class OnlineUserHasitexpireDTO +{ + public bool IsExpired { get; set; } + + public string Msg { get; set; } + +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/OnlineUser/SysOnlineUserService.cs b/Admin.NET/Admin.NET.Core/Service/OnlineUser/SysOnlineUserService.cs new file mode 100644 index 0000000..d2cb62b --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/OnlineUser/SysOnlineUserService.cs @@ -0,0 +1,157 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Microsoft.AspNetCore.SignalR; + +namespace Admin.NET.Core.Service; + +/// +/// 系统在线用户服务 🧩 +/// +[ApiDescriptionSettings(Order = 300)] +public class SysOnlineUserService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _sysOnlineUerRep; + private readonly SysConfigService _sysConfigService; + private readonly IHubContext _onlineUserHubContext; + private readonly UserManager _userManager; + public SysOnlineUserService(SqlSugarRepository sysOnlineUerRep, + SysConfigService sysConfigService, + IHubContext onlineUserHubContext, + UserManager userManager) + { + _sysOnlineUerRep = sysOnlineUerRep; + _sysConfigService = sysConfigService; + _onlineUserHubContext = onlineUserHubContext; + _userManager = userManager; + } + + /// + /// 获取在线用户分页列表 🔖 + /// + /// + [DisplayName("获取在线用户分页列表")] + public async Task> Page(PageOnlineUserInput input) + { + return await _sysOnlineUerRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.UserName), u => u.UserName.Contains(input.UserName)) + .WhereIF(!string.IsNullOrWhiteSpace(input.RealName), u => u.RealName.Contains(input.RealName)) + .ToPagedListAsync(input.Page, input.PageSize); + } + + + + /// + /// 用户功能是否已到期 + /// + /// + [DisplayName("用户功能是否已到期"), HttpGet] + public async Task Hasitexpired() + { + var userinfo = _userManager; + var single = await _sysOnlineUerRep.AsQueryable().FirstAsync(e => e.UserId == userinfo.UserId); + if (single == null) + { + var user = new SysOnlineUser + { + UserId = userinfo.UserId, + TenantId = userinfo.TenantId, + UserName = userinfo.Account, + RealName = userinfo.RealName, + Time = DateTime.Now, + // ConnectionId = Context.ConnectionId, + // Ip = context.Connection.RemoteIpAddress?.MapToIPv4().ToString(), + // Browser = client.UA.Family + client.UA.Major, + // Os = client.OS.Family + client.OS.Major, + TotalOnlineSeconds = 0 + }; + await _sysOnlineUerRep.InsertAsync(user); + return new OnlineUserHasitexpireDTO() + { + IsExpired = true, + Msg = "ok" + }; + } + else + { + if (single.TotalOnlineSeconds / 60 > 5) + { + return new OnlineUserHasitexpireDTO() + { + IsExpired = true, + Msg = "您的AI功能已到期,请续费" + }; + } + } + return new OnlineUserHasitexpireDTO() + { + IsExpired = true, + Msg = "ok" + }; + } + /// + /// 强制下线 🔖 + /// + /// + /// + [NonValidation] + [DisplayName("强制下线")] + public async Task ForceOffline(SysOnlineUser user) + { + await _onlineUserHubContext.Clients.Client(user.ConnectionId).ForceOffline("强制下线"); + await _sysOnlineUerRep.DeleteAsync(user); + } + + /// + /// 发布站内消息 + /// + /// + /// + /// + [NonAction] + public async Task PublicNotice(SysNotice notice, List userIds) + { + var userList = await _sysOnlineUerRep.GetListAsync(u => userIds.Contains(u.UserId)); + if (!userList.Any()) return; + + foreach (var item in userList) + { + await _onlineUserHubContext.Clients.Client(item.ConnectionId).PublicNotice(notice); + } + } + + /// + /// 单用户登录 + /// + /// + [NonAction] + public async Task SingleLogin(long userId) + { + if (await _sysConfigService.GetConfigValue(CommonConst.SysSingleLogin)) + { + var users = await _sysOnlineUerRep.GetListAsync(u => u.UserId == userId); + foreach (var user in users) + { + await ForceOffline(user); + } + } + } + + /// + /// 通过用户ID踢掉在线用户 + /// + /// + /// + [NonAction] + public async Task ForceOffline(long userId) + { + var users = await _sysOnlineUerRep.GetListAsync(u => u.UserId == userId); + foreach (var user in users) + { + await ForceOffline(user); + } + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/OpenAccess/Dto/OpenAccessInput.cs b/Admin.NET/Admin.NET.Core/Service/OpenAccess/Dto/OpenAccessInput.cs new file mode 100644 index 0000000..04aa186 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/OpenAccess/Dto/OpenAccessInput.cs @@ -0,0 +1,73 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 开放接口身份输入参数 +/// +public class OpenAccessInput : BasePageInput +{ + /// + /// 身份标识 + /// + public string AccessKey { get; set; } +} + +public class AddOpenAccessInput : SysOpenAccess +{ + /// + /// 身份标识 + /// + [Required(ErrorMessage = "身份标识不能为空")] + public override string AccessKey { get; set; } + + /// + /// 密钥 + /// + [Required(ErrorMessage = "密钥不能为空")] + public override string AccessSecret { get; set; } + + /// + /// 绑定用户Id + /// + [Required(ErrorMessage = "绑定用户不能为空")] + public override long BindUserId { get; set; } +} + +public class UpdateOpenAccessInput : AddOpenAccessInput +{ +} + +public class DeleteOpenAccessInput : BaseIdInput +{ +} + +public class GenerateSignatureInput +{ + /// + /// 密钥 + /// + [Required(ErrorMessage = "密钥不能为空")] + public string AppSecret { get; set; } + + /// + /// 身份标识 + /// + [Required(ErrorMessage = "身份标识不能为空")] + public string AccessKey { get; set; } + + /// + /// 请求方法 + /// + public HttpMethodEnum Method { get; set; } + + /// + /// 请求接口地址 + /// + [Required(ErrorMessage = "请求接口地址不能为空")] + public string Url { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/OpenAccess/Dto/OpenAccessOutput.cs b/Admin.NET/Admin.NET.Core/Service/OpenAccess/Dto/OpenAccessOutput.cs new file mode 100644 index 0000000..47516fd --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/OpenAccess/Dto/OpenAccessOutput.cs @@ -0,0 +1,20 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class OpenAccessOutput : SysOpenAccess +{ + /// + /// 绑定用户账号 + /// + public string BindUserAccount { get; set; } + + /// + /// 绑定租户名称 + /// + public string BindTenantName { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/OpenAccess/SysOpenAccessService.cs b/Admin.NET/Admin.NET.Core/Service/OpenAccess/SysOpenAccessService.cs new file mode 100644 index 0000000..817bc9e --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/OpenAccess/SysOpenAccessService.cs @@ -0,0 +1,201 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using System.Security.Claims; +using System.Security.Cryptography; + +namespace Admin.NET.Core.Service; + +/// +/// 开放接口身份服务 🧩 +/// +[ApiDescriptionSettings(Order = 244)] +public class SysOpenAccessService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _sysOpenAccessRep; + private readonly SysCacheService _sysCacheService; + + /// + /// 开放接口身份服务构造函数 + /// + public SysOpenAccessService(SqlSugarRepository sysOpenAccessRep, + SysCacheService sysCacheService) + { + _sysOpenAccessRep = sysOpenAccessRep; + _sysCacheService = sysCacheService; + } + + /// + /// 获取生成的签名 + /// + /// + /// + [DisplayName("获取生成的签名")] + public string GetGenerateSignature([FromQuery] GenerateSignatureInput input) + { + // 密钥 + var appSecretByte = Encoding.UTF8.GetBytes(input.AppSecret); + // 时间戳,精确到秒 + DateTimeOffset currentTime = DateTimeOffset.UtcNow; + var timestamp = currentTime.ToUnixTimeSeconds(); + // 唯一随机数,可以使用guid或者雪花id,以下是sqlsugar提供获取雪花id的方法 + var nonce = YitIdHelper.NextId(); + //// 请求方式 + //var sMethod = method.ToString(); + // 拼接参数 + var parameter = $"{input.Method}&{input.Url}&{input.AccessKey}&{timestamp}&{nonce}"; + // 使用 HMAC-SHA256 协议创建基于哈希的消息身份验证代码 (HMAC),以appSecretByte 作为密钥,对上面拼接的参数进行计算签名,所得签名进行 Base-64 编码 + using HMAC hmac = new HMACSHA256(); + hmac.Key = appSecretByte; + var sign = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(parameter))); + return sign; + } + + /// + /// 获取开放接口身份分页列表 🔖 + /// + /// + /// + [DisplayName("获取开放接口身份分页列表")] + public async Task> Page(OpenAccessInput input) + { + return await _sysOpenAccessRep.AsQueryable() + .LeftJoin((u, a) => u.BindUserId == a.Id) + .LeftJoin((u, a, b) => u.BindTenantId == b.Id) + .LeftJoin((u, a, b, c) => b.OrgId == c.Id) + .WhereIF(!string.IsNullOrWhiteSpace(input.AccessKey?.Trim()), (u, a, b, c) => u.AccessKey.Contains(input.AccessKey)) + .Select((u, a, b, c) => new OpenAccessOutput + { + BindUserAccount = a.Account, + BindTenantName = c.Name, + }, true) + .ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 增加开放接口身份 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Add"), HttpPost] + [DisplayName("增加开放接口身份")] + public async Task AddOpenAccess(AddOpenAccessInput input) + { + if (await _sysOpenAccessRep.AsQueryable().AnyAsync(u => u.AccessKey == input.AccessKey && u.Id != input.Id)) + throw Oops.Oh(ErrorCodeEnum.O1000); + + var openAccess = input.Adapt(); + await _sysOpenAccessRep.InsertAsync(openAccess); + } + + /// + /// 更新开放接口身份 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Update"), HttpPost] + [DisplayName("更新开放接口身份")] + public async Task UpdateOpenAccess(UpdateOpenAccessInput input) + { + if (await _sysOpenAccessRep.AsQueryable().AnyAsync(u => u.AccessKey == input.AccessKey && u.Id != input.Id)) + throw Oops.Oh(ErrorCodeEnum.O1000); + + var openAccess = input.Adapt(); + _sysCacheService.Remove(CacheConst.KeyOpenAccess + openAccess.AccessKey); + + await _sysOpenAccessRep.UpdateAsync(openAccess); + } + + /// + /// 删除开放接口身份 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + [DisplayName("删除开放接口身份")] + public async Task DeleteOpenAccess(DeleteOpenAccessInput input) + { + var openAccess = await _sysOpenAccessRep.GetFirstAsync(u => u.Id == input.Id); + if (openAccess != null) + _sysCacheService.Remove(CacheConst.KeyOpenAccess + openAccess.AccessKey); + + await _sysOpenAccessRep.DeleteAsync(u => u.Id == input.Id); + } + + /// + /// 创建密钥 🔖 + /// + /// + [DisplayName("创建密钥")] + public async Task CreateSecret() + { + return await Task.FromResult(Convert.ToBase64String(Guid.NewGuid().ToByteArray())[..^2]); + } + + /// + /// 根据 Key 获取对象 + /// + /// + /// + [NonAction] + public async Task GetByKey(string accessKey) + { + return await Task.FromResult( + _sysCacheService.GetOrAdd(CacheConst.KeyOpenAccess + accessKey, _ => + { + return _sysOpenAccessRep.AsQueryable() + .Includes(u => u.BindUser) + .Includes(u => u.BindUser, p => p.SysOrg) + .First(u => u.AccessKey == accessKey); + }) + ); + } + + /// + /// Signature 身份验证事件默认实现 + /// + [NonAction] + public static SignatureAuthenticationEvent GetSignatureAuthenticationEventImpl() + { + return new SignatureAuthenticationEvent + { + OnGetAccessSecret = context => + { + var logger = context.HttpContext.RequestServices.GetRequiredService>(); + try + { + var openAccessService = context.HttpContext.RequestServices.GetRequiredService(); + var openAccess = openAccessService.GetByKey(context.AccessKey).GetAwaiter().GetResult(); + return Task.FromResult(openAccess == null ? "" : openAccess.AccessSecret); + } + catch (Exception ex) + { + logger.LogError(ex, "开发接口身份验证"); + return Task.FromResult(""); + } + }, + OnValidated = context => + { + var openAccessService = context.HttpContext.RequestServices.GetRequiredService(); + var openAccess = openAccessService.GetByKey(context.AccessKey).GetAwaiter().GetResult(); + var identity = ((ClaimsIdentity)context.Principal!.Identity!); + + identity.AddClaims(new[] + { + new Claim(ClaimConst.UserId, openAccess.BindUserId + ""), + new Claim(ClaimConst.TenantId, openAccess.BindTenantId + ""), + new Claim(ClaimConst.Account, openAccess.BindUser.Account + ""), + new Claim(ClaimConst.RealName, openAccess.BindUser.RealName), + new Claim(ClaimConst.AccountType, ((int)openAccess.BindUser.AccountType).ToString()), + new Claim(ClaimConst.OrgId, openAccess.BindUser.OrgId + ""), + new Claim(ClaimConst.OrgName, openAccess.BindUser.SysOrg?.Name + ""), + new Claim(ClaimConst.OrgType, openAccess.BindUser.SysOrg?.Type + ""), + }); + return Task.CompletedTask; + } + }; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Org/Dto/OrgInput.cs b/Admin.NET/Admin.NET.Core/Service/Org/Dto/OrgInput.cs new file mode 100644 index 0000000..779d9b1 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Org/Dto/OrgInput.cs @@ -0,0 +1,42 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class OrgInput : BaseIdInput +{ + /// + /// 名称 + /// + public string Name { get; set; } + + /// + /// 编码 + /// + public string Code { get; set; } + + /// + /// 机构类型 + /// + public string Type { get; set; } +} + +public class AddOrgInput : SysOrg +{ + /// + /// 名称 + /// + [Required(ErrorMessage = "机构名称不能为空")] + public override string Name { get; set; } +} + +public class UpdateOrgInput : AddOrgInput +{ +} + +public class DeleteOrgInput : BaseIdInput +{ +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Org/SysOrgService.cs b/Admin.NET/Admin.NET.Core/Service/Org/SysOrgService.cs new file mode 100644 index 0000000..d13ba87 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Org/SysOrgService.cs @@ -0,0 +1,408 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统机构服务 🧩 +/// +[ApiDescriptionSettings(Order = 470)] +public class SysOrgService : IDynamicApiController, ITransient +{ + private readonly UserManager _userManager; + private readonly SqlSugarRepository _sysOrgRep; + private readonly SysCacheService _sysCacheService; + private readonly SysUserExtOrgService _sysUserExtOrgService; + private readonly SysUserRoleService _sysUserRoleService; + private readonly SysRoleOrgService _sysRoleOrgService; + + public SysOrgService(UserManager userManager, + SqlSugarRepository sysOrgRep, + SysCacheService sysCacheService, + SysUserExtOrgService sysUserExtOrgService, + SysUserRoleService sysUserRoleService, + SysRoleOrgService sysRoleOrgService) + { + _sysOrgRep = sysOrgRep; + _userManager = userManager; + _sysCacheService = sysCacheService; + _sysUserExtOrgService = sysUserExtOrgService; + _sysUserRoleService = sysUserRoleService; + _sysRoleOrgService = sysRoleOrgService; + } + + /// + /// 获取机构列表 🔖 + /// + /// + [DisplayName("获取机构列表")] + public async Task> GetList([FromQuery] OrgInput input) + { + // 获取拥有的机构Id集合 + var userOrgIdList = await GetUserOrgIdList(); + + var iSugarQueryable = _sysOrgRep.AsQueryable().OrderBy(u => u.OrderNo); + + // 带条件筛选时返回列表数据 + if (!string.IsNullOrWhiteSpace(input.Name) || !string.IsNullOrWhiteSpace(input.Code) || !string.IsNullOrWhiteSpace(input.Type)) + { + return await iSugarQueryable.WhereIF(userOrgIdList.Count > 0, u => userOrgIdList.Contains(u.Id)) + .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name)) + .WhereIF(!string.IsNullOrWhiteSpace(input.Code), u => u.Code == input.Code) + .WhereIF(!string.IsNullOrWhiteSpace(input.Type), u => u.Type == input.Type) + .ToListAsync(); + } + + var orgTree = new List(); + if (_userManager.SuperAdmin) + { + orgTree = await iSugarQueryable.ToTreeAsync(u => u.Children, u => u.Pid, input.Id); + } + else + { + orgTree = await iSugarQueryable.ToTreeAsync(u => u.Children, u => u.Pid, input.Id, userOrgIdList.Select(d => (object)d).ToArray()); + // 递归禁用没权限的机构(防止用户修改或创建无权的机构和用户) + HandlerOrgTree(orgTree, userOrgIdList); + } + + var sysOrg = await _sysOrgRep.GetSingleAsync(u => u.Id == input.Id); + if (sysOrg != null) + { + sysOrg.Children = orgTree; + orgTree = new List { sysOrg }; + } + return orgTree; + } + + /// + /// 递归禁用没权限的机构 + /// + /// + /// + private static void HandlerOrgTree(List orgTree, List userOrgIdList) + { + foreach (var org in orgTree) + { + org.Disabled = !userOrgIdList.Contains(org.Id); // 设置禁用/不可选择 + if (org.Children != null) + HandlerOrgTree(org.Children, userOrgIdList); + } + } + + /// + /// 增加机构 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Add"), HttpPost] + [DisplayName("增加机构")] + public async Task AddOrg(AddOrgInput input) + { + if (!_userManager.SuperAdmin && input.Pid == 0) + throw Oops.Oh(ErrorCodeEnum.D2009); + + if (await _sysOrgRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code)) + throw Oops.Oh(ErrorCodeEnum.D2002); + + if (!_userManager.SuperAdmin && input.Pid != 0) + { + // 新增机构父Id不是0,则进行权限校验 + var orgIdList = await GetUserOrgIdList(); + // 新增机构的父机构不在自己的数据范围内 + if (orgIdList.Count < 1 || !orgIdList.Contains(input.Pid)) + throw Oops.Oh(ErrorCodeEnum.D2003); + } + + // 删除与此父机构有关的用户机构缓存 + var pOrg = await _sysOrgRep.GetFirstAsync(u => u.Id == input.Pid); + if (pOrg != null) + DeleteAllUserOrgCache(pOrg.Id, pOrg.Pid); + else if (input.Pid == 0) + DeleteAllUserOrgCache(0, 0); + + var newOrg = await _sysOrgRep.AsInsertable(input.Adapt()).ExecuteReturnEntityAsync(); + return newOrg.Id; + } + + /// + /// 批量增加机构 + /// + /// + /// + [NonAction] + public async Task BatchAddOrgs(List orgs) + { + DeleteAllUserOrgCache(0, 0); + await _sysOrgRep.AsDeleteable().ExecuteCommandAsync(); + await _sysOrgRep.AsInsertable(orgs).ExecuteCommandAsync(); + } + + /// + /// 更新机构 🔖 + /// + /// + /// + [UnitOfWork] + [ApiDescriptionSettings(Name = "Update"), HttpPost] + [DisplayName("更新机构")] + public async Task UpdateOrg(UpdateOrgInput input) + { + if (!_userManager.SuperAdmin && input.Pid == 0) + throw Oops.Oh(ErrorCodeEnum.D2009); + + if (input.Pid != 0) + { + //var pOrg = await _sysOrgRep.GetFirstAsync(u => u.Id == input.Pid); + //_ = pOrg ?? throw Oops.Oh(ErrorCodeEnum.D2000); + + // 若父机构发生变化则清空用户机构缓存 + var sysOrg = await _sysOrgRep.GetFirstAsync(u => u.Id == input.Id); + if (sysOrg != null && sysOrg.Pid != input.Pid) + { + // 删除与此机构、新父机构有关的用户机构缓存 + DeleteAllUserOrgCache(sysOrg.Id, input.Pid); + } + } + if (input.Id == input.Pid) + throw Oops.Oh(ErrorCodeEnum.D2001); + + if (await _sysOrgRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code && u.Id != input.Id)) + throw Oops.Oh(ErrorCodeEnum.D2002); + + // 父Id不能为自己的子节点 + var childIdList = await GetChildIdListWithSelfById(input.Id); + if (childIdList.Contains(input.Pid)) + throw Oops.Oh(ErrorCodeEnum.D2001); + + // 是否有权限操作此机构 + if (!_userManager.SuperAdmin) + { + var orgIdList = await GetUserOrgIdList(); + if (orgIdList.Count < 1 || !orgIdList.Contains(input.Id)) + throw Oops.Oh(ErrorCodeEnum.D2003); + } + + await _sysOrgRep.AsUpdateable(input.Adapt()).IgnoreColumns(true).ExecuteCommandAsync(); + } + + /// + /// 删除机构 🔖 + /// + /// + /// + [UnitOfWork] + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + [DisplayName("删除机构")] + public async Task DeleteOrg(DeleteOrgInput input) + { + var sysOrg = await _sysOrgRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + + // 是否有权限操作此机构 + if (!_userManager.SuperAdmin) + { + var orgIdList = await GetUserOrgIdList(); + if (orgIdList.Count < 1 || !orgIdList.Contains(sysOrg.Id)) + throw Oops.Oh(ErrorCodeEnum.D2003); + } + + // 若机构为租户默认机构禁止删除 + var isTenantOrg = await _sysOrgRep.ChangeRepository>() + .IsAnyAsync(u => u.OrgId == input.Id); + if (isTenantOrg) + throw Oops.Oh(ErrorCodeEnum.D2008); + + // 若机构有用户则禁止删除 + var orgHasEmp = await _sysOrgRep.ChangeRepository>() + .IsAnyAsync(u => u.OrgId == input.Id); + if (orgHasEmp) + throw Oops.Oh(ErrorCodeEnum.D2004); + + // 若扩展机构有用户则禁止删除 + var hasExtOrgEmp = await _sysUserExtOrgService.HasUserOrg(sysOrg.Id); + if (hasExtOrgEmp) + throw Oops.Oh(ErrorCodeEnum.D2005); + + // 若子机构有用户则禁止删除 + var childOrgTreeList = await _sysOrgRep.AsQueryable().ToChildListAsync(u => u.Pid, input.Id, true); + var childOrgIdList = childOrgTreeList.Select(u => u.Id).ToList(); + + // 若子机构有用户则禁止删除 + var cOrgHasEmp = await _sysOrgRep.ChangeRepository>() + .IsAnyAsync(u => childOrgIdList.Contains(u.OrgId)); + if (cOrgHasEmp) + throw Oops.Oh(ErrorCodeEnum.D2007); + + // 删除与此机构、父机构有关的用户机构缓存 + DeleteAllUserOrgCache(sysOrg.Id, sysOrg.Pid); + + // 级联删除机构子节点 + await _sysOrgRep.DeleteAsync(u => childOrgIdList.Contains(u.Id)); + + // 级联删除角色机构数据 + await _sysRoleOrgService.DeleteRoleOrgByOrgIdList(childOrgIdList); + + // 级联删除用户机构数据 + await _sysUserExtOrgService.DeleteUserExtOrgByOrgIdList(childOrgIdList); + } + + /// + /// 删除与此机构、父机构有关的用户机构缓存 + /// + /// + /// + private void DeleteAllUserOrgCache(long orgId, long orgPid) + { + var userOrgKeyList = _sysCacheService.GetKeysByPrefixKey(CacheConst.KeyUserOrg); + if (userOrgKeyList != null && userOrgKeyList.Count > 0) + { + foreach (var userOrgKey in userOrgKeyList) + { + var userOrgs = _sysCacheService.Get>(userOrgKey); + var userId = long.Parse(userOrgKey.Substring(CacheConst.KeyUserOrg)); + if (userOrgs.Contains(orgId) || userOrgs.Contains(orgPid)) + { + SqlSugarFilter.DeleteUserOrgCache(userId, _sysOrgRep.Context.CurrentConnectionConfig.ConfigId.ToString()); + } + if (orgPid == 0) + { + var dataScope = _sysCacheService.Get($"{CacheConst.KeyRoleMaxDataScope}{userId}"); + if (dataScope == (int)DataScopeEnum.All) + { + SqlSugarFilter.DeleteUserOrgCache(userId, _sysOrgRep.Context.CurrentConnectionConfig.ConfigId.ToString()); + } + } + } + } + } + + /// + /// 根据用户Id获取机构Id集合 + /// + /// + [NonAction] + public async Task> GetUserOrgIdList() + { + if (_userManager.SuperAdmin) + return new List(); + + var userId = _userManager.UserId; + var orgIdList = _sysCacheService.Get>($"{CacheConst.KeyUserOrg}{userId}"); // 取缓存 + if (orgIdList == null || orgIdList.Count < 1) + { + // 本人创建机构集合 + var orgList0 = await _sysOrgRep.AsQueryable().Where(u => u.CreateUserId == userId).Select(u => u.Id).ToListAsync(); + // 扩展机构集合 + var orgList1 = await _sysUserExtOrgService.GetUserExtOrgList(userId); + // 角色机构集合 + var orgList2 = await GetUserRoleOrgIdList(userId); + // 机构并集 + orgIdList = orgList1.Select(u => u.OrgId).Union(orgList2).Union(orgList0).ToList(); + // 当前所属机构 + if (!orgIdList.Contains(_userManager.OrgId)) + orgIdList.Add(_userManager.OrgId); + _sysCacheService.Set($"{CacheConst.KeyUserOrg}{userId}", orgIdList, TimeSpan.FromDays(7)); // 存缓存 + } + return orgIdList; + } + + /// + /// 获取用户角色机构Id集合 + /// + /// + /// + private async Task> GetUserRoleOrgIdList(long userId) + { + var roleList = await _sysUserRoleService.GetUserRoleList(userId); + if (roleList.Count < 1) + return new List(); // 空机构Id集合 + + return await GetUserOrgIdList(roleList); + } + + /// + /// 根据角色Id集合获取机构Id集合 + /// + /// + /// + private async Task> GetUserOrgIdList(List roleList) + { + // 按最大范围策略设定(若同时拥有ALL和SELF权限,则结果ALL) + int strongerDataScopeType = (int)DataScopeEnum.Self; + + // 自定义数据范围的角色集合 + var customDataScopeRoleIdList = new List(); + + // 数据范围的机构集合 + var dataScopeOrgIdList = new List(); + + if (roleList != null && roleList.Count > 0) + { + roleList.ForEach(u => + { + if (u.DataScope == DataScopeEnum.Define) + { + customDataScopeRoleIdList.Add(u.Id); + strongerDataScopeType = (int)u.DataScope; // 自定义数据权限时也要更新最大范围 + } + else if ((int)u.DataScope <= strongerDataScopeType) + { + strongerDataScopeType = (int)u.DataScope; + // 根据数据范围获取机构集合 + var orgIds = GetOrgIdListByDataScope(strongerDataScopeType).GetAwaiter().GetResult(); + dataScopeOrgIdList = dataScopeOrgIdList.Union(orgIds).ToList(); + } + }); + } + + // 缓存当前用户最大角色数据范围 + _sysCacheService.Set(CacheConst.KeyRoleMaxDataScope + _userManager.UserId, strongerDataScopeType, TimeSpan.FromDays(7)); + + // 根据角色集合获取机构集合 + var roleOrgIdList = await _sysRoleOrgService.GetRoleOrgIdList(customDataScopeRoleIdList); + + // 并集机构集合 + return roleOrgIdList.Union(dataScopeOrgIdList).ToList(); + } + + /// + /// 根据数据范围获取机构Id集合 + /// + /// + /// + private async Task> GetOrgIdListByDataScope(int dataScope) + { + var orgId = _userManager.OrgId; + var orgIdList = new List(); + // 若数据范围是全部,则获取所有机构Id集合 + if (dataScope == (int)DataScopeEnum.All) + { + orgIdList = await _sysOrgRep.AsQueryable().Select(u => u.Id).ToListAsync(); + } + // 若数据范围是本部门及以下,则获取本节点和子节点集合 + else if (dataScope == (int)DataScopeEnum.DeptChild) + { + orgIdList = await GetChildIdListWithSelfById(orgId); + } + // 若数据范围是本部门不含子节点,则直接返回本部门 + else if (dataScope == (int)DataScopeEnum.Dept) + { + orgIdList.Add(orgId); + } + return orgIdList; + } + + /// + /// 根据节点Id获取子节点Id集合(包含自己) + /// + /// + /// + [NonAction] + public async Task> GetChildIdListWithSelfById(long pid) + { + var orgTreeList = await _sysOrgRep.AsQueryable().ToChildListAsync(u => u.Pid, pid, true); + return orgTreeList.Select(u => u.Id).ToList(); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Plugin/Dto/PluginInput.cs b/Admin.NET/Admin.NET.Core/Service/Plugin/Dto/PluginInput.cs new file mode 100644 index 0000000..f077354 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Plugin/Dto/PluginInput.cs @@ -0,0 +1,37 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class PagePluginInput : BasePageInput +{ + /// + /// 名称 + /// + public string Name { get; set; } + + /// + /// 编码 + /// + public string Code { get; set; } +} + +public class AddPluginInput : SysPlugin +{ + /// + /// 名称 + /// + [Required(ErrorMessage = "功能名称不能为空")] + public override string Name { get; set; } +} + +public class UpdatePluginInput : AddPluginInput +{ +} + +public class DeletePluginInput : BaseIdInput +{ +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Plugin/SysPluginService.cs b/Admin.NET/Admin.NET.Core/Service/Plugin/SysPluginService.cs new file mode 100644 index 0000000..24b5e8b --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Plugin/SysPluginService.cs @@ -0,0 +1,124 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统动态插件服务 🧩 +/// +[ApiDescriptionSettings(Order = 245)] +public class SysPluginService : IDynamicApiController, ITransient +{ + private readonly IDynamicApiRuntimeChangeProvider _provider; + private readonly SqlSugarRepository _sysPluginRep; + + public SysPluginService(IDynamicApiRuntimeChangeProvider provider, + SqlSugarRepository sysPluginRep) + { + _provider = provider; + _sysPluginRep = sysPluginRep; + } + + /// + /// 获取动态插件列表 🧩 + /// + /// + /// + [DisplayName("获取动态插件列表")] + public async Task> Page(PagePluginInput input) + { + return await _sysPluginRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name)) + .OrderBy(u => u.OrderNo) + .ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 增加动态插件 🧩 + /// + /// + /// + [ApiDescriptionSettings(Name = "Add"), HttpPost] + [DisplayName("增加动态插件")] + public async Task AddPlugin(AddPluginInput input) + { + var isExist = await _sysPluginRep.IsAnyAsync(u => u.Name == input.Name || u.AssemblyName == input.AssemblyName); + if (isExist) + throw Oops.Oh(ErrorCodeEnum.D1900); + + // 添加动态程序集/接口 + input.AssemblyName = CompileAssembly(input.CsharpCode, input.AssemblyName); + + await _sysPluginRep.InsertAsync(input.Adapt()); + } + + /// + /// 更新动态插件 🧩 + /// + /// + /// + [ApiDescriptionSettings(Name = "Update"), HttpPost] + [DisplayName("更新动态插件")] + public async Task UpdatePlugin(UpdatePluginInput input) + { + var isExist = await _sysPluginRep.IsAnyAsync(u => (u.Name == input.Name || u.AssemblyName == input.AssemblyName) && u.Id != input.Id); + if (isExist) + throw Oops.Oh(ErrorCodeEnum.D1900); + + // 先移除再添加动态程序集/接口 + RemoveAssembly(input.AssemblyName); + input.AssemblyName = CompileAssembly(input.CsharpCode); + + await _sysPluginRep.AsUpdateable(input.Adapt()).IgnoreColumns(true).ExecuteCommandAsync(); + } + + /// + /// 删除动态插件 🧩 + /// + /// + /// + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + [DisplayName("删除动态插件")] + public async Task DeletePlugin(DeletePluginInput input) + { + var plugin = await _sysPluginRep.GetByIdAsync(input.Id); + if (plugin == null) return; + + // 移除动态程序集/接口 + RemoveAssembly(plugin.AssemblyName); + + await _sysPluginRep.DeleteAsync(u => u.Id == input.Id); + } + + /// + /// 添加动态程序集/接口 🧩 + /// + /// + /// 程序集名称 + /// + [DisplayName("添加动态程序集/接口")] + public string CompileAssembly([FromBody] string csharpCode, [FromQuery] string assemblyName = default) + { + // 编译 C# 代码并返回动态程序集 + var dynamicAssembly = App.CompileCSharpClassCode(csharpCode, assemblyName); + + // 将程序集添加进动态 WebAPI 应用部件 + _provider.AddAssembliesWithNotifyChanges(dynamicAssembly); + + // 返回动态程序集名称 + return dynamicAssembly.GetName().Name; + } + + /// + /// 移除动态程序集/接口 🧩 + /// + [ApiDescriptionSettings(Name = "RemoveAssembly"), HttpPost] + [DisplayName("移除动态程序集/接口")] + public void RemoveAssembly(string assemblyName) + { + _provider.RemoveAssembliesWithNotifyChanges(assemblyName); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Pos/Dto/PosInput.cs b/Admin.NET/Admin.NET.Core/Service/Pos/Dto/PosInput.cs new file mode 100644 index 0000000..183666f --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Pos/Dto/PosInput.cs @@ -0,0 +1,37 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class PosInput +{ + /// + /// 名称 + /// + public string Name { get; set; } + + /// + /// 编码 + /// + public string Code { get; set; } +} + +public class AddPosInput : SysPos +{ + /// + /// 名称 + /// + [Required(ErrorMessage = "职位名称不能为空")] + public override string Name { get; set; } +} + +public class UpdatePosInput : AddPosInput +{ +} + +public class DeletePosInput : BaseIdInput +{ +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Pos/SysPosService.cs b/Admin.NET/Admin.NET.Core/Service/Pos/SysPosService.cs new file mode 100644 index 0000000..d6c431c --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Pos/SysPosService.cs @@ -0,0 +1,102 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统职位服务 🧩 +/// +[ApiDescriptionSettings(Order = 460)] +public class SysPosService : IDynamicApiController, ITransient +{ + private readonly UserManager _userManager; + private readonly SqlSugarRepository _sysPosRep; + private readonly SysUserExtOrgService _sysUserExtOrgService; + + public SysPosService(UserManager userManager, + SqlSugarRepository sysPosRep, + SysUserExtOrgService sysUserExtOrgService) + { + _userManager = userManager; + _sysPosRep = sysPosRep; + _sysUserExtOrgService = sysUserExtOrgService; + } + + /// + /// 获取职位列表 🔖 + /// + /// + /// + [DisplayName("获取职位列表")] + public async Task> GetList([FromQuery] PosInput input) + { + return await _sysPosRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name)) + .WhereIF(!string.IsNullOrWhiteSpace(input.Code), u => u.Code.Contains(input.Code)) + .OrderBy(u => u.OrderNo).ToListAsync(); + } + + /// + /// 增加职位 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Add"), HttpPost] + [DisplayName("增加职位")] + public async Task AddPos(AddPosInput input) + { + if (await _sysPosRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code)) + throw Oops.Oh(ErrorCodeEnum.D6000); + + await _sysPosRep.InsertAsync(input.Adapt()); + } + + /// + /// 更新职位 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Update"), HttpPost] + [DisplayName("更新职位")] + public async Task UpdatePos(UpdatePosInput input) + { + if (await _sysPosRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code && u.Id != input.Id)) + throw Oops.Oh(ErrorCodeEnum.D6000); + + var sysPos = await _sysPosRep.GetByIdAsync(input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D6003); + if (!_userManager.SuperAdmin && sysPos.CreateUserId != _userManager.UserId) + throw Oops.Oh(ErrorCodeEnum.D6002); + + await _sysPosRep.AsUpdateable(input.Adapt()).IgnoreColumns(true).ExecuteCommandAsync(); + } + + /// + /// 删除职位 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + [DisplayName("删除职位")] + public async Task DeletePos(DeletePosInput input) + { + var sysPos = await _sysPosRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D6003); + if (!_userManager.SuperAdmin && sysPos.CreateUserId != _userManager.UserId) + throw Oops.Oh(ErrorCodeEnum.D6002); + + // 若职位有用户则禁止删除 + var hasPosEmp = await _sysPosRep.ChangeRepository>() + .IsAnyAsync(u => u.PosId == input.Id); + if (hasPosEmp) + throw Oops.Oh(ErrorCodeEnum.D6001); + + // 若附属职位有用户则禁止删除 + var hasExtPosEmp = await _sysUserExtOrgService.HasUserPos(input.Id); + if (hasExtPosEmp) + throw Oops.Oh(ErrorCodeEnum.D6001); + + await _sysPosRep.DeleteAsync(u => u.Id == input.Id); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Print/Dto/PrintInput.cs b/Admin.NET/Admin.NET.Core/Service/Print/Dto/PrintInput.cs new file mode 100644 index 0000000..4888706 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Print/Dto/PrintInput.cs @@ -0,0 +1,37 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class PagePrintInput : BasePageInput +{ + /// + /// 名称 + /// + public string Name { get; set; } + + /// + /// 编码 + /// + public string Code { get; set; } +} + +public class AddPrintInput : SysPrint +{ + /// + /// 名称 + /// + [Required(ErrorMessage = "模板名称不能为空")] + public override string Name { get; set; } +} + +public class UpdatePrintInput : AddPrintInput +{ +} + +public class DeletePrintInput : BaseIdInput +{ +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Print/SysPrintService.cs b/Admin.NET/Admin.NET.Core/Service/Print/SysPrintService.cs new file mode 100644 index 0000000..23c2a4e --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Print/SysPrintService.cs @@ -0,0 +1,90 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统打印模板服务 🧩 +/// +[ApiDescriptionSettings(Order = 305)] +public class SysPrintService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _sysPrintRep; + + public SysPrintService(SqlSugarRepository sysPrintRep) + { + _sysPrintRep = sysPrintRep; + } + + /// + /// 获取打印模板列表 🖨️ + /// + /// + /// + [DisplayName("获取打印模板列表")] + public async Task> Page(PagePrintInput input) + { + return await _sysPrintRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name)) + .OrderBy(u => u.OrderNo) + .ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 获取打印模板 🖨️ + /// + /// + /// + [DisplayName("获取打印模板")] + public async Task GetPrint(string name) + { + return await _sysPrintRep.GetFirstAsync(u => u.Name == name); + } + + /// + /// 增加打印模板 🖨️ + /// + /// + /// + [ApiDescriptionSettings(Name = "Add"), HttpPost] + [DisplayName("增加打印模板")] + public async Task AddPrint(AddPrintInput input) + { + var isExist = await _sysPrintRep.IsAnyAsync(u => u.Name == input.Name); + if (isExist) + throw Oops.Oh(ErrorCodeEnum.D1800); + + await _sysPrintRep.InsertAsync(input.Adapt()); + } + + /// + /// 更新打印模板 🖨️ + /// + /// + /// + [ApiDescriptionSettings(Name = "Update"), HttpPost] + [DisplayName("更新打印模板")] + public async Task UpdatePrint(UpdatePrintInput input) + { + var isExist = await _sysPrintRep.IsAnyAsync(u => u.Name == input.Name && u.Id != input.Id); + if (isExist) + throw Oops.Oh(ErrorCodeEnum.D1800); + + await _sysPrintRep.AsUpdateable(input.Adapt()).IgnoreColumns(true).ExecuteCommandAsync(); + } + + /// + /// 删除打印模板 🖨️ + /// + /// + /// + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + [DisplayName("删除打印模板")] + public async Task DeletePrint(DeletePrintInput input) + { + await _sysPrintRep.DeleteAsync(u => u.Id == input.Id); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Region/Dto/RegionInput.cs b/Admin.NET/Admin.NET.Core/Service/Region/Dto/RegionInput.cs new file mode 100644 index 0000000..bb46561 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Region/Dto/RegionInput.cs @@ -0,0 +1,46 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class PageRegionInput : BasePageInput +{ + /// + /// 父节点Id + /// + public long Pid { get; set; } + + /// + /// 名称 + /// + public string Name { get; set; } + + /// + /// 编码 + /// + public string Code { get; set; } +} + +public class RegionInput : BaseIdInput +{ +} + +public class AddRegionInput : SysRegion +{ + /// + /// 名称 + /// + [Required(ErrorMessage = "名称不能为空")] + public override string Name { get; set; } +} + +public class UpdateRegionInput : AddRegionInput +{ +} + +public class DeleteRegionInput : BaseIdInput +{ +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Region/SysRegionService.cs b/Admin.NET/Admin.NET.Core/Service/Region/SysRegionService.cs new file mode 100644 index 0000000..bf0ca92 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Region/SysRegionService.cs @@ -0,0 +1,236 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统行政区域服务 🧩 +/// +[ApiDescriptionSettings(Order = 310)] +public class SysRegionService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _sysRegionRep; + + //// Url地址-国家统计局行政区域2023年 + //private readonly string _url = "http://www.stats.gov.cn/sj/tjbz/tjyqhdmhcxhfdm/2023/index.html"; + + public SysRegionService(SqlSugarRepository sysRegionRep) + { + _sysRegionRep = sysRegionRep; + } + + /// + /// 获取行政区域分页列表 🔖 + /// + /// + /// + [DisplayName("获取行政区域分页列表")] + public async Task> Page(PageRegionInput input) + { + return await _sysRegionRep.AsQueryable() + .WhereIF(input.Pid > 0, u => u.Pid == input.Pid || u.Id == input.Pid) + .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name)) + .WhereIF(!string.IsNullOrWhiteSpace(input.Code), u => u.Code.Contains(input.Code)) + .ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 获取行政区域列表 🔖 + /// + /// + /// + [DisplayName("获取行政区域列表")] + public async Task> GetList([FromQuery] RegionInput input) + { + return await _sysRegionRep.GetListAsync(u => u.Pid == input.Id); + } + + /// + /// 增加行政区域 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Add"), HttpPost] + [DisplayName("增加行政区域")] + public async Task AddRegion(AddRegionInput input) + { + input.Code = input.Code.Trim(); + if (input.Code.Length != 12 && input.Code.Length != 9 && input.Code.Length != 6) + throw Oops.Oh("行政区代码只能为6、9或12位"); + + if (input.Pid != 0) + { + var pRegion = await _sysRegionRep.GetFirstAsync(u => u.Id == input.Pid); + pRegion ??= await _sysRegionRep.GetFirstAsync(u => u.Code == input.Pid.ToString()); + if (pRegion == null) + throw Oops.Oh(ErrorCodeEnum.D2000); + input.Pid = pRegion.Id; + } + + var isExist = await _sysRegionRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code); + if (isExist) + throw Oops.Oh(ErrorCodeEnum.R2002); + + var sysRegion = input.Adapt(); + var newRegion = await _sysRegionRep.AsInsertable(sysRegion).ExecuteReturnEntityAsync(); + return newRegion.Id; + } + + /// + /// 更新行政区域 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Update"), HttpPost] + [DisplayName("更新行政区域")] + public async Task UpdateRegion(UpdateRegionInput input) + { + input.Code = input.Code.Trim(); + if (input.Code.Length != 12 && input.Code.Length != 9 && input.Code.Length != 6) + throw Oops.Oh("行政区代码只能为6、9或12位"); + + if (input.Pid != input.Pid && input.Pid != 0) + { + var pRegion = await _sysRegionRep.GetFirstAsync(u => u.Id == input.Pid); + pRegion ??= await _sysRegionRep.GetFirstAsync(u => u.Code == input.Pid.ToString()); + if (pRegion == null) + throw Oops.Oh(ErrorCodeEnum.D2000); + + input.Pid = pRegion.Id; + var regionTreeList = await _sysRegionRep.AsQueryable().ToChildListAsync(u => u.Pid, input.Id, true); + var childIdList = regionTreeList.Select(u => u.Id).ToList(); + if (childIdList.Contains(input.Pid)) + throw Oops.Oh("父节点不能为自己的子节点"); + } + + if (input.Id == input.Pid) + throw Oops.Oh(ErrorCodeEnum.R2001); + + var sysRegion = await _sysRegionRep.GetFirstAsync(u => u.Id == input.Id); + var isExist = await _sysRegionRep.IsAnyAsync(u => (u.Name == input.Name && u.Code == input.Code) && u.Id != sysRegion.Id); + if (isExist) + throw Oops.Oh(ErrorCodeEnum.R2002); + + //// 父Id不能为自己的子节点 + //var regionTreeList = await _sysRegionRep.AsQueryable().ToChildListAsync(u => u.Pid, input.Id, true); + //var childIdList = regionTreeList.Select(u => u.Id).ToList(); + //if (childIdList.Contains(input.Pid)) + // throw Oops.Oh(ErrorCodeEnum.R2001); + + await _sysRegionRep.AsUpdateable(input.Adapt()).IgnoreColumns(true).ExecuteCommandAsync(); + } + + /// + /// 删除行政区域 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + [DisplayName("删除行政区域")] + public async Task DeleteRegion(DeleteRegionInput input) + { + var regionTreeList = await _sysRegionRep.AsQueryable().ToChildListAsync(u => u.Pid, input.Id, true); + var regionIdList = regionTreeList.Select(u => u.Id).ToList(); + await _sysRegionRep.DeleteAsync(u => regionIdList.Contains(u.Id)); + } + + /// + /// 同步行政区域 🔖 + /// + /// + [DisplayName("同步行政区域")] + public async Task Sync() + { + await _sysRegionRep.DeleteAsync(u => u.Id > 0); + + //var context = BrowsingContext.New(AngleSharp.Configuration.Default.WithDefaultLoader()); + //var dom = await context.OpenAsync(_url); + + //// 省级 + //var itemList = dom.QuerySelectorAll("table.provincetable tr.provincetr td a"); + //foreach (IHtmlAnchorElement item in itemList) + //{ + // var region = await _sysRegionRep.InsertReturnEntityAsync(new SysRegion + // { + // Pid = 0, + // Name = item.TextContent, + // Remark = item.Href, + // Level = 1, + // }); + + // // 市级 + // if (string.IsNullOrEmpty(item.Href)) + // continue; + // var dom1 = await context.OpenAsync(item.Href); + // var itemList1 = dom1.QuerySelectorAll("table.citytable tr.citytr td a"); + // for (var i1 = 0; i1 < itemList1.Length; i1 += 2) + // { + // var item1 = (IHtmlAnchorElement)itemList1[i1 + 1]; + // var region1 = await _sysRegionRep.InsertReturnEntityAsync(new SysRegion + // { + // Pid = region.Id, + // Name = item1.TextContent, + // Code = itemList1[i1].TextContent, + // Remark = item1.Href, + // Level = 2, + // }); + + // // 区县级 + // if (string.IsNullOrEmpty(item1.Href)) + // continue; + // var dom2 = await context.OpenAsync(item1.Href); + // var itemList2 = dom2.QuerySelectorAll("table.countytable tr.countytr td a"); + // for (var i2 = 0; i2 < itemList2.Length; i2 += 2) + // { + // var item2 = (IHtmlAnchorElement)itemList2[i2 + 1]; + // var region2 = await _sysRegionRep.InsertReturnEntityAsync(new SysRegion + // { + // Pid = region1.Id, + // Name = item2.TextContent, + // Code = itemList2[i2].TextContent, + // Remark = item2.Href, + // Level = 3, + // }); + + // // 街道级 + // if (string.IsNullOrEmpty(item2.Href)) + // continue; + // var dom3 = await context.OpenAsync(item2.Href); + // var itemList3 = dom3.QuerySelectorAll("table.towntable tr.towntr td a"); + // for (var i3 = 0; i3 < itemList3.Length; i3 += 2) + // { + // var item3 = (IHtmlAnchorElement)itemList3[i3 + 1]; + // var region3 = await _sysRegionRep.InsertReturnEntityAsync(new SysRegion + // { + // Pid = region2.Id, + // Name = item3.TextContent, + // Code = itemList3[i3].TextContent, + // Remark = item3.Href, + // Level = 4, + // }); + + // // 村级 + // if (string.IsNullOrEmpty(item3.Href)) + // continue; + // var dom4 = await context.OpenAsync(item3.Href); + // var itemList4 = dom4.QuerySelectorAll("table.villagetable tr.villagetr td"); + // for (var i4 = 0; i4 < itemList4.Length; i4 += 3) + // { + // await _sysRegionRep.InsertAsync(new SysRegion + // { + // Pid = region3.Id, + // Name = itemList4[i4 + 2].TextContent, + // Code = itemList4[i4].TextContent, + // CityCode = itemList4[i4 + 1].TextContent, + // Level = 5, + // }); + // } + // } + // } + // } + //} + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Role/Dto/RoleInput.cs b/Admin.NET/Admin.NET.Core/Service/Role/Dto/RoleInput.cs new file mode 100644 index 0000000..f6f9370 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Role/Dto/RoleInput.cs @@ -0,0 +1,50 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class RoleInput : BaseIdInput +{ + /// + /// 状态 + /// + public virtual StatusEnum Status { get; set; } +} + +public class PageRoleInput : BasePageInput +{ + /// + /// 名称 + /// + public virtual string Name { get; set; } + + /// + /// 编码 + /// + public virtual string Code { get; set; } +} + +public class AddRoleInput : SysRole +{ + /// + /// 名称 + /// + [Required(ErrorMessage = "角色名称不能为空")] + public override string Name { get; set; } + + /// + /// 菜单Id集合 + /// + public List MenuIdList { get; set; } +} + +public class UpdateRoleInput : AddRoleInput +{ +} + +public class DeleteRoleInput : BaseIdInput +{ +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Role/Dto/RoleMenuInput.cs b/Admin.NET/Admin.NET.Core/Service/Role/Dto/RoleMenuInput.cs new file mode 100644 index 0000000..9571223 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Role/Dto/RoleMenuInput.cs @@ -0,0 +1,18 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 授权角色菜单 +/// +public class RoleMenuInput : BaseIdInput +{ + /// + /// 菜单Id集合 + /// + public List MenuIdList { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Role/Dto/RoleMenuOutput .cs b/Admin.NET/Admin.NET.Core/Service/Role/Dto/RoleMenuOutput .cs new file mode 100644 index 0000000..e2a4511 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Role/Dto/RoleMenuOutput .cs @@ -0,0 +1,23 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 角色菜单输出参数 +/// +public class RoleMenuOutput +{ + /// + /// Id + /// + public long Id { get; set; } + + /// + /// 名称 + /// + public string Title { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Role/Dto/RoleOrgInput.cs b/Admin.NET/Admin.NET.Core/Service/Role/Dto/RoleOrgInput.cs new file mode 100644 index 0000000..51e8010 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Role/Dto/RoleOrgInput.cs @@ -0,0 +1,23 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 授权角色机构 +/// +public class RoleOrgInput : BaseIdInput +{ + /// + /// 数据范围 + /// + public int DataScope { get; set; } + + /// + /// 机构Id集合 + /// + public List OrgIdList { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Role/Dto/RoleOutput.cs b/Admin.NET/Admin.NET.Core/Service/Role/Dto/RoleOutput.cs new file mode 100644 index 0000000..501603f --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Role/Dto/RoleOutput.cs @@ -0,0 +1,28 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 角色列表输出参数 +/// +public class RoleOutput +{ + /// + /// Id + /// + public long Id { get; set; } + + /// + /// 名称 + /// + public string Name { get; set; } + + /// + /// 编码 + /// + public string Code { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Role/SysRoleMenuService.cs b/Admin.NET/Admin.NET.Core/Service/Role/SysRoleMenuService.cs new file mode 100644 index 0000000..f8dce9b --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Role/SysRoleMenuService.cs @@ -0,0 +1,75 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统角色菜单服务 +/// +public class SysRoleMenuService : ITransient +{ + private readonly SqlSugarRepository _sysRoleMenuRep; + private readonly SysCacheService _sysCacheService; + + public SysRoleMenuService(SqlSugarRepository sysRoleMenuRep, + SysCacheService sysCacheService) + { + _sysRoleMenuRep = sysRoleMenuRep; + _sysCacheService = sysCacheService; + } + + /// + /// 根据角色Id集合获取菜单Id集合 + /// + /// + /// + public async Task> GetRoleMenuIdList(List roleIdList) + { + return await _sysRoleMenuRep.AsQueryable() + .Where(u => roleIdList.Contains(u.RoleId)) + .Select(u => u.MenuId).ToListAsync(); + } + + /// + /// 授权角色菜单 + /// + /// + /// + public async Task GrantRoleMenu(RoleMenuInput input) + { + await _sysRoleMenuRep.DeleteAsync(u => u.RoleId == input.Id); + var menus = input.MenuIdList.Select(u => new SysRoleMenu + { + RoleId = input.Id, + MenuId = u + }).ToList(); + await _sysRoleMenuRep.InsertRangeAsync(menus); + + // 清除缓存 + // _sysCacheService.RemoveByPrefixKey(CacheConst.KeyUserMenu); + _sysCacheService.RemoveByPrefixKey(CacheConst.KeyUserButton); + } + + /// + /// 根据菜单Id集合删除角色菜单 + /// + /// + /// + public async Task DeleteRoleMenuByMenuIdList(List menuIdList) + { + await _sysRoleMenuRep.DeleteAsync(u => menuIdList.Contains(u.MenuId)); + } + + /// + /// 根据角色Id删除角色菜单 + /// + /// + /// + public async Task DeleteRoleMenuByRoleId(long roleId) + { + await _sysRoleMenuRep.DeleteAsync(u => u.RoleId == roleId); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Role/SysRoleOrgService.cs b/Admin.NET/Admin.NET.Core/Service/Role/SysRoleOrgService.cs new file mode 100644 index 0000000..2a2d53a --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Role/SysRoleOrgService.cs @@ -0,0 +1,71 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统角色机构服务 +/// +public class SysRoleOrgService : ITransient +{ + private readonly SqlSugarRepository _sysRoleOrgRep; + + public SysRoleOrgService(SqlSugarRepository sysRoleOrgRep) + { + _sysRoleOrgRep = sysRoleOrgRep; + } + + /// + /// 授权角色机构 + /// + /// + /// + public async Task GrantRoleOrg(RoleOrgInput input) + { + await _sysRoleOrgRep.DeleteAsync(u => u.RoleId == input.Id); + if (input.DataScope == (int)DataScopeEnum.Define) + { + var roleOrgs = input.OrgIdList.Select(u => new SysRoleOrg + { + RoleId = input.Id, + OrgId = u + }).ToList(); + await _sysRoleOrgRep.InsertRangeAsync(roleOrgs); + } + } + + /// + /// 根据角色Id集合获取角色机构Id集合 + /// + /// + /// + public async Task> GetRoleOrgIdList(List roleIdList) + { + return await _sysRoleOrgRep.AsQueryable() + .Where(u => roleIdList.Contains(u.RoleId)) + .Select(u => u.OrgId).ToListAsync(); + } + + /// + /// 根据机构Id集合删除角色机构 + /// + /// + /// + public async Task DeleteRoleOrgByOrgIdList(List orgIdList) + { + await _sysRoleOrgRep.DeleteAsync(u => orgIdList.Contains(u.OrgId)); + } + + /// + /// 根据角色Id删除角色机构 + /// + /// + /// + public async Task DeleteRoleOrgByRoleId(long roleId) + { + await _sysRoleOrgRep.DeleteAsync(u => u.RoleId == roleId); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Role/SysRoleService.cs b/Admin.NET/Admin.NET.Core/Service/Role/SysRoleService.cs new file mode 100644 index 0000000..0405f1b --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Role/SysRoleService.cs @@ -0,0 +1,248 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统角色服务 🧩 +/// +[ApiDescriptionSettings(Order = 480)] +public class SysRoleService : IDynamicApiController, ITransient +{ + private readonly UserManager _userManager; + private readonly SqlSugarRepository _sysRoleRep; + private readonly SysRoleOrgService _sysRoleOrgService; + private readonly SysRoleMenuService _sysRoleMenuService; + private readonly SysOrgService _sysOrgService; + private readonly SysUserRoleService _sysUserRoleService; + + public SysRoleService(UserManager userManager, + SqlSugarRepository sysRoleRep, + SysRoleOrgService sysRoleOrgService, + SysRoleMenuService sysRoleMenuService, + SysOrgService sysOrgService, + SysUserRoleService sysUserRoleService) + { + _userManager = userManager; + _sysRoleRep = sysRoleRep; + _sysRoleOrgService = sysRoleOrgService; + _sysRoleMenuService = sysRoleMenuService; + _sysOrgService = sysOrgService; + _sysUserRoleService = sysUserRoleService; + } + + /// + /// 获取角色分页列表 🔖 + /// + /// + /// + [DisplayName("获取角色分页列表")] + public async Task> Page(PageRoleInput input) + { + return await _sysRoleRep.AsQueryable() + .WhereIF(!_userManager.SuperAdmin, u => u.CreateUserId == _userManager.UserId) // 若非超管,则只能操作自己创建的角色 + .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name)) + .WhereIF(!string.IsNullOrWhiteSpace(input.Code), u => u.Code.Contains(input.Code)) + .OrderBy(u => u.OrderNo) + .ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 获取角色列表 🔖 + /// + /// + [DisplayName("获取角色列表")] + public async Task> GetList() + { + // 当前用户已拥有的角色集合 + var roleIdList = _userManager.SuperAdmin ? null : await _sysUserRoleService.GetUserRoleIdList(_userManager.UserId); + + return await _sysRoleRep.AsQueryable() + .WhereIF(roleIdList != null, u => u.CreateUserId == _userManager.UserId || roleIdList.Contains(u.Id)) // 若非超管,则只显示自己创建和已拥有的角色 + .OrderBy(u => u.OrderNo).Select().ToListAsync(); + } + + /// + /// 增加角色 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Add"), HttpPost] + [DisplayName("增加角色")] + public async Task AddRole(AddRoleInput input) + { + if (await _sysRoleRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code)) + throw Oops.Oh(ErrorCodeEnum.D1006); + + var newRole = await _sysRoleRep.AsInsertable(input.Adapt()).ExecuteReturnEntityAsync(); + input.Id = newRole.Id; + await UpdateRoleMenu(input); + } + + /// + /// 更新角色菜单权限 + /// + /// + /// + private async Task UpdateRoleMenu(AddRoleInput input) + { + if (input.MenuIdList == null || input.MenuIdList.Count < 1) + return; + + // 将父节点为0的菜单排除,防止前端全选异常 + var pMenuIds = await _sysRoleRep.ChangeRepository>().AsQueryable().Where(u => input.MenuIdList.Contains(u.Id) && u.Pid == 0).ToListAsync(u => u.Id); + var menuIds = input.MenuIdList.Except(pMenuIds); // 差集 + await GrantMenu(new RoleMenuInput() + { + Id = input.Id, + MenuIdList = menuIds.ToList() + }); + } + + /// + /// 更新角色 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Update"), HttpPost] + [DisplayName("更新角色")] + public async Task UpdateRole(UpdateRoleInput input) + { + if (await _sysRoleRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code && u.Id != input.Id)) + throw Oops.Oh(ErrorCodeEnum.D1006); + + await _sysRoleRep.AsUpdateable(input.Adapt()).IgnoreColumns(true) + .IgnoreColumns(u => new { u.DataScope }).ExecuteCommandAsync(); + + await UpdateRoleMenu(input); + } + + /// + /// 删除角色 🔖 + /// + /// + /// + [UnitOfWork] + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + [DisplayName("删除角色")] + public async Task DeleteRole(DeleteRoleInput input) + { + // 禁止删除系统管理员角色 + var sysRole = await _sysRoleRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + if (sysRole.Code == CommonConst.SysAdminRole) + throw Oops.Oh(ErrorCodeEnum.D1019); + + // 若角色有用户则禁止删除 + var userIds = await _sysUserRoleService.GetUserIdList(input.Id); + if (userIds != null && userIds.Count > 0) + throw Oops.Oh(ErrorCodeEnum.D1025); + + await _sysRoleRep.DeleteAsync(sysRole); + + // 级联删除角色机构数据 + await _sysRoleOrgService.DeleteRoleOrgByRoleId(sysRole.Id); + + // 级联删除用户角色数据 + await _sysUserRoleService.DeleteUserRoleByRoleId(sysRole.Id); + + // 级联删除角色菜单数据 + await _sysRoleMenuService.DeleteRoleMenuByRoleId(sysRole.Id); + } + + /// + /// 授权角色菜单 🔖 + /// + /// + /// + [UnitOfWork] + [DisplayName("授权角色菜单")] + public async Task GrantMenu(RoleMenuInput input) + { + await _sysRoleMenuService.GrantRoleMenu(input); + } + + /// + /// 授权角色数据范围 🔖 + /// + /// + /// + [UnitOfWork] + [DisplayName("授权角色数据范围")] + public async Task GrantDataScope(RoleOrgInput input) + { + // 删除与该角色相关的用户机构缓存 + var userIdList = await _sysUserRoleService.GetUserIdList(input.Id); + foreach (var userId in userIdList) + { + SqlSugarFilter.DeleteUserOrgCache(userId, _sysRoleRep.Context.CurrentConnectionConfig.ConfigId.ToString()); + } + + var role = await _sysRoleRep.GetFirstAsync(u => u.Id == input.Id); + var dataScope = input.DataScope; + if (!_userManager.SuperAdmin) + { + // 非超级管理员没有全部数据范围权限 + if (dataScope == (int)DataScopeEnum.All) + throw Oops.Oh(ErrorCodeEnum.D1016); + + // 若数据范围自定义,则判断授权数据范围是否有权限 + if (dataScope == (int)DataScopeEnum.Define) + { + var grantOrgIdList = input.OrgIdList; + if (grantOrgIdList.Count > 0) + { + var orgIdList = await _sysOrgService.GetUserOrgIdList(); + if (orgIdList.Count < 1) + throw Oops.Oh(ErrorCodeEnum.D1016); + else if (!grantOrgIdList.All(u => orgIdList.Any(c => c == u))) + throw Oops.Oh(ErrorCodeEnum.D1016); + } + } + } + role.DataScope = (DataScopeEnum)dataScope; + await _sysRoleRep.AsUpdateable(role).UpdateColumns(u => new { u.DataScope }).ExecuteCommandAsync(); + await _sysRoleOrgService.GrantRoleOrg(input); + } + + /// + /// 根据角色Id获取菜单Id集合 🔖 + /// + /// + /// + [DisplayName("根据角色Id获取菜单Id集合")] + public async Task> GetOwnMenuList([FromQuery] RoleInput input) + { + return await _sysRoleMenuService.GetRoleMenuIdList(new List { input.Id }); + } + + /// + /// 根据角色Id获取机构Id集合 🔖 + /// + /// + /// + [DisplayName("根据角色Id获取机构Id集合")] + public async Task> GetOwnOrgList([FromQuery] RoleInput input) + { + return await _sysRoleOrgService.GetRoleOrgIdList(new List { input.Id }); + } + + /// + /// 设置角色状态 🔖 + /// + /// + /// + [DisplayName("设置角色状态")] + public async Task SetStatus(RoleInput input) + { + if (!Enum.IsDefined(typeof(StatusEnum), input.Status)) + throw Oops.Oh(ErrorCodeEnum.D3005); + + return await _sysRoleRep.AsUpdateable() + .SetColumns(u => u.Status == input.Status) + .Where(u => u.Id == input.Id) + .ExecuteCommandAsync(); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Server/SysServerService.cs b/Admin.NET/Admin.NET.Core/Service/Server/SysServerService.cs new file mode 100644 index 0000000..073f427 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Server/SysServerService.cs @@ -0,0 +1,129 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using AngleSharp.Html.Parser; +using AspNetCoreRateLimit; +using Elastic.Clients.Elasticsearch; +using Lazy.Captcha.Core; +using Magicodes.ExporterAndImporter.Pdf; +using MailKit.Net.Smtp; +using OnceMi.AspNetCore.OSS; + +namespace Admin.NET.Core.Service; + +/// +/// 系统服务器监控服务 🧩 +/// +[ApiDescriptionSettings(Order = 290)] +public class SysServerService : IDynamicApiController, ITransient +{ + public SysServerService() + { + } + + /// + /// 获取服务器配置信息 🔖 + /// + /// + [DisplayName("获取服务器配置信息")] + public dynamic GetServerBase() + { + return new + { + HostName = Environment.MachineName, // 主机名称 + SystemOs = ComputerUtil.GetOSInfo(),//RuntimeInformation.OSDescription, // 操作系统 + OsArchitecture = Environment.OSVersion.Platform.ToString() + " " + RuntimeInformation.OSArchitecture.ToString(), // 系统架构 + ProcessorCount = Environment.ProcessorCount + " 核", // CPU核心数 + SysRunTime = ComputerUtil.GetRunTime(), // 系统运行时间 + RemoteIp = ComputerUtil.GetIpFromOnline(), // 外网地址 + LocalIp = App.HttpContext?.Connection?.LocalIpAddress.ToString(), // 本地地址 + RuntimeInformation.FrameworkDescription, // NET框架 + Environment = App.HostEnvironment.IsDevelopment() ? "Development" : "Production", + Wwwroot = App.WebHostEnvironment.WebRootPath, // 网站根目录 + Stage = App.HostEnvironment.IsStaging() ? "Stage环境" : "非Stage环境", // 是否Stage环境 + }; + } + + /// + /// 获取服务器使用信息 🔖 + /// + /// + [DisplayName("获取服务器使用信息")] + public dynamic GetServerUsed() + { + var programStartTime = Process.GetCurrentProcess().StartTime; + var totalMilliseconds = (DateTime.Now - programStartTime).TotalMilliseconds.ToString(); + var ts = totalMilliseconds.Contains('.') ? totalMilliseconds.Split('.')[0] : totalMilliseconds; + var programRunTime = DateTimeUtil.FormatTime(ts.ParseToLong()); + + var memoryMetrics = ComputerUtil.GetComputerInfo(); + return new + { + memoryMetrics.FreeRam, // 空闲内存 + memoryMetrics.UsedRam, // 已用内存 + memoryMetrics.TotalRam, // 总内存 + memoryMetrics.RamRate, // 内存使用率 + memoryMetrics.CpuRate, // Cpu使用率 + StartTime = programStartTime.ToString("yyyy-MM-dd HH:mm:ss"), // 服务启动时间 + RunTime = programRunTime, // 服务运行时间 + }; + } + + /// + /// 获取服务器磁盘信息 🔖 + /// + /// + [DisplayName("获取服务器磁盘信息")] + public dynamic GetServerDisk() + { + return ComputerUtil.GetDiskInfos(); + } + + /// + /// 获取框架主要程序集 🔖 + /// + /// + [DisplayName("获取框架主要程序集")] + public dynamic GetAssemblyList() + { + var furionAssembly = typeof(App).Assembly.GetName(); + var sqlSugarAssembly = typeof(ISqlSugarClient).Assembly.GetName(); + var yitIdAssembly = typeof(YitIdHelper).Assembly.GetName(); + var redisAssembly = typeof(Redis).Assembly.GetName(); + var jsonAssembly = typeof(NewtonsoftJsonMvcCoreBuilderExtensions).Assembly.GetName(); + var excelAssembly = typeof(IExcelImporter).Assembly.GetName(); + var pdfAssembly = typeof(IPdfExporter).Assembly.GetName(); + var captchaAssembly = typeof(ICaptcha).Assembly.GetName(); + var wechatApiAssembly = typeof(WechatApiClient).Assembly.GetName(); + var wechatTenpayAssembly = typeof(WechatTenpayClient).Assembly.GetName(); + var ossAssembly = typeof(IOSSServiceFactory).Assembly.GetName(); + var parserAssembly = typeof(Parser).Assembly.GetName(); + var nestAssembly = typeof(ElasticsearchClient).Assembly.GetName(); + var limitAssembly = typeof(IpRateLimitMiddleware).Assembly.GetName(); + var htmlParserAssembly = typeof(HtmlParser).Assembly.GetName(); + var fluentEmailAssembly = typeof(SmtpClient).Assembly.GetName(); + + return new[] + { + new { furionAssembly.Name, furionAssembly.Version }, + new { sqlSugarAssembly.Name, sqlSugarAssembly.Version }, + new { yitIdAssembly.Name, yitIdAssembly.Version }, + new { redisAssembly.Name, redisAssembly.Version }, + new { jsonAssembly.Name, jsonAssembly.Version }, + new { excelAssembly.Name, excelAssembly.Version }, + new { pdfAssembly.Name, pdfAssembly.Version }, + new { captchaAssembly.Name, captchaAssembly.Version }, + new { wechatApiAssembly.Name, wechatApiAssembly.Version }, + new { wechatTenpayAssembly.Name, wechatTenpayAssembly.Version }, + new { ossAssembly.Name, ossAssembly.Version }, + new { parserAssembly.Name, parserAssembly.Version }, + new { nestAssembly.Name, nestAssembly.Version }, + new { limitAssembly.Name, limitAssembly.Version }, + new { htmlParserAssembly.Name, htmlParserAssembly.Version }, + new { fluentEmailAssembly.Name, fluentEmailAssembly.Version }, + }; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Tenant/Dto/TenantInput.cs b/Admin.NET/Admin.NET.Core/Service/Tenant/Dto/TenantInput.cs new file mode 100644 index 0000000..777fce5 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Tenant/Dto/TenantInput.cs @@ -0,0 +1,67 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class TenantInput : BaseIdInput +{ + /// + /// 状态 + /// + public StatusEnum Status { get; set; } +} + +public class PageTenantInput : BasePageInput +{ + /// + /// 名称 + /// + public virtual string Name { get; set; } + + /// + /// 电话 + /// + public virtual string Phone { get; set; } +} + +public class AddTenantInput : TenantOutput +{ + /// + /// 租户名称 + /// + [Required(ErrorMessage = "租户名称不能为空"), MinLength(2, ErrorMessage = "租户名称不能少于2个字符")] + public override string Name { get; set; } + + /// + /// 租管账号 + /// + [Required(ErrorMessage = "租管账号不能为空"), MinLength(3, ErrorMessage = "租管账号不能少于3个字符")] + public override string AdminAccount { get; set; } +} + +public class UpdateTenantInput : AddTenantInput +{ +} + +public class DeleteTenantInput : BaseIdInput +{ +} + +public class TenantUserInput +{ + /// + /// 用户Id + /// + public long UserId { get; set; } +} + +public class TenantIdInput +{ + /// + /// 租户Id + /// + public long TenantId { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Tenant/Dto/TenantOutput.cs b/Admin.NET/Admin.NET.Core/Service/Tenant/Dto/TenantOutput.cs new file mode 100644 index 0000000..072b5af --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Tenant/Dto/TenantOutput.cs @@ -0,0 +1,33 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class TenantOutput : SysTenant +{ + /// + /// 租户名称 + /// + public virtual string Name { get; set; } + + /// + /// 管理员账号 + /// + public virtual string AdminAccount { get; set; } + + /// + /// 电子邮箱 + /// + public string Email { get; set; } + + /// + /// 电话 + /// + public string Phone { get; set; } + + public string AccessKey { get; set; } + +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Tenant/SysTenantService.cs b/Admin.NET/Admin.NET.Core/Service/Tenant/SysTenantService.cs new file mode 100644 index 0000000..fcf4092 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Tenant/SysTenantService.cs @@ -0,0 +1,509 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统租户管理服务 🧩 +/// +[ApiDescriptionSettings(Order = 390)] +public class SysTenantService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _sysTenantRep; + private readonly SqlSugarRepository _sysOrgRep; + private readonly SqlSugarRepository _sysRoleRep; + private readonly SqlSugarRepository _sysPosRep; + private readonly SqlSugarRepository _sysUserRep; + private readonly SqlSugarRepository _sysUserExtOrgRep; + private readonly SqlSugarRepository _sysRoleMenuRep; + private readonly SqlSugarRepository _userRoleRep; + private readonly SysUserRoleService _sysUserRoleService; + private readonly SysRoleMenuService _sysRoleMenuService; + private readonly SysConfigService _sysConfigService; + private readonly SysCacheService _sysCacheService; + private readonly IHttpContextAccessor _httpContextAccessor; + public SysTenantService(SqlSugarRepository sysTenantRep, + SqlSugarRepository sysOrgRep, + SqlSugarRepository sysRoleRep, + SqlSugarRepository sysPosRep, + SqlSugarRepository sysUserRep, + SqlSugarRepository sysUserExtOrgRep, + SqlSugarRepository sysRoleMenuRep, + SqlSugarRepository userRoleRep, + SysUserRoleService sysUserRoleService, + SysRoleMenuService sysRoleMenuService, + SysConfigService sysConfigService, + SysCacheService sysCacheService, + IHttpContextAccessor httpContextAccessor) + { + _sysTenantRep = sysTenantRep; + _sysOrgRep = sysOrgRep; + _sysRoleRep = sysRoleRep; + _sysPosRep = sysPosRep; + _sysUserRep = sysUserRep; + _sysUserExtOrgRep = sysUserExtOrgRep; + _sysRoleMenuRep = sysRoleMenuRep; + _userRoleRep = userRoleRep; + _sysUserRoleService = sysUserRoleService; + _sysRoleMenuService = sysRoleMenuService; + _sysConfigService = sysConfigService; + _sysCacheService = sysCacheService; + _httpContextAccessor = httpContextAccessor; + } + + /// + /// 获取租户分页列表 🔖 + /// + /// + /// + [DisplayName("获取租户分页列表")] + public async Task> Page(PageTenantInput input) + { + return await _sysTenantRep.AsQueryable() + .LeftJoin((u, a) => u.UserId == a.Id) + .LeftJoin((u, a, b) => u.OrgId == b.Id) + .WhereIF(!string.IsNullOrWhiteSpace(input.Phone), (u, a) => a.Phone.Contains(input.Phone.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Name), (u, a, b) => b.Name.Contains(input.Name.Trim())) + .OrderBy(u => u.OrderNo) + .Select((u, a, b) => new TenantOutput + { + Id = u.Id, + OrgId = b.Id, + Name = b.Name, + UserId = a.Id, + AdminAccount = a.Account, + Phone = a.Phone, + Email = a.Email, + TenantType = u.TenantType, + DbType = u.DbType, + Connection = u.Connection, + ConfigId = u.ConfigId, + OrderNo = u.OrderNo, + Remark = u.Remark, + Status = u.Status, + CreateTime = u.CreateTime, + CreateUserName = u.CreateUserName, + UpdateTime = u.UpdateTime, + UpdateUserName = u.UpdateUserName, + }) + .ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 获取库隔离的租户列表 + /// + /// + [NonAction] + public async Task> GetTenantDbList() + { + return await _sysTenantRep.GetListAsync(u => u.TenantType == TenantTypeEnum.Db && u.Status == StatusEnum.Enable); + } + + /// + /// 增加租户 🔖 + /// + /// + /// + [UnitOfWork] + [ApiDescriptionSettings(Name = "Add"), HttpPost] + [DisplayName("增加租户")] + public async Task AddTenant(AddTenantInput input) + { + var isExist = await _sysOrgRep.IsAnyAsync(u => u.Name == input.Name); + if (isExist) throw Oops.Oh(ErrorCodeEnum.D1300); + + isExist = await _sysUserRep.AsQueryable().ClearFilter().AnyAsync(u => u.Account == input.AdminAccount); + if (isExist) throw Oops.Oh(ErrorCodeEnum.D1301); + + // 从库配置判断 + if (!string.IsNullOrWhiteSpace(input.SlaveConnections) && !JSON.IsValid(input.SlaveConnections)) + throw Oops.Oh(ErrorCodeEnum.D1302); + + // ID隔离时设置与主库一致 + if (input.TenantType == TenantTypeEnum.Id) + { + var config = _sysTenantRep.AsSugarClient().CurrentConnectionConfig; + input.DbType = config.DbType; + input.Connection = config.ConnectionString; + } + + var tenant = input.Adapt(); + await _sysTenantRep.InsertAsync(tenant); + await InitNewTenant(tenant); + + await CacheTenant(); + } + + + + + [UnitOfWork] + [AllowAnonymous] + [ApiDescriptionSettings(Name = "Syncadd"), HttpPost] + [DisplayName("Sync租户")] + public async Task SyncTenant(AddTenantInput input) + { + var token = _httpContextAccessor.HttpContext.Request.Headers["access-token"]; + var authOpt = App.GetConfig("OAuth", true); + if (string.IsNullOrEmpty(token)) + throw Oops.Oh(ErrorCodeEnum.D1011); + if (token == authOpt.SSO.ClientSecret) + { + var isExist = await _sysOrgRep.IsAnyAsync(u => u.Name == input.Name); + if (isExist) throw Oops.Oh(ErrorCodeEnum.D1300); + + isExist = await _sysUserRep.AsQueryable().ClearFilter().AnyAsync(u => u.Account == input.AdminAccount); + if (isExist) throw Oops.Oh(ErrorCodeEnum.D1301); + + // 从库配置判断 + if (!string.IsNullOrWhiteSpace(input.SlaveConnections) && !JSON.IsValid(input.SlaveConnections)) + throw Oops.Oh(ErrorCodeEnum.D1302); + + // ID隔离时设置与主库一致 + if (input.TenantType == TenantTypeEnum.Id) + { + var config = _sysTenantRep.AsSugarClient().CurrentConnectionConfig; + input.DbType = config.DbType; + input.Connection = config.ConnectionString; + } + + var tenant = input.Adapt(); + await _sysTenantRep.InsertAsync(tenant); + await InitNewTenant(tenant); + + await CacheTenant(); + } + } + + + + /// + /// 设置租户状态 🔖 + /// + /// + /// + [DisplayName("设置租户状态")] + public async Task SetStatus(TenantInput input) + { + var tenant = await _sysTenantRep.GetFirstAsync(u => u.Id == input.Id); + if (tenant == null || tenant.ConfigId == SqlSugarConst.MainConfigId) + throw Oops.Oh(ErrorCodeEnum.Z1001); + + if (!Enum.IsDefined(typeof(StatusEnum), input.Status)) + throw Oops.Oh(ErrorCodeEnum.D3005); + + tenant.Status = input.Status; + return await _sysTenantRep.AsUpdateable(tenant).UpdateColumns(u => new { u.Status }).ExecuteCommandAsync(); + } + + /// + /// 新增租户初始化 + /// + /// + private async Task InitNewTenant(TenantOutput tenant) + { + var tenantId = tenant.Id; + var tenantName = tenant.Name; + + // 初始化机构 + var newOrg = new SysOrg + { + TenantId = tenantId, + Pid = 0, + Name = tenantName, + Code = tenantName, + Remark = tenantName, + }; + await _sysOrgRep.InsertAsync(newOrg); + + // 初始化角色 + var newRole = new SysRole + { + TenantId = tenantId, + Name = "租管-" + tenantName, + Code = CommonConst.SysAdminRole, + DataScope = DataScopeEnum.All, + Remark = tenantName + }; + await _sysRoleRep.InsertAsync(newRole); + + // 初始化职位 + var newPos = new SysPos + { + TenantId = tenantId, + Name = "租管-" + tenantName, + Code = tenantName, + Remark = tenantName, + }; + await _sysPosRep.InsertAsync(newPos); + + // 初始化系统账号 + var password = await _sysConfigService.GetConfigValue(CommonConst.SysPassword); + var newUser = new SysUser + { + TenantId = tenantId, + Account = tenant.AdminAccount, + Password = CryptogramUtil.Encrypt(password), + NickName = "租管", + Email = tenant.Email, + Phone = tenant.Phone, + AccountType = AccountTypeEnum.SysAdmin, + OrgId = newOrg.Id, + PosId = newPos.Id, + Birthday = DateTime.Parse("2000-01-01"), + RealName = "租管", + Remark = "租管" + tenantName, + }; + await _sysUserRep.InsertAsync(newUser); + + // 关联用户及角色 + var newUserRole = new SysUserRole + { + RoleId = newRole.Id, + UserId = newUser.Id + }; + await _userRoleRep.InsertAsync(newUserRole); + + // 关联租户组织机构和管理员用户 + await _sysTenantRep.UpdateAsync(u => new SysTenant() { UserId = newUser.Id, OrgId = newOrg.Id }, u => u.Id == tenantId); + + // 默认租户管理员角色菜单集合 + var menuIdList = new List { 1300000000111,1300000000121, // 工作台 + 1310000000111,1310000000112,1310000000113,1310000000114,1310000000115,1310000000116,1310000000117,1310000000118,1310000000119,1310000000120, // 账号 + 1310000000131,1310000000132,1310000000133,1310000000134,1310000000135,1310000000136,1310000000137,1310000000138, // 角色 + 1310000000141,1310000000142,1310000000143,1310000000144,1310000000145, // 机构 + 1310000000151,1310000000152,1310000000153,1310000000154,1310000000155, // 职位 + 1310000000161,1310000000162,1310000000163,1310000000164, // 个人中心 + 1310000000171,1310000000172,1310000000173,1310000000174,1310000000175,1310000000176,1310000000177 // 通知公告 + }; + await _sysRoleMenuService.GrantRoleMenu(new RoleMenuInput() { Id = newRole.Id, MenuIdList = menuIdList }); + } + + /// + /// 删除租户 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + [DisplayName("删除租户")] + public async Task DeleteTenant(DeleteTenantInput input) + { + // 禁止删除默认租户 + if (input.Id.ToString() == SqlSugarConst.MainConfigId) + throw Oops.Oh(ErrorCodeEnum.D1023); + + await _sysTenantRep.DeleteAsync(u => u.Id == input.Id); + + await CacheTenant(input.Id); + + // 删除与租户相关的表数据 + var users = await _sysUserRep.AsQueryable().ClearFilter().Where(u => u.TenantId == input.Id).ToListAsync(); + var userIds = users.Select(u => u.Id).ToList(); + await _sysUserRep.AsDeleteable().Where(u => userIds.Contains(u.Id)).ExecuteCommandAsync(); + + await _userRoleRep.AsDeleteable().Where(u => userIds.Contains(u.UserId)).ExecuteCommandAsync(); + + await _sysUserExtOrgRep.AsDeleteable().Where(u => userIds.Contains(u.UserId)).ExecuteCommandAsync(); + + await _sysRoleRep.AsDeleteable().Where(u => u.TenantId == input.Id).ExecuteCommandAsync(); + + var roleIds = await _sysRoleRep.AsQueryable().ClearFilter() + .Where(u => u.TenantId == input.Id).Select(u => u.Id).ToListAsync(); + await _sysRoleMenuRep.AsDeleteable().Where(u => roleIds.Contains(u.RoleId)).ExecuteCommandAsync(); + + await _sysOrgRep.AsDeleteable().Where(u => u.TenantId == input.Id).ExecuteCommandAsync(); + + await _sysPosRep.AsDeleteable().Where(u => u.TenantId == input.Id).ExecuteCommandAsync(); + } + + /// + /// 更新租户 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Update"), HttpPost] + [DisplayName("更新租户")] + public async Task UpdateTenant(UpdateTenantInput input) + { + var isExist = await _sysOrgRep.IsAnyAsync(u => u.Name == input.Name && u.Id != input.OrgId); + if (isExist) + throw Oops.Oh(ErrorCodeEnum.D1300); + isExist = await _sysUserRep.IsAnyAsync(u => u.Account == input.AdminAccount && u.Id != input.UserId); + if (isExist) + throw Oops.Oh(ErrorCodeEnum.D1301); + + // 从库配置判断 + if (!string.IsNullOrWhiteSpace(input.SlaveConnections) && !JSON.IsValid(input.SlaveConnections)) + throw Oops.Oh(ErrorCodeEnum.D1302); + + await _sysTenantRep.AsUpdateable(input.Adapt()).IgnoreColumns(true).ExecuteCommandAsync(); + + // 更新系统机构 + await _sysOrgRep.UpdateAsync(u => new SysOrg() { Name = input.Name }, u => u.Id == input.OrgId); + + // 更新系统用户 + await _sysUserRep.UpdateAsync(u => new SysUser() { Account = input.AdminAccount, Phone = input.Phone, Email = input.Email }, u => u.Id == input.UserId); + + await CacheTenant(input.Id); + } + + /// + /// 授权租户管理员角色菜单 🔖 + /// + /// + /// + [UnitOfWork] + [DisplayName("授权租户管理员角色菜单")] + public async Task GrantMenu(RoleMenuInput input) + { + var tenantAdminUser = await _sysUserRep.GetFirstAsync(u => u.TenantId == input.Id && u.AccountType == AccountTypeEnum.SysAdmin); + if (tenantAdminUser == null) return; + + var roleIds = await _sysUserRoleService.GetUserRoleIdList(tenantAdminUser.Id); + input.Id = roleIds[0]; // 重置租户管理员角色Id + await _sysRoleMenuService.GrantRoleMenu(input); + } + + /// + /// 获取租户管理员角色拥有菜单Id集合 🔖 + /// + /// + /// + [DisplayName("获取租户管理员角色拥有菜单Id集合")] + public async Task> GetOwnMenuList([FromQuery] TenantUserInput input) + { + var roleIds = await _sysUserRoleService.GetUserRoleIdList(input.UserId); + return await _sysRoleMenuService.GetRoleMenuIdList(new List { roleIds[0] }); + } + + /// + /// 重置租户管理员密码 🔖 + /// + /// + /// + [DisplayName("重置租户管理员密码")] + public async Task ResetPwd(TenantUserInput input) + { + var password = await _sysConfigService.GetConfigValue(CommonConst.SysPassword); + var encryptPassword = CryptogramUtil.Encrypt(password); + await _sysUserRep.UpdateAsync(u => new SysUser() { Password = encryptPassword }, u => u.Id == input.UserId); + return password; + } + + /// + /// 缓存所有租户 + /// + /// + /// + [NonAction] + public async Task CacheTenant(long tenantId = 0) + { + // 移除 ISqlSugarClient 中的库连接并排除默认主库 + if (tenantId > 0 && tenantId.ToString() != SqlSugarConst.MainConfigId) + _sysTenantRep.AsTenant().RemoveConnection(tenantId); + + var tenantList = await _sysTenantRep.GetListAsync(); + // 对租户库连接进行SM2加密 + foreach (var tenant in tenantList) + { + tenant.Connection = CryptogramUtil.SM2Encrypt(tenant.Connection); + } + _sysCacheService.Set(CacheConst.KeyTenant, tenantList); + } + + /// + /// 创建租户数据库 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "CreateDb"), HttpPost] + [DisplayName("创建租户数据库")] + public async Task CreateDb(TenantInput input) + { + var tenant = await _sysTenantRep.GetSingleAsync(u => u.Id == input.Id); + if (tenant == null) return; + + if (tenant.DbType == SqlSugar.DbType.Oracle) + throw Oops.Oh(ErrorCodeEnum.Z1002); + + if (string.IsNullOrWhiteSpace(tenant.Connection) || tenant.Connection.Length < 10) + throw Oops.Oh(ErrorCodeEnum.Z1004); + + // 默认数据库配置 + var defaultConfig = App.GetOptions().ConnectionConfigs.FirstOrDefault(); + + var config = new DbConnectionConfig + { + ConfigId = tenant.Id.ToString(), + DbType = tenant.DbType, + ConnectionString = tenant.Connection, + DbSettings = new DbSettings() + { + EnableInitDb = true, + EnableDiffLog = false, + EnableUnderLine = defaultConfig.DbSettings.EnableUnderLine, + } + }; + SqlSugarSetup.InitTenantDatabase(App.GetRequiredService().AsTenant(), config); + } + + /// + /// 获取租户下的用户列表 🔖 + /// + /// + /// + [DisplayName("获取租户下的用户列表")] + public async Task> UserList(TenantIdInput input) + { + return await _sysUserRep.AsQueryable().ClearFilter().Where(u => u.TenantId == input.TenantId).ToListAsync(); + } + + /// + /// 获取租户数据库连接 + /// + /// + [NonAction] + public SqlSugarScopeProvider GetTenantDbConnectionScope(long tenantId) + { + var iTenant = _sysTenantRep.AsTenant(); + + // 若已存在租户库连接,则直接返回 + if (iTenant.IsAnyConnection(tenantId.ToString())) + return iTenant.GetConnectionScope(tenantId.ToString()); + + lock (iTenant) + { + // 从缓存里面获取租户信息 + var tenant = _sysCacheService.Get>(CacheConst.KeyTenant)?.First(u => u.Id == tenantId); + if (tenant == null || tenant.TenantType == TenantTypeEnum.Id) return null; + + // 获取默认库连接配置 + var dbOptions = App.GetOptions(); + var mainConnConfig = dbOptions.ConnectionConfigs.First(u => u.ConfigId.ToString() == SqlSugarConst.MainConfigId); + + // 设置租户库连接配置 + var tenantConnConfig = new DbConnectionConfig + { + ConfigId = tenant.Id.ToString(), + DbType = tenant.DbType, + IsAutoCloseConnection = true, + ConnectionString = CryptogramUtil.SM2Decrypt(tenant.Connection), // 对租户库连接进行SM2解密 + DbSettings = new DbSettings() + { + EnableUnderLine = mainConnConfig.DbSettings.EnableUnderLine, + }, + SlaveConnectionConfigs = JSON.IsValid(tenant.SlaveConnections) ? JSON.Deserialize>(tenant.SlaveConnections) : null // 从库连接配置 + }; + iTenant.AddConnection(tenantConnConfig); + + var sqlSugarScopeProvider = iTenant.GetConnectionScope(tenantId.ToString()); + SqlSugarSetup.SetDbConfig(tenantConnConfig); + SqlSugarSetup.SetDbAop(sqlSugarScopeProvider, dbOptions.EnableConsoleSql); + + return sqlSugarScopeProvider; + } + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/User/Dto/UserExtOrgInput.cs b/Admin.NET/Admin.NET.Core/Service/User/Dto/UserExtOrgInput.cs new file mode 100644 index 0000000..1a5f906 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/User/Dto/UserExtOrgInput.cs @@ -0,0 +1,35 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class UserExtOrgInput : BaseIdInput +{ + /// + /// 机构Id + /// + public long OrgId { get; set; } + + /// + /// 职位Id + /// + public long PosId { get; set; } + + /// + /// 工号 + /// + public string JobNum { get; set; } + + /// + /// 职级 + /// + public string PosLevel { get; set; } + + /// + /// 入职日期 + /// + public DateTime? JoinDate { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/User/Dto/UserInput.cs b/Admin.NET/Admin.NET.Core/Service/User/Dto/UserInput.cs new file mode 100644 index 0000000..efaf2e8 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/User/Dto/UserInput.cs @@ -0,0 +1,127 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 设置用户状态输入参数 +/// +public class UserInput : BaseIdInput +{ + /// + /// 状态 + /// + public StatusEnum Status { get; set; } +} + +/// +/// 获取用户分页列表输入参数 +/// +public class PageUserInput : BasePageInput +{ + /// + /// 账号 + /// + public string Account { get; set; } + + /// + /// 姓名 + /// + public string RealName { get; set; } + + /// + /// 手机号 + /// + public string Phone { get; set; } + + /// + /// 查询时所选机构Id + /// + public long OrgId { get; set; } +} + +/// +/// 增加用户输入参数 +/// +public class AddUserInput : SysUser +{ + /// + /// 账号 + /// + [Required(ErrorMessage = "账号不能为空")] + public override string Account { get; set; } + + /// + /// 真实姓名 + /// + [Required(ErrorMessage = "真实姓名不能为空")] + public override string RealName { get; set; } + + /// + /// 域用户 + /// + public string DomainAccount { get; set; } + + /// + /// 角色集合 + /// + public List RoleIdList { get; set; } + + /// + /// 扩展机构集合 + /// + public List ExtOrgIdList { get; set; } +} + +/// +/// 更新用户输入参数 +/// +public class UpdateUserInput : AddUserInput +{ +} + +/// +/// 删除用户输入参数 +/// +public class DeleteUserInput : BaseIdInput +{ + /// + /// 机构Id + /// + public long OrgId { get; set; } +} + +/// +/// 重置用户密码输入参数 +/// +public class ResetPwdUserInput : BaseIdInput +{ +} + +/// +/// 修改用户密码输入参数 +/// +public class ChangePwdInput +{ + /// + /// 当前密码 + /// + [Required(ErrorMessage = "当前密码不能为空")] + public string PasswordOld { get; set; } + + /// + /// 新密码 + /// + [Required(ErrorMessage = "新密码不能为空"), MinLength(5, ErrorMessage = "密码需要大于5个字符")] + public string PasswordNew { get; set; } +} + +/// +/// 解除登录锁定输入参数 +/// +public class UnlockLoginInput : BaseIdInput +{ +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/User/Dto/UserOutput.cs b/Admin.NET/Admin.NET.Core/Service/User/Dto/UserOutput.cs new file mode 100644 index 0000000..4c508f8 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/User/Dto/UserOutput.cs @@ -0,0 +1,30 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class UserOutput : SysUser +{ + /// + /// 机构名称 + /// + public string OrgName { get; set; } + + /// + /// 职位名称 + /// + public string PosName { get; set; } + + /// + /// 角色名称 + /// + public string RoleName { get; set; } + + /// + /// 域用户 + /// + public string DomainAccount { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/User/Dto/UserRoleInput.cs b/Admin.NET/Admin.NET.Core/Service/User/Dto/UserRoleInput.cs new file mode 100644 index 0000000..5182775 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/User/Dto/UserRoleInput.cs @@ -0,0 +1,23 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 授权用户角色 +/// +public class UserRoleInput +{ + /// + /// 用户Id + /// + public long UserId { get; set; } + + /// + /// 角色Id集合 + /// + public List RoleIdList { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/User/SysUserExtOrgService.cs b/Admin.NET/Admin.NET.Core/Service/User/SysUserExtOrgService.cs new file mode 100644 index 0000000..9a96394 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/User/SysUserExtOrgService.cs @@ -0,0 +1,88 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统用户扩展机构服务 +/// +public class SysUserExtOrgService : ITransient +{ + private readonly SqlSugarRepository _sysUserExtOrgRep; + + public SysUserExtOrgService(SqlSugarRepository sysUserExtOrgRep) + { + _sysUserExtOrgRep = sysUserExtOrgRep; + } + + /// + /// 获取用户扩展机构集合 + /// + /// + /// + public async Task> GetUserExtOrgList(long userId) + { + return await _sysUserExtOrgRep.GetListAsync(u => u.UserId == userId); + } + + /// + /// 更新用户扩展机构 + /// + /// + /// + /// + public async Task UpdateUserExtOrg(long userId, List extOrgList) + { + await _sysUserExtOrgRep.DeleteAsync(u => u.UserId == userId); + + if (extOrgList == null || extOrgList.Count < 1) return; + extOrgList.ForEach(u => + { + u.UserId = userId; + }); + await _sysUserExtOrgRep.InsertRangeAsync(extOrgList); + } + + /// + /// 根据机构Id集合删除扩展机构 + /// + /// + /// + public async Task DeleteUserExtOrgByOrgIdList(List orgIdList) + { + await _sysUserExtOrgRep.DeleteAsync(u => orgIdList.Contains(u.OrgId)); + } + + /// + /// 根据用户Id删除扩展机构 + /// + /// + /// + public async Task DeleteUserExtOrgByUserId(long userId) + { + await _sysUserExtOrgRep.DeleteAsync(u => u.UserId == userId); + } + + /// + /// 根据机构Id判断是否有用户 + /// + /// + /// + public async Task HasUserOrg(long orgId) + { + return await _sysUserExtOrgRep.IsAnyAsync(u => u.OrgId == orgId); + } + + /// + /// 根据职位Id判断是否有用户 + /// + /// + /// + public async Task HasUserPos(long posId) + { + return await _sysUserExtOrgRep.IsAnyAsync(u => u.PosId == posId); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/User/SysUserLdapService.cs b/Admin.NET/Admin.NET.Core/Service/User/SysUserLdapService.cs new file mode 100644 index 0000000..1f50661 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/User/SysUserLdapService.cs @@ -0,0 +1,66 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 用户域账号服务 +/// +public class SysUserLdapService : ITransient +{ + private readonly SqlSugarRepository _sysUserLdapRep; + + public SysUserLdapService(SqlSugarRepository sysUserLdapRep) + { + _sysUserLdapRep = sysUserLdapRep; + } + + /// + /// 批量插入域账号 + /// + /// + /// + /// + public async Task InsertUserLdaps(long tenantId, List sysUserLdaps) + { + await _sysUserLdapRep.DeleteAsync(u => u.TenantId == tenantId); + + await _sysUserLdapRep.InsertRangeAsync(sysUserLdaps); + + await _sysUserLdapRep.AsUpdateable() + .InnerJoin((l, u) => l.EmployeeId == u.Account && u.Status == StatusEnum.Enable && u.IsDelete == false && l.IsDelete == false) + .SetColumns((l, u) => new SysUserLdap { UserId = u.Id }) + .ExecuteCommandAsync(); + } + + /// + /// 增加域账号 + /// + /// + /// + /// + /// + /// + public async Task AddUserLdap(long tenantId, long userId, string account, string domainAccount) + { + var userLdap = await _sysUserLdapRep.GetFirstAsync(u => u.TenantId == tenantId && u.IsDelete == false && (u.Account == account || u.UserId == userId || u.EmployeeId == domainAccount)); + if (userLdap != null) + await _sysUserLdapRep.DeleteByIdAsync(userLdap.Id); + + if (!string.IsNullOrWhiteSpace(domainAccount)) + await _sysUserLdapRep.InsertAsync(new SysUserLdap { EmployeeId = account, TenantId = tenantId, UserId = userId, Account = domainAccount }); + } + + /// + /// 删除域账号 + /// + /// + /// + public async Task DeleteUserLdapByUserId(long userId) + { + await _sysUserLdapRep.DeleteAsync(u => u.UserId == userId); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/User/SysUserRoleService.cs b/Admin.NET/Admin.NET.Core/Service/User/SysUserRoleService.cs new file mode 100644 index 0000000..17c31d9 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/User/SysUserRoleService.cs @@ -0,0 +1,106 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统用户角色服务 +/// +public class SysUserRoleService : ITransient +{ + private readonly SqlSugarRepository _sysUserRoleRep; + private readonly SysCacheService _sysCacheService; + + public SysUserRoleService(SqlSugarRepository sysUserRoleRep, + SysCacheService sysCacheService) + { + _sysUserRoleRep = sysUserRoleRep; + _sysCacheService = sysCacheService; + } + + /// + /// 授权用户角色 + /// + /// + /// + public async Task GrantUserRole(UserRoleInput input) + { + await _sysUserRoleRep.DeleteAsync(u => u.UserId == input.UserId); + + if (input.RoleIdList == null || input.RoleIdList.Count < 1) return; + var roles = input.RoleIdList.Select(u => new SysUserRole + { + UserId = input.UserId, + RoleId = u + }).ToList(); + await _sysUserRoleRep.InsertRangeAsync(roles); + _sysCacheService.Remove(CacheConst.KeyUserButton + input.UserId); + } + + /// + /// 根据角色Id删除用户角色 + /// + /// + /// + public async Task DeleteUserRoleByRoleId(long roleId) + { + await _sysUserRoleRep.AsQueryable() + .Where(u => u.RoleId == roleId) + .Select(u => u.UserId) + .ForEachAsync(userId => + { + _sysCacheService.Remove(CacheConst.KeyUserButton + userId); + }); + + await _sysUserRoleRep.DeleteAsync(u => u.RoleId == roleId); + } + + /// + /// 根据用户Id删除用户角色 + /// + /// + /// + public async Task DeleteUserRoleByUserId(long userId) + { + await _sysUserRoleRep.DeleteAsync(u => u.UserId == userId); + _sysCacheService.Remove(CacheConst.KeyUserButton + userId); + } + + /// + /// 根据用户Id获取角色集合 + /// + /// + /// + public async Task> GetUserRoleList(long userId) + { + var sysUserRoleList = await _sysUserRoleRep.AsQueryable() + .Includes(u => u.SysRole) + .Where(u => u.UserId == userId).ToListAsync(); + return sysUserRoleList.Where(u => u.SysRole != null).Select(u => u.SysRole).ToList(); + } + + /// + /// 根据用户Id获取角色Id集合 + /// + /// + /// + public async Task> GetUserRoleIdList(long userId) + { + return await _sysUserRoleRep.AsQueryable() + .Where(u => u.UserId == userId).Select(u => u.RoleId).ToListAsync(); + } + + /// + /// 根据角色Id获取用户Id集合 + /// + /// + /// + public async Task> GetUserIdList(long roleId) + { + return await _sysUserRoleRep.AsQueryable() + .Where(u => u.RoleId == roleId).Select(u => u.UserId).ToListAsync(); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/User/SysUserService.cs b/Admin.NET/Admin.NET.Core/Service/User/SysUserService.cs new file mode 100644 index 0000000..511dbd4 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/User/SysUserService.cs @@ -0,0 +1,355 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 系统用户服务 🧩 +/// +[ApiDescriptionSettings(Order = 490)] +public class SysUserService : IDynamicApiController, ITransient +{ + private readonly UserManager _userManager; + private readonly SqlSugarRepository _sysUserRep; + private readonly SysOrgService _sysOrgService; + private readonly SysUserExtOrgService _sysUserExtOrgService; + private readonly SysUserRoleService _sysUserRoleService; + private readonly SysConfigService _sysConfigService; + private readonly SysOnlineUserService _sysOnlineUserService; + private readonly SysCacheService _sysCacheService; + private readonly SysUserLdapService _sysUserLdapService; + + public SysUserService(UserManager userManager, + SqlSugarRepository sysUserRep, + SysOrgService sysOrgService, + SysUserExtOrgService sysUserExtOrgService, + SysUserRoleService sysUserRoleService, + SysConfigService sysConfigService, + SysOnlineUserService sysOnlineUserService, + SysCacheService sysCacheService, + SysUserLdapService sysUserLdapService) + { + _userManager = userManager; + _sysUserRep = sysUserRep; + _sysOrgService = sysOrgService; + _sysUserExtOrgService = sysUserExtOrgService; + _sysUserRoleService = sysUserRoleService; + _sysConfigService = sysConfigService; + _sysOnlineUserService = sysOnlineUserService; + _sysCacheService = sysCacheService; + _sysUserLdapService = sysUserLdapService; + } + + /// + /// 获取用户分页列表 🔖 + /// + /// + /// + [DisplayName("获取用户分页列表")] + public virtual async Task> Page(PageUserInput input) + { + // 获取用户拥有的机构集合 + var userOrgIdList = await _sysOrgService.GetUserOrgIdList(); + List orgList = null; + if (input.OrgId > 0) // 指定机构查询时 + { + orgList = await _sysOrgService.GetChildIdListWithSelfById(input.OrgId); + orgList = _userManager.SuperAdmin ? orgList : orgList.Where(u => userOrgIdList.Contains(u)).ToList(); + } + else // 各管理员只能看到自己机构下的用户列表 + { + orgList = _userManager.SuperAdmin ? null : userOrgIdList; + } + + return await _sysUserRep.AsQueryable() + .LeftJoin((u, a) => u.OrgId == a.Id) + .LeftJoin((u, a, b) => u.PosId == b.Id) + .Where(u => u.AccountType != AccountTypeEnum.SuperAdmin) + .WhereIF(orgList != null, u => orgList.Contains(u.OrgId)) + .WhereIF(!string.IsNullOrWhiteSpace(input.Account), u => u.Account.Contains(input.Account)) + .WhereIF(!string.IsNullOrWhiteSpace(input.RealName), u => u.RealName.Contains(input.RealName)) + .WhereIF(!string.IsNullOrWhiteSpace(input.Phone), u => u.Phone.Contains(input.Phone)) + .OrderBy(u => u.OrderNo) + .Select((u, a, b) => new UserOutput + { + OrgName = a.Name, + PosName = b.Name, + RoleName = SqlFunc.Subqueryable().LeftJoin((m, n) => m.RoleId == n.Id).Where(m => m.UserId == u.Id).SelectStringJoin((m, n) => n.Name, ","), + DomainAccount = SqlFunc.Subqueryable().Where(m => m.UserId == u.Id).Select(m => m.Account) + }, true) + .ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 增加用户 🔖 + /// + /// + /// + [UnitOfWork] + [ApiDescriptionSettings(Name = "Add"), HttpPost] + [DisplayName("增加用户")] + public virtual async Task AddUser(AddUserInput input) + { + var isExist = await _sysUserRep.AsQueryable().ClearFilter().AnyAsync(u => u.Account == input.Account); + if (isExist) throw Oops.Oh(ErrorCodeEnum.D1003); + + var password = await _sysConfigService.GetConfigValue(CommonConst.SysPassword); + + var user = input.Adapt(); + user.Password = CryptogramUtil.Encrypt(password); + var newUser = await _sysUserRep.AsInsertable(user).ExecuteReturnEntityAsync(); + + input.Id = newUser.Id; + await UpdateRoleAndExtOrg(input); + + // 增加域账号 + if (!string.IsNullOrWhiteSpace(input.DomainAccount)) + await _sysUserLdapService.AddUserLdap(newUser.TenantId.Value, newUser.Id, newUser.Account, input.DomainAccount); + + return newUser.Id; + } + + /// + /// 更新用户 🔖 + /// + /// + /// + [UnitOfWork] + [ApiDescriptionSettings(Name = "Update"), HttpPost] + [DisplayName("更新用户")] + public virtual async Task UpdateUser(UpdateUserInput input) + { + if (await _sysUserRep.AsQueryable().ClearFilter().AnyAsync(u => u.Account == input.Account && u.Id != input.Id)) + throw Oops.Oh(ErrorCodeEnum.D1003); + + await _sysUserRep.AsUpdateable(input.Adapt()).IgnoreColumns(true) + .IgnoreColumns(u => new { u.Password, u.Status }).ExecuteCommandAsync(); + + await UpdateRoleAndExtOrg(input); + + // 删除用户机构缓存 + SqlSugarFilter.DeleteUserOrgCache(input.Id, _sysUserRep.Context.CurrentConnectionConfig.ConfigId.ToString()); + + // 若账号的角色和组织架构发生变化,则强制下线账号进行权限更新 + var user = await _sysUserRep.AsQueryable().ClearFilter().FirstAsync(u => u.Id == input.Id); + var roleIds = await GetOwnRoleList(input.Id); + if (input.OrgId != user.OrgId || !input.RoleIdList.OrderBy(u => u).SequenceEqual(roleIds.OrderBy(u => u))) + await _sysOnlineUserService.ForceOffline(input.Id); + // 更新域账号 + await _sysUserLdapService.AddUserLdap(user.TenantId.Value, user.Id, user.Account, input.DomainAccount); + } + + /// + /// 更新角色和扩展机构 + /// + /// + /// + private async Task UpdateRoleAndExtOrg(AddUserInput input) + { + await GrantRole(new UserRoleInput { UserId = input.Id, RoleIdList = input.RoleIdList }); + + await _sysUserExtOrgService.UpdateUserExtOrg(input.Id, input.ExtOrgIdList); + } + + /// + /// 删除用户 🔖 + /// + /// + /// + [UnitOfWork] + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + [DisplayName("删除用户")] + public virtual async Task DeleteUser(DeleteUserInput input) + { + var user = await _sysUserRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D0009); + if (user.AccountType == AccountTypeEnum.SuperAdmin) + throw Oops.Oh(ErrorCodeEnum.D1014); + if (user.Id == _userManager.UserId) + throw Oops.Oh(ErrorCodeEnum.D1001); + + // 强制下线 + await _sysOnlineUserService.ForceOffline(user.Id); + + await _sysUserRep.DeleteAsync(user); + + // 删除用户角色 + await _sysUserRoleService.DeleteUserRoleByUserId(input.Id); + + // 删除用户扩展机构 + await _sysUserExtOrgService.DeleteUserExtOrgByUserId(input.Id); + + // 删除域账号 + await _sysUserLdapService.DeleteUserLdapByUserId(input.Id); + } + + /// + /// 查看用户基本信息 🔖 + /// + /// + [DisplayName("查看用户基本信息")] + public virtual async Task GetBaseInfo() + { + return await _sysUserRep.GetFirstAsync(u => u.Id == _userManager.UserId); + } + + /// + /// 更新用户基本信息 🔖 + /// + /// + [ApiDescriptionSettings(Name = "BaseInfo"), HttpPost] + [DisplayName("更新用户基本信息")] + public virtual async Task UpdateBaseInfo(SysUser user) + { + return await _sysUserRep.AsUpdateable(user) + .IgnoreColumns(u => new { u.CreateTime, u.Account, u.Password, u.AccountType, u.OrgId, u.PosId }).ExecuteCommandAsync(); + } + + /// + /// 设置用户状态 🔖 + /// + /// + /// + [DisplayName("设置用户状态")] + public virtual async Task SetStatus(UserInput input) + { + if (_userManager.UserId == input.Id) + throw Oops.Oh(ErrorCodeEnum.D1026); + + var user = await _sysUserRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D0009); + if (user.AccountType == AccountTypeEnum.SuperAdmin) + throw Oops.Oh(ErrorCodeEnum.D1015); + + if (!Enum.IsDefined(typeof(StatusEnum), input.Status)) + throw Oops.Oh(ErrorCodeEnum.D3005); + + // 账号禁用则增加黑名单,账号启用则移除黑名单 + var sysCacheService = App.GetRequiredService(); + if (input.Status == StatusEnum.Disable) + { + sysCacheService.Set($"{CacheConst.KeyBlacklist}{user.Id}", $"{user.RealName}-{user.Phone}"); + + // 强制下线 + await _sysOnlineUserService.ForceOffline(user.Id); + } + else + { + sysCacheService.Remove($"{CacheConst.KeyBlacklist}{user.Id}"); + } + + user.Status = input.Status; + return await _sysUserRep.AsUpdateable(user).UpdateColumns(u => new { u.Status }).ExecuteCommandAsync(); + } + + /// + /// 授权用户角色 🔖 + /// + /// + /// + [UnitOfWork] + [DisplayName("授权用户角色")] + public async Task GrantRole(UserRoleInput input) + { + //var user = await _sysUserRep.GetFirstAsync(u => u.Id == input.UserId) ?? throw Oops.Oh(ErrorCodeEnum.D0009); + //if (user.AccountType == AccountTypeEnum.SuperAdmin) + // throw Oops.Oh(ErrorCodeEnum.D1022); + + await _sysUserRoleService.GrantUserRole(input); + } + + /// + /// 修改用户密码 🔖 + /// + /// + /// + [DisplayName("修改用户密码")] + public virtual async Task ChangePwd(ChangePwdInput input) + { + // 国密SM2解密(前端密码传输SM2加密后的) + input.PasswordOld = CryptogramUtil.SM2Decrypt(input.PasswordOld); + input.PasswordNew = CryptogramUtil.SM2Decrypt(input.PasswordNew); + + var user = await _sysUserRep.GetFirstAsync(u => u.Id == _userManager.UserId) ?? throw Oops.Oh(ErrorCodeEnum.D0009); + if (CryptogramUtil.CryptoType == CryptogramEnum.MD5.ToString()) + { + if (user.Password != MD5Encryption.Encrypt(input.PasswordOld)) + throw Oops.Oh(ErrorCodeEnum.D1004); + } + else + { + if (CryptogramUtil.Decrypt(user.Password) != input.PasswordOld) + throw Oops.Oh(ErrorCodeEnum.D1004); + } + + if (input.PasswordOld == input.PasswordNew) + throw Oops.Oh(ErrorCodeEnum.D1028); + + // 验证密码强度 + if (CryptogramUtil.StrongPassword) + { + user.Password = input.PasswordNew.TryValidate(CryptogramUtil.PasswordStrengthValidation) + ? CryptogramUtil.Encrypt(input.PasswordNew) + : throw Oops.Oh(CryptogramUtil.PasswordStrengthValidationMsg); + } + else + { + user.Password = CryptogramUtil.Encrypt(input.PasswordNew); + } + + return await _sysUserRep.AsUpdateable(user).UpdateColumns(u => u.Password).ExecuteCommandAsync(); + } + + /// + /// 重置用户密码 🔖 + /// + /// + /// + [DisplayName("重置用户密码")] + public virtual async Task ResetPwd(ResetPwdUserInput input) + { + var user = await _sysUserRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D0009); + var password = await _sysConfigService.GetConfigValue(CommonConst.SysPassword); + user.Password = CryptogramUtil.Encrypt(password); + await _sysUserRep.AsUpdateable(user).UpdateColumns(u => u.Password).ExecuteCommandAsync(); + return password; + } + + /// + /// 解除登录锁定 🔖 + /// + /// + /// + [DisplayName("解除登录锁定")] + public virtual async Task UnlockLogin(UnlockLoginInput input) + { + var user = await _sysUserRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D0009); + + var keyErrorPasswordCount = $"{CacheConst.KeyErrorPasswordCount}{user.Account}"; + // 清空密码错误次数 + _sysCacheService.Remove(keyErrorPasswordCount); + } + + /// + /// 获取用户拥有角色集合 🔖 + /// + /// + /// + [DisplayName("获取用户拥有角色集合")] + public async Task> GetOwnRoleList(long userId) + { + return await _sysUserRoleService.GetUserRoleIdList(userId); + } + + /// + /// 获取用户扩展机构集合 🔖 + /// + /// + /// + [DisplayName("获取用户扩展机构集合")] + public async Task> GetOwnExtOrgList(long userId) + { + return await _sysUserExtOrgService.GetUserExtOrgList(userId); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/User/UserManager.cs b/Admin.NET/Admin.NET.Core/Service/User/UserManager.cs new file mode 100644 index 0000000..257e516 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/User/UserManager.cs @@ -0,0 +1,55 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 当前登录用户 +/// +public class UserManager : IScoped +{ + private readonly IHttpContextAccessor _httpContextAccessor; + + /// + /// 用户ID + /// + public long UserId => (_httpContextAccessor.HttpContext?.User.FindFirst(ClaimConst.UserId)?.Value).ToLong(); + + /// + /// 租户ID + /// + public long TenantId => (_httpContextAccessor.HttpContext?.User.FindFirst(ClaimConst.TenantId)?.Value).ToLong(); + + /// + /// 用户账号 + /// + public string Account => _httpContextAccessor.HttpContext?.User.FindFirst(ClaimConst.Account)?.Value; + + /// + /// 真实姓名 + /// + public string RealName => _httpContextAccessor.HttpContext?.User.FindFirst(ClaimConst.RealName)?.Value; + + /// + /// 是否超级管理员 + /// + public bool SuperAdmin => _httpContextAccessor.HttpContext?.User.FindFirst(ClaimConst.AccountType)?.Value == ((int)AccountTypeEnum.SuperAdmin).ToString(); + + /// + /// 组织机构Id + /// + public long OrgId => (_httpContextAccessor.HttpContext?.User.FindFirst(ClaimConst.OrgId)?.Value).ToLong(); + + /// + /// 微信OpenId + /// + public string OpenId => _httpContextAccessor.HttpContext?.User.FindFirst(ClaimConst.OpenId)?.Value; + + public UserManager(IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Wechat/Dto/ImportWeChatUserDto.cs b/Admin.NET/Admin.NET.Core/Service/Wechat/Dto/ImportWeChatUserDto.cs new file mode 100644 index 0000000..9dee363 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Wechat/Dto/ImportWeChatUserDto.cs @@ -0,0 +1,130 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service; +public class ImportWeChatUserDto +{ + + public virtual long? TenantId { get; set; } + /// + /// 用户头像 + /// + public string AvatarUrl { get; set; } + + /// + /// 用户code + /// + public string UserCode { get; set; } + + /// + /// 小程序openid + /// + public string OpenId { get; set; } + + /// + /// 用户名 + /// + public string NickName { get; set; } + + /// + /// 性别 1男 2女 + /// + public int Gender { get; set; } + + /// + /// 电话 + /// + public string Phone { get; set; } + + /// + /// 用户密码 + /// + public string UserPwd { get; set; } + + /// + /// 密码混合验证字段 + /// + public string Salt { get; set; } + + + /// + ///学生所在学校 + /// + public string SchoolName { get; set; } + + /// + /// 学生所在班级 + /// + public string ClassName { get; set; } + + /// + /// 省市区id + /// + public int AreaId { get; set; } + /// + /// 省市区名称 + /// + public string AreaName { get; set; } + + /// + /// 状态:0、未启用,1、启用,2、禁用 + /// + public int? Status { get; set; } = 1; + + /// + ///学生数据是否初始化(省份,选科等) + /// + public bool? Datainit { get; set; } + + /// + /// 0(新高考),1(文科,理科) + /// + public int? Subject { get; set; } + + + public string Subjectgroup { get; set; } + + + + public string subjectgroupName { get; set; } + + /// + /// 考生预计分数 + /// + public double? Expectedscore { get; set; } + + /// + /// 分数位次 + /// + public double? Rank { get; set; } + + /// + /// 是否为VIP + /// + public bool IsVIP { get; set; } = false; + + public string VipCode { get; set; } + + public int IsUpdateScore { get; set; } + + public int Year { get; set; } + + public int Id { get; set; } + + public int? CreateId { get; set; } + + public string CreateBy { get; set; } + + public DateTime? CreateTime { get; set; } + + public int? ModifyId { get; set; } + + public string ModifyBy { get; set; } + + public DateTime? ModifyTime { get; set; } + + +} diff --git a/Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WechatInput.cs b/Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WechatInput.cs new file mode 100644 index 0000000..3231f47 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WechatInput.cs @@ -0,0 +1,109 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 生成网页授权Url +/// +public class GenAuthUrlInput +{ + /// + /// RedirectUrl + /// + public string RedirectUrl { get; set; } + + /// + /// Scope + /// + public string Scope { get; set; } + + /// + /// State + /// + public string State { get; set; } +} + +/// +/// 获取微信用户OpenId +/// +public class WechatOAuth2Input +{ + /// + /// Code + /// + [Required(ErrorMessage = "Code不能为空"), MinLength(10, ErrorMessage = "Code错误")] + public string Code { get; set; } +} + +/// +/// 微信用户登录 +/// +public class WechatUserLogin +{ + /// + /// OpenId + /// + [Required(ErrorMessage = "微信标识不能为空"), MinLength(10, ErrorMessage = "微信标识长错误")] + public string OpenId { get; set; } +} + +/// +/// 获取配置签名 +/// +public class SignatureInput +{ + /// + /// Url + /// + public string Url { get; set; } +} + +/// +/// 获取消息模板列表 +/// +public class MessageTemplateSendInput +{ + /// + /// 订阅模板Id + /// + [Required(ErrorMessage = "订阅模板Id不能为空")] + public string TemplateId { get; set; } + + /// + /// 接收者的OpenId + /// + [Required(ErrorMessage = "接收者的OpenId不能为空")] + public string ToUserOpenId { get; set; } + + /// + /// 模板数据,格式形如 { "key1": { "value": any }, "key2": { "value": any } } + /// + [Required(ErrorMessage = "模板数据不能为空")] + public Dictionary Data { get; set; } + + /// + /// 模板跳转链接 + /// + public string Url { get; set; } + + /// + /// 所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar) + /// + public string MiniProgramPagePath { get; set; } +} + +/// +/// 删除消息模板 +/// +public class DeleteMessageTemplateInput +{ + /// + /// 订阅模板Id + /// + [Required(ErrorMessage = "订阅模板Id不能为空")] + public string TemplateId { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WechatPayInput.cs b/Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WechatPayInput.cs new file mode 100644 index 0000000..4d29621 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WechatPayInput.cs @@ -0,0 +1,43 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class WechatPayTransactionInput +{ + /// + /// OpenId + /// + public string OpenId { get; set; } + + /// + /// 订单金额 + /// + public int Total { get; set; } + + /// + /// 商品描述 + /// + public string Description { get; set; } + + /// + /// 附加数据 + /// + public string Attachment { get; set; } + + /// + /// 优惠标记 + /// + public string GoodsTag { get; set; } +} + +public class WechatPayParaInput +{ + /// + /// 订单Id + /// + public string PrepayId { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WechatPayOutput.cs b/Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WechatPayOutput.cs new file mode 100644 index 0000000..b00e16a --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WechatPayOutput.cs @@ -0,0 +1,30 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class WechatPayOutput +{ + /// + /// OpenId + /// + public string OpenId { get; set; } + + /// + /// 订单金额 + /// + public int Total { get; set; } + + /// + /// 附加数据 + /// + public string Attachment { get; set; } + + /// + /// 优惠标记 + /// + public string GoodsTag { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WechatUserInput.cs b/Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WechatUserInput.cs new file mode 100644 index 0000000..ca43b79 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WechatUserInput.cs @@ -0,0 +1,24 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class WechatUserInput : BasePageInput +{ + /// + /// 昵称 + /// + public string NickName { get; set; } + + /// + /// 手机号码 + /// + public string PhoneNumber { get; set; } +} + +public class DeleteWechatUserInput : BaseIdInput +{ +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WxOpenInput.cs b/Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WxOpenInput.cs new file mode 100644 index 0000000..0ec4ced --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WxOpenInput.cs @@ -0,0 +1,118 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 获取微信用户OpenId +/// +public class JsCode2SessionInput +{ + /// + /// JsCode + /// + [Required(ErrorMessage = "JsCode不能为空"), MinLength(10, ErrorMessage = "JsCode错误")] + public string JsCode { get; set; } +} + +/// +/// 获取微信用户电话号码 +/// +public class WxPhoneInput : WxOpenIdLoginInput +{ + /// + /// Code + /// + [Required(ErrorMessage = "Code不能为空"), MinLength(10, ErrorMessage = "Code错误")] + public string Code { get; set; } +} + +/// +/// 微信小程序登录 +/// +public class WxOpenIdLoginInput +{ + /// + /// OpenId + /// + [Required(ErrorMessage = "微信标识不能为空"), MinLength(10, ErrorMessage = "微信标识错误")] + public string OpenId { get; set; } +} + +/// +/// 微信手机号登录 +/// +public class WxPhoneLoginInput +{ + /// + /// 电话号码 + /// + [DataValidation(ValidationTypes.PhoneNumber, ErrorMessage = "电话号码错误")] + public string PhoneNumber { get; set; } +} + +/// +/// 发送订阅消息 +/// +public class SendSubscribeMessageInput +{ + /// + /// 订阅模板Id + /// + [Required(ErrorMessage = "订阅模板Id不能为空")] + public string TemplateId { get; set; } + + /// + /// 接收者的OpenId + /// + [Required(ErrorMessage = "接收者的OpenId不能为空")] + public string ToUserOpenId { get; set; } + + /// + /// 模板内容,格式形如 { "key1": { "value": any }, "key2": { "value": any } } + /// + [Required(ErrorMessage = "模板内容不能为空")] + public Dictionary Data { get; set; } + + /// + /// 跳转小程序类型 + /// + public string MiniprogramState { get; set; } + + /// + /// 语言类型 + /// + public string Language { get; set; } + + /// + /// 点击模板卡片后的跳转页面(仅限本小程序内的页面),支持带参数(示例pages/app/index?foo=bar) + /// + public string MiniProgramPagePath { get; set; } +} + +/// +/// 增加订阅消息模板 +/// +public class AddSubscribeMessageTemplateInput +{ + /// + /// 模板标题Id + /// + [Required(ErrorMessage = "模板标题Id不能为空")] + public string TemplateTitleId { get; set; } + + /// + /// 模板关键词列表,例如 [3,5,4] + /// + [Required(ErrorMessage = "模板关键词列表不能为空")] + public List KeyworkIdList { get; set; } + + /// + /// 服务场景描述,15个字以内 + /// + [Required(ErrorMessage = "服务场景描述不能为空")] + public string SceneDescription { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WxOpenOutput.cs b/Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WxOpenOutput.cs new file mode 100644 index 0000000..d5718cc --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WxOpenOutput.cs @@ -0,0 +1,20 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +public class WxOpenIdOutput +{ + public string OpenId { get; set; } + + public string accessToken { get; set; } + +} + +public class WxPhoneOutput +{ + public string PhoneNumber { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatPayService.cs b/Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatPayService.cs new file mode 100644 index 0000000..876fb13 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatPayService.cs @@ -0,0 +1,261 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 微信支付服务 🧩 +/// +[ApiDescriptionSettings(Order = 210)] +public class SysWechatPayService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _sysWechatPayUserRep; + + private readonly WechatPayOptions _wechatPayOptions; + private readonly PayCallBackOptions _payCallBackOptions; + + private readonly WechatTenpayClient _wechatTenpayClient; + private readonly SqlSugarRepository _sysWechatUserRep; + private readonly SqlSugarRepository _sysWechatUserExtendRep; + private readonly SysCacheService _cache; + public SysWechatPayService(SqlSugarRepository sysWechatPayUserRep, + IOptions wechatPayOptions, + IOptions payCallBackOptions, + SqlSugarRepository sysWechatUserExtendRep, + SqlSugarRepository sysWechatUserRep, + SysCacheService cache) + { + _sysWechatPayUserRep = sysWechatPayUserRep; + _wechatPayOptions = wechatPayOptions.Value; + _payCallBackOptions = payCallBackOptions.Value; + + _wechatTenpayClient = CreateTenpayClient(); + _sysWechatUserExtendRep = sysWechatUserExtendRep; + _sysWechatUserRep = sysWechatUserRep; + _cache = cache; + } + + /// + /// 初始化微信支付客户端 + /// + /// + private WechatTenpayClient CreateTenpayClient() + { + var cerFilePath = App.WebHostEnvironment.ContentRootPath + _wechatPayOptions.MerchantCertificatePrivateKey; + + var tenpayClientOptions = new WechatTenpayClientOptions() + { + MerchantId = _wechatPayOptions.MerchantId, + MerchantV3Secret = _wechatPayOptions.MerchantV3Secret, + MerchantCertificateSerialNumber = _wechatPayOptions.MerchantCertificateSerialNumber, + MerchantCertificatePrivateKey = File.Exists(cerFilePath) ? File.ReadAllText(cerFilePath) : "", + PlatformCertificateManager = new InMemoryCertificateManager() + }; + // DingDingHook.DingTalkHookMessage("WechatTenpayClient", cerFilePath); + return new WechatTenpayClient(tenpayClientOptions); + } + + /// + /// 生成JSAPI调起支付所需参数 🔖 + /// + /// + /// + //[DisplayName("生成JSAPI调起支付所需参数")] + //public dynamic GenerateParametersForJsapiPay(WechatPayParaInput input) + //{ + // return _wechatTenpayClient.GenerateParametersForJsapiPayRequest(_wechatPayOptions.AppId, input.PrepayId); + //} + + /// + /// 微信支付统一下单获取Id(商户直连) 🔖 + /// + [DisplayName("微信支付统一下单获取Id(商户直连)")] + public async Task CreatePayTransaction([FromBody] WechatPayTransactionInput input) + { + var orderTradeNumber = DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff") + (new Random()).Next(100, 1000); + var request = new CreatePayTransactionJsapiRequest() + { + OutTradeNumber = orderTradeNumber, // 订单号 + AppId = _wechatPayOptions.AppId, + Description = input.Description, + Attachment = string.Format("{0}|{1}", input.OpenId, orderTradeNumber), + GoodsTag = input.GoodsTag, + ExpireTime = DateTimeOffset.Now.AddMinutes(10), + NotifyUrl = _payCallBackOptions.WechatPayUrl, + Amount = new CreatePayTransactionJsapiRequest.Types.Amount() { Total = input.Total }, + Payer = new CreatePayTransactionJsapiRequest.Types.Payer() { OpenId = input.OpenId } + }; + var response = await _wechatTenpayClient.ExecuteCreatePayTransactionJsapiAsync(request); + if (!response.IsSuccessful()) + throw Oops.Oh(response.ErrorMessage); + + // 保存订单信息 + var wechatPay = new SysWechatPay() + { + AppId = _wechatPayOptions.AppId, + MerchantId = _wechatPayOptions.MerchantId, + OutTradeNumber = request.OutTradeNumber, + Description = input.Description, + Attachment = input.Attachment, + GoodsTag = input.GoodsTag, + Total = input.Total, + OpenId = input.OpenId, + TransactionId = "" + }; + await _sysWechatPayUserRep.InsertAsync(wechatPay); + + return _wechatTenpayClient.GenerateParametersForJsapiPayRequest(_wechatPayOptions.AppId, response.PrepayId); + } + + /// + /// 微信支付统一下单获取Id(服务商模式)---此接口目前版本不用 🔖 + /// + [DisplayName("微信支付统一下单获取Id(服务商模式)")] + public async Task CreatePayPartnerTransaction([FromBody] WechatPayTransactionInput input) + { + var request = new CreatePayPartnerTransactionJsapiRequest() + { + OutTradeNumber = DateTimeOffset.Now.ToString("yyyyMMddHHmmssfff") + (new Random()).Next(100, 1000), // 订单号 + AppId = _wechatPayOptions.AppId, + MerchantId = _wechatPayOptions.MerchantId, + SubAppId = _wechatPayOptions.AppId, + SubMerchantId = _wechatPayOptions.MerchantId, + Description = input.Description, + Attachment = input.Attachment, + GoodsTag = input.GoodsTag, + ExpireTime = DateTimeOffset.Now.AddMinutes(10), + NotifyUrl = _payCallBackOptions.WechatPayUrl, + Amount = new CreatePayPartnerTransactionJsapiRequest.Types.Amount() { Total = input.Total }, + Payer = new CreatePayPartnerTransactionJsapiRequest.Types.Payer() { OpenId = input.OpenId } + }; + var response = await _wechatTenpayClient.ExecuteCreatePayPartnerTransactionJsapiAsync(request); + if (!response.IsSuccessful()) + throw Oops.Oh(response.ErrorMessage); + + // 保存订单信息 + var wechatPay = new SysWechatPay() + { + AppId = _wechatPayOptions.AppId, + MerchantId = _wechatPayOptions.MerchantId, + SubAppId = _wechatPayOptions.AppId, + SubMerchantId = _wechatPayOptions.MerchantId, + OutTradeNumber = request.OutTradeNumber, + Description = input.Description, + Attachment = input.Attachment, + GoodsTag = input.GoodsTag, + Total = input.Total, + OrderType = EnumOrderType.payment, + OpenId = input.OpenId, + TransactionId = "" + }; + await _sysWechatPayUserRep.InsertAsync(wechatPay); + return _wechatTenpayClient.GenerateParametersForJsapiPayRequest(_wechatPayOptions.AppId, response.PrepayId); + } + + /// + /// 获取支付订单详情 🔖 + /// + /// + /// + [DisplayName("获取支付订单详情")] + public async Task GetPayInfo(string tradeId) + { + return await _sysWechatPayUserRep.GetFirstAsync(u => u.OutTradeNumber == tradeId); + } + + /// + /// 微信支付成功回调(商户直连) 🔖 + /// + /// + [AllowAnonymous] + [DisplayName("微信支付成功回调(商户直连)")] + public async Task PayCallBack() + { + using var ms = new MemoryStream(); + await App.HttpContext.Request.Body.CopyToAsync(ms); + var b = ms.ToArray(); + var callbackJson = Encoding.UTF8.GetString(b); + + var callbackModel = _wechatTenpayClient.DeserializeEvent(callbackJson); + DingDingHook.DingTalkHookMessage("支付回调", callbackModel.ToJson()); + if ("TRANSACTION.SUCCESS".Equals(callbackModel.EventType)) + { + var callbackResource = _wechatTenpayClient.DecryptEventResource(callbackModel); + + // 修改订单支付状态 + var wechatPay = await _sysWechatPayUserRep.GetFirstAsync(u => u.OutTradeNumber == callbackResource.OutTradeNumber + && u.MerchantId == callbackResource.MerchantId); + if (wechatPay == null) return null; + wechatPay.OpenId = callbackResource.Payer.OpenId; // 支付者标识 + wechatPay.OrderType = EnumOrderType.payoff; + wechatPay.MerchantId = callbackResource.MerchantId; // 微信商户号 + wechatPay.OutTradeNumber = callbackResource.OutTradeNumber; // 商户订单号 + wechatPay.TransactionId = callbackResource.TransactionId; // 支付订单号 + wechatPay.TradeType = callbackResource.TradeType; // 交易类型 + wechatPay.TradeState = callbackResource.TradeState; // 交易状态 + wechatPay.TradeStateDescription = callbackResource.TradeStateDescription; // 交易状态描述 + wechatPay.BankType = callbackResource.BankType; // 付款银行类型 + wechatPay.Total = callbackResource.Amount.Total; // 订单总金额 + wechatPay.PayerTotal = callbackResource.Amount.PayerTotal; // 用户支付金额 + wechatPay.SuccessTime = callbackResource.SuccessTime; // 支付完成时间 + await _sysWechatPayUserRep.AsUpdateable(wechatPay).IgnoreColumns(true).ExecuteCommandAsync(); + var _syswechatinfo = await _sysWechatUserRep.GetFirstAsync(s => s.OpenId == wechatPay.OpenId); + var _extend = await _sysWechatUserExtendRep.GetFirstAsync(u => u.WxId == _syswechatinfo.Id); + await _sysWechatUserExtendRep.UpdateAsync(u => new SysWeChatUserExtend() { IsVIP = true }, u => u.Id == _extend.Id); + var _existKey = _cache.ExistKey("WxVIP_" + _extend.Id); + if (_existKey) + { + _cache.Set("WxVIP_" + _extend.Id, true, TimeSpan.FromHours(1));//若用户付费更改vip状态后需要更新redis缓存 + } + return new WechatPayOutput() + { + Total = wechatPay.Total, + Attachment = wechatPay.Attachment, + GoodsTag = wechatPay.GoodsTag + }; + } + + return null; + } + + /// + /// 微信支付成功回调(服务商模式) 🔖 + /// + /// + [AllowAnonymous] + [DisplayName("微信支付成功回调(服务商模式)")] + public async Task PayPartnerCallBack() + { + using var ms = new MemoryStream(); + await App.HttpContext.Request.Body.CopyToAsync(ms); + var b = ms.ToArray(); + var callbackJson = Encoding.UTF8.GetString(b); + + var callbackModel = _wechatTenpayClient.DeserializeEvent(callbackJson); + if ("TRANSACTION.SUCCESS".Equals(callbackModel.EventType)) + { + var callbackResource = _wechatTenpayClient.DecryptEventResource(callbackModel); + + // 修改订单支付状态 + var wechatPay = await _sysWechatPayUserRep.GetFirstAsync(u => u.OutTradeNumber == callbackResource.OutTradeNumber + && u.MerchantId == callbackResource.MerchantId); + if (wechatPay == null) return; + //wechatPay.OpenId = callbackResource.Payer.OpenId; // 支付者标识 + //wechatPay.MerchantId = callbackResource.MerchantId; // 微信商户号 + //wechatPay.OutTradeNumber = callbackResource.OutTradeNumber; // 商户订单号 + wechatPay.TransactionId = callbackResource.TransactionId; // 支付订单号 + wechatPay.TradeType = callbackResource.TradeType; // 交易类型 + wechatPay.TradeState = callbackResource.TradeState; // 交易状态 + wechatPay.TradeStateDescription = callbackResource.TradeStateDescription; // 交易状态描述 + wechatPay.BankType = callbackResource.BankType; // 付款银行类型 + wechatPay.Total = callbackResource.Amount.Total; // 订单总金额 + wechatPay.PayerTotal = callbackResource.Amount.PayerTotal; // 用户支付金额 + wechatPay.SuccessTime = callbackResource.SuccessTime; // 支付完成时间 + + await _sysWechatPayUserRep.AsUpdateable(wechatPay).IgnoreColumns(true).ExecuteCommandAsync(); + } + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatService.cs b/Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatService.cs new file mode 100644 index 0000000..fc45a94 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatService.cs @@ -0,0 +1,286 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 微信公众号服务 🧩 +/// +[ApiDescriptionSettings(Order = 230)] +public class SysWechatService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _sysWechatUserRep; + private readonly SysConfigService _sysConfigService; + private readonly WechatApiClientFactory _wechatApiClientFactory; + private readonly WechatApiClient _wechatApiClient; + private readonly SqlSugarRepository _sysWechatUserExtendRep; + public SysWechatService(SqlSugarRepository sysWechatUserRep, + SysConfigService sysConfigService, + WechatApiClientFactory wechatApiClientFactory, + SqlSugarRepository sysWechatUserExtendRep) + { + _sysWechatUserRep = sysWechatUserRep; + _sysConfigService = sysConfigService; + _wechatApiClientFactory = wechatApiClientFactory; + _wechatApiClient = wechatApiClientFactory.CreateWechatClient(); + _sysWechatUserExtendRep = sysWechatUserExtendRep; + } + + + + + /// + /// + /// + /// + /// + [ApiDescriptionSettings(Name = "ImportUser"), HttpPost] + [AllowAnonymous] + [DisplayName("ImportUser")] + public async Task ImportUser(IFormFile file) + { + try + { + var wechatuser = await _sysWechatUserRep.AsQueryable().Where(e => e.IsDelete == false).ToListAsync(); + var user_list = new List(); + var u_extend = new List(); + var list = InputExcelUtil.InputExcel(file); + //list.ForEach(item => + //{ + // if (!wechatuser.Any(e => e.OpenId == item.OpenId)) + // { + + // var wechatusermodel = new SysWechatUser() + // { + // IsDelete = false, + // Avatar = item.AvatarUrl, + // CreateTime = item.CreateTime, + // CreateUserId = item.CreateId, + // CreateUserName = item.CreateBy, + // Id = item.Id, + // Language = "zh", + // Mobile = item.Phone, + // OpenId = item.OpenId, + // Province = item.AreaName, + // Sex = item.Gender, + // PlatformType = PlatformTypeEnum.微信小程序 + // }; + + // user_list.Add(wechatusermodel); + + // u_extend.Add(new SysWeChatUserExtend() + // { + // IsVIP = item.IsVIP, + // ClassName = item.ClassName, + // SchoolName = item.SchoolName, + // CreateTime = item.CreateTime, + // CreateUserId = item.CreateId, + // CreateUserName = item.CreateBy, + // expectedScore = item.Expectedscore, + // Init = item.Datainit, + // IsDelete = false, + // Rank = item.Rank, + // sp =!string.IsNullOrEmpty(item.AreaName)?item.AreaName.Contains("上海") ? 1 : 2:2, + // subjectGroup = item.Subjectgroup, + // Year = item.Year, + // VipCode = item.VipCode, + // WxId = wechatusermodel.Id, + // IsUpdateScore = 0 + // }); + + // } + //}); + await _sysWechatUserExtendRep.InsertRangeAsync(u_extend); + return await _sysWechatUserRep.InsertRangeAsync(user_list); + } + catch (Exception ex) + { + + throw Oops.Oh(ex.Message); + + } + } + + + + /// + /// 生成网页授权Url 🔖 + /// + /// + /// + [AllowAnonymous] + [DisplayName("生成网页授权Url")] + public string GenAuthUrl(GenAuthUrlInput input) + { + return _wechatApiClient.GenerateParameterizedUrlForConnectOAuth2Authorize(input.RedirectUrl, input.Scope, input.State); + } + + /// + /// 获取微信用户OpenId 🔖 + /// + /// + [AllowAnonymous] + [DisplayName("获取微信用户OpenId")] + public async Task SnsOAuth2([FromQuery] WechatOAuth2Input input) + { + var reqOAuth2 = new SnsOAuth2AccessTokenRequest() + { + Code = input.Code, + }; + var resOAuth2 = await _wechatApiClient.ExecuteSnsOAuth2AccessTokenAsync(reqOAuth2); + if (resOAuth2.ErrorCode != (int)WechatReturnCodeEnum.请求成功) + throw Oops.Oh(resOAuth2.ErrorMessage + " " + resOAuth2.ErrorCode); + + var wxUser = await _sysWechatUserRep.GetFirstAsync(p => p.OpenId == resOAuth2.OpenId); + if (wxUser == null) + { + var reqUserInfo = new SnsUserInfoRequest() + { + OpenId = resOAuth2.OpenId, + AccessToken = resOAuth2.AccessToken, + }; + var resUserInfo = await _wechatApiClient.ExecuteSnsUserInfoAsync(reqUserInfo); + wxUser = resUserInfo.Adapt(); + wxUser.Avatar = resUserInfo.HeadImageUrl; + wxUser.NickName = resUserInfo.Nickname; + wxUser = await _sysWechatUserRep.AsInsertable(wxUser).ExecuteReturnEntityAsync(); + } + else + { + wxUser.AccessToken = resOAuth2.AccessToken; + wxUser.RefreshToken = resOAuth2.RefreshToken; + await _sysWechatUserRep.AsUpdateable(wxUser).IgnoreColumns(true).ExecuteCommandAsync(); + } + + return resOAuth2.OpenId; + } + + /// + /// 微信用户登录OpenId 🔖 + /// + /// + /// + [AllowAnonymous] + [DisplayName("微信用户登录OpenId")] + public async Task OpenIdLogin(WechatUserLogin input) + { + var wxUser = await _sysWechatUserRep.GetFirstAsync(p => p.OpenId == input.OpenId); + if (wxUser == null) + throw Oops.Oh("微信用户登录OpenId错误"); + + var tokenExpire = await _sysConfigService.GetTokenExpire(); + return new + { + wxUser.Avatar, + accessToken = JWTEncryption.Encrypt(new Dictionary + { + { ClaimConst.UserId, wxUser.Id }, + { ClaimConst.NickName, wxUser.NickName }, + { ClaimConst.LoginMode, LoginModeEnum.APP }, + }, tokenExpire) + }; + } + + /// + /// 获取配置签名参数(wx.config) 🔖 + /// + /// + [DisplayName("获取配置签名参数(wx.config)")] + public async Task GenConfigPara(SignatureInput input) + { + var resCgibinToken = await _wechatApiClient.ExecuteCgibinTokenAsync(new CgibinTokenRequest()); + var request = new CgibinTicketGetTicketRequest() + { + AccessToken = resCgibinToken.AccessToken + }; + var response = await _wechatApiClient.ExecuteCgibinTicketGetTicketAsync(request); + if (!response.IsSuccessful()) + throw Oops.Oh(response.ErrorMessage); + return _wechatApiClient.GenerateParametersForJSSDKConfig(response.Ticket, input.Url); + } + + /// + /// 获取模板列表 🔖 + /// + [DisplayName("获取模板列表")] + public async Task GetMessageTemplateList() + { + var accessToken = await GetCgibinToken(); + var reqTemplate = new CgibinTemplateGetAllPrivateTemplateRequest() + { + AccessToken = accessToken + }; + var resTemplate = await _wechatApiClient.ExecuteCgibinTemplateGetAllPrivateTemplateAsync(reqTemplate); + if (resTemplate.ErrorCode != (int)WechatReturnCodeEnum.请求成功) + throw Oops.Oh(resTemplate.ErrorMessage + " " + resTemplate.ErrorCode); + + return resTemplate.TemplateList; + } + + /// + /// 发送模板消息 🔖 + /// + /// + /// + [DisplayName("发送模板消息")] + public async Task SendTemplateMessage(MessageTemplateSendInput input) + { + var dataInfo = input.Data.ToDictionary(k => k.Key, k => k.Value); + var messageData = new Dictionary(); + foreach (var item in dataInfo) + { + messageData.Add(item.Key, new CgibinMessageTemplateSendRequest.Types.DataItem() { Value = "" + item.Value.Value.ToString() + "" }); + } + + var accessToken = await GetCgibinToken(); + var reqMessage = new CgibinMessageTemplateSendRequest() + { + AccessToken = accessToken, + TemplateId = input.TemplateId, + ToUserOpenId = input.ToUserOpenId, + Url = input.Url, + MiniProgram = new CgibinMessageTemplateSendRequest.Types.MiniProgram + { + AppId = _wechatApiClientFactory._wechatOptions.WechatAppId, + PagePath = input.MiniProgramPagePath, + }, + Data = messageData + }; + var resMessage = await _wechatApiClient.ExecuteCgibinMessageTemplateSendAsync(reqMessage); + return resMessage; + } + + /// + /// 删除模板 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "DeleteMessageTemplate"), HttpPost] + [DisplayName("删除模板")] + public async Task DeleteMessageTemplate(DeleteMessageTemplateInput input) + { + var accessToken = await GetCgibinToken(); + var reqMessage = new CgibinTemplateDeletePrivateTemplateRequest() + { + AccessToken = accessToken, + TemplateId = input.TemplateId + }; + var resTemplate = await _wechatApiClient.ExecuteCgibinTemplateDeletePrivateTemplateAsync(reqMessage); + return resTemplate; + } + + /// + /// 获取Access_token + /// + private async Task GetCgibinToken() + { + var reqCgibinToken = new CgibinTokenRequest(); + var resCgibinToken = await _wechatApiClient.ExecuteCgibinTokenAsync(reqCgibinToken); + if (resCgibinToken.ErrorCode != (int)WechatReturnCodeEnum.请求成功) + throw Oops.Oh(resCgibinToken.ErrorMessage + " " + resCgibinToken.ErrorCode); + return resCgibinToken.AccessToken; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatUserService.cs b/Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatUserService.cs new file mode 100644 index 0000000..dde22d8 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatUserService.cs @@ -0,0 +1,73 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 微信账号服务 🧩 +/// +[ApiDescriptionSettings(Order = 220)] +public class SysWechatUserService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _sysWechatUserRep; + + public SysWechatUserService(SqlSugarRepository sysWechatUserRep) + { + _sysWechatUserRep = sysWechatUserRep; + } + + /// + /// 获取微信用户列表 🔖 + /// + /// + /// + [DisplayName("获取微信用户列表")] + public async Task> Page(WechatUserInput input) + { + return await _sysWechatUserRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.NickName), u => u.NickName.Contains(input.NickName)) + .WhereIF(!string.IsNullOrWhiteSpace(input.PhoneNumber), u => u.Mobile.Contains(input.PhoneNumber)) + .OrderBy(u => u.Id, OrderByType.Desc) + .ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 增加微信用户 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Add"), HttpPost] + [DisplayName("增加微信用户")] + public async Task AddWechatUser(SysWechatUser input) + { + await _sysWechatUserRep.InsertAsync(input.Adapt()); + } + + /// + /// 更新微信用户 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Update"), HttpPost] + [DisplayName("更新微信用户")] + public async Task UpdateWechatUser(SysWechatUser input) + { + var weChatUser = input.Adapt(); + await _sysWechatUserRep.AsUpdateable(weChatUser).IgnoreColumns(true).ExecuteCommandAsync(); + } + + /// + /// 删除微信用户 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + [DisplayName("删除微信用户")] + public async Task DeleteWechatUser(DeleteWechatUserInput input) + { + await _sysWechatUserRep.DeleteAsync(u => u.Id == input.Id); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Wechat/SysWxOpenService.cs b/Admin.NET/Admin.NET.Core/Service/Wechat/SysWxOpenService.cs new file mode 100644 index 0000000..cf4630d --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Wechat/SysWxOpenService.cs @@ -0,0 +1,307 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core.Service; + +/// +/// 微信小程序服务 🧩 +/// +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 240)] +public class SysWxOpenService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _sysWechatUserRep; + private readonly SysConfigService _sysConfigService; + private readonly WechatApiClient _wechatApiClient; + private readonly SqlSugarRepository _systenant; + private readonly IHttpContextAccessor _httpContextAccessor; + public SysWxOpenService(SqlSugarRepository sysWechatUserRep, + SysConfigService sysConfigService, + WechatApiClientFactory wechatApiClientFactory, + SqlSugarRepository systenant, + IHttpContextAccessor httpContextAccessor) + { + _sysWechatUserRep = sysWechatUserRep; + _sysConfigService = sysConfigService; + _wechatApiClient = wechatApiClientFactory.CreateWxOpenClient(); + _systenant = systenant; + _httpContextAccessor = httpContextAccessor; + } + + + + /// + /// 同步微信公众号数据 + /// + /// + /// + [AllowAnonymous] + [DisplayName("同步微信数据")] + public async Task SyncWeChatUser(SysWechatUser user) + { + var token = _httpContextAccessor.HttpContext.Request.Headers["access-token"]; + var authOpt = App.GetConfig("OAuth", true); + if (string.IsNullOrEmpty(token)) + throw Oops.Oh(ErrorCodeEnum.D1011); + if (token == authOpt.SSO.ClientSecret) + { + DingDingHook.DingTalkHookMessage("SnsLogin", user.ToJson()); + var wxUser = await _sysWechatUserRep.GetFirstAsync(p => p.OpenId == user.OpenId && p.PlatformType == PlatformTypeEnum.微信小程序); + if (wxUser == null) + { + if (string.IsNullOrWhiteSpace(user.NickName)) + { + user.NickName = "学霸" + YitIdHelper.NextId().ToString().Substring(0, 4); + user.Avatar = "https://private-zhiyuan.oss-cn-beijing.aliyuncs.com/avatar.png"; + } + wxUser = await _sysWechatUserRep.AsInsertable(user).ExecuteReturnEntityAsync(); + } + else + { + if (string.IsNullOrWhiteSpace(wxUser.UnionId)) + { + wxUser.UnionId = user.UnionId; + } + if (string.IsNullOrWhiteSpace(wxUser.NickName)) + { + string nickcode = wxUser.Id.ToString().Length > 5 ? wxUser.Id.ToString().Substring(0, 4) : wxUser.Id.ToString(); + wxUser.NickName = $"学霸{nickcode}"; + wxUser.Avatar = "https://private-zhiyuan.oss-cn-beijing.aliyuncs.com/avatar.png"; + } + await _sysWechatUserRep.AsUpdateable(wxUser).IgnoreColumns(true).ExecuteCommandAsync(); + } + var tokenExpire = await _sysConfigService.GetTokenExpire(); + return true; + } + return true; + + } + + + + /// + /// 获取微信用户OpenId 🔖 + /// + /// + [AllowAnonymous] + [DisplayName("获取微信用户OpenId")] + public async Task GetWxOpenId([FromQuery] JsCode2SessionInput input) + { + try + { + var reqJsCode2Session = new SnsJsCode2SessionRequest() + { + JsCode = input.JsCode, + }; + var resCode2Session = await _wechatApiClient.ExecuteSnsJsCode2SessionAsync(reqJsCode2Session); + if (resCode2Session.ErrorCode != (int)WechatReturnCodeEnum.请求成功) + throw Oops.Oh(resCode2Session.ErrorMessage + " " + resCode2Session.ErrorCode); + + var wxUser = await _sysWechatUserRep.GetFirstAsync(p => p.OpenId == resCode2Session.OpenId); + if (wxUser == null) + { + // throw Oops.Oh(resCode2Session.ToJson()); + var user = new SysWechatUser + { + OpenId = resCode2Session.OpenId, + UnionId = resCode2Session.UnionId, + SessionKey = resCode2Session.SessionKey, + PlatformType = PlatformTypeEnum.微信小程序, + NickName = "学霸", + Avatar = "https://private-zhiyuan.oss-cn-beijing.aliyuncs.com/avatar.png", + Language = "zh", + }; + wxUser = await _sysWechatUserRep.AsInsertable(user).ExecuteReturnEntityAsync(); + } + else + { string nickcode = wxUser.Id.ToString().Length > 5 ? wxUser.Id.ToString().Substring(0, 4) : wxUser.Id.ToString(); + wxUser.NickName = $"学霸{nickcode}"; + if (string.IsNullOrWhiteSpace(wxUser.UnionId)) + { + wxUser.UnionId = resCode2Session.UnionId; + } + // wxUser.Avatar = "https://private-zhiyuan.oss-cn-beijing.aliyuncs.com/avatar.png"; + await _sysWechatUserRep.AsUpdateable(wxUser).IgnoreColumns(true).ExecuteCommandAsync(); + } + var tokenExpire = await _sysConfigService.GetTokenExpire(); + + return new WxOpenIdOutput + { + OpenId = resCode2Session.OpenId, + accessToken = JWTEncryption.Encrypt(new Dictionary + { + { ClaimConst.UserId, wxUser.Id }, + { ClaimConst.NickName, wxUser.NickName }, + { ClaimConst.LoginMode, LoginModeEnum.APP }, + }, tokenExpire) + }; + } + catch (Exception ex) + { + DingDingHook.DingTalkHookMessage("获取微信用户OpenId异常", ex.Message); + throw Oops.Oh(ex.Message); + } + + + } + + + + + + /// + /// 获取微信用户电话号码 🔖 + /// + /// + [AllowAnonymous] + [DisplayName("获取微信用户电话号码")] + public async Task GetWxPhone([FromQuery] WxPhoneInput input) + { + try + { + var accessToken = await GetCgibinToken(); + var reqUserPhoneNumber = new WxaBusinessGetUserPhoneNumberRequest() + { + Code = input.Code, + AccessToken = accessToken, + }; + var resUserPhoneNumber = await _wechatApiClient.ExecuteWxaBusinessGetUserPhoneNumberAsync(reqUserPhoneNumber); + if (resUserPhoneNumber.ErrorCode != (int)WechatReturnCodeEnum.请求成功) + throw Oops.Oh(resUserPhoneNumber.ErrorMessage + " " + resUserPhoneNumber.ErrorCode); + + + + var wxUser = await _sysWechatUserRep.GetFirstAsync(p => p.OpenId == input.OpenId); + if (wxUser != null) + { + if (!string.IsNullOrWhiteSpace(resUserPhoneNumber.PhoneInfo.PhoneNumber)) + { + wxUser.Mobile = resUserPhoneNumber.PhoneInfo?.PhoneNumber; + } + await _sysWechatUserRep.AsUpdateable(wxUser).IgnoreColumns(true).ExecuteCommandAsync(); + } + + return new WxPhoneOutput + { + PhoneNumber = resUserPhoneNumber.PhoneInfo?.PhoneNumber + }; + } + catch (Exception ex) + { + DingDingHook.DingTalkHookMessage("获取微信用户电话号码", ex.Message); + throw Oops.Oh(ex.Message); + } + } + + + + /// + /// 微信小程序登录OpenId 🔖 + /// + /// + /// + [AllowAnonymous] + [DisplayName("微信小程序登录OpenId")] + public async Task WxOpenIdLogin(WxOpenIdLoginInput input) + { + try + { + var wxUser = await _sysWechatUserRep.GetFirstAsync(p => p.OpenId == input.OpenId); + if (wxUser == null) + throw Oops.Oh("微信小程序登录失败"); + + var tokenExpire = await _sysConfigService.GetTokenExpire(); + return new + { + wxUser.Avatar, + accessToken = JWTEncryption.Encrypt(new Dictionary + { + { ClaimConst.UserId, wxUser.Id }, + { ClaimConst.RealName, wxUser.NickName }, + { ClaimConst.LoginMode, LoginModeEnum.APP }, + }, tokenExpire) + }; + } + catch (Exception ex) + { + DingDingHook.DingTalkHookMessage("微信小程序登录OpenId", ex.Message); + throw Oops.Oh(ex.Message); + } + } + + /// + /// 获取订阅消息模板列表 🔖 + /// + [DisplayName("获取订阅消息模板列表")] + public async Task GetMessageTemplateList() + { + var accessToken = await GetCgibinToken(); + var reqTemplate = new WxaApiNewTemplateGetTemplateRequest() + { + AccessToken = accessToken + }; + var resTemplate = await _wechatApiClient.ExecuteWxaApiNewTemplateGetTemplateAsync(reqTemplate); + if (resTemplate.ErrorCode != (int)WechatReturnCodeEnum.请求成功) + throw Oops.Oh(resTemplate.ErrorMessage + " " + resTemplate.ErrorCode); + + return resTemplate.TemplateList; + } + + /// + /// 发送订阅消息 🔖 + /// + /// + /// + [DisplayName("发送订阅消息")] + public async Task SendSubscribeMessage(SendSubscribeMessageInput input) + { + var accessToken = await GetCgibinToken(); + var reqMessage = new CgibinMessageSubscribeSendRequest() + { + AccessToken = accessToken, + TemplateId = input.TemplateId, + ToUserOpenId = input.ToUserOpenId, + Data = input.Data, + MiniProgramState = input.MiniprogramState, + Language = input.Language, + MiniProgramPagePath = input.MiniProgramPagePath + }; + var resMessage = await _wechatApiClient.ExecuteCgibinMessageSubscribeSendAsync(reqMessage); + return resMessage; + } + + /// + /// 增加订阅消息模板 🔖 + /// + /// + /// + [ApiDescriptionSettings(Name = "AddSubscribeMessageTemplate"), HttpPost] + [DisplayName("增加订阅消息模板")] + public async Task AddSubscribeMessageTemplate(AddSubscribeMessageTemplateInput input) + { + var accessToken = await GetCgibinToken(); + var reqMessage = new WxaApiNewTemplateAddTemplateRequest() + { + AccessToken = accessToken, + TemplateTitleId = input.TemplateTitleId, + KeyworkIdList = input.KeyworkIdList, + SceneDescription = input.SceneDescription + }; + var resTemplate = await _wechatApiClient.ExecuteWxaApiNewTemplateAddTemplateAsync(reqMessage); + return resTemplate; + } + + /// + /// 获取Access_token + /// + private async Task GetCgibinToken() + { + var reqCgibinToken = new CgibinTokenRequest(); + var resCgibinToken = await _wechatApiClient.ExecuteCgibinTokenAsync(reqCgibinToken); + if (resCgibinToken.ErrorCode != (int)WechatReturnCodeEnum.请求成功) + throw Oops.Oh(resCgibinToken.ErrorMessage + " " + resCgibinToken.ErrorCode); + return resCgibinToken.AccessToken; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Wechat/WechatApiHttpClient.cs b/Admin.NET/Admin.NET.Core/Service/Wechat/WechatApiHttpClient.cs new file mode 100644 index 0000000..d6d06fe --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/Wechat/WechatApiHttpClient.cs @@ -0,0 +1,84 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Newtonsoft.Json; + +namespace Admin.NET.Core.Service; + +/// +/// 微信API客户端 +/// +public partial class WechatApiClientFactory : ISingleton +{ + private readonly IHttpClientFactory _httpClientFactory; + public readonly WechatOptions _wechatOptions; + + public WechatApiClientFactory(IHttpClientFactory httpClientFactory, IOptions wechatOptions) + { + _httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory)); + _wechatOptions = wechatOptions.Value ?? throw new ArgumentNullException(nameof(wechatOptions)); + } + + /// + /// 微信公众号 + /// + /// + public WechatApiClient CreateWechatClient() + { + if (string.IsNullOrEmpty(_wechatOptions.WechatAppId) || string.IsNullOrEmpty(_wechatOptions.WechatAppSecret)) + throw Oops.Oh("微信公众号配置错误"); + + var client = WechatApiClientBuilder.Create(new WechatApiClientOptions() + { + AppId = _wechatOptions.WechatAppId, + AppSecret = _wechatOptions.WechatAppSecret, + PushToken = _wechatOptions.WechatToken, + PushEncodingAESKey = _wechatOptions.WechatEncodingAESKey, + }) + .UseHttpClient(_httpClientFactory.CreateClient(), disposeClient: false) // 设置 HttpClient 不随客户端一同销毁 + .Build(); + + client.Configure(config => + { + JsonSerializerSettings jsonSerializerSettings = NewtonsoftJsonSerializer.GetDefaultSerializerSettings(); + jsonSerializerSettings.Formatting = Formatting.Indented; + config.JsonSerializer = new NewtonsoftJsonSerializer(jsonSerializerSettings); // 指定 System.Text.Json JSON序列化 + // config.JsonSerializer = new SystemTextJsonSerializer(jsonSerializerOptions); // 指定 Newtonsoft.Json JSON序列化 + }); + + return client; + } + + /// + /// 微信小程序 + /// + /// + public WechatApiClient CreateWxOpenClient() + { + if (string.IsNullOrEmpty(_wechatOptions.WxOpenAppId) || string.IsNullOrEmpty(_wechatOptions.WxOpenAppSecret)) + throw Oops.Oh("微信小程序配置错误"); + + var client = WechatApiClientBuilder.Create(new WechatApiClientOptions() + { + AppId = _wechatOptions.WxOpenAppId, + AppSecret = _wechatOptions.WxOpenAppSecret, + PushToken = _wechatOptions.WxToken, + PushEncodingAESKey = _wechatOptions.WxEncodingAESKey, + }) + .UseHttpClient(_httpClientFactory.CreateClient(), disposeClient: false) // 设置 HttpClient 不随客户端一同销毁 + .Build(); + + client.Configure(config => + { + JsonSerializerSettings jsonSerializerSettings = NewtonsoftJsonSerializer.GetDefaultSerializerSettings(); + jsonSerializerSettings.Formatting = Formatting.Indented; + config.JsonSerializer = new NewtonsoftJsonSerializer(jsonSerializerSettings); // 指定 System.Text.Json JSON序列化 + // config.JsonSerializer = new SystemTextJsonSerializer(jsonSerializerOptions); // 指定 Newtonsoft.Json JSON序列化 + }); + + return client; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/ZYAdmissionsTrends/DTO/AdTrendsRequestDto.cs b/Admin.NET/Admin.NET.Core/Service/ZYAdmissionsTrends/DTO/AdTrendsRequestDto.cs new file mode 100644 index 0000000..bef9f34 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYAdmissionsTrends/DTO/AdTrendsRequestDto.cs @@ -0,0 +1,153 @@ +using MongoDB.Bson.Serialization.Attributes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service +{ + public class AdTrendsRequestDto : PageBaseRequest + { + public string keyword { get; set; } + + /// + /// 用户所在省份编码 + /// + public string locationCode { get; set; } + + public List provinceName { get; set; } + + /// + /// + /// + public List utype { get; set; } + public List nature { get; set; } + public List ascription { get; set; } + + /// + /// 985、211 + /// + public List feature { get; set; } + + /// + /// 本科0专科1 + /// + public int? level { get; set; } + + } + + public class AdTrendsExtendDto + { + public int Year { get; set; } + } + + + public class MajorAdTrendsRequestDto + { + /// + /// 院校Id + /// + public int uid { get; set; } + + /// + /// 年份(预留参数不传) + /// + public int year { get; set; } + + /// + /// 学生所在省份编码 + /// + public string locationCode { get; set; } + + } + + public class MajorAdTrendsResponseDto + { + + public int Year { get; set; } + public List items { get; set; } + } + public class MajorAdTrendsItemResponseDto + { + public string MajorGroup { get; set; } + /// + /// 专业代码 + /// + public string MajorCode { get; set; } + + /// + /// 专业名称 + /// + public string MajorName { get; set; } + /// + ///专业备注 + /// + public string MajroRemark { get; set; } + + /// + /// 选科限制 + /// + public string Selectsubject { get; set; } + + + /// + /// 年份 + /// + public string Academic { get; set; } + /// + /// 专业所在批次 + /// + public string BatchName { get; set; } + /// + /// 专业学费 + /// + public string Fee { get; set; } + + + /// + /// 旧计划 + /// + public int OldPlan { get; set; } + /// + /// 新计划 + /// + public int NewPlan { get; set; } + + } + public class AdTrendsResponseDto + { + [BsonId] + public long _id { get; set; } + public string name { get; set; } + public string provinceName { get; set; } + public string cityName { get; set; } + public string logo { get; set; } + public string rank { get; set; } + public string collegeCode { get; set; } + public List features { get; set; } + public string belong { get; set; } + public int? level { get; set; } + public List utype { get; set; } + public string nature { get; set; } + + //public string batchName { get; set; } + + /// + /// 招生总专业数 + /// + public int PlanCount { get; set; } + /// + /// 旧计划 + /// + public int OldPlan { get; set; } + + /// + /// 新计划 + /// + public int NewPlan { get; set; } + + } + + +} diff --git a/Admin.NET/Admin.NET.Core/Service/ZYAdmissionsTrends/ZYAdmissionsTrendsService.cs b/Admin.NET/Admin.NET.Core/Service/ZYAdmissionsTrends/ZYAdmissionsTrendsService.cs new file mode 100644 index 0000000..7fd28f7 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYAdmissionsTrends/ZYAdmissionsTrendsService.cs @@ -0,0 +1,271 @@ +using DocumentFormat.OpenXml.Office2010.ExcelAc; +using DocumentFormat.OpenXml.Vml.Office; +using DocumentFormat.OpenXml.Wordprocessing; +using Elastic.Clients.Elasticsearch; +using Flurl; +using Flurl.Http; +using Flurl.Util; +using iText.Layout.Element; +using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.Caching.Distributed; +using Microsoft.Extensions.Caching.Memory; +using MongoDB.Bson; +using MongoDB.Driver; +using Newtonsoft.Json; +using RazorEngine.Compilation.ImpromptuInterface.InvokeExt; +using System.Collections.Generic; + +namespace Admin.NET.Core.Service +{ + + + + /// + ///院校扩缩招 + /// + [AllowAnonymous] + [ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 900)] + [Route("api/admissionstreds")] + public class ZYAdmissionsTrendsService : IDynamicApiController, ITransient + { + private readonly IMongoDBRepository _mongoRepository; + public ZYAdmissionsTrendsService(IMongoDBRepository mongoDBRepository) + { + _mongoRepository = mongoDBRepository; + + } + + + /// + /// 院校扩缩招同步服务 + /// + /// + /// + [DisplayName("院校扩缩招同步服务"), HttpPost] + public async Task> SyncUniversity([FromBody] AdTrendsRequestDto request) + { + DateTime dt = DateTime.Now; + DateTime fixedDate = new DateTime(dt.Year, 7, 20); // 创建当前年份的7月20日 + int year = dt > fixedDate ? dt.Year : dt.Year - 1; // 比较当前日期与固定日期 + var zymodel = new AdTrendsExtendDto() + { + Year = year + }; + var resultitems = new List(); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var bejson = dbclient.GetCollection("university"); + // 动态条件列表 + var filterBuilders = new List>(); + if (!string.IsNullOrWhiteSpace(request.keyword)) + { + filterBuilders.Add(Builders.Filter.Regex(p => p.name, new BsonRegularExpression($"/{request.keyword}/"))); + } + if (request.level.HasValue) + { + filterBuilders.Add(Builders.Filter.Eq("level", request.level.Value)); + } + + if (request.provinceName != null && request.provinceName.Count() > 0)//省份 + { + filterBuilders.Add(Builders.Filter.In(p => p.provinceName, request.provinceName)); + } + if (request.nature != null && request.nature.Count() > 0)//包含--公办 民办 + { + filterBuilders.Add(Builders.Filter.In(p => p.nature, request.nature)); + } + if (request.utype != null && request.utype.Count() > 0)//包含--院校类型 综合 理工 + { + filterBuilders.Add(Builders.Filter.AnyIn(p => p.utype, request.utype)); + } + //// 构建查询条件:SubItems数组中的某个元素的Description字段包含subItemDescriptionSubstring + //var subItemFilter = filterBuilder.ElemMatch(x => x.SubItems, filterBuilder.Regex(y => y.Description, new BsonRegularExpression($".*{subItemDescriptionSubstring}.*", "i"))); + if (request.feature != null && request.feature.Count() > 0) //985、211 + { + filterBuilders.Add(Builders.Filter.AnyIn(p => p.features, request.feature)); + } + // 使用And组合所有过滤条件 + FilterDefinition filter = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) + : new BsonDocument(); // 如果没有条件,则使用空过滤器 + // 你可以根据需要添加排序字段 + var sort = Builders.Sort.Ascending(x => x._id); // 替换YourField为实际的排序字段 + // 创建分页对象并获取分页数据 + var pagination = new MongoPagination(bejson, filter, sort, request.PageSize, request.PageIndex); + var (items, totalCount, totalPages) = await pagination.GetPagedDataAsync(); + var oldtrendjson = dbclient.GetCollection($"zsplanpro_{request.locationCode}_{year - 1}"); + var newtrendjson = dbclient.GetCollection($"zsplanpro_{request.locationCode}_{year}"); + + var trendfilterBuilders = new List>(); + if (items.Count() > 0) + { + var uids = items.Select(s => s._id).ToList(); + trendfilterBuilders.Add(Builders.Filter.In("_uid", uids)); + + FilterDefinition trendfilter = filterBuilders.Count > 0 + ? Builders.Filter.And(trendfilterBuilders) + : new BsonDocument(); + var oldtrend = await oldtrendjson.Find(trendfilter).ToListAsync(); + var newtrend = await newtrendjson.Find(trendfilter).ToListAsync(); + items.ForEach(a => + { + resultitems.Add(new AdTrendsResponseDto() + { + belong = a.belong, + cityName = a.cityName, + collegeCode = a.collegeCode, + features = a.features, + level = a.level, + logo = a.logo, + name = a.name, + nature = a.nature, + provinceName = a.provinceName, + // batchName = newtrend.Any(e => e._uid == a._id) ? newtrend.Where(e => e._uid == a._id).FirstOrDefault().batchName : "", + rank = a.rank, + utype = a.utype, + _id = a._id, + PlanCount = newtrend.Any(e => e._uid == a._id) ? newtrend.Where(e => e._uid == a._id).Count() : 0, + OldPlan = oldtrend.Where(e => e._uid == a._id).Sum(s => s.plancount) ?? 0, + NewPlan = newtrend.Where(e => e._uid == a._id).Sum(s => s.plancount) ?? 0, + }); + }); + } + + var newbeJson = dbclient.GetCollection($"zsadtrends_{request.locationCode}"); + await newbeJson.InsertManyAsync(resultitems); + return new PageBaseTrendsResult() + { + PageNo = request.PageIndex, + PageSize = request.PageSize, + TotalPage = totalPages, + TotalRows = totalCount, + TModel = zymodel, + Rows = resultitems, + }; + } + + + /// + /// 院校扩缩招 + /// + /// + /// + + [DisplayName("院校扩缩招"), HttpPost] + public async Task> University([FromBody] AdTrendsRequestDto request) + { + DateTime dt = DateTime.Now; + DateTime fixedDate = new DateTime(dt.Year, 7, 20); // 创建当前年份的7月20日 + int year = dt > fixedDate ? dt.Year : dt.Year - 1; // 比较当前日期与固定日期 + var zymodel = new AdTrendsExtendDto() + { + Year = year + }; + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var bejson = dbclient.GetCollection($"zsadtrends_{request.locationCode}"); + // 动态条件列表 + var filterBuilders = new List>(); + if (!string.IsNullOrWhiteSpace(request.keyword)) + { + filterBuilders.Add(Builders.Filter.Regex(p => p.name, new BsonRegularExpression($"/{request.keyword}/"))); + } + if (request.level.HasValue) + { + filterBuilders.Add(Builders.Filter.Eq("level", request.level.Value)); + } + + if (request.provinceName != null && request.provinceName.Count() > 0)//省份 + { + filterBuilders.Add(Builders.Filter.In(p => p.provinceName, request.provinceName)); + } + if (request.nature != null && request.nature.Count() > 0)//包含--公办 民办 + { + filterBuilders.Add(Builders.Filter.In(p => p.nature, request.nature)); + } + if (request.utype != null && request.utype.Count() > 0)//包含--院校类型 综合 理工 + { + filterBuilders.Add(Builders.Filter.AnyIn(p => p.utype, request.utype)); + } + if (request.feature != null && request.feature.Count() > 0) //985、211 + { + filterBuilders.Add(Builders.Filter.AnyIn(p => p.features, request.feature)); + } + // 使用And组合所有过滤条件 + FilterDefinition filter = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) + : new BsonDocument(); // 如果没有条件,则使用空过滤器 + // 你可以根据需要添加排序字段 + var sort = Builders.Sort.Ascending(x => x._id); // 替换YourField为实际的排序字段 + // 创建分页对象并获取分页数据 + var pagination = new MongoPagination(bejson, filter, sort, request.PageSize, request.PageIndex); + var (items, totalCount, totalPages) = await pagination.GetPagedDataAsync(); + return new PageBaseTrendsResult() + { + PageNo = request.PageIndex, + PageSize = request.PageSize, + TotalPage = totalPages, + TotalRows = totalCount, + TModel = zymodel, + Rows = items, + }; + } + + + + + + + + + + /// + /// 专业扩缩招 + /// + /// + /// + [DisplayName("专业扩缩招"), HttpGet] + public async Task Major([FromQuery] MajorAdTrendsRequestDto request) + { + var result = new MajorAdTrendsResponseDto(); + DateTime dt = DateTime.Now; + DateTime fixedDate = new DateTime(dt.Year, 7, 20); // 创建当前年份的7月20日 + result.Year = dt > fixedDate ? dt.Year : dt.Year - 1; // 比较当前日期与固定日期 + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var oldtrendjson = dbclient.GetCollection($"zsplanpro_{request.locationCode}_{result.Year - 1}"); + var newtrendjson = dbclient.GetCollection($"zsplanpro_{request.locationCode}_{result.Year}"); + var trendfilterBuilders = new List>(); + trendfilterBuilders.Add(Builders.Filter.Eq(p => p._uid, request.uid)); + FilterDefinition trendfilter = trendfilterBuilders.Count > 0 + ? Builders.Filter.And(trendfilterBuilders) + : new BsonDocument(); + var oldtrend = await oldtrendjson.Find(trendfilter).ToListAsync(); + var newtrend = await newtrendjson.Find(trendfilter).ToListAsync(); + var items = new List(); + newtrend.ForEach(a => + { + items.Add(new MajorAdTrendsItemResponseDto() + { + MajorCode = a.majorcode, + MajorName = a.major, + Academic = a.academic, + BatchName = a.batchName, + Fee = a.fee, + MajorGroup = a.majorgroupname, + MajroRemark = a.remark, + NewPlan = a.plancount.Value, + Selectsubject = a.selectsubject, + OldPlan = oldtrend.Any(e => e.major.Trim() == a.major.Trim() && e._uid == a._uid && e.batchName == a.batchName) ? oldtrend.Where(e => e.major.Trim() == a.major.Trim() && e._uid == a._uid && e.batchName == a.batchName).First().plancount.Value : 0 + }); + }); + result.items = items; + return result; + } + + + + + + + + + } +} diff --git a/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/BaseZProfessionDto.cs b/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/BaseZProfessionDto.cs new file mode 100644 index 0000000..920a826 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/BaseZProfessionDto.cs @@ -0,0 +1,126 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; +namespace Admin.NET.Core.Service; +public class BaseZProfessionDto +{ + public string RootName { get; set; } + public List itemDtos { get; set; } +} + +public class ZProfessionItemDto +{ + public long Id { get; set; } + + public string Name { get; set; } + +} + + + + + +public class BaseProfessions +{ + [JsonConverter(typeof(ObjectIdConverter))] + public ObjectId _id { get; set; } + public string rootName { get; set; } + public List itemDtos { get; set; } +} + +public class Itemdto +{ + public int id { get; set; } + public string name { get; set; } +} + +public class BaseProRootobject +{ + public int code { get; set; } + public string msg { get; set; } + public BaseProData data { get; set; } + public string token { get; set; } + public string cnt { get; set; } +} + +public class BaseProData +{ + [BsonId] + public int id { get; set; } + public string career_type { get; set; } + public string career { get; set; } + public string img_url { get; set; } + public string intro { get; set; } + public string definition { get; set; } + public string ethics { get; set; } + public Json_Task json_task { get; set; } + public Json_Knowledge json_knowledge { get; set; } + public Json_Prospect json_prospect { get; set; } + public Json_Salary json_salary { get; set; } + public Json_Tool[] json_tool { get; set; } + public Json_Qualification json_qualification { get; set; } + public Json_Curriculum json_curriculum { get; set; } + public Json_Environment json_environment { get; set; } + public Json_Skill json_skill { get; set; } +} + +public class Json_Task +{ + public string task { get; set; } + public string check { get; set; } +} + +public class Json_Knowledge +{ + public string diplomas { get; set; } + public string trade { get; set; } + public string pro { get; set; } +} + +public class Json_Prospect +{ + public string industry { get; set; } + public string person { get; set; } + public string career { get; set; } +} + +public class Json_Salary +{ + public string structure { get; set; } + public string satisfaction { get; set; } + public string welfare { get; set; } +} + +public class Json_Qualification +{ + public string necessary { get; set; } + public string addition { get; set; } +} + +public class Json_Curriculum +{ + public string important { get; set; } +} + +public class Json_Environment +{ + public string site { get; set; } + public string desc { get; set; } +} + +public class Json_Skill +{ + public string skill_pro { get; set; } + public string skill_general { get; set; } +} + +public class Json_Tool +{ + public string name { get; set; } + public string img { get; set; } +} diff --git a/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/BatchResultDto.cs b/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/BatchResultDto.cs new file mode 100644 index 0000000..da0c225 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/BatchResultDto.cs @@ -0,0 +1,143 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; +using Newtonsoft.Json; +namespace Admin.NET.Core.Service; +public class BatchResultDto +{ + [BsonId] + public int id { get; set; } + + public gConfiglist configList { get; set; } + public List list { get; set; } + +} + + +public class BatchResultRequestDto +{ + public string locationCode { get; set; } + + public string year { get; set; } + + /// + /// 类型:0 综合||1(物理)|2(历史)|3理科 |4 文科 + /// + public int? type { get; set; } +} + + +public class gGbatchlist +{ + public int batch_id { get; set; } + public string batch_name { get; set; } +} +public class gConfiglist +{ + public List subjectList { get; set; } + public List batchList { get; set; } + public List yearList { get; set; } +} + +public class gbatchList +{ + public int year { get; set; } + public int province_code { get; set; } + public int subject_id { get; set; } + public int batch_id { get; set; } + public string score { get; set; } + public string province_name { get; set; } + public string batch_name { get; set; } + public string subject_name { get; set; } +} + +public class gYearlist +{ + public string year { get; set; } + public bool check { get; set; } = false; +} + +public class gSubjectlist +{ + public int? subject_id { get; set; } + public string subject_name { get; set; } + public bool check { get; set; }=false; +} + + + + + + + + +public class gaokaoRootobject +{ + public int code { get; set; } + public string msg { get; set; } + public gaokaoData data { get; set; } +} + +public class gaokaoData +{ + public gaokaoConfiglist configList { get; set; } + public gaokaoBatchItem[] list { get; set; } +} + +public class gaokaoConfiglist +{ + public string proDefault { get; set; } + public int yearDefault { get; set; } + public int subjectDefault { get; set; } + public gaokaoProlist[] proList { get; set; } + public gaokaoYearlist[] yearList { get; set; } + public gaokaoSubjectlist[] subjectList { get; set; } + public gaokaoBatchlist[] batchList { get; set; } +} + +public class gaokaoProlist +{ + public int id { get; set; } + public string name { get; set; } + public int parent_id { get; set; } + public string code { get; set; } + public int order { get; set; } + public int parent { get; set; } + public int list_order_by_py { get; set; } + public bool selected { get; set; } +} + +public class gaokaoYearlist +{ + public int year { get; set; } + public bool selected { get; set; } +} + +public class gaokaoSubjectlist +{ + public int subject_id { get; set; } + public string subject_name { get; set; } + public bool selected { get; set; } +} + +public class gaokaoBatchlist +{ + public int batch_id { get; set; } + public string batch_name { get; set; } +} + +public class gaokaoBatchItem +{ + public int year { get; set; } + public int province_code { get; set; } + public int subject_id { get; set; } + public int batch_id { get; set; } + public string score { get; set; } + public string province_name { get; set; } + public string batch_name { get; set; } + public string subject_name { get; set; } +} diff --git a/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/CombineRequestDto.cs b/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/CombineRequestDto.cs new file mode 100644 index 0000000..dba2e74 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/CombineRequestDto.cs @@ -0,0 +1,49 @@ +using MongoDB.Bson.Serialization.Attributes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service; +public class CombineRequestDto +{ + + /// + /// + /// + public string KeyWord { get; set; } + +} + +public class CombinResponseDto +{ + public List universitys { get; set; } + + public List majors { get; set; } + +} + + +public class MajorSearchDto +{ + public int Type { get; set; } + public string Name { get; set; } + public int Id { get; set; } + public string Code { get; set; } +} + + +public class CombinUniversityDto +{ + + public long _id { get; set; } + public string name { get; set; } + public string provinceName { get; set; } + public string cityName { get; set; } + public string logo { get; set; } + + public string collegeCode { get; set; } + + public List utype { get; set; } +} diff --git a/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/CustomPropertyResult.cs b/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/CustomPropertyResult.cs new file mode 100644 index 0000000..1000e2a --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/CustomPropertyResult.cs @@ -0,0 +1,475 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service; + + +public class NewsClassCategoryResponse +{ + public int Id { get; set; } + + public int Sort { get; set; } + public string CategoryName { get; set; } + +} + +/// +/// 就业前景 +/// +public class CareerProspects +{ + /// + /// 职业分布 + /// + public List JobDistribute { get; set; } + /// + /// 行业分布 + /// + public List TradeDistribute { get; set; } + /// + /// 地区分布 + /// + public List RegionDistribute { get; set; } + /// + /// 工资分布 + /// + public List MoneyDistribute { get; set; } + public WorkingYear WorkingYear { get; set; } +} + +public class WorkingYear +{ + public string WorkingYears { get; set; } + public string WorkingYearsWage { get; set; } +} + +public class distribution +{ + /// + /// 名称 + /// + public string name { get; set; } + /// + /// 分布比例 + /// + public double data { get; set; } + /// + /// 备注 + /// + public string detail { get; set; } +} + + +/// +/// 职业 +/// +public class OccupationDetailResult +{ + public int Status { get; set; } + /// + /// 主键id + /// + public string Id { get; set; } + /// + /// 职业名称 + /// + public string Name { get; set; } + /// + /// 排序 + /// + public int Sort { get; set; } + + + public string JobContent { get; set; } + /// + /// 发展前景 + /// + public string Prospects { get; set; } + + /// + /// 岗位要求 + /// + public string Requirements { get; set; } + + /// + /// 个人发展 + /// + public string PersonProspects { get; set; } + + /// + /// 职业就业趋势 + /// + public string OccuptionTrend { get; set; } + + /// + /// 职业介绍 + /// + public string OccupationIntraduce { get; set; } +} +/// +/// 专业介绍 +/// +public class MajorDetail +{ + public string Name { get; set; } + public int id { get; set; } + /// + /// 专业简介 + /// + public string abstracts { get; set; } + /// + /// 主要课程 + /// + public string maincourse { get; set; } + /// + /// 考研方向 + /// + public string studydirection { get; set; } + /// + /// 就业方向 + /// + public string workdirection { get; set; } +} + +public class EvaluationResponse +{ + public int PId { get; set; } + + public string Title { get; set; } + public string Message { get; set; } + + /// + /// 0未测评,1已测评 + /// + public int Status { get; set; } = 0; +} +public class CustomPropertyResult +{ + /// + /// 数据 + /// + public T response { get; set; } + + public int status { get; set; } = 200; + + public bool success { get; set; } = true; + public string msg { get; set; } = "ok"; +} + +/// +/// 测评结果 +/// +public class UserResult +{ + + /// + /// + /// + public string PersonType { get; set; } + + public string Occupation { get; set; } + /// + /// 标签 + /// + public string Tag { get; set; } + + /// + /// 适合的领域 + /// + public string Domain { get; set; } + + /// + /// 性格特征解读 + /// + public string Interpretation { get; set; } + + /// + /// 优势 + /// + public string Advantage { get; set; } + + /// + /// 劣势 + /// + public string Disadvantage { get; set; } + + /// + /// 偏好的活动特质 + /// + public string Feature { get; set; } + + /// + /// 可能存在的盲点 + /// + public string BlindSpot { get; set; } + + /// + /// 建议 + /// + public string Recommend { get; set; } +} +public class appQuestionResult +{ + public int Id { get; set; } + + /// + /// 试题编号 + /// + public int QuestionSort { get; set; } + + /// + /// 问题typeid + /// + public int QuestionTypeId { get; set; } + + /// + /// 问题 + /// + public string QuestionTitle { get; set; } + + /// + /// 标签 + /// + public string QuestionTag { get; set; } + + /// + /// 问题类型 + /// + public string QuestionType { get; set; } + + /// + /// 是否正反记分 + /// + public int IsAddScore { get; set; } +} + +public class Region +{ + public int Id { get; set; } + public string Code { get; set; } + public string Name { get; set; } +} + +public class SeVolunterInitializationDto +{ + + public string Code { get; set; } + public string ProvinceName { get; set; } + + /// + /// + /// + public int Policy { get; set; } + public int IsOpen { get; set; } + + public int AllScore { get; set; } + + public int Years { get; set; } + public List lizations { get; set; } +} + +public class LizationDto +{ + public string name { get; set; } + + /// + /// 0文理分科 1 3+3 2 3+1+3 + /// + public int Policy { get; set; } + public int code { get; set; } +} + + +/// +/// uni 专业列表 +/// +public class uniMajorInfoResult +{ + public int RootId { get; set; } + public string FirstName { get; set; } + public List SecondInfo { get; set; } + public int MajorNum { get; set; } +} +/// +/// uni二级专业列表 +/// +public class uniMajorSecond +{ + public int SecondId { get; set; } + public string MajorName { get; set; } + public int MajorNum { get; set; } + + public List majorSelects { get; set; } + +} + +public class uniMajorSelect +{ + public int pid { get; set; } + public int Id { get; set; } + public string Name { get; set; } + public string Code { get; set; } +} + +public class ScoreLineResponseDto +{ + /// + /// 省份 + /// + public string Province { get; set; } + + /// + /// 年份 + /// + public string Years { get; set; } + + /// + /// 科类 + /// + public string Type { get; set; } + + /// + /// 分数 + /// + public string Score { get; set; } + + + /// + /// 分数区间 + /// + public string ScoreRegion { get; set; } + + /// + /// 本段人数 + /// + public int Count { get; set; } + + /// + /// 累计人数 + /// + public int SumCount { get; set; } + + +} + + +public class SubjectEvBillDTO +{ + /// + /// 推荐选科 + /// + public string Name { get; set; } + + /// + /// 学科兴趣 + /// + public EvBillDTO subjectinterest { get; set; } + + /// + /// 学科能力 + /// + public EvBillDTO subjectability { get; set; } +} +public class EvBillDTO +{ + public string Name { get; set; } + public List data { get; set; } + + public List series { get; set; } + public List categories { get; set; } + public List Billcators { get; set; } +} +public class Evserie +{ + public string name { get; set; } + public List data { get; set; } +} +public class EvBillcator +{ + public string text { get; set; } + public int max { get; set; } +} + + + +public class HollandOccupDetail +{ + public TagtestingHollandResult tagtestingHolland { get; set; } + + /// + /// 标签关联职业 + /// + public List TagOccupations { get; set; } + + /// + /// 标签关联人物 + /// + public List tagMapPeople { get; set; } + + /// + /// 标签解析 + /// + public HollandTagMapExplain tagMapExplain { get; set; } + + +} + +public class Radar +{ + public List categories { get; set; } + public List series { get; set; } +} + +/// +/// +/// +public class TagtestingHollandResult +{ + public Radar radar { get; set; } + + public string TagName { get; set; } + +} + + +public class HollandTagMapExplain +{ + /// + /// 标签描述 + /// + public string Description { get; set; } + + /// + /// 标签基本特征 + /// + public string BaseProperty { get; set; } + + /// + /// 职业特征 + /// + public List OccupationProperty { get; set; } + + /// + /// 标签关联职业 + /// + public string Occupation { get; set; } + + +} + + +public class HollandTagMapPerson +{ + public string NickName { get; set; } + + public string AvatarUrl { get; set; } +} diff --git a/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/DicBaseDto.cs b/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/DicBaseDto.cs new file mode 100644 index 0000000..43390f5 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/DicBaseDto.cs @@ -0,0 +1,21 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service; +public class DicBaseDto +{ + public string id { get; set; } + + public string name { get; set; } + +} + diff --git a/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/FackUniversityDto.cs b/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/FackUniversityDto.cs new file mode 100644 index 0000000..9db00c6 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/FackUniversityDto.cs @@ -0,0 +1,37 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; + +namespace Admin.NET.Core.Service; +public class FackUniversityDto +{ + [JsonConverter(typeof(ObjectIdConverter))] + public ObjectId _id { get; set; } + + public int type { get; set; } + + public string universityName { get; set; } + public string locationName { get; set; } + +} + + + +public class FackUniversityRequestDto +{ + /// + /// 学校模糊搜索 + /// + public string keyword { get; set; } + + /// + /// 省份名称 + /// + public string provinceName { get; set; } + +} diff --git a/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/MajorRootDto.cs b/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/MajorRootDto.cs new file mode 100644 index 0000000..4787a0e --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/MajorRootDto.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service; + +public class MajorRootDto +{ + +} +public class MajorRootRequestInput +{ + /// + /// 类型1050,1060,1070 + /// + public string Type { get; set; } + + public string KeyWord { get; set; } + +} + +/// +/// +/// +public class MajorDetailRequestInput +{ + + public string SpecId { get; set; } + +} + +public class UniversityRecruitsDto +{ + public long uid { get; set; } + +} +public class BaseProfessionRequestInputDto +{ + public string KeyWord { get; set; } + + +} + +public class RecruitsDetailDto +{ + public long id { get; set; } + +} + +public class MajorCarrerInput +{ + /// + /// 专业最底层的zydm代码 + /// + public string zydm { get; set; } +} +public class MajorRootResponseDto +{ + public string type { get; set; } + + + public List RootDtos { get; set; } +} + +public class GKMajorRootDto +{ + public string key { get; set; } + public string name { get; set; } + + public int Count { get; set; } + public int ItemsCount { get; set; } + public List items { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/MongoPagination.cs b/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/MongoPagination.cs new file mode 100644 index 0000000..8efd790 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/MongoPagination.cs @@ -0,0 +1,50 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using MongoDB.Bson; +using MongoDB.Driver; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +public class MongoPagination +{ + private readonly IMongoCollection _collection; + private readonly FilterDefinition _filter; + private readonly SortDefinition _sort; + private readonly int _pageSize; + private readonly int _currentPage; + + public MongoPagination(IMongoCollection collection, FilterDefinition filter, SortDefinition sort, int pageSize, int currentPage) + { + _collection = collection; + _filter = filter ?? new BsonDocument(); // 如果没有过滤器,则使用空过滤器 + _sort = sort ?? Builders.Sort.Ascending(default(string)); // 如果没有排序,则使用默认升序排序 + _pageSize = pageSize; + _currentPage = currentPage; + } + + public async Task<(List Items, long TotalCount, int TotalPages)> GetPagedDataAsync() + { + // 计算总记录数 + long totalCount = await _collection.CountDocumentsAsync(_filter); + + // 计算总页数 + int totalPages = (int)Math.Ceiling((double)totalCount / _pageSize); + + // 跳过之前的页数并获取当前页的数据 + var skip = (_currentPage - 1) * _pageSize; + var items = await _collection + .Find(_filter) + .Sort(_sort) + .Skip(skip) + .Limit(_pageSize) + .ToListAsync(); + + return (items, totalCount, totalPages); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/PageBaseResult.cs b/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/PageBaseResult.cs new file mode 100644 index 0000000..6ee0772 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/PageBaseResult.cs @@ -0,0 +1,81 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service; + + +public class PageBaseRequest +{ + + public int PageIndex { get; set; } = 1; + + public int PageSize { get; set; } = 10; + +} +public class PageBaseResult +{ + public int PageNo { get; set; } + public int PageSize { get; set; } + public int TotalPage { get; set; } + public long TotalRows { get; set; } + public ICollection Rows { get; set; } +} + + +public class PageBaseTrendsResult +{ + public V TModel { get; set; } + public int PageNo { get; set; } + public int PageSize { get; set; } + public int TotalPage { get; set; } + public long TotalRows { get; set; } + public ICollection Rows { get; set; } +} + + +//public class PageZYBaseResult +//{ +// public int PageNo { get; set; } +// public int PageSize { get; set; } +// public int TotalPage { get; set; } +// public long TotalRows { get; set; } + +// public ZyTModel TModel { get; set; } +// public ICollection Rows { get; set; } +//} + + +public class PageOneKeyResult +{ + + + public ZyTModel TModel { get; set; } + public ICollection Rows { get; set; } +} + +public class ZyTModel +{ + /// + /// + /// + public int c { get; set; } + + /// + /// + /// + public int w { get; set; } + + /// + /// + /// + public int b { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/UniversityDto.cs b/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/UniversityDto.cs new file mode 100644 index 0000000..86a78ab --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/UniversityDto.cs @@ -0,0 +1,738 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using MessagePack.Formatters; +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service; + +public class uNiversityTask +{ + + [BsonId] + public long _id { get; set; } + public string name { get; set; } + public string nature { get; set; } + public string provinceName { get; set; } + public string cityName { get; set; } + public string collegeCode { get; set; } + public int rank { get; set; } +} +public class UniversityDto +{ + [BsonId] + public long _id { get; set; } + public string name { get; set; } + public string provinceName { get; set; } + public string cityName { get; set; } + public Resourcecount? resourcecount { get; set; } + public string weburl { get; set; } + public string logo { get; set; } + public string rank { get; set; } + public string collegeCode { get; set; } + public string address { get; set; } + + + [BsonElement("imglist")] + public List imglist { get; set; } + public string vrurl { get; set; } + public string phone { get; set; } + + + + public List features { get; set; } + public string belong { get; set; } + + + public int? level { get; set; } + + + public string builddate { get; set; } + + + public List utype { get; set; } + public string nature { get; set; } +} + + + +public class GaokaoObject +{ + public string code { get; set; } + public string message { get; set; } + public List data { get; set; } + public string md5 { get; set; } +} + +public class Datum +{ + public long school_id { get; set; } + public string name { get; set; } + public string _short { get; set; } + public string old_name { get; set; } + public string type { get; set; } + public long proid { get; set; } +} + + +public class GaokaoDatum +{ + [BsonRepresentation(BsonType.ObjectId)] + public string _id { get; set; } + public long school_id { get; set; } + public string name { get; set; } + public string _short { get; set; } + public string old_name { get; set; } + public string type { get; set; } + public long proid { get; set; } +} + + + +public class univercachDto +{ + [BsonId] + public long _id { get; set; } + public string name { get; set; } + public string logo { get; set; } +} +public class University_wDto +{ + [BsonId] + public long _id { get; set; } + public string name { get; set; } + public string provinceName { get; set; } + public string cityName { get; set; } + + public string weburl { get; set; } + + public int rank { get; set; } + public string logo { get; set; } + public string collegeCode { get; set; } + public string address { get; set; } + + public string phone { get; set; } + + + public Resourcecount? resourcecount { get; set; } + + [BsonElement("imglist")] + public List imglist { get; set; } + public string vrurl { get; set; } + + public List features { get; set; } + public string belong { get; set; } + public int level { get; set; } + public string builddate { get; set; } + + + public string utype { get; set; } + public string nature { get; set; } + + /// + /// 招生计划总人数 + /// + public int planCount { get; set; } + + /// + /// 招生专业总数量 + /// + public int MajorCount { get; set; } + +} + + +public class University_wwDto +{ + [BsonId] + public long _id { get; set; } + public string name { get; set; } + public string provinceName { get; set; } + public string cityName { get; set; } + + public string weburl { get; set; } + + public int rank { get; set; } + public string logo { get; set; } + public string collegeCode { get; set; } + public string address { get; set; } + + public string phone { get; set; } + + + public Resourcecount? resourcecount { get; set; } + + [BsonElement("imglist")] + public List imglist { get; set; } + public string vrurl { get; set; } + + public List features { get; set; } + public string belong { get; set; } + public int level { get; set; } + public string builddate { get; set; } + + + public List utype { get; set; } + public string nature { get; set; } + + /// + /// 招生计划总人数 + /// + public int planCount { get; set; } + + /// + /// 招生专业总数量 + /// + public int MajorCount { get; set; } + +} + + + + +public class Resourcecount +{ + /// + /// + /// + public string academician { get; set; } + /// + /// + /// + public string doctorate { get; set; } + /// + /// + /// + public string master { get; set; } +} + + +public class UniversityDetailResponse +{ + + public UniversityDetailDto universityResult { get; set; } + public Relatedmajor[] relatedMajors { get; set; } + + public Graduatemodels graduateModels { get; set; } +} + + +public class UniversityDetailDto +{ + [BsonId] + public long _id { get; set; } + public string name { get; set; } + public string provinceName { get; set; } + public string cityName { get; set; } + public Resourcecount? resourcecount { get; set; } + public string weburl { get; set; } + public string logo { get; set; } + + public string rank { get; set; } + public string collegeCode { get; set; } + public string address { get; set; } + + public List imglist { get; set; } + public string vrurl { get; set; } + public string phone { get; set; } + + + + public List features { get; set; } + public string belong { get; set; } + + + public int? level { get; set; } + + public bool isCollect { get; set; } = false; + public string builddate { get; set; } + + + public List utype { get; set; } + public string nature { get; set; } + + public string detail { get; set; } +} + + + + +public class SpNamesObject +{ + public string code { get; set; } + public string message { get; set; } + public SpNameData data { get; set; } + public string location { get; set; } + public string encrydata { get; set; } +} + +public class SpNameData +{ + public List item { get; set; } + public int numFound { get; set; } +} + +public class SpNameItem +{ + //[BsonId] + //[JsonConverter(typeof(ObjectIdConverter))] + //public Object _id { get; set; } + public string first_km { get; set; } + public string info { get; set; } + public string length { get; set; } + public string level2_name { get; set; } + public string level3_name { get; set; } + public string local_batch_name { get; set; } + public string local_province_name { get; set; } + public string local_type_name { get; set; } + public string name { get; set; } + public string num { get; set; } + public string province_name { get; set; } + public string remark { get; set; } + public long school_id { get; set; } + public string sg_fxk { get; set; } + public string sg_info { get; set; } + public string sg_name { get; set; } + public string sg_sxk { get; set; } + public int sg_type { get; set; } + public string sp_fxk { get; set; } + public string sp_info { get; set; } + public string sp_name { get; set; } + public string sp_sxk { get; set; } + public string sp_type { get; set; } + public string sp_xuanke { get; set; } + public string spcode { get; set; } + public string special_group { get; set; } + public string spname { get; set; } + public string tuition { get; set; } + public string year { get; set; } + public string zslx_name { get; set; } +} + + + + + +public class SpNameScorebject +{ + public string code { get; set; } + public string message { get; set; } + public SpNameScoreData data { get; set; } + public string location { get; set; } + public string encrydata { get; set; } +} + +public class SpNameScoreData +{ + public List item { get; set; } + public int numFound { get; set; } +} + + + + + +public class SpNameScoreItem +{ + //[BsonId] + //[JsonConverter(typeof(ObjectIdConverter))] + //public Object _id { get; set; } + public string average { get; set; } + public int doublehigh { get; set; } + public string dual_class_name { get; set; } + public int first_km { get; set; } + public string id { get; set; } + public string info { get; set; } + public int is_score_range { get; set; } + public int is_top { get; set; } + public string level2_name { get; set; } + public string level3_name { get; set; } + public string local_batch_name { get; set; } + public string local_province_name { get; set; } + public string local_type_name { get; set; } + public string max { get; set; } + public int min { get; set; } + public string min_range { get; set; } + public string min_rank_range { get; set; } + public int min_section { get; set; } + public string name { get; set; } + public string proscore { get; set; } + public string remark { get; set; } + public long school_id { get; set; } + public string sg_fxk { get; set; } + public string sg_info { get; set; } + public string sg_name { get; set; } + public string sg_sxk { get; set; } + public int sg_type { get; set; } + public string single { get; set; } + public string sp_fxk { get; set; } + public string sp_info { get; set; } + public string sp_name { get; set; } + public string sp_scode { get; set; } + public string sp_sxk { get; set; } + public int sp_type { get; set; } + public int spe_id { get; set; } + public int special_group { get; set; } + public int special_id { get; set; } + public string spname { get; set; } + public int year { get; set; } + public string zslx_name { get; set; } +} + + + + + + + +// 定义 JSON 数据的类结构 +public class PeiZhiRoot +{ + public string code { get; set; } + public string message { get; set; } + public NewsDicData data { get; set; } +} + + +public class NewsDicData +{ + public Newsdata newsdata { get; set; } +} + +public class Newsdata +{ + public Dictionary> type { get; set; } +} + + + + +public class like_spnameObject +{ + public string code { get; set; } + public string message { get; set; } + public like_spnameData data { get; set; } + public string location { get; set; } + public string encrydata { get; set; } +} + +public class like_spnameData +{ + public List item { get; set; } + public int numFound { get; set; } +} + +public class like_DataItem +{ + [BsonId] + [JsonConverter(typeof(ObjectIdConverter))] + public Object _id { get; set; } + public string average { get; set; } + public int doublehigh { get; set; } + public string dual_class_name { get; set; } + public int first_km { get; set; } + public string id { get; set; } + public string info { get; set; } + public int is_score_range { get; set; } + public int is_top { get; set; } + public string level2_name { get; set; } + public string level3_name { get; set; } + public string local_batch_name { get; set; } + public string local_province_name { get; set; } + public string local_type_name { get; set; } + public int max { get; set; } + public int min { get; set; } + public string min_range { get; set; } + public string min_rank_range { get; set; } + public int min_section { get; set; } + public string name { get; set; } + public int proscore { get; set; } + public string remark { get; set; } + public int school_id { get; set; } + public string sg_fxk { get; set; } + public string sg_info { get; set; } + public string sg_name { get; set; } + public string sg_sxk { get; set; } + public int sg_type { get; set; } + public string single { get; set; } + public string sp_fxk { get; set; } + public string sp_info { get; set; } + public string sp_name { get; set; } + public string sp_sxk { get; set; } + public int sp_type { get; set; } + public int spe_id { get; set; } + public int special_group { get; set; } + public int special_id { get; set; } + public string spname { get; set; } + public int year { get; set; } + public string zslx_name { get; set; } +} + + + + + + + + +public class FacultyRootobject +{ + public int code { get; set; } + public string msg { get; set; } + public FacultyData data { get; set; } +} + +public class FacultyData +{ + public FacultylistTag tag { get; set; } + public List facultyList { get; set; } +} + +public class FacultylistTag +{ + public string id { get; set; } + public string college_name { get; set; } + public string college_logo { get; set; } + public string ex_rate { get; set; } + public string college_class { get; set; } + public string college_create_time { get; set; } + public string master_num { get; set; } + public string doctor_num { get; set; } + public string college_nature { get; set; } + public string college_type { get; set; } + public string college_area { get; set; } + public string college_competent { get; set; } + public string[] college_grade { get; set; } + public string wsl_ranking { get; set; } + public string rk_ranking { get; set; } + public string enrollment_rate_in { get; set; } + public string enrollment_rate_out { get; set; } + public string job_report { get; set; } +} + +public class Facultylist +{ + [BsonId] + + public long _id { get; set; } + public long base_college_id { get; set; } + public string college_faculty { get; set; } + public string create_time { get; set; } + public List subject { get; set; } +} + +public class Subject +{ + public long id { get; set; } + public long base_college_id { get; set; } + public long college_faculty_id { get; set; } + public string faculty_subject { get; set; } + public string create_time { get; set; } +} + +public class uniTreeMajorItems +{ + public int ParnetId { get; set; } + public int Id { get; set; } + public string Name { get; set; } + public List Item { get; set; } + public int MajorNum { get; set; } + +} +public class Recruitlistobject +{ + public int code { get; set; } + public string msg { get; set; } + public RecruitlistData data { get; set; } +} + +public class RecruitlistData +{ + public RecruitlistTag tag { get; set; } + public List recruit { get; set; } +} + +public class RecruitlistTag +{ + public string id { get; set; } + public string college_name { get; set; } + public string college_logo { get; set; } + public string ex_rate { get; set; } + public string college_class { get; set; } + public string college_create_time { get; set; } + public string master_num { get; set; } + public string college_nature { get; set; } + public string college_type { get; set; } + public string college_area { get; set; } + public string college_competent { get; set; } + public string wsl_ranking { get; set; } + public string rk_ranking { get; set; } + public string enrollment_rate_in { get; set; } + public string enrollment_rate_out { get; set; } + public string job_report { get; set; } +} + +public class RecruitlistRecruit +{ + [BsonId] + public long id { get; set; } + public long base_college_id { get; set; } + public string year { get; set; } + public string college_name { get; set; } + public string title { get; set; } +} + + +public class Recruitobject +{ + public int code { get; set; } + public string msg { get; set; } + public RecruitData data { get; set; } +} + +public class RecruitData +{ + public Object tag { get; set; } + public RecruitDetailDto recruit { get; set; } +} + + +public class RecruitDetailDto +{ + [BsonId] + public long id { get; set; } + public long base_college_id { get; set; } + public string year { get; set; } + public string college_name { get; set; } + public string title { get; set; } + public string content { get; set; } + public long create_time { get; set; } + public int is_artsys { get; set; } + public string artsys_url { get; set; } +} + +public class SubjectIntroduceRootobject +{ + public int code { get; set; } + public string msg { get; set; } + public SubjectIntroducev1Data? data { get; set; } +} + +public class SubjectIntroducev1Data +{ + public SubjectIntroduceTag? tag { get; set; } + public SubjectIntroduceData? data { get; set; } +} + +public class SubjectIntroduceTag +{ + public string id { get; set; } + public string college_name { get; set; } + public string college_logo { get; set; } + public string ex_rate { get; set; } + public string college_class { get; set; } + public string college_create_time { get; set; } + public string master_num { get; set; } + public string doctor_num { get; set; } + public string college_nature { get; set; } + public string college_type { get; set; } + public string college_area { get; set; } + public string college_competent { get; set; } + public List college_grade { get; set; } + public string wsl_ranking { get; set; } + public string rk_ranking { get; set; } + public string enrollment_rate_in { get; set; } + public string enrollment_rate_out { get; set; } + public string job_report { get; set; } +} + +public class SubjectIntroduceData +{ + [BsonId] + [JsonConverter(typeof(ObjectIdConverter))] + public Object _id { get; set; } + public long base_college_id { get; set; } + public List first_subject_list { get; set; } + public List second_subject_list { get; set; } + public List feature_subject_list { get; set; } + public List stress_subject_list { get; set; } + public List double_subject_list { get; set; } + public List assessment_subject_list { get; set; } + public List assessment_subject_list_new { get; set; } +} + +public class Assessment_Subject_List_New +{ + public string type { get; set; } + public int count { get; set; } + public List data { get; set; } +} + + +public class plannewCombianData +{ + public string average { get; set; } + public int doublehigh { get; set; } + public string dual_class_name { get; set; } + public int first_km { get; set; } + public string info { get; set; } + public int is_score_range { get; set; } + public int is_top { get; set; } + public string level2_name { get; set; } + public string level3_name { get; set; } + public string local_batch_name { get; set; } + public string local_province_name { get; set; } + public string local_type_name { get; set; } + public string max { get; set; } + public int min { get; set; } + public string min_range { get; set; } + public string min_rank_range { get; set; } + public int min_section { get; set; } + public string name { get; set; } + public string proscore { get; set; } + public string remark { get; set; } + public long school_id { get; set; } + public string sg_fxk { get; set; } + public string sg_info { get; set; } + public string sg_name { get; set; } + public string sg_sxk { get; set; } + public int sg_type { get; set; } + public string single { get; set; } + public string sp_fxk { get; set; } + public string sp_info { get; set; } + public string sp_name { get; set; } + public string sp_scode { get; set; } + public string sp_sxk { get; set; } + public int sp_type { get; set; } + public int spe_id { get; set; } + public int special_group { get; set; } + public int special_id { get; set; } + public string spname { get; set; } + public int year { get; set; } + public string zslx_name { get; set; } + + /// + /// 招生计划 + /// + public string num { get; set; } + public string province_name { get; set; } + /// + /// 选科 + /// + public string sp_xuanke { get; set; } + public string spcode { get; set; } + /// + /// 学费 + /// + public string tuition { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/UniversityRankRequest.cs b/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/UniversityRankRequest.cs new file mode 100644 index 0000000..b975c54 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYBase/DTO/UniversityRankRequest.cs @@ -0,0 +1,239 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service; +public class UniversityRankRequest : PageBaseRequest +{ + public int? Type { get; set; } + public int? Year { get; set; } + public string Name { get; set; } + +} + +public class ScoreLineRequest +{ + /// + ///年份 + /// + public string Years { get; set; } + + /// + /// 省份 + /// + public string Pronvice { get; set; } + + + /// + /// 分数 + /// + public int Score { get; set; } + + +} + +public class UniversityRequest : PageBaseRequest +{ + public string name { get; set; } + public List provinceName { get; set; } + + /// + /// + /// + public List utype { get; set; } + public List nature { get; set; } + public List ascription { get; set; } + + /// + /// 985、211 + /// + public List feature { get; set; } + + /// + /// 本科0专科1 + /// + public int? level { get; set; } + + + + + +} + + +public class CompiarUnkRequestDto +{ + public List ids { get; set; } + + /// + /// 所在省份 + /// + public string locationCode { get; set; } + + public string years { get; set; } = "2024"; +} +public class UniversityMongoResult +{ + + public string collegeCode { get; set; } + + /// + /// 官网 + /// + public string Web { get; set; } + /// + /// 主键id + /// + public int Id { get; set; } + /// + /// 名称 + /// + public string Name { get; set; } + + /// + /// 院士数 + /// + public int? AcademicianCount { get; set; } + /// + /// 博士数 + /// + public int DoctorateCount { get; set; } + /// + /// 硕士数 + /// + public int MasterCount { get; set; } + + public int Rank { get; set; } + /// + /// 学校logo + /// + public string Logo { get; set; } + /// + /// 学校简介 + /// + public string Description { get; set; } + /// + /// 省市区名称 + /// + public string AreaName { get; set; } + public string CityName { get; set; } + /// + /// 办学性质 + /// + public string Nature { get; set; } + /// + /// 隶属于 + /// + public string AscriptionName { get; set; } + + public string Belong { get; set; } + /// + /// 学科层次 + /// + public int? SubjectLevel { get; set; } + /// + /// 学校类型 + /// + public List UniversityType { get; set; } + /// + /// 创办时间 + /// + public string BuildDate { get; set; } + + public string features { get; set; } + + /// + /// 地址 + /// + public string Address { get; set; } + + /// + /// 电话 + /// + public string Phone { get; set; } + + + /// + /// 院校图片json + /// + public string Imglist { get; set; } + + + public string VrUrl { get; set; } + + +} + +public class OldPageModel +{ + /// + /// 当前页标 + /// + public int page { get; set; } = 1; + /// + /// 总页数 + /// + public int pageCount { get; set; } = 6; + /// + /// 数据总数 + /// + public int dataCount { get; set; } = 0; + /// + /// 每页大小 + /// + public int PageSize { set; get; } + /// + /// 返回数据 + /// + public List data { get; set; } + +} +public class UniversityRank +{ + public ObjectId _id { get; set; }//id + + public string logo { get; set; } + public string cityName { get; set; } + public string uType { get; set; } + /// + /// 院校名称 + /// + + public string UniversityName { get; set; } + /// + /// 类型(0,校友会 1,武书连 2,软科 3,QS 4,U.S.News) + /// + + public string UniversityType { get; set; } + + /// + /// 年份 + /// + + public string Year { get; set; } + + /// + /// 排名 + /// + + public int Rank { get; set; } + + /// + /// 分数(没有就是--) + /// + public string Score { get; set; } + + + + +} diff --git a/Admin.NET/Admin.NET.Core/Service/ZYBase/ZhiYuanBaseService.cs b/Admin.NET/Admin.NET.Core/Service/ZYBase/ZhiYuanBaseService.cs new file mode 100644 index 0000000..5989dbd --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYBase/ZhiYuanBaseService.cs @@ -0,0 +1,1429 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using DocumentFormat.OpenXml.Office2010.ExcelAc; +using DocumentFormat.OpenXml.Vml.Office; +using DocumentFormat.OpenXml.Wordprocessing; +using Elastic.Clients.Elasticsearch; +using Flurl; +using Flurl.Http; +using Flurl.Util; +using iText.Layout.Element; +using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.Caching.Distributed; +using Microsoft.Extensions.Caching.Memory; +using MongoDB.Bson; +using MongoDB.Driver; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using OfficeOpenXml.FormulaParsing.Excel.Functions.Math; +using Org.BouncyCastle.Asn1.Bsi; +using Org.BouncyCastle.Asn1.Ocsp; +using RazorEngine.Compilation.ImpromptuInterface.InvokeExt; +using SqlSugar.Extensions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Encodings.Web; +using System.Text.Json; +using System.Text.Json.Serialization; +using System.Threading.Tasks; +using static SKIT.FlurlHttpClient.Wechat.Api.Models.CgibinGetCurrentAutoReplyInfoResponse.Types.KeywordAutoReplyRule.Types; + +namespace Admin.NET.Core.Service; + + +/// +/// 志愿填报开放基础服务 +/// +[AllowAnonymous] +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 900)] +[Route("api/zhiYuan")] +public class ZhiYuanBaseService : IDynamicApiController, ITransient +{ + private const string _cachekey = "base_"; + private readonly IDistributedCache _distributed; + private readonly SqlSugarRepository _sysDictDataRep; + private readonly SqlSugarRepository _uncollectionrep; + + private readonly IMongoDBRepository _mongoRepository; + private readonly IHttpContextAccessor _httpContextAccessor; + private readonly SqlSugarRepository _proviceRep; + private readonly UserManager _userManager; + public ZhiYuanBaseService(IDistributedCache distributedCache, SqlSugarRepository sysDictDataRep, IMongoDBRepository mongoDBRepository, + IHttpContextAccessor httpContextAccessor, SqlSugarRepository uncollectionrep, UserManager userManager, SqlSugarRepository proviceRep) + { + _distributed = distributedCache; + _sysDictDataRep = sysDictDataRep; + _mongoRepository = mongoDBRepository; + _httpContextAccessor = httpContextAccessor; + _uncollectionrep = uncollectionrep; + _userManager = userManager; + _proviceRep = proviceRep; + } + + /// + /// 获取省份信息 + /// + /// + [HttpGet] + public async Task Province() + { + var key = _cachekey + "province"; + var result = await _distributed.GetAsync(key); + if (result == null) + { + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + var _option = new DistributedCacheEntryOptions() + .SetSlidingExpiration(TimeSpan.FromHours(4)); + //var dyresult = await string.Format("{0}api/SysRegion/GetRegionList?code=0", baseurl).SetJsonSerialization().GetAsAsync>(); + var dyresult = await string.Format("{0}api/SysRegion/GetRegionList?code=0", baseurl).GetJsonAsync>>(); + // string str = dyresult.ToString(); + var jsons = JsonConvert.SerializeObject(dyresult.response); + byte[] byresult = Encoding.UTF8.GetBytes(jsons); + await _distributed.SetAsync(key, byresult, _option); + result = byresult; + } + return JsonConvert.DeserializeObject(Encoding.UTF8.GetString(result).ToLowerInvariant()); + + } + + + /// + /// 各省份年份对应政策规则(已弃用) + /// + /// + [HttpGet] + public async Task VolunteerInitialization() + { + var key = _cachekey + "volunteerInit"; + var result = await _distributed.GetAsync(key); + if (result == null) + { + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + var _option = new DistributedCacheEntryOptions() + .SetSlidingExpiration(TimeSpan.FromHours(4)); + //var dyresult = await string.Format("{0}api/SeVolunteerInitialization/Get", baseurl).SetJsonSerialization().GetAsAsync>(); + var dyresult = await string.Format("{0}api/SeVolunteerInitialization/Get", baseurl).GetJsonAsync>>(); + // string str = dyresult.ToString(); + var jsons = JsonConvert.SerializeObject(dyresult.response); + byte[] byresult = Encoding.UTF8.GetBytes(jsons); + await _distributed.SetAsync(key, byresult, _option); + result = byresult; + } + return JsonConvert.DeserializeObject(Encoding.UTF8.GetString(result).ToLowerInvariant()); + } + + + + + /// + /// 院校甄别 //野鸡大学 + /// + /// + /// + [HttpGet] + public async Task FackUniversitys([FromQuery] FackUniversityRequestDto dto) + { + // 检查是否至少有一个查询条件 + if (string.IsNullOrWhiteSpace(dto.keyword) && string.IsNullOrWhiteSpace(dto.provinceName)) + { + throw Oops.Oh("至少需要提供一个查询条件(关键字或省份名称)"); + } + // 获取数据库客户端 + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + // 获取集合 + var bejson = dbclient.GetCollection("d_fackuniversity"); + // 动态条件列表 + var filterBuilders = new List>(); + // 如果 keyword 不为空,添加大学名称的正则查询条件 + if (!string.IsNullOrWhiteSpace(dto.keyword)) + { + filterBuilders.Add(Builders.Filter.Regex(p => p.universityName, new BsonRegularExpression($"/{dto.keyword}/"))); + } + + if (!string.IsNullOrWhiteSpace(dto.provinceName)) + { + filterBuilders.Add(Builders.Filter.Regex(p => p.locationName, new BsonRegularExpression($"/{dto.provinceName.Replace("省", "").Replace("市", "")}/"))); + } + // 构建最终的过滤器 + FilterDefinition filter = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) + : new BsonDocument(); // 如果没有条件,则使用空过滤器 + + // 执行查询并将结果转换为列表 + var list = await bejson.Find(filter).ToListAsync(); + list.ForEach(a => + { + a.locationName = a.locationName.Replace("省", "").Replace("市", ""); + }); + return list; + } + + + /// + /// 获取院校类型 + /// + /// 539074685816901 + /// + [HttpGet] + //[UnifyResult(typeof(CustomPropertyResult<>))] + public async Task UniversityType([Required] long typeId = 539074685816901) + { + var key = _cachekey + "untype_" + typeId; + var result = await _distributed.GetAsync(key); + if (result == null) + { + var _option = new DistributedCacheEntryOptions() + .SetSlidingExpiration(TimeSpan.FromHours(4)); + var dyresult = await _sysDictDataRep.AsQueryable() + .Where(u => u.DictTypeId == typeId) + .OrderBy(u => new { u.Code }).Select(c => new + DicBaseDto + { id = c.Code, name = c.Value }) + .ToListAsync(); + byte[] byresult = Encoding.UTF8.GetBytes(dyresult.ToJson()); + await _distributed.SetAsync(key, byresult, _option); + result = byresult; + } + return JsonConvert.DeserializeObject(Encoding.UTF8.GetString(result)); + } + + /// + /// 办学性质 + /// + /// 539083286085701 + /// + [HttpGet] + //[UnifyResult(typeof(CustomPropertyResult<>))] + public async Task Nature([Required] long typeId = 539083286085701) + { + var key = _cachekey + "nature_" + typeId; + var result = await _distributed.GetAsync(key); + if (result == null) + { + var _option = new DistributedCacheEntryOptions() + .SetSlidingExpiration(TimeSpan.FromHours(4)); + var dyresult = await _sysDictDataRep.AsQueryable() + .Where(u => u.DictTypeId == typeId) + .OrderBy(u => new { u.Code }).Select(c => new + DicBaseDto + { id = c.Code, name = c.Value }) + .ToListAsync(); + byte[] byresult = Encoding.UTF8.GetBytes(dyresult.ToJson()); + await _distributed.SetAsync(key, byresult, _option); + result = byresult; + } + return JsonConvert.DeserializeObject(Encoding.UTF8.GetString(result)); + } + + + + + /// + /// 院校排行 + /// + /// + /// + [HttpGet] + public async Task> UniversityRank([FromQuery] UniversityRankRequest request) + { + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var bejson = dbclient.GetCollection("universityrank"); + + if (!request.Type.HasValue) + { + throw Oops.Oh("院校类型不能为空"); + } + + if (!request.Year.HasValue) + { + throw Oops.Oh("年份不能为空"); + } + + // 动态条件列表 + var filterBuilders = new List>(); + if (request.Year.HasValue) + { + filterBuilders.Add(Builders.Filter.Eq(p => p.Year, request.Year.Value.ToString())); + } + if (request.Type.HasValue) + { + filterBuilders.Add(Builders.Filter.Eq(p => p.UniversityType, request.Type.Value.ToString())); + } + if (!string.IsNullOrWhiteSpace(request.Name)) + { + filterBuilders.Add(Builders.Filter.Regex(p => p.UniversityName, new BsonRegularExpression($"/{request.Name}/"))); + } + // 使用And组合所有过滤条件 + FilterDefinition filter = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) + : new BsonDocument(); // 如果没有条件,则使用空过滤器 + //var list = await bejson.Find(filter).ToListAsync(); + + var sort = Builders.Sort.Ascending(x => x._id); // 替换YourField为实际的排序字段 + // 创建分页对象并获取分页数据 + var pagination = new MongoPagination(bejson, filter, sort, request.PageSize, request.PageIndex); + var (items, totalCount, totalPages) = await pagination.GetPagedDataAsync(); + + var universitylistbejson = dbclient.GetCollection("university"); + var universitylist = await universitylistbejson.Find(new BsonDocument()).ToListAsync(); + + items.ForEach(a => + { + + a.cityName = universitylist.Where(e => e.name == a.UniversityName).Any() ? universitylist.Where(e => e.name == a.UniversityName)?.FirstOrDefault().cityName.Replace("市", "") : ""; + a.logo = universitylist.Where(e => e.name == a.UniversityName).Any() ? universitylist.Where(e => e.name == a.UniversityName)?.FirstOrDefault().logo : "https://static-data.ycymedu.com/daxuelogo.jpg"; + a.uType = universitylist.Where(e => e.name == a.UniversityName).Any() ? universitylist.Where(e => e.name == a.UniversityName)?.FirstOrDefault().utype.FirstOrDefault() : ""; + }); + return new PageBaseResult() + { + PageNo = request.PageIndex, + PageSize = request.PageSize, + TotalPage = totalPages, + TotalRows = totalCount, + Rows = items, + }; + + } + + + //批次线(各省份) + //位次(各省份) + //一分一段(各省份) + + + + //专业大类 + //专业小类 + //专业名称 + + /// + /// 专业大类和专业二级分类 + /// + /// + /// + [HttpGet] + public async Task BaseMajor([FromQuery] int level) + { + var key = _cachekey + "basemajor_" + level; + var result = await _distributed.GetAsync(key); + if (result == null) + { + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + var _option = new DistributedCacheEntryOptions() + .SetSlidingExpiration(TimeSpan.FromDays(1)); + /* var dyresult = await string.Format("{0}api/front/Library/uniGetMajorInfo?SchoolLevel={1}", baseurl, level).SetJsonSerialization().GetAsAsync>();*/ + var dyresult = await string.Format("{0}api/front/Library/uniGetMajorInfo?SchoolLevel={1}", baseurl, level).GetJsonAsync>>(); + // string str = dyresult.ToString(); + var jsons = JsonConvert.SerializeObject(dyresult.response); + byte[] byresult = Encoding.UTF8.GetBytes(jsons); + await _distributed.SetAsync(key, byresult, _option); + result = byresult; + } + return JsonConvert.DeserializeObject(Encoding.UTF8.GetString(result).ToLowerInvariant()); + } + + + /// + /// 一分一段 + /// + /// + /// + [HttpGet] + public async Task ScoreLine([FromQuery] ScoreLineRequest request) + { + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + var headers = _httpContextAccessor.HttpContext.Request.Headers; + var token = headers["Authorization"].ToString(); + //var dyresult = await string.Format("{0}api/front/Library/GetScoreLine", baseurl) + // .SetHeaders(new Dictionary { { "Authorization", string.Format("Bearer {0}", token) } }) + // .SetQueries(request) + // .SetJsonSerialization(new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() }).GetAsAsync>(); + var dyresult = await string.Format("{0}api/front/Library/GetScoreLine", baseurl).WithOAuthBearerToken(token).SetQueryParams(request).GetStringAsync(); + var result = JsonConvert.DeserializeObject>>(dyresult); + + return result.response; + } + + + + + /// + /// 院校列表 + /// + /// + /// + [HttpPost] + public async Task> University([FromBody] UniversityRequest request) + { + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var bejson = dbclient.GetCollection("university"); + // 动态条件列表 + var filterBuilders = new List>(); + + if (!string.IsNullOrWhiteSpace(request.name)) + { + filterBuilders.Add(Builders.Filter.Regex(p => p.name, new BsonRegularExpression($"/{request.name}/"))); + } + + if (request.level.HasValue) + { + filterBuilders.Add(Builders.Filter.Eq("level", request.level.Value)); + } + + if (request.provinceName != null && request.provinceName.Count() > 0)//省份 + { + filterBuilders.Add(Builders.Filter.In(p => p.provinceName, request.provinceName)); + } + if (request.nature != null && request.nature.Count() > 0)//包含--公办 民办 + { + filterBuilders.Add(Builders.Filter.In(p => p.nature, request.nature)); + } + if (request.utype != null && request.utype.Count() > 0)//包含--院校类型 综合 理工 + { + filterBuilders.Add(Builders.Filter.AnyIn(p => p.utype, request.utype)); + } + //// 构建查询条件:SubItems数组中的某个元素的Description字段包含subItemDescriptionSubstring + //var subItemFilter = filterBuilder.ElemMatch(x => x.SubItems, filterBuilder.Regex(y => y.Description, new BsonRegularExpression($".*{subItemDescriptionSubstring}.*", "i"))); + if (request.feature != null && request.feature.Count() > 0) //985、211 + { + filterBuilders.Add(Builders.Filter.AnyIn(p => p.features, request.feature)); + } + + + + // 使用And组合所有过滤条件 + FilterDefinition filter = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) + : new BsonDocument(); // 如果没有条件,则使用空过滤器 + // 你可以根据需要添加排序字段 + var sort = Builders.Sort.Ascending(x => x._id); // 替换YourField为实际的排序字段 + // 创建分页对象并获取分页数据 + var pagination = new MongoPagination(bejson, filter, sort, request.PageSize, request.PageIndex); + var (items, totalCount, totalPages) = await pagination.GetPagedDataAsync(); + #region 更新院校数据 + //var university_w = dbclient.GetCollection("university_ww"); + //var enmtyfilter = Builders.Filter.Empty; // 创建一个空筛选器,获取所有文档 + //var listrectiy = await university_w.Find(enmtyfilter).ToListAsync(); + //items.ForEach(async a => + //{ + // var update = Builders.Update; + // var updates = new List>(); + // var newmodel = listrectiy.Where(e => e.name == a.name).FirstOrDefault(); + // if (newmodel != null) + // { + // if (a.rank <= 0) + // { + // a.rank = newmodel.rank; + // updates.Add(update.Set("rank", newmodel.rank)); + // } + //if (string.IsNullOrWhiteSpace(a.address)) + //{ + // a.address = newmodel.address; + + // updates.Add(update.Set("address", newmodel.address)); + //} + //if (string.IsNullOrWhiteSpace(a.builddate)) + //{ + // a.builddate = newmodel.builddate; + // updates.Add(update.Set("builddate", newmodel.builddate)); + //} + //if (string.IsNullOrWhiteSpace(a.cityName)) + //{ + // a.cityName = newmodel.cityName; + // updates.Add(update.Set("cityName", newmodel.cityName)); + //} + //if (string.IsNullOrWhiteSpace(a.phone)) + //{ + // a.phone = newmodel.phone; + // updates.Add(update.Set("phone", newmodel.phone)); + //} + //if (a.utype == null || a.utype.Count() <= 0) + //{ + // a.utype = JsonConvert.DeserializeObject>(newmodel.utype); + // updates.Add(update.Set("utype", a.utype)); + //} + //if (string.IsNullOrWhiteSpace(a.weburl)) + //{ + // a.weburl = newmodel.weburl; + // updates.Add(update.Set("weburl", newmodel.weburl)); + //} + + // var filter = Builders.Filter.Eq("_id", a._id); // 使用文档的ID + + // if (updates.Count() > 0) + // { + // var result = await bejson.UpdateOneAsync(filter, update.Combine(updates)); + // } + // } + //}); + #endregion + return new PageBaseResult() + { + PageNo = request.PageIndex, + PageSize = request.PageSize, + TotalPage = totalPages, + TotalRows = totalCount, + Rows = items, + }; + + } + + + + + + + /// + /// 院校对比 + /// + /// + /// + [HttpPost] + public async Task> ComparUk([FromBody] CompiarUnkRequestDto dto) + { + string years = dto.years ?? "2024"; + + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var bejson = dbclient.GetCollection("university"); + // 动态条件列表 + var filterBuilders = new List>(); + + if (dto.ids == null && dto.ids.Count() <= 0)//省份 + { + throw Oops.Oh("请传入院校Id"); + } + filterBuilders.Add(Builders.Filter.In(p => p._id, dto.ids)); + + FilterDefinition filter = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) + : new BsonDocument(); // 如果没有条件,则使用空过滤器 + var list = await bejson.Find(filter).ToListAsync(); + var planjson = dbclient.GetCollection(string.Format("zsplanpro_{0}_{1}", dto.locationCode, years)); + // 动态条件列表 + var pBuilders = new List>(); + pBuilders.Add(Builders.Filter.In(p => p._uid.Value, dto.ids)); + FilterDefinition ffilter = filterBuilders.Count > 0 + ? Builders.Filter.And(pBuilders) + : new BsonDocument(); // 如果没有条件,则使用空过滤器 + var planlist = await planjson.Find(ffilter).ToListAsync(); + + var result = new List(); + list.ForEach(a => + { + + result.Add(new University_wDto() + { + address = a.address, + belong = a.belong, + builddate = a.builddate, + cityName = a.cityName, + collegeCode = a.collegeCode, + level = a.level.Value, + logo = a.logo, + MajorCount = planlist.Where(e => e._uid == a._id).Select(c => c.major).Count(), + planCount = planlist.Where(e => e._uid == a._id).Select(c => c.plancount.Value).Sum(), + _id = a._id, + name = a.name, + nature = a.nature, + phone = a.phone, + provinceName = a.provinceName, + utype = string.Join('/', a.utype), + weburl = a.weburl + }); + }); + return result; + } + + + /// + ///学校招生计划新版本V2 + /// + /// + /// + [ApiDescriptionSettings(Name = "PlanListPro/V2"), HttpGet] + public async Task PlanListProV2([FromQuery] PlanProV2RequestDto dto) + { + var result = new PlanProV2ResponseDto(); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + + DateTime dt = DateTime.Now; + DateTime fixedDate = new DateTime(dt.Year, 7, 20); // 创建当前年份的7月20日 + int year = dt > fixedDate ? dt.Year : dt.Year - 1; // 比较当前日期与固定日期 + var planjson = dbclient.GetCollection(string.Format("zsplanpro_{0}_{1}", dto.locationCode, year)); + + var filter = Builders.Filter.Eq(e => e._uid, dto.uid); + var query = await planjson.Find(filter).ToListAsync(); + if (query == null) + { + throw Oops.Oh("暂无数据"); + } + result.year = year.ToString(); + result.items = query; + return result; + } + + + + /// + /// 院校列表 + /// + /// + [HttpGet] + public async Task SaveUniversity([FromQuery] UniversityRequest request) + { + + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + var headers = _httpContextAccessor.HttpContext.Request.Headers; + var token = headers["Authorization"].ToString(); + //var dyresult = await "https://api.static.ycymedu.com/universityinfo.json" + // .SetJsonSerialization().GetAsAsync>>(); + var dyresult = await "https://api.static.ycymedu.com/universityinfo.json".GetJsonAsync>>(); + var jsons = dyresult.response; + + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var collection = dbclient.GetCollection("university_ww"); + var list = new List(); + //待添加的document + jsons.ForEach(c => + { + if (c.Web == null) + { + c.Web = ""; + } + if (c.Description == null) + { + c.Description = ""; + } + if (c.Address == null) + { + c.Address = ""; + } + if (c.AreaName == null) + { + c.AreaName = ""; + } + if (c.AscriptionName == null) + { + c.AscriptionName = ""; + } + if (c.Belong == null) + { + c.Belong = ""; + } + if (c.BuildDate == null) + { + c.BuildDate = ""; + } + if (c.CityName == null) + { + c.CityName = ""; + } + if (c.collegeCode == null) + { + c.collegeCode = ""; + } + + if (c.Logo == null) + { + c.Logo = ""; + } + if (c.Nature == null) + { + c.Nature = ""; + } + if (c.Phone == null) + { + c.Phone = ""; + } + if (c.SubjectLevel == null) + { + c.SubjectLevel = -1; + } + if (c.VrUrl == null) + { + c.VrUrl = ""; + } + + var featurearray = new BsonArray() { }; + if (c.features != null) + { + var feature = c.features.Split("/", StringSplitOptions.RemoveEmptyEntries).ToList(); + feature.ForEach(a => + { + if (a == "双一流大学") + { + a = "双一流"; + } + if (a == "保研资格") + { + a = "保研"; + } + featurearray.Add(a); + }); + } + var utype = new BsonArray() { }; + if (c.UniversityType != null) + { + + utype.AddRange(c.UniversityType); + } + var imglist = new BsonArray() { }; + if (c.Imglist != null) + { + var jbeson = JsonConvert.DeserializeObject>(c.Imglist); + imglist.AddRange(jbeson); + } + + list.Add(new BsonDocument{ + { "_id",c.Id }, + { "name", c.Name }, + { "provinceName", c.AreaName }, + { "cityName",c.CityName}, + { "resourcecount", new BsonDocument + { + { "academician", c.AcademicianCount }, + { "doctorate",c.DoctorateCount }, + { "master",c.MasterCount }, + } + }, { "rank", c.Rank }, + { "weburl", c.Web }, + { "logo", c.Logo }, + { "collegeCode", c.collegeCode }, + { "address", c.Address }, + { "imglist", imglist }, + { "vrurl", string.IsNullOrEmpty(c.VrUrl)?"":c.VrUrl }, + { "phone", c.Phone }, + { "features",featurearray}, + { "belong", string.IsNullOrEmpty(c.AscriptionName)?"":c.AscriptionName }, + { "level",c.SubjectLevel },//0是本科,1 是专科 + { "builddate",c.BuildDate }, + { "utype", utype }, + {"nature",c.Nature} + + }); + }); + + collection.InsertMany(list); + + return true; + } + + + + + /// + /// 院校详情 + /// + /// + /// + [HttpGet] + public async Task UniversityDetail([FromQuery] UniversityDetailRequest request) + { + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + var url = string.Format("{0}api/front/Library/GetUniversityDetails", baseurl); + //var result = await url + // .SetQueries(new OldUniversityRequest() + // { + // CustomerId = request.CId, + // Id = (int)request.Id + // }) + // .SetJsonSerialization(new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() }) + // .GetAsAsync>(); + var dyresult = await url.SetQueryParams(new OldUniversityRequest() + { + CustomerId = request.CId, + Id = (int)request.Id + }).GetStringAsync(); + var result = JsonConvert.DeserializeObject>(dyresult); + var response = new UniversityDetailResponse(); + if (result != null && result.success && result.response != null) + { + var rpm = result.response.universityResult; + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var collection = dbclient.GetCollection("university"); + + var filter = Builders.Filter.Eq("_id", rpm.id); + // 获取单条数据 + var document = collection.Find(filter).FirstOrDefault(); + + if (_userManager.UserId > 0) + { + var collect = await _uncollectionrep.AsQueryable().Where(e => e.WxId == _userManager.UserId && e.Id == request.Id).ToListAsync(); + if (collect.Any() && collect.Count() > 0) + { + document.isCollect = true; + } + } + + document.detail = rpm.description; + response.universityResult = document; + response.graduateModels = result.response.graduateModels; + response.relatedMajors = result.response.relatedMajors; + } + + return response; + } + + + + + /// + /// 融合院校专业模糊查询 + /// + /// + /// + [HttpGet] + public async Task CombineList([FromQuery] CombineRequestDto dto) + { + var majorlist = new List(); + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + var url = string.Format("{0}api/front/Library/SeachMajor?Name={1}", baseurl, dto.KeyWord); + //var MajorResult = await url + // .SetJsonSerialization(new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() }) + // .GetAsAsync>>(); + var MajorResult = await url.GetJsonAsync>>(); + if (MajorResult.success) + { + majorlist = MajorResult.response; + } + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var bejson = dbclient.GetCollection("university"); + // 动态条件列表 + var filterBuilders = new List>(); + + filterBuilders.Add(Builders.Filter.Regex(p => p.name, new BsonRegularExpression($"/{dto.KeyWord}/"))); + FilterDefinition filter = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) + : new BsonDocument(); // 如果没有条件,则使用空过滤器 + var list = await bejson.Find(filter).ToListAsync(); + return new CombinResponseDto() + { + universitys = list.Select(c => new CombinUniversityDto() + { + cityName = c.cityName, + collegeCode = c.collegeCode, + logo = c.logo, + name = c.name, + provinceName = c.provinceName, + _id = c._id, + utype = c.utype + }).ToList(), + majors = majorlist + }; + } + + + + + /// + /// 根据省份和年份查询批次结果 + /// + /// + /// + [ApiDescriptionSettings(Name = "BatchList"), HttpGet] + [AllowAnonymous] + public async Task BatchList([FromQuery] BatchResultRequestDto dto) + { + if (string.IsNullOrWhiteSpace(dto.locationCode)) + { + throw Oops.Oh("必填信息为空"); + } + var years = new int[] { 2024, 2023, 2022, 2021 }.ToList(); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + + if (!string.IsNullOrWhiteSpace(dto.year)) + { + var bejson = dbclient.GetCollection($"batchlist_{dto.locationCode}_{dto.year}"); + var result = await bejson.Find(new BsonDocument()).ToListAsync(); + var list = result.FirstOrDefault(); + if (!result.Any() || !list.configList.subjectList.Any() || !list.list.Any()) + { + return "暂无数据"; + } + var yearlist = new List(); + yearlist.Add(new gYearlist() { check = string.IsNullOrWhiteSpace(dto.year) ? true : false, year = "不限" }); + yearlist.AddRange(years.Select(s => new gYearlist() + { + check = dto.year == s.ToString() ? true : false, + year = s.ToString() + }).ToList()); + list.configList.yearList = yearlist; + list.configList.subjectList.ForEach(a => { a.check = a.subject_id == dto.type ? true : false; }); + list.configList.subjectList.Insert(0, new gSubjectlist() { check = dto.type.HasValue ? false : true, subject_name = "不限" }); + + list.list = list.list.WhereIF(dto.type.HasValue, i => i.subject_id == dto.type).ToList(); + return list; + } + else + { + + var batchlist = new List(); + years.ForEach(a => + { + var bejson = dbclient.GetCollection($"batchlist_{dto.locationCode}_{a.ToString()}"); + var result = bejson.Find(new BsonDocument()).ToList(); + if (result.Any()) + { + batchlist.Add(result.FirstOrDefault()); + } + }); + var resultlist = batchlist.FirstOrDefault(); + var yearlist = new List(); + yearlist.Add(new gYearlist() { check = string.IsNullOrWhiteSpace(dto.year) ? true : false, year = "不限" }); + yearlist.AddRange(years.Select(s => new gYearlist() + { + check = false, + year = s.ToString() + }).ToList()); + resultlist.configList.yearList = yearlist; + resultlist.configList.subjectList.Insert(0, new gSubjectlist() { check = dto.type.HasValue ? false : true, subject_name = "不限" }); + resultlist.configList.subjectList.ForEach(a => { a.check = a.subject_id == dto.type ? true : false; }); + resultlist.list = batchlist.SelectMany(s => s.list).WhereIF(dto.type.HasValue, i => i.subject_id == dto.type).ToList(); + return resultlist; + } + } + + + [ApiDescriptionSettings(Name = "SyncBatchGaokao"), HttpPost] + public async Task SyncBatchGaokao() + { + + // string baseUrl = "http://api.xuexingaokao.com/api/tool/batch/index?pro="; + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + + var provinceinfo = await _proviceRep.AsQueryable().Where(e => e.IsDelete == false).ToListAsync(); + var years = new string[] { "2024", "2023", "2022", "2021" }.ToList(); + + //provinceinfo.ForEach(a => + //{ + // years.ForEach(y => + // { + + // //var goresult = $"{baseUrl}{a.Code}&year={y}&subject=&batch=×tamp={DateTimeOffset.Now.ToUnixTimeSeconds()}".SetJsonSerialization().GetAsAsync().Result; + // //if (goresult.code == 1 && goresult.data.list.Any()) + // //{ + // // var newbatchlist = goresult.data.list.Select(s => new gGbatchlist + // // { + // // batch_id = s.batch_id, + // // batch_name = s.batch_name, + // // }).ToList(); + // // var subjectList = goresult.data.configList.subjectList.Select(s => new gSubjectlist + // // { + // // subject_id = CalcuScoreFinder.ChangeSubjectName(s.subject_name), + // // subject_name = s.subject_name, + // // check = s.selected, + // // }).ToList(); + // // var gbatchList = goresult.data.list.Select(s => new gbatchList() + // // { + // // batch_name = s.batch_name, + // // batch_id = s.batch_id, + // // province_name = s.province_name, + // // year = s.year, + // // subject_id = CalcuScoreFinder.ChangeSubjectName(s.subject_name), + // // subject_name = s.subject_name, + // // province_code = s.province_code, + // // score = s.score + // // }).ToList(); + + // // var models = new BatchResultDto() { configList = new gConfiglist() { batchList = newbatchlist, subjectList = subjectList }, list = gbatchList, id = 1 }; + // // var bejson = dbclient.GetCollection($"batchlist_{a.Code}_{y}"); + // // bejson.InsertOne(models); + // } + + // }); + //}); + } + + + + /// + /// 专业数据结构(三层) + /// + /// + /// + [ApiDescriptionSettings(Name = "Majors"), HttpGet] + [AllowAnonymous] + public async Task Majors([FromQuery] MajorRootRequestInput input) + { + + if (string.IsNullOrWhiteSpace(input.Type)) + { + return new { code = 0, msg = "Type为必传字段" }; + } + var filterBuilders = new List>(); + filterBuilders.Add(Builders.Filter.Eq(p => p.type, input.Type)); + FilterDefinition filters = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) + : new BsonDocument(); // 如果没有条件,则使用空过滤器 + var result = new List(); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var majortroot = dbclient.GetCollection("zmajorroots"); + var rootlist = await majortroot.Find(filters).ToListAsync(); + + + // 初始化查询条件 + FilterDefinition filter = Builders.Filter.Empty; + // 用于存储多个条件的列表 + var filter2 = new List>(); + + // 如果传入了 nameQuery,则添加 name 模糊查询条件 + if (!string.IsNullOrEmpty(input.KeyWord)) + { + var nameFilter = Builders.Filter.ElemMatch(x => x.majorMsgs, + Builders.Filter.Regex(y => y.name, new MongoDB.Bson.BsonRegularExpression(input.KeyWord, "i"))); + filter2.Add(nameFilter); + } + + // 如果传入了 zymcQuery,则添加 zymc 模糊查询条件 + if (!string.IsNullOrEmpty(input.KeyWord)) + { + var zymcFilter = Builders.Filter.ElemMatch(x => x.majorMsgs, + Builders.Filter.ElemMatch(y => y.childMajors, + Builders.Filter.Regex(z => z.zymc, new MongoDB.Bson.BsonRegularExpression(input.KeyWord, "i")))); + filter2.Add(zymcFilter); + } + + // 如果有条件,则用 OR 组合,否则使用空过滤器 + if (filter2.Count > 0) + { + filter = Builders.Filter.Or(filter2); + } + + // 查询数据 + var majorChild = dbclient.GetCollection("zmajorchild"); + var childlist = await majorChild.Find(filter).ToListAsync(); + + result = rootlist.Select(s => new MajorRootResponseDto() + { + type = s.type, + RootDtos = s.majorMsgs + .Select(a => new GKMajorRootDto() + { + key = a.key, + name = a.name, + Count = childlist + .Where(e => e.type == a.key) + .SelectMany(c => c.majorMsgs) + .Where(e => e.childMajors != null && e.childMajors.WhereIF(!string.IsNullOrWhiteSpace(input.KeyWord), f => f.zymc.Contains(input.KeyWord)).Any()) // 过滤掉 childMajors 为空的项 + .Select(e => new GaokaoMajorMsgItems() + { + key = e.key, + name = e.name, + childMajors = e.childMajors + }).Count(), + ItemsCount = childlist + .Where(e => e.type == a.key) + .SelectMany(c => c.majorMsgs) + .Where(e => e.childMajors != null && e.childMajors.WhereIF(!string.IsNullOrWhiteSpace(input.KeyWord), f => f.zymc.Contains(input.KeyWord)).Any()) // 过滤掉 childMajors 为空的项 + .Select(e => new GaokaoMajorMsgItems() + { + key = e.key, + name = e.name, + childMajors = e.childMajors + }).SelectMany(l => l.childMajors).Count(), + items = childlist + .Where(e => e.type == a.key) + .SelectMany(c => c.majorMsgs) + .Where(e => e.childMajors != null && e.childMajors.WhereIF(!string.IsNullOrWhiteSpace(input.KeyWord), f => f.zymc.Contains(input.KeyWord)).Any()) // 过滤掉 childMajors 为空的项 + .Select(e => new GaokaoMajorMsgItems() + { + key = e.key, + name = e.name, + childMajors = e.childMajors + }) + .ToList() + }) + .Where(dto => dto.items.Any()) // + .ToList() + }).ToList(); + // 统计总数 + return result; + } + + + + + /// + /// 专业详情 + /// + /// + /// + [ApiDescriptionSettings(Name = "MajorDetail"), HttpGet] + [AllowAnonymous] + public async Task MajorDetail([FromQuery] MajorDetailRequestInput input) + { + if (string.IsNullOrWhiteSpace(input.SpecId)) + { + return "专业id不能为空"; + } + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var majordetail = dbclient.GetCollection("zmajordetailmsg"); + // 构造查询条件 + var filter = Builders.Filter.Eq(e => e.specId, input.SpecId); + // 查询单条记录 + var result = await majordetail.Find(filter).FirstOrDefaultAsync(); + if (result == null) + { + return "专业数据为空!!!"; + } + + return result; + } + + + /// + /// 专业详情-按UI来的数据源 + /// + /// + /// + [ApiDescriptionSettings(Name = "MajorBase"), HttpGet] + [AllowAnonymous] + public async Task MajorBase([FromQuery] MajorCarrerInput input) + { + if (string.IsNullOrWhiteSpace(input.zydm)) + { + return "专业id不能为空"; + } + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var majordetail = dbclient.GetCollection("zbase_majors"); + // 构造查询条件,忽略 subject_code_three 的后缀 T 或 K + var escapedZydm = Regex.Escape(input.zydm); // 确保输入安全 + var filter = Builders.Filter.Regex( + e => e.subject_code_three, + new BsonRegularExpression($"^{escapedZydm}[TK]?$")); + + // 查询单条记录 + var result = await majordetail.Find(filter).FirstOrDefaultAsync(); + if (result == null) + { + return new base_Subject() + { + + subject_name_two = "专业数据为空!!!" + }; + } + + return result; + } + + + + /// + /// 专业关联课程 + /// + /// + /// + [ApiDescriptionSettings(Name = "ZkskcMajor"), HttpGet] + [AllowAnonymous] + public async Task ZkskcMajor([FromQuery] MajorDetailRequestInput input) + { + if (string.IsNullOrWhiteSpace(input.SpecId)) + { + return "专业id不能为空"; + } + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var majordetail = dbclient.GetCollection("zkskcmajormap"); + // 构造查询条件 + var filter = Builders.Filter.Eq(e => e.specId, input.SpecId); + // 查询单条记录 + var result = await majordetail.Find(filter).FirstOrDefaultAsync(); + if (result == null) + { + return "专业数据为空!!!"; + } + + return result; + } + + + + /// + /// 专业关联院校 + /// + /// + /// + [ApiDescriptionSettings(Name = "ZksyxMajor"), HttpGet] + [AllowAnonymous] + public async Task ZksyxMajor([FromQuery] MajorDetailRequestInput input) + { + if (string.IsNullOrWhiteSpace(input.SpecId)) + { + return "专业id不能为空"; + } + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var majordetail = dbclient.GetCollection("zksyxmajormap"); + // 构造查询条件 + var filter = Builders.Filter.Eq(e => e.specId, input.SpecId); + // 查询单条记录 + var result = await majordetail.Find(filter).FirstOrDefaultAsync(); + if (result == null) + { + return "专业数据为空!!!"; + } + var unviersity = dbclient.GetCollection("university"); + // 先确保 result.schSpecList 不为空 + var specNames = result.schSpecList?.Select(x => x.yxmc).ToList(); + if (specNames == null || specNames.Count == 0) + { + return "未找到对应院校信息"; + } + // 构造查询条件,匹配 UniversityDto.name 在 specNames 之中 + var universityFilter = Builders.Filter.In(u => u.name, specNames); + // 查询匹配的大学信息 + var uresult = await unviersity.Find(universityFilter).ToListAsync(); + result.schSpecList.ForEach(a => + { + + if (uresult.Any(e => e.name == a.yxmc)) + { + string featuretag = string.Empty; + if (uresult.First(e => e.name == a.yxmc).features.Any()) + { + featuretag = string.Join("/", uresult.First(e => e.name == a.yxmc).features); + } + a.logo = uresult.First(e => e.name == a.yxmc).logo; + a.ulevel = uresult.First(e => e.name == a.yxmc).level == 0 ? "本科" : "专科"; + a.cityname = uresult.First(e => e.name == a.yxmc).cityName; + a.featuretag = featuretag; + } + }); + result.ssdmList = result.ssdmList.Where(w => !string.IsNullOrWhiteSpace(w.code)).ToList(); + return result; + } + + + /// + /// 专业相关就业前景 + /// + /// 注意这个传入专业代码就是 Key 不是spid + /// + [ApiDescriptionSettings(Name = "CareerProspects"), HttpGet] + [AllowAnonymous] + public async Task CareerProspects([FromQuery] MajorCarrerInput input) + { + var result = new CareerProspectItems(); + if (string.IsNullOrWhiteSpace(input.zydm)) + { + throw Oops.Oh("KeyWord不能为空"); + } + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var carrerprosp = dbclient.GetCollection("zz_careerprospects"); + var filter = Builders.Filter.Eq(e => e.majorcode, input.zydm); + var query = await carrerprosp.Find(filter).ToListAsync(); + if (query == null) + { + throw Oops.Oh("专业数据为空!!!"); + } + result.rates = query.Select(s => new DicRate() + { + key = s.profession, + value = s.rate + }).ToList(); + result.profession = $"{string.Join("、", query.Select(s => s.profession).ToList())}"; + result.jobs = $"该专业毕业生可从事{string.Join(";", query.Select(s => s.jobs).ToList())}"; + return result; + + } + + + + + + /// + /// 院校招生简章列表根据院校id获取 + /// + /// + /// + [ApiDescriptionSettings(Name = "Recruits"), HttpGet] + [AllowAnonymous] + public async Task Recruits([FromQuery] UniversityRecruitsDto dto) + { + if (dto.uid <= 0) + { + throw Oops.Oh("uid不能为空"); + } + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var recruits = dbclient.GetCollection("zrecruitlist"); + var filter = Builders.Filter.Eq(e => e.base_college_id, dto.uid); + var result = await recruits.Find(filter).ToListAsync(); + + return result; + } + + + /// + /// 院校招生简章详情 + /// + /// + /// + [ApiDescriptionSettings(Name = "Recruitdetail"), HttpGet] + [AllowAnonymous] + public async Task Recruitdetail([FromQuery] RecruitsDetailDto dto) + { + if (dto.id <= 0) + { + throw Oops.Oh("id不能为空"); + } + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var recruits = dbclient.GetCollection("zrecruitdetail"); + var filter = Builders.Filter.Eq(e => e.id, dto.id); + var result = await recruits.Find(filter).FirstOrDefaultAsync(); + + if (recruits == null) + { + return "数据为空"; + } + + return result; + } + + + /// + /// 高校院系列表根据院校Id获取 + /// + /// + /// + [ApiDescriptionSettings(Name = "Zfacultylist"), HttpGet] + [AllowAnonymous] + public async Task Zfacultylist([FromQuery] RecruitsDetailDto dto) + { + if (dto.id <= 0) + { + throw Oops.Oh("id不能为空"); + } + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var facultys = dbclient.GetCollection("zfacultylist"); + var filter = Builders.Filter.Eq(e => e.base_college_id, dto.id); + var result = await facultys.Find(filter).ToListAsync(); + + if (!result.Any()) + { + return "数据为空"; + } + // 转换逻辑 + var uniTreeMajorItems = result.Select(faculty => new uniTreeMajorItems + { + ParnetId = 0, // Root node + Id = (int)faculty._id, + Name = faculty.college_faculty, + MajorNum = faculty.subject.Count, + Item = faculty.subject.Select(subject => new uniTreeMajorItems + { + ParnetId = (int)faculty._id, + Id = (int)subject.id, + Name = subject.faculty_subject, + MajorNum = 0, // Leaf node + Item = null + }).ToList() + }).ToList(); + return uniTreeMajorItems; + } + + + /// + /// 获取院校学科评估 + /// + /// + /// + [ApiDescriptionSettings(Name = "SubjectIntroducelist"), HttpGet] + [AllowAnonymous] + public async Task SubjectIntroducelist([FromQuery] RecruitsDetailDto dto) + { + if (dto.id <= 0) + { + throw Oops.Oh("id不能为空"); + } + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var facultys = dbclient.GetCollection("zsubjectintroduces"); + var filter = Builders.Filter.Eq(e => e.base_college_id, dto.id); + var result = await facultys.Find(filter).FirstOrDefaultAsync(); + + if (facultys == null) + { + return "数据为空"; + } + result.first_subject_list = result.first_subject_list.Where(e => e != "").ToList(); + result.second_subject_list = result.second_subject_list.Where(e => e != "").ToList(); + result.feature_subject_list = result.feature_subject_list.Where(e => e != "").ToList(); + result.stress_subject_list = result.stress_subject_list.Where(e => e != "").ToList(); + result.double_subject_list=result.double_subject_list.Where(e => e != "").ToList(); + result.assessment_subject_list = result.assessment_subject_list.Where(e => e != "").ToList(); + result.assessment_subject_list_new = result.assessment_subject_list_new.Where(e => e.data.Any()).ToList(); + return result; + } + + + + + /// + /// 职业基础数据架构 + /// + /// + /// + [ApiDescriptionSettings(Name = "BaseProfession"), HttpGet] + [AllowAnonymous] + public async Task BaseProfession([FromQuery] BaseProfessionRequestInputDto dto) + { + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var zprofessionitems = dbclient.GetCollection("z_professionitems"); + var filter = Builders.Filter.Empty; // 默认查询所有数据 + + if (!string.IsNullOrEmpty(dto.KeyWord)) + { + filter = Builders.Filter.Or( + Builders.Filter.Regex("rootName", new BsonRegularExpression(dto.KeyWord, "i")), + Builders.Filter.Regex("itemDtos.name", new BsonRegularExpression(dto.KeyWord, "i")) + ); + } + var list = await zprofessionitems.Find(filter).ToListAsync(); + return list; + } + + + + /// + /// 职业详情 + /// + /// + /// + [ApiDescriptionSettings(Name = "Professiondetails"), HttpGet] + [AllowAnonymous] + public async Task Professiondetails([FromQuery] RecruitsDetailDto dto) + { + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var zprofession = dbclient.GetCollection("z_professiondetails"); + var filter = Builders.Filter.Eq(e => e.id, dto.id); + var result = await zprofession.Find(filter).FirstOrDefaultAsync(); + if (zprofession == null) + { + return "数据为空"; + } + return result; + } + + + + + /// + /// 获取AIGC问题 + /// + /// + [ApiDescriptionSettings(Name = "aigcquestionswords"), HttpGet] + [AllowAnonymous] + public async Task GetAIGCQuestionsWords() + { + var dicy = await _sysDictDataRep.GetListAsync(e => e.DictTypeId == 660782446960709); + return dicy.Select(s => s.Remark).ToList(); + } + + + + + +} diff --git a/Admin.NET/Admin.NET.Core/Service/ZYEvaluate/DTO/HollandRequestDto.cs b/Admin.NET/Admin.NET.Core/Service/ZYEvaluate/DTO/HollandRequestDto.cs new file mode 100644 index 0000000..252cb76 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYEvaluate/DTO/HollandRequestDto.cs @@ -0,0 +1,170 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service; + + +public class ResultLookDto +{ + public long StudentId { get; set; } + + public int CategoryId { get; set; } + + /// + /// 霍兰德如果不传周期Id的话就获取最新的 + /// + public int CycleTimeId { get; set; } +} + +public class EvaluateResultDto +{ + public int CategoryId { get; set; } + + public int CId { get; set; } +} + +public class HollandRequestDto +{ + /// + /// + /// + public int CategoryId { get; set; } = 18; + +} +public class MBTICalcModel +{ + public int E { get; set; } + public int I { get; set; } + public int S { get; set; } + public int N { get; set; } + public int T { get; set; } + public int F { get; set; } + public int J { get; set; } + public int P { get; set; } +} + + +public class SaveSubjectDto +{ + public List Result { get; set; } + public int CategoryId { get; set; } + +} + +public class SaveMBTIDto +{ + public int CategoryId { get; set; } + + //public int CId { get; set; } + + public MBTICalcModel item { get; set; } +} + +public class SaveHollandDto +{ + public int CategoryId { get; set; } + + public int CId { get; set; } + public HollandModel item { get; set; } +} + + +public class SaveHolland +{ + public int CategoryId { get; set; } + + public long StudentId { get; set; } + + + public string Tags { get; set; } +} + +public class HollandModel +{ + public int R { get; set; } + public int I { get; set; } + public int A { get; set; } + public int S { get; set; } + public int E { get; set; } + public int C { get; set; } +} + + + +/// +/// 生涯能力提交 +/// +public class SavePsychQuery +{ + public int Type { get; set; } + + public int CategoryId { get; set; } + + public long StudentId { get; set; } + + public int CycleTimeId { get; set; } + + //public string ClassName { get; set; } + + //public string GradeName { get; set; } + + ///// + ///// 生涯能力传入 + ///// + //public List CareerResult { get; set; } + + /// + /// 学科探索传入 + /// + public List Result { get; set; } + /// + /// 学生发展 + /// + public List second { get; set; } +} + + +/// +/// 学生发展 +/// +public class SecondModels +{ + public int Id { get; set; } + + public int Status { get; set; } + + public string Tag { get; set; } + +} + +/// +/// 学科探索query +/// +public class SubjectSelectJson +{ + public string name { get; set; } + + public List value { get; set; } +} + +public class IntellectJson +{ + public string name { get; set; } + + public int value { get; set; } + +} +/// +/// 生涯能力json +/// +public class EvalJson +{ + public int Id { get; set; } + + public int Value { get; set; } + + public int CycleId { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/ZYEvaluate/ZYEvaluateService.cs b/Admin.NET/Admin.NET.Core/Service/ZYEvaluate/ZYEvaluateService.cs new file mode 100644 index 0000000..23aa738 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYEvaluate/ZYEvaluateService.cs @@ -0,0 +1,237 @@ +using Microsoft.Extensions.Caching.Distributed; +using Newtonsoft.Json.Serialization; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Flurl.Http; +using Flurl; + +namespace Admin.NET.Core.Service; + + + +/// +///测评模块 +/// +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 900)] +[Route("api/ZyEvaluate")] +public class ZYEvaluateService : IDynamicApiController, ITransient +{ + private readonly IDistributedCache _distributed; + private const string _cachekey = "eval_"; + private readonly IHttpContextAccessor _httpContextAccessor; + private readonly UserManager _userManager; + public ZYEvaluateService(IDistributedCache distributedCache, IHttpContextAccessor httpContextAccessor, UserManager userManager) + { + _distributed = distributedCache; + _httpContextAccessor = httpContextAccessor; + _userManager = userManager; + } + + + + /// + /// 获取霍兰德试题 + /// + /// id=18霍兰德=20学科探索 + /// + [HttpGet] + public async Task HLD([FromQuery] HollandRequestDto dto) + { + var key = _cachekey + "hld_" + dto.CategoryId; + var result = await _distributed.GetAsync(key); + if (result == null) + { + var headers = _httpContextAccessor.HttpContext.Request.Headers; + var token = headers["Authorization"].ToString(); + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + var _option = new DistributedCacheEntryOptions() + .SetSlidingExpiration(TimeSpan.FromDays(1)); + var dyresult = await string.Format("{0}api/front/Test/GetQuestion", baseurl) + .SetQueryParams(dto) + .WithOAuthBearerToken(token) + .GetStringAsync(); + var jsons = JsonConvert.DeserializeObject>>(dyresult); + byte[] byresult = Encoding.UTF8.GetBytes(jsons.response.ToJson()); + await _distributed.SetAsync(key, byresult, _option); + result = byresult; + } + return JsonConvert.DeserializeObject(Encoding.UTF8.GetString(result).ToLowerInvariant()); + } + + + /// + /// MBTI试题列表 + /// + /// + /// + [HttpGet] + public async Task MBTI([FromQuery] HollandRequestDto dto) + { + dto.CategoryId = 19; + var key = _cachekey + "MBTI_" + dto.CategoryId; + var result = await _distributed.GetAsync(key); + if (result == null) + { + var headers = _httpContextAccessor.HttpContext.Request.Headers; + var token = headers["Authorization"].ToString(); + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + var _option = new DistributedCacheEntryOptions() + .SetSlidingExpiration(TimeSpan.FromDays(1)); + var dyresult = await string.Format("{0}api/front/Test/GetQuestion", baseurl) + .SetQueryParams(dto) + .WithOAuthBearerToken(token) + .GetStringAsync(); + var jsons = JsonConvert.DeserializeObject>>(dyresult); + byte[] byresult = Encoding.UTF8.GetBytes(jsons.response.ToJson()); + await _distributed.SetAsync(key, byresult, _option); + result = byresult; + } + return JsonConvert.DeserializeObject(Encoding.UTF8.GetString(result).ToLowerInvariant()); + } + + + + + /// + /// 霍兰德保存 + /// + /// + /// + [HttpPost] + public async Task SaveHLD([FromBody] SaveHollandDto dto) + { + var headers = _httpContextAccessor.HttpContext.Request.Headers; + var token = headers["Authorization"].ToString(); + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + var dyresult = await string.Format("{0}api/front/Test/SaveHolland", baseurl).WithOAuthBearerToken( + token).PostJsonAsync(new SaveHolland() + { + CategoryId = dto.CategoryId, + StudentId = _userManager.UserId, + Tags = dto.item.ToJson() + }); + var result = await dyresult.GetJsonAsync>(); + return result.response; + } + + + /// + /// MBTI保存 + /// + /// + /// + [HttpPost] + public async Task SaveMBTI([FromBody] SaveMBTIDto dto) + { + var headers = _httpContextAccessor.HttpContext.Request.Headers; + var token = headers["Authorization"].ToString(); + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + var dyresult = await string.Format("{0}api/front/Test/SaveHolland", baseurl).WithOAuthBearerToken(token).PostJsonAsync(new SaveHolland() + { + CategoryId = dto.CategoryId, + StudentId = _userManager.UserId, + + Tags = dto.item.ToJson() + }); + var result = await dyresult.GetJsonAsync>(); + return result.response; + + } + + + [HttpPost] + public async Task SaveSubject([FromBody] SaveSubjectDto dto) + { + var headers = _httpContextAccessor.HttpContext.Request.Headers; + var token = headers["Authorization"].ToString(); + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + var dyresult = await string.Format("{0}api/front/Test/SavePsych", baseurl) + .WithOAuthBearerToken(token).PostJsonAsync(new SavePsychQuery() + { + CategoryId = 20, + StudentId = _userManager.UserId, + Type = 0, + Result = dto.Result + }); + + var result = await dyresult.GetJsonAsync>(); + return result.response; + + } + + + + + + + /// + /// 获取测评测验状态 + /// + /// + [HttpGet] + public async Task Status() + { + var headers = _httpContextAccessor.HttpContext.Request.Headers; + var token = headers["Authorization"].ToString(); + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + var dyresult = await string.Format("{0}api/Evaluations?CustomerId={1}", baseurl, _userManager.UserId) + .WithOAuthBearerToken(token).GetStringAsync(); + var jsons= JsonConvert.DeserializeObject>>(dyresult); + return jsons.response; + } + + + + + + + + /// + /// 获取测评结果 + /// + /// + /// + [HttpGet] + public async Task Result([FromQuery] EvaluateResultDto dto) + { + //var key = _cachekey + "r_" + dto.CategoryId; + //var result = await _distributed.GetAsync(key); + //if (result == null) + //{ + var headers = _httpContextAccessor.HttpContext.Request.Headers; + var token = headers["Authorization"].ToString(); + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + var _option = new DistributedCacheEntryOptions() + .SetSlidingExpiration(TimeSpan.FromDays(1)); + string interurl = dto.CategoryId == 18 ? "GetHollandoccupDetail" : dto.CategoryId == 19 ? "GetMBTIResult" : "SubjectChartRadar"; + var dyresult = await string.Format("{0}api/front/Test/{1}", baseurl, interurl) + .SetQueryParams(new ResultLookDto() + { + CategoryId = dto.CategoryId, + StudentId = _userManager.UserId + }) + .WithOAuthBearerToken(token) + .GetStringAsync(); + + if (dto.CategoryId == 18) + { + return JsonConvert.DeserializeObject>(dyresult).response; + } + if (dto.CategoryId == 19) + { + return JsonConvert.DeserializeObject>(dyresult).response; + } + else + { + return JsonConvert.DeserializeObject>(dyresult).response; + } + } + + + + +} diff --git a/Admin.NET/Admin.NET.Core/Service/ZYFusion/DTO/ChangeuniversityDto.cs b/Admin.NET/Admin.NET.Core/Service/ZYFusion/DTO/ChangeuniversityDto.cs new file mode 100644 index 0000000..0a45721 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYFusion/DTO/ChangeuniversityDto.cs @@ -0,0 +1,17 @@ +using MongoDB.Bson; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; +namespace Admin.NET.Core.Service; +public class ChangeuniversityDto +{ + [JsonConverter(typeof(ObjectIdConverter))] + public ObjectId _id { get; set; } + + public string olduniversityName { get; set; } + public string newuniversityName { get; set; } + +} diff --git a/Admin.NET/Admin.NET.Core/Service/ZYFusion/DTO/GaoKaoMajorDto.cs b/Admin.NET/Admin.NET.Core/Service/ZYFusion/DTO/GaoKaoMajorDto.cs new file mode 100644 index 0000000..5f1f8fa --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYFusion/DTO/GaoKaoMajorDto.cs @@ -0,0 +1,442 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; +namespace Admin.NET.Core.Service; +public class GaoKaoMajorDto +{ + + +} + +public class GaokaoMajorMsgObject +{ + public List msg { get; set; } + public bool flag { get; set; } +} + +public class GaokaoMajorMsg +{ + + public string key { get; set; } + public string name { get; set; } +} + + +public class GaoKaoMajorRootDto +{ + [JsonConverter(typeof(ObjectIdConverter))] + public ObjectId _id { get; set; } + public string type { get; set; } + + public List majorMsgs { get; set; } +} + + + +public class GaoKaoMajorItemDto +{ + [JsonConverter(typeof(ObjectIdConverter))] + public ObjectId _id { get; set; } + public string type { get; set; } + + public List majorMsgs { get; set; } +} + +public class GaokaoMajorMsgItems +{ + + public string key { get; set; } + public string name { get; set; } + + public List childMajors { get; set; } +} + + + +public class MajorChildbject +{ + public List msg { get; set; } + public bool flag { get; set; } +} + +public class MajorChildMsg +{ + public string zydm { get; set; } + public string zymc { get; set; } + public string specId { get; set; } + public string zymyd { get; set; } +} + + + + +public class MajorDetailObject +{ + public MajorDetailMsg msg { get; set; } + public bool flag { get; set; } +} + +public class MajorDetailMsg +{ + [JsonConverter(typeof(ObjectIdConverter))] + public ObjectId _id { get; set; } + public string zydm { get; set; } + public string zymc { get; set; } + public string ml { get; set; } + public string xk { get; set; } + public string xlcc { get; set; } + public string specId { get; set; } + public string xsgm { get; set; } + public int boyPercent { get; set; } + public int girlPercent { get; set; } + public string zyjs { get; set; } + public List jyfx { get; set; } + public List zymyd { get; set; } + public List kyfx { get; set; } + public List zytjzsList { get; set; } + public List simileZyList { get; set; } + public string year { get; set; } + public string xcspImgUrl { get; set; } +} + +public class Zymyd +{ + public string type { get; set; } + public string typeDesc { get; set; } + public float rank { get; set; } + public int count { get; set; } +} + +public class Kyfx +{ + public object advanceMajors { get; set; } + public string zydm { get; set; } + public string zymc { get; set; } + public string ccKey { get; set; } +} + +public class Zytjzslist +{ + public string schId { get; set; } + public string cc { get; set; } + public string yxmc { get; set; } + public int count { get; set; } + public float rank { get; set; } + public string specId { get; set; } +} + +public class Similezylist +{ + public string zydm { get; set; } + public string zymc { get; set; } + public string specId { get; set; } + public string zymyd { get; set; } +} + + + +public class KskcObject +{ + + public KskcMsg msg { get; set; } + public bool flag { get; set; } +} + +public class KskcMsg +{ + [JsonConverter(typeof(ObjectIdConverter))] + public ObjectId _id { get; set; } + public string specId { get; set; } + public string zymc { get; set; } + public List kskcList { get; set; } +} + +public class Kskclist +{ + public string kcmc { get; set; } + public string practicality { get; set; } + public string difficulty { get; set; } + public int praTotal { get; set; } + public int diffTotal { get; set; } +} + + + +public class KyfxObject +{ + + public KyfxMsg msg { get; set; } + public bool flag { get; set; } +} + +public class KyfxMsg +{ + [JsonConverter(typeof(ObjectIdConverter))] + public ObjectId _id { get; set; } + public string specId { get; set; } + public string zymc { get; set; } // 专业名称 + public List ssdmList { get; set; } // 所属地区列表 + public List schSpecList { get; set; } // 学校和专业列表 +} + +public class SsdmList +{ + public string specId { get; set; } // 专业ID + public string code { get; set; } // 代码 + public string ssmc { get; set; } // 所属名称 + public int count { get; set; } // 数量 +} + +public class SchSpecList +{ + /// + /// + /// + public string yxdm { get; set; } // 学校代码 + public string yxmc { get; set; } // 学校名称 + public string logo { get; set; } + public string cityname { get; set; } + + /// + /// 学校等级(本科专科) + /// + public string ulevel { get; set; } + + /// + /// 高校标签 + /// + public string featuretag { get; set; } + + public string ssdm { get; set; } // 所属地区代码 + public double zytjRank { get; set; } // 专业排名 + public int zytjCount { get; set; } // 专业数量 + public List mydList { get; set; } // 满意度列表 + public string schId { get; set; } // 学校ID + public string academeId { get; set; } // 学院ID +} + +public class MyDList +{ + public string type { get; set; } // 类型 + public string typeDesc { get; set; } // 类型描述 + public double rank { get; set; } // 排名 + public int count { get; set; } // 数量 +} + +public class MajorMaptradeDto +{ + [JsonConverter(typeof(ObjectIdConverter))] + public ObjectId _id { get; set; } + + public string majorcode { get; set; } + + public string majorname { get; set; } + + public string trade { get; set; } + + public string rate { get; set; } + + + +} + +public class CareerProspectsDto +{ + [JsonConverter(typeof(ObjectIdConverter))] + public ObjectId _id { get; set; } + public string majorcode { get; set; } + + public string majorname { get; set; } + + public string profession { get; set; } + + public string jobs { get; set; } + + public string rate { get; set; } + + + +} + + +public class CareerProspectItems +{ + + public string majorcode { get; set; } + + public string majorname { get; set; } + + public string profession { get; set; } + public string jobs { get; set; } + + public List rates { get; set; } + +} + +public class DicRate +{ + public string key { get; set; } + + public string value { get; set; } + +} + + + +public class Base_subjectobject +{ + public int code { get; set; } + public string msg { get; set; } + public base_Data data { get; set; } +} + +public class base_Data +{ + public Params _params { get; set; } + public Leftlist[] leftList { get; set; } + public string flag { get; set; } + public base_Subject subject { get; set; } +} + +public class Params +{ + public string type { get; set; } + public string code { get; set; } + public string timestamp { get; set; } +} + +public class base_Subject +{ + [BsonId] + public long id { get; set; } + public string subject_name_one { get; set; } + public string subject_code_one { get; set; } + public string subject_name_two { get; set; } + public string subject_code_two { get; set; } + public string subject_name_three { get; set; } + public string subject_code_three { get; set; } + public string subject_code_three_display { get; set; } + public string subject_type { get; set; } + public int subject_type_int { get; set; } + public string subject_year { get; set; } + public string zyjs { get; set; } + public string pymb { get; set; } + public string pyyq { get; set; } + public string xkyq { get; set; } + public string zsnl { get; set; } + public string kyfx { get; set; } + public string zykc { get; set; } + public string shmr { get; set; } + public string jyfx { get; set; } + public string boy_ratio { get; set; } + public string gril_ratio { get; set; } + public string degree { get; set; } + public string jydqfb { get; set; } + public string hyfb { get; set; } + public string zyfb { get; set; } + public string money { get; set; } + public object zk_sx { get; set; } + public object zk_zyzgzs { get; set; } + public string zk_zsbfx { get; set; } + public Money_Zxt money_zxt { get; set; } + public Jydqfb_Bt jydqfb_bt { get; set; } + public Hyfb_Bt hyfb_bt { get; set; } + public Zyfb_Bt zyfb_bt { get; set; } + public string ratio { get; set; } +} + +public class Money_Zxt +{ + public int[] x { get; set; } + public string[] y { get; set; } + public mbaseList[] list { get; set; } + public string average { get; set; } +} + +public class mbaseList +{ + public int name { get; set; } + public string value { get; set; } +} + +public class Jydqfb_Bt +{ + public Bt[] bt { get; set; } + public List1[] list { get; set; } +} + +public class Bt +{ + public string name { get; set; } + public int value { get; set; } +} + +public class List1 +{ + public string name { get; set; } + public string value { get; set; } +} + +public class Hyfb_Bt +{ + public Bt1[] bt { get; set; } + public List2[] list { get; set; } +} + +public class Bt1 +{ + public string name { get; set; } + public int value { get; set; } +} + +public class List2 +{ + public string name { get; set; } + public string value { get; set; } +} + +public class Zyfb_Bt +{ + public Bt2[] bt { get; set; } + public List3[] list { get; set; } +} + +public class Bt2 +{ + public string name { get; set; } + public string value { get; set; } +} + +public class List3 +{ + public string name { get; set; } + public string value { get; set; } + public string det { get; set; } +} + +public class Leftlist +{ + public string first_name { get; set; } + public string first_code { get; set; } + public Second[] second { get; set; } + public int first_sub_count { get; set; } +} + +public class Second +{ + public string second_name { get; set; } + public string second_code { get; set; } + public Third[] third { get; set; } + public int second_sub_count { get; set; } +} + +public class Third +{ + public string third_name { get; set; } + public string third_code { get; set; } +} diff --git a/Admin.NET/Admin.NET.Core/Service/ZYFusion/DTO/XueXiaoDto.cs b/Admin.NET/Admin.NET.Core/Service/ZYFusion/DTO/XueXiaoDto.cs new file mode 100644 index 0000000..50bd434 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYFusion/DTO/XueXiaoDto.cs @@ -0,0 +1,321 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json.Serialization; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service; +public class XueXiaoDto +{ +} + +public class XueXiaoRootobject +{ + public int code { get; set; } + public string msg { get; set; } + public XueXiaoData data { get; set; } +} + +public class XueXiaoData +{ + public int total { get; set; } + public string has_next { get; set; } + public string page { get; set; } + public string perpage { get; set; } + public XueXiaoParams _params { get; set; } + public XueXiaoParamslist paramsList { get; set; } + public XueXiaoDatum[] data { get; set; } +} + +public class XueXiaoParams +{ + public string area { get; set; } + public string type { get; set; } + public string nature { get; set; } + public string grade { get; set; } + public string is_bz { get; set; } + public string cname { get; set; } + public string page { get; set; } + public string perpage { get; set; } + public string timestamp { get; set; } +} + +public class XueXiaoParamslist +{ + public XueXiaoArealist[] arealist { get; set; } + public XueXiaoTypelist[] typelist { get; set; } + public XueXiaoNaturelist[] naturelist { get; set; } + public XueXiaoXingzhilist[] xingzhilist { get; set; } + public XueXiaoClasslist[] classlist { get; set; } +} + +public class XueXiaoArealist +{ + public int id { get; set; } + public string area { get; set; } + public string province { get; set; } + public string city { get; set; } + public int create_time { get; set; } + public string text { get; set; } + public XueXiaoChild[] children { get; set; } +} + +public class XueXiaoChild +{ + public int id { get; set; } + public string area { get; set; } + public string province { get; set; } + public string city { get; set; } + public int create_time { get; set; } + public string text { get; set; } +} + +public class XueXiaoTypelist +{ + public int id { get; set; } + public string type_name { get; set; } + public int create_time { get; set; } + public int list_order { get; set; } +} + +public class XueXiaoNaturelist +{ + public int id { get; set; } + public string nature_name { get; set; } + public int create_time { get; set; } + public int list_order { get; set; } + public int staue { get; set; } +} + +public class XueXiaoXingzhilist +{ + public int id { get; set; } + public string nature_name { get; set; } + public int create_time { get; set; } + public int list_order { get; set; } + public int staue { get; set; } +} + +public class XueXiaoClasslist +{ + public int id { get; set; } + public string nature_name { get; set; } + public int create_time { get; set; } + public int list_order { get; set; } + public int staue { get; set; } +} + +public class XueXiaoDatum +{ + [BsonId] + public long _id { get; set; } + public string college_name { get; set; } + public string college_name_display { get; set; } + public string rk_ranking_2024 { get; set; } + public int rk_ranking_list { get; set; } + public string college_class { get; set; } + public string college_nature { get; set; } + public XueXiaoDetail detail { get; set; } + public string rk_ranking { get; set; } +} + +public class universitychangeidDto +{ + [JsonConverter(typeof(ObjectIdConverter))] + public ObjectId _id { get; set; } + + public int yid { get; set; } + + public int newid { get; set; } + + public string universityname { get; set; } + +} +public class XueXiaoDetail +{ + public long _id { get; set; } + public string college_name { get; set; } + public string college_logo { get; set; } + public string ex_rate { get; set; } + public string college_class { get; set; } + public double? college_create_time { get; set; } + public string master_num { get; set; } + public string doctor_num { get; set; } + public string college_nature { get; set; } + public string college_type { get; set; } + public string college_area { get; set; } + public string college_competent { get; set; } + public List college_grade { get; set; } + public string wsl_ranking { get; set; } + public string rk_ranking { get; set; } + public string enrollment_rate_in { get; set; } + public string enrollment_rate_out { get; set; } + public string job_report { get; set; } +} + +public class provinceInfoobject +{ + public int code { get; set; } + public string msg { get; set; } + public provinceInfoData data { get; set; } +} + +public class provinceInfoData +{ + public List list { get; set; } +} + +public class provinceInfoList +{ + public string id { get; set; } + public string name { get; set; } +} + + + +public class xueXiaomajorobject +{ + public int code { get; set; } + public string msg { get; set; } + public xuexiaomajorData data { get; set; } +} + +public class xuexiaomajorData +{ + public Collegetag collegeTag { get; set; } + public xuexiaomajorConfiglist configList { get; set; } + public List list { get; set; } +} + + +public class xuexiaomajorConfiglist +{ + public string proDefault { get; set; } + public int yearDefault { get; set; } + public int subjectDefault { get; set; } + public int batchDefault { get; set; } + public Yearlist[] yearList { get; set; } + public Subjectlist[] subjectList { get; set; } + public Batchlist[] batchList { get; set; } +} +public class Collegetag +{ + public string id { get; set; } + public string college_name { get; set; } + public string college_logo { get; set; } + public string college_class { get; set; } + public string college_create_time { get; set; } + public string master_num { get; set; } + public string doctor_num { get; set; } + public string college_nature { get; set; } + public string college_type { get; set; } + public string college_area { get; set; } + public string college_competent { get; set; } + public string[] college_grade { get; set; } + public string wsl_ranking { get; set; } + public string rk_ranking { get; set; } +} + + + + + + +public class Batchlist +{ + public int batch_id { get; set; } + public string batch_name { get; set; } + public bool selected { get; set; } +} + +public class xuexiaomajorList +{ + public int id { get; set; } + public int scoreline_major_id { get; set; } + public string college_code { get; set; } + public string college_recruit_name { get; set; } + public int match_college_id { get; set; } + public int college_id { get; set; } + public string b_college_name { get; set; } + public string major_code { get; set; } + public string major_name { get; set; } + public string major_memo { get; set; } + public string enroll_num { get; set; } + public string score_min { get; set; } + public string score_max { get; set; } + public string score_average { get; set; } + public string rank_min { get; set; } + public string rank_max { get; set; } + public string rank_average { get; set; } + public string post_score { get; set; } + public string post_score_grading { get; set; } + public string volunteer_type { get; set; } + public string second_subject { get; set; } + public string group_code { get; set; } + public string group_name { get; set; } + public int year { get; set; } +} + + +public class xuexiaoCollegeDataobject +{ + public int code { get; set; } + public string msg { get; set; } + public xuexiaoCollegeData data { get; set; } +} + +public class xuexiaoCollegeData +{ + public College_Data_Tag tag { get; set; } + public College_Data data { get; set; } +} + +public class College_Data_Tag +{ + public string id { get; set; } + public string college_name { get; set; } + public string college_logo { get; set; } + public string ex_rate { get; set; } + public string college_class { get; set; } + public string college_create_time { get; set; } + public string master_num { get; set; } + public string college_nature { get; set; } + public string college_type { get; set; } + public string college_area { get; set; } + public string college_competent { get; set; } + public string[] college_grade { get; set; } + public string wsl_ranking { get; set; } + public string rk_ranking { get; set; } + public string enrollment_rate_in { get; set; } + public string enrollment_rate_out { get; set; } + public string job_report { get; set; } +} + +public class College_Data +{ + public string college_introduce { get; set; } +} + + +public class NewsData +{ + public List province { get; set; } + public Dictionary> year { get; set; } + public Dictionary> type { get; set; } + public Dictionary> batch { get; set; } +} + +public class Data +{ + public NewsData newsdata { get; set; } +} + +public class BatchRoot +{ + public string code { get; set; } + public string message { get; set; } + public Data data { get; set; } +} diff --git a/Admin.NET/Admin.NET.Core/Service/ZYFusion/DTO/ZYFusionRequestDto.cs b/Admin.NET/Admin.NET.Core/Service/ZYFusion/DTO/ZYFusionRequestDto.cs new file mode 100644 index 0000000..2a11b88 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYFusion/DTO/ZYFusionRequestDto.cs @@ -0,0 +1,175 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service; +public class ZYFusionRequestDto +{ + public string Year { get; set; } + + public string ProvinceCode { get; set; } + + + /// + /// 投档excel名称url + /// + public string FusionFilePath { get; set; } + + +} + + +public class SpiderReuqestDto +{ + public string locationCode { get; set; } + + public string year { get; set; } +} + +public class ZsPlanProExcelRequestInput +{ + /// + /// 批次名称 + /// + public string BatchName { get; set; } + public string Year { get; set; } + + /// + /// + /// + public string ProvinceCode { get; set; } + + /// + /// 需处理的文件名 + /// + public string fileName { get; set; } +} + + +public class ZsPlanProExcelRequestInputV2 +{ + public string locationCode { get; set; } + + public string year { get; set; } + + public string type { get; set;} + +} + + +public class ZsHeNanPlanProExcelRequestInput +{ + /// + /// 批次名称 + /// + public string BatchName { get; set; } + public string Year { get; set; } + + /// + /// + /// + public string ProvinceCode { get; set; } + + /// + /// 需处理的文件名 + /// + public string fileName1 { get; set; } + + public string fileName2 { get; set; } +} + + +public class ZyFusionInput +{ + public string 专业代码 { get; set; } + public string 专业名称 { get; set; } + + /// + /// 专业组(上海)没有就为空 + /// + public string 专业组 { get; set; } + public string 院校代码 { get; set; } + public string 院校名称 { get; set; } + public string 投档计划数 { get; set; } + public string 最低位次 { get; set; } +} + +public class ZySinglePlanInput +{ + + public string 学校 { get; set; } + public string 批次 { get; set; } + public string 全国统一招生代码 { get; set; } + public string 科类 { get; set; } + public string 专业代码 { get; set; } + public string 专业 { get; set; } + + public string 选科要求 { get; set; } + public string 专业组 { get; set; } + public string 学制 { get; set; } + public string 计划数 { get; set; } + public string 学费 { get; set; } + + public string 专业备注 { get; set; } +} + + + +public class ZyHeNanFusionInput +{ + public string 年份 { get; set; } + + public string 院校名称 { get; set; } + + public string 科类 { get; set; } + public string 批次 { get; set; } + public string 最低分 { get; set; } + public string 最低位次 { get; set; } +} + + +public class ZyHeNanTFusionInput +{ + public string 年份 { get; set; } + public string 全国统一招生代码 { get; set; } + public string 院校名称 { get; set; } + /// + /// 类型:0 综合||1(物理)|2(历史)|3理科 |4 文科 + /// + public string 科类 { get; set; } + public string 批次 { get; set; } + + public string 专业代码 { get; set; } + public string 专业 { get; set; } + + public string 投档计划数 { get; set; } + public string 最低分 { get; set; } + public string 最低位次 { get; set; } +} + +public class ZyFusionDocSHInput +{ + /// + /// 专业组(上海)没有就为空 + /// + public string 院校专业组代码 { get; set; } + public string 院校专业组 { get; set; } + public string 院校名称 { get; set; } + public string 投档线 { get; set; } + + /// + /// 类型:0 综合||1(物理)|2(历史)|3理科 |4 文科 + /// + public string 类型 { get; set;} +} + + + + +public class NPlanChangeUnName +{ + public string newName { get; set; } + public string oldName { get; set; } +} diff --git a/Admin.NET/Admin.NET.Core/Service/ZYFusion/DTO/ZyFusionResponseDto.cs b/Admin.NET/Admin.NET.Core/Service/ZYFusion/DTO/ZyFusionResponseDto.cs new file mode 100644 index 0000000..f2541d1 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYFusion/DTO/ZyFusionResponseDto.cs @@ -0,0 +1,90 @@ +using MongoDB.Bson; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; +namespace Admin.NET.Core.Service; +public class ZyFusionResponseDto +{ + /// + /// + /// + [JsonConverter(typeof(ObjectIdConverter))] + public ObjectId _id { get; set; } + + /// + ///类型:0 综合||1(物理)|2(历史)|3理科 |4 文科 + /// + public int Type { get; set; } + /// + /// 批次名称 + /// + public string BatchName { get; set; } + public string ProviceCode { get; set; } + public string ProvinceName { get; set; } + public string UniversityName { get; set; } + + public string UniversityCode { get; set; } + + public string MajorGroupName { get; set; } + public string MajorName { get; set; } + + public string MajorCode { get; set; } + + /// + /// 投档计划数 + /// + public int PlanCount { get; set; } + + /// + ///投档最低位次 + /// + public int LowSection { get; set; } + + public int LowScore { get; set; } + + + +} + + + + +public class zsPlanProfessionDto +{ + public string 省份 { get; set; } + + public string 年份 { get; set; } + public string 批次 { get; set; } + public string 类型 { get; set; } + public string 院校代码 { get; set; } + public string 院校名称 { get; set; } + public string 专业代码 { get; set; } + public string 专业名称 { get; set; } + public string 计划人数 { get; set; } + public string 学费 { get; set; } + public string 学制 { get; set; } + public string 选科要求 { get; set; }//河南专业备注会用这个字段 + + +} + +public class zsShPlanProfessionDto +{ + public string 批次 { get; set; } + public string 类型 { get; set; } + public string 科目要求 { get; set; } + public string 院校 { get; set; } + public string 院校代码 { get; set; } + public string 专业组 { get; set; } + public string 专业代码 { get; set; } + public string 专业名称 { get; set; } + public string 专业备注 { get; set; } + public string 计划数 { get; set; } + public string 学费 { get; set; } + public string 学制 { get; set; } + + +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/ZYFusion/ProxyHelper.cs b/Admin.NET/Admin.NET.Core/Service/ZYFusion/ProxyHelper.cs new file mode 100644 index 0000000..e1217d4 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYFusion/ProxyHelper.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service; + +public static class ProxyHelper +{ + private static List<(string ip, int port)> _proxyList = new(); + private static readonly Random _random = new(); + + /// + /// 初始化代理池并验证可用性 + /// + /// CSV 文件路径,每行格式:ip,port + /// 可用性验证的测试地址,建议用目标网站或者 https://httpbin.org/ip + public static async Task LoadAndValidateProxiesAsync(string filePath, string testUrl = "https://httpbin.org/ip") + { + if (!File.Exists(filePath)) throw new FileNotFoundException("代理IP文件不存在", filePath); + + var lines = File.ReadAllLines(filePath); + var tempList = new List<(string ip, int port)>(); + + foreach (var line in lines.Skip(1)) // 跳过表头 + { + var parts = line.Split(','); + if (parts.Length >= 2 && int.TryParse(parts[1], out var port)) + { + tempList.Add((parts[0], port)); + } + } + + // 异步验证代理是否可用 + var tasks = tempList.Select(proxy => IsProxyAvailableAsync(proxy.ip, proxy.port, testUrl)); + var results = await Task.WhenAll(tasks); + + _proxyList = tempList.Where((proxy, index) => results[index]).ToList(); + + Console.WriteLine($"✅ 验证通过的代理数量:{_proxyList.Count}"); + + if (!_proxyList.Any()) + throw new Exception("没有可用的代理IP,请检查代理池是否失效"); + } + + /// + /// 验证代理是否可用 + /// + private static async Task IsProxyAvailableAsync(string ip, int port, string testUrl) + { + try + { + var handler = new HttpClientHandler + { + Proxy = new WebProxy(ip, port), + UseProxy = true, + }; + + using var client = new HttpClient(handler); + client.Timeout = TimeSpan.FromSeconds(5); + + var response = await client.GetAsync(testUrl); + return response.IsSuccessStatusCode; + } + catch + { + return false; + } + } + + /// + /// 使用随机代理发起 GET 请求,并支持重试 + /// + public static async Task GetWithRandomProxyAsync(string url, int maxRetry = 5, int delayBetweenRetry = 1000) + { + if (!_proxyList.Any()) throw new Exception("代理列表为空,请先调用 LoadAndValidateProxiesAsync()"); + + for (int attempt = 0; attempt < maxRetry; attempt++) + { + var (ip, port) = _proxyList[_random.Next(_proxyList.Count)]; + + try + { + var handler = new HttpClientHandler + { + Proxy = new WebProxy(ip, port), + UseProxy = true, + }; + + using var client = new HttpClient(handler); + client.Timeout = TimeSpan.FromSeconds(10); + + var response = await client.GetAsync(url); + response.EnsureSuccessStatusCode(); + return await response.Content.ReadAsStringAsync(); + } + catch (Exception ex) + { + Console.WriteLine($"❌ 代理 {ip}:{port} 请求失败(第 {attempt + 1} 次): {ex.Message}"); + await Task.Delay(delayBetweenRetry); + } + } + + throw new Exception("多次尝试使用代理请求失败"); + } +} diff --git a/Admin.NET/Admin.NET.Core/Service/ZYFusion/ZYFusionService.cs b/Admin.NET/Admin.NET.Core/Service/ZYFusion/ZYFusionService.cs new file mode 100644 index 0000000..f1e176d --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYFusion/ZYFusionService.cs @@ -0,0 +1,2082 @@ +using DocumentFormat.OpenXml.Office2013.Word; +using MiniExcelLibs; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using MongoDB.Driver; // 确保使用这个命名空间 +using MongoDB.Driver.Core; +using MongoDB.Bson; +using DocumentFormat.OpenXml.Spreadsheet; +using SharpCompress.Common; +using AngleSharp.Dom; +using Flurl.Http; +using static SKIT.FlurlHttpClient.Wechat.Api.Models.WxaBusinessGetLiveInfoResponse.Types; +using Microsoft.AspNetCore.Http.HttpResults; +using RazorEngine.Compilation.ImpromptuInterface.InvokeExt; +using HtmlAgilityPack; +using DocumentFormat.OpenXml.Wordprocessing; +using Elastic.Clients.Elasticsearch.Requests; +using MongoDB.Bson.IO; +using System.Text.Json; +using OfficeOpenXml.FormulaParsing.Excel.Functions.Math; +using AngleSharp.Text; +using SqlSugar.Extensions; +namespace Admin.NET.Core.Service; + +/// +///位次对应一分一段表融合数据模块 +/// +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 900)] +[Route("api/ZyFusionService")] +public class ZYFusionService : IDynamicApiController, ITransient +{ + private readonly IMongoDBRepository _mongoRepository; + private readonly SqlSugarRepository _provinceInfo; + private readonly string _uploadDirectory = Path.Combine(Directory.GetCurrentDirectory(), "uploads"); + + public ZYFusionService(IMongoDBRepository mongoDBRepository, SqlSugarRepository provinceInfo) + { + _mongoRepository = mongoDBRepository; + _provinceInfo = provinceInfo; + } + + + /// + /// 先上传excel 然后再通过唯一id传入逻辑计算(需要自己记住) + /// + /// + /// + [ApiDescriptionSettings(Name = "UploadExcel"), HttpPost] + [DisplayName("UploadExcel")] + public async Task UploadFile([Required] IFormFile file) + { + // 假设你把文件保存到服务器并返回一个文件 ID 或路径 + // 确保上传目录存在 + if (!Directory.Exists(_uploadDirectory)) + { + Directory.CreateDirectory(_uploadDirectory); + } + + // 为文件生成唯一名称(避免文件名冲突) + var uniqueFileName = $"{Guid.NewGuid()}_{file.FileName}"; + var filePath = Path.Combine(_uploadDirectory, uniqueFileName); + + // 保存文件到指定路径 + using (var fileStream = new FileStream(filePath, FileMode.Create)) + { + await file.CopyToAsync(fileStream); + } + + // 返回文件路径或唯一标识符 + return uniqueFileName; + } + + + + /// + /// 单纯招生计划数据导入 + /// + /// + [ApiDescriptionSettings(Name = "SingleZsPlanExport"), HttpGet] + public async Task ZsPlanExport([Required][FromQuery] ZYFusionRequestDto dto) + { + var zy_fusionlist = new List(); + var filePath = await UtilExcelExt.GetFileByIdAsync(_uploadDirectory, dto.FusionFilePath); + //第一志愿投档表 + var fusionlist = InputExcelUtil.InputExcel(filePath); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var newbejson = dbclient.GetCollection(string.Format("singlezsplan_{0}_{1}", dto.ProvinceCode, dto.Year)); + fusionlist.ForEach(a => + { + + zy_fusionlist.Add(new singlezsPlanmodel() + { + universityName = a.学校, + enrollmentCode = a.全国统一招生代码, + locationCode = dto.ProvinceCode, + majorGroup = string.IsNullOrEmpty(a.专业组) ? "" : a.专业组, + majorName = a.专业, + majorCode = a.专业代码, + plancount = string.IsNullOrEmpty(a.计划数) ? 0 : int.Parse(a.计划数), + academicYear = a.学制, + subjectClam = a.选科要求, + batchName = a.批次, + fee = a.学费, + remark = a.专业备注, + subjectType = a.科类 + }); + + }); + await newbejson.InsertManyAsync(zy_fusionlist); + // 使用 MemoryStream 保存 Excel 数据 + var stream = new MemoryStream(); + // 异步创建 Excel 文件 + await Task.Run(() => MiniExcel.SaveAs(stream, zy_fusionlist)); + // 重置流的位置为开始 + stream.Position = 0; + var deletePath2 = Path.Combine(_uploadDirectory, dto.FusionFilePath); + System.IO.File.Delete(deletePath2); + // 返回 FileStreamResult,同时指定内容类型和文件名 + return new FileStreamResult(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + { + FileDownloadName = string.Format("{0}_{1}_exprot.xlsx", dto.ProvinceCode, dto.Year) + }; + + } + + /// + /// 院校专业组批次线导入(不带院校组) + /// + /// + /// + [ApiDescriptionSettings(Name = "ExportExcel"), HttpGet] + [DisplayName("ExportExcel")] + public async Task Export([Required][FromQuery] ZYFusionRequestDto dto) + { + + var zy_fusionlist = new List(); + var filePath2 = await UtilExcelExt.GetFileByIdAsync(_uploadDirectory, dto.FusionFilePath); + //第一志愿投档表 + var fusionlist = InputExcelUtil.InputExcel(filePath2); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var newbejson = dbclient.GetCollection(string.Format("fusion_{0}_{1}", dto.ProvinceCode, dto.Year)); + var scoresetionjson = dbclient.GetCollection(string.Format("scoresection_{0}_{1}", dto.ProvinceCode, dto.Year)); + var oneScorelist = await scoresetionjson.Find(new BsonDocument()).ToListAsync(); + var oldjsons = await newbejson.Find(new BsonDocument()).ToListAsync(); + + fusionlist.ForEach(a => + { + if (!oldjsons.Any(e => e.UniversityName.Equals(a.院校名称.Trim()) && e.MajorName.Equals(a.专业名称.Trim()))) + { + var lowsectionscore = CalcuScoreFinder.FindScoreByRank(int.Parse(a.最低位次), oneScorelist); + zy_fusionlist.Add(new ZyFusionResponseDto() + { + UniversityName = a.院校名称.Trim(), + UniversityCode = a.院校代码, + ProviceCode = dto.ProvinceCode, + MajorGroupName = string.IsNullOrEmpty(a.专业组) ? "" : a.专业组.Trim(), + MajorName = a.专业名称.Trim(), + MajorCode = a.专业代码, + PlanCount = int.Parse(a.投档计划数), + LowSection = int.Parse(a.最低位次), + LowScore = lowsectionscore + }); + } + }); + + await newbejson.InsertManyAsync(zy_fusionlist); + // 使用 MemoryStream 保存 Excel 数据 + var stream = new MemoryStream(); + // 异步创建 Excel 文件 + await Task.Run(() => MiniExcel.SaveAs(stream, zy_fusionlist)); + // 重置流的位置为开始 + stream.Position = 0; + var deletePath2 = Path.Combine(_uploadDirectory, dto.FusionFilePath); + System.IO.File.Delete(deletePath2); + // 返回 FileStreamResult,同时指定内容类型和文件名 + return new FileStreamResult(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + { + FileDownloadName = string.Format("{0}_{1}_exprot.xlsx", dto.ProvinceCode, dto.Year) + }; + } + + + + + + /// + /// 院校专业组批次线导入(带院校组) + /// + /// + /// + [ApiDescriptionSettings(Name = "ExportGroup"), HttpGet] + [DisplayName("ExportGroup")] + public async Task ExportGroup([Required][FromQuery] ZYFusionRequestDto dto) + { + var zy_fusionlist = new List(); + var filePath2 = await UtilExcelExt.GetFileByIdAsync(_uploadDirectory, dto.FusionFilePath); + //愿投档表 + var fusionlist = InputExcelUtil.InputExcel(filePath2); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var newbejson = dbclient.GetCollection(string.Format("fusion_{0}_{1}", dto.ProvinceCode, dto.Year)); + var scoresetionjson = dbclient.GetCollection(string.Format("scoresection_{0}_{1}", dto.ProvinceCode, dto.Year)); + var oneScorelist = await scoresetionjson.Find(new BsonDocument()).ToListAsync(); + var oldjsons = await newbejson.Find(new BsonDocument()).ToListAsync(); + fusionlist.ForEach(a => + { + if (!string.IsNullOrWhiteSpace(a.投档线)) + { + int touscore = a.投档线.Contains("及以上") ? 580 : int.Parse(a.投档线); + int type = CalcuScoreFinder.ChangeSubjectName(a.类型); + var lowpostion = CalcuScoreFinder.FindPostion(touscore, oneScorelist); + zy_fusionlist.Add(new ZyFusionResponseDto + { + Type = type, + LowScore = touscore, + LowSection = lowpostion, + UniversityCode = a.院校专业组代码, + UniversityName = a.院校名称, + MajorGroupName = a.院校专业组, + ProviceCode = dto.ProvinceCode + }); + } + }); + + await newbejson.InsertManyAsync(zy_fusionlist); + // 使用 MemoryStream 保存 Excel 数据 + var stream = new MemoryStream(); + // 异步创建 Excel 文件 + await Task.Run(() => MiniExcel.SaveAs(stream, zy_fusionlist)); + // 重置流的位置为开始 + stream.Position = 0; + var deletePath2 = Path.Combine(_uploadDirectory, dto.FusionFilePath); + System.IO.File.Delete(deletePath2); + // 返回 FileStreamResult,同时指定内容类型和文件名 + return new FileStreamResult(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + { + FileDownloadName = string.Format("{0}_{1}_exprot.xlsx", dto.ProvinceCode, dto.Year) + }; + } + + + + /// + /// 河南招生计划最新数据更新特例(不通用) + /// + /// + [ApiDescriptionSettings(Name = "HENANTSyncNewPlanData"), HttpGet] + [DisplayName("HENANTSyncNewPlanData")] + public async Task HENANTSyncNewPlanData([FromQuery] ZYFusionRequestDto dto) + { + var filePath2 = await UtilExcelExt.GetFileByIdAsync(_uploadDirectory, dto.FusionFilePath); + //投档表 + var fusionlist = InputExcelUtil.InputExcel(filePath2); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var newbejson = dbclient.GetCollection(string.Format("zsplanpro_{0}_{1}", dto.ProvinceCode, dto.Year)); + var universityjson = dbclient.GetCollection("university"); + var universitylist = await universityjson.Find(new BsonDocument()).ToListAsync(); + var zyfusionlist = await newbejson.Find(new BsonDocument()).ToListAsync(); + var updateModels = new List>(); + + foreach (var item in zyfusionlist) + { + var matchingFusionItems = fusionlist.Where(f => + f.全国统一招生代码.Trim() == item.universityCode && + f.批次 == item.batchName && f.科类 == item.selectsubject && + (f.专业代码 == item.majorcode) + ).ToList(); + + if (matchingFusionItems.Count == 1) + { + var matchingItem = matchingFusionItems.First(); + var newLowScore = int.Parse(matchingItem.最低分); + var newLowSection = int.Parse(matchingItem.最低位次); + var filter = Builders.Filter.Eq(x => x._id, item._id); + var update = Builders.Update + .Set(x => x.lowscore, newLowScore) + .Set(x => x.lowscorerank, newLowSection); + + var updateModel = new UpdateOneModel(filter, update); + updateModels.Add(updateModel); + } + } + + if (updateModels.Count > 0) + { + await newbejson.BulkWriteAsync(updateModels); + } + + } + + + + /// + /// 河南特例构造zsplanfusion + /// + /// + /// + [ApiDescriptionSettings(Name = "HNCreatezsplanfusion"), HttpGet] + [DisplayName("HNCreatezsplanfusion")] + public async Task HNCreatezsplanfusion([FromQuery] ZYFusionRequestDto dto) + { + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var zsplanpro = dbclient.GetCollection(string.Format("zsplanpro_{0}_{1}", dto.ProvinceCode, dto.Year)); + var newzsplanfusions = dbclient.GetCollection(string.Format("zsplanfusion_{0}_{1}", dto.ProvinceCode, dto.Year)); + var zsplanprolist = await zsplanpro.Find(new BsonDocument()).ToListAsync(); + var newfusionslist = new List(); + var bejson = dbclient.GetCollection("zsplanfusion_410000"); + var oldbaseuniversity = await bejson.Find(new BsonDocument()).ToListAsync(); + int pid = 0; + zsplanprolist.ForEach(a => + { + pid++; + string subjecttype = a.selectsubject; + var blist = oldbaseuniversity.Where(e => e.universityName == a.universityName && e.majorName == a.major && e.subjectType == a.selectsubject); + var baseinfo = new OldzsplanfusionDto(); + if (blist.Any()) + { + baseinfo = blist.FirstOrDefault(); + + newfusionslist.Add(new zsplanfusionDto() + { + pid = pid, + city = blist.Any() ? baseinfo.city : "", + educationCategory = blist.Any() ? baseinfo.educationCategory : "", + enrollmentType = "普通计划", + firstType = blist.Any() ? baseinfo.firstType : "", + lnstitutionalLevel = blist.Any() ? baseinfo.lnstitutionalLevel : "", + mjaorLevel = blist.Any() ? baseinfo.mjaorLevel : "", + nature = blist.Any() ? baseinfo.nature : "", + ownership = blist.Any() ? baseinfo.ownership : "", + phDMajor = blist.Any() ? baseinfo.phDMajor : "", + professionalAssessment = blist.Any() ? baseinfo.professionalAssessment : "", + province = blist.Any() ? baseinfo.province : "", + academicYear = a.academic, + batchName = a.batchName, + fee = a.fee, + location = a.location, + majorCode = a.majorcode, + remark = a.remark, + universityName = a.universityName, + enrollmentCode = a.universityCode, + subjectType = subjecttype, + _24subject = a.selectsubject, + _Score = a.lowscore, + _ScoreLine = a.lowscorerank, + majorName = baseinfo.majorName, + majorGroup = baseinfo.majorGroup, + _21Count = baseinfo._21Count, + _21Score = baseinfo._21Score, + _21ScoreLine = baseinfo._21ScoreLine, + _22Count = baseinfo._22Count, + _22Score = baseinfo._22Score, + _22ScoreLine = baseinfo._22ScoreLine, + _23Count = baseinfo._23Count, + _23Score = baseinfo._23Score, + _23ScoreLine = baseinfo._23ScoreLine, + _23subject = baseinfo._23subject, + }); + + } + }); + + await newzsplanfusions.InsertManyAsync(newfusionslist); + + + } + + + /// + /// 招生计划数据融合(河南)投档计划数加招生计划 + /// + /// + /// + [ApiDescriptionSettings(Name = "HeNanPlanProExport"), HttpGet] + [DisplayName("HeNanPlanProExport")] + public async Task HeNanPlanProExport([Required][FromQuery] ZsHeNanPlanProExcelRequestInput dto) + { + var zsplanpro = new List(); + var filePath1 = await UtilExcelExt.GetFileByIdAsync(_uploadDirectory, dto.fileName1); + var sheetNames = MiniExcel.GetSheetNames(Path.Combine(_uploadDirectory, dto.fileName1)); + string firstSheetName = sheetNames[0]; + //第一志愿投档表 + var toudanglist = InputExcelUtil.InputExcel(filePath1, firstSheetName); + var filePath2 = await UtilExcelExt.GetFileByIdAsync(_uploadDirectory, dto.fileName2); + var sheetNames2 = MiniExcel.GetSheetNames(Path.Combine(_uploadDirectory, dto.fileName2)); + string firstSheetName2 = sheetNames2[0]; + //招生计划表 + var zsplanslist = InputExcelUtil.InputExcel(filePath2, firstSheetName2); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var newbejson = dbclient.GetCollection(string.Format("zsplanpro_{0}_{1}", dto.ProvinceCode, dto.Year)); + var universityjson = dbclient.GetCollection("university"); + var universitylist = await universityjson.Find(new BsonDocument()).ToListAsync(); + + zsplanslist.ForEach(a => + { + var universityinfo = universitylist.Where(e => e.name == a.院校名称.Trim()); + long _uid = universityinfo.Any() ? universityinfo.FirstOrDefault()._id : 0; + var tongdang = toudanglist.Where(e => e.院校名称 == a.院校名称.Trim()); + int lowscore = tongdang.Any() ? int.Parse(tongdang.FirstOrDefault().最低分) : 0; + int lowsection = tongdang.Any() ? int.Parse(tongdang.FirstOrDefault().最低位次) : 0; + zsplanpro.Add(new PlanProResponseDto() + { + academic = a.学制, + batchName = a.批次, + remark = a.选科要求,//河南招生计划无此列所以用选课代替备注 + fee = a.学费, + location = dto.ProvinceCode, + major = a.专业名称, + majorcode = a.专业代码, + plancount = string.IsNullOrEmpty(a.计划人数) ? 0 : int.Parse(a.计划人数), + universityName = a.院校名称.Trim(), + universityCode = a.院校代码, + selectsubject = a.类型, + majorgroupname = string.Empty, + _uid = _uid, + years = a.年份, + lowscore = lowscore, + lowscorerank = lowsection + }); + + }); + await newbejson.InsertManyAsync(zsplanpro); + var stream = new MemoryStream(); + // 异步创建 Excel 文件 + await Task.Run(() => MiniExcel.SaveAs(stream, zsplanpro)); + // 重置流的位置为开始 + stream.Position = 0; + var deletePath1 = Path.Combine(_uploadDirectory, dto.fileName1); + System.IO.File.Delete(deletePath1); + var deletePath2 = Path.Combine(_uploadDirectory, dto.fileName2); + System.IO.File.Delete(deletePath2); + // 返回 FileStreamResult,同时指定内容类型和文件名 + return new FileStreamResult(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + { + FileDownloadName = string.Format("zsplanpro_{0}_{1}_exprot.xlsx", dto.ProvinceCode, dto.Year) + }; + } + + + + /// + /// 招生计划数据融合(不带专业组) + /// + /// + [ApiDescriptionSettings(Name = "ZsPlanProExport"), HttpGet] + [DisplayName("ZsPlanProExport")] + public async Task ZsPlanProExport([Required][FromQuery] ZsPlanProExcelRequestInput dto) + { + var zsplanpro = new List(); + var filePath = await UtilExcelExt.GetFileByIdAsync(_uploadDirectory, dto.fileName); + // 处理数据 + var onelist = InputExcelUtil.InputExcel(filePath); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var zyfusionbejson = dbclient.GetCollection(string.Format("fusion_{0}_{1}", dto.ProvinceCode, dto.Year)); + var zyfusionlist = await zyfusionbejson.Find(new BsonDocument()).ToListAsync(); + var universityjson = dbclient.GetCollection("university"); + var universitylist = await universityjson.Find(new BsonDocument()).ToListAsync(); + var newbejson = dbclient.GetCollection(string.Format("zsplanpro_{0}_{1}", dto.ProvinceCode, dto.Year)); + + var oldjsons = await newbejson.Find(new BsonDocument()).ToListAsync(); + onelist.ForEach(a => + { + var universityinfo = universitylist.Where(e => e.name == a.院校名称.Trim()); + long _uid = universityinfo.Any() ? universityinfo.FirstOrDefault()._id : 0; + var zyfusioninfo = zyfusionlist.Where(e => e.UniversityName == a.院校名称.Trim() && a.批次 == dto.BatchName && (e.MajorName.Contains(a.专业名称) || a.专业名称.Contains(e.MajorName))); + int lowscore = zyfusioninfo.Any() ? zyfusioninfo.FirstOrDefault().LowScore : 0; + int lowsection = zyfusioninfo.Any() ? zyfusioninfo.FirstOrDefault().LowSection : 0; + + if (!oldjsons.Any(e => e.universityName.Equals(a.院校名称.Trim()) && e.major.Equals(a.专业名称.Trim()) && e.batchName.Equals(a.批次))) + { + zsplanpro.Add(new PlanProResponseDto() + { + academic = a.学制, + batchName = a.批次, + remark = a.类型, + fee = a.学费, + location = dto.ProvinceCode, + major = a.专业名称, + majorcode = a.专业代码, + plancount = string.IsNullOrEmpty(a.计划人数) ? 0 : int.Parse(a.计划人数), + universityName = a.院校名称.Trim(), + universityCode = a.院校代码, + selectsubject = a.选科要求, + majorgroupname = string.Empty, + _uid = _uid, + years = a.年份, + lowscore = lowscore, + lowscorerank = lowsection + }); + } + }); + + await newbejson.InsertManyAsync(zsplanpro); + // 使用 MemoryStream 保存 Excel 数据 + var stream = new MemoryStream(); + // 异步创建 Excel 文件 + await Task.Run(() => MiniExcel.SaveAs(stream, zsplanpro)); + // 重置流的位置为开始 + stream.Position = 0; + var deletePath1 = Path.Combine(_uploadDirectory, dto.fileName);//上传完了删除不需要的缓存文件 + System.IO.File.Delete(deletePath1); + // 返回 FileStreamResult,同时指定内容类型和文件名 + return new FileStreamResult(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + { + FileDownloadName = string.Format("zsplanpro_{0}_{1}_exprot.xlsx", dto.ProvinceCode, dto.Year) + }; + } + + + /// + /// 招生计划数据融合(投档线没有专业的) + /// + /// + /// + [ApiDescriptionSettings(Name = "ZsShPlanProExport"), HttpGet] + [DisplayName("ZsShPlanProExport")] + public async Task ZsShPlanFusionModel([FromQuery] ZsPlanProExcelRequestInput dto) + { + + var zsplanpro = new List(); + var filePath = await UtilExcelExt.GetFileByIdAsync(_uploadDirectory, dto.fileName); + // 处理数据 + var onelist = InputExcelUtil.InputExcel(filePath); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var zyfusionbejson = dbclient.GetCollection(string.Format("fusion_{0}_{1}", dto.ProvinceCode, dto.Year)); + var zyfusionlist = await zyfusionbejson.Find(new BsonDocument()).ToListAsync(); + var universityjson = dbclient.GetCollection("university"); + var universitylist = await universityjson.Find(new BsonDocument()).ToListAsync(); + var newbejson = dbclient.GetCollection(string.Format("zsplanpro_{0}_{1}", dto.ProvinceCode, dto.Year)); + + var oldjsons = await newbejson.Find(new BsonDocument()).ToListAsync(); + onelist.ForEach(a => + { + var universityinfo = universitylist.Where(e => e.name == a.院校.Trim()); + long _uid = universityinfo.Any() ? universityinfo.FirstOrDefault()._id : 0; + var zyfusioninfo = new List(); + int type = CalcuScoreFinder.ChangeSubjectName(a.类型); + if (!string.IsNullOrWhiteSpace(a.专业组)) + { + zyfusioninfo = zyfusionlist.Where(e => e.UniversityName == a.院校.Trim() && e.UniversityCode == a.专业组 && e.Type == type).ToList(); + } + else + { + zyfusioninfo = zyfusionlist.Where(e => e.UniversityName == a.院校.Trim() && e.UniversityCode == a.院校代码 && e.Type == type).ToList(); + } + int lowscore = zyfusioninfo.Any() ? zyfusioninfo.FirstOrDefault().LowScore : 0; + int lowsection = zyfusioninfo.Any() ? zyfusioninfo.FirstOrDefault().LowSection : 0; + if (!oldjsons.Any(e => e.universityName.Equals(a.院校.Trim()))) + { + // string name = !string.IsNullOrWhiteSpace(a.专业组) ? string.Format("{0}({1})", a.院校, a.专业组.Substring(3, 2)) : ""; + zsplanpro.Add(new PlanProResponseDto() + { + academic = a.学制, + batchName = a.批次, + remark = a.专业备注, + fee = a.学费, + location = dto.ProvinceCode, + major = a.专业名称, + majorcode = a.专业代码, + plancount = string.IsNullOrEmpty(a.计划数) ? 0 : int.Parse(a.计划数), + universityName = a.院校.Trim(), + universityCode = a.院校代码, + majorgroupname = a.专业组, + selectsubject = a.科目要求, + selecttype = type, + _uid = _uid, + years = dto.Year, + lowscore = lowscore, + lowscorerank = lowsection + }); + } + }); + + await newbejson.InsertManyAsync(zsplanpro); + // 使用 MemoryStream 保存 Excel 数据 + var stream = new MemoryStream(); + // 异步创建 Excel 文件 + await Task.Run(() => MiniExcel.SaveAs(stream, zsplanpro)); + // 重置流的位置为开始 + stream.Position = 0; + var deletePath1 = Path.Combine(_uploadDirectory, dto.fileName);//上传完了删除不需要的缓存文件 + System.IO.File.Delete(deletePath1); + // 返回 FileStreamResult,同时指定内容类型和文件名 + return new FileStreamResult(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + { + FileDownloadName = string.Format("zsplanpro_{0}_{1}_exprot.xlsx", dto.ProvinceCode, dto.Year) + }; + + } + + + + + + + + + /// + /// 融合总表数据 + /// + /// + /// + [ApiDescriptionSettings(Name = "ZsPlanFusionModel"), HttpGet] + [DisplayName("ZsPlanFusionModel")] + public async Task ZsPlanFusionModel([FromQuery] ZsPlanProExcelRequestInput dto) + { + var newlist = new List(); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var newplanmodels = dbclient.GetCollection(string.Format("zsplanfusionmodel_{0}_{1}", dto.ProvinceCode, dto.Year)); + var zsplanfusionmodels = dbclient.GetCollection(string.Format("zsplanfusion_{0}_{1}", dto.ProvinceCode, dto.Year)); + var zyfusionlist = await zsplanfusionmodels.Find(new BsonDocument()).ToListAsync(); + var newbejson = dbclient.GetCollection(string.Format("zsplanpro_{0}_{1}", dto.ProvinceCode, dto.Year)); + var oldplanpro = await newbejson.Find(new BsonDocument()).ToListAsync(); + var universityjson = dbclient.GetCollection("university"); + var universitylist = universityjson.Find(new BsonDocument()).ToList(); + var namesjsons = dbclient.GetCollection("changeuniversityname_2024"); + var nameslist = namesjsons.Find(new BsonDocument()).ToList(); + + zyfusionlist.ForEach(a => + { + var aa = nameslist; + if (nameslist.Any(e => e.olduniversityName == a.universityName)) + { + a.universityName = nameslist.FirstOrDefault(e => e.olduniversityName.Equals(a.universityName)).newuniversityName; + } + }); + + int pid = 0; + oldplanpro.ForEach(a => + { + pid++; + var major = UtilExcelExt.RemoveBracketContent(a.major); + var zzz = zyfusionlist.FirstOrDefault(b => b.universityName == a.universityName && (UtilExcelExt.RemoveBracketContent(b.majorName) == major || UtilExcelExt.AreBracketKeywordsFullyMatching(a.major, b.majorName))); + var umodels = universitylist.Where(e => e.name == a.universityName).FirstOrDefault(); + var models = new zsplanfusionmodel() + { + academicYear = a.academic, + batchName = a.batchName, + province = umodels?.provinceName, + city = umodels?.cityName, + educationCategory = umodels != null ? (umodels?.level == 0 ? "本科" : "专科") : "", + enrollmentCode = a.universityCode, + enrollmentType = zzz != null ? zzz?.enrollmentType : !string.IsNullOrWhiteSpace(a.remark) ? a.remark.Contains("中外") ? "中外合作" : "普通计划" : "普通计划", + features = umodels?.features, + fee = a.fee, + firstType = zzz?.firstType, + location = a.location, + majorCode = a.majorcode, + majorGroup = a?.majorgroupname, + majorName = a.major, + nature = umodels?.nature, + pid = pid, + universityName = a.universityName, + + remark = a?.remark, + items = zzz != null ? new List() + { new PlanItem(){ + year="2023", + count=zzz._23Count, + planCount=zzz._23Count, + rankLine=zzz._23ScoreLine, + score = zzz._23Score, + }, + new PlanItem(){ + year="2022", + count=zzz._22Count, + planCount=zzz._22Count, + rankLine=zzz._22ScoreLine, + score = zzz._22Score, + }, + new PlanItem(){ + year="2021", + count=zzz._21Count, + planCount=zzz._21Count, + rankLine=zzz._21ScoreLine, + score = zzz._21Score, + }, + } : null, + ownership = zzz?.ownership, + phDMajor = zzz?.phDMajor, + planCount = a.plancount.Value, + professionalAssessment = zzz?.professionalAssessment, + subjectType = (umodels != null && umodels.utype.Count() > 0) ? string.Join(',', umodels?.utype) : "", + _24subject = a?.selectsubject, + _23subject = zzz?._23subject, + subjects = CalcuScoreFinder.GetSubjects(a?.selectsubject), + _score = a.lowscore.Value, + rankLine = a.lowscorerank.Value + }; + newlist.Add(models); + }); + newlist.ForEach(a => + { + if (a._score > 0) + { + a._schoolScore = newlist.Where(e => e.universityName == a.universityName).Min(s => s._score); + a._schoolScoreLine = newlist.Where(e => e.universityName == a.universityName).Max(s => s.rankLine); + a._schoolAvgScore = newlist.Where(e => e.universityName == a.universityName).Average(s => s._score).ToInt(); + a._schoolAvgLine = newlist.Where(e => e.universityName == a.universityName).Average(s => s.rankLine).ToInt(); + } + }); + + + await newplanmodels.InsertManyAsync(newlist); + // 使用 MemoryStream 保存 Excel 数据 + var stream = new MemoryStream(); + // 异步创建 Excel 文件 + await Task.Run(() => MiniExcel.SaveAs(stream, newlist)); + // 重置流的位置为开始 + stream.Position = 0; + + // 返回 FileStreamResult,同时指定内容类型和文件名 + return new FileStreamResult(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + { + FileDownloadName = string.Format("zsplanpro_{0}_{1}_{2}.xlsx", dto.ProvinceCode, dto.Year, DateTime.Now.ToString("yyyyMMddHHssfff")) + }; + } + + + + + + /// + /// 获取爬虫数据 + /// + /// + [ApiDescriptionSettings(Name = "SyncZsGAOkaoSpNames"), HttpPost] + [DisplayName("SyncZsGAOkaoSpNames")] + public async Task SyncZsGAOkaoSpNames([FromBody] SpiderReuqestDto spider) + { + if (spider.year != "ycymedu") return; + + try + { + var signList = new string[] + { + "7566ed0f85620b2ee9209ffbcb1e3cf8", "5645e7fccefa6b00765bbce9410c2980", + "dde40190bdada0441ccc2754f7745860", "4989a2c77678b43d07415517bc0e52b1", + "8677cd6fac0669faed4bafd0a6bce3ab", "d6e067428e2280b5a4ea7cefbd6b3a28", + "0e19fe352eaaf7986433630fe29d09f1", "24ca073fe53938fb44bb0546a34deeae" + }; + + var dbClient = _mongoRepository.Context.GetDatabase("zhiyuan"); + // string jsonString = await "https://api.static.ycymedu.com/api/v1/gaokaotype01.json".GetStringAsync(); + string jsonString = await "https://api.static.ycymedu.com/api/v1/gaokaoplanrules.json".GetStringAsync(); + var root = System.Text.Json.JsonSerializer.Deserialize(jsonString); + + var typeData = root?.data.newsdata.type; + if (typeData == null) return; + var universityCollection = dbClient.GetCollection("gaokaodatanames"); + var gaokaoDataNames = await universityCollection.Find(FilterDefinition.Empty).ToListAsync(); + + var random = new Random(); + + foreach (var keyValue in typeData) + { + var keyParts = keyValue.Key.Split('_'); + if (keyParts.Length != 2) continue; + + string locationCode = keyParts[0]; + string year = keyParts[1]; + string dbName = $"spnames_{locationCode}_{year}"; + + var newbeJson = dbClient.GetCollection(dbName); + if (await newbeJson.Find(FilterDefinition.Empty).AnyAsync()) continue; + + var list = new List(); + + foreach (var localTypeId in keyValue.Value) + { + foreach (var school in gaokaoDataNames.OrderBy(e => e.school_id)) + { + try + { + string url = $"https://static-data.gaokao.cn/www/2.0/school/{school.school_id}/dic/specialplan.json?a=www.gaokao.cn"; + string staticurl = await url.GetStringAsync(); + // 反序列化 + var result = JsonSerializer.Deserialize(staticurl); + // 示例:取出某个省份的所有年份 + var batchtypeitems = result?.data?.newsdata?.batch?.GetValueOrDefault($"{keyValue.Key}_{localTypeId}"); + + if (batchtypeitems == null) continue; + + foreach (var b in batchtypeitems) + { + int signIndex = random.Next(signList.Length); + + int delay = random.Next(1500, 2200); // 3~6秒随机间隔 + await Task.Delay(delay); + string baseUrl = $"https://api.zjzw.cn/web/api/?like_spname=&local_batch_id={b}&local_province_id={locationCode.Replace("0000", "")}&local_type_id={localTypeId}&page=1&school_id={school.school_id}&size=10&sp_xuanke=&special_group=&uri=apidata/api/gkv3/plan/school&year={year}&signsafe={signList[signIndex]}"; + + var sonamesresult = await baseUrl.GetStringAsync(); + var spNamesObject = Newtonsoft.Json.JsonConvert.DeserializeObject(sonamesresult); + if (spNamesObject?.code != "0000" || spNamesObject.data?.item == null) + { + + } + else + { + if (spNamesObject.data.item.Any()) + { + list.AddRange(spNamesObject.data.item); + } + // 计算总页数 + int totalPages = (int)Math.Ceiling((double)spNamesObject.data.numFound / 10); + for (int page = 2; page <= totalPages; page++) + { + try + { + await Task.Delay(random.Next(800, 1600)); // 再次延迟,防止请求过快 + string pageUrl = $"https://api.zjzw.cn/web/api/?like_spname=&local_batch_id={b}&local_province_id={locationCode.Replace("0000", "")}&local_type_id={localTypeId}&page={page}&school_id={school.school_id}&size=10&sp_xuanke=&special_group=&uri=apidata/api/gkv3/plan/school&year={year}&signsafe={signList[signIndex]}"; + var pageresult = await pageUrl.GetStringAsync(); + var pageData = Newtonsoft.Json.JsonConvert.DeserializeObject(pageresult); + if (pageData?.code == "0000" && pageData.data?.item != null) + { + list.AddRange(pageData.data.item); + } + } + catch (Exception ex) + { + Console.WriteLine($"分页请求失败: {ex.Message},跳过 Page {page}"); + } + } + } + } + ; + } + catch (Exception ex) + { + Console.WriteLine($"请求失败: {ex.Message},跳过当前 SchoolId {school.school_id}"); + } + + } + } + + if (list.Any()) + { + var university = dbClient.GetCollection("university"); + var universitylist = await university.Find(new BsonDocument()).ToListAsync(); + var universityDict = universitylist + .Where(u => !string.IsNullOrEmpty(u.name)) + .ToDictionary(u => u.name, u => u._id); + list.ForEach(a => + { + a.school_id = universityDict.TryGetValue(a.name, out var universityId) ? universityId : 0; + }); + + await newbeJson.InsertManyAsync(list); + DingDingHook.DingTalkHookMessage("抓取数据成功!!", $"{dbName} 数据插入成功"); + } + + // 每个大循环间隔一段时间,避免请求过于密集 + await Task.Delay(1000); // 10 秒 + } + } + catch (Exception ex) + { + Console.WriteLine($"抓取过程发生异常: {ex.Message}"); + DingDingHook.DingTalkHookMessage("抓取数据异常!!", "抓取数据异常停止"); + } + } + + + + /// + /// 抓取历年录取分数 + /// + /// + /// + [ApiDescriptionSettings(Name = "SyncZsGAOkaoSpNamesV2"), HttpPost] + [DisplayName("SyncZsGAOkaoSpNamesV2")] + public async Task SyncZsGAOkaoSpNamesV2([FromBody] SpiderReuqestDto spider) + { + if (spider.year != "ycymedu") return; + + try + { + var signList = new string[] + { + "7566ed0f85620b2ee9209ffbcb1e3cf8", "5645e7fccefa6b00765bbce9410c2980", + "dde40190bdada0441ccc2754f7745860", "4989a2c77678b43d07415517bc0e52b1", + "8677cd6fac0669faed4bafd0a6bce3ab", "d6e067428e2280b5a4ea7cefbd6b3a28", + "0e19fe352eaaf7986433630fe29d09f1", "24ca073fe53938fb44bb0546a34deeae" + }; + + + var dbClient = _mongoRepository.Context.GetDatabase("zhiyuan"); + string jsonString = await "https://api.static.ycymedu.com/api/v1/professionalscorerules.json".GetStringAsync(); + //string jsonString = "{\"code\":\"0000\",\"message\":\"成功\",\"data\":{\"newsdata\":{\"type\":{\"31_2022\":[3],\"31_2021\":[3]}}}}"; + var root = System.Text.Json.JsonSerializer.Deserialize(jsonString); + + var typeData = root?.data.newsdata.type; + if (typeData == null) return; + var universityCollection = dbClient.GetCollection("gaokaodatanames"); + var gaokaoDataNames = await universityCollection.Find(FilterDefinition.Empty).ToListAsync(); + + + + var random = new Random(); + + foreach (var keyValue in typeData) + { + var keyParts = keyValue.Key.Split('_'); + if (keyParts.Length != 2) continue; + string locationCode = keyParts[0]; + string year = keyParts[1]; + string dbName = $"professionalscore_{locationCode}_{year}"; + var newbeJson = dbClient.GetCollection(dbName); + if (await newbeJson.Find(FilterDefinition.Empty).AnyAsync()) continue; + + var list = new List(); + + foreach (var localTypeId in keyValue.Value) + { + foreach (var school in gaokaoDataNames.OrderBy(e => e.school_id)) + { + + try + { + + string url = $"https://static-data.gaokao.cn/www/2.0/school/{school.school_id}/dic/professionalscore.json?a=www.gaokao.cn"; + string staticurl = await url.GetStringAsync(); + // 反序列化 + var result = JsonSerializer.Deserialize(staticurl); + // 示例:取出某个省份的所有年份 + var batchtypeitems = result?.data?.newsdata?.batch?.GetValueOrDefault($"{keyValue.Key}_{localTypeId}"); + + if (batchtypeitems == null) continue; + + foreach (var b in batchtypeitems) + { + + int signIndex = random.Next(signList.Length); + int delay = random.Next(1500, 2200); // 3~6秒随机间隔 + await Task.Delay(delay); + + string baseUrl = $"https://api.zjzw.cn/web/api/?like_spname=&local_batch_id={b}&local_province_id={locationCode.Replace("0000", "")}&local_type_id={localTypeId}&page=1&school_id={school.school_id}&size=10&sp_xuanke=&special_group=&uri=apidata/api/gk/score/special&year={year}&signsafe={signList[signIndex]}"; + //https://api.zjzw.cn/web/api/?like_spname=&local_batch_id=10&local_province_id=31&local_type_id=3&page=1&school_id=669&sg_xuanke=&size=10&special_group=&uri=apidata/api/gk/score/special&year=2024&signsafe=fea045990c41860a270483168bd78b63 + var sonamesresult = await baseUrl.GetStringAsync(); + var spNamesObject = Newtonsoft.Json.JsonConvert.DeserializeObject(sonamesresult); + if (spNamesObject?.code != "0000" || spNamesObject.data?.item == null) continue; + if (spNamesObject.data.item.Any()) + { + list.AddRange(spNamesObject.data.item); + } + // 计算总页数 + int totalPages = (int)Math.Ceiling((double)spNamesObject.data.numFound / 10); + for (int page = 2; page <= totalPages; page++) + { + try + { + await Task.Delay(random.Next(800, 1600)); // 再次延迟,防止请求过快 + string pageUrl = $"https://api.zjzw.cn/web/api/?like_spname=&local_batch_id={b}&local_province_id={locationCode.Replace("0000", "")}&local_type_id={localTypeId}&page={page}&school_id={school.school_id}&size=10&sp_xuanke=&special_group=&uri=apidata/api/gk/score/special&year={year}&signsafe={signList[signIndex]}"; + var pageresult = await pageUrl.GetStringAsync(); + var pageData = Newtonsoft.Json.JsonConvert.DeserializeObject(pageresult); + if (pageData?.code == "0000" && pageData.data?.item != null) + { + list.AddRange(pageData.data.item); + } + } + catch (Exception ex) + { + Console.WriteLine($"分页请求失败: {ex.Message},跳过 Page {page}"); + } + } + } + } + catch (Exception ex) + { + Console.WriteLine($"请求失败: {ex.Message},跳过当前 SchoolId {school.school_id}"); + } + } + } + // } + + if (list.Any()) + { + var university = dbClient.GetCollection("university"); + var universitylist = await university.Find(new BsonDocument()).ToListAsync(); + var universityDict = universitylist + .Where(u => !string.IsNullOrEmpty(u.name)) + .ToDictionary(u => u.name, u => u._id); + list.ForEach(a => + { + a.school_id = universityDict.TryGetValue(a.name, out var universityId) ? universityId : 0; + }); + + await newbeJson.InsertManyAsync(list); + DingDingHook.DingTalkHookMessage("抓取数据成功!!", $"{dbName} 数据插入成功"); + } + + // 每个大循环间隔一段时间,避免请求过于密集 + await Task.Delay(150000); // 10 秒 + } + } + catch (Exception ex) + { + Console.WriteLine($"抓取过程发生异常: {ex.Message}"); + DingDingHook.DingTalkHookMessage("抓取数据异常!!", "抓取数据异常停止"); + } + } + + + + + + + /// + /// 同步zsplanfusion_数据 + /// + /// + /// + [ApiDescriptionSettings(Name = "SyncXueXiaoGaokao"), HttpPost] + [DisplayName("SyncXueXiaoGaokao")] + public async Task SyncXueXiaoGaokao([FromBody] SpiderReuqestDto spider) + { + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var xuexiaoDatu = dbclient.GetCollection("xuexingaokaouniveristys"); + + var universitychangeid = dbclient.GetCollection("universitychangeid"); + var universitychangeidlist = await universitychangeid.Find(new BsonDocument()).ToListAsync(); + if (spider.year == "ycymedu") + { + var xuelist = await xuexiaoDatu.Find(new BsonDocument()).ToListAsync(); + var luqudataUrl = "http://api.xuexingaokao.com/api/tool/major/detail?"; + string xid = spider.locationCode; + + var zsplanfusionmodels = dbclient.GetCollection($"zz_zsplanfusion_{xid}"); + var newlist = new ConcurrentBag(); + + var semaphore = new SemaphoreSlim(5, 5); // 限制最多 5 个并行任务 + var tasks = new List(); + + foreach (var u in xuelist) + { + tasks.Add(Task.Run(async () => + { + await semaphore.WaitAsync(); // 等待可用信号量 + try + { + string mainUrl = $"{luqudataUrl}cid={u._id}&pro={xid}&year=&subject=&batch=×tamp={DateTimeOffset.Now.ToUnixTimeSeconds()}"; + await Task.Delay(200); // 控制请求间隔 + string mainRequest = await mainUrl.GetStringAsync(); + var luqudata = Newtonsoft.Json.JsonConvert.DeserializeObject(mainRequest); + + if (luqudata?.code == 1 && luqudata.data.list.Any() && luqudata.data.configList.yearList.Any()) + { + foreach (var f in luqudata.data.configList.yearList) + { + foreach (var su in luqudata.data.configList.subjectList) + { + await Task.Delay(200); // 控制请求间隔 + try + { + string detailUrl = $"{luqudataUrl}cid={u._id}&pro={xid}&year={f.year}&subject={su.subject_id}&batch=×tamp={DateTimeOffset.Now.ToUnixTimeSeconds()}"; + string result = await detailUrl.GetStringAsync(); + var luqudatay = Newtonsoft.Json.JsonConvert.DeserializeObject(result); + + if (luqudatay?.code == 1 && luqudatay.data.list.Any()) + { + var lulist = luqudatay.data.list.Select(s => new newZsplanfusionDto() + { + b_college_name = s.b_college_name, + college_code = s.college_code, + college_id = s.college_id, + college_recruit_name = s.college_recruit_name, + enroll_num = s.enroll_num, + group_code = s.group_code, + group_name = s.group_name, + location = xid, + major_code = s.major_code, + major_memo = s.major_memo, + major_name = s.major_name, + post_score = s.post_score, + post_score_grading = s.post_score_grading, + rank_average = s.rank_average, + rank_max = s.rank_max, + rank_min = s.rank_min, + score_average = s.score_average, + score_max = s.score_max, + score_min = s.score_min, + second_subject = s.second_subject, + subject_id = su.subject_id.ToString(), + subject_name = su.subject_name, + volunteer_type = s.volunteer_type, + year = s.year + }).ToList(); + + foreach (var item in lulist) + { + if (universitychangeidlist.Any(e => e.newid == item.college_id)) + { + item.college_id = universitychangeidlist.Where(e => e.newid == item.college_id).FirstOrDefault().yid; + newlist.Add(item); + } + + } + } + } + catch (Exception ex) + { + Console.WriteLine($"请求失败,跳过:{ex.Message}"); + } + } + } + } + } + catch (Exception ex) + { + Console.WriteLine($"请求失败,跳过:{ex.Message}"); + } + finally + { + semaphore.Release(); // 释放信号量 + } + })); + } + + await Task.WhenAll(tasks); + + // 确保 newlist 不为空再插入 + if (!newlist.IsEmpty) + { + zsplanfusionmodels.InsertMany(newlist); + } + } + } + + + /// + ///同步院校详情页面 + /// + /// + /// + [ApiDescriptionSettings(Name = "SyncXueXiaoUniversity"), HttpPost] + [DisplayName("SyncXueXiaoUniversity")] + public async Task SyncXueXiaoUniversity([FromBody] SpiderReuqestDto spider) + { + string luqudataUrl = "http://api.xuexingaokao.com/api/college/base_college/collegeDetail?"; + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var universitychangeid = dbclient.GetCollection("universitychangeid"); + var universitydto = dbclient.GetCollection("university"); + + var universitychangeidlist = await universitychangeid.Find(new BsonDocument()).ToListAsync(); + var universitylist = await universitydto.Find(new BsonDocument()).ToListAsync(); + + if (spider.year == "ycymedu") + { + var semaphore = new SemaphoreSlim(3); // 限制最多同时进行 3 个请求 + var tasks = universitychangeidlist.Select(async a => + { + await semaphore.WaitAsync(); // 等待信号量 + try + { + await Task.Delay(300); // 控制请求间隔,避免太快 + string mainUrl = $"{luqudataUrl}college_id={a.newid}×tamp={DateTimeOffset.Now.ToUnixTimeSeconds()}"; + string mainRequest = await mainUrl.GetStringAsync(); + var luqudata = Newtonsoft.Json.JsonConvert.DeserializeObject(mainRequest); + + if (luqudata?.code == 1 && luqudata.data != null) + { + var result = luqudata.data; + if (result.tag != null) + { + var filter = Builders.Filter.Eq(u => u._id, a.yid); + var update = Builders.Update.Set(u => u.belong, result.tag.college_competent); + + await universitydto.UpdateOneAsync(filter, update); + } + } + } + catch (Exception ex) + { + Console.WriteLine($"请求失败 (college_id={a.newid}),跳过:{ex.Message}"); + } + finally + { + semaphore.Release(); // 释放信号量 + } + }); + + await Task.WhenAll(tasks); // 确保所有任务完成 + } + } + + + /// + /// 更新院校信息 + /// + /// + [ApiDescriptionSettings(Name = "SyncUniversityInfoUpdate"), HttpPost] + [DisplayName("SyncUniversityInfoUpdate")] + public async Task SyncUniversityInfoUpdate() + { + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var xuexiaoDatu = dbclient.GetCollection("xuexingaokaouniveristys"); + var xuelist = await xuexiaoDatu.Find(new BsonDocument()).ToListAsync(); + var university = dbclient.GetCollection("university"); + var universitylist = await university.Find(new BsonDocument()).ToListAsync(); + + + #region ################## 获取院校学院院系信息 ##################### + + //var facultys = dbclient.GetCollection("zfacultylist"); + //var list = new List(); + //var baseUrl = "https://static-data-ycymedu.oss-cn-shanghai.aliyuncs.com/college-faculty/"; + //xuelist.ForEach(a => + //{ + // var goUrl = $"{baseUrl}{a._id}.json".SetJsonSerialization().GetAsAsync().Result; + // if (goUrl.code == 1 && goUrl.data.facultyList.Any()) + // { + // var isany = universitylist.FirstOrDefault(e => e.name == goUrl.data.tag.college_name); + // if (isany != null) + // { + // goUrl.data.facultyList.ForEach(f => + // { + // f._id = YitIdHelper.NextId(); + // f.base_college_id = isany._id; + // f.subject.Select(s => s.base_college_id = isany._id); + + // }); ; + // var newmodels = goUrl.data.facultyList; + // if (newmodels.Any()) + // { + + // list.AddRange(newmodels); + + // } + // } + // } + //}); + //await facultys.InsertManyAsync(list); + + #endregion + + #region #####获取院校招生信息####### + // var baseUrl = "https://static-data-ycymedu.oss-cn-shanghai.aliyuncs.com/college-recruitlist/"; + // var recruits = dbclient.GetCollection("zrecruitlist"); + // var relist = new List(); + // xuelist.ForEach(a => + // { + // var goUrl = $"{baseUrl}{a._id}.json".SetJsonSerialization().GetAsAsync().Result; + // if (goUrl.code == 1 && goUrl.data.recruit.Any()) + // { + // var isany = universitylist.FirstOrDefault(e => e.name == goUrl.data.tag.college_name); + // if (isany != null) + // { + // goUrl.data.recruit.ForEach(f => + // { + // f.college_name = isany.name; + // f.base_college_id = isany._id; + // }); + // relist.AddRange(goUrl.data.recruit); + // } + // } + // }); + //await recruits.InsertManyAsync(relist); + #endregion + #region 获取院校招生详情######### + //var recruits = dbclient.GetCollection("zrecruitlist"); + //var result = await recruits.Find(new BsonDocument()).ToListAsync(); + //var baseUrl = "http://api.xuexingaokao.com/api/college/base_college/recruitDetail?recruit_id="; + //var recruitdetail = dbclient.GetCollection("zrecruitdetail"); + //var rdetail = await recruitdetail.Find(new BsonDocument()).ToListAsync(); + //result.ForEach(a => + //{ + // try + // { + // if (!rdetail.Any(e => e.id == a.id)) + // { + // Thread.Sleep(150); + // var goUrl = $"{baseUrl}{a.id}×tamp={DateTimeOffset.Now.ToUnixTimeSeconds()}".SetJsonSerialization().GetAsAsync().Result; + // if (goUrl != null && goUrl.code == 1 && goUrl.data.recruit != null) + // { + // var isany = universitylist.FirstOrDefault(e => e.name == goUrl.data.recruit.college_name); + // if (isany != null) + // { + // goUrl.data.recruit.base_college_id = isany._id; + // recruitdetail.InsertOne(goUrl.data.recruit); + // } + // } + // } + // } + // catch (Exception xx) + // { + // Console.WriteLine(xx.Message); + // } + //}); + + #endregion + + #region ########学科建设数据################# + // SubjectIntroduceData + var subjectIntroduceData = dbclient.GetCollection("zsubjectintroduces"); + var subjUrl = "https://static-data-ycymedu.oss-cn-shanghai.aliyuncs.com/college-subjectIntroduce/"; + xuelist.ForEach(a => + { + try + { + var goUrl = $"{subjUrl}{a._id}.json".GetJsonAsync().Result; + + if (goUrl.code == 1 && goUrl.data.data != null) + { + var isany = universitylist.FirstOrDefault(e => e.name == goUrl.data.tag.college_name); + if (isany != null) + { + var datamodel = goUrl.data.data; + datamodel.base_college_id = isany._id; + subjectIntroduceData.InsertOne(datamodel); + } + } + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + }); + #endregion + + + } + + + + /// + /// + /// + /// + [ApiDescriptionSettings(Name = "SyncMajorInfoUpdate"), HttpPost] + [DisplayName("SyncMajorInfoUpdate")] + public async Task SyncMajorInfoUpdate() + { + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var majorChild = dbclient.GetCollection("zmajorchild"); + + var list = new List(); + + #region #####################同步专业信息##################### + //var majorRoot = dbclient.GetCollection("zmajorroots"); + //var majorroots = await majorRoot.Find(new BsonDocument()).ToListAsync(); + //var firstUrl = "https://gaokao.chsi.com.cn/zyk/zybk/xkCategory/"; + //var scendUrl = "https://gaokao.chsi.com.cn/zyk/zybk/specialityesByCategory/"; + //var majorChild = dbclient.GetCollection("zmajorchild"); + + //var majoritems = new List(); + + //majorroots.ForEach(a => + //{ + // a.majorMsgs.ForEach(c => + // { + // var majorMsglist = $"{firstUrl}{c.key}?_t={DateTimeOffset.Now.ToUnixTimeSeconds()}".SetJsonSerialization().GetAsAsync().Result; + // if (majorMsglist.flag) + // { + // var items = new List(); + + // majorMsglist.msg.ForEach(m => + // { + // var newmosl = new GaokaoMajorMsgItems() + // { + // key = m.key, + // name = m.name + // }; + // var url = $"{scendUrl}{m.key}?_t={DateTimeOffset.Now.ToUnixTimeSeconds()}"; + // var majorMsgitems = url.SetJsonSerialization().GetAsAsync().Result; + // if (majorMsgitems.flag) + // { + // newmosl.childMajors = majorMsgitems.msg.ToList(); + // } + // items.Add(newmosl); + // }); + + // majoritems.Add(new GaoKaoMajorItemDto() + // { + // majorMsgs = items, + // type = c.key + // }); + // } + // }); + //}); + + //await majorChild.InsertManyAsync(majoritems); + #endregion + + #region #####专业详情###### + // var majordetail = dbclient.GetCollection("zmajordetailmsg"); + // var baseUrl = "https://gaokao.chsi.com.cn/zyk/zybk/specialityDetail/"; + //var result = await majorChild.Find(new BsonDocument()).ToListAsync(); + //result.ForEach(a => + //{ + + // a.majorMsgs.ForEach(b => + // { + // b.childMajors.ForEach(c => + // { + // Thread.Sleep(120); + + // var gourl = $"{baseUrl}{c.specId}?_t={DateTimeOffset.Now.ToUnixTimeSeconds()}"; + // var goresult = gourl.SetJsonSerialization().GetAsAsync().Result; + // if (goresult.flag) + // { + // majordetail.InsertOne(goresult.msg); + // } + // }); + // }); + //}); + + #endregion + + + #region ####专业详情关联课程###### + //var majormap = dbclient.GetCollection("zkskcmajormap"); + //var kskcUrl = "https://gaokao.chsi.com.cn/zyk/zybk/kskc/"; + //var result = await majorChild.Find(new BsonDocument()).ToListAsync(); + //result.ForEach(a => + //{ + // a.majorMsgs.ForEach(b => + // { + // b.childMajors.ForEach(c => + // { + // Thread.Sleep(120); + + // var gourl = $"{kskcUrl}{c.specId}?_t={DateTimeOffset.Now.ToUnixTimeSeconds()}"; + // var goresult = gourl.SetJsonSerialization().GetAsAsync().Result; + // if (goresult.flag) + // { + // var result = goresult.msg; + // result.specId = c.specId; + // majormap.InsertOne(result); + // } + // }); + // }); + //}); + #endregion + #region ########专业关联院校 + //var majormap = dbclient.GetCollection("zksyxmajormap"); + //var ksyxUrl = "https://gaokao.chsi.com.cn/zyk/zybk/ksyx?specId="; + //var result = await majorChild.Find(new BsonDocument()).ToListAsync(); + //result.ForEach(a => + //{ + // a.majorMsgs.ForEach(b => + // { + // b.childMajors.ForEach(c => + // { + // Thread.Sleep(120); + + // var gourl = $"{ksyxUrl}{c.specId}&_t={DateTimeOffset.Now.ToUnixTimeSeconds()}"; + // var goresult = gourl.SetJsonSerialization().GetAsAsync().Result; + // if (goresult.flag) + // { + // var result = goresult.msg; + // result.specId = c.specId; + // majormap.InsertOne(result); + // } + // }); + // }); + //}); + + + #endregion + + + #region ###########专业基础信息############## + + var majormap = dbclient.GetCollection("zbase_majors"); + var base_subjectUrl = "http://api.xuexingaokao.com/api/college/base_subject/detail?type=0&code="; + var result = await majorChild.Find(new BsonDocument()).ToListAsync(); + + var zbase_majors = await majormap.Find(new BsonDocument()).ToListAsync(); + result.ForEach(a => + { + a.majorMsgs.ForEach(b => + { + b.childMajors.ForEach(c => + { + //var isexist = zbase_majors.Where(e => e.subject_code_three == c.zydm); + //if (!isexist.Any()) + //{ + try + { + Thread.Sleep(120); + + var gourl = $"{base_subjectUrl}{c.zydm}×tamp={DateTimeOffset.Now.ToUnixTimeSeconds()}"; + var goresult = gourl.GetJsonAsync().Result; + if (goresult.code == 1 && goresult.data.subject != null) + { + goresult.data.subject.id = YitIdHelper.NextId(); + majormap.InsertOne(goresult.data.subject); + } + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + //} + }); + }); + }); + + + #endregion + + + + + } + + + /// + /// + /// + /// + /// + [ApiDescriptionSettings(Name = "CombianGaokaoInfo"), HttpPost] + [DisplayName("CombianGaokaoInfo")] + public async Task CombianGaokaoInfo([FromBody] SpiderReuqestDto spider) + { + var list = new List(); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + string dbName = $"professionalscore_{spider.locationCode}_{spider.year}"; + var professscorelist = dbclient.GetCollection(dbName); + var professscoreresult = await professscorelist.Find(new BsonDocument()).ToListAsync(); + string dbName2 = $"spnames_{spider.locationCode}_{spider.year}"; + var spNamelist = dbclient.GetCollection(dbName2); + var spNamelistresult = await spNamelist.Find(new BsonDocument()).ToListAsync(); + var dbnewName = $"plannewcombiandata_{spider.locationCode}_{spider.year}"; + var dbnewlist = dbclient.GetCollection(dbnewName); + foreach (var item in spNamelistresult) + { + var pinfo = professscoreresult.Any(e => e.school_id == item.school_id && e.local_batch_name == item.local_batch_name && e.sp_name == item.sp_name && e.zslx_name == item.zslx_name) ? professscoreresult.First(e => e.school_id == item.school_id && e.local_batch_name == item.local_batch_name && e.sp_name == item.sp_name && e.zslx_name == item.zslx_name) : null; + + if (pinfo == null) + { + pinfo = professscoreresult.Any(e => e.school_id == item.school_id && e.local_batch_name == item.local_batch_name && e.level3_name == item.sp_name && e.zslx_name == item.zslx_name) ? professscoreresult.Where(e => e.school_id == item.school_id && e.local_batch_name == item.local_batch_name && e.level3_name == item.sp_name && e.zslx_name == item.zslx_name).OrderBy(e => e.min).FirstOrDefault() : null; + //if (pinfo != null) + //{ + // var templist = professscoreresult.Where(e => e.school_id == item.school_id && e.local_batch_name == item.local_batch_name && e.level3_name == item.sp_name && e.zslx_name == item.zslx_name).ToList(); + //} + } + + + list.Add(new plannewCombianData() + { + average = pinfo?.average, + doublehigh = pinfo != null ? pinfo.doublehigh : 0, + dual_class_name = pinfo?.dual_class_name, + zslx_name = item.zslx_name, + sp_name = item.sp_name, + first_km = pinfo != null ? pinfo.first_km : 0, + info = item.info, + + is_score_range = pinfo != null ? pinfo.is_score_range : 0, + is_top = pinfo != null ? pinfo.is_top : 0, + level2_name = item.level2_name, + level3_name = item.level3_name, + local_batch_name = item.local_batch_name, + local_province_name = item.local_province_name, + local_type_name = item.local_type_name, + max = pinfo?.max, + min = pinfo != null ? pinfo.min : 0, + min_range = pinfo?.min_range, + min_rank_range = pinfo?.min_rank_range, + min_section = pinfo != null ? pinfo.min_section : 0, + name = item.name, + num = item.num, + proscore = pinfo?.proscore, + province_name = item.province_name, + school_id = item.school_id, + remark = item.remark, + sg_fxk = item.sg_fxk, + sg_info = item.sg_info, + sg_name = item.sg_name, + sg_sxk = item.sg_sxk, + sg_type = item.sg_type, + single = pinfo?.single, + spcode = item.spcode, + special_group = pinfo != null ? pinfo.special_group : 0, + special_id = pinfo != null ? pinfo.special_id : 0, + spe_id = pinfo != null ? pinfo.spe_id : 0, + spname = item.spname, + sp_fxk = item.sp_fxk, + sp_info = item.sp_info, + sp_scode = pinfo?.sp_scode, + sp_sxk = item.sp_sxk, + sp_type = pinfo != null ? pinfo.sp_type : 0, + sp_xuanke = item.sp_sxk, + tuition = item.tuition, + year = pinfo != null ? pinfo.year : 0, + + + }); + } + await dbnewlist.InsertManyAsync(list); + } + + + + + + /// + ///创建计划分数信息 + /// + /// + /// + [ApiDescriptionSettings(Name = "AddzsPlanNScores"), HttpPost] + [DisplayName("AddzsPlanNScores")] + public async Task AddzsPlanNScores([FromBody] SpiderReuqestDto spider) + { + var locationcode = spider.locationCode.Replace("0000", ""); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + + var professscorelist = dbclient.GetCollection($"professionalscore_{locationcode}_2024"); + var professscoreresult = await professscorelist.Find(new BsonDocument()).ToListAsync(); + + var professscorelist2 = dbclient.GetCollection($"professionalscore_{locationcode}_2023"); + var professscoreresult2 = await professscorelist2.Find(new BsonDocument()).ToListAsync(); + + var professscorelist3 = dbclient.GetCollection($"professionalscore_{locationcode}_2022"); + var professscoreresult3 = await professscorelist3.Find(new BsonDocument()).ToListAsync(); + + var professscorelist4 = dbclient.GetCollection($"professionalscore_{locationcode}_2021"); + var professscoreresult4 = await professscorelist4.Find(new BsonDocument()).ToListAsync(); + + + var planspnames2 = dbclient.GetCollection($"spnames_{locationcode}_2023"); + var planspnames3 = dbclient.GetCollection($"spnames_{locationcode}_2022"); + var planspnames4 = dbclient.GetCollection($"spnames_{locationcode}_2021"); + + var planspnameslist2 = await planspnames2.Find(new BsonDocument()).ToListAsync(); + var planspnameslist3 = await planspnames3.Find(new BsonDocument()).ToListAsync(); + var planspnameslist4 = await planspnames4.Find(new BsonDocument()).ToListAsync(); + + + var zsplanfusionCollection = dbclient.GetCollection($"zsplanfusionmodel_{spider.locationCode}_bak"); + var zsplanfusionTask = await zsplanfusionCollection.Find(new BsonDocument()).ToListAsync(); + + var unlist = new List(); + + + // 创建批量写入操作(可选,提高性能) + var bulkWrite = new List(); + foreach (var item in zsplanfusionTask) + { + var ninfo = new SpNameScoreItem(); + var ninfo2 = new SpNameScoreItem(); + var ninfo3 = new SpNameScoreItem(); + var ninfo4 = new SpNameScoreItem(); + var spname2 = new SpNameItem(); + var spname3 = new SpNameItem(); + var spname4 = new SpNameItem(); + var items = new List(); + var majorname = StringFilter.GetContentBeforeBrackets(item.majorName); + bool iszwhz = item.majorName.Contains("中外合作") || (!string.IsNullOrWhiteSpace(item.remark) && item.remark.Contains("中外合作")); + item.universityName = item.universityName.Replace("(", "(").Replace(")", ")"); + if (item.universityName == "山东大学威海分校") + { + item.universityName = "山东大学(威海)"; + } + ninfo = professscoreresult.Where(e => e.name == item.universityName && e.sp_name == majorname).WhereIF(iszwhz, e => e.zslx_name == "中外合作办学").FirstOrDefault(); + ninfo2 = professscoreresult2.Where(e => e.name == item.universityName && e.sp_name == majorname).WhereIF(iszwhz, e => e.zslx_name == "中外合作办学").FirstOrDefault(); + ninfo3 = professscoreresult3.Where(e => e.name == item.universityName && e.sp_name == majorname).WhereIF(iszwhz, e => e.zslx_name == "中外合作办学").FirstOrDefault(); + ninfo4 = professscoreresult4.Where(e => e.name == item.universityName && e.sp_name == majorname).WhereIF(iszwhz, e => e.zslx_name == "中外合作办学").FirstOrDefault(); + + spname2 = planspnameslist2.Where(e => e.name == item.universityName && e.sp_name == majorname).WhereIF(iszwhz, e => e.zslx_name == "中外合作办学").FirstOrDefault(); + spname3 = planspnameslist3.Where(e => e.name == item.universityName && e.sp_name == majorname).WhereIF(iszwhz, e => e.zslx_name == "中外合作办学").FirstOrDefault(); + spname4 = planspnameslist4.Where(e => e.name == item.universityName && e.sp_name == majorname).WhereIF(iszwhz, e => e.zslx_name == "中外合作办学").FirstOrDefault(); + + + if (ninfo != null) + { + if (ninfo.min > 0) + { + item._score = ninfo.min; + item.rankLine = ninfo.min_section; + } + if (!string.IsNullOrWhiteSpace(ninfo.sp_info)) + { + item._24subject = ninfo.sp_info; + } + items.Add(new PlanItem() + { + rankLine = ninfo.min_section, + planCount = item.planCount, + score = ninfo.min, + year = ninfo.year.ToString() + }); + } + + if (ninfo2 != null) + { + int pcount = 0; + if (spname2 != null) + { + pcount = spname2.num.ObjToInt(); + items.Add(new PlanItem() + { + rankLine = ninfo2.min_section, + planCount = pcount, + score = ninfo2.min, + year = spname2.year.ToString() + }); + } + + } + if (ninfo3 != null) + { + int pcount = 0; + if (spname3 != null) + { + pcount = spname3.num.ObjToInt(); + items.Add(new PlanItem() + { + rankLine = ninfo3.min_section, + planCount = pcount, + score = ninfo3.min, + year = spname3.year.ToString() + }); + } + + } + if (ninfo4 != null) + { + int pcount = 0; + if (spname4 != null) + { + pcount = spname4.num.ObjToInt(); + items.Add(new PlanItem() + { + rankLine = ninfo4.min_section, + planCount = pcount, + score = ninfo4.min, + year = spname4.year.ToString() + + }); + } + + } + if (items.Any()) + { + item.items = items; + } + + bulkWrite.Add(new zsplanfusionmodel() { + + // items= item.items, + // majorCode = item.majorCode, + // majorName = item.majorName, + // planCount = item.planCount, + // rankLine = item.rankLine, + // remark = item.remark, + // universityCode = item.universityCode, + // universityName = item.universityName, + // year = item.year, + // _24subject = item._24subject, + // _score = item._score, + // _id = item._id, + // _id2 = item._id2 + }); + + } + + // 执行批量写入(如果使用批量操作) + if (bulkWrite.Count > 0) + { + await zsplanfusionCollection.InsertManyAsync(bulkWrite); + } + + } + + + + + + + /// + /// 更新招生计划分数信息 + /// + /// + /// + [ApiDescriptionSettings(Name = "UpdatezsPlanNScores"), HttpPost] + [DisplayName("UpdatezsPlanNScores")] + public async Task UpdatezsPlanNScores([FromBody] SpiderReuqestDto spider) + { + var locationcode = spider.locationCode.Replace("0000", ""); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + + var professscorelist = dbclient.GetCollection($"professionalscore_{locationcode}_2024"); + var professscoreresult = await professscorelist.Find(new BsonDocument()).ToListAsync(); + + var professscorelist2 = dbclient.GetCollection($"professionalscore_{locationcode}_2023"); + var professscoreresult2 = await professscorelist2.Find(new BsonDocument()).ToListAsync(); + + var professscorelist3 = dbclient.GetCollection($"professionalscore_{locationcode}_2022"); + var professscoreresult3 = await professscorelist3.Find(new BsonDocument()).ToListAsync(); + + var professscorelist4 = dbclient.GetCollection($"professionalscore_{locationcode}_2021"); + var professscoreresult4 = await professscorelist4.Find(new BsonDocument()).ToListAsync(); + + + var planspnames2 = dbclient.GetCollection($"spnames_{locationcode}_2023"); + var planspnames3 = dbclient.GetCollection($"spnames_{locationcode}_2022"); + var planspnames4 = dbclient.GetCollection($"spnames_{locationcode}_2021"); + + var planspnameslist2 = await planspnames2.Find(new BsonDocument()).ToListAsync(); + var planspnameslist3 = await planspnames3.Find(new BsonDocument()).ToListAsync(); + var planspnameslist4 = await planspnames4.Find(new BsonDocument()).ToListAsync(); + + + var zsplanfusionCollection = dbclient.GetCollection($"zsplanfusionmodel_{spider.locationCode}_bak"); + var zsplanfusionTask = await zsplanfusionCollection.Find(new BsonDocument()).ToListAsync(); + + var unlist = new List(); + + + // 创建批量写入操作(可选,提高性能) + var bulkWrite = new List>(); + foreach (var item in zsplanfusionTask) + { + var ninfo = new SpNameScoreItem(); + var ninfo2 = new SpNameScoreItem(); + var ninfo3 = new SpNameScoreItem(); + var ninfo4 = new SpNameScoreItem(); + var spname2 = new SpNameItem(); + var spname3 = new SpNameItem(); + var spname4 = new SpNameItem(); + var items = new List(); + var majorname = StringFilter.GetContentBeforeBrackets(item.majorName); + bool iszwhz = item.majorName.Contains("中外合作") || (!string.IsNullOrWhiteSpace(item.remark) && item.remark.Contains("中外合作")); + item.universityName = item.universityName.Replace("(", "(").Replace(")", ")"); + if(item.universityName== "山东大学威海分校") + { + item.universityName = "山东大学(威海)"; + } + ninfo = professscoreresult.Where(e => e.name == item.universityName && e.sp_name == majorname).WhereIF(iszwhz, e => e.zslx_name == "中外合作办学").FirstOrDefault(); + ninfo2 = professscoreresult2.Where(e => e.name == item.universityName && e.sp_name == majorname).WhereIF(iszwhz, e => e.zslx_name == "中外合作办学").FirstOrDefault(); + ninfo3 = professscoreresult3.Where(e => e.name == item.universityName && e.sp_name == majorname).WhereIF(iszwhz, e => e.zslx_name == "中外合作办学").FirstOrDefault(); + ninfo4 = professscoreresult4.Where(e => e.name == item.universityName && e.sp_name == majorname).WhereIF(iszwhz, e => e.zslx_name == "中外合作办学").FirstOrDefault(); + + spname2 = planspnameslist2.Where(e => e.name == item.universityName && e.sp_name == majorname).WhereIF(iszwhz, e => e.zslx_name == "中外合作办学").FirstOrDefault(); + spname3 = planspnameslist3.Where(e => e.name == item.universityName && e.sp_name == majorname).WhereIF(iszwhz, e => e.zslx_name == "中外合作办学").FirstOrDefault(); + spname4 = planspnameslist4.Where(e => e.name == item.universityName && e.sp_name == majorname).WhereIF(iszwhz, e => e.zslx_name == "中外合作办学").FirstOrDefault(); + + + if (ninfo != null) + { + if (ninfo.min > 0) + { + item._score = ninfo.min; + item.rankLine = ninfo.min_section; + } + if (!string.IsNullOrWhiteSpace(ninfo.sp_info)) + { + item._24subject = ninfo.sp_info; + } + items.Add(new PlanItem() + { + rankLine = ninfo.min_section, + planCount = item.planCount, + score = ninfo.min, + year = ninfo.year.ToString() + }); + } + + if (ninfo2 != null) + { + int pcount = 0; + if (spname2 != null) + { + pcount = spname2.num.ObjToInt(); + items.Add(new PlanItem() + { + rankLine = ninfo2.min_section, + planCount = pcount, + score = ninfo2.min, + year = spname2.year.ToString() + }); + } + + } + if (ninfo3 != null) + { + int pcount = 0; + if (spname3 != null) + { + pcount = spname3.num.ObjToInt(); + items.Add(new PlanItem() + { + rankLine = ninfo3.min_section, + planCount = pcount, + score = ninfo3.min, + year = spname3.year.ToString() + }); + } + + } + if (ninfo4 != null) + { + int pcount = 0; + if (spname4 != null) + { + pcount = spname4.num.ObjToInt(); + items.Add(new PlanItem() + { + rankLine = ninfo4.min_section, + planCount = pcount, + score = ninfo4.min, + year = spname4.year.ToString() + + }); + } + + } + if (items.Any()) + { + item.items = items; + } + // 添加到批量操作列表 + bulkWrite.Add(new ReplaceOneModel( + Builders.Filter.Eq(doc => doc._id, item._id), + item) + { + IsUpsert = false // 设置为false表示不插入新文档,只替换存在的 + }); + } + + // 执行批量写入(如果使用批量操作) + if (bulkWrite.Count > 0) + { + await zsplanfusionCollection.BulkWriteAsync(bulkWrite); + } + + } + + + + + /// + /// 更新院校信息 + /// + /// + [ApiDescriptionSettings(Name = "UniversityInfoTabUpdate"), HttpPost] + [DisplayName("UniversityInfoTabUpdate")] + public async Task UniversityInfoTabUpdate([FromBody] ZsPlanProExcelRequestInput input) + { + //var filePath = await UtilExcelExt.GetFileByIdAsync(_uploadDirectory, input.fileName); + //var sheetNames = MiniExcel.GetSheetNames(Path.Combine(_uploadDirectory, input.fileName)); + // var fusionlist = InputExcelUtil.InputExcel(filePath, sheetNames[0]); + + + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var university = dbclient.GetCollection("university"); + var universitylist = await university.Find(new BsonDocument()).ToListAsync(); + + var zsplanfusionCollection = dbclient.GetCollection($"zsplanfusionmodel_310000"); + var zsplanfusionTask = await zsplanfusionCollection.Find(new BsonDocument()).ToListAsync(); + // 创建批量写入操作(可选,提高性能) + var bulkWrite = new List>(); + + foreach(var item in zsplanfusionTask) + { + var uinfo = universitylist.Where(e => e.name == item.universityName); + if (uinfo.Any()) + { + item.ownership = uinfo.FirstOrDefault().belong; + } + bulkWrite.Add(new ReplaceOneModel( + Builders.Filter.Eq(doc => doc._id, item._id), + item) + { + IsUpsert = false // 设置为false表示不插入新文档,只替换存在的 + }); + + + } + + // 执行批量写入(如果使用批量操作) + if (bulkWrite.Count > 0) + { + await zsplanfusionCollection.BulkWriteAsync(bulkWrite); + } + + } + + /// + /// + /// + /// + [ApiDescriptionSettings(Name = "SpscorenamesUNameIdUpdate"), HttpPost] + [DisplayName("SpscorenamesUNameIdUpdate")] + public async Task SpscorenamesUNameIdUpdate([FromBody] ZsPlanProExcelRequestInputV2 requestInputV2) + { + //var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + //var collection = dbclient.GetCollection(requestInputV2.locationCode); + //var filter = Builders.Filter.Exists("proscore"); + //var docs = await collection.Find(filter).ToListAsync(); + + //var bulkOps = new List>(); + + //foreach (var doc in docs) + //{ + // if (doc.Contains("proscore") && doc["proscore"].IsInt32) + // { + // var id = doc["_id"]; + // var intValue = doc["proscore"].AsInt32; + // var update = Builders.Update.Set("proscore", intValue.ToString()); + // var filterById = Builders.Filter.Eq("_id", id); + // bulkOps.Add(new UpdateOneModel(filterById, update)); + // } + //} + + //if (bulkOps.Count > 0) + //{ + // var result = await collection.BulkWriteAsync(bulkOps); + // Console.WriteLine($"Modified: {result.ModifiedCount}"); + //} + + + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var university = dbclient.GetCollection("university"); + var universitylist = await university.Find(new BsonDocument()).ToListAsync(); + + // 将 university 的 name 和 _id 映射成字典,便于查找 + var universityDict = universitylist + .Where(u => !string.IsNullOrEmpty(u.name)) + .ToDictionary(u => u.name, u => u._id); + + var newbeJson = dbclient.GetCollection($"spscorenames_{requestInputV2.locationCode}_{requestInputV2.year}_{requestInputV2.type}"); + var updatejons = await newbeJson.Find(new BsonDocument()).ToListAsync(); + + var bulkOps = new List>(); + + foreach (var item in updatejons) + { + if (!string.IsNullOrEmpty(item.name) && universityDict.TryGetValue(item.name, out var matchedId)) + { + var filter = Builders.Filter.Eq(x => x.id, item.id); + var update = Builders.Update.Set(x => x.school_id, matchedId); + bulkOps.Add(new UpdateOneModel(filter, update)); + } + } + + if (bulkOps.Count > 0) + { + var result = await newbeJson.BulkWriteAsync(bulkOps); + // 可选:返回处理结果 + } + } + + + + /// + /// SyncProfession + /// + /// + [ApiDescriptionSettings(Name = "SyncProfession"), HttpPost] + [DisplayName("SyncProfession")] + public async Task SyncProfession() + { + + // var baselist = await $"https://static-data-ycymedu.oss-cn-shanghai.aliyuncs.com/qingting-data/list.json".SetJsonSerialization().GetAsAsync>(); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var zprofessionitems = dbclient.GetCollection("z_professionitems"); + var zprofessiondetails = dbclient.GetCollection("z_professiondetails"); + //await zprofessionitems.InsertManyAsync(baselist); + var list = await zprofessionitems.Find(new BsonDocument()).ToListAsync(); + var basUrl = $"https://static-data-ycymedu.oss-cn-shanghai.aliyuncs.com/qingting-data/"; + //list.ForEach(a => + //{ + // a.itemDtos.ForEach(o => + // { + // var goUrl = $"{basUrl}{o.id}.json".SetJsonSerialization().GetAsAsync().Result; + // if (goUrl.code == 200) + // { + // zprofessiondetails.InsertOne(goUrl.data); + // } + + // }); + //}); + } +} diff --git a/Admin.NET/Admin.NET.Core/Service/ZYMajoroccupation/DTO/ZYMajorRequestDto.cs b/Admin.NET/Admin.NET.Core/Service/ZYMajoroccupation/DTO/ZYMajorRequestDto.cs new file mode 100644 index 0000000..ffcaf33 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYMajoroccupation/DTO/ZYMajorRequestDto.cs @@ -0,0 +1,188 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service; +public class ZYMajorRequestDto : PageBaseRequest +{ + + /// + /// + /// + public int Id { get; set; } + + /// + /// 省市区名称 + /// + public string province { get; set; } + /// + /// 办学性质 + /// + public string nature { get; set; } + + /// + /// 学校类型 + /// + public string subjectType { get; set; } + + public List feature { get; set; } +} + +public class ZYMajorResponse +{ + public int id { get; set; } + public string name { get; set; } + public int rank { get; set; } + public string logo { get; set; } + public string province { get; set; } + public string Nature { get; set; } +} + + +public class UniversityResult +{ + + public string UniversityCode { get; set; } + + /// + /// 百分比 + /// + public int Percentage { get; set; } + + /// + /// 官网 + /// + public string Web { get; set; } + /// + /// 主键id + /// + public int Id { get; set; } + /// + /// 名称 + /// + public string Name { get; set; } + /// + /// 排名 + /// + public int? Rank { get; set; } + /// + /// 是否985 + /// + public bool? Nhef { get; set; } + /// + /// 是否211 + /// + public bool? Sff { get; set; } + /// + /// 是否双一流 + /// + public bool? Syl { get; set; } + + /// + /// 强基 + /// + public bool? QJJH { get; set; } + /// + /// 学校logo + /// + public string Logo { get; set; } + /// + /// 学校简介 + /// + public string Description { get; set; } + /// + /// 省市区名称 + /// + public string AreaName { get; set; } + /// + /// 办学性质 + /// + public int Nature { get; set; } + /// + /// 隶属于 + /// + public string AscriptionName { get; set; } + /// + /// 学科层次 + /// + public int? SubjectLevel { get; set; } + /// + /// 学校类型 + /// + public int? UniversityType { get; set; } + /// + /// 创办时间 + /// + public string BuildDate { get; set; } + + /// + /// 地址 + /// + public string Address { get; set; } + + /// + /// 电话 + /// + public string Phone { get; set; } + /// + /// 院士数 + /// + public int? AcademicianCount { get; set; } + /// + /// 博士数 + /// + public int DoctorateCount { get; set; } + /// + /// 硕士数 + /// + public int MasterCount { get; set; } + + /// + /// 是否收藏 + /// + public bool? IsCollection { get; set; } = false; + + /// + /// 是否对比 + /// + public bool IsContrast { get; set; } = false; + + /// + /// 是否分数接近 + /// + public bool IsNearScore { get; set; } = false; + + /// + /// 院校图片json + /// + public string Imglist { get; set; } + + public string naturedetail { get; set; } + + /// + /// 长学校id + /// + public string LongSchoolId { get; set; } + + /// + /// + /// + public int Years { get; set; } + + /// + /// 最低录取分数 + /// + public float ScoreLine { get; set; } + /// + /// 位次 + /// + public float Scorepostion { get; set; } + + /// + /// 原始code + /// + public string collegeCode { get; set; } + +} diff --git a/Admin.NET/Admin.NET.Core/Service/ZYMajoroccupation/ZYMajorOccuptionService.cs b/Admin.NET/Admin.NET.Core/Service/ZYMajoroccupation/ZYMajorOccuptionService.cs new file mode 100644 index 0000000..66b7db7 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYMajoroccupation/ZYMajorOccuptionService.cs @@ -0,0 +1,152 @@ +using Microsoft.Extensions.Caching.Distributed; +using Newtonsoft.Json.Serialization; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Flurl.Http; +using Flurl; + +namespace Admin.NET.Core.Service; + + + +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 900)] +[Route("api/zhiyuanmajoroccuption")] +public class ZYMajorOccuptionService : IDynamicApiController, ITransient +{ + + public ZYMajorOccuptionService() + { + + } + + + + /// + /// 院校相关专业专用三层下拉接口 + /// + /// + /// + [HttpGet] + public async Task MajorByTree([FromQuery] int Id) + { + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + var _option = new DistributedCacheEntryOptions() + .SetSlidingExpiration(TimeSpan.FromHours(4)); + var result = await string.Format("{0}api/front/Library/GetUniversityMajorByTree?Id={1}", baseurl, Id) + .GetJsonAsync>>(); + return result.response; + + } + + + /// + /// 根据专业id获取专业详情 + /// + /// + /// + [HttpGet] + public async Task MajorDetail([FromQuery] int Id) + { + + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + var _option = new DistributedCacheEntryOptions() + .SetSlidingExpiration(TimeSpan.FromHours(4)); + var result = await string.Format("{0}api/front/Library/GetMajorDetail?MajorId={1}", baseurl, Id) + .GetJsonAsync>(); + return result.response; + + } + + + + + /// + /// 职业详情 + /// + /// + /// + [HttpGet] + public async Task OccuptionDetail([FromQuery] int Id) + { + + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + var _option = new DistributedCacheEntryOptions() + .SetSlidingExpiration(TimeSpan.FromHours(4)); + var result = await string.Format("{0}api/front/Library/GetRecommendIntroduce?Id={1}", baseurl, Id) + .GetJsonAsync>(); + return result.response; + + } + + + + + + /// + /// 专业关联院校 + /// + /// + /// + [HttpGet] + public async Task> RelevantUniversity([FromQuery] ZYMajorRequestDto dto) + { + var pageresult = new PageBaseResult(); + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + + var dyresult = await string.Format("{0}api/front/Library/GetRelevantSchool", baseurl) + .SetQueryParams(new MajorSchoolQuery() + { + MajorId = dto.Id, + AreaName = dto.province, + Nature = dto.nature == null ? -1 : dto.nature == "公办" ? 0 : dto.nature == "民办" ? 1 : dto.nature == "中外合作办学" ? 2 : dto.nature == "独立学院" ? 4 : 3,// u.Nature == 0 ? "公办" : u.Nature == 1 ? "民办" : u.Nature == 2 ? "中外合作办学" : "港澳台", + Nhef = dto.feature == null ? -1 : dto.feature.Contains("985") ? 1 : 0, + Sff = dto.feature == null ? -1 : dto.feature.Contains("211") ? 1 : 0, + Syl = dto.feature == null ? -1 : dto.feature.Contains("双一流") ? 1 : 0, + // Type = dto.subjectType + PageIndex = dto.PageIndex, + PageSize = dto.PageSize + }) + .GetStringAsync(); + var result = JsonConvert.DeserializeObject>>(dyresult); + var query = result.response; + pageresult.Rows = result.response.data.Select(c => new ZYMajorResponse() + { + id = c.Id, + logo = c.Logo, + name = c.Name, + Nature = c.Nature == 0 ? "公办" : c.Nature == 1 ? "民办" : c.Nature == 2 ? "中外合作办学" : c.Nature == 3 ? "港澳台" : "独立学院", + province = c.AreaName, + rank = c.Rank.Value + }).ToList(); + pageresult.TotalPage = result.response.pageCount; + pageresult.TotalRows = result.response.dataCount; + return pageresult; + } + + + + + /// + ///专业就业前景 + /// + /// + /// + [HttpGet] + public async Task CareerProspects([FromQuery] int Id) + { + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + var _option = new DistributedCacheEntryOptions() + .SetSlidingExpiration(TimeSpan.FromHours(4)); + var result = await string.Format("{0}api/front/Library/GetCareerProspects?MajorId={1}", baseurl, Id) + .GetJsonAsync>(); + + return result.response; + + } + + +} diff --git a/Admin.NET/Admin.NET.Core/Service/ZYNews/DTO/NewsRequest.cs b/Admin.NET/Admin.NET.Core/Service/ZYNews/DTO/NewsRequest.cs new file mode 100644 index 0000000..037b096 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYNews/DTO/NewsRequest.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service.ZYNews.DTO; +public class NewsRequest +{ + public int Top { get; set; } = 5; + + public int CategoryId { get; set; } + + /// + /// + /// + public string provinceCode { get; set; } = "370000"; +} + + +public class NewsPageRequest : PageBaseRequest +{ + public int CategoryId { get; set; } + + /// + /// + /// + public string provinceCode { get; set; } = "370000"; + +} diff --git a/Admin.NET/Admin.NET.Core/Service/ZYNews/DTO/NewsResponse.cs b/Admin.NET/Admin.NET.Core/Service/ZYNews/DTO/NewsResponse.cs new file mode 100644 index 0000000..38cfca3 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYNews/DTO/NewsResponse.cs @@ -0,0 +1,182 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service; + + + + + +public class NewsPageResponse +{ + public int page { get; set; } + public int pageCount { get; set; } + public int dataCount { get; set; } + public int PageSize { get; set; } + public List data { get; set; } +} + + +public class NewsInfoResponse +{ + public int Id { get; set; } + + public string Title { get; set; } + + public string CoverImg { get; set; } + + public string Source { get; set; } + public string Summary { get; set; } + public DateTime CreateTime { get; set; } + +} + +public class UniversityDetailRequest +{ + public long? CId { get; set; } + public long Id { get; set; } +} + + +public class MajorSchoolQuery : PageBaseRequest +{ + + /// + /// + /// + public int MajorId { get; set; } + + /// + /// 学科层次 + /// + public int SubjectLevel { get; set; } + /// + /// 省市区名称 + /// + public string AreaName { get; set; } + /// + /// 办学性质 + /// + public int Nature { get; set; } = -1; + + /// + /// 学校类型 + /// + public int Type { get; set; } = -1; + + /// + /// 是否985 0、否,1、是 + /// + public int Nhef { get; set; } = -1; + + /// + /// 是否211 0、否,1、是 + /// + public int Sff { get; set; } = -1; + + /// + /// 是否双一流 0、否,1、是 + /// + public int Syl { get; set; } = -1; +} + +public class OldUniversityRequest +{ + public long? CustomerId { get; set; } + public int Id { get; set; } +} + +public class OldUniversityDetailResponse +{ + public int status { get; set; } + public Universityresult universityResult { get; set; } + public Relatedmajor[] relatedMajors { get; set; } + public Relatespmajor[] relatespMajors { get; set; } + public Graduatemodels graduateModels { get; set; } +} + + + + + +public class Universityresult +{ + public string universityCode { get; set; } + public int percentage { get; set; } + public string web { get; set; } + public int id { get; set; } + public string name { get; set; } + public int rank { get; set; } + public bool nhef { get; set; } + public bool sff { get; set; } + public bool syl { get; set; } + public bool qjjh { get; set; } + public string logo { get; set; } + public string description { get; set; } + public string areaName { get; set; } + public int nature { get; set; } + public string ascriptionName { get; set; } + public int subjectLevel { get; set; } + public int universityType { get; set; } + public string buildDate { get; set; } + public string address { get; set; } + public string phone { get; set; } + public int academicianCount { get; set; } + public int doctorateCount { get; set; } + public int masterCount { get; set; } + public bool isCollection { get; set; } + public bool isContrast { get; set; } + public bool isNearScore { get; set; } + public string imglist { get; set; } + public string naturedetail { get; set; } + public string longSchoolId { get; set; } + public int years { get; set; } + public int scoreLine { get; set; } + public int scorepostion { get; set; } + public string collegeCode { get; set; } +} + +public class Graduatemodels +{ + public string provinces { get; set; } + public string attrs { get; set; } +} + +public class Relatedmajor +{ + public int mid { get; set; } + public string majorName { get; set; } +} + +public class Relatespmajor +{ + public int mid { get; set; } + public string majorName { get; set; } +} + + + +public class NewsDetailInfoResponse +{ + + public int Id { get; set; } + /// + /// + /// + public string Author { get; set; } + public string Title { get; set; } + public string CoverImg { get; set; } + /// + /// + /// + public string Summary { get; set; } + public string Detail { get; set; } + /// + /// + /// + public int Click { get; set; } + public DateTime CreateTime { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/ZYNews/ZyNewsService.cs b/Admin.NET/Admin.NET.Core/Service/ZYNews/ZyNewsService.cs new file mode 100644 index 0000000..ea9d359 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYNews/ZyNewsService.cs @@ -0,0 +1,147 @@ +using Admin.NET.Core.Service.ZYNews.DTO; +using Flurl; +using Flurl.Http; +using Microsoft.Extensions.Caching.Distributed; +using MongoDB.Bson; +using NewLife; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Text.Json.Serialization; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service; + + +/// +/// 新闻资讯 +/// +[AllowAnonymous] +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 900)] +[Route("api/ZyNews")] +public class ZyNewsService : IDynamicApiController, ITransient +{ + private readonly IDistributedCache _distributed; + private const string _cachekey = "news_"; + public ZyNewsService(IDistributedCache distributedCache) + { + _distributed = distributedCache; + } + + + + /// + /// 资讯列表 + /// + /// + /// + [HttpGet] + public async Task NewsPage([FromQuery] NewsPageRequest request) + { + try + { + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + var dyresult = await string.Format("{0}api/front/NewsInfo/GetPageNews", baseurl) + .SetQueryParams(request).GetStringAsync(); + var result= JsonConvert.DeserializeObject>(dyresult); + return result.response; + } + catch (Exception ex) { + + throw Oops.Oh("网络开小差了~"); + } + } + + + + /// + /// 获取新闻分类列表 + /// + /// + [HttpGet] + public async Task NewsCategory() + { + var key = _cachekey + "categorylist"; + var result = await _distributed.GetAsync(key); + if (result == null) + { + try + { + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + var _option = new DistributedCacheEntryOptions() + .SetSlidingExpiration(TimeSpan.FromHours(4)); + var dyresult = await string.Format("{0}api/front/NewsInfo/GetNewsCategory", baseurl).GetStringAsync(); + var nresult = JsonConvert.DeserializeObject>>(dyresult); + byte[] byresult = Encoding.UTF8.GetBytes(nresult.response.ToJson()); + await _distributed.SetAsync(key, byresult, _option); + result = byresult; + } + catch (Exception ex) + { + + throw Oops.Oh("网络开小差了~"); + } + } + return JsonConvert.DeserializeObject(Encoding.UTF8.GetString(result).ToLowerInvariant()); + } + + + + /// + /// 首页top新闻列表 + /// + /// + /// + [HttpGet] + public async Task Top([FromQuery] NewsRequest request) + { + try + { + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + var _option = new DistributedCacheEntryOptions() + .SetSlidingExpiration(TimeSpan.FromHours(4)); + var dyresult = await string.Format("{0}api/front/NewsInfo/GetTopNews", baseurl) + .SetQueryParams(request).GetStringAsync(); + var result = JsonConvert.DeserializeObject>>(dyresult); + return result.response; + } + catch (Exception ex) + { + + throw Oops.Oh("网络开小差了~"); + } + } + + + + /// + /// 新闻详情 + /// + /// + /// + [HttpGet] + public async Task Detail([FromQuery] int Id) + { + try + { + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + var _option = new DistributedCacheEntryOptions() + .SetSlidingExpiration(TimeSpan.FromHours(4)); + var dyresult = await string.Format("{0}api/front/NewsInfo/GetDetail?id={1}", baseurl, Id) + .GetStringAsync(); + var result = JsonConvert.DeserializeObject>(dyresult); + return result.response; + } + catch (Exception ex) + { + + throw Oops.Oh("网络开小差了~"); + } + } + + +} diff --git a/Admin.NET/Admin.NET.Core/Service/ZYOneScoreOneSection/DTO/ZYOneScoreOneSection.cs b/Admin.NET/Admin.NET.Core/Service/ZYOneScoreOneSection/DTO/ZYOneScoreOneSection.cs new file mode 100644 index 0000000..b57bdd6 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYOneScoreOneSection/DTO/ZYOneScoreOneSection.cs @@ -0,0 +1,231 @@ +using MongoDB.Bson; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service; + + +public class ScoreSectionRequest +{ + public string year { get; set; } + + public string locationCode { get; set; } + + /// + /// 类型:0 综合||1(物理)|2(历史)|3理科 |4 文科 + /// + public int type { get; set; } + + /// + /// excel返回的id + /// + public string fileId { get; set; } + +} + + +public class ScoreSectionInputDto +{ + + public string year { get; set; } + + public string locationCode { get; set; } + + public int? type { get; set; } + + public int Score { get; set; } +} + + +public class ScoreSectionDtoInput +{ + public string year { get; set; } + + public string locationCode { get; set; } + + /// + ///类型:0 综合||1(物理)|2(历史)|3理科 |4 文科 + /// + public int? type { get; set; } +} +/// +/// +/// +public class ImportScoresectionInput +{ + public int? 分数 { get; set; } + public int? 本段人数 { get; set; } + public int? 累计人数 { get; set; } +} + + +/// +/// 一分一段 +///table rules zyonesection-province-years +/// +public class ZYOneScoreOneSection +{ + /// + /// + /// + [JsonConverter(typeof(ObjectIdConverter))] + public ObjectId _id { get; set; } + + /// + /// 类型:0 综合||1(物理)|2(历史)|3理科 |4 文科 + /// + public int Type { get; set; } + public int? Score { get; set; } + + /// + /// 本段人数 + /// + public int? CurrentCount { get; set; } + + /// + /// 累计人数 + /// + public int? CumulativeCount { get; set; } +} + + +/// +/// +/// +public class OneScoreobject +{ + public int code { get; set; } + public string msg { get; set; } + public OneScoreData data { get; set; } +} + +public class OneScoreData +{ + public Configlist configList { get; set; } + public List[] list { get; set; } +} + +public class Configlist +{ + public string proDefault { get; set; } + public int yearDefault { get; set; } + public int subjectDefault { get; set; } + public int typeDefault { get; set; } + public Prolist[] proList { get; set; } + public Yearlist[] yearList { get; set; } + public Subjectlist[] subjectList { get; set; } + public Typelist[] typeList { get; set; } +} + +public class Prolist +{ + public int id { get; set; } + public string name { get; set; } + public int parent_id { get; set; } + public string code { get; set; } + public int order { get; set; } + public int parent { get; set; } + public int list_order_by_py { get; set; } + public bool selected { get; set; } +} + +public class Yearlist +{ + public int year { get; set; } + public bool selected { get; set; } +} + +public class Subjectlist +{ + public int subject_id { get; set; } + public string subject_name { get; set; } + public bool selected { get; set; } +} + +public class Typelist +{ + public int rank_type { get; set; } + public string rank_type_name { get; set; } + public bool selected { get; set; } +} + +public class List +{ + public int id { get; set; } + public int scoreline_rank_id { get; set; } + public int score { get; set; } + public int num { get; set; } + public int total_num { get; set; } +} + + +public class ScoreSectionResultDto +{ + /// + ///最高最低分数区间 + /// + public string BetweenScores { get; set; } + public ScoreBetwenRank betwenRanks { get; set; } + public ScoreOneConfiglist configList { get; set; } + public List list { get; set; } +} + + +public class ScoreBetwenRank +{ + /// + /// 分数位次区间 + /// + public string ScoreRange { get; set; } + + + /// + /// 位次最高 + /// + public string Ranges { get; set; } + + public int? CurrentCount { get; set; } + +} + +public class OneSectionResponseDto +{ + + + /// + /// 类型:0 综合||1(物理)|2(历史)|3理科 |4 文科 + /// + public int Type { get; set; } + public int? Score { get; set; } + + /// + /// 本段人数 + /// + public int? CurrentCount { get; set; } + + /// + /// 累计人数 + /// + public int? CumulativeCount { get; set; } + + /// + /// 段位起始 + /// + public int? StartRank { get; set; } + + public int? EndRank { get; set; } + + +} + + +public class ScoreOneConfiglist +{ + public List subjectList { get; set; } + + public List yearList { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/ZYOneScoreOneSection/ScoreSectionService.cs b/Admin.NET/Admin.NET.Core/Service/ZYOneScoreOneSection/ScoreSectionService.cs new file mode 100644 index 0000000..5392ba6 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYOneScoreOneSection/ScoreSectionService.cs @@ -0,0 +1,324 @@ +using Flurl.Http; +using MongoDB.Bson; +using MongoDB.Driver; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Threading.Tasks; +using static SKIT.FlurlHttpClient.Wechat.Api.Models.ComponentTCBDescribeCloudBaseRunEnvironmentsResponse.Types.Environment.Types; + +namespace Admin.NET.Core.Service; + + +/// +/// 一分一段模块 +/// +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 200)] +[Route("api/ScoreSection")] +public class ScoreSectionService +{ + private readonly IMongoDBRepository _mongoRepository; + private readonly SqlSugarRepository _provinceRep; + private readonly string _uploadDirectory = Path.Combine(Directory.GetCurrentDirectory(), "uploads"); + public ScoreSectionService(IMongoDBRepository mongoDBRepository, SqlSugarRepository _province) + { + _mongoRepository = mongoDBRepository; + + _provinceRep = _province; + } + + + + + + + + /// + /// 先上传excel 然后再通过唯一id传入逻辑计算 + /// + /// + /// + [ApiDescriptionSettings(Name = "UploadExcel"), HttpPost] + [DisplayName("UploadExcel")] + public async Task UploadFile([Required] IFormFile file) + { + // 假设你把文件保存到服务器并返回一个文件 ID 或路径 + // var fileId = await SaveFileAsync(file); // 实现保存逻辑 + + // 确保上传目录存在 + if (!Directory.Exists(_uploadDirectory)) + { + Directory.CreateDirectory(_uploadDirectory); + } + + // 为文件生成唯一名称(避免文件名冲突) + var uniqueFileName = $"{Guid.NewGuid()}_{file.FileName}"; + var filePath = Path.Combine(_uploadDirectory, uniqueFileName); + + // 保存文件到指定路径 + using (var fileStream = new FileStream(filePath, FileMode.Create)) + { + await file.CopyToAsync(fileStream); + } + + // 返回文件路径或唯一标识符 + return uniqueFileName; + } + + + /// + /// 导入Excel + /// + /// + [ApiDescriptionSettings(Name = "ImportExcel"), HttpPost] + [DisplayName("ImportExcel")] + public async Task ImportExcel([Required][FromForm] ScoreSectionRequest request) + { + var jsonlist = new List(); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var newbejson = dbclient.GetCollection(string.Format("scoresection_{0}_{1}", request.locationCode, request.year)); + + var filePath = await UtilExcelExt.GetFileByIdAsync(_uploadDirectory, request.fileId); + // 处理文件流 + var list = InputExcelUtil.InputExcel(filePath); + list.ForEach(item => + { + jsonlist.Add(new ZYOneScoreOneSection() + { + CumulativeCount = item.累计人数, + CurrentCount = item.本段人数, + Score = item.分数, + Type = request.type + }); + }); + + + #region ***上海专科操作**** + //int postion = 41594; + //jsonlist.ForEach(a => + //{ + // a.CumulativeCount = a.CumulativeCount + postion; + //}); + #endregion + await newbejson.InsertManyAsync(jsonlist); + var deletePath = Path.Combine(_uploadDirectory, request.fileId);//上传完了删除不需要的缓存文件 + System.IO.File.Delete(deletePath); + return true; + } + + + + + /// + /// 查询分数位次 + /// + /// + /// + [ApiDescriptionSettings(Name = "ScoreSection"), HttpGet] + [AllowAnonymous] + public async Task ScoreSection([FromQuery] ScoreSectionDtoInput input) + { + var jsonlist = new List(); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + string tbName = $"scoresection_{input.locationCode}_{input.year}"; + var collection = dbclient.GetCollection(tbName); + var filterBuilders = new List>(); + if (input.type.HasValue) + { + filterBuilders.Add(Builders.Filter.Eq(p => p.Type, input.type)); + } + FilterDefinition filter = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) : new BsonDocument(); + var result = await collection.Find(filter).ToListAsync(); + return result; + } + + + + + /// + /// 查询分数位次v2 + /// + /// + /// + [ApiDescriptionSettings(Name = "ScoreSection/V2"), HttpGet] + [AllowAnonymous] + public async Task ScoreSectionV2([FromQuery] ScoreSectionInputDto input) + { + if (string.IsNullOrWhiteSpace(input.locationCode)) + { + throw Oops.Oh("必填信息为空"); + } + var years = new int[] { 2024, 2023, 2022, 2021 }.ToList(); + if (string.IsNullOrWhiteSpace(input.year)) + { + input.year = years.OrderByDescending(x => x).FirstOrDefault().ToString(); + } + var response = new ScoreSectionResultDto(); + var scorelist = new List(); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + string tbName = $"scoresection_{input.locationCode}_{input.year}"; + var collection = dbclient.GetCollection(tbName); + var result = await collection.Find(new BsonDocument()).ToListAsync(); + if (!result.Any()) + { + return "暂无数据"; + } + + var subject = result.Select(s => s.Type).Distinct().ToList(); + if (!input.type.HasValue) + { + input.type = subject.FirstOrDefault(); + } + response.configList = new ScoreOneConfiglist() + { + + yearList = years.Select(s => new gYearlist() + { + year = s.ToString(), + check = input.year == s.ToString(), + }).ToList(), + subjectList = subject.Select(s => new gSubjectlist() + { + check = input.type == s, + subject_id = s, + subject_name = CalcuScoreFinder.GetSubjectid(s), + }).ToList() + }; + var list = result.WhereIF(input.type.HasValue, i => i.Type == input.type).ToList(); + + for (int i = 0; i < list.Count(); i++) + { + scorelist.Add(new OneSectionResponseDto() + { + CurrentCount = list[i].CurrentCount, + CumulativeCount = list[i].CumulativeCount, + Type = list[i].Type, + Score = list[i].Score, + StartRank = i == 0 ? 1 : list[i - 1].CumulativeCount + 1, + EndRank = list[i].CumulativeCount, + }); + } + response.list = scorelist; + var rangeinfo = new ScoreBetwenRank(); + if (input.Score > 0) + { + var rangescoresingle = scorelist.Where(e => e.Score == input.Score).FirstOrDefault(); + if (rangescoresingle != null) + { + rangeinfo.ScoreRange = $"{rangescoresingle.StartRank}~{rangescoresingle.EndRank}"; + rangeinfo.Ranges = rangescoresingle.EndRank.ToString(); + rangeinfo.CurrentCount = rangescoresingle.CurrentCount; + response.betwenRanks = rangeinfo; + } + } + response.BetweenScores = $"{scorelist.Min(m => m.Score)}分到{scorelist.Max(m => m.Score)}分"; + return response; + } + + + + + /// + /// 更新表名称 + /// + /// + + [ApiDescriptionSettings(Name = "UpdateSyncScoreSection"), HttpPost] + public async Task UpdateSyncScoreSection() + { + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var years = new List() { "2024", "2023", "2022", "2021" }; + var baseUrl = "http://api.xuexingaokao.com/api/tool/rank/index?pro="; + //同步数据 + var provinceinfo = await _provinceRep.AsQueryable().Where(e => e.IsDelete == false).ToListAsync(); + provinceinfo.ForEach(a => + { + years.ForEach(async y => + { + + var newCollectionName = $"scoresection_{a.Code}_{y}"; + var oldCollectionName = $"scoresection_{a.Code}_{y}_n"; + var collection1 = dbclient.GetCollection(newCollectionName); + var collection2 = dbclient.GetCollection(oldCollectionName); + + var dbany1 = await collection1.Find(new BsonDocument()).AnyAsync(); + var dbany2 = await collection2.Find(new BsonDocument()).AnyAsync(); + if (dbany1 && dbany2) + { + + // 获取旧集合 + var oldCollection = dbclient.GetCollection(oldCollectionName); + // 获取新集合 + var newCollection = dbclient.GetCollection(newCollectionName); + // 将旧集合的数据复制到新集合 + await newCollection.InsertManyAsync(await oldCollection.Find(Builders.Filter.Empty).ToListAsync()); + // 删除旧集合 + await dbclient.DropCollectionAsync(oldCollectionName); + + Console.WriteLine($"Collection renamed from {oldCollectionName} to {newCollectionName} successfully!"); + + } + }); + }); + + + } + + + /// + /// 同步数据 + /// + /// + // [ApiDescriptionSettings(Name = "SyncScoreSection"), HttpPost] + // public async Task SyncScoreSection() + // { + //var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + //var years = new List() { "2024", "2023", "2022", "2021" }; + //var baseUrl = "http://api.xuexingaokao.com/api/tool/rank/index?pro="; + //同步数据 + //var provinceinfo = await _provinceRep.AsQueryable().Where(e => e.IsDelete == false).ToListAsync(); + //provinceinfo.ForEach(a => + //{ + // years.ForEach(async y => + // { + // var collectiontb = $"scoresection_{a.Code}_{y}"; + // var result = $"{baseUrl}{a.Code}&year={y}&subject=&type=×tamp={DateTimeOffset.Now.ToUnixTimeSeconds()}".SetJsonSerialization().GetAsAsync().Result; + // if (result.code == 1) + // { + + // Thread.Sleep(150); + // var newbejson = dbclient.GetCollection(collectiontb); + // var jsonlist = new List(); + // result.data.configList.subjectList.ToList().ForEach(x => + // { + // Thread.Sleep(200); + // var items = $"{baseUrl}{a.Code}&year={y}&subject={x.subject_id}&type=×tamp={DateTimeOffset.Now.ToUnixTimeSeconds()}".SetJsonSerialization().GetAsAsync().Result; + // if (items.data.list.Any()) + // { + // jsonlist.AddRange(items.data.list.Select(s => new ZYOneScoreOneSection() + // { + // CumulativeCount = s.total_num, + // CurrentCount = s.num, + // Score = s.score, + // Type = CalcuScoreFinder.subjectidChange(x.subject_id), + // }).ToList()); + // } + // }); + // if (jsonlist.Any() && jsonlist.Count() > 0) + // { + // dbclient.DropCollection(collectiontb); + // await newbejson.InsertManyAsync(jsonlist); + // Console.WriteLine($"{a.Code}同步完成{collectiontb}"); + // } + // } + // }); + //}); + // Console.WriteLine("同步结束"); + // } + + +} diff --git a/Admin.NET/Admin.NET.Core/Service/ZYPlanPro/DTO/PlanProDto.cs b/Admin.NET/Admin.NET.Core/Service/ZYPlanPro/DTO/PlanProDto.cs new file mode 100644 index 0000000..8395b7f --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYPlanPro/DTO/PlanProDto.cs @@ -0,0 +1,303 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; +namespace Admin.NET.Core.Service; + +public class PlanBatchNameDto +{ + + /// + /// 本科提前批 + /// + public string batchName { get; set; } + +} + +public class PlanProMainDto +{ + public List plans { get; set; } + + public List Batches { get; set; } + + public List yearsDtos { get; set; } +} + +public class PlanProOutDto +{ + /// + /// + /// + [JsonConverter(typeof(ObjectIdConverter))] + public ObjectId _id { get; set; } + /// + /// + /// + public long? _uid { get; set; } + + /// + /// 院校代码(专业组代码) + /// + public string universityCode { get; set; } + + /// + /// + /// + public string universityName { get; set; } + /// + /// + /// + public string academic { get; set; } + /// + /// 本科提前批 + /// + public string batchName { get; set; } + /// + /// + /// + public string fee { get; set; } + /// + /// + /// + public string location { get; set; } + /// + /// 武器系统与工程 + /// + public string major { get; set; } + /// + /// + /// + public string majorcode { get; set; } + + + /// + /// 专业组名称 + /// + [BsonElement("majorgroupname")] + public string majorgroupname { get; set; } + /// + /// + /// + public int? plancount { get; set; } + /// + /// (试验评估技术)(男,军事(指技融合)类,通用标准合格,特殊类型招生控制线,英语) + /// + public string remark { get; set; } + /// + /// 物理 + /// + public string selectsubject { get; set; } + /// + /// + /// + public string years { get; set; } + + public string lowscorerank { get; set; } + + public string lowscore { get; set; } + +} + +public class PlanProV2RequestDto +{ + public long uid { get; set; } + public string locationCode { get; set; } +} + +public class PlanProV2ResponseDto +{ + public string year { get; set; } + + public List items { get; set; } +} + +public class PlanProResponseDto +{ + /// + /// + /// + [JsonConverter(typeof(ObjectIdConverter))] + public ObjectId _id { get; set; } + /// + /// + /// + public long? _uid { get; set; } + + /// + /// 院校代码(专业组代码) + /// + public string universityCode { get; set; } + + /// + /// + /// + public string universityName { get; set; } + /// + /// + /// + public string academic { get; set; } + /// + /// 本科提前批 + /// + public string batchName { get; set; } + /// + /// + /// + public string fee { get; set; } + /// + /// + /// + public string location { get; set; } + /// + /// 武器系统与工程 + /// + public string major { get; set; } + /// + /// + /// + public string majorcode { get; set; } + + + /// + /// 专业组名称 + /// + [BsonElement("majorgroupname")] + public string majorgroupname { get; set; } + /// + /// + /// + public int? plancount { get; set; } + /// + /// (试验评估技术)(男,军事(指技融合)类,通用标准合格,特殊类型招生控制线,英语) + /// + public string remark { get; set; } + + /// + /// 类型:0 综合||1(物理)|2(历史)|3理科 |4 文科 + /// + public int selecttype { get; set; } + /// + /// 物理 + /// + public string selectsubject { get; set; } + /// + /// + /// + public string years { get; set; } + + public int? lowscorerank { get; set; } + + public int? lowscore { get; set; } + + + +} + +public class PlanProDto +{ + /// + /// + /// + public ObjectId _id { get; set; } + /// + /// + /// + public long? _uid { get; set; } + /// + /// + /// + public string academic { get; set; } + /// + /// 本科提前批 + /// + public string batchname { get; set; } + /// + /// + /// + public string fee { get; set; } + /// + /// + /// + public string location { get; set; } + /// + /// 武器系统与工程 + /// + public string major { get; set; } + /// + /// + /// + public string majorcode { get; set; } + /// + /// + /// + public int? plancount { get; set; } + /// + /// (试验评估技术)(男,军事(指技融合)类,通用标准合格,特殊类型招生控制线,英语) + /// + public string remark { get; set; } + /// + /// 物理 + /// + public string selectsubject { get; set; } + /// + /// + /// + public string years { get; set; } + + public int? lowscorerank { get; set; } + + public int? lowscore { get; set; } + + + +} + + +public class enroll_planpro +{ + + [JsonConverter(typeof(ObjectIdConverter))] + public ObjectId _id { get; set; } + + /// + /// 院校代码(专业组代码) + /// + public string enrollmentCode { get; set; } + + /// + /// + /// + public string enrollmentName { get; set; } + + + /// + /// + /// + public string majorCode { get; set; } + + + public string majorName { get; set; } + + + + public int? planCount { get; set; } + + public int? Score { get; set; } + + + public int? ScoreLine { get; set; } + + + public string batchName { get; set; } + +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/ZYPlanPro/DTO/PlanProRequestDto.cs b/Admin.NET/Admin.NET.Core/Service/ZYPlanPro/DTO/PlanProRequestDto.cs new file mode 100644 index 0000000..2038aa7 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYPlanPro/DTO/PlanProRequestDto.cs @@ -0,0 +1,38 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service; +public class PlanProRequestDto +{ + /// + /// 高校Id + /// + public int _uid { get; set; } + /// + /// + /// + + /// + /// 年份 + /// + public string years { get; set; } + + /// + /// 批次 + /// + public string batchName { get; set; } + /// + /// + /// + public string locationCode { get; set; } + +} diff --git a/Admin.NET/Admin.NET.Core/Service/ZYPlanPro/DTO/aiPerviewDto.cs b/Admin.NET/Admin.NET.Core/Service/ZYPlanPro/DTO/aiPerviewDto.cs new file mode 100644 index 0000000..14b98a2 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYPlanPro/DTO/aiPerviewDto.cs @@ -0,0 +1,126 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service; +public class aiPerviewDto +{ + + /// + /// 院校基础数量 + /// + public List universities { get; set; } + + /// + /// 适合我的大学饼图数据 + /// + public List pieChats { get; set; } + +} +public class pieChatsDto +{ + public string name { get; set; } + + public int value { get; set; } + +} +public class universityPerviewDto +{ + /// + /// 标签 + /// + public string Name { get; set; } + + /// + /// 学校数量 + /// + public int Count { get; set; } +} + +/// +/// 智能填报院校列表 +/// +public class aiUniversityDto +{ + + public string logo { get; set; } + /// + /// + /// + public string enrollmentCode { get; set; } + /// + /// 北京大学 + /// + public string universityName { get; set; } + /// + /// 综合 + /// + public string subjectType { get; set; } + /// + /// 公办 + /// + public string nature { get; set; } + + /// + /// + /// + public int _schoolScore { get; set; } + /// + /// + /// + public int _schoolScoreLine { get; set; } + /// + /// + /// + public int _schoolAvgScore { get; set; } + /// + /// + /// + public int _schoolAvgLine { get; set; } + + /// + /// 北京市 + /// + public string province { get; set; } + /// + /// 北京 + /// + public string city { get; set; } + /// + /// 教育部 + /// + public string ownership { get; set; } + /// + /// /985/211/双一流大学/保研资格/基础学科拔尖/卓越医生拔尖创新/卓越法律复合应用/卓越法律涉外/高水平公共卫生学院/原卫生部 + /// + public string features { get; set; } + + /// + /// 专业总数 + /// + public int majorcount { get; set; } + + /// + /// 招生计划总人数 + /// + public int plancount { get; set; } + + /// + /// 冲稳保 + /// + public int type { get; set; } + + /// + /// 成功占比 + /// + public int tage { get; set; } + +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/ZYPlanPro/DTO/zsplanfusionDto.cs b/Admin.NET/Admin.NET.Core/Service/ZYPlanPro/DTO/zsplanfusionDto.cs new file mode 100644 index 0000000..2d62dbb --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYPlanPro/DTO/zsplanfusionDto.cs @@ -0,0 +1,1334 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using MongoDB.Bson; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service; + + + +public class seachzsplanfusionRequestDto : PageBaseRequest +{ + + + public string batchName { get; set; } + + + /// + /// 专业名称模糊查询 + /// + public string keyword { get; set; } + + /// + /// + /// + public string universityName { get; set; } + + + /// + /// 筛选专业列表传入 + /// + public List majors { get; set; } + /// + /// 综合 + /// + //public List subjectType { get; set; } + /// + /// 公办 + /// + public List nature { get; set; } + + /// + /// 选科组合 + /// + public List subjects { get; set; } + + /// + /// 北京市 + /// + public List province { get; set; } + + /// + /// 教育部 + /// + public List ownership { get; set; } + /// + /// /985/211/双一流大学/保研资格/基础学科拔尖/卓越医生拔尖创新/卓越法律复合应用/卓越法律涉外/高水平公共卫生学院/原卫生部 + /// + public List feature { get; set; } + + /// + /// + /// + public string locationCode { get; set; } +} + +/// +/// +/// +public class zsplanfusionRequestDto : PageBaseRequest +{ + public int? type { get; set; } + /// + /// 用户选科类型([p=0文理][p=1 3+3|][ p=2 7选3 ][p=3 3+1+2]) + /// + public int? p { get; set; } + + /// + /// 专业名称模糊查询 + /// + public string keyword { get; set; } + + /// + /// 分数 + /// + public int? score { get; set; } + + /// + /// 分数区间 + /// + public int? startscore { get; set; } + + /// + /// 分数区间 + /// + public int? endscore { get; set; } + + /// + /// 筛选专业列表传入 + /// + public List majors { get; set; } + /// + /// 综合 + /// + public List subjectType { get; set; } + /// + /// 公办 + /// + public List nature { get; set; } + + /// + /// 选科组合 + /// + public List subjects { get; set; } + + /// + /// 北京市 + /// + public List province { get; set; } + + /// + /// 教育部 + /// + public List ownership { get; set; } + /// + /// /985/211/双一流大学/保研资格/基础学科拔尖/卓越医生拔尖创新/卓越法律复合应用/卓越法律涉外/高水平公共卫生学院/原卫生部 + /// + public List feature { get; set; } + + public string batchName { get; set; } + + /// + /// + /// + public string location { get; set; } + + + +} + +public class zsplanfusionDto +{ + /// + /// + /// + [JsonConverter(typeof(ObjectIdConverter))] + public ObjectId _id { get; set; } + /// + /// + /// + public int pid { get; set; } + /// + /// 普通计划 + /// + public string enrollmentType { get; set; } + /// + /// + /// + public string enrollmentCode { get; set; } + /// + /// 北京大学 + /// + public string universityName { get; set; } + + + public string batchName { get; set; } + /// + /// + /// + public string majorCode { get; set; } + /// + /// 文科试验班类(文科基础类专业)(中国语言文学类) + /// + public string majorName { get; set; } + /// + /// 综合 + /// + public string subjectType { get; set; } + /// + /// 公办 + /// + public string nature { get; set; } + /// + /// + /// + public string remark { get; set; } + /// + /// + /// + public string firstType { get; set; } + /// + /// 不限 + /// + public string _23subject { get; set; } + /// + /// 不限 + /// + public string _24subject { get; set; } + /// + /// + /// + public int _23Count { get; set; } + /// + /// + /// + public int? _Score { get; set; } + public int? _ScoreLine { get; set; } + /// + /// + /// + public int _23Score { get; set; } + /// + /// + /// + public int _23ScoreLine { get; set; } + /// + /// 最新一年学校分数 + /// + public int _schoolScore { get; set; } + /// + /// 最新一年学校分数 + /// + public int _schoolScoreLine { get; set; } + /// + /// 最新一年学校分数 + /// + public int? _schoolAvgScore { get; set; } + /// + /// 最新一年学校分数 + /// + public int? _schoolAvgLine { get; set; } + /// + /// + /// + public int _22Count { get; set; } + /// + /// + /// + public int _22Score { get; set; } + /// + /// + /// + public int _22ScoreLine { get; set; } + /// + /// + /// + public int _21Count { get; set; } + /// + /// + /// + public int _21Score { get; set; } + /// + /// + /// + public int _21ScoreLine { get; set; } + /// + /// + /// + public string academicYear { get; set; } + /// + /// 待定 + /// + public string fee { get; set; } + + /// + /// 专业组-上海数据 + /// + public string majorGroup { get; set; } + /// + /// 北京市 + /// + public string province { get; set; } + /// + /// 北京 + /// + public string city { get; set; } + /// + /// 教育部 + /// + public string ownership { get; set; } + /// + /// /985/211/双一流大学/保研资格/基础学科拔尖/卓越医生拔尖创新/卓越法律复合应用/卓越法律涉外/高水平公共卫生学院/原卫生部 + /// + public string lnstitutionalLevel { get; set; } + /// + /// + /// + public string professionalAssessment { get; set; } + /// + /// + /// + public string phDMajor { get; set; } + /// + /// + /// + public string mjaorLevel { get; set; } + /// + /// 本科 + /// + public string educationCategory { get; set; } + /// + /// + /// + public string location { get; set; } +} + + +public class OldzsplanfusionDto +{ + + /// + /// + /// + [JsonConverter(typeof(ObjectIdConverter))] + public ObjectId _id { get; set; } + /// + /// + /// + public int pid { get; set; } + /// + /// 普通计划 + /// + public string enrollmentType { get; set; } + /// + /// + /// + public string enrollmentCode { get; set; } + /// + /// 北京大学 + /// + public string universityName { get; set; } + + + public string batchName { get; set; } + /// + /// + /// + public string majorCode { get; set; } + /// + /// 文科试验班类(文科基础类专业)(中国语言文学类) + /// + public string majorName { get; set; } + /// + /// 综合 + /// + public string subjectType { get; set; } + /// + /// 公办 + /// + public string nature { get; set; } + /// + /// + /// + public string remark { get; set; } + /// + /// + /// + public string firstType { get; set; } + /// + /// 不限 + /// + public string _23subject { get; set; } + /// + /// 不限 + /// + public string _24subject { get; set; } + /// + /// + /// + public int _23Count { get; set; } + /// + /// + /// + public int? _Score { get; set; } + public int? _ScoreLine { get; set; } + /// + /// + /// + public int _23Score { get; set; } + /// + /// + /// + public int _23ScoreLine { get; set; } + /// + /// 最新一年学校分数 + /// + public int _23SchoolScore { get; set; } + /// + /// 最新一年学校分数 + /// + public int _23SchoolScoreLine { get; set; } + /// + /// 最新一年学校分数 + /// + public int? _23SchoolAvgScore { get; set; } + /// + /// 最新一年学校分数 + /// + public int? _23SchoolAvgLine { get; set; } + /// + /// + /// + public int _22Count { get; set; } + /// + /// + /// + public int _22Score { get; set; } + /// + /// + /// + public int _22ScoreLine { get; set; } + /// + /// + /// + public int _21Count { get; set; } + /// + /// + /// + public int _21Score { get; set; } + /// + /// + /// + public int _21ScoreLine { get; set; } + /// + /// + /// + public string academicYear { get; set; } + /// + /// 待定 + /// + public string fee { get; set; } + + /// + /// 专业组-上海数据 + /// + public string majorGroup { get; set; } + /// + /// 北京市 + /// + public string province { get; set; } + /// + /// 北京 + /// + public string city { get; set; } + /// + /// 教育部 + /// + public string ownership { get; set; } + /// + /// /985/211/双一流大学/保研资格/基础学科拔尖/卓越医生拔尖创新/卓越法律复合应用/卓越法律涉外/高水平公共卫生学院/原卫生部 + /// + public string lnstitutionalLevel { get; set; } + /// + /// + /// + public string professionalAssessment { get; set; } + /// + /// + /// + public string phDMajor { get; set; } + /// + /// + /// + public string mjaorLevel { get; set; } + /// + /// 本科 + /// + public string educationCategory { get; set; } + /// + /// + /// + public string location { get; set; } +} + + + +public class zsplanfusionmodel +{ + /// + /// + /// + [JsonConverter(typeof(ObjectIdConverter))] + public ObjectId _id { get; set; } + + /// + /// 批次 + /// + public string batchName { get; set; } + /// + /// + /// + public int pid { get; set; } + /// + /// 普通计划 + /// + public string enrollmentType { get; set; } + /// + /// + /// + public string enrollmentCode { get; set; } + /// + /// 北京大学 + /// + public string universityName { get; set; } + /// + /// + /// + public string majorCode { get; set; } + /// + /// 文科试验班类(文科基础类专业)(中国语言文学类) + /// + public string majorName { get; set; } + /// + /// 综合 + /// + public string subjectType { get; set; } + /// + /// 公办 + /// + public string nature { get; set; } + /// + /// + /// + public string remark { get; set; } + /// + /// + /// + public string firstType { get; set; } + + + + /// + /// 不限 + /// + public string _23subject { get; set; } + /// + /// 不限 + /// + public string _24subject { get; set; } + + + /// + /// 选科对象 + /// + public List subjects { get; set; } + + + /// + /// 专业分数集合 + /// + public List items { get; set; } + + + /// + /// + /// + public int _score { get; set; } + + + /// + /// 位次 + /// + public int rankLine { get; set; } + + public int planCount { get; set; } + + /// + /// + /// + public int _schoolScore { get; set; } + /// + /// + /// + public int _schoolScoreLine { get; set; } + /// + /// + /// + public int _schoolAvgScore { get; set; } + /// + /// + /// + public int _schoolAvgLine { get; set; } + /// + /// + /// + public string academicYear { get; set; } + /// + /// 待定 + /// + public string fee { get; set; } + + /// + /// 专业组-上海数据 + /// + public string majorGroup { get; set; } + /// + /// 北京市 + /// + public string province { get; set; } + /// + /// 北京 + /// + public string city { get; set; } + /// + /// 教育部 + /// + public string ownership { get; set; } + /// + /// /985/211/双一流大学/保研资格/基础学科拔尖/卓越医生拔尖创新/卓越法律复合应用/卓越法律涉外/高水平公共卫生学院/原卫生部 + /// + public List features { get; set; } + /// + /// + /// + public string professionalAssessment { get; set; } + /// + /// + /// + public string phDMajor { get; set; } + /// + /// + /// + public List mjaorLevel { get; set; } + /// + /// 本科 + /// + public string educationCategory { get; set; } + /// + /// + /// + public string location { get; set; } +} + + + +public class seachzsplanfusionResponse +{ + + public string academic { get; set; } + public int lowScore { get; set; } + public int lowscoreRank { get; set; } + + /// + /// 批次 + /// + public string batchName { get; set; } + + + //public int universityId { get; set; } + + public string universityName { get; set; } + + + /// + /// 全国统一招生代码 + /// + public string collegeCode { get; set; } + + public string provinceName { get; set; } + + public string cityName { get; set; } + + /// + /// 985、211 + /// + public List features { get; set; } + /// + /// 计划数 + /// + public int planCount { get; set; } + + public string ownership { get; set; } + + /// + /// 学费 + /// + public string fee { get; set; } + + + /// + /// 专业代码 + /// + public string majorCode { get; set; } + /// + /// 专业组 + /// + public string majorGroup { get; set; } + /// + /// 专业名称 + /// + public string major { get; set; } + + /// + /// 专业备注 + /// + public string remark { get; set; } + + /// + /// 选科组合 + /// + public string subjectClam { get; set; } + + + /// + /// 综合| + /// + public string subjectType { get; set; } + + /// + /// + /// + // public string nature { get; set; } + + + + /// + /// 招生计划主键Id + /// + public int planId { get; set; } + +} + +public class AICollectResponse +{ + public long _id { get; set; } + public long uId { get; set; } + + public string logo { get; set; } + public string academic { get; set; } + public int lowScore { get; set; } + public int lowscoreRank { get; set; } + + public int _score { get; set; } + public int _scoreRank { get; set; } + /// + /// 冲稳保 类型:冲2,稳1,保0 + /// + public int type { get; set; } + + public string batchName { get; set; } + /// + /// 百分比 + /// + public string percentAge { get; set; } + /// + /// 排名 + /// + public string rank { get; set; } + + //public int universityId { get; set; } + + public string universityName { get; set; } + + + /// + /// 全国统一招生代码 + /// + public string collegeCode { get; set; } + + public string provinceName { get; set; } + + public string cityName { get; set; } + + /// + /// 985、211 + /// + public List features { get; set; } + /// + /// 计划数 + /// + public int planCount { get; set; } + + public string ownership { get; set; } + + /// + /// 学费 + /// + public string fee { get; set; } + + + /// + /// 专业代码 + /// + public string majorCode { get; set; } + /// + /// 专业组 + /// + public string majorGroup { get; set; } + /// + /// 专业名称 + /// + public string major { get; set; } + + /// + /// 专业备注 + /// + public string remark { get; set; } + + /// + /// 选科组合 + /// + public string subjectClam { get; set; } + + + /// + /// 综合| + /// + public string subjectType { get; set; } + + /// + /// + /// + public string nature { get; set; } + + /// + /// + /// + public List planItems { get; set; } + + + /// + /// + /// + public string educationCategory { get; set; } + + /// + /// 招生计划主键Id + /// + public int planId { get; set; } + + +} + + +public class ZyBatchRule +{ + + /// + /// 批次名称 + /// + public string batchName { get; set; } + + /// + /// 志愿组数量 + /// + public int Count { get; set; } + + /// + /// 志愿组单个专业数量 + /// + public int ItemCount { get; set; } + +} +public class OneKeyResponse +{ + public long uId { get; set; } + + public string logo { get; set; } + + public int year { get; set; } + + /// + /// 冲稳保 类型:冲2,稳1,保0 + /// + public int type { get; set; } + + /// + /// 排名 + /// + public string rank { get; set; } + + //public int universityId { get; set; } + + public string universityName { get; set; } + + /// + /// 全国统一招生代码 + /// + public string collegeCode { get; set; } + + public string provinceName { get; set; } + + public string cityName { get; set; } + + /// + /// 985、211 + /// + public List features { get; set; } + + /// + /// 百分比 + /// + public string percentAge { get; set; } + + public string ownership { get; set; } + + + /// + /// 综合| + /// + public string subjectType { get; set; } + + /// + /// + /// + public string nature { get; set; } + + /// + /// + /// + public string educationCategory { get; set; } + + /// + /// 院校详情 + /// + public List childItems { get; set; } + /// + /// 专业列表 + /// + public List majorItems { get; set; } + + + +} + + +public class OneKeyMajorItem +{ + public long uId { get; set; } + public string academic { get; set; } + public int lowScore { get; set; } + public int lowscoreRank { get; set; } + /// + /// 冲稳保 类型:冲2,稳1,保0 + /// + public int type { get; set; } + + /// + /// 百分比 + /// + public string percentAge { get; set; } + /// + /// 招生计划主键Id + /// + public int planId { get; set; } + + /// + /// + /// + public List planItems { get; set; } + + /// + /// 计划数 + /// + public int planCount { get; set; } + /// + /// 学费 + /// + public string fee { get; set; } + + + /// + /// 专业代码 + /// + public string majorCode { get; set; } + /// + /// 专业组 + /// + public string majorGroup { get; set; } + /// + /// 专业名称 + /// + public string major { get; set; } + + /// + /// 专业备注 + /// + public string remark { get; set; } + + /// + /// 选科组合 + /// + public string subjectClam { get; set; } + + +} + +public class OnekeyAiUniversityDto +{ + public long _id { get; set; } + public long uId { get; set; } + public string logo { get; set; } + + /// + /// 本科专科 + /// + public string educationCategory { get; set; } + /// + /// + /// + public int lowScore { get; set; } + + /// + /// + /// + public int lowscoreRank { get; set; } + + /// + /// 冲稳保 类型:冲2,稳1,保0 + /// + public int type { get; set; } + + public string percentAge { get; set; } + + /// + /// 公办/民办 + /// + public string nature { get; set; } + + + /// + /// 排名 + /// + public string rank { get; set; } + /// + /// 院校名称 + /// + public string unName { get; set; } + + + /// + /// 全国统一招生代码 + /// + public string collegeCode { get; set; } + + /// + /// 北京市 + /// + public string province { get; set; } + /// + /// 北京 + /// + public string city { get; set; } + /// + /// 教育部 + /// + public string ownership { get; set; } + + /// + /// 985、211 + /// + public List features { get; set; } + /// + /// 计划数 + /// + public int planCount { get; set; } + + /// + /// 专业数量 + /// + public int MajorCount { get; set; } + + public int year { get; set; } + /// + /// 专业详情 + /// + public List items { get; set; } + + /// + /// 院校详情 + /// + public List childItems { get; set; } +} + +public class UChildItem +{ + public string year { get; set; } + public int planCount { get; set; } + public int count { get; set; } + /// + /// 位次 + /// + public double rankLine { get; set; } + + ///// + ///// 最低分 + ///// + public double score { get; set; } + +} + +public class OnekeyAiMajorItem +{ + + public int planCount { get; set; } + public string academic { get; set; } + /// + /// 招生计划主键Id + /// + public int planId { get; set; } + /// + /// 冲稳保 类型:冲2,稳1,保0 + /// + public int type { get; set; } + + /// + /// 百分比 + /// + public string percentAge { get; set; } + /// + /// 学费 + /// + public string fee { get; set; } + + /// + /// 专业最低分 + /// + public int score { get; set; } + + /// + /// 专业最低位次 + /// + public int rankline { get; set; } + + /// + /// 专业代码 + /// + public string majorCode { get; set; } + /// + /// 专业组 + /// + public string majorGroup { get; set; } + /// + /// 专业名称 + /// + public string major { get; set; } + + /// + /// 专业备注 + /// + public string remark { get; set; } + + + /// + /// 选科组合 + /// + public string subjectClam { get; set; } + + public List items { get; set; } + +} + +public class PlanItem +{ + public string year { get; set; } + public int planCount { get; set; } + public int count { get; set; } + /// + /// 位次 + /// + public int rankLine { get; set; } + + ///// + ///// 最低分 + ///// + public int score { get; set; } +} + + +/// +/// 仅仅是招生计划书上面的数据 +/// +public class singlezsPlanmodel +{ + /// + /// + /// + [JsonConverter(typeof(ObjectIdConverter))] + public ObjectId _id { get; set; } + + public string locationCode { get; set; } + + /// + /// 批次 + /// + public string batchName { get; set; } + + /// + /// 普通计划 + /// + public string enrollmentType { get; set; } + /// + /// + /// + public string enrollmentCode { get; set; } + /// + /// 北京大学 + /// + public string universityName { get; set; } + /// + /// + /// + public string majorCode { get; set; } + /// + /// 文科试验班类(文科基础类专业)(中国语言文学类) + /// + public string majorName { get; set; } + /// + /// 综合/文理 + /// + public string subjectType { get; set; } + + /// + /// + /// + public string subjectClam { get; set; } + /// + /// + /// + public string remark { get; set; } + + + /// + /// 招生计划 + /// + public int? plancount { get; set; } + + /// + /// 学制 + /// + public string academicYear { get; set; } + /// + ///fee + /// + public string fee { get; set; } + + /// + /// 专业组-上海数据 + /// + public string majorGroup { get; set; } + + +} + + +public class planadmissionMarkDto +{ + public List Years { get; set; } + + public List newZsplanfusions { get; set; } + +} +public class newZsplanfusionDto +{ + /// + /// + /// + [JsonConverter(typeof(ObjectIdConverter))] + public ObjectId _id { get; set; } + public string college_code { get; set; } + + /// + /// 院校名称 + /// + public string college_recruit_name { get; set; } + public string subject_id { get; set; } + public string subject_name { get; set; } + public int college_id { get; set; } + public string b_college_name { get; set; } + + /// + /// 专业编号 + /// + public string major_code { get; set; } + + /// + /// 专业名称 + /// + public string major_name { get; set; } + public string major_memo { get; set; } + + /// + ///录取人数 + /// + public string enroll_num { get; set; } + + /// + /// 最低分数 + /// + public string score_min { get; set; } + + /// + /// 最高分数 + /// + public string score_max { get; set; } + + /// + /// 平均分 + /// + public string score_average { get; set; } + + /// + /// 最低位次 + /// + public string rank_min { get; set; } + public string rank_max { get; set; } + + /// + /// 平均位次 + /// + public string rank_average { get; set; } + + /// + /// + /// + public string post_score { get; set; } + public string post_score_grading { get; set; } + public string volunteer_type { get; set; } + public string second_subject { get; set; } + public string group_code { get; set; } + public string group_name { get; set; } + public int year { get; set; } + public string location { get; set; } +} + + diff --git a/Admin.NET/Admin.NET.Core/Service/ZYPlanPro/PlanProService.cs b/Admin.NET/Admin.NET.Core/Service/ZYPlanPro/PlanProService.cs new file mode 100644 index 0000000..f039637 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYPlanPro/PlanProService.cs @@ -0,0 +1,1824 @@ +using Admin.NET.Core.Util; +using AngleSharp.Dom; +using Elastic.Clients.Elasticsearch; +using Microsoft.Extensions.Caching.Distributed; +using MongoDB.Bson; +using MongoDB.Driver; +using Newtonsoft.Json; +using Qiniu.Util; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static SKIT.FlurlHttpClient.Wechat.Api.Models.ScanProductAddV2Request.Types.Product.Types; + +namespace Admin.NET.Core.Service; + +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 900)] +[Route("api/PlanPro")] +public class PlanProService : IDynamicApiController, ITransient +{ + //private const string _cachekey = "plan_"; + private readonly IDistributedCache _distributed; + private readonly SqlSugarRepository _sysDictDataRep; + private readonly IMongoDBRepository _mongoRepository; + private readonly IHttpContextAccessor _httpContextAccessor; + private readonly SqlSugarRepository _sysAreaConfig; + public PlanProService(IDistributedCache distributedCache, SqlSugarRepository sysDictDataRep, IMongoDBRepository mongoDBRepository, + IHttpContextAccessor httpContextAccessor, SqlSugarRepository sysAreaConfig) + { + _distributed = distributedCache; + _sysDictDataRep = sysDictDataRep; + _mongoRepository = mongoDBRepository; + _httpContextAccessor = httpContextAccessor; + _sysAreaConfig = sysAreaConfig; + } + + + /// + ///根据查询条件获取招生计划 + /// + /// + /// + [HttpPost] + public async Task> PlanList([FromBody] seachzsplanfusionRequestDto request) + { + if (string.IsNullOrWhiteSpace(request.locationCode)) + { + throw Oops.Oh("locationCode参数不能为空"); + } + + //if (request.subjects == null || request.subjects.Count() <= 0) + //{ + // throw Oops.Oh("subjects参数 不能为空"); + //} + //if (!request.score.HasValue)//目前位次计算还没有好的计算方式,分数转位次只做参考,因还需考虑到选科组合不同对应位次细分问题 + //{ + // throw Oops.Oh("score参数 不能为空"); + //} + + var onekeylist = new List(); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var bejson = dbclient.GetCollection(string.Format("zsplanfusionmodel_{0}", request.locationCode)); + // 动态条件列表 + var filterBuilders = new List>(); + + if (request.feature != null) + { + filterBuilders.Add(Builders.Filter.All(p => p.features, request.feature)); + + } + if (request.province != null) + { + filterBuilders.Add(Builders.Filter.In(p => p.province, request.province)); + + } + + if (!string.IsNullOrWhiteSpace(request.keyword)) + { + filterBuilders.Add(Builders.Filter.Regex(p => p.majorName, new BsonRegularExpression($"/{request.keyword}/"))); + + } + if (!string.IsNullOrWhiteSpace(request.universityName)) + { + filterBuilders.Add(Builders.Filter.Regex(p => p.universityName, new BsonRegularExpression($"/{request.universityName}/"))); + + } + if (!string.IsNullOrWhiteSpace(request.batchName)) + { + filterBuilders.Add(Builders.Filter.Eq(p => p.batchName, request.batchName)); + + } + if (request.majors != null) + { + filterBuilders.Add(Builders.Filter.In(p => p.majorName, request.majors)); + + } + // 使用And组合所有过滤条件 + FilterDefinition filter = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) + : new BsonDocument(); // 如果没有条件,则使用空过滤器 + var sort = Builders.Sort.Ascending(x => x._score); // 替换YourField为实际的排序字段 + var pagelist = await bejson.Find(filter).ToListAsync(); + pagelist.ForEach(a => + { + var filter = Builders.Filter.Eq("_id", a._id); + + + #region ******浙江batchname + + //if (a._score >= 488) + //{ + // // 构建更新定义:将新字段添加到文档 + // var updateDefinition = Builders.Update.Set("batchName", "普通类一段"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + //} + //else if (a._score < 488 && a._score > 0) + //{ + // var updateDefinition = Builders.Update.Set("batchName", "普通类二段"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + //} + //else + //{ + + // var updateDefinition = Builders.Update.Set("batchName", "缺失"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + + //} + + #endregion ******浙江batchname + + + #region ******山东batchname + + //if (a._score >= 443) + //{ + // // 构建更新定义:将新字段添加到文档 + // var updateDefinition = Builders.Update.Set("batchName", "普通类一段"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + //} + //else if (a._score < 443 && a._score > 0) + //{ + // var updateDefinition = Builders.Update.Set("batchName", "普通类二段"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + //} + //else + //{ + + // var updateDefinition = Builders.Update.Set("batchName", "缺失"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + + //} + #endregion ******山东batchname + + + #region ***********河南batchbname******* + // 假设我们要更新的文档的过滤条件(这里以 _id 为例) + + //if (a.subjectType == "文科") + //{ + // if (a._score >= 547) + // { + // // 构建更新定义:将新字段添加到文档 + // var updateDefinition = Builders.Update.Set("batchName", "本一"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + // } + // else if (a._score < 547 && a._score >= 465) + // { + // var updateDefinition = Builders.Update.Set("batchName", "本二"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + + // } + // else if (a._score > 0 && a._score < 465) + // { + // var updateDefinition = Builders.Update.Set("batchName", "专科"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + // } + // else + // { + // var updateDefinition = Builders.Update.Set("batchName", "缺失"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + // } + //} + //if (a.subjectType == "理科") + //{ + // if (a._score >= 514) + // { + // // 构建更新定义:将新字段添加到文档 + // var updateDefinition = Builders.Update.Set("batchName", "本一"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + // } + // else if (a._score < 514 && a._score >= 409) + // { + // var updateDefinition = Builders.Update.Set("batchName", "本二"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + + // } + // else if (a._score > 0&&a._score<409) + // { + // var updateDefinition = Builders.Update.Set("batchName", "专科"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + // } + // else + // { + // var updateDefinition = Builders.Update.Set("batchName", "缺失"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + // } + //} + #endregion ***********河南batchbname******* + // 执行更新操作 + + + onekeylist.Add(new seachzsplanfusionResponse() + { + //type = MajorPlanscoreTool.GetPlanScore(a._score, request.score.Value), + //// percentAge = MajorPlanscoreTool.GetPlanPercentage(a._score, request.score.Value), + //percentAge = MajorPlanscoreTool.CalctPercentage(a.items.Select(c => c.score).ToList(), request.score.Value), + academic = a.academicYear, + cityName = a.city, + collegeCode = a.enrollmentCode, + features = a.features, + fee = a.fee, + lowScore = a._schoolScore, + lowscoreRank = a._schoolScoreLine, + majorGroup = string.IsNullOrWhiteSpace(a.majorGroup) ? "" : "(" + a.majorGroup.Split("(")[1], + major = a.majorName, + majorCode = a.majorCode, + planId = a.pid, + ownership = a.ownership, + planCount = a.planCount, + provinceName = a.province, + remark = a.remark, + subjectClam = a._23subject, + universityName = a.universityName, + // nature = a.nature, + subjectType = a.subjectType, + batchName = a.batchName + // planItems = a.items + }); + }); + + int totalPages = 0, totalCount = 0; + totalCount = onekeylist.Count; + totalPages = (int)Math.Ceiling((double)totalCount / request.PageSize); + var items = onekeylist.Skip((request.PageIndex - 1) * request.PageSize).Take(request.PageSize).ToList(); + return new PageBaseResult() + { + PageNo = request.PageIndex, + PageSize = request.PageSize, + TotalPage = totalPages, + TotalRows = totalCount, + Rows = items, + }; + } + + + + + + /// + ///根据院校id获取招生计划列表 + /// + /// + /// + [HttpGet] + public async Task> List([FromQuery] PlanProRequestDto request) + { + + //var unlist = new List(); + + // 动态条件列表 + var filterBuilders = new List>(); + + if (string.IsNullOrWhiteSpace(request.locationCode)) + { + throw Oops.Oh("locationCode 不能为空"); + } + filterBuilders.Add(Builders.Filter.Eq(p => p.location, request.locationCode)); + + if (request._uid <= 0) + { + throw Oops.Oh("用户id 不能为空"); + } + + + if (request._uid > 0) + { + filterBuilders.Add(Builders.Filter.Eq(p => p._uid, request._uid)); + } + + if (!string.IsNullOrWhiteSpace(request.years)) + { + filterBuilders.Add(Builders.Filter.Eq(p => p.years, request.years)); + } + if (!string.IsNullOrWhiteSpace(request.batchName)) + { + filterBuilders.Add(Builders.Filter.Eq(p => p.batchName, request.batchName)); + } + DateTime dt = DateTime.Now; + DateTime fixedDate = new DateTime(dt.Year, 7, 20); // 创建当前年份的7月20日 + int year = dt > fixedDate ? dt.Year : dt.Year - 1; // 比较当前日期与固定日期 + string years = string.IsNullOrWhiteSpace(request.years) ? year.ToString() : request.years; + // 使用And组合所有过滤条件 + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var bejson = dbclient.GetCollection(string.Format("zsplanpro_{0}_{1}", request.locationCode, years)); + FilterDefinition filter = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) + : new BsonDocument(); // 如果没有条件,则使用空过滤器 + var list = await bejson.Find(filter).ToListAsync(); + var result = list.Select(s => new PlanProOutDto() + { + batchName = s.batchName, + location = s.location, + major = s.major, + majorcode = s.majorcode, + majorgroupname = string.IsNullOrWhiteSpace(s.majorgroupname) ? "" : "(" + s.majorgroupname.Split("(")[1], + plancount = s.plancount, + remark = s.remark, + selectsubject = s.selectsubject, + years = s.years, + lowscorerank = s.lowscorerank.ToString() == "0" ? "--" : s.lowscorerank.ToString(), + lowscore = s.lowscore.ToString() == "0" ? "--" : s.lowscore.ToString(), + academic = s.academic, + universityCode = s.universityCode, + universityName = s.universityName, + fee = s.fee, + _uid = s._uid + }).ToList(); + return result; + } + + + /// + /// 根据院校id获取招生计划列表(V2) + /// + /// + /// + [HttpGet] + public async Task ListV2([FromQuery] PlanProRequestDto request) + { + var result = new PlanProMainDto(); + var filterBuilders = new List>(); + + if (string.IsNullOrWhiteSpace(request.locationCode)) + { + throw Oops.Oh("locationCode 不能为空"); + } + filterBuilders.Add(Builders.Filter.Eq(p => p.location, request.locationCode)); + + if (request._uid <= 0) + { + throw Oops.Oh("用户id 不能为空"); + } + filterBuilders.Add(Builders.Filter.Eq(p => p._uid, request._uid)); + + if (!string.IsNullOrWhiteSpace(request.years)) + { + filterBuilders.Add(Builders.Filter.Eq(p => p.years, request.years)); + } + + if (!string.IsNullOrWhiteSpace(request.batchName)) + { + filterBuilders.Add(Builders.Filter.Eq(p => p.batchName, request.batchName)); + } + + DateTime dt = DateTime.Now; + DateTime fixedDate = new DateTime(dt.Year, 7, 20); + int year = dt > fixedDate ? dt.Year : dt.Year - 1; + string years = string.IsNullOrWhiteSpace(request.years) ? year.ToString() : request.years; + + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var bejson = dbclient.GetCollection($"zsplanpro_{request.locationCode}_{years}"); + + // **查询符合 request 条件的计划数据** + FilterDefinition planFilter = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) + : new BsonDocument(); + + var list = await bejson.Find(planFilter).ToListAsync(); + + result.plans = list.Select(s => new PlanProOutDto() + { + batchName = s.batchName, + location = s.location, + major = s.major, + majorcode = s.majorcode, + majorgroupname = string.IsNullOrWhiteSpace(s.majorgroupname) ? "" : "(" + s.majorgroupname.Split("(")[1], + plancount = s.plancount, + remark = s.remark, + selectsubject = s.selectsubject, + years = s.years, + lowscorerank = s.lowscorerank.ToString() == "0" ? "--" : s.lowscorerank.ToString(), + lowscore = s.lowscore.ToString() == "0" ? "--" : s.lowscore.ToString(), + academic = s.academic, + universityCode = s.universityCode, + universityName = s.universityName, + fee = s.fee, + _uid = s._uid + }).ToList(); + + // **批次列表查询(不带 batchName 过滤)** + var batchFilter = Builders.Filter.Eq(p => p.location, request.locationCode); + var batchList = await bejson + .Find(batchFilter) + .Project(p => p.batchName) // 仅查询 batchName 字段 + .ToListAsync(); + result.Batches = batchList + .Distinct() // 去重 + .Select(b => new PlanBatchNameDto { batchName = b }) + .ToList(); + // 生成过去 4 年的年份列表 + List yearsList = new List(); + for (int i = 0; i < 4; i++) // 这里控制要多少年 + { + yearsList.Add((year - i).ToString()); + } + result.yearsDtos = yearsList; + return result; + } + + + + + + + /// + ///根据院校给出录取分数线 + /// + /// + [ApiDescriptionSettings(Name = "AdmissionMark"), HttpGet] + + public async Task AdmissionMark([FromQuery] PlanProRequestDto request) + { + var result = new planadmissionMarkDto(); + var filterBuilders = new List>(); + + if (string.IsNullOrWhiteSpace(request.locationCode)) + { + throw Oops.Oh("locationCode 不能为空"); + } + filterBuilders.Add(Builders.Filter.Eq(p => p.location, request.locationCode)); + + if (request._uid <= 0) + { + throw Oops.Oh("高校id 不能为空"); + } + filterBuilders.Add(Builders.Filter.Eq(p => p.college_id, request._uid)); + + if (!string.IsNullOrWhiteSpace(request.years)) + { + int y = int.Parse(request.years); + filterBuilders.Add(Builders.Filter.Eq(p => p.year, y)); + } + + DateTime dt = DateTime.Now; + DateTime fixedDate = new DateTime(dt.Year, 7, 20); + int year = dt > fixedDate ? dt.Year : dt.Year - 1; + string years = string.IsNullOrWhiteSpace(request.years) ? year.ToString() : request.years; + + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var bejson = dbclient.GetCollection($"zz_zsplanfusion_{request.locationCode}"); + + // **查询符合 request 条件的计划数据** + FilterDefinition planFilter = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) + : new BsonDocument(); + var list = await bejson.Find(planFilter).ToListAsync(); + result.newZsplanfusions = list.OrderBy(e => e.year).ToList(); + List yearsList = new List(); + for (int i = 0; i < 4; i++) // 这里控制要多少年 + { + yearsList.Add((year - i).ToString()); + } + result.Years = yearsList; + return result; + } + + + + /// + ///查询录取分数线V2 + /// + /// + /// + [ApiDescriptionSettings(Name = "AdmissionMarkV2"), HttpGet] + + public async Task AdmissionMarkV2([FromQuery] PlanProRequestDto request) + { + var result = new planadmissionMarkDto(); + var filterBuilders = new List>(); + + //if (string.IsNullOrWhiteSpace(request.locationCode)) + //{ + // throw Oops.Oh("locationCode 不能为空"); + //} + //filterBuilders.Add(Builders.Filter.Eq(p => p.lo, request.locationCode)); + + if (request._uid <= 0) + { + throw Oops.Oh("高校id 不能为空"); + } + filterBuilders.Add(Builders.Filter.Eq(p => p.school_id, request._uid)); + + if (!string.IsNullOrWhiteSpace(request.years)) + { + int y = int.Parse(request.years); + filterBuilders.Add(Builders.Filter.Eq(p => p.year, y)); + } + + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + string dbname = $"spscorenames_{request.locationCode.Substring(0, 2)}_{request.years}"; + var bejson = dbclient.GetCollection(dbname); + + // **查询符合 request 条件的计划数据** + FilterDefinition planFilter = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) + : new BsonDocument(); + var list = await bejson.Find(planFilter).ToListAsync(); + result.newZsplanfusions = list.Select(s => new newZsplanfusionDto() + { + b_college_name = s.name, + college_id = (int)s.school_id, + location = request.locationCode, + subject_name = s.sg_info, + group_code = s.sg_name, + group_name = s.sg_name, + major_code = s.sp_scode, + major_name = s.sp_name, + major_memo = s.spname, + score_min = s.min.ToString(), + rank_min = s.min_section.ToString(), + year = s.year, + score_max = s.max, + score_average = s.average, + volunteer_type = s.local_batch_name + }).ToList(); + + + DateTime dt = DateTime.Now; + DateTime fixedDate = new DateTime(dt.Year, 7, 20); + int year = dt > fixedDate ? dt.Year : dt.Year - 1; + string years = string.IsNullOrWhiteSpace(request.years) ? year.ToString() : request.years; + List yearsList = new List(); + for (int i = 0; i < 4; i++) // 这里控制要多少年 + { + yearsList.Add((year - i).ToString()); + } + result.Years = yearsList; + return result; + } + + + + + + #region #########更新批次数据########### + + + + + + #endregion #########更新批次数据########### + + [HttpGet] + public async Task SyncBatchNamessplanPro([FromQuery] PlanProRequestDto request) + { + //var filterBuilders = new List>(); + //var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + //var bejson = dbclient.GetCollection(string.Format("zsplanpro_{0}_{1}", request.locationCode, request.years)); + //var bulkOps = new List>(); + //// 构建过滤器 + //FilterDefinition filter = filterBuilders.Count > 0 + // ? Builders.Filter.And(filterBuilders) + // : Builders.Filter.Empty; + //// 查询数据 + //var list = await bejson.Find(filter).ToListAsync(); + //var _planpro = dbclient.GetCollection(string.Format("enroll_{0}_{1}", request.locationCode, request.years)); + //var enroll = await _planpro.Find(new BsonDocument()).ToListAsync(); + //list.ForEach(a => { + // var eb = enroll.FirstOrDefault(e => e.enrollmentCode == a.universityCode && e.majorCode == a.majorcode); + // if (eb != null) + // { + + // // 添加更新操作 + // var updateDefinition = Builders.Update.Set(x => x.batchName, eb.batchName); + // var updateOne = new UpdateOneModel( + // Builders.Filter.Eq(x => x._id, a._id), // 使用主键过滤 + // updateDefinition + // ); + // bulkOps.Add(updateOne); + // } + //}); + + //// 执行批量更新 + //if (bulkOps.Any()) + //{ + // var result = await bejson.BulkWriteAsync(bulkOps); + // Console.WriteLine($"Matched: {result.MatchedCount}, Modified: {result.ModifiedCount}"); + //} + + + var filterBuilders = new List>(); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var bejson = dbclient.GetCollection("zsplanfusion_330000"); + var bulkOps = new List>(); + // 构建过滤器 + FilterDefinition filter = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) + : Builders.Filter.Empty; + // 查询数据 + var list = await bejson.Find(filter).ToListAsync(); + var _planpro = dbclient.GetCollection(string.Format("enroll_{0}_{1}", request.locationCode, request.years)); + var enroll = await _planpro.Find(new BsonDocument()).ToListAsync(); + list.ForEach(a => + { + var eb = enroll.FirstOrDefault(e => e.enrollmentCode == a.enrollmentCode && e.majorCode == a.majorCode); + if (eb != null) + { + + // 添加更新操作 + var updateDefinition = Builders.Update.Set(x => x.batchName, eb.batchName); + var updateOne = new UpdateOneModel( + Builders.Filter.Eq(x => x._id, a._id), // 使用主键过滤 + updateDefinition + ); + bulkOps.Add(updateOne); + } + }); + + // 执行批量更新 + if (bulkOps.Any()) + { + var result = await bejson.BulkWriteAsync(bulkOps); + Console.WriteLine($"Matched: {result.MatchedCount}, Modified: {result.ModifiedCount}"); + } + + + return true; + } + + + #region*****临时更新数据**** + + /// + /// 临时更新数据 + /// + /// + /// + [HttpGet] + public async Task SyncZJZsplanPro([FromQuery] PlanProRequestDto request) + { + var filterBuilders = new List>(); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var bejson = dbclient.GetCollection(string.Format("zsplanpro_{0}_{1}", request.locationCode, request.years)); + + // 构建过滤器 + FilterDefinition filter = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) + : Builders.Filter.Empty; + + // 查询数据 + var list = await bejson.Find(filter).ToListAsync(); + + var university = dbclient.GetCollection("university"); + var unlist = await university.Find(Builders.Filter.Empty).ToListAsync(); + + // 更新 `_uid` 字段并生成批量更新操作 + var bulkOps = new List>(); + + //list.ForEach(a => + //{ + // var uninfo = unlist.FirstOrDefault(e => e.name == a.universityName); + // if (uninfo != null) + // { + // // a._uid = uninfo._id; + + // // 添加更新操作 + // var updateDefinition = Builders.Update.Set(x => x._uid, uninfo._id); + // var updateOne = new UpdateOneModel( + // Builders.Filter.Eq(x => x._id, a._id), // 使用主键过滤 + // updateDefinition + // ); + // bulkOps.Add(updateOne); + // } + //}); + + //// 执行批量更新 + //if (bulkOps.Any()) + //{ + // var result = await bejson.BulkWriteAsync(bulkOps); + // Console.WriteLine($"Matched: {result.MatchedCount}, Modified: {result.ModifiedCount}"); + //} + return true; + } + + + #endregion + + + #region *****录入数据 + [HttpGet] + public async Task zsplanfusiondatachange([FromQuery] string location, string key) + { + if (key != "ycymedu") + { + return false; + } + var filterBuilders = new List>(); + + FilterDefinition filter = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) + : new BsonDocument(); // 如果没有条件,则使用空过滤器 + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var bejson = dbclient.GetCollection(string.Format("zsplanfusion_{0}", location)); + var pagelist = await bejson.Find(filter).ToListAsync(); + + var list = new List(); + var ff = new List(); + pagelist.ForEach(c => + { + string batchname = string.Empty; + + #region ***四川*** + + if (c.subjectType == "文科") + { + if (c._23Score >= 527) + { + // 构建更新定义:将新字段添加到文档 + batchname = "本一"; + + + } + else if (c._23Score < 527 && c._23Score >= 458) + { + batchname = "本二"; + + } + else if (c._23Score > 0 && c._23Score < 458) + { + batchname = "专科"; + } + else + { + batchname = "缺失"; + } + } + if (c.subjectType == "理科") + { + if (c._23Score >= 520) + { + batchname = "本一"; + } + else if (c._23Score < 520 && c._23Score >= 433) + { + batchname = "本二"; + + } + else if (c._23Score > 0 && c._23Score < 433) + { + batchname = "专科"; + } + else + { + batchname = "缺失"; + } + } + #endregion + + #region ******浙江batchname + //list.ForEach(a => { + // if (a.lowscore >= 488) + // { + // // 构建更新定义:将新字段添加到文档 + // var updateDefinition = Builders.Update.Set("batchName", "普通类一段"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + // } + // else if (a._score < 488 && a._score > 0) + // { + // var updateDefinition = Builders.Update.Set("batchName", "普通类二段"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + // } + // else + // { + + // var updateDefinition = Builders.Update.Set("batchName", "缺失"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + + // } + + #endregion ******浙江batchname + + + #region ******山东batchname + + //if (a._score >= 443) + //{ + // // 构建更新定义:将新字段添加到文档 + // var updateDefinition = Builders.Update.Set("batchName", "普通类一段"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + //} + //else if (a._score < 443 && a._score > 0) + //{ + // var updateDefinition = Builders.Update.Set("batchName", "普通类二段"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + //} + //else + //{ + + // var updateDefinition = Builders.Update.Set("batchName", "缺失"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + + //} + #endregion ******山东batchname + + + #region ***********河南batchbname******* + // 假设我们要更新的文档的过滤条件(这里以 _id 为例) + + //if (a.subjectType == "文科") + //{ + // if (a._score >= 547) + // { + // // 构建更新定义:将新字段添加到文档 + // var updateDefinition = Builders.Update.Set("batchName", "本一"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + // } + // else if (a._score < 547 && a._score >= 465) + // { + // var updateDefinition = Builders.Update.Set("batchName", "本二"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + + // } + // else if (a._score > 0 && a._score < 465) + // { + // var updateDefinition = Builders.Update.Set("batchName", "专科"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + // } + // else + // { + // var updateDefinition = Builders.Update.Set("batchName", "缺失"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + // } + //} + //if (a.subjectType == "理科") + //{ + // if (a._score >= 514) + // { + // // 构建更新定义:将新字段添加到文档 + // var updateDefinition = Builders.Update.Set("batchName", "本一"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + // } + // else if (a._score < 514 && a._score >= 409) + // { + // var updateDefinition = Builders.Update.Set("batchName", "本二"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + + // } + // else if (a._score > 0&&a._score<409) + // { + // var updateDefinition = Builders.Update.Set("batchName", "专科"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + // } + // else + // { + // var updateDefinition = Builders.Update.Set("batchName", "缺失"); + // var updateResult = bejson.UpdateOne(filter, updateDefinition); + // } + //} + #endregion ***********河南batchbname******* + + + + list.Add(new zsplanfusionmodel() + { + batchName = batchname, + academicYear = c.academicYear, + city = c.city, + educationCategory = c.educationCategory, + enrollmentCode = c.enrollmentCode, + enrollmentType = c.enrollmentType, + features = c.lnstitutionalLevel == null ? ff : c.lnstitutionalLevel.Split("/", StringSplitOptions.RemoveEmptyEntries).ToList(), + fee = c.fee, + firstType = c.firstType, + location = c.location, + majorCode = c.majorCode, + majorGroup = string.IsNullOrWhiteSpace(c.majorGroup) ? "" : c.majorGroup.Split("(")[1], + majorName = c.majorName, + mjaorLevel = c.mjaorLevel == null ? ff : c.mjaorLevel.Split("/", StringSplitOptions.RemoveEmptyEntries).ToList(), + nature = c.nature, + ownership = c.ownership, + phDMajor = c.phDMajor,//要改回去 + pid = c.pid, + professionalAssessment = c.professionalAssessment, + province = c.province, + remark = c.remark, + subjectType = c.subjectType, + universityName = c.universityName, + _23subject = c._23subject, + _24subject = c._24subject, + _id = c._id, + _schoolAvgLine = c._schoolAvgLine.Value, + _schoolAvgScore = c._schoolAvgScore.Value, + _schoolScore = c._schoolScore, + _schoolScoreLine = c._schoolScoreLine, + _score = c._23Score, + planCount = c._23Count, + items = new List() + { + new PlanItem(){ + year="2023", + count=c._23Count, + planCount=c._23Count, + rankLine=c._23ScoreLine, + score = c._23Score, + }, + new PlanItem(){ + year="2022", + count=c._22Count, + planCount=c._22Count, + rankLine=c._22ScoreLine, + score = c._22Score, + }, + new PlanItem(){ + year="2021", + count=c._21Count, + planCount=c._21Count, + rankLine=c._21ScoreLine, + score = c._21Score, + } + + } + + + }); + + + + }); + + var newbson = dbclient.GetCollection(string.Format("zsplanfusionmodel_{0}", location)); + await newbson.InsertManyAsync(list); + return true; + } + + #endregion + + + + + /// + /// 一键填报 + /// + /// + /// + [HttpPost] + public async Task> OneKey([FromBody] zsplanfusionRequestDto request) + { + if (string.IsNullOrWhiteSpace(request.location)) + { + throw Oops.Oh("location参数不能为空"); + } + if (request.location == "410000") + { + request.p = 3; + } + if (!request.p.HasValue) + { + throw Oops.Oh("_p参数不能为空"); + } + + if (request.subjects == null || request.subjects.Count() <= 0) + { + throw Oops.Oh("subjects参数 不能为空"); + } + if (!request.score.HasValue)//目前位次计算还没有好的计算方式,分数转位次只做参考,因还需考虑到选科组合不同对应位次细分问题 + { + throw Oops.Oh("score参数 不能为空"); + } + + var onekeylist = new List(); + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + + var bejson = dbclient.GetCollection(string.Format("zsplanfusionmodel_{0}", request.location)); + // 动态条件列表 + var filterBuilders = new List>(); + + switch (request.p) + { + case 0: + request.subjects = request.subjects.Contains("理科") ? new string[] { "物", "化", "生" }.ToList() : new string[] { "史", "政", "地" }.ToList(); //选科如果是老的 就自动转换新基数 + break; + case 1: + case 2: + request.subjects = request.subjects; + break; + case 3: + request.subjects = request.location == "410000" ? (request.subjects.Contains("物") ? new string[] { "理科" }.ToList() : new string[] { "文科" }.ToList()) : request.subjects; + break; + } + + // 构建科目条件 + var subjects = request.subjects.Select(s => CalcuScoreFinder.GetTitle(s)).ToList(); + var filterItems = Builders.Filter.AnyIn(p => p.subjects, subjects) | + Builders.Filter.AnyEq(p => p.subjects, "不限"); + filterBuilders.Add(filterItems); + + // 设置查询条件:FieldToQuery在minValue和maxValue之间 + var minValue = request.score - 60; + var maxValue = request.score + 15; + if (request.startscore.HasValue && request.startscore > 0) + { + minValue = request.startscore.Value; + maxValue = request.endscore.Value; + } + filterBuilders.Add(Builders.Filter.Gte(e => e._score, minValue) & Builders.Filter.Lte(e => e._score, maxValue)); + if (request.province != null && request.province.Count() > 0) + { + filterBuilders.Add(Builders.Filter.In(e => e.province, request.province)); + } + if (request.majors != null && request.majors.Count() > 0) + { + filterBuilders.Add(Builders.Filter.In(e => e.majorName, request.majors)); + } + + if (!string.IsNullOrWhiteSpace(request.batchName)) + { + filterBuilders.Add(Builders.Filter.Eq(p => p.batchName, request.batchName)); + + } + if (!string.IsNullOrWhiteSpace(request.keyword)) + { + filterBuilders.Add(Builders.Filter.Regex(p => p.majorName, new BsonRegularExpression($"/{request.keyword}/"))); + } + + if (request.subjectType != null && request.subjectType.Count() > 0) + { + filterBuilders.Add(Builders.Filter.In(e => e.subjectType, request.subjectType)); + } + + if (request.nature != null && request.nature.Count() > 0) + { + filterBuilders.Add(Builders.Filter.In(e => e.nature, request.nature)); + } + // 使用And组合所有过滤条件 + FilterDefinition filter = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) + : new BsonDocument(); // 如果没有条件,则使用空过滤器 + var sort = Builders.Sort.Ascending(x => x._score); // 替换YourField为实际的排序字段 + var pagelist = await bejson.Find(filter).ToListAsync(); + var list = new List(); + var unjson = dbclient.GetCollection("university"); + var upagelist = pagelist.OrderByDescending(c => c._schoolScore);//最终应该是 冲 稳 保 各取一部分 + var uids = upagelist.Select(c => c.universityName).ToList(); + + var unfilter = Builders.Filter.In(doc => doc.name, uids); + + var unlist = unjson.Find(unfilter).ToList(); + var distunlist = unlist.Distinct().ToList(); + distunlist.ForEach(a => + { + onekeylist.Add(new OneKeyResponse() + { + uId = a._id, + logo = a.logo, + // type = pagelist.Where(e => e.universityName == a.name).FirstOrDefault)( MajorPlanscoreTool.GetPlanScore(a._score, request.score.Value), + // percentAge = MajorPlanscoreTool.GetPlanPercentage(a._score, request.score.Value), + // percentAge = MajorPlanscoreTool.CalctPercentage(a.items.Select(c => c.score).ToList(), request.score.Value), + //academic = a.academicYear, + collegeCode = upagelist.Where(e => e.universityName == a.name).FirstOrDefault().enrollmentCode, + cityName = a.cityName, + educationCategory = upagelist.Where(e => e.universityName == a.name).FirstOrDefault().educationCategory, + features = a.features, + ownership = upagelist.Where(e => e.universityName == a.name).FirstOrDefault().ownership, + provinceName = a.provinceName, + universityName = a.name, + nature = a.nature, + subjectType = upagelist.Where(e => e.universityName == a.name).FirstOrDefault().subjectType, + rank = a._id.ToString(), + type = MajorPlanscoreTool.GetPlanScore(upagelist.Where(e => e.universityName == a.name).FirstOrDefault()._schoolScore, request.score.Value), + majorItems = upagelist.Where(w => w.universityName == a.name).Select(c => new OneKeyMajorItem() + { + academic = c.academicYear, + fee = c.fee, + lowScore = c._score, + major = c.majorName, + majorCode = c.majorCode, + majorGroup = string.IsNullOrWhiteSpace(c.majorGroup) ? "" : "(" + c.majorGroup.Split("(")[1], + percentAge = MajorPlanscoreTool.GetPlanPercentage(c._score, request.score.Value), + planCount = c.planCount, + planId = c.pid, + planItems = c.items, + subjectClam = c._24subject, + type = MajorPlanscoreTool.GetPlanScore(c._score, request.score.Value), + remark = c.remark + }).ToList() + }); + + }); + var tmodel = new ZyTModel() + { + c = onekeylist.Where(e => e.type == 2).Count(), + b = onekeylist.Where(e => e.type == 0).Count(), + w = onekeylist.Where(e => e.type == 1).Count() + }; + + int totalPages = 0, totalCount = 0; + totalCount = onekeylist.Count; + totalPages = (int)Math.Ceiling((double)totalCount / request.PageSize); + var items = onekeylist.Skip((request.PageIndex - 1) * request.PageSize).Take(request.PageSize).ToList(); + return new PageBaseTrendsResult() + { + PageNo = request.PageIndex, + PageSize = request.PageSize, + TotalPage = totalPages, + TotalRows = totalCount, + TModel = tmodel, + Rows = items, + }; + } + + + /// + /// 一键填报 + /// + /// + /// + [HttpPost] + public async Task> OneKeyV2([FromBody] zsplanfusionRequestDto request) + { + int zycount = 0;//当前批次志愿组总数 + int majorsinglcount = 0;//专业组志愿数量 + // 参数校验 + if (string.IsNullOrWhiteSpace(request.location)) + throw Oops.Oh("location参数不能为空"); + + if (!request.p.HasValue) + throw Oops.Oh("_p参数不能为空"); + + if (request.subjects == null || !request.subjects.Any()) + throw Oops.Oh("subjects参数不能为空"); + + if (!request.score.HasValue) + throw Oops.Oh("score参数不能为空"); + + if (request.location == "410000") + { + request.p = 3; + } + var iscacheexit = _distributed.Get($"{CacheConst.KeyProvinceBatch}{request.location}"); + if (iscacheexit == null) + { + var areaconfig = await _sysAreaConfig.AsQueryable().Where(e => e.IsDelete == false && e.LocationCode == request.location).Select(s => new ZyBatchRule() { batchName = s.BatchName, Count = s.Count, ItemCount = s.ItemCount, }).ToListAsync(); + + zycount = areaconfig.FirstOrDefault(e => e.batchName == request.batchName).Count; + majorsinglcount = areaconfig.FirstOrDefault(e => e.batchName == request.batchName).ItemCount; + _distributed.Set($"{CacheConst.KeyProvinceBatch}{request.location}", Encoding.UTF8.GetBytes(areaconfig.ToJson()), new DistributedCacheEntryOptions() + .SetSlidingExpiration(TimeSpan.FromHours(24))); + } + else + { + var cachelocations = JsonConvert.DeserializeObject>(Encoding.UTF8.GetString(_distributed.Get($"{CacheConst.KeyProvinceBatch}{request.location}"))); + if (cachelocations.Any(e => e.batchName == request.batchName)) + { + zycount = cachelocations.FirstOrDefault(e => e.batchName == request.batchName).Count; + majorsinglcount = cachelocations.FirstOrDefault(e => e.batchName == request.batchName).ItemCount; + } + } + + Stopwatch sw = Stopwatch.StartNew(); + // 获取 MongoDB 客户端 + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var zsplanfusionCollection = dbclient.GetCollection($"zsplanfusionmodel_{request.location}"); + var universityCollection = dbclient.GetCollection("university"); + + + DateTime dt = DateTime.Now; + DateTime fixedDate = new DateTime(dt.Year, 7, 20); // 创建当前年份的7月20日 + int year = dt > fixedDate ? dt.Year : dt.Year - 1; // 比较当前日期与固定日期 + + // 动态条件列表 + var filterBuilders = new List>(); + + switch (request.p) + { + case 1: + case 2: + if (request.location == "310000") + { + request.score = request.score > 580 ? 580 : request.score; + } + request.subjects = request.subjects; + break; + case 3: + case 0: + request.subjects = request.location == "410000" ? (request.subjects.Contains("物") ? new string[] { "理科" }.ToList() : new string[] { "文科" }.ToList()) : request.subjects; + break; + } + // 构建科目条件 + var subjects = request.subjects.Select(s => CalcuScoreFinder.GetTitle(s)).ToList(); + var filterSubjects = Builders.Filter.AnyIn(p => p.subjects, subjects) | + Builders.Filter.AnyEq(p => p.subjects, "不限"); + filterBuilders.Add(filterSubjects); + + // 分数区间条件 + var minValue = request.startscore ?? (request.score.Value - 60); + var maxValue = request.endscore ?? (request.score.Value + 15); + filterBuilders.Add(Builders.Filter.Gte(e => e._score, minValue) & + Builders.Filter.Lte(e => e._score, maxValue)); + + // 动态添加其他条件 + if (request.province != null && request.province.Any()) + filterBuilders.Add(Builders.Filter.In(e => e.province, request.province)); + + if (request.majors != null && request.majors.Any()) + filterBuilders.Add(Builders.Filter.In(e => e.majorName, request.majors)); + + if (!string.IsNullOrWhiteSpace(request.batchName)) + filterBuilders.Add(Builders.Filter.Eq(p => p.batchName, request.batchName)); + + if (!string.IsNullOrWhiteSpace(request.keyword)) + filterBuilders.Add(Builders.Filter.Regex(p => p.majorName, new BsonRegularExpression($"/{request.keyword}/"))); + + if (request.subjectType != null && request.subjectType.Any()) + filterBuilders.Add(Builders.Filter.In(e => e.subjectType, request.subjectType)); + + if (request.nature != null && request.nature.Any()) + filterBuilders.Add(Builders.Filter.In(e => e.nature, request.nature)); + + // 使用 And 组合过滤器 + var finalFilter = filterBuilders.Any() + ? Builders.Filter.And(filterBuilders) + : Builders.Filter.Empty; + + // 定义排序规则 + var sort = Builders.Sort.Ascending(x => x._score); + + // 并行异步查询 MongoDB + var zsplanfusionTask = zsplanfusionCollection.Find(finalFilter).Sort(sort).ToListAsync(); + var universityTask = universityCollection.Find(FilterDefinition.Empty).ToListAsync(); + + await Task.WhenAll(zsplanfusionTask, universityTask); + + var zsplanfusionResults = await zsplanfusionTask; + var universityResults = await universityTask; + sw.Stop(); + + Console.WriteLine($"Database Query Elapsed Time: {sw.ElapsedMilliseconds / 1000} s"); + + // 将大学结果转为字典以加速匹配 + var universityDict = universityResults + .GroupBy(u => u.name) // 按 universityName 分组 + .ToDictionary( + g => g.Key, // 键为大学名称 + g => g.First() // 选择每组的第一个元素 + ); + + // 构建结果列表 + var onekeylist = new List(); + foreach (var group in zsplanfusionResults.GroupBy(z => z.universityName)) + { + if (!universityDict.TryGetValue(group.Key, out var university)) + continue; + + var majorItems = group.Select(c => new OneKeyMajorItem + { + uId = university._id, + academic = c.academicYear, + fee = c.fee, + lowScore = c._score, + major = c.majorName, + majorCode = c.majorCode, + majorGroup = string.IsNullOrWhiteSpace(c.majorGroup) ? "" : "(" + c.majorGroup.Split("(")[1], + percentAge = MajorPlanscoreTool.GetPlanPercentage(c._score, request.score.Value), + planCount = c.planCount, + planId = c.pid, + planItems = c.items, + subjectClam = c._24subject, + type = MajorPlanscoreTool.GetPlanScore(c._score, request.score.Value), + remark = c.remark + }).ToList(); + + onekeylist.Add(new OneKeyResponse + { + uId = university._id, + logo = university.logo, + type = MajorPlanscoreTool.GetPlanScore(group.FirstOrDefault()?._schoolScore ?? 0, request.score.Value), + rank = university.rank.ToString(), + universityName = university.name, + collegeCode = group.FirstOrDefault()?.enrollmentCode, + provinceName = university.provinceName, + cityName = university.cityName, + features = university.features, + ownership = group.FirstOrDefault()?.ownership, + subjectType = group.FirstOrDefault()?.subjectType, + educationCategory = group.FirstOrDefault()?.educationCategory, + nature = university.nature, + majorItems = majorItems + }); + } + + // 使用分类和取值逻辑过滤结果 + var keycollect = CWBUtil.ChangeVal(zycount, majorsinglcount); + var newitems = new List(); + + foreach (var type in new[] { 2, 1, 0 }) + { + var items = onekeylist + .Select(main => new OneKeyResponse + { + uId = main.uId, + logo = main.logo, + type = main.type, + rank = main.rank, + universityName = main.universityName, + collegeCode = main.collegeCode, + provinceName = main.provinceName, + cityName = main.cityName, + features = main.features, + ownership = main.ownership, + subjectType = main.subjectType, + nature = main.nature, + educationCategory = main.educationCategory, + majorItems = main.majorItems.Where(item => item.type == type).ToList() + }) + .Where(main => main.majorItems.Count > 0) + .SelectMany(main => main.majorItems.Select(item => new { Main = main, Item = item })) + .Take(type == 2 ? keycollect.Item1 : type == 1 ? keycollect.Item2 : keycollect.Item3) + .GroupBy(x => x.Main) + .Select(g => new OneKeyResponse + { + uId = g.Key.uId, + logo = g.Key.logo, + type = g.Key.type, + rank = g.Key.rank, + universityName = g.Key.universityName, + collegeCode = g.Key.collegeCode, + provinceName = g.Key.provinceName, + cityName = g.Key.cityName, + features = g.Key.features, + ownership = g.Key.ownership, + subjectType = g.Key.subjectType, + nature = g.Key.nature, + educationCategory = g.Key.educationCategory, + majorItems = g.Select(x => x.Item).ToList() + }) + .ToList(); + + if (items.Any()) + newitems.AddRange(items); + } + + // 合并 newitems 中相同 uId 的 OneKeyResponse + var mergedItems = newitems + .GroupBy(x => x.uId) + .Select(g => new OneKeyResponse + { + year = year, + uId = g.Key, + logo = g.First().logo, + type = g.First().type, + rank = g.First().rank, + universityName = g.First().universityName, + collegeCode = g.First().collegeCode, + provinceName = g.First().provinceName, + cityName = g.First().cityName, + features = g.First().features, + ownership = g.First().ownership, + subjectType = g.First().subjectType, + nature = g.First().nature, + educationCategory = g.First().educationCategory, + // 合并所有符合条件的 majorItems + majorItems = g.SelectMany(x => x.majorItems).Distinct().ToList() + }) + .ToList(); + var tmodel = new ZyTModel() + { + c = mergedItems.Where(e => e.majorItems.Any(a => a.type == 2)).Select(s => s.majorItems.Count()).Sum(), + b = mergedItems.Where(e => e.majorItems.Any(a => a.type == 1)).Select(s => s.majorItems.Count()).Sum(), + w = mergedItems.Where(e => e.majorItems.Any(a => a.type == 0)).Select(s => s.majorItems.Count()).Sum(), + }; + // 补充标识 + mergedItems.ForEach(item => + { + item.childItems = item.majorItems + .SelectMany(e => e.planItems ?? Enumerable.Empty()) + .GroupBy(pi => pi.year) + .Select(g => new UChildItem + { + year = g.Key, + planCount = g.Sum(pi => pi.planCount), + score = g.Average(pi => pi.score), + rankLine = g.Average(pi => pi.rankLine) + }) + .OrderByDescending(result => result.year) + .ToList(); + }); + + sw.Stop(); + Console.WriteLine($"Total Elapsed2 Time: {sw.ElapsedMilliseconds / 1000} s"); + return new PageBaseTrendsResult() + { + TModel = tmodel, + Rows = mergedItems.OrderByDescending(e => e.majorItems.Max(m => m.type)).ToList(), + }; + } + + + + + + /// + /// 智能填报展示接口 + /// + /// + /// + [HttpPost] + public async Task aiPerview([FromBody] zsplanfusionRequestDto request) + { + if (string.IsNullOrWhiteSpace(request.location)) + { + throw Oops.Oh("location参数不能为空"); + } + if (!request.p.HasValue) + { + throw Oops.Oh("_p参数不能为空"); + } + if (request.location == "410000") + { + request.p = 3; + } + if (request.subjects == null || request.subjects.Count() <= 0) + { + throw Oops.Oh("subjects参数 不能为空"); + } + if (!request.score.HasValue)//目前位次计算还没有好的计算方式,分数转位次只做参考,因还需考虑到选科组合不同对应位次细分问题 + { + throw Oops.Oh("score参数 不能为空"); + } + var aidto = new aiPerviewDto(); + var key = "ai_" + request.p + "_" + request.location + "_" + string.Join("_", request.subjects) + "_" + request.score; + var keylist = "list_" + request.p + "_" + request.location + "_" + string.Join("_", request.subjects) + "_" + request.score; + var _option = new DistributedCacheEntryOptions() + .SetSlidingExpiration(TimeSpan.FromHours(1)); + var onekeylist = new List(); + var pagelist = new List(); + var result = await _distributed.GetAsync(key); + if (result == null) + { + var dbclient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var bejson = dbclient.GetCollection(string.Format("zsplanfusionmodel_{0}", request.location)); + // 动态条件列表 + var filterBuilders = new List>(); + switch (request.p) + { + case 1: + case 2: + if (request.location == "310000") + { + request.score = request.score > 580 ? 580 : request.score; + } + request.subjects = request.subjects; + break; + case 3: + case 0: + request.subjects = request.location == "410000" ? (request.subjects.Contains("物") ? new string[] { "理科" }.ToList() : new string[] { "文科" }.ToList()) : request.subjects; + break; + } + + + if (!string.IsNullOrWhiteSpace(request.keyword)) + { + filterBuilders.Add(Builders.Filter.Regex(p => p.universityName, new BsonRegularExpression($"/{request.keyword}/"))); + } + // 构建科目条件 + var subjects = request.subjects.Select(s => CalcuScoreFinder.GetTitle(s)).ToList(); + var filterItems = Builders.Filter.AnyIn(p => p.subjects, subjects) | + Builders.Filter.AnyEq(p => p.subjects, "不限"); + filterBuilders.Add(filterItems); + var minValue = request.score - 60; + var maxValue = request.score + 15; + filterBuilders.Add(Builders.Filter.Gte(e => e._score, minValue) & Builders.Filter.Lte(e => e._score, maxValue)); + FilterDefinition filter = filterBuilders.Count > 0 + ? Builders.Filter.And(filterBuilders) + : new BsonDocument(); // 如果没有条件,则使用空过滤器 + var sort = Builders.Sort.Ascending(x => x._score); // 替换YourField为实际的排序字段 + pagelist = await bejson.Find(filter).ToListAsync(); + pagelist.ForEach(a => + { + onekeylist.Add(new AICollectResponse() + { + type = MajorPlanscoreTool.GetPlanScore(a._score, request.score.Value), + percentAge = MajorPlanscoreTool.GetPlanPercentage(a._score, request.score.Value), + batchName = a.batchName, + academic = a.academicYear, + collegeCode = a.enrollmentCode, + features = a.features, + fee = a.fee, + lowScore = a._schoolScore, + lowscoreRank = a._schoolScoreLine, + majorGroup = string.IsNullOrWhiteSpace(a.majorGroup) ? "" : "("+a.majorGroup.Split("(")[1], + major = a.majorName, + majorCode = a.majorCode, + planId = a.pid, + ownership = a.ownership, + planCount = a.planCount, + provinceName = a.province, + cityName = a.city, + remark = a.remark, + subjectClam = a._23subject, + universityName = a.universityName, + nature = a.nature, + subjectType = a.subjectType, + planItems = a.items, + educationCategory = a.educationCategory + }); + }); + + aidto.universities = new List() + { + new universityPerviewDto() + { + Name="985", + Count=onekeylist.Where(e=>e.features!=null&&e.features.Any(f => f.Trim().Contains("985"))).GroupBy(s => s.universityName) + .Count(), + }, + new universityPerviewDto() + { + Name="211", + Count=onekeylist.Where(e=>e.features!=null&&e.features.Any(f => f.Trim().Contains("211"))).GroupBy(s => s.universityName) + .Count(), + }, + new universityPerviewDto() + { + Name="双一流", + Count=onekeylist.Where(e=>e.features!=null&&e.features.Any(f => f.Trim().Contains("双一流"))).GroupBy(s => s.universityName) + .Count(), + }, + new universityPerviewDto() { + Name="保研", + Count=onekeylist.Where(e=>e.features!=null&&e.features.Any(f => f.Trim().Contains("保研"))).GroupBy(s => s.universityName) + .Count(), + }, + new universityPerviewDto() { + Name="公办", + Count=onekeylist.Where(e=>e.nature=="公办").GroupBy(s => s.universityName) + .Count(), + }, + new universityPerviewDto() { + Name="其他", + Count=onekeylist.Where(e=>e.features!=null&& + e.features.Any(f =>(!f.Trim().Contains("保研")&&!f.Trim().Contains("双一流")&&!f.Trim().Contains("211")&&!f.Trim().Contains("985")))).GroupBy(s => s.universityName) + .Count(), + }, + }; + aidto.pieChats = new List() + { + new pieChatsDto() { + name="需冲刺", + value=onekeylist.Where(e=>e.type==2).GroupBy(s => s.universityName) + .Count(), + }, + new pieChatsDto() { + name="较稳妥", + value=onekeylist.Where(e=>e.type==1).GroupBy(s => s.universityName) + .Count(), + }, + new pieChatsDto() { + name="可保底", + value=onekeylist.Where(e=>e.type==0).GroupBy(s => s.universityName) + .Count(), + } + }; + // await _distributed.SetAsync(keylist, Encoding.UTF8.GetBytes(onekeylist.ToJson()), _option); + await _distributed.SetAsync(key, Encoding.UTF8.GetBytes(aidto.ToJson()), _option); + } + else + { + aidto = JsonConvert.DeserializeObject(Encoding.UTF8.GetString(result)); + } + return aidto; + } + + + + + /// + /// 智能填报-院校列表信息 + /// + /// + /// + [HttpPost] + public async Task> aiUniversity([FromBody] zsplanfusionRequestDto request) + { + + // 参数校验 + if (string.IsNullOrWhiteSpace(request.location)) throw Oops.Oh("location参数不能为空"); + if (!request.p.HasValue) throw Oops.Oh("_p参数不能为空"); + if (request.subjects == null || !request.subjects.Any()) throw Oops.Oh("subjects参数不能为空"); + if (!request.score.HasValue) throw Oops.Oh("score参数不能为空"); + if (request.location == "410000") + { + request.p = 3; + } + // 缓存键生成 + var cacheKey = $"ai_{request.p}_{request.location}_{string.Join("_", request.subjects)}_{request.score}"; + var listKey = $"list_{request.p}_{request.location}_{string.Join("_", request.subjects)}_{request.score}"; + + var _cacheOptions = new DistributedCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromHours(1)); + var dbClient = _mongoRepository.Context.GetDatabase("zhiyuan"); + var collection = dbClient.GetCollection($"zsplanfusionmodel_{request.location}"); + + // 动态条件构建 + var filterBuilders = new List>(); + switch (request.p) + { + case 1: + case 2: + request.subjects = request.subjects; + break; + case 3: + case 0: + request.subjects = request.location == "410000" ? (request.subjects.Contains("物") ? new string[] { "理科" }.ToList() : new string[] { "文科" }.ToList()) : request.subjects; + break; + } + // 构建科目条件 + var subjects = request.subjects.Select(s => CalcuScoreFinder.GetTitle(s)).ToList(); + var filterItems = Builders.Filter.AnyIn(p => p.subjects, subjects) | + Builders.Filter.AnyEq(p => p.subjects, "不限"); + filterBuilders.Add(filterItems); + + // 分数范围过滤 + var minValue = request.score - 60; + var maxValue = request.score + 15; + if (request.startscore.HasValue && request.startscore > 0) + { + minValue = request.startscore.Value; + maxValue = request.endscore.Value; + } + filterBuilders.Add( + Builders.Filter.Gte(e => e._score, minValue) & + Builders.Filter.Lte(e => e._score, maxValue) + ); + + if (!string.IsNullOrWhiteSpace(request.keyword)) + { + filterBuilders.Add(Builders.Filter.Regex(p => p.universityName, new BsonRegularExpression($"/{request.keyword}/"))); + } + + // 执行查询 + var filter = Builders.Filter.And(filterBuilders); + var sortDefinition = Builders.Sort.Ascending(x => x._score); + + // 异步查询数据库 + var queryTask = collection.Find(filter).Sort(sortDefinition).ToListAsync(); + + // 获取所有符合条件的学校名称 + var universityCollection = dbClient.GetCollection("university"); + // var universityFilter = Builders.Filter.In(doc => doc.name, new List()); // 临时查询,用于后续操作 + var universityTask = universityCollection.Find(new BsonDocument()).ToListAsync(); + + // 等待所有异步查询操作完成 + await Task.WhenAll(queryTask, universityTask); + + // 获取查询结果 + var queryResults = queryTask.Result; + var universityData = universityTask.Result; + + // 构建返回列表 + var responseList = queryResults.Select(a => new AICollectResponse + { + _id = a.pid, + type = MajorPlanscoreTool.GetPlanScore(a._score, request.score.Value), + percentAge = MajorPlanscoreTool.GetPlanPercentage(a._score, request.score.Value), + academic = a.academicYear, + _score = a._score, + _scoreRank = a.rankLine, + collegeCode = a.enrollmentCode, + batchName = a.batchName, + features = a.features, + fee = a.fee, + lowScore = a._schoolScore, + lowscoreRank = a._schoolScoreLine, + majorGroup = string.IsNullOrWhiteSpace(a.majorGroup) ? "" : "(" + a.majorGroup.Split("(")[1], + major = CommonUtil.RemoveCarriageReturnsAndSpacesWithRegex(a.majorName), + majorCode = a.majorCode, + planId = a.pid, + ownership = a.ownership, + planCount = a.planCount, + provinceName = a.province, + cityName = a.city, + remark = a.remark, + subjectClam = a._24subject, + universityName = a.universityName, + nature = a.nature, + subjectType = a.subjectType, + planItems = a.items, + educationCategory = a.educationCategory, + }).ToList(); + + // 过滤和去重 + var universityNames = responseList + .WhereIF(request.province?.Any() == true, + c => request.province.Any(p => c.provinceName?.Contains(p) == true)) // 安全检查 provinceName + .WhereIF(!string.IsNullOrWhiteSpace(request.batchName), + c => c.batchName == request.batchName) + .WhereIF(request.majors?.Any() == true, + c => request.majors.Any(m => c.major?.Contains(m) == true)) // 安全检查 major + .WhereIF(request.subjectType?.Any() == true, + c => request.subjectType.Any(st => c.subjectType?.Contains(st) == true)) // 安全检查 subjectType + .WhereIF(request.nature?.Any() == true, + c => request.nature.Contains(c.nature)) // 如果 nature 也可能为 null,可加 ?.Contains + .Select(c => c.universityName).Distinct().ToList(); + + DateTime dt = DateTime.Now; + DateTime fixedDate = new DateTime(dt.Year, 7, 20); // 创建当前年份的7月20日 + int year = dt > fixedDate ? dt.Year : dt.Year - 1; // 比较当前日期与固定日期 + + + + // 转换为返回模型 + var resultList = universityNames.Select(name => + { + var universityGroup = responseList.Where(e => e.universityName == name); + var firstEntry = universityGroup.FirstOrDefault(); + return new OnekeyAiUniversityDto + { + _id = firstEntry._id, + city = firstEntry.cityName, + collegeCode = firstEntry.collegeCode, + unName = firstEntry.universityName, + educationCategory = firstEntry.educationCategory, + features = firstEntry.features, + lowScore = firstEntry.lowScore, + lowscoreRank = firstEntry.lowscoreRank, + year = year, + ownership = firstEntry.ownership, + province = firstEntry.provinceName, + nature = firstEntry.nature, + rank = string.IsNullOrEmpty(firstEntry.rank) ? "--" : firstEntry.rank, + type = MajorPlanscoreTool.GetPlanScore(firstEntry.lowScore, request.score.Value), + percentAge = MajorPlanscoreTool.GetPlanPercentage(firstEntry.lowScore, request.score.Value), + MajorCount = universityGroup.Count(), + planCount = universityGroup.Sum(e => e.planCount), + items = universityGroup.Select(s => new OnekeyAiMajorItem + { + planCount = s.planCount, + planId = s.planId, + items = s.planItems, + fee = s.fee, + major = CommonUtil.RemoveCarriageReturnsAndSpacesWithRegex(s.major), + majorCode = s.majorCode, + majorGroup = s.majorGroup, + percentAge = s.percentAge, + remark = s.remark, + subjectClam = s.subjectClam, + rankline = s._scoreRank, + score = s._score, + academic = s.academic, + type = s.type + }).ToList() + }; + }).ToList(); + + var tmodel = new ZyTModel() + { + c = resultList.Where(e => e.type == 2).Count(), + b = resultList.Where(e => e.type == 0).Count(), + w = resultList.Where(e => e.type == 1).Count() + }; + // 分页和其他数据获取 + var paginatedItems = resultList + .WhereIF(request.type.HasValue, e => e.items.Any(it => it.type == request.type)) + .OrderByDescending(e => e.lowScore) + .Skip((request.PageIndex - 1) * request.PageSize) + .Take(request.PageSize) + .ToList(); + + var totalCount = universityNames.Count; + var totalPages = (int)Math.Ceiling((double)totalCount / request.PageSize); + + // 补充标识和 Logo + paginatedItems.ForEach(item => + { + var university = universityData.FirstOrDefault(u => u.name == item.unName); + item.uId = university?._id ?? 0; + item.logo = university?.logo ?? "https://static-data.ycymedu.com/1105.jpg"; + if (item.items == null || !item.items.Any()) + { + item.childItems = new List(); + } + else + { + item.childItems = item.items + .SelectMany(e => e.items ?? Enumerable.Empty()) + .GroupBy(pi => pi.year) + .Select(g => new UChildItem + { + year = g.Key, + planCount = g.Sum(pi => pi.planCount), + score = (int)g.Average(pi => pi.score), + rankLine = (int)g.Average(pi => pi.rankLine) + }) + .OrderByDescending(result => result.year) + .ToList(); + } + }); + + return new PageBaseTrendsResult + { + TModel = tmodel, + Rows = paginatedItems, + TotalPage = totalPages, + TotalRows = totalCount, + PageNo = request.PageIndex, + PageSize = request.PageSize + }; + } + + + +} diff --git a/Admin.NET/Admin.NET.Core/Service/ZYSelect/DTO/SelectionDataModel.cs b/Admin.NET/Admin.NET.Core/Service/ZYSelect/DTO/SelectionDataModel.cs new file mode 100644 index 0000000..d931f55 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYSelect/DTO/SelectionDataModel.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service; + +/// +///表名规则 +///selection-省份-年份 +/// +public class SelectionDataModel +{ + + public string UniversityCode { get; set; } + + + public string UniversityName { get; set;} + + /// + /// 0本科 1 专科 + /// + public int Type { get; set;} + + public string MajorCode { get; set;} + /// + /// 专业(专业类) + /// + public string MajorName { get; set; } + + /// + /// 包含专业 + /// + public string MajorInclude { get; set;} + + /// + /// 选课要求 + /// + public string SubjectRequirements { get; set; } + + + + +} diff --git a/Admin.NET/Admin.NET.Core/Service/ZYSelect/DTO/SelectionRequest.cs b/Admin.NET/Admin.NET.Core/Service/ZYSelect/DTO/SelectionRequest.cs new file mode 100644 index 0000000..1bdae90 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYSelect/DTO/SelectionRequest.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Service; +public class SelectionRequest: PageBaseRequest +{ + public string UniversityName { get; set; } + + public string MajorName { get; set; } + + public string Location { get; set; } + + public int Years { get; set; } + +} + +public class SelectionRequestDto +{ + + /// + /// 这里 + /// + public string LocationCode { get; set; } + public List UniversityName { get; set; } + public List MajorName { get; set; } +} + +public class SelectionResponseDto +{ + + public string MajorName { get; set; } + public List selects { get; set; } + +} + +public class SelectResponseDto +{ + public string UniversityName { get; set; } + public string Selection { get; set; } + +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/ZYSelect/ZYSelectSubjectService.cs b/Admin.NET/Admin.NET.Core/Service/ZYSelect/ZYSelectSubjectService.cs new file mode 100644 index 0000000..41af25c --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Service/ZYSelect/ZYSelectSubjectService.cs @@ -0,0 +1,89 @@ +using Microsoft.Extensions.Caching.Distributed; +using Newtonsoft.Json.Serialization; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Flurl; +using Flurl.Http; +using MongoDB.Bson; + +namespace Admin.NET.Core.Service; + + +/// +/// 选科模块 +/// +[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 900)] +[Route("api/ZySelectSubject")] +public class ZYSelectSubjectService : IDynamicApiController, ITransient +{ + private readonly IDistributedCache _distributed; + private const string _cachekey = "news_"; + public ZYSelectSubjectService(IDistributedCache distributedCache) + { + _distributed = distributedCache; + } + + + /// + /// 根据院校和专业名称查询选科组合情况 + /// + /// + /// + [HttpGet] + public async Task Selection([FromQuery] SelectionRequest request) + { + try + { + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + var _option = new DistributedCacheEntryOptions() + .SetSlidingExpiration(TimeSpan.FromHours(4)); + var result = await string.Format("{0}api/FrontSelection", baseurl) + .SetQueryParams(request). + GetJsonAsync>(); + return result.response; + } + catch (Exception ex) + { + + throw Oops.Oh("网络开小差了~"); + } + } + + + + + /// + /// 根据院校和专业名称List查询选科组合情况 + /// + /// + /// + [HttpPost] + public async Task NewSelection([FromBody] SelectionRequestDto request) + { + try + { + var baseurl = App.GetConfig("OutExApi", true).BaseUrl; + var _option = new DistributedCacheEntryOptions() + .SetSlidingExpiration(TimeSpan.FromHours(4)); + var flurResponse = await string.Format("{0}api/FrontSelection/GetSelect", baseurl) + .PostJsonAsync(request); + var result = await flurResponse.GetJsonAsync>(); + + return result.response; + } + catch (Exception ex) + { + + throw Oops.Oh("网络开小差了~"); + } + } + + + + + +} diff --git a/Admin.NET/Admin.NET.Core/SignalR/SignalRSetup.cs b/Admin.NET/Admin.NET.Core/SignalR/SignalRSetup.cs new file mode 100644 index 0000000..7029ac3 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SignalR/SignalRSetup.cs @@ -0,0 +1,104 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Furion.Logging.Extensions; +using Microsoft.AspNetCore.DataProtection; +using Newtonsoft.Json; +using StackExchange.Redis; + +namespace Admin.NET.Core; + +public static class SignalRSetup +{ + /// + /// 即时消息SignalR注册 + /// + /// + /// + public static void AddSignalR(this IServiceCollection services, Action SetNewtonsoftJsonSetting) + { + var signalRBuilder = services.AddSignalR(options => + { + options.EnableDetailedErrors = true; + options.ClientTimeoutInterval = TimeSpan.FromMinutes(2); + options.KeepAliveInterval = TimeSpan.FromMinutes(1); + options.MaximumReceiveMessageSize = 1024 * 1024 * 10; // 数据包大小10M,默认最大为32K + }).AddNewtonsoftJsonProtocol(options => SetNewtonsoftJsonSetting(options.PayloadSerializerSettings)); + + // 若未启用Redis缓存,直接返回 + var cacheOptions = App.GetConfig("Cache", true); + if (cacheOptions.CacheType != CacheTypeEnum.Redis.ToString()) + return; + + // 若已开启集群配置,则把SignalR配置为支持集群模式 + var clusterOpt = App.GetConfig("Cluster", true); + if (!clusterOpt.Enabled) + return; + + var redisOptions = clusterOpt.SentinelConfig; + ConnectionMultiplexer connection1; + if (clusterOpt.IsSentinel) // 哨兵模式 + { + var redisConfig = new ConfigurationOptions + { + AbortOnConnectFail = false, + ServiceName = redisOptions.ServiceName, + AllowAdmin = true, + DefaultDatabase = redisOptions.DefaultDb, + Password = redisOptions.Password + }; + redisOptions.EndPoints.ForEach(u => redisConfig.EndPoints.Add(u)); + connection1 = ConnectionMultiplexer.Connect(redisConfig); + } + else + { + connection1 = ConnectionMultiplexer.Connect(clusterOpt.SignalR.RedisConfiguration); + } + // 密钥存储(数据保护) + services.AddDataProtection().PersistKeysToStackExchangeRedis(connection1, clusterOpt.DataProtecteKey); + + signalRBuilder.AddStackExchangeRedis(options => + { + // 此处设置的ChannelPrefix并不会生效,如果两个不同的项目,且[程序集名+类名]一样,使用同一个redis服务,请注意修改 Hub/OnlineUserHub 的类名。 + // 原因请参考下边链接: + // https://github.com/dotnet/aspnetcore/blob/f9121bc3e976ec40a959818451d126d5126ce868/src/SignalR/server/StackExchangeRedis/src/RedisHubLifetimeManager.cs#L74 + // https://github.com/dotnet/aspnetcore/blob/f9121bc3e976ec40a959818451d126d5126ce868/src/SignalR/server/StackExchangeRedis/src/Internal/RedisChannels.cs#L33 + options.Configuration.ChannelPrefix = new RedisChannel(clusterOpt.SignalR.ChannelPrefix, RedisChannel.PatternMode.Auto); + options.ConnectionFactory = async writer => + { + ConnectionMultiplexer connection; + if (clusterOpt.IsSentinel) + { + var config = new ConfigurationOptions + { + AbortOnConnectFail = false, + ServiceName = redisOptions.ServiceName, + AllowAdmin = true, + DefaultDatabase = redisOptions.DefaultDb, + Password = redisOptions.Password + }; + redisOptions.EndPoints.ForEach(u => config.EndPoints.Add(u)); + connection = await ConnectionMultiplexer.ConnectAsync(config, writer); + } + else + { + connection = await ConnectionMultiplexer.ConnectAsync(clusterOpt.SignalR.RedisConfiguration); + } + + connection.ConnectionFailed += (_, e) => + { + "连接 Redis 失败".LogError(); + }; + + if (!connection.IsConnected) + { + "无法连接 Redis".LogError(); + } + return connection; + }; + }); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SignatureAuth/GetAccessSecretContext.cs b/Admin.NET/Admin.NET.Core/SignatureAuth/GetAccessSecretContext.cs new file mode 100644 index 0000000..1708cf3 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SignatureAuth/GetAccessSecretContext.cs @@ -0,0 +1,27 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Microsoft.AspNetCore.Authentication; + +namespace Admin.NET.Core; + +/// +/// 获取 AccessKey 关联 AccessSecret 方法的上下文 +/// +public class GetAccessSecretContext : BaseContext +{ + public GetAccessSecretContext(HttpContext context, + AuthenticationScheme scheme, + SignatureAuthenticationOptions options) + : base(context, scheme, options) + { + } + + /// + /// 身份标识 + /// + public string AccessKey { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureAuthenticationDefaults.cs b/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureAuthenticationDefaults.cs new file mode 100644 index 0000000..ce42ff7 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureAuthenticationDefaults.cs @@ -0,0 +1,23 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// Signature 身份验证处理程序相关的默认值 +/// +public static class SignatureAuthenticationDefaults +{ + /// + /// SignatureAuthenticationOptions.AuthenticationScheme 使用的默认值 + /// + public const string AuthenticationScheme = "Signature"; + + /// + /// 附加在 HttpContext Item 中验证失败消息的 Key + /// + public const string AuthenticateFailMsgKey = "SignatureAuthenticateFailMsg"; +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureAuthenticationEvent.cs b/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureAuthenticationEvent.cs new file mode 100644 index 0000000..281ced8 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureAuthenticationEvent.cs @@ -0,0 +1,53 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// Signature 身份验证事件 +/// +public class SignatureAuthenticationEvent +{ + public SignatureAuthenticationEvent() + { + } + + /// + /// 获取或设置获取 AccessKey 的 AccessSecret 的逻辑处理 + /// + public Func> OnGetAccessSecret { get; set; } + + /// + /// 获取或设置质询的逻辑处理 + /// + public Func OnChallenge { get; set; } = _ => Task.CompletedTask; + + /// + /// 获取或设置已验证的逻辑处理 + /// + public Func OnValidated { get; set; } = _ => Task.CompletedTask; + + /// + /// 获取 AccessKey 的 AccessSecret + /// + /// + /// + public virtual Task GetAccessSecret(GetAccessSecretContext context) => OnGetAccessSecret?.Invoke(context) ?? throw new NotImplementedException($"需要提供 {nameof(OnGetAccessSecret)} 实现"); + + /// + /// 质询 + /// + /// + /// + public virtual Task Challenge(SignatureChallengeContext context) => OnChallenge?.Invoke(context) ?? Task.CompletedTask; + + /// + /// 已验证成功 + /// + /// + /// + public virtual Task Validated(SignatureValidatedContext context) => OnValidated?.Invoke(context) ?? Task.CompletedTask; +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureAuthenticationExtensions.cs b/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureAuthenticationExtensions.cs new file mode 100644 index 0000000..3910548 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureAuthenticationExtensions.cs @@ -0,0 +1,36 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Microsoft.AspNetCore.Authentication; + +namespace Admin.NET.Core; + +/// +/// Signature 身份验证扩展 +/// +public static class SignatureAuthenticationExtensions +{ + /// + /// 注册 Signature 身份验证处理模块 + /// + /// + /// + public static AuthenticationBuilder AddSignatureAuthentication(this AuthenticationBuilder builder) + { + return builder.AddSignatureAuthentication(options => { }); + } + + /// + /// 注册 Signature 身份验证处理模块 + /// + /// + /// + /// + public static AuthenticationBuilder AddSignatureAuthentication(this AuthenticationBuilder builder, Action options) + { + return builder.AddScheme(SignatureAuthenticationDefaults.AuthenticationScheme, options); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureAuthenticationHandler.cs b/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureAuthenticationHandler.cs new file mode 100644 index 0000000..9bce91e --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureAuthenticationHandler.cs @@ -0,0 +1,161 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Microsoft.AspNetCore.Authentication; +using System.Security.Claims; +using System.Security.Cryptography; +using System.Text.Encodings.Web; + +namespace Admin.NET.Core; + +/// +/// Signature 身份验证处理 +/// +public sealed class SignatureAuthenticationHandler : AuthenticationHandler +{ + private readonly SysCacheService _cacheService; + + public SignatureAuthenticationHandler(IOptionsMonitor options, + ILoggerFactory logger, + UrlEncoder encoder, + ISystemClock clock, + SysCacheService cacheService) + : base(options, logger, encoder, clock) + { + _cacheService = cacheService; + } + + private new SignatureAuthenticationEvent Events + { + get => (SignatureAuthenticationEvent)base.Events; + set => base.Events = value; + } + + /// + /// 确保创建的 Event 类型是 DigestEvents + /// + /// + protected override Task CreateEventsAsync() => throw new NotImplementedException($"{nameof(SignatureAuthenticationOptions)}.{nameof(SignatureAuthenticationOptions.Events)} 需要提供一个实例"); + + protected override async Task HandleAuthenticateAsync() + { + var accessKey = Request.Headers["accessKey"].FirstOrDefault(); + var timestampStr = Request.Headers["timestamp"].FirstOrDefault(); // 精确到秒 + var nonce = Request.Headers["nonce"].FirstOrDefault(); + var sign = Request.Headers["sign"].FirstOrDefault(); + + if (string.IsNullOrEmpty(accessKey)) + return await AuthenticateResultFailAsync("accessKey 不能为空"); + if (string.IsNullOrEmpty(timestampStr)) + return await AuthenticateResultFailAsync("timestamp 不能为空"); + if (string.IsNullOrEmpty(nonce)) + return await AuthenticateResultFailAsync("nonce 不能为空"); + if (string.IsNullOrEmpty(sign)) + return await AuthenticateResultFailAsync("sign 不能为空"); + + // 验证请求数据是否在可接受的时间内 + if (!long.TryParse(timestampStr, out var timestamp)) + return await AuthenticateResultFailAsync("timestamp 值不合法"); + + var requestDate = DateTimeUtil.ToLocalTimeDateBySeconds(timestamp); + if (requestDate > Clock.UtcNow.Add(Options.AllowedDateDrift).LocalDateTime || requestDate < Clock.UtcNow.Subtract(Options.AllowedDateDrift).LocalDateTime) + return await AuthenticateResultFailAsync("timestamp 值已超过允许的偏差范围"); + + // 获取 accessSecret + var getAccessSecretContext = new GetAccessSecretContext(Context, Scheme, Options) { AccessKey = accessKey }; + var accessSecret = await Events.GetAccessSecret(getAccessSecretContext); + if (string.IsNullOrEmpty(accessSecret)) + return await AuthenticateResultFailAsync("accessKey 无效"); + + // 校验签名 + var appSecretByte = Encoding.UTF8.GetBytes(accessSecret); + string serverSign = SignData(appSecretByte, GetMessageForSign(Context)); + + if (serverSign != sign) + return await AuthenticateResultFailAsync("sign 无效的签名"); + + // 重放检测 + var cacheKey = $"{CacheConst.KeyOpenAccessNonce}{accessKey}|{nonce}"; + if (_cacheService.ExistKey(cacheKey)) + return await AuthenticateResultFailAsync("重复的请求"); + _cacheService.Set(cacheKey, null, Options.AllowedDateDrift * 2); // 缓存过期时间为偏差范围时间的2倍 + + // 已验证成功 + var signatureValidatedContext = new SignatureValidatedContext(Context, Scheme, Options) + { + Principal = new ClaimsPrincipal(new ClaimsIdentity(SignatureAuthenticationDefaults.AuthenticationScheme)), + AccessKey = accessKey + }; + await Events.Validated(signatureValidatedContext); + // ReSharper disable once ConditionIsAlwaysTrueOrFalse + if (signatureValidatedContext.Result != null) + return signatureValidatedContext.Result; + + // ReSharper disable once HeuristicUnreachableCode + signatureValidatedContext.Success(); + return signatureValidatedContext.Result; + } + + protected override async Task HandleChallengeAsync(AuthenticationProperties properties) + { + var authResult = await HandleAuthenticateOnceSafeAsync(); + var challengeContext = new SignatureChallengeContext(Context, Scheme, Options, properties) + { + AuthenticateFailure = authResult.Failure, + }; + await Events.Challenge(challengeContext); + // 质询已处理 + if (challengeContext.Handled) return; + + await base.HandleChallengeAsync(properties); + } + + /// + /// 获取用于签名的消息 + /// + /// + private static string GetMessageForSign(HttpContext context) + { + var method = context.Request.Method; // 请求方法(大写) + var url = context.Request.Path; // 请求 url,去除协议、域名、参数,以 / 开头 + var accessKey = context.Request.Headers["accessKey"].FirstOrDefault(); // 身份标识 + var timestamp = context.Request.Headers["timestamp"].FirstOrDefault(); // 时间戳,精确到秒 + var nonce = context.Request.Headers["nonce"].FirstOrDefault(); // 唯一随机数 + + return $"{method}&{url}&{accessKey}&{timestamp}&{nonce}"; + } + + /// + /// 对数据进行签名 + /// + /// + /// + /// + private static string SignData(byte[] secret, string data) + { + if (secret == null) + throw new ArgumentNullException(nameof(secret)); + + if (data == null) + throw new ArgumentNullException(nameof(data)); + + using HMAC hmac = new HMACSHA256(); + hmac.Key = secret; + return Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(data))); + } + + /// + /// 返回验证失败结果,并在 Items 中增加 ,记录身份验证失败消息 + /// + /// + /// + private Task AuthenticateResultFailAsync(string message) + { + // 写入身份验证失败消息 + Context.Items[SignatureAuthenticationDefaults.AuthenticateFailMsgKey] = message; + return Task.FromResult(AuthenticateResult.Fail(message)); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureAuthenticationOptions.cs b/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureAuthenticationOptions.cs new file mode 100644 index 0000000..9b91ba2 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureAuthenticationOptions.cs @@ -0,0 +1,29 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Microsoft.AspNetCore.Authentication; + +namespace Admin.NET.Core; + +/// +/// Signature 身份验证选项 +/// +public class SignatureAuthenticationOptions : AuthenticationSchemeOptions +{ + /// + /// 请求时间允许的偏差范围 + /// + public TimeSpan AllowedDateDrift { get; set; } = TimeSpan.FromMinutes(5); + + /// + /// Signature 身份验证事件 + /// + public new SignatureAuthenticationEvent Events + { + get => (SignatureAuthenticationEvent)base.Events; + set => base.Events = value; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureChallengeContext.cs b/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureChallengeContext.cs new file mode 100644 index 0000000..a975bd4 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureChallengeContext.cs @@ -0,0 +1,33 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Microsoft.AspNetCore.Authentication; + +namespace Admin.NET.Core; + +/// +/// Signature 身份验证质询上下文 +/// +public class SignatureChallengeContext : PropertiesContext +{ + public SignatureChallengeContext(HttpContext context, + AuthenticationScheme scheme, + SignatureAuthenticationOptions options, + AuthenticationProperties properties) + : base(context, scheme, options, properties) + { + } + + /// + /// 在认证期间出现的异常 + /// + public Exception AuthenticateFailure { get; set; } + + /// + /// 指定是否已被处理,如果已处理,则跳过默认认证逻辑 + /// + public bool Handled { get; private set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureValidatedContext.cs b/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureValidatedContext.cs new file mode 100644 index 0000000..7bad7e3 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SignatureAuth/SignatureValidatedContext.cs @@ -0,0 +1,32 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Microsoft.AspNetCore.Authentication; + +namespace Admin.NET.Core; + +/// +/// Signature 身份验证已验证上下文 +/// +public class SignatureValidatedContext : ResultContext +{ + public SignatureValidatedContext(HttpContext context, + AuthenticationScheme scheme, + SignatureAuthenticationOptions options) + : base(context, scheme, options) + { + } + + /// + /// 身份标识 + /// + public string AccessKey { get; set; } + + /// + /// 密钥 + /// + public string AccessSecret { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SqlSugar/ISqlSugarEntitySeedData.cs b/Admin.NET/Admin.NET.Core/SqlSugar/ISqlSugarEntitySeedData.cs new file mode 100644 index 0000000..bad2faa --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SqlSugar/ISqlSugarEntitySeedData.cs @@ -0,0 +1,21 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 实体种子数据接口 +/// +/// +public interface ISqlSugarEntitySeedData + where TEntity : class, new() +{ + /// + /// 种子数据 + /// + /// + IEnumerable HasData(); +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SqlSugar/ISqlSugarRepository.cs b/Admin.NET/Admin.NET.Core/SqlSugar/ISqlSugarRepository.cs new file mode 100644 index 0000000..63fae4f --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SqlSugar/ISqlSugarRepository.cs @@ -0,0 +1,91 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 分表操作仓储接口 +/// +/// +public interface ISqlSugarRepository : ISugarRepository, ISimpleClient where T : class, new() +{ + /// + /// 创建数据 + /// + /// + /// + Task SplitTableInsertAsync(T input); + + /// + /// 批量创建数据 + /// + /// + /// + Task SplitTableInsertAsync(List input); + + /// + /// 更新数据 + /// + /// + /// + Task SplitTableUpdateAsync(T input); + + /// + /// 批量更新数据 + /// + /// + /// + Task SplitTableUpdateAsync(List input); + + /// + /// 删除数据 + /// + /// + /// + Task SplitTableDeleteableAsync(T input); + + /// + /// 批量删除数据 + /// + /// + /// + Task SplitTableDeleteableAsync(List input); + + /// + /// 获取第一条 + /// + /// + /// + Task SplitTableGetFirstAsync(Expression> whereExpression); + + /// + /// 判断是否存在 + /// + /// + /// + Task SplitTableIsAnyAsync(Expression> whereExpression); + + /// + /// 获取列表 + /// + /// + Task> SplitTableGetListAsync(); + + /// + /// 获取列表 + /// + /// + /// + Task> SplitTableGetListAsync(Expression> whereExpression); + + /// + /// 获取列表 + /// + /// + /// 表名 + /// + Task> SplitTableGetListAsync(Expression> whereExpression, string[] tableNames); +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarFilter.cs b/Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarFilter.cs new file mode 100644 index 0000000..05a9b02 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarFilter.cs @@ -0,0 +1,210 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +public static class SqlSugarFilter +{ + /// + /// 缓存全局查询过滤器(内存缓存) + /// + private static readonly ICache _cache = Cache.Default; + + /// + /// 删除用户机构缓存 + /// + /// + /// + public static void DeleteUserOrgCache(long userId, string dbConfigId) + { + var sysCacheService = App.GetRequiredService(); + + // 删除用户机构集合缓存 + sysCacheService.Remove($"{CacheConst.KeyUserOrg}{userId}"); + // 删除最大数据权限缓存 + sysCacheService.Remove($"{CacheConst.KeyRoleMaxDataScope}{userId}"); + // 删除用户机构(数据范围)缓存——过滤器 + _cache.Remove($"db:{dbConfigId}:orgList:{userId}"); + } + + /// + /// 配置用户机构集合过滤器 + /// + public static void SetOrgEntityFilter(SqlSugarScopeProvider db) + { + // 若仅本人数据,则直接返回 + if (SetDataScopeFilter(db) == (int)DataScopeEnum.Self) return; + + var userId = App.User?.FindFirst(ClaimConst.UserId)?.Value; + if (string.IsNullOrWhiteSpace(userId)) return; + + // 配置用户机构集合缓存 + var cacheKey = $"db:{db.CurrentConnectionConfig.ConfigId}:orgList:{userId}"; + var orgFilter = _cache.Get>(cacheKey); + if (orgFilter == null) + { + // 获取用户所属机构,保证同一作用域 + var orgIds = new List(); + Scoped.Create((factory, scope) => + { + var services = scope.ServiceProvider; + orgIds = services.GetService().GetUserOrgIdList().GetAwaiter().GetResult(); + }); + if (orgIds == null || orgIds.Count == 0) return; + + // 获取业务实体数据表 + var entityTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass + && u.IsSubclassOf(typeof(EntityBaseData))); + if (!entityTypes.Any()) return; + + orgFilter = new ConcurrentDictionary(); + foreach (var entityType in entityTypes) + { + // 排除非当前数据库实体 + var tAtt = entityType.GetCustomAttribute(); + if ((tAtt != null && db.CurrentConnectionConfig.ConfigId.ToString() != tAtt.configId.ToString())) + continue; + + var lambda = DynamicExpressionParser.ParseLambda(new[] { + Expression.Parameter(entityType, "u") }, typeof(bool), $"@0.Contains(u.{nameof(EntityBaseData.CreateOrgId)}??{default(long)})", orgIds); + db.QueryFilter.AddTableFilter(entityType, lambda); + orgFilter.TryAdd(entityType, lambda); + } + _cache.Add(cacheKey, orgFilter); + } + else + { + foreach (var filter in orgFilter) + db.QueryFilter.AddTableFilter(filter.Key, filter.Value); + } + } + + /// + /// 配置用户仅本人数据过滤器 + /// + private static int SetDataScopeFilter(SqlSugarScopeProvider db) + { + var maxDataScope = (int)DataScopeEnum.All; + + var userId = App.User?.FindFirst(ClaimConst.UserId)?.Value; + if (string.IsNullOrWhiteSpace(userId)) return maxDataScope; + + // 获取用户最大数据范围---仅本人数据 + maxDataScope = App.GetRequiredService().Get(CacheConst.KeyRoleMaxDataScope + userId); + if (maxDataScope != (int)DataScopeEnum.Self) return maxDataScope; + + // 配置用户数据范围缓存 + var cacheKey = $"db:{db.CurrentConnectionConfig.ConfigId}:dataScope:{userId}"; + var dataScopeFilter = _cache.Get>(cacheKey); + if (dataScopeFilter == null) + { + // 获取业务实体数据表 + var entityTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass + && u.IsSubclassOf(typeof(EntityBaseData))); + if (!entityTypes.Any()) return maxDataScope; + + dataScopeFilter = new ConcurrentDictionary(); + foreach (var entityType in entityTypes) + { + // 排除非当前数据库实体 + var tAtt = entityType.GetCustomAttribute(); + if ((tAtt != null && db.CurrentConnectionConfig.ConfigId.ToString() != tAtt.configId.ToString())) + continue; + + var lambda = DynamicExpressionParser.ParseLambda(new[] { + Expression.Parameter(entityType, "u") }, typeof(bool), $"u.{nameof(EntityBaseData.CreateUserId)}=@0", userId); + db.QueryFilter.AddTableFilter(entityType, lambda); + dataScopeFilter.TryAdd(entityType, lambda); + } + _cache.Add(cacheKey, dataScopeFilter); + } + else + { + foreach (var filter in dataScopeFilter) + db.QueryFilter.AddTableFilter(filter.Key, filter.Value); + } + return maxDataScope; + } + + /// + /// 配置自定义过滤器 + /// + public static void SetCustomEntityFilter(SqlSugarScopeProvider db) + { + // 配置自定义缓存 + var userId = App.User?.FindFirst(ClaimConst.UserId)?.Value; + var cacheKey = $"db:{db.CurrentConnectionConfig.ConfigId}:custom:{userId}"; + var tableFilterItemList = _cache.Get>>(cacheKey); + if (tableFilterItemList == null) + { + // 获取自定义实体过滤器 + var entityFilterTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass + && u.GetInterfaces().Any(i => i.HasImplementedRawGeneric(typeof(IEntityFilter)))); + if (!entityFilterTypes.Any()) return; + + var tableFilterItems = new List>(); + foreach (var entityFilter in entityFilterTypes) + { + var instance = Activator.CreateInstance(entityFilter); + var entityFilterMethod = entityFilter.GetMethod("AddEntityFilter"); + var entityFilters = ((IList)entityFilterMethod?.Invoke(instance, null))?.Cast(); + if (entityFilters == null) continue; + + foreach (var u in entityFilters) + { + var tableFilterItem = (TableFilterItem)u; + var entityType = tableFilterItem.GetType().GetProperty("type", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(tableFilterItem, null) as Type; + // 排除非当前数据库实体 + var tAtt = entityType.GetCustomAttribute(); + if ((tAtt != null && db.CurrentConnectionConfig.ConfigId.ToString() != tAtt.configId.ToString()) || + (tAtt == null && db.CurrentConnectionConfig.ConfigId.ToString() != SqlSugarConst.MainConfigId)) + continue; + + tableFilterItems.Add(tableFilterItem); + db.QueryFilter.Add(tableFilterItem); + } + } + _cache.Add(cacheKey, tableFilterItems); + } + else + { + tableFilterItemList.ForEach(u => + { + db.QueryFilter.Add(u); + }); + } + } +} + +/// +/// 自定义实体过滤器接口 +/// +public interface IEntityFilter +{ + /// + /// 实体过滤器 + /// + /// + IEnumerable> AddEntityFilter(); +} + +///// +///// 自定义业务实体过滤器示例 +///// +//public class TestEntityFilter : IEntityFilter +//{ +// public IEnumerable> AddEntityFilter() +// { +// // 构造自定义条件的过滤器 +// Expression> dynamicExpression = u => u.Remark.Contains("xxx"); +// var tableFilterItem = new TableFilterItem(typeof(SysUser), dynamicExpression); + +// return new[] +// { +// tableFilterItem +// }; +// } +//} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarPagedList.cs b/Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarPagedList.cs new file mode 100644 index 0000000..c53ddc5 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarPagedList.cs @@ -0,0 +1,153 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 分页泛型集合 +/// +/// +public class SqlSugarPagedList +{ + /// + /// 页码 + /// + public int Page { get; set; } + + /// + /// 页容量 + /// + public int PageSize { get; set; } + + /// + /// 总条数 + /// + public int Total { get; set; } + + /// + /// 总页数 + /// + public int TotalPages { get; set; } + + /// + /// 当前页集合 + /// + public IEnumerable Items { get; set; } + + /// + /// 是否有上一页 + /// + public bool HasPrevPage { get; set; } + + /// + /// 是否有下一页 + /// + public bool HasNextPage { get; set; } +} + +/// +/// 分页拓展类 +/// +public static class SqlSugarPagedExtensions +{ + /// + /// 分页拓展 + /// + /// 对象 + /// 当前页码,从1开始 + /// 页码容量 + /// 查询结果 Select 表达式 + /// + public static SqlSugarPagedList ToPagedList(this ISugarQueryable query, int pageIndex, int pageSize, + Expression> expression) + { + var total = 0; + var items = query.ToPageList(pageIndex, pageSize, ref total, expression); + return CreateSqlSugarPagedList(items, total, pageIndex, pageSize); + } + + /// + /// 分页拓展 + /// + /// 对象 + /// 当前页码,从1开始 + /// 页码容量 + /// + public static SqlSugarPagedList ToPagedList(this ISugarQueryable query, int pageIndex, int pageSize) + { + var total = 0; + var items = query.ToPageList(pageIndex, pageSize, ref total); + return CreateSqlSugarPagedList(items, total, pageIndex, pageSize); + } + + /// + /// 分页拓展 + /// + /// 对象 + /// 当前页码,从1开始 + /// 页码容量 + /// 查询结果 Select 表达式 + /// + public static async Task> ToPagedListAsync(this ISugarQueryable query, int pageIndex, int pageSize, + Expression> expression) + { + RefAsync total = 0; + var items = await query.ToPageListAsync(pageIndex, pageSize, total, expression); + return CreateSqlSugarPagedList(items, total, pageIndex, pageSize); + } + + /// + /// 分页拓展 + /// + /// 对象 + /// 当前页码,从1开始 + /// 页码容量 + /// + public static async Task> ToPagedListAsync(this ISugarQueryable query, int pageIndex, int pageSize) + { + RefAsync total = 0; + var items = await query.ToPageListAsync(pageIndex, pageSize, total); + return CreateSqlSugarPagedList(items, total, pageIndex, pageSize); + } + + /// + /// 分页拓展 + /// + /// 集合对象 + /// 当前页码,从1开始 + /// 页码容量 + /// + public static SqlSugarPagedList ToPagedList(this IEnumerable list, int pageIndex, int pageSize) + { + var total = list.Count(); + var items = list.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList(); + return CreateSqlSugarPagedList(items, total, pageIndex, pageSize); + } + + /// + /// 创建 对象 + /// + /// + /// 分页内容的对象集合 + /// 总条数 + /// 当前页码,从1开始 + /// 页码容量 + /// + private static SqlSugarPagedList CreateSqlSugarPagedList(IEnumerable items, int total, int pageIndex, int pageSize) + { + var totalPages = pageSize > 0 ? (int)Math.Ceiling(total / (double)pageSize) : 0; + return new SqlSugarPagedList + { + Page = pageIndex, + PageSize = pageSize, + Items = items, + Total = total, + TotalPages = totalPages, + HasNextPage = pageIndex < totalPages, + HasPrevPage = pageIndex - 1 > 0 + }; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarRepository.cs b/Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarRepository.cs new file mode 100644 index 0000000..a890ef0 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarRepository.cs @@ -0,0 +1,107 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// SqlSugar 实体仓储 +/// +/// +public class SqlSugarRepository : SimpleClient, ISqlSugarRepository where T : class, new() +{ + public SqlSugarRepository() + { + var iTenant = SqlSugarSetup.ITenant; // App.GetRequiredService().AsTenant(); + base.Context = iTenant.GetConnectionScope(SqlSugarConst.MainConfigId); + + // 若实体贴有多库特性,则返回指定库连接 + if (typeof(T).IsDefined(typeof(TenantAttribute), false)) + { + base.Context = iTenant.GetConnectionScopeWithAttr(); + return; + } + + // 若实体贴有日志表特性,则返回日志库连接 + if (typeof(T).IsDefined(typeof(LogTableAttribute), false)) + { + if (iTenant.IsAnyConnection(SqlSugarConst.LogConfigId)) + base.Context = iTenant.GetConnectionScope(SqlSugarConst.LogConfigId); + return; + } + + // 若实体贴有系统表特性,则返回默认库连接 + if (typeof(T).IsDefined(typeof(SysTableAttribute), false)) + return; + + // 若未贴任何表特性或当前未登录或是默认租户Id,则返回默认库连接 + var tenantId = App.User?.FindFirst(ClaimConst.TenantId)?.Value; + if (string.IsNullOrWhiteSpace(tenantId) || tenantId == SqlSugarConst.MainConfigId) return; + + // 根据租户Id切换库连接, 为空则返回默认库连接 + var sqlSugarScopeProviderTenant = App.GetRequiredService().GetTenantDbConnectionScope(long.Parse(tenantId)); + if (sqlSugarScopeProviderTenant == null) return; + base.Context = sqlSugarScopeProviderTenant; + } + + #region 分表操作 + + public async Task SplitTableInsertAsync(T input) + { + return await base.AsInsertable(input).SplitTable().ExecuteCommandAsync() > 0; + } + + public async Task SplitTableInsertAsync(List input) + { + return await base.AsInsertable(input).SplitTable().ExecuteCommandAsync() > 0; + } + + public async Task SplitTableUpdateAsync(T input) + { + return await base.AsUpdateable(input).SplitTable().ExecuteCommandAsync() > 0; + } + + public async Task SplitTableUpdateAsync(List input) + { + return await base.AsUpdateable(input).SplitTable().ExecuteCommandAsync() > 0; + } + + public async Task SplitTableDeleteableAsync(T input) + { + return await base.Context.Deleteable(input).SplitTable().ExecuteCommandAsync() > 0; + } + + public async Task SplitTableDeleteableAsync(List input) + { + return await base.Context.Deleteable(input).SplitTable().ExecuteCommandAsync() > 0; + } + + public Task SplitTableGetFirstAsync(Expression> whereExpression) + { + return base.AsQueryable().SplitTable().FirstAsync(whereExpression); + } + + public Task SplitTableIsAnyAsync(Expression> whereExpression) + { + return base.Context.Queryable().Where(whereExpression).SplitTable().AnyAsync(); + } + + public Task> SplitTableGetListAsync() + { + return Context.Queryable().SplitTable().ToListAsync(); + } + + public Task> SplitTableGetListAsync(Expression> whereExpression) + { + return Context.Queryable().Where(whereExpression).SplitTable().ToListAsync(); + } + + public Task> SplitTableGetListAsync(Expression> whereExpression, string[] tableNames) + { + return Context.Queryable().Where(whereExpression).SplitTable(t => t.InTableNames(tableNames)).ToListAsync(); + } + + #endregion 分表操作 +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarSetup.cs b/Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarSetup.cs new file mode 100644 index 0000000..5bb2bbe --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarSetup.cs @@ -0,0 +1,397 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +// 此源代码遵循位于源代码树根目录中的 LICENSE 文件的许可证 + +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动 + +// 任何基于本项目二次开发而产生的一切法律纠纷和责任,均与作者无关 + +namespace Admin.NET.Core; + +public static class SqlSugarSetup +{ + // 多租户实例 + public static ITenant ITenant { get; set; } + + /// + /// SqlSugar 上下文初始化 + /// + /// + public static void AddSqlSugar(this IServiceCollection services) + { + // 注册雪花Id + var snowIdOpt = App.GetConfig("SnowId", true); + YitIdHelper.SetIdGenerator(snowIdOpt); + + // 自定义 SqlSugar 雪花ID算法 + SnowFlakeSingle.WorkId = snowIdOpt.WorkerId; + StaticConfig.CustomSnowFlakeFunc = () => + { + return YitIdHelper.NextId(); + }; + + var dbOptions = App.GetConfig("DbConnection", true); + dbOptions.ConnectionConfigs.ForEach(SetDbConfig); + + SqlSugarScope sqlSugar = new(dbOptions.ConnectionConfigs.Adapt>(), db => + { + dbOptions.ConnectionConfigs.ForEach(config => + { + var dbProvider = db.GetConnectionScope(config.ConfigId); + SetDbAop(dbProvider, dbOptions.EnableConsoleSql); + SetDbDiffLog(dbProvider, config); + }); + }); + ITenant = sqlSugar; + + services.AddSingleton(sqlSugar); // 单例注册 + services.AddScoped(typeof(SqlSugarRepository<>)); // 仓储注册 + services.AddUnitOfWork(); // 事务与工作单元注册 + + // 初始化数据库表结构及种子数据 + dbOptions.ConnectionConfigs.ForEach(config => + { + InitDatabase(sqlSugar, config); + }); + } + + /// + /// 配置连接属性 + /// + /// + public static void SetDbConfig(DbConnectionConfig config) + { + var configureExternalServices = new ConfigureExternalServices + { + EntityNameService = (type, entity) => // 处理表 + { + entity.IsDisabledDelete = true; // 禁止删除非 sqlsugar 创建的列 + // 只处理贴了特性[SugarTable]表 + if (!type.GetCustomAttributes().Any()) + return; + if (config.DbSettings.EnableUnderLine && !entity.DbTableName.Contains('_')) + entity.DbTableName = UtilMethods.ToUnderLine(entity.DbTableName); // 驼峰转下划线 + }, + EntityService = (type, column) => // 处理列 + { + // 只处理贴了特性[SugarColumn]列 + if (!type.GetCustomAttributes().Any()) + return; + if (new NullabilityInfoContext().Create(type).WriteState is NullabilityState.Nullable) + column.IsNullable = true; + if (config.DbSettings.EnableUnderLine && !column.IsIgnore && !column.DbColumnName.Contains('_')) + column.DbColumnName = UtilMethods.ToUnderLine(column.DbColumnName); // 驼峰转下划线 + }, + DataInfoCacheService = new SqlSugarCache(), + }; + config.ConfigureExternalServices = configureExternalServices; + config.InitKeyType = InitKeyType.Attribute; + config.IsAutoCloseConnection = true; + config.MoreSettings = new ConnMoreSettings + { + IsAutoRemoveDataCache = true, // 启用自动删除缓存,所有增删改会自动调用.RemoveDataCache() + IsAutoDeleteQueryFilter = true, // 启用删除查询过滤器 + IsAutoUpdateQueryFilter = true, // 启用更新查询过滤器 + SqlServerCodeFirstNvarchar = true // 采用Nvarchar + }; + } + + /// + /// 配置Aop + /// + /// + /// + public static void SetDbAop(SqlSugarScopeProvider db, bool enableConsoleSql) + { + // 设置超时时间 + db.Ado.CommandTimeOut = 30; + + // 打印SQL语句 + if (enableConsoleSql) + { + db.Aop.OnLogExecuting = (sql, pars) => + { + //// 若参数值超过100个字符则进行截取 + //foreach (var par in pars) + //{ + // if (par.DbType != System.Data.DbType.String || par.Value == null) continue; + // if (par.Value.ToString().Length > 100) + // par.Value = string.Concat(par.Value.ToString()[..100], "......"); + //} + + var log = $"【{DateTime.Now}——执行SQL】\r\n{UtilMethods.GetNativeSql(sql, pars)}\r\n"; + var originColor = Console.ForegroundColor; + if (sql.StartsWith("SELECT", StringComparison.OrdinalIgnoreCase)) + Console.ForegroundColor = ConsoleColor.Green; + if (sql.StartsWith("UPDATE", StringComparison.OrdinalIgnoreCase) || sql.StartsWith("INSERT", StringComparison.OrdinalIgnoreCase)) + Console.ForegroundColor = ConsoleColor.Yellow; + if (sql.StartsWith("DELETE", StringComparison.OrdinalIgnoreCase)) + Console.ForegroundColor = ConsoleColor.Red; + // Console.WriteLine(log); + Console.ForegroundColor = originColor; + App.PrintToMiniProfiler("SqlSugar", "Info", log); + }; + db.Aop.OnError = ex => + { + if (ex.Parametres == null) return; + var log = $"【{DateTime.Now}——错误SQL】\r\n{UtilMethods.GetNativeSql(ex.Sql, (SugarParameter[])ex.Parametres)}\r\n"; + var originColor = Console.ForegroundColor; + Console.ForegroundColor = ConsoleColor.DarkRed; + Console.WriteLine(log); + Console.ForegroundColor = originColor; + App.PrintToMiniProfiler("SqlSugar", "Error", log); + }; + db.Aop.OnLogExecuted = (sql, pars) => + { + //// 若参数值超过100个字符则进行截取 + //foreach (var par in pars) + //{ + // if (par.DbType != System.Data.DbType.String || par.Value == null) continue; + // if (par.Value.ToString().Length > 100) + // par.Value = string.Concat(par.Value.ToString()[..100], "......"); + //} + + // 执行时间超过5秒时 + if (db.Ado.SqlExecutionTime.TotalSeconds > 5) + { + var fileName = db.Ado.SqlStackTrace.FirstFileName; // 文件名 + var fileLine = db.Ado.SqlStackTrace.FirstLine; // 行号 + var firstMethodName = db.Ado.SqlStackTrace.FirstMethodName; // 方法名 + var log = $"【{DateTime.Now}——超时SQL】\r\n【所在文件名】:{fileName}\r\n【代码行数】:{fileLine}\r\n【方法名】:{firstMethodName}\r\n" + $"【SQL语句】:{UtilMethods.GetNativeSql(sql, pars)}"; + var originColor = Console.ForegroundColor; + Console.ForegroundColor = ConsoleColor.DarkYellow; + Console.WriteLine(log); + Console.ForegroundColor = originColor; + App.PrintToMiniProfiler("SqlSugar", "Slow", log); + } + }; + } + // 数据审计 + db.Aop.DataExecuting = (oldValue, entityInfo) => + { + if (entityInfo.OperationType == DataFilterType.InsertByObject) + { + // 主键(long类型)且没有值的---赋值雪花Id + if (entityInfo.EntityColumnInfo.IsPrimarykey && entityInfo.EntityColumnInfo.PropertyInfo.PropertyType == typeof(long)) + { + var id = entityInfo.EntityColumnInfo.PropertyInfo.GetValue(entityInfo.EntityValue); + if (id == null || (long)id == 0) + entityInfo.SetValue(YitIdHelper.NextId()); + } + if (entityInfo.PropertyName == nameof(EntityBase.CreateTime)) + entityInfo.SetValue(DateTime.Now); + if (App.User != null) + { + if (entityInfo.PropertyName == nameof(EntityTenantId.TenantId)) + { + var tenantId = ((dynamic)entityInfo.EntityValue).TenantId; + if (tenantId == null || tenantId == 0) + entityInfo.SetValue(App.User.FindFirst(ClaimConst.TenantId)?.Value); + } + else if (entityInfo.PropertyName == nameof(EntityBase.CreateUserId)) + { + var createUserId = ((dynamic)entityInfo.EntityValue).CreateUserId; + if (createUserId == 0 || createUserId == null) + entityInfo.SetValue(App.User.FindFirst(ClaimConst.UserId)?.Value); + } + else if (entityInfo.PropertyName == nameof(EntityBase.CreateUserName)) + { + var createUserName = ((dynamic)entityInfo.EntityValue).CreateUserName; + if (string.IsNullOrEmpty(createUserName)) + entityInfo.SetValue(App.User.FindFirst(ClaimConst.RealName)?.Value); + } + else if (entityInfo.PropertyName == nameof(EntityBaseData.CreateOrgId)) + { + var createOrgId = ((dynamic)entityInfo.EntityValue).CreateOrgId; + if (createOrgId == 0 || createOrgId == null) + entityInfo.SetValue(App.User.FindFirst(ClaimConst.OrgId)?.Value); + } + else if (entityInfo.PropertyName == nameof(EntityBaseData.CreateOrgName)) + { + var createOrgName = ((dynamic)entityInfo.EntityValue).CreateOrgName; + if (string.IsNullOrEmpty(createOrgName)) + entityInfo.SetValue(App.User.FindFirst(ClaimConst.OrgName)?.Value); + } + } + } + if (entityInfo.OperationType == DataFilterType.UpdateByObject) + { + if (entityInfo.PropertyName == nameof(EntityBase.UpdateTime)) + entityInfo.SetValue(DateTime.Now); + else if (entityInfo.PropertyName == nameof(EntityBase.UpdateUserId)) + entityInfo.SetValue(App.User?.FindFirst(ClaimConst.UserId)?.Value); + else if (entityInfo.PropertyName == nameof(EntityBase.UpdateUserName)) + entityInfo.SetValue(App.User?.FindFirst(ClaimConst.RealName)?.Value); + } + }; + + // 超管排除其他过滤器 + if (App.User?.FindFirst(ClaimConst.AccountType)?.Value == ((int)AccountTypeEnum.SuperAdmin).ToString()) + return; + + // 配置假删除过滤器 + db.QueryFilter.AddTableFilter(u => u.IsDelete == false); + + // 配置租户过滤器 + var tenantId = App.User?.FindFirst(ClaimConst.TenantId)?.Value; + if (!string.IsNullOrWhiteSpace(tenantId)) + db.QueryFilter.AddTableFilter(u => u.TenantId == long.Parse(tenantId)); + + // 配置用户机构(数据范围)过滤器 + SqlSugarFilter.SetOrgEntityFilter(db); + + // 配置自定义过滤器 + SqlSugarFilter.SetCustomEntityFilter(db); + } + + /// + /// 开启库表差异化日志 + /// + /// + /// + private static void SetDbDiffLog(SqlSugarScopeProvider db, DbConnectionConfig config) + { + if (!config.DbSettings.EnableDiffLog) return; + + db.Aop.OnDiffLogEvent = async u => + { + var logDiff = new SysLogDiff + { + // 操作后记录(字段描述、列名、值、表名、表描述) + AfterData = JSON.Serialize(u.AfterData), + // 操作前记录(字段描述、列名、值、表名、表描述) + BeforeData = JSON.Serialize(u.BeforeData), + // 传进来的对象(如果对象为空,则使用首个数据的表名作为业务对象) + BusinessData = u.BusinessData == null ? u.AfterData.FirstOrDefault()?.TableName : JSON.Serialize(u.BusinessData), + // 枚举(insert、update、delete) + DiffType = u.DiffType.ToString(), + Sql = UtilMethods.GetNativeSql(u.Sql, u.Parameters), + Parameters = JSON.Serialize(u.Parameters), + Elapsed = u.Time == null ? 0 : (long)u.Time.Value.TotalMilliseconds + }; + var logDb = ITenant.IsAnyConnection(SqlSugarConst.LogConfigId) ? ITenant.GetConnectionScope(SqlSugarConst.LogConfigId) : db; + await logDb.CopyNew().Insertable(logDiff).ExecuteCommandAsync(); + Console.ForegroundColor = ConsoleColor.Red; + // Console.WriteLine(DateTime.Now + $"\r\n*****开始差异日志*****\r\n{Environment.NewLine}{JSON.Serialize(logDiff)}{Environment.NewLine}*****结束差异日志*****\r\n"); + }; + } + + /// + /// 初始化数据库 + /// + /// + /// + private static void InitDatabase(SqlSugarScope db, DbConnectionConfig config) + { + SqlSugarScopeProvider dbProvider = db.GetConnectionScope(config.ConfigId); + + // 初始化/创建数据库 + if (config.DbSettings.EnableInitDb) + { + if (config.DbType != SqlSugar.DbType.Oracle) + dbProvider.DbMaintenance.CreateDatabase(); + } + + // 初始化表结构 + if (config.TableSettings.EnableInitTable) + { + var entityTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass && u.IsDefined(typeof(SugarTable), false)) + .WhereIF(config.TableSettings.EnableIncreTable, u => u.IsDefined(typeof(IncreTableAttribute), false)).ToList(); + + if (config.ConfigId.ToString() == SqlSugarConst.MainConfigId) // 默认库(有系统表特性、没有日志表和租户表特性) + entityTypes = entityTypes.Where(u => u.GetCustomAttributes().Any() || (!u.GetCustomAttributes().Any() && !u.GetCustomAttributes().Any())).ToList(); + else if (config.ConfigId.ToString() == SqlSugarConst.LogConfigId) // 日志库 + entityTypes = entityTypes.Where(u => u.GetCustomAttributes().Any()).ToList(); + else + entityTypes = entityTypes.Where(u => u.GetCustomAttribute()?.configId.ToString() == config.ConfigId.ToString()).ToList(); // 自定义的库 + + foreach (var entityType in entityTypes) + { + if (entityType.GetCustomAttribute() == null) + dbProvider.CodeFirst.InitTables(entityType); + else + dbProvider.CodeFirst.SplitTables().InitTables(entityType); + } + } + + // 初始化种子数据 + if (config.SeedSettings.EnableInitSeed) + { + var seedDataTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass && u.GetInterfaces().Any(i => i.HasImplementedRawGeneric(typeof(ISqlSugarEntitySeedData<>)))) + .WhereIF(config.SeedSettings.EnableIncreSeed, u => u.IsDefined(typeof(IncreSeedAttribute), false)).ToList(); + + foreach (var seedType in seedDataTypes) + { + var entityType = seedType.GetInterfaces().First().GetGenericArguments().First(); + if (config.ConfigId.ToString() == SqlSugarConst.MainConfigId) // 默认库(有系统表特性、没有日志表和租户表特性) + { + if (entityType.GetCustomAttribute() == null && (entityType.GetCustomAttribute() != null || entityType.GetCustomAttribute() != null)) + continue; + } + else if (config.ConfigId.ToString() == SqlSugarConst.LogConfigId) // 日志库 + { + if (entityType.GetCustomAttribute() == null) + continue; + } + else + { + var att = entityType.GetCustomAttribute(); // 自定义的库 + if (att == null || att.configId.ToString() != config.ConfigId.ToString()) continue; + } + + var instance = Activator.CreateInstance(seedType); + var hasDataMethod = seedType.GetMethod("HasData"); + var seedData = ((IEnumerable)hasDataMethod?.Invoke(instance, null))?.Cast(); + if (seedData == null) continue; + + var entityInfo = dbProvider.EntityMaintenance.GetEntityInfo(entityType); + if (entityInfo.Columns.Any(u => u.IsPrimarykey)) + { + // 按主键进行批量增加和更新 + var storage = dbProvider.StorageableByObject(seedData.ToList()).ToStorage(); + storage.AsInsertable.ExecuteCommand(); + storage.AsUpdateable.ExecuteCommand(); + } + else + { + // 无主键则只进行插入 + if (!dbProvider.Queryable(entityInfo.DbTableName, entityInfo.DbTableName).Any()) + dbProvider.InsertableByObject(seedData.ToList()).ExecuteCommand(); + } + } + } + } + + /// + /// 初始化租户业务数据库 + /// + /// + /// + public static void InitTenantDatabase(ITenant iTenant, DbConnectionConfig config) + { + SetDbConfig(config); + + if (!iTenant.IsAnyConnection(config.ConfigId.ToString())) + iTenant.AddConnection(config); + var db = iTenant.GetConnectionScope(config.ConfigId.ToString()); + db.DbMaintenance.CreateDatabase(); + + // 获取所有业务表-初始化租户库表结构(排除系统表、日志表、特定库表) + var entityTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass && u.IsDefined(typeof(SugarTable), false) && + !u.IsDefined(typeof(SysTableAttribute), false) && !u.IsDefined(typeof(LogTableAttribute), false) && !u.IsDefined(typeof(TenantAttribute), false)).ToList(); + if (!entityTypes.Any()) return; + + foreach (var entityType in entityTypes) + { + var splitTable = entityType.GetCustomAttribute(); + if (splitTable == null) + db.CodeFirst.InitTables(entityType); + else + db.CodeFirst.SplitTables().InitTables(entityType); + } + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarUnitOfWork.cs b/Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarUnitOfWork.cs new file mode 100644 index 0000000..0975eef --- /dev/null +++ b/Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarUnitOfWork.cs @@ -0,0 +1,71 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// SqlSugar 事务和工作单元 +/// +public sealed class SqlSugarUnitOfWork : IUnitOfWork +{ + /// + /// SqlSugar 对象 + /// + private readonly ISqlSugarClient _sqlSugarClient; + + /// + /// 构造函数 + /// + /// + public SqlSugarUnitOfWork(ISqlSugarClient sqlSugarClient) + { + _sqlSugarClient = sqlSugarClient; + } + + /// + /// 开启工作单元处理 + /// + /// + /// + /// + public void BeginTransaction(FilterContext context, UnitOfWorkAttribute unitOfWork) + { + _sqlSugarClient.AsTenant().BeginTran(); + } + + /// + /// 提交工作单元处理 + /// + /// + /// + /// + public void CommitTransaction(FilterContext resultContext, UnitOfWorkAttribute unitOfWork) + { + _sqlSugarClient.AsTenant().CommitTran(); + } + + /// + /// 回滚工作单元处理 + /// + /// + /// + /// + public void RollbackTransaction(FilterContext resultContext, UnitOfWorkAttribute unitOfWork) + { + _sqlSugarClient.AsTenant().RollbackTran(); + } + + /// + /// 执行完毕(无论成功失败) + /// + /// + /// + /// + public void OnCompleted(FilterContext context, FilterContext resultContext) + { + _sqlSugarClient.Dispose(); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Util/AdminResultProvider.cs b/Admin.NET/Admin.NET.Core/Util/AdminResultProvider.cs new file mode 100644 index 0000000..0a555b8 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/AdminResultProvider.cs @@ -0,0 +1,172 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 全局规范化结果 +/// +[UnifyModel(typeof(AdminResult<>))] +public class AdminResultProvider : IUnifyResultProvider +{ + /// + /// JWT 授权异常返回值 + /// + /// + /// + /// + public IActionResult OnAuthorizeException(DefaultHttpContext context, ExceptionMetadata metadata) + { + return new JsonResult(RESTfulResult(metadata.StatusCode, data: metadata.Data, errors: metadata.Errors), UnifyContext.GetSerializerSettings(context)); + } + + /// + /// 异常返回值 + /// + /// + /// + /// + public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata) + { + return new JsonResult(RESTfulResult(metadata.StatusCode, data: metadata.Data, errors: metadata.Errors), UnifyContext.GetSerializerSettings(context)); + } + + /// + /// 成功返回值 + /// + /// + /// + /// + public IActionResult OnSucceeded(ActionExecutedContext context, object data) + { + return new JsonResult(RESTfulResult(StatusCodes.Status200OK, true, data), UnifyContext.GetSerializerSettings(context)); + } + + /// + /// 验证失败返回值 + /// + /// + /// + /// + public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata) + { + return new JsonResult(RESTfulResult(metadata.StatusCode ?? StatusCodes.Status400BadRequest, data: metadata.Data, errors: metadata.ValidationResult), UnifyContext.GetSerializerSettings(context)); + } + + /// + /// 特定状态码返回值 + /// + /// + /// + /// + /// + public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings) + { + // 设置响应状态码 + UnifyContext.SetResponseStatusCodes(context, statusCode, unifyResultSettings); + + switch (statusCode) + { + // 处理 401 状态码 + case StatusCodes.Status401Unauthorized: + var msg = "401 登录已过期,请重新登录"; + // 若存在身份验证失败消息,则返回消息内容 + if (context.Items.TryGetValue(SignatureAuthenticationDefaults.AuthenticateFailMsgKey, out var authFailMsg)) + msg = authFailMsg + ""; + await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: msg), + App.GetOptions()?.JsonSerializerOptions); + break; + // 处理 403 状态码 + case StatusCodes.Status403Forbidden: + await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: "403 禁止访问,没有权限"), + App.GetOptions()?.JsonSerializerOptions); + break; + // 处理 302 状态码 + case StatusCodes.Status302Found: + if (context.Response.Headers.TryGetValue("Location", out var redirectUrl)) + { + context.Response.Redirect(redirectUrl); + } + else + { + var errorMessage = "302 跳转失败,没有提供 Location 头信息"; + await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: errorMessage), + App.GetOptions()?.JsonSerializerOptions); + } + break; + + default: break; + } + } + + /// + /// 返回 RESTful 风格结果集 + /// + /// + /// + /// + /// + /// + private static AdminResult RESTfulResult(int statusCode, bool succeeded = default, object data = default, object errors = default) + { + //// 统一返回值脱敏处理 + //if (data?.GetType() == typeof(String)) + //{ + // data = App.GetRequiredService().ReplaceAsync(data.ToString(), '*').GetAwaiter().GetResult(); + //} + //else if (data?.GetType() == typeof(JsonResult)) + //{ + // data = App.GetRequiredService().ReplaceAsync(JSON.Serialize(data), '*').GetAwaiter().GetResult(); + //} + + return new AdminResult + { + Code = statusCode, + Message = errors is null or string ? (errors + "") : JSON.Serialize(errors), + Result = data, + Type = succeeded ? "success" : "error", + Extras = UnifyContext.Take(), + Time = DateTime.Now + }; + } +} + +/// +/// 全局返回结果 +/// +/// +public class AdminResult +{ + /// + /// 状态码 + /// + public int Code { get; set; } + + /// + /// 类型success、warning、error + /// + public string Type { get; set; } + + /// + /// 错误信息 + /// + public string Message { get; set; } + + /// + /// 数据 + /// + public T Result { get; set; } + + /// + /// 附加数据 + /// + public object Extras { get; set; } + + /// + /// 时间 + /// + public DateTime Time { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Util/BaseIdInput.cs b/Admin.NET/Admin.NET.Core/Util/BaseIdInput.cs new file mode 100644 index 0000000..bdc86b2 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/BaseIdInput.cs @@ -0,0 +1,20 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 主键Id输入参数 +/// +public class BaseIdInput +{ + /// + /// 主键Id + /// + [Required(ErrorMessage = "Id不能为空")] + [DataValidation(ValidationTypes.Numeric)] + public virtual long Id { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Util/BasePageInput.cs b/Admin.NET/Admin.NET.Core/Util/BasePageInput.cs new file mode 100644 index 0000000..88203f6 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/BasePageInput.cs @@ -0,0 +1,41 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 全局分页查询输入参数 +/// +public class BasePageInput +{ + /// + /// 当前页码 + /// + [DataValidation(ValidationTypes.Numeric)] + public virtual int Page { get; set; } = 1; + + /// + /// 页码容量 + /// + //[Range(0, 100, ErrorMessage = "页码容量超过最大限制")] + [DataValidation(ValidationTypes.Numeric)] + public virtual int PageSize { get; set; } = 20; + + /// + /// 排序字段 + /// + public virtual string Field { get; set; } + + /// + /// 排序方向 + /// + public virtual string Order { get; set; } + + /// + /// 降序排序 + /// + public virtual string DescStr { get; set; } = "descending"; +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Util/CWBUtil.cs b/Admin.NET/Admin.NET.Core/Util/CWBUtil.cs new file mode 100644 index 0000000..aa9266a --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/CWBUtil.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core; +public class CWBUtil +{ + + /// + ///冲稳保转换值 + /// + /// + /// + /// + public static Tuple ChangeVal(int Count, int ItemCount) + { + int totalVolunteers = Count * ItemCount; + // 计算冲、稳、保的数量 + int rushCount = (int)(totalVolunteers * 0.25); + int stableCount = (int)(totalVolunteers * 0.43); + int safeCount = totalVolunteers - rushCount - stableCount; + + return new Tuple(rushCount, stableCount, safeCount); + } + + + +} diff --git a/Admin.NET/Admin.NET.Core/Util/CalcuScoreFinder.cs b/Admin.NET/Admin.NET.Core/Util/CalcuScoreFinder.cs new file mode 100644 index 0000000..d4fdd0c --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/CalcuScoreFinder.cs @@ -0,0 +1,182 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core; +public class CalcuScoreFinder +{ + /// + /// 根据给定的位次找到对应的分数。 + /// + /// 考生位次。 + /// 分数段数据。 + /// 对应位次的分数。 + public static int FindScoreByRank(int rank, List data) + { + var result = data.FirstOrDefault(x => x.CumulativeCount.Value >= rank); + return result?.Score.Value ?? 0; + } + + + + /// + /// 根据给定的分数找到对应的位次。 + /// + /// + /// + /// + public static int FindPostion(int score, List data) + { + var result = data.FirstOrDefault(x => score >= x.Score.Value); + return result?.CumulativeCount.Value ?? 0; + } + + /// + /// 类型转换0综合 1物理 2历史 3理科 4文科 + /// + /// + /// + public static int ChangeSubjectName(string s) + { + int result = 0; + switch (s) + { + case "综合": + result = 0; + break; + case "物理": + result = 1; + break; + case "历史": + result = 2; + break; + case "理科": + result = 3; + break; + case "文科": + result = 4; + break; + } + return result; + } + + + /// + /// 获取科目名称 + /// + /// + /// + public static string GetSubjectid(int s) + { + string name = ""; + switch (s) + { + case 0: + name = "综合"; + break; + case 1: + name = "物理"; + break; + case 2: + name = "历史"; + break; + case 3: + name = "理科"; + break; + case 4: + name = "文科"; + break; + } + return name; + } + + + + /// + /// 调整选科数据格式 + /// + /// + /// + public static List GetSubjects(string s) + { + s = s.Replace("&", "和").Replace("|", "或"); + var sss = new List(); + if (string.IsNullOrWhiteSpace(s)) { return new List() { }; }; + string str = s.Replace("思想政治", "政治").Replace("不限科目", "不限"); + return str.Contains("或") ? str.Split("或").ToList() : str.Contains("和") ? str.Split("和").ToList() : new List { str }; + } + + + /// + /// 转换选科id类型:0 综合||1(物理)|2(历史)|3理科 |4 文科 + /// + /// + /// + public static int subjectidChange(int sub) + { + int result = 0; + switch (sub) + { + case 3: + result = 0; + break; + case 4: + result = 1; + break; + case 5: + result = 2; + break; + case 2: + result = 3; + break; + case 1: + result = 4; + break; + } + return result; + } + + + /// + /// 选科组合文字转换 + /// + /// + /// + public static string GetTitle(string s) + { + + string title = string.Empty; + switch (s) + { + case "物": + title = "物理"; + break; + case "化": + title = "化学"; + break; + case "生": + title = "生物"; + break; + + case "政": + title = "政治"; + break; + case "史": + title = "历史"; + break; + case "地": + title = "地理"; + break; + case "技": + title = "技术"; + break; + default: + title = s; + break; + } + return title; + } + +} diff --git a/Admin.NET/Admin.NET.Core/Util/CodeGenUtil.cs b/Admin.NET/Admin.NET.Core/Util/CodeGenUtil.cs new file mode 100644 index 0000000..640bcdf --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/CodeGenUtil.cs @@ -0,0 +1,293 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using DbType = SqlSugar.DbType; + +namespace Admin.NET.Core; + +/// +/// 代码生成帮助类 +/// +public static class CodeGenUtil +{ + /// + /// 转换大驼峰法命名 + /// + /// 字段名 + /// EntityBase 实体属性名称 + /// + public static string CamelColumnName(string columnName, string[] dbColumnNames) + { + if (columnName.Contains('_')) + { + var arrColName = columnName.Split('_'); + var sb = new StringBuilder(); + foreach (var col in arrColName) + { + if (col.Length > 0) + sb.Append(col[..1].ToUpper() + col[1..].ToLower()); + } + columnName = sb.ToString(); + } + else + { + var propertyName = dbColumnNames.FirstOrDefault(c => c.ToLower() == columnName.ToLower()); + if (!string.IsNullOrEmpty(propertyName)) + { + columnName = propertyName; + } + else + { + columnName = columnName[..1].ToUpper() + columnName[1..].ToLower(); + } + } + return columnName; + } + + // 根据数据库类型来处理对应的数据字段类型 + public static string ConvertDataType(DbColumnInfo dbColumnInfo, DbType dbType = DbType.Custom) + { + if (dbType == DbType.Custom) + dbType = App.GetOptions().ConnectionConfigs[0].DbType; + + var dataType = dbType switch + { + DbType.Oracle => ConvertDataType_OracleSQL(string.IsNullOrEmpty(dbColumnInfo.OracleDataType) ? dbColumnInfo.DataType : dbColumnInfo.OracleDataType, dbColumnInfo.Length, dbColumnInfo.Scale), + DbType.PostgreSQL => ConvertDataType_PostgreSQL(dbColumnInfo.DataType), + _ => ConvertDataType_Default(dbColumnInfo.DataType), + }; + return dataType + (dbColumnInfo.IsNullable ? "?" : ""); + } + + public static string ConvertDataType_OracleSQL(string dataType, int? length, int? scale) + { + switch (dataType.ToLower()) + { + case "interval year to month": + return "int"; + + case "interval day to second": + return "TimeSpan"; + + case "smallint": + return "Int16"; + + case "int": + case "integer": + return "int"; + + case "long": + return "long"; + + case "float": + return "float"; + + case "decimal": + return "decimal"; + + case "number": + if (length != null) + { + if (scale != null && scale > 0) + { + return "decimal"; + } + else if ((scale != null && scale == 0) || scale == null) + { + if (length > 1 && length < 12) + { + return "int"; + } + else if (length > 11) + { + return "long"; + } + } + if (length == 1) + { + return "bool"; + } + } + return "decimal"; + + case "char": + case "clob": + case "nclob": + case "nchar": + case "nvarchar": + case "varchar": + case "nvarchar2": + case "varchar2": + case "rowid": + return "string"; + + case "timestamp": + case "timestamp with time zone": + case "timestamptz": + case "timestamp without time zone": + case "date": + case "time": + case "time with time zone": + case "timetz": + case "time without time zone": + return "DateTime"; + + case "bfile": + case "blob": + case "raw": + return "byte[]"; + + default: + return "object"; + } + } + + //PostgreSQL数据类型对应的字段类型 + public static string ConvertDataType_PostgreSQL(string dataType) + { + switch (dataType) + { + case "int2": + case "smallint": + return "Int16"; + + case "int4": + case "integer": + return "int"; + + case "int8": + case "bigint": + return "long"; + + case "float4": + case "real": + return "float"; + + case "float8": + case "double precision": + return "double"; + + case "numeric": + case "decimal": + case "path": + case "point": + case "polygon": + case "interval": + case "lseg": + case "macaddr": + case "money": + return "decimal"; + + case "boolean": + case "bool": + case "box": + case "bytea": + return "bool"; + + case "varchar": + case "character varying": + case "geometry": + case "name": + case "text": + case "char": + case "character": + case "cidr": + case "circle": + case "tsquery": + case "tsvector": + case "txid_snapshot": + case "xml": + case "json": + return "string"; + + case "uuid": + return "Guid"; + + case "timestamp": + case "timestamp with time zone": + case "timestamptz": + case "timestamp without time zone": + case "date": + case "time": + case "time with time zone": + case "timetz": + case "time without time zone": + return "DateTime"; + + case "bit": + case "bit varying": + return "byte[]"; + + case "varbit": + return "byte"; + + default: + return "object"; + } + } + + public static string ConvertDataType_Default(string dataType) + { + return dataType.ToLower() switch + { + "tinytext" or "mediumtext" or "longtext" or "mid" or "text" or "varchar" or "char" or "nvarchar" or "nchar" or "timestamp" => "string", + "int" => "int", + "smallint" => "Int16", + //"tinyint" => "byte", + "tinyint" => "bool", // MYSQL + "bigint" or "integer" => "long", + "bit" => "bool", + "money" or "smallmoney" or "numeric" or "decimal" => "decimal", + "real" => "Single", + "datetime" or "smalldatetime" => "DateTime", + "float" or "double" => "double", + "image" or "binary" or "varbinary" => "byte[]", + "uniqueidentifier" => "Guid", + _ => "object", + }; + } + + /// + /// 数据类型转显示类型 + /// + /// + /// + public static string DataTypeToEff(string dataType) + { + if (string.IsNullOrEmpty(dataType)) return ""; + return dataType?.TrimEnd('?') switch + { + "string" => "Input", + "int" => "InputNumber", + "long" => "Input", + "float" => "Input", + "double" => "Input", + "decimal" => "Input", + "bool" => "Switch", + "Guid" => "Input", + "DateTime" => "DatePicker", + _ => "Input", + }; + } + + // 是否通用字段 + public static bool IsCommonColumn(string columnName) + { + var columnList = new List() + { + nameof(EntityBaseData.CreateOrgId), + nameof(EntityTenant.TenantId), + nameof(EntityBase.CreateTime), + nameof(EntityBase.UpdateTime), + nameof(EntityBase.CreateUserId), + nameof(EntityBase.UpdateUserId), + nameof(EntityBase.CreateUserName), + nameof(EntityBase.UpdateUserName), + nameof(EntityBase.IsDelete) + }; + return columnList.Contains(columnName); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Util/CommonUtil.cs b/Admin.NET/Admin.NET.Core/Util/CommonUtil.cs new file mode 100644 index 0000000..a6c9457 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/CommonUtil.cs @@ -0,0 +1,156 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using System.Xml; +using System.Xml.Linq; +using System.Xml.Serialization; + +namespace Admin.NET.Core; + +/// +/// 通用工具类 +/// +public static class CommonUtil +{ + + + + /// + /// 去掉字符串和空格 + /// + /// + /// + public static string RemoveCarriageReturnsAndSpacesWithRegex(string input) + { + if (string.IsNullOrEmpty(input)) + { + return input; + } + return Regex.Replace(input, @"\s+", ""); // \s+ 匹配所有空白字符,包括换行、空格、制表符等 + } + /// + /// 生成百分数 + /// + /// + /// + /// + public static string ExecPercent(decimal PassCount, decimal allCount) + { + string res = ""; + if (allCount > 0) + { + var value = (double)Math.Round(PassCount / allCount * 100, 1); + if (value < 0) + res = Math.Round(value + 5 / Math.Pow(10, 0 + 1), 0, MidpointRounding.AwayFromZero).ToString(); + else + res = Math.Round(value, 0, MidpointRounding.AwayFromZero).ToString(); + } + if (res == "") res = "0"; + return res + "%"; + } + + /// + /// 获取服务地址 + /// + /// + public static string GetLocalhost() + { + string result = $"{App.HttpContext.Request.Scheme}://{App.HttpContext.Request.Host.Value}"; + + // 代理模式:获取真正的本机地址 + // X-Original-Host=原始请求 + // X-Forwarded-Server=从哪里转发过来 + if (App.HttpContext.Request.Headers.ContainsKey("Origin")) // 配置成完整的路径如(结尾不要带"/"),比如 https://www.abc.com + result = $"{App.HttpContext.Request.Headers["Origin"]}"; + else if (App.HttpContext.Request.Headers.ContainsKey("X-Original")) // 配置成完整的路径如(结尾不要带"/"),比如 https://www.abc.com + result = $"{App.HttpContext.Request.Headers["X-Original"]}"; + else if (App.HttpContext.Request.Headers.ContainsKey("X-Original-Host")) + result = $"{App.HttpContext.Request.Scheme}://{App.HttpContext.Request.Headers["X-Original-Host"]}"; + return result; + } + + /// + /// 对象序列化XML + /// + /// + /// + /// + public static string SerializeObjectToXml(T obj) + { + if (obj == null) return string.Empty; + + var xs = new XmlSerializer(obj.GetType()); + var stream = new MemoryStream(); + var setting = new XmlWriterSettings + { + Encoding = new UTF8Encoding(false), // 不包含BOM + Indent = true // 设置格式化缩进 + }; + using (var writer = XmlWriter.Create(stream, setting)) + { + var ns = new XmlSerializerNamespaces(); + ns.Add("", ""); // 去除默认命名空间 + xs.Serialize(writer, obj, ns); + } + return Encoding.UTF8.GetString(stream.ToArray()); + } + + /// + /// 字符串转XML格式 + /// + /// + /// + public static XElement SerializeStringToXml(string xmlStr) + { + try + { + return XElement.Parse(xmlStr); + } + catch + { + return null; + } + } + + /// + /// 导出模板Excel + /// + /// + /// + /// + public static async Task ExportExcelTemplate(string fileName, dynamic fileDto) + { + fileName = $"{fileName}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx"; + + IImporter importer = new ExcelImporter(); + MethodInfo generateTemplateMethod = importer.GetType().GetMethod("GenerateTemplate"); + MethodInfo closedGenerateTemplateMethod = generateTemplateMethod.MakeGenericMethod(fileDto.GetType()); + var res = await (Task)closedGenerateTemplateMethod.Invoke(importer, new object[] { Path.Combine(App.WebHostEnvironment.WebRootPath, fileName) }); + + return new FileStreamResult(new FileStream(res.FileName, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName }; + } + + /// + /// 导入数据Excel + /// + /// + /// + /// + public static async Task ImportExcelData([Required] IFormFile file, dynamic dataDto) + { + var newFile = await App.GetRequiredService().UploadFile(file, ""); + var filePath = Path.Combine(App.WebHostEnvironment.WebRootPath, newFile.FilePath, newFile.Id.ToString(), newFile.Suffix); + + IImporter importer = new ExcelImporter(); + MethodInfo importMethod = importer.GetType().GetMethod("Import"); + MethodInfo closedImportMethod = importMethod.MakeGenericMethod(dataDto.GetType()); + var res = await (Task)closedImportMethod.Invoke(importer, new object[] { filePath }); + if (res == null || res.Exception != null) + throw Oops.Oh("导入异常:" + res.Exception); + + return res.Data; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Util/ComputerUtil.cs b/Admin.NET/Admin.NET.Core/Util/ComputerUtil.cs new file mode 100644 index 0000000..ccefb29 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/ComputerUtil.cs @@ -0,0 +1,482 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Flurl.Http; + +namespace Admin.NET.Core; + +public static class ComputerUtil +{ + /// + /// 内存信息 + /// + /// + public static MemoryMetrics GetComputerInfo() + { + MemoryMetrics memoryMetrics; + if (IsMacOS()) + { + memoryMetrics = MemoryMetricsClient.GetMacOSMetrics(); + } + else if (IsUnix()) + { + memoryMetrics = MemoryMetricsClient.GetUnixMetrics(); + } + else + { + memoryMetrics = MemoryMetricsClient.GetWindowsMetrics(); + } + memoryMetrics.FreeRam = Math.Round(memoryMetrics.Free / 1024, 2) + "GB"; + memoryMetrics.UsedRam = Math.Round(memoryMetrics.Used / 1024, 2) + "GB"; + memoryMetrics.TotalRam = Math.Round(memoryMetrics.Total / 1024, 2) + "GB"; + memoryMetrics.RamRate = Math.Ceiling(100 * memoryMetrics.Used / memoryMetrics.Total).ToString() + "%"; + memoryMetrics.CpuRate = Math.Ceiling(GetCPURate().ParseToDouble()) + "%"; + return memoryMetrics; + } + + /// + /// 获取正确的操作系统版本(Linux获取发行版本) + /// + /// + public static String GetOSInfo() + { + string opeartion = string.Empty; + if (IsMacOS()) + { + var output = ShellHelper.Bash("sw_vers | awk 'NR<=2{printf \"%s \", $NF}'"); + if (output != null) + { + opeartion = output.Replace("%", string.Empty); + } + } + else if (IsUnix()) + { + var output = ShellHelper.Bash("awk -F= '/^VERSION_ID/ {print $2}' /etc/os-release | tr -d '\"'"); + opeartion = output ?? string.Empty; + } + else + { + opeartion = RuntimeInformation.OSDescription; + } + return opeartion; + } + + /// + /// 磁盘信息 + /// + /// + public static List GetDiskInfos() + { + var diskInfos = new List(); + if (IsMacOS()) + { + var output = ShellHelper.Bash(@"df -m | awk '/^\/dev\/disk/ {print $1,$2,$3,$4,$5}'"); + var disks = output.Split('\n', StringSplitOptions.RemoveEmptyEntries); + if (disks.Length < 1) return diskInfos; + foreach (var item in disks) + { + var disk = item.Split(' ', (char)StringSplitOptions.RemoveEmptyEntries); + if (disk == null || disk.Length < 5) + continue; + + var diskInfo = new DiskInfo() + { + DiskName = disk[0], + TypeName = ShellHelper.Bash("diskutil info " + disk[0] + " | awk '/File System Personality/ {print $4}'").Replace("\n", string.Empty), + TotalSize = long.Parse(disk[1]) / 1024, + Used = long.Parse(disk[2]) / 1024, + AvailableFreeSpace = long.Parse(disk[3]) / 1024, + AvailablePercent = decimal.Parse(disk[4].Replace("%", "")) + }; + diskInfos.Add(diskInfo); + } + } + else if (IsUnix()) + { + var output = ShellHelper.Bash(@"df -mT | awk '/^\/dev\/(sd|vd|xvd|nvme|sda|vda)/ {print $1,$2,$3,$4,$5,$6}'"); + var disks = output.Split('\n', StringSplitOptions.RemoveEmptyEntries); + if (disks.Length < 1) return diskInfos; + + //var rootDisk = disks[1].Split(' ', (char)StringSplitOptions.RemoveEmptyEntries); + //if (rootDisk == null || rootDisk.Length < 1) + // return diskInfos; + + foreach (var item in disks) + { + var disk = item.Split(' ', (char)StringSplitOptions.RemoveEmptyEntries); + if (disk == null || disk.Length < 6) + continue; + + var diskInfo = new DiskInfo() + { + DiskName = disk[0], + TypeName = disk[1], + TotalSize = long.Parse(disk[2]) / 1024, + Used = long.Parse(disk[3]) / 1024, + AvailableFreeSpace = long.Parse(disk[4]) / 1024, + AvailablePercent = decimal.Parse(disk[5].Replace("%", "")) + }; + diskInfos.Add(diskInfo); + } + } + else + { + var driv = DriveInfo.GetDrives().Where(u => u.IsReady); + foreach (var item in driv) + { + if (item.DriveType == DriveType.CDRom) continue; + var obj = new DiskInfo() + { + DiskName = item.Name, + TypeName = item.DriveType.ToString(), + TotalSize = item.TotalSize / 1024 / 1024 / 1024, + AvailableFreeSpace = item.AvailableFreeSpace / 1024 / 1024 / 1024, + }; + obj.Used = obj.TotalSize - obj.AvailableFreeSpace; + obj.AvailablePercent = decimal.Ceiling(obj.Used / (decimal)obj.TotalSize * 100); + diskInfos.Add(obj); + } + } + return diskInfos; + } + + /// + /// 获取外网IP地址 + /// + /// + public static string GetIpFromOnline() + { + var url = "https://www.ip.cn/api/index?ip&type=0"; + var str = url.GetStringAsync().GetAwaiter().GetResult(); + var resp = JSON.Deserialize(str); + return resp.Ip + " " + resp.Address; + } + + public static bool IsUnix() + { + return RuntimeInformation.IsOSPlatform(OSPlatform.Linux); + } + + public static bool IsMacOS() + { + return RuntimeInformation.IsOSPlatform(OSPlatform.OSX); + } + + public static string GetCPURate() + { + string cpuRate; + if (IsMacOS()) + { + string output = ShellUtil.Bash("top -l 1 | grep \"CPU usage\" | awk '{print $3 + $5}'"); + cpuRate = output.Trim(); + } + else if (IsUnix()) + { + string output = ShellUtil.Bash("top -b -n1 | grep \"Cpu(s)\" | awk '{print $2 + $4}'"); + cpuRate = output.Trim(); + } + else + { + string output = ShellUtil.Cmd("wmic", "cpu get LoadPercentage"); + cpuRate = output.Replace("LoadPercentage", string.Empty).Trim(); + } + return cpuRate; + } + + /// + /// 获取系统运行时间 + /// + /// + public static string GetRunTime() + { + string runTime = string.Empty; + if (IsMacOS()) + { + //macOS 获取系统启动时间: + //sysctl -n kern.boottime | awk '{print $4}' | tr -d ',' + //返回:1705379131 + //使用date格式化即可 + string output = ShellUtil.Bash("date -r $(sysctl -n kern.boottime | awk '{print $4}' | tr -d ',') +\"%Y-%m-%d %H:%M:%S\"").Trim(); + runTime = DateTimeUtil.FormatTime((DateTime.Now - output.ParseToDateTime()).TotalMilliseconds.ToString().Split('.')[0].ParseToLong()); + } + else if (IsUnix()) + { + string output = ShellUtil.Bash("uptime -s").Trim(); + runTime = DateTimeUtil.FormatTime((DateTime.Now - output.ParseToDateTime()).TotalMilliseconds.ToString().Split('.')[0].ParseToLong()); + } + else + { + string output = ShellUtil.Cmd("wmic", "OS get LastBootUpTime/Value"); + string[] outputArr = output.Split('=', (char)StringSplitOptions.RemoveEmptyEntries); + if (outputArr.Length == 2) + runTime = DateTimeUtil.FormatTime((DateTime.Now - outputArr[1].Split('.')[0].ParseToDateTime()).TotalMilliseconds.ToString().Split('.')[0].ParseToLong()); + } + return runTime; + } +} + +/// +/// IP信息 +/// +public class IpCnResp +{ + public string Ip { get; set; } + + public string Address { get; set; } +} + +/// +/// 内存信息 +/// +public class MemoryMetrics +{ + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public double Total { get; set; } + + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public double Used { get; set; } + + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + public double Free { get; set; } + + /// + /// 已用内存 + /// + public string UsedRam { get; set; } + + /// + /// CPU使用率% + /// + public string CpuRate { get; set; } + + /// + /// 总内存 GB + /// + public string TotalRam { get; set; } + + /// + /// 内存使用率 % + /// + public string RamRate { get; set; } + + /// + /// 空闲内存 + /// + public string FreeRam { get; set; } +} + +/// +/// 磁盘信息 +/// +public class DiskInfo +{ + /// + /// 磁盘名 + /// + public string DiskName { get; set; } + + /// + /// 类型名 + /// + public string TypeName { get; set; } + + /// + /// 总剩余 + /// + public long TotalFree { get; set; } + + /// + /// 总量 + /// + public long TotalSize { get; set; } + + /// + /// 已使用 + /// + public long Used { get; set; } + + /// + /// 可使用 + /// + public long AvailableFreeSpace { get; set; } + + /// + /// 使用百分比 + /// + public decimal AvailablePercent { get; set; } +} + +public class MemoryMetricsClient +{ + /// + /// windows系统获取内存信息 + /// + /// + public static MemoryMetrics GetWindowsMetrics() + { + string output = ShellUtil.Cmd("wmic", "OS get FreePhysicalMemory,TotalVisibleMemorySize /Value"); + var metrics = new MemoryMetrics(); + var lines = output.Trim().Split('\n', (char)StringSplitOptions.RemoveEmptyEntries); + if (lines.Length <= 0) return metrics; + + var freeMemoryParts = lines[0].Split('=', (char)StringSplitOptions.RemoveEmptyEntries); + var totalMemoryParts = lines[1].Split('=', (char)StringSplitOptions.RemoveEmptyEntries); + + metrics.Total = Math.Round(double.Parse(totalMemoryParts[1]) / 1024, 0); + metrics.Free = Math.Round(double.Parse(freeMemoryParts[1]) / 1024, 0);//m + metrics.Used = metrics.Total - metrics.Free; + + return metrics; + } + + /// + /// Unix系统获取 + /// + /// + public static MemoryMetrics GetUnixMetrics() + { + string output = ShellUtil.Bash("free -m | awk '{print $2,$3,$4,$5,$6}'"); + var metrics = new MemoryMetrics(); + var lines = output.Split('\n', (char)StringSplitOptions.RemoveEmptyEntries); + if (lines.Length <= 0) return metrics; + + if (lines != null && lines.Length > 0) + { + var memory = lines[1].Split(' ', (char)StringSplitOptions.RemoveEmptyEntries); + if (memory.Length >= 3) + { + metrics.Total = double.Parse(memory[0]); + metrics.Used = double.Parse(memory[1]); + metrics.Free = double.Parse(memory[2]);//m + } + } + return metrics; + } + + /// + /// macOS系统获取 + /// + /// + public static MemoryMetrics GetMacOSMetrics() + { + var metrics = new MemoryMetrics(); + //物理内存大小 + var total = ShellUtil.Bash("sysctl -n hw.memsize | awk '{printf \"%.2f\", $1/1024/1024}'"); + metrics.Total = float.Parse(total.Replace("%", string.Empty)); + //TODO:占用内存,检查效率 + var free = ShellUtil.Bash("top -l 1 -s 0 | awk '/PhysMem/ {print $6+$8}'"); + metrics.Free = float.Parse(free); + metrics.Used = metrics.Total - metrics.Free; + return metrics; + } +} + +public class ShellUtil +{ + /// + /// linux 系统命令 + /// + /// + /// + public static string Bash(string command) + { + var escapedArgs = command.Replace("\"", "\\\""); + var process = new Process() + { + StartInfo = new ProcessStartInfo + { + FileName = "/bin/bash", + Arguments = $"-c \"{escapedArgs}\"", + RedirectStandardOutput = true, + UseShellExecute = false, + CreateNoWindow = true, + } + }; + process.Start(); + string result = process.StandardOutput.ReadToEnd(); + process.WaitForExit(); + process.Dispose(); + return result; + } + + /// + /// windows系统命令 + /// + /// + /// + /// + public static string Cmd(string fileName, string args) + { + var info = new ProcessStartInfo + { + FileName = fileName, + Arguments = args, + RedirectStandardOutput = true + }; + + var output = string.Empty; + using (var process = Process.Start(info)) + { + output = process.StandardOutput.ReadToEnd(); + } + return output; + } +} + +public class ShellHelper +{ + /// + /// Linux 系统命令 + /// + /// + /// + public static string Bash(string command) + { + var escapedArgs = command.Replace("\"", "\\\""); + var process = new Process() + { + StartInfo = new ProcessStartInfo + { + FileName = "/bin/bash", + Arguments = $"-c \"{escapedArgs}\"", + RedirectStandardOutput = true, + UseShellExecute = false, + CreateNoWindow = true, + } + }; + process.Start(); + string result = process.StandardOutput.ReadToEnd(); + process.WaitForExit(); + process.Dispose(); + return result; + } + + /// + /// Windows 系统命令 + /// + /// + /// + /// + public static string Cmd(string fileName, string args) + { + var info = new ProcessStartInfo + { + FileName = fileName, + Arguments = args, + RedirectStandardOutput = true + }; + + var output = string.Empty; + using (var process = Process.Start(info)) + { + output = process.StandardOutput.ReadToEnd(); + } + return output; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Util/CryptogramUtil.cs b/Admin.NET/Admin.NET.Core/Util/CryptogramUtil.cs new file mode 100644 index 0000000..ebbeded --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/CryptogramUtil.cs @@ -0,0 +1,120 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +public class CryptogramUtil +{ + public static readonly bool StrongPassword = App.GetConfig("Cryptogram:StrongPassword"); // 是否开启密码强度验证 + public static readonly string PasswordStrengthValidation = App.GetConfig("Cryptogram:PasswordStrengthValidation"); // 密码强度验证正则表达式 + public static readonly string PasswordStrengthValidationMsg = App.GetConfig("Cryptogram:PasswordStrengthValidationMsg"); // 密码强度验证提示 + public static readonly string CryptoType = App.GetConfig("Cryptogram:CryptoType"); // 加密类型 + public static readonly string PublicKey = App.GetConfig("Cryptogram:PublicKey"); // 公钥 + public static readonly string PrivateKey = App.GetConfig("Cryptogram:PrivateKey"); // 私钥 + + public static readonly string SM4_key = "0123456789abcdeffedcba9876543210"; + public static readonly string SM4_iv = "595298c7c6fd271f0402f804c33d3f66"; + + /// + /// 加密 + /// + /// + /// + public static string Encrypt(string plainText) + { + if (CryptoType == CryptogramEnum.MD5.ToString()) + { + return MD5Encryption.Encrypt(plainText); + } + else if (CryptoType == CryptogramEnum.SM2.ToString()) + { + return SM2Encrypt(plainText); + } + else if (CryptoType == CryptogramEnum.SM4.ToString()) + { + return SM4EncryptECB(plainText); + } + return plainText; + } + + /// + /// 解密 + /// + /// + /// + public static string Decrypt(string cipherText) + { + if (CryptoType == CryptogramEnum.SM2.ToString()) + { + return SM2Decrypt(cipherText); + } + else if (CryptoType == CryptogramEnum.SM4.ToString()) + { + return SM4DecryptECB(cipherText); + } + return cipherText; + } + + /// + /// SM2加密 + /// + /// + /// + public static string SM2Encrypt(string plainText) + { + return GMUtil.SM2Encrypt(PublicKey, plainText); + } + + /// + /// SM2解密 + /// + /// + /// + public static string SM2Decrypt(string cipherText) + { + return GMUtil.SM2Decrypt(PrivateKey, cipherText); + } + + /// + /// SM4加密(ECB) + /// + /// + /// + public static string SM4EncryptECB(string plainText) + { + return GMUtil.SM4EncryptECB(SM4_key, plainText); + } + + /// + /// SM4解密(ECB) + /// + /// + /// + public static string SM4DecryptECB(string cipherText) + { + return GMUtil.SM4DecryptECB(SM4_key, cipherText); + } + + /// + /// SM4加密(CBC) + /// + /// + /// + public static string SM4EncryptCBC(string plainText) + { + return GMUtil.SM4EncryptCBC(SM4_key, SM4_iv, plainText); + } + + /// + /// SM4解密(CBC) + /// + /// + /// + public static string SM4DecryptCBC(string cipherText) + { + return GMUtil.SM4DecryptCBC(SM4_key, SM4_iv, cipherText); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Util/CustomFormFile.cs b/Admin.NET/Admin.NET.Core/Util/CustomFormFile.cs new file mode 100644 index 0000000..d1f6555 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/CustomFormFile.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore; +namespace Admin.NET.Core; +public class CustomFormFile : IFormFile +{ + private readonly Stream _stream; + + public CustomFormFile(byte[] fileContents, string fileName, string contentType, string name) + { + _stream = new MemoryStream(fileContents); + FileName = fileName; + ContentType = contentType; + Length = fileContents.Length; + Name = name; + Headers = new HeaderDictionary(); // 初始化 Headers + ContentDisposition = $"form-data; name=\"{name}\"; filename=\"{fileName}\""; // 初始化 ContentDisposition + } + + public string ContentDisposition { get; } + + public string ContentType { get; } + + public string FileName { get; } + + public bool Exists => true; + + public long Length { get; } + + public string Name { get; } + + public IHeaderDictionary Headers { get; } + + public Stream OpenReadStream() => _stream; + + public Task CopyToAsync(Stream target, CancellationToken cancellationToken = default) + { + _stream.Seek(0, SeekOrigin.Begin); // Reset the stream position + return _stream.CopyToAsync(target, 81920, cancellationToken); + } + + public void CopyTo(Stream target) + { + _stream.Seek(0, SeekOrigin.Begin); // Reset the stream position + _stream.CopyTo(target); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Util/DateTimeUtil.cs b/Admin.NET/Admin.NET.Core/Util/DateTimeUtil.cs new file mode 100644 index 0000000..070f2ab --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/DateTimeUtil.cs @@ -0,0 +1,175 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +public class DateTimeUtil +{ + /// + /// 获取开始时间 + /// + /// + /// + /// + public static DateTime GetBeginTime(DateTime? dateTime, int days = 0) + { + if (dateTime == DateTime.MinValue || dateTime == null) + return DateTime.Now.AddDays(days); + + return dateTime ?? DateTime.Now; + } + + /// + /// 时间戳转本地时间-时间戳精确到秒 + /// + public static DateTime ToLocalTimeDateBySeconds(long unix) + { + return DateTimeOffset.FromUnixTimeSeconds(unix).ToLocalTime().DateTime; + } + + /// + /// 时间转时间戳Unix-时间戳精确到秒 + /// + public static long ToUnixTimestampBySeconds(DateTime dt) + { + return new DateTimeOffset(dt).ToUnixTimeSeconds(); + } + + /// + /// 时间戳转本地时间-时间戳精确到毫秒 + /// + public static DateTime ToLocalTimeDateByMilliseconds(long unix) + { + return DateTimeOffset.FromUnixTimeMilliseconds(unix).ToLocalTime().DateTime; + } + + /// + /// 时间转时间戳Unix-时间戳精确到毫秒 + /// + public static long ToUnixTimestampByMilliseconds(DateTime dt) + { + return new DateTimeOffset(dt).ToUnixTimeMilliseconds(); + } + + /// + /// 毫秒转天时分秒 + /// + /// + /// + public static string FormatTime(long ms) + { + int ss = 1000; + int mi = ss * 60; + int hh = mi * 60; + int dd = hh * 24; + + long day = ms / dd; + long hour = (ms - day * dd) / hh; + long minute = (ms - day * dd - hour * hh) / mi; + long second = (ms - day * dd - hour * hh - minute * mi) / ss; + long milliSecond = ms - day * dd - hour * hh - minute * mi - second * ss; + + string sDay = day < 10 ? "0" + day : "" + day; //天 + string sHour = hour < 10 ? "0" + hour : "" + hour;//小时 + string sMinute = minute < 10 ? "0" + minute : "" + minute;//分钟 + string sSecond = second < 10 ? "0" + second : "" + second;//秒 + string sMilliSecond = milliSecond < 10 ? "0" + milliSecond : "" + milliSecond;//毫秒 + sMilliSecond = milliSecond < 100 ? "0" + sMilliSecond : "" + sMilliSecond; + + return string.Format("{0} 天 {1} 小时 {2} 分 {3} 秒", sDay, sHour, sMinute, sSecond); + } + + /// + /// 获取unix时间戳 + /// + /// + /// + public static long GetUnixTimeStamp(DateTime dt) + { + return ((DateTimeOffset)dt).ToUnixTimeMilliseconds(); + } + + /// + /// 获取日期天的最小时间 + /// + /// + /// + public static DateTime GetDayMinDate(DateTime dt) + { + return new DateTime(dt.Year, dt.Month, dt.Day, 0, 0, 0); + } + + /// + /// 获取日期天的最大时间 + /// + /// + /// + + public static DateTime GetDayMaxDate(DateTime dt) + { + return new DateTime(dt.Year, dt.Month, dt.Day, 23, 59, 59); + } + + /// + /// 获取日期天的最大时间 + /// + /// + /// + public static string FormatDateTime(DateTime? dt) + { + if (dt == null) return string.Empty; + + if (dt.Value.Year == DateTime.Now.Year) + return dt.Value.ToString("MM-dd HH:mm"); + else + return dt.Value.ToString("yyyy-MM-dd HH:mm"); + } + + /// + /// 获取今天日期范围00:00:00 - 23:59:59 + /// + /// + public static List GetTodayTimeList(DateTime time) + { + return new List + { + Convert.ToDateTime(time.ToString("D").ToString()), + Convert.ToDateTime(time.AddDays(1).ToString("D").ToString()).AddSeconds(-1) + }; + } + + /// + /// 获取星期几 + /// + /// + /// + public static string GetWeekByDate(DateTime dt) + { + var day = new[] { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" }; + return day[Convert.ToInt32(dt.DayOfWeek.ToString("d"))]; + } + + /// + /// 获取这个月的第几周 + /// + /// + /// + public static int GetWeekNumInMonth(DateTime daytime) + { + int dayInMonth = daytime.Day; + // 本月第一天 + DateTime firstDay = daytime.AddDays(1 - daytime.Day); + // 本月第一天是周几 + int weekday = (int)firstDay.DayOfWeek == 0 ? 7 : (int)firstDay.DayOfWeek; + // 本月第一周有几天 + int firstWeekEndDay = 7 - (weekday - 1); + // 当前日期和第一周之差 + int diffday = dayInMonth - firstWeekEndDay; + diffday = diffday > 0 ? diffday : 1; + // 当前是第几周,若整除7就减一天 + return ((diffday % 7) == 0 ? (diffday / 7 - 1) : (diffday / 7)) + 1 + (dayInMonth > firstWeekEndDay ? 1 : 0); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Util/DingDingHook.cs b/Admin.NET/Admin.NET.Core/Util/DingDingHook.cs new file mode 100644 index 0000000..bc686ec --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/DingDingHook.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core; +public class DingDingHook +{ + + /// + /// 钉钉消息推送 + /// + /// + /// + public static void DingTalkHookMessage(string controllername, string message) + { + try + { + string title = "weipay"; + DingtalkChatbotSdk.DingDingClient.SendMessageAsync("https://oapi.dingtalk.com/robot/send?access_token=879f3d3511b90d2e13080f0f729d9c65c3e6737de76c6074da3b98f8e432cef0", string.Format("title:{0};message:{1}", title, message)); + } + catch (Exception ex) + { + + } + } + +} diff --git a/Admin.NET/Admin.NET.Core/Util/GM/GM.cs b/Admin.NET/Admin.NET.Core/Util/GM/GM.cs new file mode 100644 index 0000000..69ea734 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/GM/GM.cs @@ -0,0 +1,471 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Org.BouncyCastle.Asn1; +using Org.BouncyCastle.Asn1.GM; +using Org.BouncyCastle.Asn1.X9; +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.Crypto.Digests; +using Org.BouncyCastle.Crypto.Engines; +using Org.BouncyCastle.Crypto.Generators; +using Org.BouncyCastle.Crypto.Parameters; +using Org.BouncyCastle.Math; +using Org.BouncyCastle.Security; +using Org.BouncyCastle.Utilities; +using Org.BouncyCastle.Utilities.Encoders; +using Org.BouncyCastle.X509; + +namespace Admin.NET.Core; + +/** + * + * 用BC的注意点: + * 这个版本的BC对SM3withSM2的结果为asn1格式的r和s,如果需要直接拼接的r||s需要自己转换。下面rsAsn1ToPlainByteArray、rsPlainByteArrayToAsn1就在干这事。 + * 这个版本的BC对SM2的结果为C1||C2||C3,据说为旧标准,新标准为C1||C3||C2,用新标准的需要自己转换。下面(被注释掉的)changeC1C2C3ToC1C3C2、changeC1C3C2ToC1C2C3就在干这事。java版的高版本有加上C1C3C2,csharp版没准以后也会加,但目前还没有,java版的目前可以初始化时“ SM2Engine sm2Engine = new SM2Engine(SM2Engine.Mode.C1C3C2);”。 + * + */ + +public class GM +{ + private static X9ECParameters x9ECParameters = GMNamedCurves.GetByName("sm2p256v1"); + private static ECDomainParameters ecDomainParameters = new(x9ECParameters.Curve, x9ECParameters.G, x9ECParameters.N); + + /** + * + * @param msg + * @param userId + * @param privateKey + * @return r||s,直接拼接byte数组的rs + */ + + public static byte[] SignSm3WithSm2(byte[] msg, byte[] userId, AsymmetricKeyParameter privateKey) + { + return RsAsn1ToPlainByteArray(SignSm3WithSm2Asn1Rs(msg, userId, privateKey)); + } + + /** + * @param msg + * @param userId + * @param privateKey + * @return rs in asn1 format + */ + + public static byte[] SignSm3WithSm2Asn1Rs(byte[] msg, byte[] userId, AsymmetricKeyParameter privateKey) + { + ISigner signer = SignerUtilities.GetSigner("SM3withSM2"); + signer.Init(true, new ParametersWithID(privateKey, userId)); + signer.BlockUpdate(msg, 0, msg.Length); + byte[] sig = signer.GenerateSignature(); + return sig; + } + + /** + * + * @param msg + * @param userId + * @param rs r||s,直接拼接byte数组的rs + * @param publicKey + * @return + */ + + public static bool VerifySm3WithSm2(byte[] msg, byte[] userId, byte[] rs, AsymmetricKeyParameter publicKey) + { + if (rs == null || msg == null || userId == null) return false; + if (rs.Length != RS_LEN * 2) return false; + return VerifySm3WithSm2Asn1Rs(msg, userId, RsPlainByteArrayToAsn1(rs), publicKey); + } + + /** + * + * @param msg + * @param userId + * @param rs in asn1 format + * @param publicKey + * @return + */ + + public static bool VerifySm3WithSm2Asn1Rs(byte[] msg, byte[] userId, byte[] sign, AsymmetricKeyParameter publicKey) + { + ISigner signer = SignerUtilities.GetSigner("SM3withSM2"); + signer.Init(false, new ParametersWithID(publicKey, userId)); + signer.BlockUpdate(msg, 0, msg.Length); + return signer.VerifySignature(sign); + } + + /** + * bc加解密使用旧标c1||c2||c3,此方法在加密后调用,将结果转化为c1||c3||c2 + * @param c1c2c3 + * @return + */ + + private static byte[] ChangeC1C2C3ToC1C3C2(byte[] c1c2c3) + { + int c1Len = (x9ECParameters.Curve.FieldSize + 7) / 8 * 2 + 1; //sm2p256v1的这个固定65。可看GMNamedCurves、ECCurve代码。 + const int c3Len = 32; //new SM3Digest().getDigestSize(); + byte[] result = new byte[c1c2c3.Length]; + Buffer.BlockCopy(c1c2c3, 0, result, 0, c1Len); //c1 + Buffer.BlockCopy(c1c2c3, c1c2c3.Length - c3Len, result, c1Len, c3Len); //c3 + Buffer.BlockCopy(c1c2c3, c1Len, result, c1Len + c3Len, c1c2c3.Length - c1Len - c3Len); //c2 + return result; + } + + /** + * bc加解密使用旧标c1||c3||c2,此方法在解密前调用,将密文转化为c1||c2||c3再去解密 + * @param c1c3c2 + * @return + */ + + private static byte[] ChangeC1C3C2ToC1C2C3(byte[] c1c3c2) + { + int c1Len = (x9ECParameters.Curve.FieldSize + 7) / 8 * 2 + 1; //sm2p256v1的这个固定65。可看GMNamedCurves、ECCurve代码。 + const int c3Len = 32; //new SM3Digest().GetDigestSize(); + byte[] result = new byte[c1c3c2.Length]; + Buffer.BlockCopy(c1c3c2, 0, result, 0, c1Len); //c1: 0->65 + Buffer.BlockCopy(c1c3c2, c1Len + c3Len, result, c1Len, c1c3c2.Length - c1Len - c3Len); //c2 + Buffer.BlockCopy(c1c3c2, c1Len, result, c1c3c2.Length - c3Len, c3Len); //c3 + return result; + } + + /** + * c1||c3||c2 + * @param data + * @param key + * @return + */ + + public static byte[] Sm2Decrypt(byte[] data, AsymmetricKeyParameter key) + { + return Sm2DecryptOld(ChangeC1C3C2ToC1C2C3(data), key); + } + + /** + * c1||c3||c2 + * @param data + * @param key + * @return + */ + + public static byte[] Sm2Encrypt(byte[] data, AsymmetricKeyParameter key) + { + return ChangeC1C2C3ToC1C3C2(Sm2EncryptOld(data, key)); + } + + /** + * c1||c2||c3 + * @param data + * @param key + * @return + */ + + public static byte[] Sm2EncryptOld(byte[] data, AsymmetricKeyParameter pubkey) + { + SM2Engine sm2Engine = new SM2Engine(); + sm2Engine.Init(true, new ParametersWithRandom(pubkey, new SecureRandom())); + return sm2Engine.ProcessBlock(data, 0, data.Length); + } + + /** + * c1||c2||c3 + * @param data + * @param key + * @return + */ + + public static byte[] Sm2DecryptOld(byte[] data, AsymmetricKeyParameter key) + { + SM2Engine sm2Engine = new SM2Engine(); + sm2Engine.Init(false, key); + return sm2Engine.ProcessBlock(data, 0, data.Length); + } + + /** + * @param bytes + * @return + */ + + public static byte[] Sm3(byte[] bytes) + { + SM3Digest digest = new(); + digest.BlockUpdate(bytes, 0, bytes.Length); + byte[] result = DigestUtilities.DoFinal(digest); + return result; + } + + private const int RS_LEN = 32; + + private static byte[] BigIntToFixexLengthBytes(BigInteger rOrS) + { + // for sm2p256v1, n is 00fffffffeffffffffffffffffffffffff7203df6b21c6052b53bbf40939d54123, + // r and s are the result of mod n, so they should be less than n and have length<=32 + byte[] rs = rOrS.ToByteArray(); + if (rs.Length == RS_LEN) return rs; + else if (rs.Length == RS_LEN + 1 && rs[0] == 0) return Arrays.CopyOfRange(rs, 1, RS_LEN + 1); + else if (rs.Length < RS_LEN) + { + byte[] result = new byte[RS_LEN]; + Arrays.Fill(result, (byte)0); + Buffer.BlockCopy(rs, 0, result, RS_LEN - rs.Length, rs.Length); + return result; + } + else + { + throw new ArgumentException("err rs: " + Hex.ToHexString(rs)); + } + } + + /** + * BC的SM3withSM2签名得到的结果的rs是asn1格式的,这个方法转化成直接拼接r||s + * @param rsDer rs in asn1 format + * @return sign result in plain byte array + */ + + private static byte[] RsAsn1ToPlainByteArray(byte[] rsDer) + { + Asn1Sequence seq = Asn1Sequence.GetInstance(rsDer); + byte[] r = BigIntToFixexLengthBytes(DerInteger.GetInstance(seq[0]).Value); + byte[] s = BigIntToFixexLengthBytes(DerInteger.GetInstance(seq[1]).Value); + byte[] result = new byte[RS_LEN * 2]; + Buffer.BlockCopy(r, 0, result, 0, r.Length); + Buffer.BlockCopy(s, 0, result, RS_LEN, s.Length); + return result; + } + + /** + * BC的SM3withSM2验签需要的rs是asn1格式的,这个方法将直接拼接r||s的字节数组转化成asn1格式 + * @param sign in plain byte array + * @return rs result in asn1 format + */ + + private static byte[] RsPlainByteArrayToAsn1(byte[] sign) + { + if (sign.Length != RS_LEN * 2) throw new ArgumentException("err rs. "); + BigInteger r = new BigInteger(1, Arrays.CopyOfRange(sign, 0, RS_LEN)); + BigInteger s = new BigInteger(1, Arrays.CopyOfRange(sign, RS_LEN, RS_LEN * 2)); + Asn1EncodableVector v = new Asn1EncodableVector + { + new DerInteger(r), + new DerInteger(s) + }; + + return new DerSequence(v).GetEncoded("DER"); + } + + // 生成公私匙对 + public static AsymmetricCipherKeyPair GenerateKeyPair() + { + ECKeyPairGenerator kpGen = new(); + kpGen.Init(new ECKeyGenerationParameters(ecDomainParameters, new SecureRandom())); + return kpGen.GenerateKeyPair(); + } + + public static ECPrivateKeyParameters GetPrivatekeyFromD(BigInteger d) + { + return new ECPrivateKeyParameters(d, ecDomainParameters); + } + + public static ECPublicKeyParameters GetPublickeyFromXY(BigInteger x, BigInteger y) + { + return new ECPublicKeyParameters(x9ECParameters.Curve.CreatePoint(x, y), ecDomainParameters); + } + + public static AsymmetricKeyParameter GetPublickeyFromX509File(FileInfo file) + { + FileStream fileStream = null; + try + { + //file.DirectoryName + "\\" + file.Name + fileStream = new FileStream(file.FullName, FileMode.Open, FileAccess.Read); + X509Certificate certificate = new X509CertificateParser().ReadCertificate(fileStream); + return certificate.GetPublicKey(); + } + catch (Exception) + { + //log.Error(file.Name + "读取失败,异常:" + e); + } + finally + { + if (fileStream != null) + fileStream.Close(); + } + return null; + } + + public class Sm2Cert + { + public AsymmetricKeyParameter privateKey; + public AsymmetricKeyParameter publicKey; + public string certId; + } + + private static byte[] ToByteArray(int i) + { + byte[] byteArray = new byte[4]; + byteArray[0] = (byte)(i >> 24); + byteArray[1] = (byte)((i & 0xFFFFFF) >> 16); + byteArray[2] = (byte)((i & 0xFFFF) >> 8); + byteArray[3] = (byte)(i & 0xFF); + return byteArray; + } + + /** + * 字节数组拼接 + * + * @param params + * @return + */ + + private static byte[] Join(params byte[][] byteArrays) + { + List byteSource = new(); + for (int i = 0; i < byteArrays.Length; i++) + { + byteSource.AddRange(byteArrays[i]); + } + byte[] data = byteSource.ToArray(); + return data; + } + + /** + * 密钥派生函数 + * + * @param Z + * @param klen + * 生成klen字节数长度的密钥 + * @return + */ + + private static byte[] KDF(byte[] Z, int klen) + { + int ct = 1; + int end = (int)Math.Ceiling(klen * 1.0 / 32); + List byteSource = new(); + + for (int i = 1; i < end; i++) + { + byteSource.AddRange(Sm3(Join(Z, ToByteArray(ct)))); + ct++; + } + byte[] last = Sm3(Join(Z, ToByteArray(ct))); + if (klen % 32 == 0) + { + byteSource.AddRange(last); + } + else + byteSource.AddRange(Arrays.CopyOfRange(last, 0, klen % 32)); + return byteSource.ToArray(); + } + + public static byte[] Sm4DecryptCBC(byte[] keyBytes, byte[] cipher, byte[] iv, string algo) + { + if (keyBytes.Length != 16) throw new ArgumentException("err key length"); + if (cipher.Length % 16 != 0 && algo.Contains("NoPadding")) throw new ArgumentException("err data length"); + + KeyParameter key = ParameterUtilities.CreateKeyParameter("SM4", keyBytes); + IBufferedCipher c = CipherUtilities.GetCipher(algo); + if (iv == null) iv = ZeroIv(algo); + c.Init(false, new ParametersWithIV(key, iv)); + return c.DoFinal(cipher); + } + + public static byte[] Sm4EncryptCBC(byte[] keyBytes, byte[] plain, byte[] iv, string algo) + { + if (keyBytes.Length != 16) throw new ArgumentException("err key length"); + if (plain.Length % 16 != 0 && algo.Contains("NoPadding")) throw new ArgumentException("err data length"); + + KeyParameter key = ParameterUtilities.CreateKeyParameter("SM4", keyBytes); + IBufferedCipher c = CipherUtilities.GetCipher(algo); + if (iv == null) iv = ZeroIv(algo); + c.Init(true, new ParametersWithIV(key, iv)); + return c.DoFinal(plain); + } + + public static byte[] Sm4EncryptECB(byte[] keyBytes, byte[] plain, string algo) + { + if (keyBytes.Length != 16) throw new ArgumentException("err key length"); + //NoPadding 的情况下需要校验数据长度是16的倍数. + if (plain.Length % 16 != 0 && algo.Contains("NoPadding")) throw new ArgumentException("err data length"); + + KeyParameter key = ParameterUtilities.CreateKeyParameter("SM4", keyBytes); + IBufferedCipher c = CipherUtilities.GetCipher(algo); + c.Init(true, key); + return c.DoFinal(plain); + } + + public static byte[] Sm4DecryptECB(byte[] keyBytes, byte[] cipher, string algo) + { + if (keyBytes.Length != 16) throw new ArgumentException("err key length"); + if (cipher.Length % 16 != 0 && algo.Contains("NoPadding")) throw new ArgumentException("err data length"); + + KeyParameter key = ParameterUtilities.CreateKeyParameter("SM4", keyBytes); + IBufferedCipher c = CipherUtilities.GetCipher(algo); + c.Init(false, key); + return c.DoFinal(cipher); + } + + public const string SM4_ECB_NOPADDING = "SM4/ECB/NoPadding"; + public const string SM4_CBC_NOPADDING = "SM4/CBC/NoPadding"; + public const string SM4_ECB_PKCS7PADDING = "SM4/ECB/PKCS7Padding"; + public const string SM4_CBC_PKCS7PADDING = "SM4/CBC/PKCS7Padding"; + + /** + * cfca官网CSP沙箱导出的sm2文件 + * @param pem 二进制原文 + * @param pwd 密码 + * @return + */ + + public static Sm2Cert ReadSm2File(byte[] pem, string pwd) + { + Sm2Cert sm2Cert = new(); + + Asn1Sequence asn1Sequence = (Asn1Sequence)Asn1Object.FromByteArray(pem); + // ASN1Integer asn1Integer = (ASN1Integer) asn1Sequence.getObjectAt(0); //version=1 + Asn1Sequence priSeq = (Asn1Sequence)asn1Sequence[1];//private key + Asn1Sequence pubSeq = (Asn1Sequence)asn1Sequence[2];//public key and x509 cert + + // ASN1ObjectIdentifier sm2DataOid = (ASN1ObjectIdentifier) priSeq.getObjectAt(0); + // ASN1ObjectIdentifier sm4AlgOid = (ASN1ObjectIdentifier) priSeq.getObjectAt(1); + Asn1OctetString priKeyAsn1 = (Asn1OctetString)priSeq[2]; + byte[] key = KDF(System.Text.Encoding.UTF8.GetBytes(pwd), 32); + byte[] priKeyD = Sm4DecryptCBC(Arrays.CopyOfRange(key, 16, 32), + priKeyAsn1.GetOctets(), + Arrays.CopyOfRange(key, 0, 16), SM4_CBC_PKCS7PADDING); + sm2Cert.privateKey = GetPrivatekeyFromD(new BigInteger(1, priKeyD)); + // log.Info(Hex.toHexString(priKeyD)); + + // ASN1ObjectIdentifier sm2DataOidPub = (ASN1ObjectIdentifier) pubSeq.getObjectAt(0); + Asn1OctetString pubKeyX509 = (Asn1OctetString)pubSeq[1]; + X509Certificate x509 = new X509CertificateParser().ReadCertificate(pubKeyX509.GetOctets()); + sm2Cert.publicKey = x509.GetPublicKey(); + sm2Cert.certId = x509.SerialNumber.ToString(10); //这里转10进制,有啥其他进制要求的自己改改 + return sm2Cert; + } + + /** + * + * @param cert + * @return + */ + + public static Sm2Cert ReadSm2X509Cert(byte[] cert) + { + Sm2Cert sm2Cert = new(); + + X509Certificate x509 = new X509CertificateParser().ReadCertificate(cert); + sm2Cert.publicKey = x509.GetPublicKey(); + sm2Cert.certId = x509.SerialNumber.ToString(10); //这里转10进制,有啥其他进制要求的自己改改 + return sm2Cert; + } + + public static byte[] ZeroIv(string algo) + { + IBufferedCipher cipher = CipherUtilities.GetCipher(algo); + int blockSize = cipher.GetBlockSize(); + byte[] iv = new byte[blockSize]; + Arrays.Fill(iv, (byte)0); + return iv; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Util/GM/GMUtil.cs b/Admin.NET/Admin.NET.Core/Util/GM/GMUtil.cs new file mode 100644 index 0000000..d92853a --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/GM/GMUtil.cs @@ -0,0 +1,151 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.Math; +using Org.BouncyCastle.Utilities.Encoders; + +namespace Admin.NET.Core; + +/// +/// GM工具类 +/// +public class GMUtil +{ + /// + /// SM2加密 + /// + /// + /// + /// + public static string SM2Encrypt(string publicKeyHex, string data_string) + { + // 如果是130位公钥,.NET使用的话,把开头的04截取掉 + if (publicKeyHex.Length == 130) + { + publicKeyHex = publicKeyHex.Substring(2, 128); + } + // 公钥X,前64位 + string x = publicKeyHex.Substring(0, 64); + // 公钥Y,后64位 + string y = publicKeyHex.Substring(64); + // 获取公钥对象 + AsymmetricKeyParameter publicKey1 = GM.GetPublickeyFromXY(new BigInteger(x, 16), new BigInteger(y, 16)); + // Sm2Encrypt: C1C3C2 + // Sm2EncryptOld: C1C2C3 + byte[] digestByte = GM.Sm2Encrypt(Encoding.UTF8.GetBytes(data_string), publicKey1); + string strSM2 = Hex.ToHexString(digestByte); + return strSM2; + } + + /// + /// SM2解密 + /// + /// + /// + /// + public static string SM2Decrypt(string privateKey_string, string encryptedData_string) + { + if (!encryptedData_string.StartsWith("04")) + encryptedData_string = "04" + encryptedData_string; + BigInteger d = new(privateKey_string, 16); + // 先拿到私钥对象,用ECPrivateKeyParameters 或 AsymmetricKeyParameter 都可以 + // ECPrivateKeyParameters bcecPrivateKey = GmUtil.GetPrivatekeyFromD(d); + AsymmetricKeyParameter bcecPrivateKey = GM.GetPrivatekeyFromD(d); + byte[] byToDecrypt = Hex.Decode(encryptedData_string); + byte[] byDecrypted = GM.Sm2Decrypt(byToDecrypt, bcecPrivateKey); + string strDecrypted = Encoding.UTF8.GetString(byDecrypted); + return strDecrypted; + } + + /// + /// SM4加密(ECB) + /// + /// + /// + /// + public static string SM4EncryptECB(string key_string, string plainText) + { + byte[] key = Hex.Decode(key_string); + byte[] bs = GM.Sm4EncryptECB(key, Encoding.UTF8.GetBytes(plainText), GM.SM4_ECB_PKCS7PADDING);//NoPadding 的情况下需要校验数据长度是16的倍数. 使用 HandleSm4Padding 处理 + return Hex.ToHexString(bs); + } + + /// + /// SM4解密(ECB) + /// + /// + /// + /// + public static string SM4DecryptECB(string key_string, string cipherText) + { + byte[] key = Hex.Decode(key_string); + byte[] bs = GM.Sm4DecryptECB(key, Hex.Decode(cipherText), GM.SM4_ECB_PKCS7PADDING); + return Encoding.UTF8.GetString(bs); + } + + /// + /// SM4加密(CBC) + /// + /// + /// + /// + /// + public static string SM4EncryptCBC(string key_string, string iv_string, string plainText) + { + byte[] key = Hex.Decode(key_string); + byte[] iv = Hex.Decode(iv_string); + byte[] bs = GM.Sm4EncryptCBC(key, Encoding.UTF8.GetBytes(plainText), iv, GM.SM4_CBC_PKCS7PADDING); + return Hex.ToHexString(bs); + } + + /// + /// SM4解密(CBC) + /// + /// + /// + /// + /// + public static string SM4DecryptCBC(string key_string, string iv_string, string cipherText) + { + byte[] key = Hex.Decode(key_string); + byte[] iv = Hex.Decode(iv_string); + byte[] bs = GM.Sm4DecryptCBC(key, Hex.Decode(cipherText), iv, GM.SM4_CBC_PKCS7PADDING); + return Encoding.UTF8.GetString(bs); + } + + /// + /// 补足 16 进制字符串的 0 字符,返回不带 0x 的16进制字符串 + /// + /// + /// 1表示加密,0表示解密 + /// + private static byte[] HandleSm4Padding(byte[] input, int mode) + { + if (input == null) + { + return null; + } + byte[] ret = (byte[])null; + if (mode == 1) + { + int p = 16 - input.Length % 16; + ret = new byte[input.Length + p]; + Array.Copy(input, 0, ret, 0, input.Length); + for (int i = 0; i < p; i++) + { + ret[input.Length + i] = (byte)p; + } + } + else + { + int p = input[input.Length - 1]; + ret = new byte[input.Length - p]; + Array.Copy(input, 0, ret, 0, input.Length - p); + } + return ret; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Util/InputExcelUtil.cs b/Admin.NET/Admin.NET.Core/Util/InputExcelUtil.cs new file mode 100644 index 0000000..54e0d62 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/InputExcelUtil.cs @@ -0,0 +1,51 @@ +using MiniExcelLibs; +using SharpCompress.Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core; + +/// +/// +/// +/// +public class InputExcelUtil where T : class, new() +{ + private static List extName = new List() { ".xls", ".xlsx" }; + + /// + /// 导入Excel内容读取到List中 + /// + /// + /// + /// + public static List InputExcel(IFormFile file, string sheetName = null) + { + //获取文件后缀名 + string type = Path.GetExtension(file.FileName); + //判断是否导入合法文件 + if (!extName.Contains(type)) + { + return null; + } + + // List list = new List(); + //转成为文件流 + //MemoryStream ms = new MemoryStream(); + //file.CopyTo(ms); + //ms.Seek(0, SeekOrigin.Begin); + ////实例化T数组 + + ////获取数据 + // list = InputExcel(ms, sheetName); + //根据指定路径读取文件 + var fs = file.OpenReadStream(); + List list = fs.Query(sheetName: sheetName).ToList(); + // list = ms.Query().ToList(); + return list; + } + +} diff --git a/Admin.NET/Admin.NET.Core/Util/MajorPlanscoreTool.cs b/Admin.NET/Admin.NET.Core/Util/MajorPlanscoreTool.cs new file mode 100644 index 0000000..51d6438 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/MajorPlanscoreTool.cs @@ -0,0 +1,146 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Util; +public class MajorPlanscoreTool +{ + + + + + // 计算标准差 + private static double CalculateStandardDeviation(int[] values) + { + double average = values.Average(); + double sumOfSquares = values.Sum(val => Math.Pow(val - average, 2)); + return Math.Sqrt(sumOfSquares / values.Length); + } + + /// + /// 正态分布计算 + /// + /// + /// + /// + public static string CalctPercentage(List scorelist, int requestScore) + { + var scores = scorelist.ToArray(); + + // 计算平均值和标准差 + double average = scores.Average(); + double stdDev = CalculateStandardDeviation(scores); + + // 根据平均值和标准差计算可能的录取分数范围 + int min = (int)Math.Floor(average - 1.96 * stdDev); // 使用 95% 置信区间 + int max = (int)Math.Ceiling(average + 1.96 * stdDev); // 使用 95% 置信区间 + + // 确保范围在有效分数范围内(0 到 750) + min = Math.Max(min, 0); + max = Math.Min(max, 750); + + // 计算你的分数在范围内的百分比 + // 计算你的分数在范围内的百分比 + double percentage = 0; + if (max != min) + percentage = (double)(requestScore - min) / (max - min); + + return percentage.ToString(); + } + + /// + /// 冲稳保百分比(逻辑待调整) + /// + /// + /// + /// + public static string GetPlanPercentage(int lowScore, int requestScore) + { + int scoreGap = requestScore - lowScore; // 正确计算方式int scoreGap = requestScore - lowScore; // 正确计算方式 + double probability; + + if (scoreGap < -25) // 🎯 冲:低于目标分 25 分以上,低概率,最多 30% + { + probability = 0.05 + (25.0 / (-scoreGap + 1)) * 0.25; + probability = Math.Min(probability, 0.3); + } + else if (scoreGap >= -25 && scoreGap <= 0) // 🎯 稳:接近目标分,概率 40%-70% + { + probability = 0.4 + ((25 + scoreGap) / 25.0) * 0.3; + } + else // 🎯 保:已达标,分差越大概率越高,70%-99% + { + probability = 0.7 + (Math.Min(scoreGap, 30) / 30.0) * 0.29; // 最高 99% + } + + return (probability * 100).ToString("0") + "%"; + } + + + /// 根据分数计算冲、稳、保类型(冲=2,稳=1,保=0) + /// + /// 最低分 + /// 目标分 + /// 0-保,1-稳,2-冲 + public static int GetPlanScore(int lowScore, int requestScore) + { + int scoreGap = requestScore - lowScore; // 正确计算方式 + + if (scoreGap < -25) + { + return 2; // 🎯 冲 + } + else if (scoreGap >= -25 && scoreGap <= 0) + { + return 1; // 🎯 稳 + } + else + { + return 0; // 🎯 保 + } + } + + + + /// + /// 百分比 + /// + /// + /// + /// + public static string GetAvgPlanPercentage(double LowScore, int requestScore) + { + + //int minscore = requestScore - 60;//最小 + //int constscore = requestScore;//中位数 + //int maxscore = requestScore + 15;//最大 + string percentage = string.Empty; + if (LowScore >= requestScore - 60 && LowScore <= requestScore - 26) + { + + double zval = (requestScore / LowScore) > 1 ? 0.98 : (requestScore / LowScore); + percentage = zval.ToString("0%"); + } + if (LowScore <= requestScore - 1 && LowScore >= requestScore - 26) + { + double zval = (requestScore / LowScore) > 1 ? 0.79 : (requestScore / LowScore) * 0.8; + percentage = zval.ToString("0%"); + } + if (LowScore >= requestScore && LowScore <= requestScore + 30) + { + double zval = (requestScore / LowScore + 30) * 0.3 > 1 ? 0.29 : (requestScore / LowScore); + percentage = zval.ToString("0%"); + } + + return percentage; + } + +} diff --git a/Admin.NET/Admin.NET.Core/Util/MarkPhoneUtil.cs b/Admin.NET/Admin.NET.Core/Util/MarkPhoneUtil.cs new file mode 100644 index 0000000..fb3f4a8 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/MarkPhoneUtil.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core +{ + public class MarkPhoneUtil + { + /// + /// 手机号中间四位用*号隐藏 + /// + /// + /// + public static string MaskPhoneNumber(string phoneNumber) + { + if (string.IsNullOrEmpty(phoneNumber) || phoneNumber.Length != 11) + { + return phoneNumber; + } + return phoneNumber.Substring(0, 3) + "****" + phoneNumber.Substring(7); + } + } + +} diff --git a/Admin.NET/Admin.NET.Core/Util/NewtonsoftJsonSerializerProvider.cs b/Admin.NET/Admin.NET.Core/Util/NewtonsoftJsonSerializerProvider.cs new file mode 100644 index 0000000..568ffbd --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/NewtonsoftJsonSerializerProvider.cs @@ -0,0 +1,59 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Newtonsoft.Json; + +namespace Admin.NET.Core; + +/// +/// 自定义序列化提供器 Newtonsoft.Json 实现 +/// +public class NewtonsoftJsonSerializerProvider : IJsonSerializerProvider, ISingleton +{ + /// + /// 序列化对象 + /// + /// + /// + /// + public string Serialize(object value, object jsonSerializerOptions = null) + { + return JsonConvert.SerializeObject(value, (jsonSerializerOptions ?? GetSerializerOptions()) as JsonSerializerSettings); + } + + /// + /// 反序列化字符串 + /// + /// + /// + /// + /// + public T Deserialize(string json, object jsonSerializerOptions = null) + { + return JsonConvert.DeserializeObject(json, (jsonSerializerOptions ?? GetSerializerOptions()) as JsonSerializerSettings); + } + + /// + /// 反序列化字符串 + /// + /// + /// + /// + /// + public object Deserialize(string json, Type returnType, object jsonSerializerOptions = null) + { + return JsonConvert.DeserializeObject(json, returnType, (jsonSerializerOptions ?? GetSerializerOptions()) as JsonSerializerSettings); + } + + /// + /// 返回读取全局配置的 JSON 选项 + /// + /// + public object GetSerializerOptions() + { + return App.GetOptions()?.SerializerSettings; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Util/PdfOptHelper.cs b/Admin.NET/Admin.NET.Core/Util/PdfOptHelper.cs new file mode 100644 index 0000000..2f2cd9e --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/PdfOptHelper.cs @@ -0,0 +1,378 @@ +using static System.Net.Mime.MediaTypeNames; +using iText.Kernel.Pdf; +using iText.IO.Image; +using iText.Layout.Element; +using Image = iText.Layout.Element.Image; +using PageSize = iText.Kernel.Geom.PageSize; +using iText.Layout; +using iText.Layout.Properties; +using iText.Kernel.Font; +using iText.IO.Font; +using iText.Kernel.Colors; +using System.IO; +using iText.IO.Font.Constants; +using static iText.Kernel.Font.PdfFontFactory; +using DocumentFormat.OpenXml.Packaging; + +namespace Admin.NET.Core +{ + public class PdfOptHelper + { + + /// + /// + /// + /// + /// + /// + public static string AddLineBreaks(string input, int maxLength) + { + if (string.IsNullOrEmpty(input) || maxLength <= 0) + return input; + + var result = new StringBuilder(); + int currentLength = 0; + + foreach (var ch in input) + { + result.Append(ch); + currentLength++; + + // 如果当前长度达到了最大长度,添加换行符并重置计数 + if (currentLength >= maxLength) + { + result.Append('\n'); + currentLength = 0; + } + } + + return result.ToString(); + } + + + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static byte[] CreatePdfAsync( + string pagetitle, + List headers, + List majors, + List dataModels, + DateTime dtnow) + { + var stream = new MemoryStream(); + + try + { + // 创建 PdfWriter + PdfWriter writer = new PdfWriter(stream, new WriterProperties().SetCompressionLevel(CompressionConstants.BEST_COMPRESSION)); + PdfDocument pdf = new PdfDocument(writer); + // 设置页面大小 + pdf.SetDefaultPageSize(PageSize.A4.Rotate()); + Document document = new Document(pdf); + + // 加载中文字体 + PdfFont font = GetFont(); + + // 添加 logo 图像 + string logoPath = "https://static-data.ycymedu.com/logo2.png"; + ImageData imageData = ImageDataFactory.Create(logoPath); + Image logo = new Image(imageData).SetWidth(124).SetHeight(40); + document.Add(logo); + + // 添加标题 + document.Add(CreateTitle(font, pagetitle)); + document.Add(CreateSubTitle(font, $"最后修改时间: {dtnow:yyyy-MM-dd HH:mm}")); + + // 添加表格 + foreach (var dataModel in dataModels) + { + Table universityTable = HeaderTable(font, 9, headers, new List { dataModel }); + universityTable.SetMarginTop(20); + document.Add(universityTable); + + Table majorTable = MajorTable(font, 9, majors, dataModel.majorModels); + document.Add(majorTable); + + document.Add(new Paragraph("\n")); + } + + document.Close(); // 关闭文档 + return stream.ToArray(); + } + catch (Exception ex) + { + Console.WriteLine($"Error: {ex.Message}"); + stream.Dispose(); + throw; + } + } + + private static PdfFont GetFont() + { + string fontPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", "fonts", "AlibabaPuHuiTi.otf"); + + try + { + if (File.Exists(fontPath)) + { + return PdfFontFactory.CreateFont(fontPath, PdfEncodings.IDENTITY_H, PdfFontFactory.EmbeddingStrategy.PREFER_EMBEDDED); + } + else + { + Console.WriteLine($"字体文件 {fontPath} 不存在,使用备用字体。"); + // 使用系统默认字体 + return PdfFontFactory.CreateFont(StandardFonts.HELVETICA); + } + } + catch (Exception ex) + { + Console.WriteLine($"加载字体时出错: {ex.Message},使用备用字体。"); + return PdfFontFactory.CreateFont(StandardFonts.HELVETICA); + } + } + + + + + + + + + public static async Task GeneratePdfAsync(Stream outputStream, string title, + List headers, List majors, + List dataModels, DateTime timestamp) + { + try + { + // 使用 PdfWriter 写入流 + var writer = new PdfWriter(outputStream, new iText.Kernel.Pdf.WriterProperties()); + var pdf = new PdfDocument(writer); + var document = new Document(pdf); + + // 设置标题 + document.Add(new Paragraph(title).SetFontSize(18)); + + // 设置时间戳 + document.Add(new Paragraph($"Generated at: {timestamp:yyyy-MM-dd HH:mm:ss}").SetFontSize(12)); + + // 添加表格(示例) + var table = new Table(headers.Count); + foreach (var header in headers) + { + table.AddHeaderCell(new Cell().Add(new Paragraph(header))); + } + foreach (var major in majors) + { + table.AddCell(new Cell().Add(new Paragraph(major))); + } + document.Add(table); + + // 关闭文档 + document.Close(); + + // 确保所有内容写入流 + await outputStream.FlushAsync(); + } + catch (Exception ex) + { + // 错误处理 + throw new Exception("Failed to generate PDF.", ex); + } + } + + /// + /// 标题 + /// + /// + /// + /// + private static Paragraph CreateTitle(PdfFont font, string titletext) + { + Paragraph title = new Paragraph(titletext) + .SetTextAlignment(TextAlignment.CENTER) + .SetFont(font) + .SetFontSize(16) + .SetMarginTop(20) + .SetMarginBottom(5); + return title; + } + + /// + /// 创建副标 + /// + /// + /// + /// + private static Paragraph CreateSubTitle(PdfFont font, string titletext) + { + Paragraph title = new Paragraph(titletext) + .SetTextAlignment(TextAlignment.CENTER) + .SetFont(font) + .SetFontColor(ColorConstants.GRAY) // 设置字体颜色为灰色 + .SetFontSize(12) + .SetMarginBottom(20); + return title; + } + + + /// + /// table表头 + /// + /// + /// + /// + private static Table HeaderTable(PdfFont font, int tb, List headers, List dataList) + { + float[] columnWidths = { 1, 1, 2, 3, 2, 2, 2, 1, 1 }; + Table table = new Table(columnWidths); + table.SetWidth(UnitValue.CreatePercentValue(100)); + + + int h = 0; + foreach (var header in headers) + { + h++; + if (h == 4) + { + table.AddHeaderCell(new Cell().Add(new Paragraph(header).SetWidth(120).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + } + else + { + table.AddHeaderCell(new Cell().Add(new Paragraph(header).SetWidth(50).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + } + } + dataList.ForEach(a => + { + table.AddCell(new Cell().Add(new Paragraph(a.id.ToString()).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + table.AddCell(new Cell().Add(new Paragraph(a.probability).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + table.AddCell(new Cell().Add(new Paragraph(a.universityCode).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + table.AddCell(new Cell().Add(new Paragraph(a.universityName).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + table.AddCell(new Cell().Add(new Paragraph(a.planCount).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + table.AddCell(new Cell().Add(new Paragraph(a.history).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + a.years.ForEach(a => + { + table.AddCell(new Cell().Add(new Paragraph(a).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + }); + }); + + + return table; + } + + + private static Table MajorTable(PdfFont font, int tb, List headers, List dataList) + { + float[] columnWidths = { 1, 1, 2, 3, 2, 2, 2, 1, 1 }; + Table table = new Table(columnWidths); + table.SetWidth(UnitValue.CreatePercentValue(100)); + int h = 0; + foreach (var header in headers) + { + h++; + if (h == 4) + { + table.AddCell(new Cell().Add(new Paragraph(header).SetWidth(85).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + } + else + { + table.AddCell(new Cell().Add(new Paragraph(header).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + } + } + dataList.ForEach(a => + { + table.AddCell(new Cell().Add(new Paragraph(a.id.ToString()).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + table.AddCell(new Cell().Add(new Paragraph(a.probability).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + table.AddCell(new Cell().Add(new Paragraph(a.majorCode).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + table.AddCell(new Cell().Add(new Paragraph(a.mjaorName).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + table.AddCell(new Cell().Add(new Paragraph(a.planCount).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + table.AddCell(new Cell().Add(new Paragraph(a.history).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + a.years.ForEach(a => + { + table.AddCell(new Cell().Add(new Paragraph(a).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + }); + }); + return table; + } + + + public class DataModel + { + // 示例数据模型 + public string Name { get; set; } + public int Value { get; set; } + } + public class dataModel + { + public int id { get; set; } + + /// + /// + /// + public string probability { get; set; } + + /// + /// + /// + public string universityCode { get; set; } + + /// + /// + /// + public string universityName { get; set; } + + + public string planCount { get; set; } + + public string planName { get; set; } + + public string history { get; set; } + + public List years { get; set; } + + /// + /// + /// + public List majorModels { get; set; } + } + + + public class dataMajorModel + { + public int id { get; set; } + + /// + /// + /// + public string probability { get; set; } + + /// + /// + /// + public string majorCode { get; set; } + + /// + /// + /// + public string mjaorName { get; set; } + + + public string planCount { get; set; } + + + public string history { get; set; } + + public List years { get; set; } + + + } + + + } +} diff --git a/Admin.NET/Admin.NET.Core/Util/ReflectionUtil.cs b/Admin.NET/Admin.NET.Core/Util/ReflectionUtil.cs new file mode 100644 index 0000000..0797a1d --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/ReflectionUtil.cs @@ -0,0 +1,28 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 反射工具类 +/// +public static class ReflectionUtil +{ + /// + /// 获取字段特性 + /// + /// + /// + /// + public static T GetDescriptionValue(this FieldInfo field) where T : Attribute + { + // 获取字段的指定特性,不包含继承中的特性 + object[] customAttributes = field.GetCustomAttributes(typeof(T), false); + + // 如果没有数据返回null + return customAttributes.Length > 0 ? (T)customAttributes[0] : null; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Util/RegularValidate.cs b/Admin.NET/Admin.NET.Core/Util/RegularValidate.cs new file mode 100644 index 0000000..b7c8bfe --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/RegularValidate.cs @@ -0,0 +1,36 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 正则校验 +/// +public static class RegularValidate +{ + /// + /// 验证密码规则 + /// + /// + /// + public static bool ValidatePassword(string password) + { + var regex = new Regex(@" +(?=.*[0-9]) #必须包含数字 +(?=.*[a-z]) #必须包含小写 +(?=.*[A-Z]) #必须包含大写 +(?=([\x21-\x7e]+)[^a-zA-Z0-9]) #必须包含特殊符号 +.{8,30} #至少8个字符,最多30个字符 +", RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace); + + //如果要求必须包含小写、大写字母,则上面的(?=.*[a-zA-Z]) 要改为: + /* + * (?=.*[a-z]) + * (?=.*[A-Z]) + */ + return regex.IsMatch(password); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Util/SchoolNameHelper.cs b/Admin.NET/Admin.NET.Core/Util/SchoolNameHelper.cs new file mode 100644 index 0000000..00c5896 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/SchoolNameHelper.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core.Util; +public class SchoolNameHelper +{ + public static string getName() + { // 学校列表 + List schools = new List + { + "山东省实验中学", + "济南市历城第二中学", + "山东师范大学附属中学", + "济南外国语学校", + "山东省济钢高级中学", + "莱芜第一中学", + "济南第一中学", + "章丘第四中学" + }; + + // 随机数生成器 + Random random = new Random(); + int index = random.Next(schools.Count); + return schools[index]; + } + + public static string getClassName() + { // 学校列表 + List schools = new List + { + "高三一班", + "高三二班", + "高三三班", + "高三四班", + "高三五班", + "高三六班", + "高三七班", + "高三八班", + "高三九班", + "高三十班" + }; + + // 随机数生成器 + Random random = new Random(); + int index = random.Next(schools.Count); + return schools[index]; + } + +} diff --git a/Admin.NET/Admin.NET.Core/Util/StringFilter.cs b/Admin.NET/Admin.NET.Core/Util/StringFilter.cs new file mode 100644 index 0000000..c3fcf1e --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/StringFilter.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Text.RegularExpressions; +namespace Admin.NET.Core +{ + + + public class StringFilter + { + public static string GetContentBeforeBrackets(string input) + { + if (string.IsNullOrEmpty(input)) + return input; + + // [\((] 匹配英文左括号或中文左括号 + // [\((] 匹配英文左括号或中文左括号 + // .* 匹配任意字符直到字符串结尾 + return Regex.Replace(input, @"[\((].*", string.Empty); + } + } +} diff --git a/Admin.NET/Admin.NET.Core/Util/TripleDES.cs b/Admin.NET/Admin.NET.Core/Util/TripleDES.cs new file mode 100644 index 0000000..5410eae --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/TripleDES.cs @@ -0,0 +1,53 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using System.Security.Cryptography; + +namespace Admin.NET.Core; + +/// +/// 3DES文件加解密 +/// +public static class TripleDES +{ + /// + /// 加密文件 + /// + /// 待加密文件路径 + /// 加密后的文件路径 + /// 密码 (24位长度) + [Obsolete] + public static void EncryptFile(string inputFile, string outputFile, string password) + { + using var tdes = new TripleDESCryptoServiceProvider(); + tdes.Mode = CipherMode.ECB; + tdes.Padding = PaddingMode.PKCS7; + tdes.Key = Encoding.UTF8.GetBytes(password); + using var inputFileStream = new FileStream(inputFile, FileMode.Open); + using var encryptedFileStream = new FileStream(outputFile, FileMode.Create); + using var cryptoStream = new CryptoStream(encryptedFileStream, tdes.CreateEncryptor(), CryptoStreamMode.Write); + inputFileStream.CopyTo(cryptoStream); + } + + /// + /// 加密文件 + /// + /// 加密的文件路径 + /// 解密后的文件路径 + /// 密码 (24位长度) + [Obsolete] + public static void DecryptFile(string inputFile, string outputFile, string password) + { + using var tdes = new TripleDESCryptoServiceProvider(); + tdes.Mode = CipherMode.ECB; + tdes.Padding = PaddingMode.PKCS7; + tdes.Key = Encoding.UTF8.GetBytes(password); + using var encryptedFileStream = new FileStream(inputFile, FileMode.Open); + using var decryptedFileStream = new FileStream(outputFile, FileMode.Create); + using var cryptoStream = new CryptoStream(encryptedFileStream, tdes.CreateDecryptor(), CryptoStreamMode.Read); + cryptoStream.CopyTo(decryptedFileStream); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Util/UtilExcelExt.cs b/Admin.NET/Admin.NET.Core/Util/UtilExcelExt.cs new file mode 100644 index 0000000..9d114d8 --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/UtilExcelExt.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core; +public class UtilExcelExt +{ + + /// + /// 获取文件 + /// + /// + /// + /// + public static async Task GetFileByIdAsync(string _uploadDirectory, string fileId) + { + // 实现你的逻辑来获取文件 + // 可以是从文件系统、数据库或其他存储中获取 IFormFile + // 返回 IFormFile 实例或 null(如果未找到) + + // 示例:从本地文件系统获取 + var filePath = Path.Combine(_uploadDirectory, fileId); + if (!System.IO.File.Exists(filePath)) + { + return null; // 文件未找到 + } + + var fileBytes = await File.ReadAllBytesAsync(filePath); + // 传入 name 参数,例如 "file" 或其他适合的名称 + return new CustomFormFile(fileBytes, fileId, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "file"); + } + + /// + /// 去掉括号 + /// + /// + /// + public static string RemoveBracketContent(string input) + { + // 使用正则表达式去除括号外的部分 + return Regex.Replace(input, @"\s*[(\(].*?[)\)]\s*", "").Trim(); + } + + public static bool AreBracketKeywordsFullyMatching(string majorNameA, string majorNameB) + { + // 提取括号内的关键词 + var keywordsA = ExtractBracketKeywords(majorNameA); + var keywordsB = ExtractBracketKeywords(majorNameB); + + // 如果A和B都没有括号内容,认为匹配 + if (keywordsA.Count == 0 && keywordsB.Count == 0) + { + return true; + } + + // 确保A的所有关键词在B中找到,反之亦然 + return keywordsA.All(keywordA => keywordsB.Any(keywordB => keywordA.Contains(keywordB) || keywordB.Contains(keywordA))) && + keywordsB.All(keywordB => keywordsA.Any(keywordA => keywordA.Contains(keywordB) || keywordB.Contains(keywordA))); + } + + private static List ExtractBracketKeywords(string majorName) + { + + var match = Regex.Match(majorName, @"\s*[(\(].*?[)\)]\s*"); + if (match.Success) + { + // 用逗号、顿号、空格等分隔符分割关键词 + return match.Groups[1].Value.Split(new[] { '、', ',', ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList(); + } + return new List(); + } + + +} diff --git a/Admin.NET/Admin.NET.Core/Util/UtilGetPermutations.cs b/Admin.NET/Admin.NET.Core/Util/UtilGetPermutations.cs new file mode 100644 index 0000000..2059b2a --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/UtilGetPermutations.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.NET.Core; +public class UtilGetPermutations +{ + public static HashSet GetPermutations(string str) + { + var results = new HashSet(); + Permute(str.ToCharArray(), 0, results); + return results; + } + + public static void Permute(char[] chars, int index, HashSet results) + { + if (index == chars.Length) + { + results.Add(new string(chars)); + return; + } + + for (int i = index; i < chars.Length; i++) + { + Swap(chars, index, i); + Permute(chars, index + 1, results); + Swap(chars, index, i); // 还原 + } + } + + public static void Swap(char[] chars, int i, int j) + { + char temp = chars[i]; + chars[i] = chars[j]; + chars[j] = temp; + } + +} diff --git a/Admin.NET/Admin.NET.Core/Util/VerifyFileExtensionName.cs b/Admin.NET/Admin.NET.Core/Util/VerifyFileExtensionName.cs new file mode 100644 index 0000000..c01184c --- /dev/null +++ b/Admin.NET/Admin.NET.Core/Util/VerifyFileExtensionName.cs @@ -0,0 +1,161 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 验证文件类型 +/// +public static class VerifyFileExtensionName +{ + private static readonly IDictionary dics_ext = new Dictionary(); + private static readonly IDictionary> ext_dics = new Dictionary>(); + + static VerifyFileExtensionName() + { + dics_ext.Add("EFBBBF", ".json"); + dics_ext.Add("FFD8FFE0", ".jpg"); + dics_ext.Add("89504E47", ".png"); + dics_ext.Add("47494638", ".gif"); + dics_ext.Add("49492A00", ".tif"); + dics_ext.Add("424D", ".bmp"); + + // PS和CAD + dics_ext.Add("38425053", ".psd"); + dics_ext.Add("41433130", ".dwg"); // CAD + dics_ext.Add("252150532D41646F6265", ".ps"); + + // 办公文档类 + dics_ext.Add("D0CF11E0", ".doc"); // ppt、doc、xls + dics_ext.Add("504B0304", ".docx"); // pptx、docx、xlsx + + /* 注意由于文本文档录入内容过多,则读取文件头时较为多变-START */ + dics_ext.Add("0D0A0D0A", ".txt"); // txt + dics_ext.Add("0D0A2D2D", ".txt"); // txt + dics_ext.Add("0D0AB4B4", ".txt"); // txt + dics_ext.Add("B4B4BDA8", ".txt"); // 文件头部为汉字 + dics_ext.Add("73646673", ".txt"); // txt,文件头部为英文字母 + dics_ext.Add("32323232", ".txt"); // txt,文件头部内容为数字 + dics_ext.Add("0D0A09B4", ".txt"); // txt,文件头部内容为数字 + dics_ext.Add("3132330D", ".txt"); // txt,文件头部内容为数字 + /* 注意由于文本文档录入内容过多,则读取文件头时较为多变-END */ + + dics_ext.Add("7B5C727466", ".rtf"); // 日记本 + + dics_ext.Add("255044462D312E", ".pdf"); + + // 视频或音频类 + dics_ext.Add("3026B275", ".wma"); + dics_ext.Add("57415645", ".wav"); + dics_ext.Add("41564920", ".avi"); + dics_ext.Add("4D546864", ".mid"); + dics_ext.Add("2E524D46", ".rm"); + dics_ext.Add("000001BA", ".mpg"); + dics_ext.Add("000001B3", ".mpg"); + dics_ext.Add("6D6F6F76", ".mov"); + dics_ext.Add("3026B2758E66CF11", ".asf"); + + // 压缩包 + dics_ext.Add("52617221", ".rar"); + dics_ext.Add("504B03040A000000", ".zip"); + dics_ext.Add("1F8B08", ".gz"); + + // 程序文件 + dics_ext.Add("3C3F786D6C", ".xml"); + dics_ext.Add("68746D6C3E", ".html"); + //dics_ext.Add("7061636B", ".java"); + //dics_ext.Add("3C254020", ".jsp"); + //dics_ext.Add("4D5A9000", ".exe"); + + dics_ext.Add("44656C69766572792D646174653A", ".eml"); // 邮件 + dics_ext.Add("5374616E64617264204A", ".mdb"); // Access数据库文件 + + dics_ext.Add("46726F6D", ".mht"); + dics_ext.Add("4D494D45", ".mhtml"); + + foreach (var dics in dics_ext) + { + if (!ext_dics.ContainsKey(dics.Value)) + ext_dics.Add(dics.Value, new HashSet { dics.Key.Length / 2 }); + else + ext_dics[dics.Value].Add(dics.Key.Length / 2); + } + } + + /// + /// 文件格式和文件内容格式是否一致 + /// + /// + /// + /// + public static bool IsSameType(Stream stream, string suffix = ".jpg") + { + if (stream == null) + return false; + + suffix = suffix.ToLower(); + if (!ext_dics.ContainsKey(suffix)) + return false; + + try + { + foreach (var Len in ext_dics[suffix]) + { + byte[] b = new byte[Len]; + stream.Read(b, 0, b.Length); + // string fileType = System.Text.Encoding.UTF8.GetString(b); + string fileKey = GetFileHeader(b); + if (dics_ext.ContainsKey(fileKey)) + return true; + } + } + catch (IOException) + { + } + return false; + } + + /** + * 根据文件转换成的字节数组获取文件头信息 + * @param 文件路径 + * @return 文件头信息 + */ + + private static string GetFileHeader(byte[] b) + { + string value = BytesToHexString(b); + return value; + } + + /** + * 将要读取文件头信息的文件的byte数组转换成string类型表示 + * 下面这段代码就是用来对文件类型作验证的方法, + * 将字节数组的前四位转换成16进制字符串,并且转换的时候,要先和0xFF做一次与运算。 + * 这是因为,整个文件流的字节数组中,有很多是负数,进行了与运算后,可以将前面的符号位都去掉, + * 这样转换成的16进制字符串最多保留两位,如果是正数又小于10,那么转换后只有一位, + * 需要在前面补0,这样做的目的是方便比较,取完前四位这个循环就可以终止了 + * @param src要读取文件头信息的文件的byte数组 + * @return 文件头信息 + */ + + private static string BytesToHexString(byte[] src) + { + var builder = new StringBuilder(); + if (src == null || src.Length <= 0) + return null; + + string hv; + for (int i = 0; i < src.Length; i++) + { + // 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写 + hv = Convert.ToString(src[i] & 0xFF, 16).ToUpper(); + if (hv.Length < 2) + builder.Append(0); + builder.Append(hv); + } + return builder.ToString(); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj b/Admin.NET/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj new file mode 100644 index 0000000..27ebddb --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj @@ -0,0 +1,22 @@ + + + + net8.0 + 1701;1702;1591 + + True + © Admin.NET + Admin.NET 通用权限开发平台 + + + + + + + + + + + + + diff --git a/Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs b/Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs new file mode 100644 index 0000000..d79488a --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs @@ -0,0 +1,108 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Admin.NET.Core; +using Admin.NET.Core.Service; +using Furion; +using Furion.Authorization; +using Furion.DataEncryption; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Threading.Tasks; + +namespace Admin.NET.Web.Core +{ + public class JwtHandler : AppAuthorizeHandler + { + private readonly IServiceProvider _serviceProvider; + + public JwtHandler(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + /// + /// 自动刷新Token + /// + /// + /// + /// + public override async Task HandleAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext) + { + // var serviceProvider = context.GetCurrentHttpContext().RequestServices; + using var serviceScope = _serviceProvider.CreateScope(); + + // 若当前账号存在黑名单中则授权失败 + var sysCacheService = serviceScope.ServiceProvider.GetRequiredService(); + if (sysCacheService.ExistKey($"{CacheConst.KeyBlacklist}{context.User.FindFirst(ClaimConst.UserId)?.Value}")) + { + context.Fail(); + context.GetCurrentHttpContext().SignoutToSwagger(); + return; + } + + var sysConfigService = serviceScope.ServiceProvider.GetRequiredService(); + var tokenExpire = await sysConfigService.GetTokenExpire(); + var refreshTokenExpire = await sysConfigService.GetRefreshTokenExpire(); + if (JWTEncryption.AutoRefreshToken(context, context.GetCurrentHttpContext(), tokenExpire, refreshTokenExpire)) + { + await AuthorizeHandleAsync(context); + } + else + { + context.Fail(); // 授权失败 + var currentHttpContext = context.GetCurrentHttpContext(); + if (currentHttpContext == null) + return; + // 跳过由于 SignatureAuthentication 引发的失败 + if (currentHttpContext.Items.ContainsKey(SignatureAuthenticationDefaults.AuthenticateFailMsgKey)) + return; + currentHttpContext.SignoutToSwagger(); + } + } + + public override async Task PipelineAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext) + { + // 已自动验证 Jwt Token 有效性 + return await CheckAuthorizeAsync(httpContext); + } + + /// + /// 权限校验核心逻辑 + /// + /// + /// + private static async Task CheckAuthorizeAsync(DefaultHttpContext httpContext) + { + // 登录模式判断PC、APP + if (App.User.FindFirst(ClaimConst.LoginMode)?.Value == ((int)LoginModeEnum.APP).ToString()) + return true; + + // 排除超管 + if (App.User.FindFirst(ClaimConst.AccountType)?.Value == ((int)AccountTypeEnum.SuperAdmin).ToString()) + return true; + + // 路由名称 + var routeName = httpContext.Request.Path.StartsWithSegments("/api") + ? httpContext.Request.Path.Value[5..].Replace("/", ":") + : httpContext.Request.Path.Value[1..].Replace("/", ":"); + + var serviceScope = httpContext.RequestServices.CreateScope(); + var sysMenuService = serviceScope.ServiceProvider.GetRequiredService(); + + // 获取用户拥有按钮权限集合 + var ownBtnPermList = await sysMenuService.GetOwnBtnPermList(); + if (ownBtnPermList.Exists(u => routeName.Equals(u, StringComparison.CurrentCultureIgnoreCase))) + return true; + + // 获取系统所有按钮权限集合 + var allBtnPermList = await sysMenuService.GetAllBtnPermList(); + return allBtnPermList.TrueForAll(u => !routeName.Equals(u, StringComparison.CurrentCultureIgnoreCase)); + } + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Core/ProjectOptions.cs b/Admin.NET/Admin.NET.Web.Core/ProjectOptions.cs new file mode 100644 index 0000000..9e15cb2 --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Core/ProjectOptions.cs @@ -0,0 +1,49 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Admin.NET.Core; +using AspNetCoreRateLimit; +using Furion; +using Microsoft.Extensions.DependencyInjection; + +namespace Admin.NET.Web.Core; + +public static class ProjectOptions +{ + /// + /// 注册项目配置选项 + /// + /// + /// + public static IServiceCollection AddProjectOptions(this IServiceCollection services) + { + services.AddConfigurableOptions(); + services.AddConfigurableOptions(); + services.AddConfigurableOptions(); + services.AddConfigurableOptions(); + services.AddConfigurableOptions(); + services.AddConfigurableOptions(); + services.AddConfigurableOptions(); + services.AddConfigurableOptions(); + services.AddConfigurableOptions(); + services.AddConfigurableOptions(); + services.AddConfigurableOptions(); + services.AddConfigurableOptions(); + services.AddConfigurableOptions(); + services.AddConfigurableOptions(); + services.AddConfigurableOptions(); + services.AddConfigurableOptions(); + services.AddConfigurableOptions(); + services.AddConfigurableOptions(); + services.AddConfigurableOptions(); + services.Configure(App.Configuration.GetSection("IpRateLimiting")); + services.Configure(App.Configuration.GetSection("IpRateLimitPolicies")); + services.Configure(App.Configuration.GetSection("ClientRateLimiting")); + services.Configure(App.Configuration.GetSection("ClientRateLimitPolicies")); + + return services; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Core/Startup.cs b/Admin.NET/Admin.NET.Web.Core/Startup.cs new file mode 100644 index 0000000..9ff6ff6 --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Core/Startup.cs @@ -0,0 +1,285 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Admin.NET.Core; +using Admin.NET.Core.Service; +using AspNetCoreRateLimit; +using Furion; +using Furion.SpecificationDocument; +using Furion.VirtualFileServer; +using IGeekFan.AspNetCore.Knife4jUI; +using IPTools.Core; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.HttpOverrides; +using Microsoft.AspNetCore.ResponseCompression; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using OnceMi.AspNetCore.OSS; +using SixLabors.ImageSharp.Web.DependencyInjection; +using System; +using System.Linq; +namespace Admin.NET.Web.Core; + +public class Startup : AppStartup +{ + public void ConfigureServices(IServiceCollection services) + { + // 配置选项 + services.AddProjectOptions(); + + // 缓存注册 + services.AddCache(); + + services.AddStackExchangeRedisCache(options => + { + // 连接字符串,这里也可以读取配置文件 + options.Configuration = App.GetConfig("Cluster", true).SignalR.RedisConfiguration; + // 键名前缀 + options.InstanceName = "zhiy_"; + + }); + + // SqlSugar + services.AddSqlSugar(); + services.AddMongoDB(App.GetConfig("Mongoopt", true).Url); + // JWT + services.AddJwt(enableGlobalAuthorize: true) + // 添加 Signature 身份验证 + .AddSignatureAuthentication(options => + { + options.Events = SysOpenAccessService.GetSignatureAuthenticationEventImpl(); + }); + // 允许跨域 + services.AddCorsAccessor(); + // 远程请求 + services.AddHttpRemote(); + // 任务队列 + services.AddTaskQueue(); + // 任务调度 + services.AddSchedule(options => + { + options.AddPersistence(); // 添加作业持久化器 + }); + // 脱敏检测 + services.AddSensitiveDetection(); + + // Json序列化设置 + static void SetNewtonsoftJsonSetting(JsonSerializerSettings setting) + { + setting.DateFormatHandling = DateFormatHandling.IsoDateFormat; + setting.DateTimeZoneHandling = DateTimeZoneHandling.Local; + setting.DateFormatString = "yyyy-MM-dd HH:mm:ss"; // 时间格式化 + setting.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; // 忽略循环引用 + setting.ContractResolver = new CamelCasePropertyNamesContractResolver(); // 解决动态对象属性名大写 + // setting.NullValueHandling = NullValueHandling.Ignore; // 忽略空值 + // setting.Converters.AddLongTypeConverters(); // long转string(防止js精度溢出) 超过17位开启 + // setting.MetadataPropertyHandling = MetadataPropertyHandling.Ignore; // 解决DateTimeOffset异常 + // setting.DateParseHandling = DateParseHandling.None; // 解决DateTimeOffset异常 + // setting.Converters.Add(new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }); // 解决DateTimeOffset异常 + }; + + services.AddControllersWithViews() + .AddAppLocalization() + .AddNewtonsoftJson(options => SetNewtonsoftJsonSetting(options.SerializerSettings)) + //.AddXmlSerializerFormatters() + //.AddXmlDataContractSerializerFormatters() + .AddInjectWithUnifyResult(); + + // 添加响应压缩服务 + services.AddResponseCompression(options => + { + options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat( + new[] { "application/json" }); // 添加需要压缩的其他 MIME 类型 + + // options.Providers.Add(); + options.Providers.Add(); + }); + + // 三方授权登录OAuth + // services.AddOAuth(); + + // ElasticSearch + // services.AddElasticSearch(); + + // 配置Nginx转发获取客户端真实IP + // 注1:如果负载均衡不是在本机通过 Loopback 地址转发请求的,一定要加上options.KnownNetworks.Clear()和options.KnownProxies.Clear() + // 注2:如果设置环境变量 ASPNETCORE_FORWARDEDHEADERS_ENABLED 为 True,则不需要下面的配置代码 + services.Configure(options => + { + options.ForwardedHeaders = ForwardedHeaders.All; + options.KnownNetworks.Clear(); + options.KnownProxies.Clear(); + }); + + // 限流服务 + services.AddInMemoryRateLimiting(); + services.AddSingleton(); + + // 事件总线 + services.AddEventBus(options => + { + options.UseUtcTimestamp = false; + // 不启用事件日志 + options.LogEnabled = false; + // 事件执行器(失败重试) + options.AddExecutor(); + + #region Redis消息队列 + + //// 替换事件源存储器 + //options.ReplaceStorer(serviceProvider => + //{ + // var redisCache = serviceProvider.GetRequiredService(); + // // 创建默认内存通道事件源对象,可自定义队列路由key,如:adminnet + // return new RedisEventSourceStorer(redisCache, "adminnet", 3000); + //}); + + #endregion Redis消息队列 + + #region RabbitMQ消息队列 + + //// 创建默认内存通道事件源对象,可自定义队列路由key,如:adminnet + //var eventBusOpt = App.GetConfig("EventBus", true); + //var rbmqEventSourceStorer = new RabbitMQEventSourceStore(new ConnectionFactory + //{ + // UserName = eventBusOpt.RabbitMQ.UserName, + // Password = eventBusOpt.RabbitMQ.Password, + // HostName = eventBusOpt.RabbitMQ.HostName, + // Port = eventBusOpt.RabbitMQ.Port + //}, "adminnet", 3000); + + //// 替换默认事件总线存储器 + //options.ReplaceStorer(serviceProvider => + //{ + // return rbmqEventSourceStorer; + //}); + + #endregion RabbitMQ消息队列 + }); + + // 图像处理 + services.AddImageSharp(); + + // OSS对象存储 + var ossOpt = App.GetConfig("OSSProvider", true); + services.AddOSSService(Enum.GetName(ossOpt.Provider), "OSSProvider"); + + // 模板引擎 + services.AddViewEngine(); + + // 即时通讯 + services.AddSignalR(SetNewtonsoftJsonSetting); + //services.AddSingleton(); + + // 系统日志 + services.AddLoggingSetup(); + + // 验证码 + services.AddCaptcha(); + + // 控制台logo + // services.AddConsoleLogo(); + + // 将IP地址数据库文件完全加载到内存,提升查询速度(以空间换时间,内存将会增加60-70M) + IpToolSettings.LoadInternationalDbToMemory = true; + // 设置默认查询器China和International + //IpToolSettings.DefalutSearcherType = IpSearcherType.China; + IpToolSettings.DefalutSearcherType = IpSearcherType.International; + } + + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + app.UseForwardedHeaders(); + + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + else + { + app.UseExceptionHandler("/Home/Error"); + app.UseHsts(); + } + + app.Use(async (context, next) => + { + context.Response.Headers.Add("os", "ycymedu"); + // 移除 Furion 相关的 Header + context.Response.Headers.Remove("Furion"); + context.Response.Headers.Remove("Server"); + context.Response.Headers.Add("Server", "nginx"); + await next(); + }); + + + // 图像处理 + app.UseImageSharp(); + + // 特定文件类型(文件后缀)处理 + var contentTypeProvider = FS.GetFileExtensionContentTypeProvider(); + // contentTypeProvider.Mappings[".文件后缀"] = "MIME 类型"; + app.UseStaticFiles(new StaticFileOptions + { + ContentTypeProvider = contentTypeProvider + }); + + //// 启用HTTPS + //app.UseHttpsRedirection(); + + // 启用OAuth + app.UseOAuth(); + + // 添加状态码拦截中间件 + app.UseUnifyResultStatusCodes(); + + // 启用多语言,必须在 UseRouting 之前 + app.UseAppLocalization(); + + // 路由注册 + app.UseRouting(); + + // 启用跨域,必须在 UseRouting 和 UseAuthentication 之间注册 + app.UseCorsAccessor(); + + // 启用鉴权授权 + app.UseAuthentication(); + app.UseAuthorization(); + + // 限流组件(在跨域之后) + app.UseIpRateLimiting(); + app.UseClientRateLimiting(); + + // 使用响应压缩中间件 + app.UseResponseCompression(); + // 任务调度看板 + app.UseScheduleUI(); + + // 配置Swagger-Knife4UI(路由前缀一致代表独立,不同则代表共存) + //app.UseKnife4UI(options => + //{ + // options.RoutePrefix = "kapi"; + // foreach (var groupInfo in SpecificationDocumentBuilder.GetOpenApiGroups()) + // { + // options.SwaggerEndpoint("/" + groupInfo.RouteTemplate, groupInfo.Title); + // } + //}); + + app.UseInject(string.Empty); + + app.UseEndpoints(endpoints => + { + // 注册集线器 + endpoints.MapHubs(); + + endpoints.MapControllerRoute( + name: "default", + pattern: "{controller=Home}/{action=Index}/{id?}"); + }); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Entry/.config/dotnet-tools.json b/Admin.NET/Admin.NET.Web.Entry/.config/dotnet-tools.json new file mode 100644 index 0000000..93ec8eb --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/.config/dotnet-tools.json @@ -0,0 +1,12 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-ef": { + "version": "8.0.5", + "commands": [ + "dotnet-ef" + ] + } + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Entry/Admin.NET.Web.Entry.csproj b/Admin.NET/Admin.NET.Web.Entry/Admin.NET.Web.Entry.csproj new file mode 100644 index 0000000..eaeafc1 --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/Admin.NET.Web.Entry.csproj @@ -0,0 +1,90 @@ + + + + net8.0 + enable + zh-Hans + true + false + ad9369d1-f29b-4f8f-a7df-8b4d7aa0726b + Linux + true + © Admin.NET + Admin.NET 通用权限开发平台 + + + + + + + + + + + + + + + + + + + PreserveNewest + + + + + + Always + + + PreserveNewest + + + PreserveNewest + + + Always + + + Always + + + Always + + + + + + Never + + + + + + + + + + + + + + + + + + Always + + + Always + + + Always + + + Always + + + + diff --git a/Admin.NET/Admin.NET.Web.Entry/Controllers/HomeController.cs b/Admin.NET/Admin.NET.Web.Entry/Controllers/HomeController.cs new file mode 100644 index 0000000..97ab952 --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/Controllers/HomeController.cs @@ -0,0 +1,29 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Admin.NET.Web.Entry.Controllers +{ + [AllowAnonymous] + public class HomeController : Controller + { + //private readonly ISystemService _systemService; + + //public HomeController(ISystemService systemService) + //{ + // _systemService = systemService; + //} + + public IActionResult Index() + { + //ViewBag.Description = _systemService.GetDescription(); + + return View(); + } + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Entry/Dockerfile b/Admin.NET/Admin.NET.Web.Entry/Dockerfile new file mode 100644 index 0000000..552e241 --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/Dockerfile @@ -0,0 +1,15 @@ +# 使用 SDK 镜像作为构建基础 +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + + + +# 设置工作目录 +WORKDIR /app + +# 暴露应用端口 +EXPOSE 5006 +COPY . . +# 设置容器启动命令 +ENTRYPOINT ["dotnet", "Admin.NET.Web.Entry.dll"] diff --git a/Admin.NET/Admin.NET.Web.Entry/FakeStartup.cs b/Admin.NET/Admin.NET.Web.Entry/FakeStartup.cs new file mode 100644 index 0000000..29914ca --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/FakeStartup.cs @@ -0,0 +1,14 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Web.Entry; + +/// +/// 供集成测试使用 +/// +public class FakeStartup +{ +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Entry/GeoLite2-City.mmdb b/Admin.NET/Admin.NET.Web.Entry/GeoLite2-City.mmdb new file mode 100644 index 0000000..f5e23dc Binary files /dev/null and b/Admin.NET/Admin.NET.Web.Entry/GeoLite2-City.mmdb differ diff --git a/Admin.NET/Admin.NET.Web.Entry/Program.cs b/Admin.NET/Admin.NET.Web.Entry/Program.cs new file mode 100644 index 0000000..2031b3d --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/Program.cs @@ -0,0 +1,27 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +Serve.Run(RunOptions.Default.AddWebComponent()); + +public class WebComponent : IWebComponent +{ + public void Load(WebApplicationBuilder builder, ComponentContext componentContext) + { + // 设置日志过滤 + builder.Logging.AddFilter((provider, category, logLevel) => + { + return !new[] { "Microsoft.Hosting", "Microsoft.AspNetCore" }.Any(u => category.StartsWith(u)) && logLevel >= LogLevel.Information; + }); + + // 设置接口超时时间和上传大小 + builder.Configuration.Get().ConfigureKestrel(u => + { + u.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(30); + u.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(30); + u.Limits.MaxRequestBodySize = null; + }); + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Entry/Properties/launchSettings.json b/Admin.NET/Admin.NET.Web.Entry/Properties/launchSettings.json new file mode 100644 index 0000000..4e40620 --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/Properties/launchSettings.json @@ -0,0 +1,38 @@ +{ + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Admin.NET.Web.Entry": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "dotnetRunMessages": true, + "applicationUrl": "http://localhost:5006" + }, + "Container (Dockerfile)": { + "commandName": "Docker", + "launchBrowser": true, + "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}", + "environmentVariables": { + "ASPNETCORE_HTTP_PORTS": "8080" + }, + "publishAllPorts": true + } + }, + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:5006", + "sslPort": 0 + } + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Entry/Resources/Lang.en.resx b/Admin.NET/Admin.NET.Web.Entry/Resources/Lang.en.resx new file mode 100644 index 0000000..d555440 --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/Resources/Lang.en.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Admin NET General Permission Development Platform + + + API Interfaces + + + Source Address + + \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Entry/Resources/Lang.zh-CN.resx b/Admin.NET/Admin.NET.Web.Entry/Resources/Lang.zh-CN.resx new file mode 100644 index 0000000..4c25852 --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/Resources/Lang.zh-CN.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Admin.NET 通用权限开发平台 + + + API 接口 + + + 源码地址 + + \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Entry/SingleFilePublish.cs b/Admin.NET/Admin.NET.Web.Entry/SingleFilePublish.cs new file mode 100644 index 0000000..7d1392e --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/SingleFilePublish.cs @@ -0,0 +1,43 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Furion; +using System.Reflection; + +namespace Admin.NET.Web.Entry; + +/// +/// 解决单文件发布问题 +/// +public class SingleFilePublish : ISingleFilePublish +{ + /// + /// 解决单文件不能扫描的程序集 + /// + /// 可同时配置 + /// + public Assembly[] IncludeAssemblies() + { + // 需要 Furion 框架扫描哪些程序集就写上去即可 + return Array.Empty(); + } + + /// + /// 解决单文件不能扫描的程序集名称 + /// + /// 可同时配置 + /// + public string[] IncludeAssemblyNames() + { + // 需要 Furion 框架扫描哪些程序集就写上去即可 + return new[] + { + "Admin.NET.Application", + "Admin.NET.Core", + "Admin.NET.Web.Core", + }; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Entry/Views/Home/Index.cshtml b/Admin.NET/Admin.NET.Web.Entry/Views/Home/Index.cshtml new file mode 100644 index 0000000..0d3e9ef --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/Views/Home/Index.cshtml @@ -0,0 +1,12 @@ +@{ + ViewData["Title"] = ViewBag.Description; +} + +
+ +
+

star fork GitHub stars GitHub forks GitHub license nuget

+
+

@ViewBag.Description

+

API 接口      源码地址

+
\ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Entry/Views/Shared/_Layout.cshtml b/Admin.NET/Admin.NET.Web.Entry/Views/Shared/_Layout.cshtml new file mode 100644 index 0000000..5c71d26 --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/Views/Shared/_Layout.cshtml @@ -0,0 +1,11 @@ + + + + + + @ViewData["Title"] - Furion + + + @RenderBody() + + \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Entry/Views/_ViewImports.cshtml b/Admin.NET/Admin.NET.Web.Entry/Views/_ViewImports.cshtml new file mode 100644 index 0000000..ae2e7b9 --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/Views/_ViewImports.cshtml @@ -0,0 +1,2 @@ +@using Admin.NET.Web.Entry +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Entry/Views/_ViewStart.cshtml b/Admin.NET/Admin.NET.Web.Entry/Views/_ViewStart.cshtml new file mode 100644 index 0000000..1af6e49 --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/Views/_ViewStart.cshtml @@ -0,0 +1,3 @@ +@{ + Layout = "_Layout"; +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Entry/appsettings.Development.json b/Admin.NET/Admin.NET.Web.Entry/appsettings.Development.json new file mode 100644 index 0000000..c072d2b --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/appsettings.Development.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + + "ConfigurationScanDirectories": [ "Configuration", "" ] +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Entry/appsettings.json b/Admin.NET/Admin.NET.Web.Entry/appsettings.json new file mode 100644 index 0000000..cd1c674 --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/appsettings.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + + "ConfigurationScanDirectories": [ "Configuration", "" ] // 扫描配置文件json文件夹(自动合并该文件夹里面所有json文件) +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Entry/jenkins.sh b/Admin.NET/Admin.NET.Web.Entry/jenkins.sh new file mode 100644 index 0000000..94ffe0e --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/jenkins.sh @@ -0,0 +1,141 @@ +#!/bin/bash +# 定义变量 +WORKSPACE_DIR="Admin.NET/Admin.NET.Web.Entry" +PROJECT_FILE="Admin.NET.Web.Entry.csproj" +PRIVATE_REGISTRY="192.168.104.102:5000" +NAMESPACE="ycymedu" +REPO_NAME="zhiyuanv3" +IMAGE_NAME="$PRIVATE_REGISTRY/$REPO_NAME" +TAG=$(date +%Y%m%d%H%M%S) +PORT=5006 + +REMOTE_SERVER="192.168.104.102" +REMOTE_USER="app" +SSH_PRIVATE_KEY_PATH="/var/opt/YI_LIUYANG" # 从 Jenkins 全局变量中获取 +# 钉钉 Webhook URL +DINGDING_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=fca104958fea6273c9c7ef3f08b3d552645c214f929066785e8caf6e1885a5a6" +# 输出当前工作目录 +echo "当前工作目录: $(pwd)" + +# 清理之前的发布输出目录 +rm -rf "$(pwd)/$WORKSPACE_DIR/out" + +# 进入项目目录 +cd $WORKSPACE_DIR +echo "当前工作目录: $(pwd)" + +# 检查是否成功进入项目目录 +if [ $? -ne 0 ]; then + echo "无法进入项目目录 $WORKSPACE_DIR,请检查路径设置。" + exit 1 +fi + +# 清理之前的构建产物 +dotnet clean + +# 恢复项目依赖 +dotnet restore +echo "当前工作目录2: $(pwd)" + +# 发布项目 +dotnet publish $PROJECT_FILE -c Release -o out +echo "当前工作目录4: $(pwd)" +cd out + +# 构建 Docker 镜像 +docker build -t temp_image:latest . +if [ $? -ne 0 ]; then + echo "Docker 镜像构建失败,请检查 Dockerfile 和相关配置。" + exit 1 +fi + +# 为镜像打标签 +docker tag temp_image:latest "$IMAGE_NAME:$TAG" +if [ $? -ne 0 ]; then + echo "Docker 镜像打标签失败,请检查镜像名称和标签。" + exit 1 +fi + +# 推送 Docker 镜像到私有仓库 +docker push "$IMAGE_NAME:$TAG" +if [ $? -eq 0 ]; then + echo "Docker 镜像构建并推送到私有仓库成功!镜像地址: $IMAGE_NAME:$TAG" +else + echo "Docker 镜像构建或推送失败,请检查日志。" + exit 1 +fi + +# ✅ 远程执行命令,并确保返回正确的 exit 状态码 +ssh -o StrictHostKeyChecking=no -i "$SSH_PRIVATE_KEY_PATH" "$REMOTE_USER@$REMOTE_SERVER" 'bash -s' << EOF + set -e # 遇到错误立即退出 + echo "✅ 远程服务器登录成功!" + + PRIVATE_REGISTRY="192.168.104.102:5000" + REPO_NAME="zhiyuanv3" + IMAGE_NAME="\$PRIVATE_REGISTRY/\$REPO_NAME" + PORT=5006 + + echo "🚀 拉取最新 Docker 镜像: \$IMAGE_NAME:$TAG 和 latest" + sudo docker pull "\$IMAGE_NAME:$TAG" + sudo docker pull "\$IMAGE_NAME:latest" + + # ✅ 停止并删除所有旧容器 + echo "🛑 停止并删除所有旧容器" + OLD_CONTAINERS=\$(sudo docker ps -aq --filter "name=$REPO_NAME") + if [ "\$OLD_CONTAINERS" ]; then + sudo docker stop \$OLD_CONTAINERS + sudo docker rm \$OLD_CONTAINERS + else + echo "✅ 没有找到旧容器,无需删除" + fi + + # ✅ 删除所有旧的 Docker 镜像(保留 latest 和当前 $TAG) + echo "🧹 清理旧的 Docker 镜像" + OLD_IMAGES=\$(sudo docker images "\$IMAGE_NAME" --format "{{.ID}}" | tail -n +2) + if [ "\$OLD_IMAGES" ]; then + sudo docker rmi -f \$OLD_IMAGES + else + echo "✅ 没有找到旧镜像,无需清理" + fi + + # ✅ 启动新容器 + NEW_CONTAINER_NAME="${REPO_NAME}_container_${TAG}" + echo "🚀 启动新容器: \$NEW_CONTAINER_NAME" + sudo docker run --restart=always -d --name "\$NEW_CONTAINER_NAME" -p $PORT:$PORT "\$IMAGE_NAME:$TAG" + + if [ \$? -eq 0 ]; then + echo "✅ 部署成功: \$NEW_CONTAINER_NAME" + exit 0 + else + echo "❌ 部署失败!请检查日志。" + exit 1 + fi +EOF + +# ✅ 确保 ssh 的退出状态传递到本地 +SSH_EXIT_CODE=$? +echo "SSH 退出码: $SSH_EXIT_CODE" + +# ✅ 发送钉钉通知 +send_dingtalk_notification() { + local status="$1" + local message="$2" + + curl -X POST "$DINGDING_WEBHOOK" \ + -H "Content-Type: application/json" \ + -d "{ + \"msgtype\": \"text\", + \"text\": { + \"content\": \"【部署状态】$status\n$message\" + } + }" +} + +if [ $SSH_EXIT_CODE -eq 0 ]; then + SUCCESS_MESSAGE="远程服务器操作完成,应用已成功部署!\n镜像地址: $IMAGE_NAME:$TAG" + send_dingtalk_notification "✅ 成功" "$SUCCESS_MESSAGE" +else + FAILURE_MESSAGE="【部署状态】远程服务器操作失败,请检查 SSH 连接和脚本。" + send_dingtalk_notification "❌ 失败" "$FAILURE_MESSAGE" + exit 1 +fi \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Entry/sensitive-words.txt b/Admin.NET/Admin.NET.Web.Entry/sensitive-words.txt new file mode 100644 index 0000000..901a560 --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/sensitive-words.txt @@ -0,0 +1,4 @@ +装X|特么的|SB|屌爆了|你妹|马勒戈壁|蛋疼|买了个表|妈蛋|日了狗 +吃翔 +装13 +屁民 diff --git a/Admin.NET/Admin.NET.Web.Entry/start.sh b/Admin.NET/Admin.NET.Web.Entry/start.sh new file mode 100644 index 0000000..d3d83aa --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/start.sh @@ -0,0 +1,39 @@ +#!/bin/bash +# DockerIJֿͱǩǰ׺ +REPO_NAME="zhiyuanv3" +TAG_PREFIX="build_" + +# ȡǰʱΪǩ׺ +TIMESTAMP=$(date +%Y%m%d%H%M%S) +TAG="${REPO_NAME}:${TAG_PREFIX}${TIMESTAMP}" +CONTAINER_NAME="${REPO_NAME}_container_${TIMESTAMP}" + +# ԹµDocker +docker build -t "${TAG}" . && { + # ɹֹͣɾͬǰ׺ľ + echo "Stopping and removing old containers..." + docker ps -aqf "name=${REPO_NAME}_container_*" | xargs docker stop + docker ps -aqf "name=${REPO_NAME}_container_*" | xargs docker rm + + # ɾͬǰ׺ľɾųµģ + echo "Removing old images..." + docker images --format "{{.Repository}}:{{.Tag}}" | grep "${REPO_NAME}:${TAG_PREFIX}" | grep -v "${TAG}" | xargs docker rmi + + # ʾɵľϢ + echo "New image built successfully: ${TAG}" + docker images | grep "${TAG}" + + # µֻʾҪӦýе + echo "Starting new container ${CONTAINER_NAME}..." + docker run \ + -p 5006:5006 \ + --restart unless-stopped \ + --name "${CONTAINER_NAME}" \ + -d "${TAG}" + # ʾеϢ + echo "Container started successfully: ${CONTAINER_NAME}" + docker ps | grep "${CONTAINER_NAME}" +} || { + # ʧܣӡϢ + echo "Failed to build the Docker image." +} diff --git a/Admin.NET/Admin.NET.Web.Entry/web.config b/Admin.NET/Admin.NET.Web.Entry/web.config new file mode 100644 index 0000000..002dc98 --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/web.config @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Dto.cs.vm b/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Dto.cs.vm new file mode 100644 index 0000000..3333575 --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Dto.cs.vm @@ -0,0 +1,24 @@ +namespace @Model.NameSpace; + + /// + /// @(@Model.BusName)输出参数 + /// + public class @(@Model.ClassName)Dto + { +@foreach (var column in Model.TableField){ +if(@column.EffectType == "fk" && @column.FkEntityName != "" && @column.FkColumnName != ""){ + @:/// + @:/// @column.ColumnComment + @:/// + @:public @(@column.FkColumnNetType) @(@column.PropertyName)@(@column.FkColumnName) { get; set; } + @: +} +} +@foreach (var column in Model.TableField){ + @:/// + @:/// @column.ColumnComment + @:/// + @:public @column.NetType @column.PropertyName { get; set; } + @: +} + } diff --git a/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Entity.cs.vm b/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Entity.cs.vm new file mode 100644 index 0000000..3fc3c22 --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Entity.cs.vm @@ -0,0 +1,90 @@ +@if(@Model.BaseClassName!=""){ +@:using Admin.NET.Core; +} +namespace @Model.NameSpace; + +/// +/// @(@Model.Description) +/// +[SugarTable("@(@Model.TableName)","@(@Model.Description)")] +public class @(@Model.EntityName) @Model.BaseClassName +{ +@foreach (var column in Model.TableField){ +if(@Model.BaseClassName=="" && @column.IsPrimarykey){ + @:/// + @:/// @column.ColumnDescription + @:/// + if(!@column.IsNullable){ + @:[Required] + } + if(@column.DataType=="string"||@column.DataType=="string?"){ + @:[SugarColumn(ColumnName = "@column.DbColumnName", IsIdentity = @column.IsIdentity.ToString().ToLower(), ColumnDescription = "@column.ColumnDescription", IsPrimaryKey = true, Length = @column.Length)] + } + else if(@column.DataType=="decimal"||@column.DataType=="decimal?"){ + @:[SugarColumn(ColumnName = "@column.DbColumnName", IsIdentity = @column.IsIdentity.ToString().ToLower(), ColumnDescription = "@column.ColumnDescription", IsPrimaryKey = true, Length = @column.Length, DecimalDigits=@column.DecimalDigits )] + } + else{ + @:[SugarColumn(ColumnName = "@column.DbColumnName", IsIdentity = @column.IsIdentity.ToString().ToLower(), ColumnDescription = "@column.ColumnDescription", IsPrimaryKey = true)] + } + @:public @column.DataType @column.PropertyName { get; set; } + @: +} +else if(@Model.BaseClassName=="" && !@column.IsPrimarykey){ + @:/// + @:/// @column.ColumnDescription + @:/// + if(!@column.IsNullable){ + @:[Required] + } + if(@column.DataType=="string"||@column.DataType=="string?"){ + @:[SugarColumn(ColumnName = "@column.DbColumnName", ColumnDescription = "@column.ColumnDescription", Length = @column.Length)] + } + else if(@column.DataType=="decimal"||@column.DataType=="decimal?"){ + @:[SugarColumn(ColumnName = "@column.DbColumnName", ColumnDescription = "@column.ColumnDescription", Length = @column.Length, DecimalDigits=@column.DecimalDigits )] + } + else{ + @:[SugarColumn(ColumnName = "@column.DbColumnName", ColumnDescription = "@column.ColumnDescription")] + } + @:public @column.DataType @column.PropertyName { get; set; } + @: +} +else if(@Model.BaseClassName!="" && @column.IsPrimarykey && @column.DbColumnName.ToLower()!="id"){ + @:/// + @:/// @column.ColumnDescription + @:/// + if(!@column.IsNullable){ + @:[Required] + } + if(@column.DataType=="string"||@column.DataType=="string?"){ + @:[SugarColumn(ColumnName = "@column.DbColumnName", IsIdentity = @column.IsIdentity.ToString().ToLower(), ColumnDescription = "@column.ColumnDescription", IsPrimaryKey = true, Length = @column.Length)] + } + else if(@column.DataType=="decimal"||@column.DataType=="decimal?"){ + @:[SugarColumn(ColumnName = "@column.DbColumnName", IsIdentity = @column.IsIdentity.ToString().ToLower(), ColumnDescription = "@column.ColumnDescription", IsPrimaryKey = true, Length = @column.Length, DecimalDigits=@column.DecimalDigits )] + } + else{ + @:[SugarColumn(ColumnName = "@column.DbColumnName", IsIdentity = @column.IsIdentity.ToString().ToLower(), ColumnDescription = "@column.ColumnDescription", IsPrimaryKey = true)] + } + @:public @column.DataType @column.PropertyName { get; set; } + @: +} +else if(@Model.BaseClassName!="" && !@column.IsPrimarykey && @column.DbColumnName.ToLower()!="id"){ + @:/// + @:/// @column.ColumnDescription + @:/// + if(!@column.IsNullable){ + @:[Required] + } + if(@column.DataType=="string"||@column.DataType=="string?"){ + @:[SugarColumn(ColumnName = "@column.DbColumnName", ColumnDescription = "@column.ColumnDescription", Length = @column.Length)] + } + else if(@column.DataType=="decimal"||@column.DataType=="decimal?"){ + @:[SugarColumn(ColumnName = "@column.DbColumnName", ColumnDescription = "@column.ColumnDescription", Length = @column.Length, DecimalDigits=@column.DecimalDigits )] + } + else{ + @:[SugarColumn(ColumnName = "@column.DbColumnName", ColumnDescription = "@column.ColumnDescription")] + } + @:public @column.DataType @column.PropertyName { get; set; } + @: +} +} +} diff --git a/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Input.cs.vm b/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Input.cs.vm new file mode 100644 index 0000000..48a1aa6 --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Input.cs.vm @@ -0,0 +1,115 @@ +using Admin.NET.Core; +using System.ComponentModel.DataAnnotations; + +namespace @Model.NameSpace; + + /// + /// @(@Model.BusName)基础输入参数 + /// + public class @(@Model.ClassName)BaseInput + { +@foreach (var column in Model.TableField){ +if (@column.ColumnKey != "True"){ + + @:/// + @:/// @column.ColumnComment + @:/// + @:public virtual @column.NetType @column.PropertyName { get; set; } + @: +} +} + } + + /// + /// @(@Model.BusName)分页查询输入参数 + /// + public class @(@Model.ClassName)Input : BasePageInput + { + /// + /// 关键字查询 + /// + public string? SearchKey { get; set; } + +@foreach (var column in Model.TableField){ + if (@column.QueryWhether == "Y"){ + + @:/// + @:/// @column.ColumnComment + @:/// + if(@column.NetType?.EndsWith("?") == true){ + @:public @column.NetType @column.PropertyName { get; set; } + }else { + @:public @(@column.NetType)? @column.PropertyName { get; set; } + } + @: + + if(@column.NetType?.TrimEnd('?') == "DateTime" && @column.QueryType == "~"){ + @:/// + @: /// @(@column.ColumnComment)范围 + @: /// + @: public List @(@column.PropertyName)Range { get; set; } + +} + +} +} + } + + /// + /// @(@Model.BusName)增加输入参数 + /// + public class Add@(@Model.ClassName)Input : @(@Model.ClassName)BaseInput + { +@foreach (var column in Model.TableField){ +if (@column.WhetherRequired == "Y"){ + @:/// + @:/// @column.ColumnComment + @:/// + @:[Required(ErrorMessage = "@(@column.ColumnComment)不能为空")] + @:public override @column.NetType @column.PropertyName { get; set; } + @: +} +} + } + + /// + /// @(@Model.BusName)删除输入参数 + /// + public class Delete@(@Model.ClassName)Input : BaseIdInput + { +@foreach (var column in Model.TableField){ +if (@column.ColumnKey == "True" && @column.PropertyName != "Id"){ + @:/// + @:/// @column.ColumnComment + @:/// + @:[Required(ErrorMessage = "@(@column.ColumnComment)不能为空")] + @:public @column.NetType @column.PropertyName { get; set; } + @: +} +} + } + + /// + /// @(@Model.BusName)更新输入参数 + /// + public class Update@(@Model.ClassName)Input : @(@Model.ClassName)BaseInput + { +@foreach (var column in Model.TableField){ +if (@column.ColumnKey == "True"){ + @:/// + @:/// @column.ColumnComment + @:/// + @:[Required(ErrorMessage = "@(@column.ColumnComment)不能为空")] + @:public @column.NetType @column.PropertyName { get; set; } + @: +} +} + } + + /// + /// @(@Model.BusName)主键查询输入参数 + /// + public class QueryById@(@Model.ClassName)Input : Delete@(@Model.ClassName)Input + { + + } diff --git a/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Manage.js.vm b/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Manage.js.vm new file mode 100644 index 0000000..fd7d5b4 --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Manage.js.vm @@ -0,0 +1,116 @@ +@{Dictionary definedObjects = new Dictionary();} +import request from '/@@/utils/request'; +enum Api { + Add@(@Model.ClassName) = '/api/@(@Model.LowerClassName)/add', + Delete@(@Model.ClassName) = '/api/@(@Model.LowerClassName)/delete', + Update@(@Model.ClassName) = '/api/@(@Model.LowerClassName)/update', + Page@(@Model.ClassName) = '/api/@(@Model.LowerClassName)/page', + Detail@(@Model.ClassName) = '/api/@(@Model.LowerClassName)/detail', + @foreach (var column in Model.TableField){ +if(@column.EffectType == "fk" && (@column.WhetherAddUpdate == "Y" || column.QueryWhether == "Y")){ + @:Get@(@column.FkEntityName)@(@column.PropertyName)Dropdown = '/api/@(@Model.LowerClassName)/@(@column.FkEntityName)@(@column.PropertyName)Dropdown', +}else if(@column.EffectType == "ApiTreeSelect" && !definedObjects.ContainsKey("Get@(@column.FkEntityName)Tree")){ + @{definedObjects.Add("Get@(@column.FkEntityName)Tree", 1);} + @:Get@(@column.FkEntityName)Tree = '/api/@(@Model.LowerClassName)/@(@column.FkEntityName)Tree', +}else if(@column.EffectType == "Upload"){ + @:Upload@(@column.PropertyName) = '/api/@(@Model.LowerClassName)/Upload@(@column.PropertyName)', +} +} +} + +// 增加@(@Model.BusName) +export const add@(@Model.ClassName) = (params?: any) => + request({ + url: Api.Add@(@Model.ClassName), + method: 'post', + data: params, + }); + +// 删除@(@Model.BusName) +export const delete@(@Model.ClassName) = (params?: any) => + request({ + url: Api.Delete@(@Model.ClassName), + method: 'post', + data: params, + }); + +// 编辑@(@Model.BusName) +export const update@(@Model.ClassName) = (params?: any) => + request({ + url: Api.Update@(@Model.ClassName), + method: 'post', + data: params, + }); + +// 分页查询@(@Model.BusName) +export const page@(@Model.ClassName) = (params?: any) => + request({ + url: Api.Page@(@Model.ClassName), + method: 'post', + data: params, + }); + +// 详情@(@Model.BusName) +export const detail@(@Model.ClassName) = (id: any) => + request({ + url: Api.Detail@(@Model.ClassName), + method: 'get', + data: { id }, + }); + +@foreach (var column in Model.TableField){ + if(@column.EffectType == "fk" && (@column.WhetherAddUpdate == "Y" || column.QueryWhether == "Y")){ +@:export const get@(@column.FkEntityName)@(@column.PropertyName)Dropdown = () => + @:request({ + @:url: Api.Get@(@column.FkEntityName)@(@column.PropertyName)Dropdown, + @:method: 'get' + @:}); + }else if(@column.EffectType == "ApiTreeSelect" && !definedObjects.ContainsKey("get@(@column.FkEntityName)Tree")){ + @{definedObjects.Add("get@(@column.FkEntityName)Tree", 1);} +@:export const get@(@column.FkEntityName)Tree = () => + @:request({ + @:url: Api.Get@(@column.FkEntityName)Tree, + @:method: 'get' + @:}); + }else if(@column.EffectType == "Upload"){ + + @:/** + @:* 上传@(@column.ColumnComment) + @:*/ +@:export const upload@(@column.PropertyName) = (params: any) => + @:uploadFileHandle(params, Api.Upload@(@column.PropertyName)) + } +} + +@foreach (var column in Model.TableField){ + if(@column.EffectType == "Upload"){ + @:export const uploadFileHandle = (params: any, url: string) => { + @:const formData = new window.FormData(); + @:formData.append('file', params.file); + @://自定义参数 + @:if (params.data) { + @:Object.keys(params.data).forEach((key) => { + @:const value = params.data![key]; + @:if (Array.isArray(value)) { + @:value.forEach((item) => { + @:formData.append(`${key}[]`, item); + @:}); + @:return; + @:} + @:formData.append(key, params.data![key]); + @:}); + @:} + @:return request({ + @:url: url, + @:method: 'POST', + @:data: formData, + @:headers: { + @:'Content-type': 'multipart/form-data;charset=UTF-8', + @:// ts-ignore + @:ignoreCancelToken: true, + @:}, + @:}); +@:}; + break; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Output.cs.vm b/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Output.cs.vm new file mode 100644 index 0000000..a912c60 --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Output.cs.vm @@ -0,0 +1,58 @@ +namespace @Model.NameSpace; + +/// +/// @(@Model.BusName)输出参数 +/// +public class @(@Model.ClassName)Output +{ +@foreach (var column in Model.TableField){ + @:/// + @:/// @column.ColumnComment + @:/// +if(column.EffectType == "fk") +{ + @:public @column.NetType @column.PropertyName { get; set; } + @: + @:/// + @:/// @(column.ColumnComment) 描述 + @:/// + @:public @(@column.FkColumnNetType) @(@column.PropertyName)@(@column.FkColumnName) { get; set; } + +}else if(column.EffectType == "Upload"){ + @:public @column.NetType @column.PropertyName { get; set; } + @:public SysFile @(@column.PropertyName)Attachment { get; set; } +}else if(column.EffectType == "ApiTreeSelect"){ + @:public @column.NetType @column.PropertyName { get; set; } + @: + @:/// + @:/// @(column.ColumnComment) 描述 + @:/// + @:public string? @(@column.PropertyName)@(@column.DisplayColumn) { get; set; } +}else{ + @:public @column.NetType @(@column.PropertyName) { get; set; } +} + @: +} + } + + +@foreach (var column in Model.TableField){ +if (@column.EffectType == "ApiTreeSelect"){ + @:// 使用实际实体@(@column.FkTableName),所以这里就删了 + @:/* + @:[SugarTable("@(@column.FkTableName)")] + @:public class @(@column.FkEntityName)TreeOutput: EntityBaseId + @:{ + @:[SugarColumn(ColumnName = "@(@column.DisplayColumn)")] + @:public @(@Model.GetColumnNetType(@column.FkTableName,@column.DisplayColumn)) Label { get; set; } + + @:[SugarColumn(ColumnName = "@(@column.ValueColumn)", IsPrimaryKey = true, IsIdentity = false)] + @:public @(@Model.GetColumnNetType(@column.FkTableName,@column.ValueColumn)) Value { get; set; } + + @:public @(@Model.GetColumnNetType(@column.FkTableName,@column.PidColumn)) @column.PidColumn { get; set; } + @:[SugarColumn(IsIgnore = true)] + @:public List<@(@column.FkEntityName)TreeOutput> Children { get; set; } + @:} + @:*/ +} +} diff --git a/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/SeedData.cs.vm b/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/SeedData.cs.vm new file mode 100644 index 0000000..077b4d7 --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/SeedData.cs.vm @@ -0,0 +1,39 @@ +using Admin.NET.Core; +using @Model.EntityNameSpace; + +namespace @Model.NameSpace; + +/// +/// @(Model.Description) 表种子数据 +/// +public class @(Model.SeedDataName): ISqlSugarEntitySeedData<@(Model.EntityName)> +{ + /// + /// 种子数据 + /// + /// + public IEnumerable<@(Model.EntityName)> HasData() + { + string recordsJSON = @@" + @(Model.RecordsJSON.Replace("\"","\"\"").Replace("\n", "\n\t\t\t")) + "; + List<@(Model.EntityName)> records = Newtonsoft.Json.JsonConvert.DeserializeObject>(recordsJSON); + @if (Model.JsonIgnoreInfo.Count>0) { + @: + @:#region 处理 JsonIgnore 的Property + @: + @foreach (var jii in Model.JsonIgnoreInfo){ + @foreach (var j in jii){ + @:records[@j.RecordIndex].@(j.Name) = @(j.Value); + } + @: + } + @:#endregion + } + + // 后处理数据的特殊字段 + //for (int i = 0; i < records.Count; i++) { } + + return records; + } +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Service.cs.vm b/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Service.cs.vm new file mode 100644 index 0000000..70227b6 --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Service.cs.vm @@ -0,0 +1,245 @@ +using Admin.NET.Core.Service; +using @(@Model.NameSpace).Const; +using @(@Model.NameSpace).Entity; +using Microsoft.AspNetCore.Http; +@{ + string joinTableName = "u"; + Dictionary definedObjects = new Dictionary(); + bool haveLikeCdt = false; + foreach (var column in Model.TableField){ + if (column.QueryWhether == "Y" && column.QueryType == "like"){ + haveLikeCdt = true; + } + } +} +namespace @Model.NameSpace; +/// +/// @(@Model.BusName)服务 +/// +[ApiDescriptionSettings(@(@Model.ProjectLastName)Const.ZYGroupName, Order = 100)] +public class @(@Model.ClassName)Service : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository<@(@Model.ClassName)> _rep; + public @(@Model.ClassName)Service(SqlSugarRepository<@(@Model.ClassName)> rep) + { + _rep = rep; + } + + /// + /// 分页查询@(@Model.BusName) + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Page")] + public async Task> Page(@(@Model.ClassName)Input input) + { + var query = _rep.AsQueryable() +@{string conditionFlag = "";} +@if (haveLikeCdt) { + @:.WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => + @foreach (var column in Model.TableField){ + if (@column.QueryWhether == "Y" && column.QueryType == "like"){ + @:@(conditionFlag)u.@(@column.PropertyName).Contains(input.SearchKey.Trim()) + conditionFlag="|| "; + } + } + @:) +} +@foreach (var column in Model.TableField){ +if (@column.QueryWhether == "Y"){ + if (@column.NetType?.TrimEnd('?') == "string"){ + if(@column.QueryType == "like"){ + @:.WhereIF(!string.IsNullOrWhiteSpace(input.@column.PropertyName), u => u.@(@column.PropertyName).Contains(input.@(@column.PropertyName).Trim())) + }else{ + @:.WhereIF(!string.IsNullOrWhiteSpace(input.@column.PropertyName), u => u.@(@column.PropertyName) @column.QueryType input.@(@column.PropertyName)) + } + }else if(@column.NetType?.TrimEnd('?') == "int" || @column.NetType?.TrimEnd('?') == "long"){ + @:.WhereIF(input.@column.PropertyName>0, u => u.@(@column.PropertyName) @column.QueryType input.@(@column.PropertyName)) + }else if(@column.NetType?.TrimEnd('?') == "DateTime" && @column.QueryType == "~"){ + }else if(@column.NetType?.TrimEnd('?').EndsWith("Enum") == true) { + @:.WhereIF(input.@(@column.PropertyName).HasValue, u => u.@(@column.PropertyName) @column.QueryType input.@(@column.PropertyName)) + } +} +} +@if(Model.IsJoinTable){ + @://处理外键和TreeSelector相关字段的连接 + @foreach (var column in Model.TableField){ + if(@column.EffectType == "fk"){ + joinTableName += ", " + column.PropertyName.ToLower(); + @:.LeftJoin<@(@column.FkEntityName)>((@(@joinTableName)) => u.@(@column.PropertyName) == @(@column.PropertyName.ToLower()).Id ) + } else if(@column.EffectType == "ApiTreeSelect"){ + joinTableName += ", " + column.PropertyName.ToLower(); + @:.LeftJoin<@(@column.FkEntityName)>((@(@joinTableName)) => u.@(@column.PropertyName) == @(@column.PropertyName.ToLower()).@(@column.ValueColumn) ) + } + } + @:.OrderBy(u => u.CreateTime) + @:.Select((@(@joinTableName)) => new @(@Model.ClassName)Output + @:{ +@foreach (var column in Model.TableField){ + if(@column.EffectType == "fk"){ + @:@(@column.PropertyName) = u.@(@column.PropertyName), + @:@(@column.PropertyName)@(@column.FkColumnName) = @(@column.PropertyName.ToLower()).@(@column.FkColumnName), + } else if(@column.EffectType == "ApiTreeSelect"){ + @:@(@column.PropertyName) = u.@(@column.PropertyName), + @:@(@column.PropertyName)@(@column.DisplayColumn) = @(@column.PropertyName.ToLower()).@(@column.DisplayColumn), + } else if(@column.NetType?.TrimEnd('?').EndsWith("Enum") == true){ + @:@(@column.PropertyName) = (@(@column.NetType))u.@(@column.PropertyName), + } else { + @:@(@column.PropertyName) = u.@(@column.PropertyName), + } +} + @:}); +@foreach (var column in Model.TableField){ + if(@column.EffectType == "fk"){ + + }else if(@column.EffectType == "Upload"){ + @://.Mapper(c => c.@(@column.PropertyName)Attachment, c => c.@(@column.PropertyName)) + } +} +} else { + @:.Select<@(@Model.ClassName)Output>(); +} +@foreach (var column in Model.TableField){ +if (@column.QueryWhether == "Y"){ + if(@column.NetType?.TrimEnd('?') == "DateTime" && @column.QueryType == "~"){ + @:if(input.@(@column.PropertyName)Range != null && input.@(@column.PropertyName)Range.Count >0) + @:{ + @:DateTime? start= input.@(@column.PropertyName)Range[0]; + @:query = query.WhereIF(start.HasValue, u => u.@column.PropertyName > start); + @:if (input.@(@column.PropertyName)Range.Count >1 && input.@(@column.PropertyName)Range[1].HasValue) + @:{ + @:var end = input.@(@column.PropertyName)Range[1].Value.AddDays(1); + @:query = query.Where(u => u.@(@column.PropertyName) < end); + @:} + @:} + } +} +} + return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 增加@(@Model.BusName) + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Add")] + public async Task Add(Add@(@Model.ClassName)Input input) + { + var entity = input.Adapt<@(@Model.ClassName)>(); + await _rep.InsertAsync(entity); + return entity.Id; + } + + /// + /// 删除@(@Model.BusName) + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Delete")] + public async Task Delete(Delete@(@Model.ClassName)Input input) + { +@foreach (var column in Model.TableField){ +if (@column.ColumnKey == "True"){ + @:var entity = await _rep.GetFirstAsync(u => u.@(@column.PropertyName) == input.@(@column.PropertyName)) ?? throw Oops.Oh(ErrorCodeEnum.D1002); +} +} + await _rep.FakeDeleteAsync(entity); //假删除 + //await _rep.DeleteAsync(entity); //真删除 + } + + /// + /// 更新@(@Model.BusName) + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Update")] + public async Task Update(Update@(@Model.ClassName)Input input) + { + var entity = input.Adapt<@(@Model.ClassName)>(); + await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); + } + + /// + /// 获取@(@Model.BusName) + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "Detail")] + public async Task<@(@Model.ClassName)> Detail([FromQuery] QueryById@(@Model.ClassName)Input input) + { +@foreach (var column in Model.TableField){ +if (@column.ColumnKey == "True"){ + @:return await _rep.GetFirstAsync(u => u.@(@column.PropertyName) == input.@(@column.PropertyName)); +} +} + } + + /// + /// 获取@(@Model.BusName)列表 + /// + /// + /// + [HttpGet] + [ApiDescriptionSettings(Name = "List")] + public async Task> List([FromQuery] @(@Model.ClassName)Input input) + { + return await _rep.AsQueryable().Select<@(@Model.ClassName)Output>().ToListAsync(); + } + +@foreach (var column in Model.TableField){ +if(@column.EffectType == "fk" && (@column.WhetherAddUpdate == "Y" || column.QueryWhether == "Y")){ + @:/// + @:/// 获取@(@column.ColumnComment)列表 + @:/// + @:/// + @:/// + @:[ApiDescriptionSettings(Name = "@(@column.FkEntityName)@(@column.PropertyName)Dropdown"), HttpGet] + @:public async Task @(@column.FkEntityName)@(@column.PropertyName)Dropdown() + @:{ + @:return await _rep.Context.Queryable<@(@column.FkEntityName)>() + @:.Select(u => new + @:{ + @:Label = u.@(@column.FkColumnName), + @:Value = u.Id + @:} + @:).ToListAsync(); + @:} +} +} + +@foreach (var column in Model.TableField){ +if(@column.EffectType == "Upload"){ + @:/// + @:/// 上传@(@column.ColumnComment) + @:/// + @:/// + @:/// + @:[ApiDescriptionSettings(Name = "Upload@(@column.PropertyName)"), HttpPost] + @:public async Task Upload@(@column.PropertyName)([Required] IFormFile file) + @:{ + @:var service = App.GetRequiredService(); + @:return await service.UploadFile(file, "upload/@(@column.PropertyName)"); + @:} +} +} + + +@foreach (var column in Model.TableField){ +if(@column.EffectType == "ApiTreeSelect" && !definedObjects.ContainsKey("@(@column.FkEntityName)Tree")){ + @{definedObjects.Add("@(@column.FkEntityName)Tree", 1);} + @:[HttpGet("@(@column.FkEntityName)Tree")] + @:public async Task @(@column.FkEntityName)Tree() + @:{ + @:return await _rep.Context.Queryable<@(@column.FkEntityName)>().ToTreeAsync(u => u.Children, u => u.@(@column.PidColumn), 0); + @:} +} +} + +} + diff --git a/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/data.data.ts.vm b/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/data.data.ts.vm new file mode 100644 index 0000000..f404ea2 --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/data.data.ts.vm @@ -0,0 +1,161 @@ +import { h } from 'vue'; +import { BasicColumn, FormSchema } from '/@@/components/Table'; +@foreach (var column in Model.TableField){ +if(@column.EffectType == "Upload"){ +@:import { uploadFile } from '/@@/api/sys/admin'; +}else if(@column.EffectType == "fk"){ +@:import { get@(@column.FkEntityName)Dropdown } from '/@@/api/main/@(@Model.ClassName)'; +}else if(@column.EffectType == "Select"){ +@:import { getDataList } from '/@@/api/sys/admin'; +}else if(@column.EffectType == "ApiTreeSelect"){ +@:import { get@(@column.FkEntityName)Tree } from '/@@/api/main/@(@Model.ClassName)'; +}else if(@column.EffectType == "ConstSelector"){ +@:import { codeToName, getSelector } from '/@@/utils/helper/constSelectorHelper'; +}else if(@column.EffectType == "Switch"){ +@:import { Switch } from 'ant-design-vue'; +} +} +export const columns: BasicColumn[] = [ + @foreach (var column in Model.TableField){ + if(@column.WhetherTable == "Y"){ + @:{ + @:title: '@column.ColumnComment', + @:dataIndex: '@column.LowerPropertyName', + @:sorter: true, +if(@column.EffectType == "Upload"){ + @:slots: { customRender: '@(@column.LowerPropertyName)' }, +}else if(@column.EffectType == "fk"){ + @:customRender: ({ record }) => { + @:return record.fk@(@column.PropertyName).@(@column.LowerFkColumnName); + @:}, +}else if(@column.EffectType == "Switch"){ + @:customRender: ({ record }) => { + @:return h(@(@column.EffectType), { checked: record.@(@column.LowerPropertyName) }); + @:}, +}else if(@column.EffectType == "ConstSelector"){ + @:customRender: ({ record }) => { + @:return codeToName(record.@(@column.LowerPropertyName), '@(@column.DictTypeCode)'); + @:}, +} + @:}, + } + + } +]; + +export const searchFormSchema: FormSchema[] = [ +@foreach (var column in Model.QueryWhetherList){ + @:{ + @:field: '@column.LowerPropertyName', + @:label: '@column.ColumnComment', + @:colProps: { span: 8 }, +if(@column.EffectType == "fk"){ + @:component: 'ApiSelect', + @:componentProps: { + @:api: get@(@column.FkEntityName)Dropdown, + @:labelField: 'label', + @:valueField: 'value', + @:}, +}else if(@column.EffectType == "Select"){ + @:component: 'ApiSelect', + @:componentProps: { + @:api: getDataList, + @:params: '@(@column.DictTypeCode)', + @:fieldNames: { + @:label: 'label', + @:value: 'value', + @:}, + @:}, +}else if(@column.EffectType == "ConstSelector"){ + @:component: 'Select', + @:componentProps: { + @:options: getSelector('@(@column.DictTypeCode)'), + @:fieldNames: { + @:label: 'name', + @:value: 'code', + @:}, + @:}, +}else if(@column.EffectType == "ApiTreeSelect"){ + @:component: '@(@column.EffectType)', + @:componentProps: { + @:api: get@(@column.FkEntityName)Tree, + @:}, +} +else if(@column.NetType?.TrimEnd('?') == "DateTime" && @column.QueryType == "~"){ + @:component: 'RangePicker', + @:componentProps: { + @: valueFormat:"YYYY-MM-DD" + @:}, +} +else{ + @:component: 'Input', +} + + @:}, +} +]; + +export const formSchema: FormSchema[] = [ + @foreach (var column in Model.TableField){ + @:{ + @:label: '@column.ColumnComment', + @:field: '@column.LowerPropertyName', +if(@column.EffectType == "fk"){ + @:component: 'ApiSelect', + @:componentProps: { + @:api: get@(@column.FkEntityName)Dropdown, + @:labelField: 'label', + @:valueField: 'value', + @:}, +}else if(@column.EffectType == "Select"){ + @:component: 'ApiSelect', + @:componentProps: { + @:api: getDataList, + @:params: '@(@column.DictTypeCode)', + @:fieldNames: { + @:label: 'label', + @:value: 'value', + @:}, + @:}, +}else if(@column.EffectType == "ConstSelector"){ + @:component: 'Select', + @:componentProps: { + @:options: getSelector('@(@column.DictTypeCode)'), + @:fieldNames: { + @:label: 'name', + @:value: 'code', + @:}, + @:}, +}else if(@column.EffectType == "ApiTreeSelect"){ + @:component: '@(@column.EffectType)', + @:componentProps: { + @:api: get@(@column.FkEntityName)Tree, + @:}, +}else if(@column.EffectType == "Switch"){ + @:component: '@(@column.EffectType)', + @:componentProps: { + @:checkedChildren: '是', + @:unCheckedChildren: '否', + @:}, +}else{ + @:component: '@column.EffectType', +} + if(@column.WhetherRequired == "Y"){ + @:required: true, + }else{ + @:required: false, + } + if(@column.EffectType == "Upload"){ + @:componentProps: { + @:maxNumber: 1, + @:api: uploadFile, + @:}, + } + if(@column.LowerPropertyName == "id"){ + @:show: false, + } + @:colProps: { span: 12 }, + @:}, + + } +]; diff --git a/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/dataModal.vue.vm b/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/dataModal.vue.vm new file mode 100644 index 0000000..25db585 --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/dataModal.vue.vm @@ -0,0 +1,71 @@ + + diff --git a/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/editDialog.vue.vm b/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/editDialog.vue.vm new file mode 100644 index 0000000..b9221ca --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/editDialog.vue.vm @@ -0,0 +1,337 @@ +@{Dictionary definedObjects = new Dictionary();} +@{var pkField = Model.TableField.Where(c => c.ColumnKey == "True").FirstOrDefault();} +@{string pkFieldName = LowerFirstLetter(pkField.PropertyName);} + + + + + + + +@{ +string LowerFirstLetter(string text) +{ +return text.ToString()[..1].ToLower() + text[1..]; // 首字母小写 +} +} \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/index.vue.vm b/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/index.vue.vm new file mode 100644 index 0000000..441fd25 --- /dev/null +++ b/Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/index.vue.vm @@ -0,0 +1,377 @@ +@{ + var pkField = Model.TableField.Where(c => c.ColumnKey == "True").FirstOrDefault(); + string pkFieldName = null; + if(pkField != null && !string.IsNullOrEmpty(pkField.PropertyName)) + { + pkFieldName = LowerFirstLetter(pkField.PropertyName); + } + Dictionary definedObjects = new Dictionary(); + bool haveLikeCdt = false; + foreach (var column in Model.TableField){ + if (column.QueryWhether == "Y" && column.QueryType == "like"){ + haveLikeCdt = true; + } + } +} +