hikvision-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/commands/binding.d.ts +6 -0
  2. package/dist/commands/binding.d.ts.map +1 -0
  3. package/dist/commands/binding.js +274 -0
  4. package/dist/commands/binding.js.map +1 -0
  5. package/dist/commands/card.d.ts +6 -0
  6. package/dist/commands/card.d.ts.map +1 -0
  7. package/dist/commands/card.js +259 -0
  8. package/dist/commands/card.js.map +1 -0
  9. package/dist/commands/group.d.ts +6 -0
  10. package/dist/commands/group.d.ts.map +1 -0
  11. package/dist/commands/group.js +87 -0
  12. package/dist/commands/group.js.map +1 -0
  13. package/dist/commands/org.d.ts +6 -0
  14. package/dist/commands/org.d.ts.map +1 -0
  15. package/dist/commands/org.js +248 -0
  16. package/dist/commands/org.js.map +1 -0
  17. package/dist/commands/person.d.ts +6 -0
  18. package/dist/commands/person.d.ts.map +1 -0
  19. package/dist/commands/person.js +563 -0
  20. package/dist/commands/person.js.map +1 -0
  21. package/dist/commands/service.d.ts +6 -0
  22. package/dist/commands/service.d.ts.map +1 -0
  23. package/dist/commands/service.js +153 -0
  24. package/dist/commands/service.js.map +1 -0
  25. package/dist/commands/sync.d.ts +6 -0
  26. package/dist/commands/sync.d.ts.map +1 -0
  27. package/dist/commands/sync.js +138 -0
  28. package/dist/commands/sync.js.map +1 -0
  29. package/dist/commands/system.d.ts +6 -0
  30. package/dist/commands/system.d.ts.map +1 -0
  31. package/dist/commands/system.js +167 -0
  32. package/dist/commands/system.js.map +1 -0
  33. package/dist/commands/vehicle.d.ts +12 -0
  34. package/dist/commands/vehicle.d.ts.map +1 -0
  35. package/dist/commands/vehicle.js +550 -0
  36. package/dist/commands/vehicle.js.map +1 -0
  37. package/dist/index.d.ts +6 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +94 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/services/hikvisionClient.d.ts +25 -0
  42. package/dist/services/hikvisionClient.d.ts.map +1 -0
  43. package/dist/services/hikvisionClient.js +59 -0
  44. package/dist/services/hikvisionClient.js.map +1 -0
  45. package/dist/utils/config.d.ts +66 -0
  46. package/dist/utils/config.d.ts.map +1 -0
  47. package/dist/utils/config.js +213 -0
  48. package/dist/utils/config.js.map +1 -0
  49. package/dist/utils/output.d.ts +42 -0
  50. package/dist/utils/output.d.ts.map +1 -0
  51. package/dist/utils/output.js +157 -0
  52. package/dist/utils/output.js.map +1 -0
  53. package/dist/utils/validation.d.ts +52 -0
  54. package/dist/utils/validation.d.ts.map +1 -0
  55. package/dist/utils/validation.js +171 -0
  56. package/dist/utils/validation.js.map +1 -0
  57. package/package.json +29 -0
  58. package/src/commands/binding.ts +305 -0
  59. package/src/commands/card.ts +238 -0
  60. package/src/commands/group.ts +91 -0
  61. package/src/commands/org.ts +228 -0
  62. package/src/commands/person.ts +596 -0
  63. package/src/commands/service.ts +174 -0
  64. package/src/commands/sync.ts +156 -0
  65. package/src/commands/system.ts +137 -0
  66. package/src/commands/vehicle.ts +572 -0
  67. package/src/index.ts +111 -0
  68. package/src/services/hikvisionClient.ts +74 -0
  69. package/src/types/cli-table3.d.ts +20 -0
  70. package/src/utils/config.ts +199 -0
  71. package/src/utils/output.ts +181 -0
  72. package/src/utils/validation.ts +160 -0
  73. package/tsconfig.json +19 -0
@@ -0,0 +1,228 @@
1
+ /**
2
+ * 组织管理命令
3
+ */
4
+
5
+ import { Command } from 'commander';
6
+ import * as fs from 'fs';
7
+ import { config } from '../utils/config';
8
+ import { success, error, info, formatOutput } from '../utils/output';
9
+ import { createHikvisionClient } from '../services/hikvisionClient';
10
+ import { Organization } from 'hikvision-api-lib';
11
+
12
+ export const orgCommands = new Command()
13
+ .command('org')
14
+ .description('组织管理');
15
+
16
+ // 查询组织列表
17
+ orgCommands
18
+ .command('list')
19
+ .description('查询组织列表')
20
+ .action(async () => {
21
+ try {
22
+ const client = createHikvisionClient(config.get());
23
+
24
+ const result = await client.personService.getOrganizations();
25
+ console.log(formatOutput(result));
26
+ } catch (err: any) {
27
+ error(`查询组织失败: ${err.message || err}`);
28
+ }
29
+ });
30
+
31
+ // 查询组织详情
32
+ orgCommands
33
+ .command('get')
34
+ .description('查询组织详情')
35
+ .argument('<orgIndexCode>', '组织 ID')
36
+ .action(async (orgIndexCode) => {
37
+ try {
38
+ const client = createHikvisionClient(config.get());
39
+
40
+ const org = await client.personService.getOrganization(orgIndexCode);
41
+ if (org) {
42
+ console.log(formatOutput(org));
43
+ } else {
44
+ error(`组织 ${orgIndexCode} 不存在`);
45
+ }
46
+ } catch (err: any) {
47
+ error(`查询组织详情失败: ${err.message || err}`);
48
+ }
49
+ });
50
+
51
+ // 获取根组织
52
+ orgCommands
53
+ .command('root')
54
+ .description('获取根组织')
55
+ .action(async () => {
56
+ try {
57
+ const client = createHikvisionClient(config.get());
58
+ const root = await client.personService.getRootOrg();
59
+ console.log(formatOutput(root));
60
+ } catch (err: any) {
61
+ error(`获取根组织失败: ${err.message || err}`);
62
+ }
63
+ });
64
+
65
+ // 搜索组织
66
+ orgCommands
67
+ .command('search')
68
+ .description('搜索组织')
69
+ .option('-n, --name <name>', '组织名称')
70
+ .option('-l, --level <level>', '层级')
71
+ .action(async (options) => {
72
+ try {
73
+ const client = createHikvisionClient(config.get());
74
+
75
+ const result = await client.personService.getOrganizations();
76
+
77
+ let filtered: Organization[] = result;
78
+ if (options.name) {
79
+ filtered = filtered.filter((org: Organization) => org.orgName.includes(options.name));
80
+ }
81
+ if (options.level) {
82
+ filtered = filtered.filter((org: Organization) => org.level === parseInt(options.level));
83
+ }
84
+
85
+ console.log(formatOutput(filtered));
86
+ } catch (err: any) {
87
+ error(`搜索组织失败: ${err.message || err}`);
88
+ }
89
+ });
90
+
91
+ // 获取下级组织
92
+ orgCommands
93
+ .command('children')
94
+ .description('获取下级组织')
95
+ .argument('<orgIndexCode>', '父组织 ID')
96
+ .action(async (orgIndexCode) => {
97
+ try {
98
+ const client = createHikvisionClient(config.get());
99
+ const children = await client.personService.getChildOrgs(orgIndexCode);
100
+ console.log(formatOutput(children));
101
+ } catch (err: any) {
102
+ error(`获取下级组织失败: ${err.message || err}`);
103
+ }
104
+ });
105
+
106
+ // 添加组织
107
+ orgCommands
108
+ .command('add')
109
+ .description('添加组织')
110
+ .option('-n, --name <name>', '组织名称', '')
111
+ .option('-p, --parent <parentIndexCode>', '父组织 ID', 'root000000')
112
+ .option('-f, --file <file>', '从 JSON 文件读取组织信息')
113
+ .action(async (options) => {
114
+ try {
115
+ const client = createHikvisionClient(config.get());
116
+
117
+ let orgs: { orgName: string; parentIndexCode: string }[] = [];
118
+
119
+ if (options.file) {
120
+ const content = fs.readFileSync(options.file, 'utf-8');
121
+ const data = JSON.parse(content);
122
+ orgs = Array.isArray(data) ? data : [data];
123
+ } else if (options.name) {
124
+ orgs = [{ orgName: options.name, parentIndexCode: options.parent }];
125
+ } else {
126
+ error('请指定组织名称 (-n) 或文件 (-f)');
127
+ return;
128
+ }
129
+
130
+ const result = await client.personService.batchAddOrgs(orgs as any);
131
+ success(`组织添加完成: 成功 ${result.success}, 失败 ${result.failed}`);
132
+ console.log(formatOutput(result.details));
133
+ } catch (err: any) {
134
+ error(`添加组织失败: ${err.message || err}`);
135
+ }
136
+ });
137
+
138
+ // 修改组织
139
+ orgCommands
140
+ .command('update')
141
+ .description('修改组织')
142
+ .argument('<orgIndexCode>', '组织 ID')
143
+ .option('-n, --name <name>', '新组织名称')
144
+ .option('-p, --parent <parentIndexCode>', '新父组织 ID')
145
+ .action(async (orgIndexCode, options) => {
146
+ try {
147
+ const client = createHikvisionClient(config.get());
148
+
149
+ const updateData: any = {};
150
+ if (options.name) updateData.orgName = options.name;
151
+ if (options.parent) updateData.parentIndexCode = options.parent;
152
+
153
+ if (Object.keys(updateData).length === 0) {
154
+ error('请指定要修改的内容 (-n 或 -p)');
155
+ return;
156
+ }
157
+
158
+ await client.personService.updateOrg(orgIndexCode, updateData);
159
+ success(`组织 ${orgIndexCode} 已更新`);
160
+ } catch (err: any) {
161
+ error(`修改组织失败: ${err.message || err}`);
162
+ }
163
+ });
164
+
165
+ // 删除组织
166
+ orgCommands
167
+ .command('delete')
168
+ .description('删除组织(批量)')
169
+ .argument('<orgIndexCodes...>', '组织 ID(可多个,用空格分隔)')
170
+ .action(async (orgIndexCodes) => {
171
+ try {
172
+ const client = createHikvisionClient(config.get());
173
+
174
+ if (orgIndexCodes.length === 0) {
175
+ error('请指定要删除的组织 ID');
176
+ return;
177
+ }
178
+
179
+ const result = await client.personService.batchDeleteOrgs(orgIndexCodes);
180
+ success(`组织删除完成: 成功 ${result.success}, 失败 ${result.failed}`);
181
+ console.log(formatOutput(result.details));
182
+ } catch (err: any) {
183
+ error(`删除组织失败: ${err.message || err}`);
184
+ }
185
+ });
186
+
187
+ // 增量同步组织
188
+ orgCommands
189
+ .command('sync')
190
+ .description('增量同步组织数据')
191
+ .option('-s, --start <startTime>', '开始时间 (ISO8601格式)')
192
+ .option('-e, --end <endTime>', '结束时间 (ISO8601格式)')
193
+ .action(async (options) => {
194
+ try {
195
+ const client = createHikvisionClient(config.get());
196
+
197
+ const now = new Date();
198
+ const oneHourAgo = new Date(now.getTime() - 60 * 60 * 1000);
199
+
200
+ const startTime = options.start || oneHourAgo.toISOString();
201
+ const endTime = options.end || now.toISOString();
202
+
203
+ info(`同步时间范围: ${startTime} ~ ${endTime}`);
204
+
205
+ const result = await client.personService.syncOrgsIncrement(startTime, endTime);
206
+
207
+ console.log(formatOutput({
208
+ added: result.added.length,
209
+ modified: result.modified.length,
210
+ deleted: result.deleted.length,
211
+ total: result.added.length + result.modified.length + result.deleted.length,
212
+ }));
213
+
214
+ if (result.added.length > 0) {
215
+ success(`\n新增组织 (${result.added.length}):`);
216
+ console.log(formatOutput(result.added));
217
+ }
218
+ if (result.modified.length > 0) {
219
+ info(`\n修改组织 (${result.modified.length}):`);
220
+ console.log(formatOutput(result.modified));
221
+ }
222
+ if (result.deleted.length > 0) {
223
+ error(`\n删除组织 ID (${result.deleted.length}): ${result.deleted.join(', ')}`);
224
+ }
225
+ } catch (err: any) {
226
+ error(`同步组织失败: ${err.message || err}`);
227
+ }
228
+ });