diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinHarewareExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinHarewareExtensions.cs
new file mode 100644
index 00000000..f3593259
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinHarewareExtensions.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Net.Http;
+using System.Threading;
+using System.Threading.Tasks;
+using Flurl;
+using Flurl.Http;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work
+{
+ public static class WechatWorkClientExecuteCgibinHarewareExtensions
+ {
+ ///
+ /// 异步调用 [POST] /cgi-bin/hardware/get_device_feature 接口。
+ /// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/92739
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCgibinHardwareGetDeviceFeatureAsync(this WechatWorkClient client, Models.CgibinHardwareGetDeviceFeatureRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ IFlurlRequest flurlReq = client
+ .CreateRequest(request, HttpMethod.Post, "cgi-bin", "hardware", "get_device_feature")
+ .SetQueryParam("provider_access_token", request.ProviderAccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+
+ ///
+ /// 异步调用 [POST] /cgi-bin/hardware/get_hardware_checkin_data 接口。
+ /// REF: https://open.work.weixin.qq.com/api/doc/90000/90135/94126
+ /// REF: https://open.work.weixin.qq.com/api/doc/90001/90143/95176
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static async Task ExecuteCgibinHardwareGetHardwareCheckinDataAsync(this WechatWorkClient client, Models.CgibinHardwareGetHardwareCheckinDataRequest request, CancellationToken cancellationToken = default)
+ {
+ if (client is null) throw new ArgumentNullException(nameof(client));
+ if (request is null) throw new ArgumentNullException(nameof(request));
+
+ IFlurlRequest flurlReq = client
+ .CreateRequest(request, HttpMethod.Post, "cgi-bin", "hardware", "get_hardware_checkin_data")
+ .SetQueryParam("access_token", request.AccessToken);
+
+ return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
+ }
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinServiceExtensions.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinServiceExtensions.cs
index da47a48d..6011ff03 100644
--- a/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinServiceExtensions.cs
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Extensions/WechatWorkClientExecuteCgibinServiceExtensions.cs
@@ -1,8 +1,6 @@
using System;
-using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
-using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
@@ -522,26 +520,6 @@ namespace SKIT.FlurlHttpClient.Wechat.Work
return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
}
- ///
- /// 异步调用 [POST] /cgi-bin/hardware/get_device_feature 接口。
- /// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/92739
- ///
- ///
- ///
- ///
- ///
- public static async Task ExecuteCgibinHardwareGetDeviceFeatureAsync(this WechatWorkClient client, Models.CgibinHardwareGetDeviceFeatureRequest request, CancellationToken cancellationToken = default)
- {
- if (client is null) throw new ArgumentNullException(nameof(client));
- if (request is null) throw new ArgumentNullException(nameof(request));
-
- IFlurlRequest flurlReq = client
- .CreateRequest(request, HttpMethod.Post, "cgi-bin", "hardware", "get_device_feature")
- .SetQueryParam("provider_access_token", request.ProviderAccessToken);
-
- return await client.SendRequestWithJsonAsync(flurlReq, data: request, cancellationToken: cancellationToken);
- }
-
///
/// 异步调用 [POST] /cgi-bin/service/del_device 接口。
/// REF: https://open.work.weixin.qq.com/api/doc/90002/90151/92770
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinHardwareGetDeviceFeatureRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinHardware/CgibinHardwareGetDeviceFeatureRequest.cs
similarity index 100%
rename from src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinHardwareGetDeviceFeatureRequest.cs
rename to src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinHardware/CgibinHardwareGetDeviceFeatureRequest.cs
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinHardwareGetDeviceFeatureResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinHardware/CgibinHardwareGetDeviceFeatureResponse.cs
similarity index 100%
rename from src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinService/Device/CgibinHardwareGetDeviceFeatureResponse.cs
rename to src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinHardware/CgibinHardwareGetDeviceFeatureResponse.cs
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinHardware/CgibinHardwareGetHardwareCheckinDataRequest.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinHardware/CgibinHardwareGetHardwareCheckinDataRequest.cs
new file mode 100644
index 00000000..4da76228
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinHardware/CgibinHardwareGetHardwareCheckinDataRequest.cs
@@ -0,0 +1,38 @@
+using System.Collections.Generic;
+
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/hardware/get_hardware_checkin_data 接口的请求。
+ ///
+ public class CgibinHardwareGetHardwareCheckinDataRequest : WechatWorkRequest
+ {
+ ///
+ /// 获取或设置过滤类型。
+ ///
+ [Newtonsoft.Json.JsonProperty("filter_type")]
+ [System.Text.Json.Serialization.JsonPropertyName("filter_type")]
+ public int? FilterType { get; set; }
+
+ ///
+ /// 获取或设置开始时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("starttime")]
+ [System.Text.Json.Serialization.JsonPropertyName("starttime")]
+ public long StartTimestamp { get; set; }
+
+ ///
+ /// 获取或设置结束时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("endtime")]
+ [System.Text.Json.Serialization.JsonPropertyName("endtime")]
+ public long EndTimestamp { get; set; }
+
+ ///
+ /// 获取或设置成员账号列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("useridlist")]
+ [System.Text.Json.Serialization.JsonPropertyName("useridlist")]
+ public IList UserIdList { get; set; } = new List();
+ }
+}
diff --git a/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinHardware/CgibinHardwareGetHardwareCheckinDataResponse.cs b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinHardware/CgibinHardwareGetHardwareCheckinDataResponse.cs
new file mode 100644
index 00000000..682c127e
--- /dev/null
+++ b/src/SKIT.FlurlHttpClient.Wechat.Work/Models/CgibinHardware/CgibinHardwareGetHardwareCheckinDataResponse.cs
@@ -0,0 +1,49 @@
+namespace SKIT.FlurlHttpClient.Wechat.Work.Models
+{
+ ///
+ /// 表示 [POST] /cgi-bin/hardware/get_hardware_checkin_data 接口的响应。
+ ///
+ public class CgibinHardwareGetHardwareCheckinDataResponse : WechatWorkResponse
+ {
+ public static class Types
+ {
+ public class CheckinData
+ {
+ ///
+ /// 获取或设置成员账号。
+ ///
+ [Newtonsoft.Json.JsonProperty("userid")]
+ [System.Text.Json.Serialization.JsonPropertyName("userid")]
+ public string UserId { get; set; } = default!;
+
+ ///
+ /// 获取或设置打卡时间戳。
+ ///
+ [Newtonsoft.Json.JsonProperty("checkin_time")]
+ [System.Text.Json.Serialization.JsonPropertyName("checkin_time")]
+ public long CheckinTimestamp { get; set; }
+
+ ///
+ /// 获取或设置打卡设备的序列号。
+ ///
+ [Newtonsoft.Json.JsonProperty("device_sn")]
+ [System.Text.Json.Serialization.JsonPropertyName("device_sn")]
+ public string DeviceSerialNumber { get; set; } = default!;
+
+ ///
+ /// 获取或设置打卡设备的名称。
+ ///
+ [Newtonsoft.Json.JsonProperty("device_name")]
+ [System.Text.Json.Serialization.JsonPropertyName("device_name")]
+ public string DeviceName { get; set; } = default!;
+ }
+ }
+
+ ///
+ /// 获取或设置打卡数据列表。
+ ///
+ [Newtonsoft.Json.JsonProperty("checkindata")]
+ [System.Text.Json.Serialization.JsonPropertyName("checkindata")]
+ public Types.CheckinData[] CheckinDataList { get; set; } = default!;
+ }
+}
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinService/Device/CgibinHardwareGetDeviceFeatureRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinHardware/CgibinHardwareGetDeviceFeatureRequest.json
similarity index 100%
rename from test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinService/Device/CgibinHardwareGetDeviceFeatureRequest.json
rename to test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinHardware/CgibinHardwareGetDeviceFeatureRequest.json
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinService/Device/CgibinHardwareGetDeviceFeatureResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinHardware/CgibinHardwareGetDeviceFeatureResponse.json
similarity index 100%
rename from test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinService/Device/CgibinHardwareGetDeviceFeatureResponse.json
rename to test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinHardware/CgibinHardwareGetDeviceFeatureResponse.json
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinHardware/CgibinHardwareGetHardwareCheckinDataRequest.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinHardware/CgibinHardwareGetHardwareCheckinDataRequest.json
new file mode 100644
index 00000000..87187eb3
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinHardware/CgibinHardwareGetHardwareCheckinDataRequest.json
@@ -0,0 +1,9 @@
+{
+ "filter_type": 1,
+ "starttime": 1492617600,
+ "endtime": 1492790400,
+ "useridlist": [
+ "james",
+ "paul"
+ ]
+}
\ No newline at end of file
diff --git a/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinHardware/CgibinHardwareGetHardwareCheckinDataResponse.json b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinHardware/CgibinHardwareGetHardwareCheckinDataResponse.json
new file mode 100644
index 00000000..4ce54b93
--- /dev/null
+++ b/test/SKIT.FlurlHttpClient.Wechat.Work.UnitTests/ModelSamples/CgibinHardware/CgibinHardwareGetHardwareCheckinDataResponse.json
@@ -0,0 +1,18 @@
+{
+ "errcode": 0,
+ "errmsg": "ok",
+ "checkindata": [
+ {
+ "userid": "james",
+ "checkin_time": 1492617610,
+ "device_sn": "xxxxx",
+ "device_name": "xxxx门店"
+ },
+ {
+ "userid": "paul",
+ "checkin_time": 1492617620,
+ "device_sn": "yyyy",
+ "device_name": "yyyy门店"
+ }
+ ]
+}
\ No newline at end of file