zxs 1 сар өмнө
parent
commit
0892b81ea7

+ 1 - 1
src/CMakeLists.txt

@@ -22,7 +22,7 @@ execute_process(COMMAND "${GENERATOR_PATH}code_generator_command" "${CMAKE_CURRE
 #add_executable(sync_service "main.cpp")
 
 # 将源代码添加到此项目的可执行文件。
-add_executable("${PROJECT_NAME}" "main.cpp" "models/web_sync_item_request_info.h"  "models/web_regex_response_info.h"  "models/web_drop_response_info.h"  "models/web_sync_config_info.h" "models/web_regex_config_info.h" "models/web_general_config_info.h" "models/web_drop_config_info.h")
+add_executable("${PROJECT_NAME}" "main.cpp" "models/web_sync_item_request_info.h"      "models/web_sync_config_info.h" "models/web_regex_config_info.h" "models/web_general_config_info.h" "models/web_drop_config_info.h")
 
 if (CMAKE_VERSION VERSION_GREATER 3.12)
   set_property(TARGET "${PROJECT_NAME}" PROPERTY CXX_STANDARD 20)

+ 25 - 12
src/config/config.xml

@@ -3,19 +3,32 @@
     <users>
         <item id="1" modify_time="2025-06-02 19:53:32" name="管理员" code="admin" password="123456" enable="true" remarks="管理员"/>
     </users>
-	<drop>
-        <item id="1" modify_time="2025-06-10 22:08:59" type="" name="" enable="true" remarks="落格类型"/>
+    <drop>
+        <item id="1" modify_time="2025-06-23 16:12:19" type="0" name="正常" enable="true" remarks="正常落格"/>
+        <item id="2" modify_time="2025-06-23 16:12:19" type="1" name="无方案" enable="true" remarks="无方案"/>
+        <item id="3" modify_time="2025-06-23 16:12:19" type="2" name="超圈" enable="true" remarks="超圈"/>
+        <item id="4" modify_time="2025-06-23 16:12:19" type="3" name="无格口" enable="true" remarks="无格口"/>
+        <item id="5" modify_time="2025-06-23 16:12:20" type="4" name="小车错误" enable="true" remarks="小车错误"/>
+        <item id="6" modify_time="2025-06-23 16:12:20" type="5" name="重量错误" enable="true" remarks="重量错误"/>
+        <item id="7" modify_time="2025-06-23 16:12:20" type="6" name="wcs无响应" enable="true" remarks="wcs无响应"/>
+        <item id="8" modify_time="2025-06-23 16:12:20" type="7" name="漏分拣检测" enable="true" remarks="漏分拣检测"/>
+        <item id="9" modify_time="2025-06-23 16:12:20" type="8" name="未知异常" enable="true" remarks="未知异常"/>
     </drop>
-	<regex>
-		<item id="1" modify_time="2025-06-10 22:08:59" type="" name="" regex="" enable="true" remarks="正则"/>
-	</regex>
+    <regex>
+        <item id="1" modify_time="2025-06-23 16:12:16" type="1" name="圆通" regex="^YT[0-9]{10,20}$" enable="true" remarks="圆通"/>
+        <item id="2" modify_time="2025-06-23 16:12:16" type="0" name="未知" regex="" enable="true" remarks="未知"/>
+        <item id="3" modify_time="2025-06-23 16:12:16" type="2" name="中通" regex="^ZT[0-9]{10,20}$" enable="true" remarks="中通"/>
+        <item id="4" modify_time="2025-06-23 16:12:16" type="3" name="申通" regex="^ST[0-9]{10,20}$" enable="true" remarks="申通"/>
+        <item id="5" modify_time="2025-06-23 16:12:16" type="4" name="韵达" regex="^YD[0-9]{10,20}$" enable="true" remarks="韵达"/>
+        <item id="6" modify_time="2025-06-23 16:12:16" type="5" name="极兔" regex="^JT[0-9]{10,20}$" enable="true" remarks="极兔"/>
+    </regex>
     <general>
-        <item id="1" modify_time="2025-06-07 10:40:55" key="1" value="600" enable="true" remarks="小车节距"/>
-        <item id="2" modify_time="2025-06-05 13:26:45" key="2" value="10" enable="true" remarks="同步时间间隔"/>
-		<item id="3" modify_time="2025-06-05 13:26:45" key="3" value="http://127.0.0.1/" enable="true" remarks="服务器地址"/>
-		<item id="4" modify_time="2025-06-05 13:26:45" key="4" value="true" enable="true" remarks="是否开启上传"/>
+        <item id="1" modify_time="2025-06-23 16:12:40" key="1" value="http://127.0.0.1:9004/api/base/drop_type" enable="true" remarks="落格类型地址配置"/>
+        <item id="2" modify_time="2025-06-23 16:12:40" key="2" value="http://127.0.0.1:9004/api/base/config" enable="true" remarks="通用地址配置"/>
+        <item id="3" modify_time="2025-06-23 16:12:40" key="3" value="http://127.0.0.1:9004/api/base/regex_type" enable="true" remarks="单号规则地址配置"/>
+        <item id="4" modify_time="2025-06-23 16:12:40" key="4" value="http://127.0.0.1:9004/api/upload/sync" enable="true" remarks="操作量地址配置"/>
+        <item id="5" modify_time="2025-06-23 16:12:40" key="5" value="600" enable="true" remarks="小车节距"/>
+        <item id="6" modify_time="2025-06-23 16:12:40" key="6" value="1" enable="true" remarks="是否开启上传"/>
     </general>
-	<sync>
-		<item id="1" create_time="2025-06-10 22:08:59" summary_time="2025-06-10 22:08:59" device_id="" running_distance="" speed="" express_type="" lattice_count="" supply_count="" reflux_count="" supply_summay="" lattice_summay="" reflux_summay="" enable="true" remarks="要上传的数据"/>
-	</sync>
+    <sync/>
 </root>

+ 6 - 2
src/config/nexus_net_config.xml

@@ -26,9 +26,13 @@
 	<!-- 订阅 -->
 	<subscribe>
 		<!-- node:订阅节点名称 app:应用名称 inout:0允许所有,1允许子站点,2允许父站点 -->
-		<item key="cloud_drop" route="cloud/drop" enable="true" remarks="落格状态"/>
+		<item key="cloud_drop" route="cloud/drop" enable="true" remarks="落格类型"/>
 		<item key="cloud_general" route="cloud/general" enable="true" remarks="通用配置"/>
-		<item key="cloud_regex" route="cloud/regex" enable="true" remarks="单号类型"/>
+		<item key="cloud_regex" route="cloud/regex" enable="true" remarks="单号规则"/>
+		<item key="local_stepping" route="local/stepping" enable="true" remarks="步进信息"/>
+		<item key="local_supply" route="local/supply" enable="true" remarks="供包信息"/>
+		<item key="local_drop" route="local/drop" enable="true" remarks="落格信息"/>
+		<item key="local_speed" route="local/speed" enable="true" remarks="速度信息"/>
 	</subscribe>
 	<!-- 发布 -->
 	<publisher>

+ 33 - 3
src/core/core.hpp

@@ -26,6 +26,10 @@ public:
 		network_->cloud_drop_event.bind(&core::on_cloud_drop_response, this);
 		network_->cloud_general_event.bind(&core::on_cloud_general_response, this);
 		network_->cloud_regex_event.bind(&core::on_cloud_regex_response, this);
+		network_->local_stepping_event.bind(&core::on_local_stepping, this);
+		network_->local_supply_event.bind(&core::on_local_supply, this);
+		network_->local_drop_event.bind(&core::on_local_drop, this);
+		network_->local_speed_event.bind(&core::on_local_speed, this);
 	}
 	/**
 	 * @brief 析构函数,用于销毁 core 对象并在销毁前调用 stop() 方法。
@@ -96,7 +100,7 @@ private:
 	 * @param supply_no 供应编号,用于标识供应商或供应点。
 	 * @param waybill_no 运单号,用于识别快递单据。
 	 */
-	void on_supply_waybill_no(int supply_no,std::string const& waybill_no) {
+	void on_local_supply(int supply_no,std::string const& waybill_no) {
 		int type = get_express_type(waybill_no);
 		supply_statistics(type, supply_no);
 	}
@@ -106,7 +110,7 @@ private:
 	 * @param drop_type 投递类型,表示投递的方式或类型。
 	 * @param waybill_no 快递单号,用于识别快递类型。
 	 */
-	void on_drop_waybill_no(int lattice_no, int drop_type, std::string const& waybill_no) {
+	void on_local_drop(int lattice_no, int drop_type, std::string const& waybill_no) {
 		int type = get_express_type(waybill_no);
 		if (0 != drop_type) {
 			reflux_statistics(type, drop_type);
@@ -115,6 +119,26 @@ private:
 			lattice_statistics(type, lattice_no);
 		}
 	}
+	/**
+	 * @brief 本地步进时调用的回调函数。
+	 */
+	void on_local_stepping() {
+		auto config = xml_context::from<web_general_config_info>().where([](auto it) {return it->enable && it->key == 5; }).first();
+		if (!config) {
+			config.reset(new web_general_config_info());
+			config->value = "600";
+		}
+		std::lock_guard<std::mutex> locker(mutex_);
+		sync_data_.running_distance += std::atoi(config->value.c_str());
+	}
+	/**
+	 * @brief 设置本地速度值,并使用互斥锁保护同步数据的访问。
+	 * @param speed 要设置的速度值。
+	 */
+	void on_local_speed(int speed) {
+		std::lock_guard<std::mutex> locker(mutex_);
+		sync_data_.speed = speed;
+	}
 private:
 	/**
 	 * @brief 扫描并处理指定类型和供应编号的统计信息。
@@ -203,7 +227,7 @@ private:
 		auto list = xml_context::from<web_regex_config_info>().where([](auto it) {return it->enable; }).value_ptr();
 		int type = 0;
 		for (auto& it : list) {
-			if (v3::utils::regex_check(waybill_no, it->regex)) {
+			if (!it->regex.empty() && v3::utils::regex_check(waybill_no, it->regex)) {
 				type = it->type;
 				break;
 			}
@@ -239,6 +263,12 @@ private:
 	 * @brief 在超时时调用的回调函数。
 	 */
 	void on_timeout() {
+		auto config = xml_context::from<web_general_config_info>().where([](auto it) {return it->enable && it->key == 6; }).first();
+		if (!config) {
+			config.reset(new web_general_config_info());
+			config->value = "10";
+		}
+		timer_.set_timer_interval(1000 * 60 * std::atoi(config->value.c_str()));
 		std::lock_guard<std::mutex> locker(mutex_);
 		try {
 			if (!network_->sync_request(sync_data_)) {

+ 0 - 40
src/models/web_drop_response_info.h

@@ -1,40 +0,0 @@
-#pragma once
-//stl
-#include <iostream>
-//robotics
-#include <robotics/datetime.hpp>
-
-using namespace robotics;
-
-/* ************************************************
-* 作者:Lenovo
-* 时间:2024/6/3 21:14:08
-* 机器名:DESKTOP-4I13MDL
-* 实体类名:web_drop_response_info
-* 数据库表名 				[[SqlTable("xxx")]]
-* 不生成反射 				[[NoReflect]]
-* Json字段名 			[[Json("xxx")]]
-* 不生成Json字段 			[[NoJson(true)]]
-* Sql字段名  			[[Sql("xxx")]]
-* 不生成Sql字段 			[[NoSql(true)]]
-* Excel字段名			[[Excel("xxx")]]
-* 不生成Excel字段 		[[NoExcel(true)]]
-* *************************************************/
-
-/**
- * @brief Web投递点响应信息结构体,包含投递点类型和名称。
- */
-struct web_drop_response_info
-{
-	/**
-	 * @brief 投递点类型编号
-	 */
-	[[Json("dropType")]]
-	int drop_type = 0;
-
-	/**
-	 * @brief 投递点名称
-	 */
-	[[Json("dropName")]]
-	std::string drop_name;
-};

+ 0 - 46
src/models/web_regex_response_info.h

@@ -1,46 +0,0 @@
-#pragma once
-//stl
-#include <iostream>
-//robotics
-#include <robotics/datetime.hpp>
-
-using namespace robotics;
-
-/* ************************************************
-* 作者:Lenovo
-* 时间:2024/6/3 21:14:08
-* 机器名:DESKTOP-4I13MDL
-* 实体类名:web_regex_response_info
-* 数据库表名 				[[SqlTable("xxx")]]
-* 不生成反射 				[[NoReflect]]
-* Json字段名 			[[Json("xxx")]]
-* 不生成Json字段 			[[NoJson(true)]]
-* Sql字段名  			[[Sql("xxx")]]
-* 不生成Sql字段 			[[NoSql(true)]]
-* Excel字段名			[[Excel("xxx")]]
-* 不生成Excel字段 		[[NoExcel(true)]]
-* *************************************************/
-
-/**
- * @brief Web正则响应信息结构体,包含快递类型、快递名称及正则表达式。
- */
-struct web_regex_response_info
-{
-	/**
-	 * @brief 快递类型编号
-	 */
-	[[Json("expressType")]]
-	int express_type = 0;
-
-	/**
-	 * @brief 快递名称
-	 */
-	[[Json("expressName")]]
-	std::string express_name;
-
-	/**
-	 * @brief 匹配快递单号的正则表达式
-	 */
-	[[Json("regular")]]
-	std::string regex;
-};

+ 46 - 34
src/network/http_network.hpp

@@ -5,8 +5,6 @@
 #include "../xml/xml_context.hpp"
 #include "../models/web_response_info.h"
 #include "../models/web_message_info.h"
-#include "../models/web_drop_response_info.h"
-#include "../models/web_regex_response_info.h"
 #include "../models/web_sync_request_info.h"
 
 using namespace robotics;
@@ -118,16 +116,16 @@ public:
 	}
 	/**
 	 * @brief 发送请求以获取掉落信息,并返回包含响应数据的 web_response_info 对象。
-	 * @return 包含 web_drop_response_info 数据的 web_response_info 对象。
+	 * @return 包含 web_drop_config_info 数据的 web_response_info 对象。
 	 */
-	web_response_info<web_drop_response_info> request_drop() {
-		auto url_config = xml_context::from<web_general_config_info>().where([](auto it) {return it->enable && it->key == 1; }).first();
-		if (!url_config) {
-			url_config.reset(new web_general_config_info());
-			url_config->value = "http://127.0.0.1:8002/api/base/get_drop_type";
+	web_response_info<web_drop_config_info> request_drop() {
+		auto config = xml_context::from<web_general_config_info>().where([](auto it) {return it->enable && it->key == 1; }).first();
+		if (!config) {
+			config.reset(new web_general_config_info());
+			config->value = "http://127.0.0.1:8002/api/base/drop_type";
 		}
-		LOG_INFO << "Url:" << url_config->value;
-		return request<utils::http_type_enum::get, web_response_info<web_drop_response_info>>(url_config->value);
+		LOG_INFO << "Url:" << config->value;
+		return request<utils::http_type_enum::get, web_response_info<web_drop_config_info>>(config->value);
 	}
 	/**
 	 * @brief 根据给定的 key 获取通用配置信息的 Web 响应。
@@ -135,28 +133,28 @@ public:
 	 * @return 包含通用配置信息的 web_response_info<web_general_config_info> 对象。
 	 */
 	web_response_info<web_general_config_info> request_general(int key) {
-		auto url_config = xml_context::from<web_general_config_info>().where([](auto it) {return it->enable && it->key == 4; }).first();
-		if (!url_config) {
-			url_config.reset(new web_general_config_info());
-			url_config->value = "http://127.0.0.1:8002/api/base/config";
+		auto config = xml_context::from<web_general_config_info>().where([](auto it) {return it->enable && it->key == 2; }).first();
+		if (!config) {
+			config.reset(new web_general_config_info());
+			config->value = "http://127.0.0.1:8002/api/base/config";
 		}
-		std::string url = url_config->value + "?devece_id=" + device_id_ + "&app_name=after_service&key=" + std::to_string(key);
+		std::string url = config->value + "?key=" + std::to_string(key);
 		LOG_INFO << "Url:" << url;
-		return request<utils::http_type_enum::get, web_response_info<web_general_config_info>>(url_config->value);
+		return request<utils::http_type_enum::get, web_response_info<web_general_config_info>>(url);
 	}
 	/**
 	 * @brief 根据给定的键值请求正则表达式相关的 Web 响应信息。若未找到对应配置,则使用默认 URL。返回包含正则表达式响应信息的 Web 响应对象。
 	 * @param key 用于查找 URL 配置的键值。
-	 * @return 包含正则表达式响应信息的 web_response_info<web_regex_response_info> 对象。
+	 * @return 包含正则表达式响应信息的 web_response_info<web_regex_config_info> 对象。
 	 */
-	web_response_info<web_regex_response_info> request_regex() {
-		auto url_config = xml_context::from<web_general_config_info>().where([](auto it) {return it->enable && it->key == 2; }).first();
-		if (!url_config) {
-			url_config.reset(new web_general_config_info());
-			url_config->value = "http://127.0.0.1:8002/api/base/config";
+	web_response_info<web_regex_config_info> request_regex() {
+		auto config = xml_context::from<web_general_config_info>().where([](auto it) {return it->enable && it->key == 3; }).first();
+		if (!config) {
+			config.reset(new web_general_config_info());
+			config->value = "http://127.0.0.1:8002/api/base/regex_type";
 		}
-		LOG_INFO << "Url:" << url_config->value;
-		return request<utils::http_type_enum::get, web_response_info<web_regex_response_info>>(url_config->value);
+		LOG_INFO << "Url:" << config->value;
+		return request<utils::http_type_enum::get, web_response_info<web_regex_config_info>>(config->value);
 	}
 	/**
 	 * @brief 同步发送 Web 请求并返回消息信息。
@@ -164,23 +162,33 @@ public:
 	 * @return 返回包含 Web 消息信息的 web_message_info 对象。
 	 */
 	web_message_info request_sync(web_sync_request_info const&data) {
-		auto url_config = xml_context::from<web_general_config_info>().where([](auto it) {return it->enable && it->key == 3; }).first();
-		if (!url_config) {
-			url_config.reset(new web_general_config_info());
-			url_config->value = "http://127.0.0.1:8002/api/base/config";
+		auto config = xml_context::from<web_general_config_info>().where([](auto it) {return it->enable && it->key == 4; }).first();
+		if (!config) {
+			config.reset(new web_general_config_info());
+			config->value = "http://127.0.0.1:8002/api/upload/sync";
 		}
-		LOG_INFO << "Url:" << url_config->value;
-		return request<utils::http_type_enum::post, web_message_info>(url_config->value, data);
+		LOG_INFO << "Url:" << config->value;
+		return request<utils::http_type_enum::post, web_message_info>(config->value, data);
 	}
 private:
 	/**
 	 * @brief 初始化或处理 HTTP 网络操作。
 	 */
-	http_network() {}
+	http_network():
+		app_name_("sync_service") { }
 private:
+	/**
+	 * @brief 发送带有指定数据的 HTTP 请求,并返回响应结果。
+	 * @tparam _Ret 请求返回值的类型。
+	 * @tparam _Value 要序列化并发送的数据类型。
+	 * @tparam _Type HTTP 请求类型(如 GET、POST 等),由 utils::http_type_enum 枚举指定。
+	 * @param url 要请求的目标 URL。
+	 * @param data 要随请求发送的数据,将被序列化为 JSON 格式。
+	 * @return HTTP 请求的响应结果,类型为 _Ret。
+	 */
 	template<utils::http_type_enum _Type, typename _Ret,typename _Value>
 	_Ret request(std::string const& url, _Value const& data) {
-		return http_.request<_Type, _Ret>(http::url_encode(url), v3::json_convert::serialize(data), { {"Content-Type","application/json"},{"User-Agent","Chrome"},{"token",sign()} });
+		return http_.request<_Type, _Ret>(http::url_encode(url), v3::json_convert::serialize(data), { {"Content-Type","application/json"},{"User-Agent","Chrome"},{"Token",sign()},{"DeviceId",device_id_ },{"AppName",app_name_ } });
 	}
 	/**
 	 * @brief 发送一个HTTP POST请求,并返回指定类型的结果。
@@ -192,7 +200,7 @@ private:
 	 */
 	template<utils::http_type_enum _Type, typename _Ret>
 	_Ret request(std::string const&url,std::string const&data) {
-		return http_.request<_Type, _Ret>(http::url_encode(url), data, { {"Content-Type","application/json"},{"User-Agent","Chrome"},{"token",sign()} });
+		return http_.request<_Type, _Ret>(http::url_encode(url), data, { {"Content-Type","application/json"},{"User-Agent","Chrome"},{"Token",sign()},{"DeviceId",device_id_ },{"AppName",app_name_ } });
 	}
 	/**
 	 * @brief 发送一个HTTP GET请求到指定的URL,并返回指定类型的结果。
@@ -203,7 +211,7 @@ private:
 	 */
 	template<utils::http_type_enum _Type, typename _Ret>
 	_Ret request(std::string const& url) {
-		return http_.request<_Type, _Ret>(http::url_encode(url), { {"Content-Type","text/html"},{"User-Agent","Chrome"},{"token",sign()} });
+		return http_.request<_Type, _Ret>(http::url_encode(url), { {"Content-Type","text/html"},{"User-Agent","Chrome"},{"Token",sign()},{"DeviceId",device_id_ },{"AppName",app_name_ } });
 	}
 	/**
 	 * @brief 生成设备标识符的签名字符串。
@@ -221,4 +229,8 @@ private:
 	 * @brief 设备的唯一标识符字符串。
 	 */
 	std::string device_id_;
+	/**
+	 * @brief 应用程序的名称。
+	 */
+	std::string app_name_;
 };

+ 64 - 11
src/network/network.hpp

@@ -63,10 +63,10 @@ public:
 			result.push_back(web_drop_config_info{ 
 				.id = 0,
 				.modify_time = v3::datetime::current_time_stamp(),
-				.type = it.drop_type,
-				.name = it.drop_name,
-				.enable = true,
-				.remarks = it.drop_name });
+				.type = it.type,
+				.name = it.name,
+				.enable = it.enable,
+				.remarks = it.remarks });
 		}
 		return result;
 	}
@@ -98,11 +98,11 @@ public:
 			result.push_back(web_regex_config_info{ 
 				.id = 0,
 				.modify_time = v3::datetime::current_time_stamp(),
-				.type = it.express_type,
-				.name = it.express_name,
+				.type = it.type,
+				.name = it.name,
 				.regex = it.regex,
-				.enable = true,
-				.remarks = it.express_name });
+				.enable = it.enable,
+				.remarks = it.remarks });
 		}
 		return result;
 	}
@@ -119,7 +119,7 @@ public:
 	/**
 	 * @brief 云端拖放事件的委托对象,用于处理包含 web_drop_config_info 列表的事件。
 	 */
-	v3::delegates<std::vector<web_drop_config_info>const&> cloud_drop_event;
+	v3::delegates<std::vector<web_drop_config_info>const&>		cloud_drop_event;
 	/**
 	 * @brief 用于处理 cloud_general_event 事件的委托对象,传递常量引用的 web_general_config_info 向量。
 	 */
@@ -128,12 +128,28 @@ public:
 	 * @brief 云正则事件的委托对象,用于处理包含 web_regex_config_info 配置信息的向量参数的事件。
 	 */
 	v3::delegates<std::vector<web_regex_config_info> const&>	cloud_regex_event;
+	/**
+	 * @brief 表示一个不带参数的事件委托对象。
+	 */
+	v3::delegates<>												local_stepping_event;
+	/**
+	 * @brief 本地供应事件的委托对象,用于处理带有整数和常量字符串引用参数的事件回调。
+	 */
+	v3::delegates<int, std::string const&>						local_supply_event;
+	/**
+	 * @brief 表示一个可用于本地拖放事件的委托对象,接受两个整数和一个常量字符串引用作为参数。
+	 */
+	v3::delegates<int, int, std::string const&>					local_drop_event;
+	/**
+	 * @brief 本地速度事件的委托对象,用于管理和分发与速度相关的回调函数。
+	 */
+	v3::delegates<int>											local_speed_event;
 private:
 	/**
 	 * @brief network 构造函数,初始化网络相关组件并绑定事件处理函数。
 	 */
 	network() :
-		v3::thread_pool<network>() {
+		v3::thread_pool<network>(3) {
 		http_network_ = http_network::instance();
 		nexus_net_v1_ = nexus_net_network_v1::instance();
 		nexus_net_v2_ = nexus_net_network_v2::instance();
@@ -144,7 +160,10 @@ private:
 		nexus_net_v2_->bind("cloud_drop", &network::on_cloud_drop_response, this);
 		nexus_net_v2_->bind("cloud_general", &network::on_cloud_general_response, this);
 		nexus_net_v2_->bind("cloud_regex", &network::on_cloud_regex_response, this);
-
+		nexus_net_v2_->bind("local_stepping", &network::on_local_stepping_response, this);
+		nexus_net_v2_->bind("local_supply", &network::on_local_supply_response, this);
+		nexus_net_v2_->bind("local_drop", &network::on_local_drop_response, this);
+		nexus_net_v2_->bind("local_speed", &network::on_local_speed_response, this);
 	}
 private:
 	/**
@@ -192,6 +211,40 @@ private:
 			LOG_ERROR << ec;
 		}
 	}
+	/**
+	 * @brief 处理排序器步进响应的回调函数。
+	 */
+	void on_local_stepping_response() {
+		REGISTER_ASYNC_FUNC(on_local_stepping_response);
+		local_stepping_event();
+	}
+	/**
+	 * @brief 处理本地供应响应的回调函数。
+	 * @param supply_no 供应编号,用于标识本地供应请求。
+	 * @param waybill_no 运单号,表示相关的物流单号。
+	 */
+	void on_local_supply_response(int supply_no, std::string const& waybill_no) {
+		REGISTER_ASYNC_FUNC(on_local_supply_response, supply_no, waybill_no);
+		local_supply_event(supply_no, waybill_no);
+	}
+	/**
+	 * @brief 处理本地投递响应的回调函数。
+	 * @param lattice_no 格口编号,用于标识具体的格口。
+	 * @param drop_type 投递类型,指示投递的方式或类型。
+	 * @param waybill_no 运单号,表示相关包裹的唯一标识。
+	 */
+	void on_local_drop_response(int lattice_no, int drop_type, std::string const& waybill_no) {
+		REGISTER_ASYNC_FUNC(on_local_drop_response, lattice_no, drop_type, waybill_no);
+		local_drop_event(lattice_no, drop_type, waybill_no);
+	}
+	/**
+	 * @brief 处理本地速度响应的回调函数。
+	 * @param speed 本地速度值。
+	 */
+	void on_local_speed_response(int speed) {
+		REGISTER_ASYNC_FUNC(on_local_speed_response, speed);
+		local_speed_event(speed);
+	}
 private:
 	/**
 	 * @brief 根据授权状态处理设备ID的设置。

+ 33 - 48
src/reflect.h

@@ -1,13 +1,11 @@
-//生成时间:2025-06-21 16:58:26
+//生成时间:2025-06-23 13:48:12
 #pragma once
 #include <rttr/registration>
 #include <robotics/logger.hpp>
 #include "models/web_drop_config_info.h"
-#include "models/web_drop_response_info.h"
 #include "models/web_general_config_info.h"
 #include "models/web_message_info.h"
 #include "models/web_regex_config_info.h"
-#include "models/web_regex_response_info.h"
 #include "models/web_response_info.h"
 #include "models/web_sync_config_info.h"
 #include "models/web_sync_item_request_info.h"
@@ -21,7 +19,7 @@
 #include "controllers/sync.hpp"
 #include "controllers/user.hpp"
 
-static void func_a6a008be1c6e8e1ae9bb00af88e10636() {
+static void func_d570f491d35dc9cbebec1426298cd8bc() {
 	rttr::registration::class_<struct web_drop_config_info>("web_drop_config_info").constructor<>()(rttr::detail::as_object{}).
 		property("id",&web_drop_config_info::id)(rttr::metadata("Json","id"),rttr::metadata("Sql","id"),rttr::metadata("Excel",R"(id)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_drop_config_info::id))).
 		property("modify_time",&web_drop_config_info::modify_time)(rttr::metadata("Json","modify_time"),rttr::metadata("Sql","modify_time"),rttr::metadata("Excel",R"(modify_time)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_drop_config_info::modify_time))).
@@ -30,12 +28,7 @@ static void func_a6a008be1c6e8e1ae9bb00af88e10636() {
 		property("enable",&web_drop_config_info::enable)(rttr::metadata("Json","enable"),rttr::metadata("Sql","enable"),rttr::metadata("Excel",R"(enable)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_drop_config_info::enable))).
 		property("remarks",&web_drop_config_info::remarks)(rttr::metadata("Json","remarks"),rttr::metadata("Sql","remarks"),rttr::metadata("Excel",R"(remarks)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_drop_config_info::remarks)));
 }
-static void func_2aec811580c272b1442f7c81afe182e1() {
-	rttr::registration::class_<struct web_drop_response_info>("web_drop_response_info").constructor<>()(rttr::detail::as_object{}).
-		property("drop_type",&web_drop_response_info::drop_type)(rttr::metadata("Json","dropType"),rttr::metadata("Sql","drop_type"),rttr::metadata("Excel",R"(drop_type)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_drop_response_info::drop_type))).
-		property("drop_name",&web_drop_response_info::drop_name)(rttr::metadata("Json","dropName"),rttr::metadata("Sql","drop_name"),rttr::metadata("Excel",R"(drop_name)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_drop_response_info::drop_name)));
-}
-static void func_44a3179c5f1cbf888d4062e127d71e55() {
+static void func_b25b3ec2cb68a264fa80f208c4fc49aa() {
 	rttr::registration::class_<struct web_general_config_info>("web_general_config_info").constructor<>()(rttr::detail::as_object{}).
 		property("id",&web_general_config_info::id)(rttr::metadata("Json","id"),rttr::metadata("Sql","id"),rttr::metadata("Excel",R"(id)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_general_config_info::id))).
 		property("modify_time",&web_general_config_info::modify_time)(rttr::metadata("Json","modify_time"),rttr::metadata("Sql","modify_time"),rttr::metadata("Excel",R"(modify_time)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_general_config_info::modify_time))).
@@ -44,12 +37,12 @@ static void func_44a3179c5f1cbf888d4062e127d71e55() {
 		property("enable",&web_general_config_info::enable)(rttr::metadata("Json","enable"),rttr::metadata("Sql","enable"),rttr::metadata("Excel",R"(enable)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_general_config_info::enable))).
 		property("remarks",&web_general_config_info::remarks)(rttr::metadata("Json","remarks"),rttr::metadata("Sql","remarks"),rttr::metadata("Excel",R"(remarks)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_general_config_info::remarks)));
 }
-static void func_0e35346b4e41349675e14067fbf9c054() {
+static void func_93a139474e9ed908ef7ca61879e90f0d() {
 	rttr::registration::class_<struct web_message_info>("web_message_info").constructor<>()(rttr::detail::as_object{}).
 		property("success",&web_message_info::success)(rttr::metadata("Json","success"),rttr::metadata("Sql","success"),rttr::metadata("Excel",R"(success)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_message_info::success))).
 		property("message",&web_message_info::message)(rttr::metadata("Json","message"),rttr::metadata("Sql","message"),rttr::metadata("Excel",R"(message)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_message_info::message)));
 }
-static void func_2f5f6c19755fe336f1fb5136efce37c4() {
+static void func_b7ff0396ed1c36af5786e42c15c8241d() {
 	rttr::registration::class_<struct web_regex_config_info>("web_regex_config_info").constructor<>()(rttr::detail::as_object{}).
 		property("id",&web_regex_config_info::id)(rttr::metadata("Json","id"),rttr::metadata("Sql","id"),rttr::metadata("Excel",R"(id)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_regex_config_info::id))).
 		property("modify_time",&web_regex_config_info::modify_time)(rttr::metadata("Json","modify_time"),rttr::metadata("Sql","modify_time"),rttr::metadata("Excel",R"(modify_time)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_regex_config_info::modify_time))).
@@ -59,13 +52,7 @@ static void func_2f5f6c19755fe336f1fb5136efce37c4() {
 		property("enable",&web_regex_config_info::enable)(rttr::metadata("Json","enable"),rttr::metadata("Sql","enable"),rttr::metadata("Excel",R"(enable)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_regex_config_info::enable))).
 		property("remarks",&web_regex_config_info::remarks)(rttr::metadata("Json","remarks"),rttr::metadata("Sql","remarks"),rttr::metadata("Excel",R"(remarks)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_regex_config_info::remarks)));
 }
-static void func_6e0098419dc641d41d5d0fa730e86cc2() {
-	rttr::registration::class_<struct web_regex_response_info>("web_regex_response_info").constructor<>()(rttr::detail::as_object{}).
-		property("express_type",&web_regex_response_info::express_type)(rttr::metadata("Json","expressType"),rttr::metadata("Sql","express_type"),rttr::metadata("Excel",R"(express_type)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_regex_response_info::express_type))).
-		property("express_name",&web_regex_response_info::express_name)(rttr::metadata("Json","expressName"),rttr::metadata("Sql","express_name"),rttr::metadata("Excel",R"(express_name)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_regex_response_info::express_name))).
-		property("regex",&web_regex_response_info::regex)(rttr::metadata("Json","regular"),rttr::metadata("Sql","regex"),rttr::metadata("Excel",R"(regex)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_regex_response_info::regex)));
-}
-static void func_e7a5aa7351358bc3ea214302bc129708() {
+static void func_8b6c840c4d2b8c9712c820ad6af7b43d() {
 	rttr::registration::class_<struct web_response_info<web_drop_config_info>>("web_response_info<web_drop_config_info>").constructor<>()(rttr::detail::as_object{}).
 		property("code",&web_response_info<web_drop_config_info>::code)(rttr::metadata("Json","code"),rttr::metadata("Sql","code"),rttr::metadata("Excel",R"(code)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_response_info<web_drop_config_info>::code))).
 		property("msg",&web_response_info<web_drop_config_info>::msg)(rttr::metadata("Json","msg"),rttr::metadata("Sql","msg"),rttr::metadata("Excel",R"(msg)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_response_info<web_drop_config_info>::msg))).
@@ -92,7 +79,7 @@ static void func_e7a5aa7351358bc3ea214302bc129708() {
 		property("count",&web_response_info<web_user_config_info>::count)(rttr::metadata("Json","count"),rttr::metadata("Sql","count"),rttr::metadata("Excel",R"(count)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_response_info<web_user_config_info>::count))).
 		property("data",&web_response_info<web_user_config_info>::data)(rttr::metadata("Json","data"),rttr::metadata("Sql","data"),rttr::metadata("Excel",R"(data)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_response_info<web_user_config_info>::data)));
 }
-static void func_4ced05c2018dbca79dc7c44748326025() {
+static void func_6ab45bf43a33b47de841d49550cfea18() {
 	rttr::registration::class_<struct web_sync_config_info>("web_sync_config_info").constructor<>()(rttr::detail::as_object{}).
 		property("id",&web_sync_config_info::id)(rttr::metadata("Json","id"),rttr::metadata("Sql","id"),rttr::metadata("Excel",R"(id)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_sync_config_info::id))).
 		property("create_time",&web_sync_config_info::create_time)(rttr::metadata("Json","create_time"),rttr::metadata("Sql","create_time"),rttr::metadata("Excel",R"(create_time)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_sync_config_info::create_time))).
@@ -110,7 +97,7 @@ static void func_4ced05c2018dbca79dc7c44748326025() {
 		property("enable",&web_sync_config_info::enable)(rttr::metadata("Json","enable"),rttr::metadata("Sql","enable"),rttr::metadata("Excel",R"(enable)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_sync_config_info::enable))).
 		property("remarks",&web_sync_config_info::remarks)(rttr::metadata("Json","remarks"),rttr::metadata("Sql","remarks"),rttr::metadata("Excel",R"(remarks)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_sync_config_info::remarks)));
 }
-static void func_3ad07da1e6cb9780f0b6701a346c6a62() {
+static void func_6539ece46bdddf5948752ffca059661e() {
 	rttr::registration::class_<struct web_sync_item_request_info>("web_sync_item_request_info").constructor<>()(rttr::detail::as_object{}).
 		property("express_type",&web_sync_item_request_info::express_type)(rttr::metadata("Json","expressType"),rttr::metadata("Sql","express_type"),rttr::metadata("Excel",R"(express_type)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_sync_item_request_info::express_type))).
 		property("lattice_count",&web_sync_item_request_info::lattice_count)(rttr::metadata("Json","latticeCount"),rttr::metadata("Sql","lattice_count"),rttr::metadata("Excel",R"(lattice_count)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_sync_item_request_info::lattice_count))).
@@ -120,7 +107,7 @@ static void func_3ad07da1e6cb9780f0b6701a346c6a62() {
 		property("lattice_summay",&web_sync_item_request_info::lattice_summay)(rttr::metadata("Json","latticeSummay"),rttr::metadata("Sql","lattice_summay"),rttr::metadata("Excel",R"(lattice_summay)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_sync_item_request_info::lattice_summay))).
 		property("reflux_summay",&web_sync_item_request_info::reflux_summay)(rttr::metadata("Json","refluxSummay"),rttr::metadata("Sql","reflux_summay"),rttr::metadata("Excel",R"(reflux_summay)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_sync_item_request_info::reflux_summay)));
 }
-static void func_bc7f0281d834c3f1c29d2e105deb5db8() {
+static void func_4beae5fdb4bc610f686a88fa9be6d05c() {
 	rttr::registration::class_<struct web_sync_request_info>("web_sync_request_info").constructor<>()(rttr::detail::as_object{}).
 		property("device_id",&web_sync_request_info::device_id)(rttr::metadata("Json","deviceId"),rttr::metadata("Sql","device_id"),rttr::metadata("Excel",R"(device_id)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_sync_request_info::device_id))).
 		property("summary_time",&web_sync_request_info::summary_time)(rttr::metadata("Json","deviceId"),rttr::metadata("Sql","summary_time"),rttr::metadata("Excel",R"(summary_time)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_sync_request_info::summary_time))).
@@ -128,7 +115,7 @@ static void func_bc7f0281d834c3f1c29d2e105deb5db8() {
 		property("speed",&web_sync_request_info::speed)(rttr::metadata("Json","speed"),rttr::metadata("Sql","speed"),rttr::metadata("Excel",R"(speed)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_sync_request_info::speed))).
 		property("data",&web_sync_request_info::data)(rttr::metadata("Json","data"),rttr::metadata("Sql","data"),rttr::metadata("Excel",R"(data)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_sync_request_info::data)));
 }
-static void func_321da4ca010b9720d132a80c8dcd9351() {
+static void func_70cbe6d1725f97bae81c06eedc534ee7() {
 	rttr::registration::class_<struct web_user_config_info>("web_user_config").constructor<>()(rttr::detail::as_object{}).
 		property("id",&web_user_config_info::id)(rttr::metadata("Json","id"),rttr::metadata("Sql","id"),rttr::metadata("Excel",R"(id)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_user_config_info::id))).
 		property("modify_time",&web_user_config_info::modify_time)(rttr::metadata("Json","modify_time"),rttr::metadata("Sql","modify_time"),rttr::metadata("Excel",R"(modify_time)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_user_config_info::modify_time))).
@@ -138,7 +125,7 @@ static void func_321da4ca010b9720d132a80c8dcd9351() {
 		property("enable",&web_user_config_info::enable)(rttr::metadata("Json","enable"),rttr::metadata("Sql","enable"),rttr::metadata("Excel",R"(enable)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_user_config_info::enable))).
 		property("remarks",&web_user_config_info::remarks)(rttr::metadata("Json","remarks"),rttr::metadata("Sql","remarks"),rttr::metadata("Excel",R"(remarks)"),rttr::metadata("NoJson",false),rttr::metadata("NoSql",false),rttr::metadata("NoExcel",false),rttr::metadata("SqlKey",false),rttr::metadata("NoArchive",false),rttr::metadata("Offset",robotics::v3::utils::pointer_cast<int>(&web_user_config_info::remarks)));
 }
-static void func_a8def24af9f55cdaabf536e2223179da() {
+static void func_cb5b33150fd33c3d5bed945528ac940f() {
 	rttr::registration::class_<class account>("account").constructor<>()().
 		method("index",&account::index).
 		method("captcha",&account::captcha)(rttr::default_arguments(std::string{}),rttr::parameter_names("v")).
@@ -224,7 +211,7 @@ static void func_a8def24af9f55cdaabf536e2223179da() {
 	controller->controller_name = "account";
 	robotics::v3::mvc::ico_controller::attach(controller);
 }
-static void func_f0a8dfbb4d386bfb0b926ab7718849f2() {
+static void func_142997f089503ddc36f7f8f56d0a571f() {
 	rttr::registration::class_<class drop>("drop").constructor<>()().
 		method("index",&drop::index).
 		method("load",&drop::load)(rttr::default_arguments(int{},int{},std::string{},std::string{},std::string{}),rttr::parameter_names("page","limit","type","name","enable")).
@@ -404,7 +391,7 @@ static void func_f0a8dfbb4d386bfb0b926ab7718849f2() {
 	controller->controller_name = "drop";
 	robotics::v3::mvc::ico_controller::attach(controller);
 }
-static void func_88a1615d7ee23f9b2905efb098dc4bf9() {
+static void func_aaf8928d27eeec749cf212959832172e() {
 	rttr::registration::class_<class general>("general").constructor<>()().
 		method("index",&general::index).
 		method("load",&general::load)(rttr::default_arguments(int{},int{},std::string{},std::string{},std::string{}),rttr::parameter_names("page","limit","key","value","enable")).
@@ -584,7 +571,7 @@ static void func_88a1615d7ee23f9b2905efb098dc4bf9() {
 	controller->controller_name = "general";
 	robotics::v3::mvc::ico_controller::attach(controller);
 }
-static void func_e1fc7087605737e250a9ea25479cc17a() {
+static void func_5450da3eab0983e05b93d9bca5a49283() {
 	rttr::registration::class_<class home>("home").constructor<>()().
 		method("index",&home::index).
 		method("init",&home::init)(rttr::default_arguments(std::string{}),rttr::parameter_names("v"));
@@ -623,7 +610,7 @@ static void func_e1fc7087605737e250a9ea25479cc17a() {
 	controller->controller_name = "home";
 	robotics::v3::mvc::ico_controller::attach(controller);
 }
-static void func_6b4ea6e561819a5771a807e31e419721() {
+static void func_280d081f11826840aba627daddc0dea5() {
 	rttr::registration::class_<class regex>("regex").constructor<>()().
 		method("index",&regex::index).
 		method("load",&regex::load)(rttr::default_arguments(int{},int{},std::string{},std::string{},std::string{}),rttr::parameter_names("page","limit","type","name","enable")).
@@ -803,7 +790,7 @@ static void func_6b4ea6e561819a5771a807e31e419721() {
 	controller->controller_name = "regex";
 	robotics::v3::mvc::ico_controller::attach(controller);
 }
-static void func_68490d2327dcdbcf701904e2e4991fdd() {
+static void func_99eefa68c7342510588178473577675b() {
 	rttr::registration::class_<class sync>("sync").constructor<>()().
 		method("index",&sync::index).
 		method("load",&sync::load)(rttr::default_arguments(int{},int{},std::string{},std::string{},std::string{},std::string{}),rttr::parameter_names("page","limit","type","enable","start_time","end_time"));
@@ -877,7 +864,7 @@ static void func_68490d2327dcdbcf701904e2e4991fdd() {
 	controller->controller_name = "sync";
 	robotics::v3::mvc::ico_controller::attach(controller);
 }
-static void func_490c5523beea1a7422b6b8dfbacc506b() {
+static void func_9c39bed9ba128b7c309c8207be259c0d() {
 	rttr::registration::class_<class user>("user").constructor<>()().
 		method("index",&user::index).
 		method("load",&user::load)(rttr::default_arguments(int{},int{},std::string{},std::string{},std::string{}),rttr::parameter_names("page","limit","name","code","enable")).
@@ -1038,22 +1025,20 @@ static void func_490c5523beea1a7422b6b8dfbacc506b() {
 	robotics::v3::mvc::ico_controller::attach(controller);
 }
 RTTR_REGISTRATION {
-	func_a6a008be1c6e8e1ae9bb00af88e10636();
-	func_2aec811580c272b1442f7c81afe182e1();
-	func_44a3179c5f1cbf888d4062e127d71e55();
-	func_0e35346b4e41349675e14067fbf9c054();
-	func_2f5f6c19755fe336f1fb5136efce37c4();
-	func_6e0098419dc641d41d5d0fa730e86cc2();
-	func_e7a5aa7351358bc3ea214302bc129708();
-	func_4ced05c2018dbca79dc7c44748326025();
-	func_3ad07da1e6cb9780f0b6701a346c6a62();
-	func_bc7f0281d834c3f1c29d2e105deb5db8();
-	func_321da4ca010b9720d132a80c8dcd9351();
-	func_a8def24af9f55cdaabf536e2223179da();
-	func_f0a8dfbb4d386bfb0b926ab7718849f2();
-	func_88a1615d7ee23f9b2905efb098dc4bf9();
-	func_e1fc7087605737e250a9ea25479cc17a();
-	func_6b4ea6e561819a5771a807e31e419721();
-	func_68490d2327dcdbcf701904e2e4991fdd();
-	func_490c5523beea1a7422b6b8dfbacc506b();
+	func_d570f491d35dc9cbebec1426298cd8bc();
+	func_b25b3ec2cb68a264fa80f208c4fc49aa();
+	func_93a139474e9ed908ef7ca61879e90f0d();
+	func_b7ff0396ed1c36af5786e42c15c8241d();
+	func_8b6c840c4d2b8c9712c820ad6af7b43d();
+	func_6ab45bf43a33b47de841d49550cfea18();
+	func_6539ece46bdddf5948752ffca059661e();
+	func_4beae5fdb4bc610f686a88fa9be6d05c();
+	func_70cbe6d1725f97bae81c06eedc534ee7();
+	func_cb5b33150fd33c3d5bed945528ac940f();
+	func_142997f089503ddc36f7f8f56d0a571f();
+	func_aaf8928d27eeec749cf212959832172e();
+	func_5450da3eab0983e05b93d9bca5a49283();
+	func_280d081f11826840aba627daddc0dea5();
+	func_99eefa68c7342510588178473577675b();
+	func_9c39bed9ba128b7c309c8207be259c0d();
 }

+ 1 - 1
src/xml/xml_config.hpp

@@ -47,7 +47,7 @@ struct _update_<web_drop_config_info> {
 					{
 						it->modify_time = v3::datetime::current_time_stamp();
 						it->type = value.type;
-						it->type = value.type;
+						it->name = value.name;
 						it->enable = value.enable;
 						it->remarks = value.remarks;
 						return true;