sctj-components 1.0.9 → 1.0.11

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 (110) hide show
  1. package/README.md +317 -325
  2. package/lib/sctj-components.es.js +2367 -3894
  3. package/lib/sctj-components.umd.js +1 -1
  4. package/lib/style.css +1 -1
  5. package/package.json +2 -1
  6. package/lib/chunks/404-8b5347fb.js +0 -4
  7. package/lib/chunks/bug-29d5a8c8.js +0 -4
  8. package/lib/chunks/build-0e8711f7.js +0 -4
  9. package/lib/chunks/button-abec46ef.js +0 -4
  10. package/lib/chunks/cascader-328523ba.js +0 -4
  11. package/lib/chunks/chart-04ef8147.js +0 -4
  12. package/lib/chunks/checkbox-1238324c.js +0 -4
  13. package/lib/chunks/clipboard-625a991f.js +0 -4
  14. package/lib/chunks/code-2f6398b5.js +0 -4
  15. package/lib/chunks/color-13488c06.js +0 -4
  16. package/lib/chunks/component-495e49d4.js +0 -4
  17. package/lib/chunks/dashboard-3a81480c.js +0 -4
  18. package/lib/chunks/date-c2ef6759.js +0 -4
  19. package/lib/chunks/date-range-551e4fd6.js +0 -4
  20. package/lib/chunks/dict-5539087c.js +0 -4
  21. package/lib/chunks/documentation-8d81c185.js +0 -4
  22. package/lib/chunks/download-11fa6102.js +0 -4
  23. package/lib/chunks/drag-2fbf0e89.js +0 -4
  24. package/lib/chunks/druid-57209587.js +0 -4
  25. package/lib/chunks/edit-9e3738f0.js +0 -4
  26. package/lib/chunks/education-7fb0e453.js +0 -4
  27. package/lib/chunks/email-7477951a.js +0 -4
  28. package/lib/chunks/example-b8091a8b.js +0 -4
  29. package/lib/chunks/excel-9e8720a6.js +0 -4
  30. package/lib/chunks/exit-fullscreen-fe7ec08b.js +0 -4
  31. package/lib/chunks/eye-1a093b92.js +0 -4
  32. package/lib/chunks/eye-open-312c146f.js +0 -4
  33. package/lib/chunks/form-54837ed4.js +0 -4
  34. package/lib/chunks/fullscreen-552cc3b4.js +0 -4
  35. package/lib/chunks/github-0539cc3d.js +0 -4
  36. package/lib/chunks/guide-407e9748.js +0 -4
  37. package/lib/chunks/icon-83dfff61.js +0 -4
  38. package/lib/chunks/input-de62ab83.js +0 -4
  39. package/lib/chunks/international-7bb87f29.js +0 -4
  40. package/lib/chunks/job-e78e9a3d.js +0 -4
  41. package/lib/chunks/language-8b7629d9.js +0 -4
  42. package/lib/chunks/link-f264a825.js +0 -4
  43. package/lib/chunks/list-2e431778.js +0 -4
  44. package/lib/chunks/lock-5e8f10d7.js +0 -4
  45. package/lib/chunks/log-80bfb029.js +0 -4
  46. package/lib/chunks/logininfor-47a5f04e.js +0 -4
  47. package/lib/chunks/message-06f1d593.js +0 -4
  48. package/lib/chunks/money-14039a58.js +0 -4
  49. package/lib/chunks/monitor-b020306f.js +0 -4
  50. package/lib/chunks/nested-13647a6a.js +0 -4
  51. package/lib/chunks/number-290265fd.js +0 -4
  52. package/lib/chunks/online-64589b70.js +0 -4
  53. package/lib/chunks/password-1192ad67.js +0 -4
  54. package/lib/chunks/pdf-8176f032.js +0 -4
  55. package/lib/chunks/people-6e6b61b6.js +0 -4
  56. package/lib/chunks/peoples-35c96c5c.js +0 -4
  57. package/lib/chunks/phone-6bc01ca6.js +0 -4
  58. package/lib/chunks/post-0d01cf1a.js +0 -4
  59. package/lib/chunks/qq-df2843d2.js +0 -4
  60. package/lib/chunks/question-c1e9a4e7.js +0 -4
  61. package/lib/chunks/radio-5c66d676.js +0 -4
  62. package/lib/chunks/rate-eb858d5b.js +0 -4
  63. package/lib/chunks/redis-788c8d4f.js +0 -4
  64. package/lib/chunks/redis-list-6792700e.js +0 -4
  65. package/lib/chunks/row-d431ba9c.js +0 -4
  66. package/lib/chunks/search-990fe622.js +0 -4
  67. package/lib/chunks/select-1d794732.js +0 -4
  68. package/lib/chunks/server-b0c98c01.js +0 -4
  69. package/lib/chunks/shopping-2a187e37.js +0 -4
  70. package/lib/chunks/sip-0.13.6.min-53cd1379.js +0 -5546
  71. package/lib/chunks/size-e3f93f23.js +0 -4
  72. package/lib/chunks/skill-abe26c0c.js +0 -4
  73. package/lib/chunks/slider-cb3330ba.js +0 -4
  74. package/lib/chunks/star-5182766b.js +0 -4
  75. package/lib/chunks/swagger-266c9f25.js +0 -4
  76. package/lib/chunks/switch-74aa5d5b.js +0 -4
  77. package/lib/chunks/system-943da249.js +0 -4
  78. package/lib/chunks/tab-9202c247.js +0 -4
  79. package/lib/chunks/table-2d14e126.js +0 -4
  80. package/lib/chunks/textarea-4d9d0b2c.js +0 -4
  81. package/lib/chunks/theme-7bbe2d45.js +0 -4
  82. package/lib/chunks/time-f08907ac.js +0 -4
  83. package/lib/chunks/time-range-e7b40483.js +0 -4
  84. package/lib/chunks/tool-6f22c373.js +0 -4
  85. package/lib/chunks/tree-0118a113.js +0 -4
  86. package/lib/chunks/tree-table-54984188.js +0 -4
  87. package/lib/chunks/upload-e852b478.js +0 -4
  88. package/lib/chunks/user-82704b02.js +0 -4
  89. package/lib/chunks/validCode-ba29b5b3.js +0 -4
  90. package/lib/chunks/wechat-22f119d5.js +0 -4
  91. package/lib/chunks/zip-c3a63b61.js +0 -4
  92. package/public/hkPlayerPlugin/h5player.min.js +0 -1
  93. package/public/hkPlayerPlugin/playctrl1/DecodeWorker.js +0 -705
  94. package/public/hkPlayerPlugin/playctrl1/Decoder.js +0 -171
  95. package/public/hkPlayerPlugin/playctrl1simd/DecodeWorker.js +0 -705
  96. package/public/hkPlayerPlugin/playctrl1simd/Decoder.js +0 -171
  97. package/public/hkPlayerPlugin/playctrl2/Decoder.js +0 -21
  98. package/public/hkPlayerPlugin/playctrl2/Decoder.wasm +0 -0
  99. package/public/hkPlayerPlugin/playctrl2/Decoder.worker.js +0 -1
  100. package/public/hkPlayerPlugin/playctrl3/Decoder.js +0 -21
  101. package/public/hkPlayerPlugin/playctrl3/Decoder.wasm +0 -0
  102. package/public/hkPlayerPlugin/playctrl3/Decoder.worker.js +0 -1
  103. package/public/hkPlayerPlugin/talk/AudioInterCom.js +0 -21
  104. package/public/hkPlayerPlugin/talk/AudioInterCom.wasm +0 -0
  105. package/public/hkPlayerPlugin/talkW/AudioInterCom.js +0 -21
  106. package/public/hkPlayerPlugin/talkW/AudioInterCom.wasm +0 -0
  107. package/public/hkPlayerPlugin/talkW/AudioInterCom.worker.js +0 -1
  108. package/public/hkPlayerPlugin/transform/libSystemTransform.js +0 -6589
  109. package/public/hkPlayerPlugin/transform/libSystemTransform.wasm +0 -0
  110. package/public/hkPlayerPlugin/transform/systemTransform-worker.js +0 -126
package/README.md CHANGED
@@ -26,14 +26,8 @@ npm install vue@^3.2.0 element-plus@^2.2.0 @element-plus/icons-vue@^2.0.0
26
26
  # 使用图表组件时
27
27
  npm install echarts@^5.0.0
28
28
 
29
- # 使用 3D/BIM 组件时
30
- npm install three@^0.150.0
31
-
32
29
  # 使用地图组件时
33
30
  npm install @amap/amap-jsapi-loader@^1.0.0
34
-
35
- # 使用 SCTJYsyPlayer 萤石云播放器组件时
36
- npm install ezuikit-js@^8.1.0
37
31
  ```
38
32
 
39
33
  ### 第二步:引入组件库
@@ -74,8 +68,7 @@ import { SCTJDictTag, SCTJTable, SCTJSearch } from 'sctj-components'
74
68
  ```vue
75
69
  <template>
76
70
  <SCTJDictTag :options="dictOptions" :value="status" />
77
- <sctj-table :data="tableData" />
78
- <sctj-search :visible="visible" />
71
+ <sctj-search v-model:visible="showSearch" />
79
72
  </template>
80
73
  ```
81
74
 
@@ -83,47 +76,43 @@ import { SCTJDictTag, SCTJTable, SCTJSearch } from 'sctj-components'
83
76
 
84
77
  ### 基础组件
85
78
  - `SCTJDictTag` - 字典标签
86
- - `SCTJTreeSelect` - 树形选择器
87
- - `SCTJSvgIcon` - SVG 图标组件
79
+ - `SCTJIcon` - SVG 图标组件
88
80
 
89
81
  ### 表单组件
90
82
  - `SCTJFileUpload` - 文件上传
91
83
  - `SCTJImageUpload` - 图片上传
92
84
  - `SCTJImagePreview` - 图片预览
93
85
  - `SCTJIconSelect` - 图标选择器
94
- - `SCTJSearch` - 搜索组件
95
86
  - `SCTJDateRangePicker` - 日期范围选择器
87
+ - `SCTJTreeSelect` - 树形选择器
96
88
 
97
89
  ### 表格组件
98
90
  - `SCTJTable` - 表格组件
99
- - `SCTJTableContainer` - 表格容器(布局组件)
100
- - `SCTJTablePageContainer` - 表格页面容器
101
- - `SCTJTableTopActionContainer` - 表格顶部操作容器
102
91
  - `SCTJRightToolbar` - 右侧工具栏
103
92
 
104
93
  ### 布局组件
105
94
  - `SCTJBtnContainer` - 按钮容器
95
+ - `SCTJSearch` - 搜索容器
96
+ - `SCTJTablePageContainer` - 表格页面容器
106
97
 
107
98
  ### 图表组件
108
99
  - `SCTJBaseChart` - 基础图表
109
- - `SCTJCommonChart` - 通用图表
110
- - `SCTJPieChart` - 饼图
100
+ - `SCTJCommonChart` - 通用图表(支持柱图、折线图)
101
+ - `SCTJPieChart` - 饼图(支持饼图、环形图、玫瑰图)
111
102
 
112
103
  ### 播放器组件
113
104
  - `SCTJFlvPlayer` - FLV 播放器
114
- - `SCTJH5hkPlayer` - H5 海康播放器
115
- - `SCTJHelmetPlayer` - 头盔播放器
116
- - `SCTJYsyPlayer` - 萤石云播放器
105
+
117
106
 
118
107
  ### 其他组件
119
108
  - `SCTJIframe` - iframe 组件
120
109
  - `SCTJImportDialog` - 导入对话框
121
- - `SCTJDialogTable` - 对话框表格
110
+ - `SCTJDialogTable` - 弹窗表格(支持弹窗选择)
122
111
 
123
112
  ### 地图组件
124
- - `SCTJMapViewer` - 地图查看器
125
- - `SCTJMapDrawingDialog` - 地图绘制对话框
126
- - `SCTJBusinessMapDrawingDialog` - 业务地图绘制对话框
113
+ - `SCTJMapViewer` - 地图查看器(基于高德地图)
114
+ - `SCTJMapDrawingDialog` - 地图绘制对话框(基于高德地图)
115
+ - `SCTJBusinessMapDrawingDialog` - 业务地图绘制对话框(基于高德地图)
127
116
 
128
117
  ### Bim组件
129
118
  - `SCTJBimViewer` - Bim 查看器
@@ -186,6 +175,7 @@ const treeData = [
186
175
  :request="fetchTableData"
187
176
  :request-params="queryParams"
188
177
  row-key="id"
178
+ height='100%'
189
179
  :show-select="true"
190
180
  :show-index="true"
191
181
  @selection-change="handleSelectionChange"
@@ -221,7 +211,7 @@ const handleSelectionChange = (selection) => {
221
211
  </script>
222
212
  ```
223
213
 
224
- ### SCTJSearch 搜索组件
214
+ ### SCTJSearch 搜索容器
225
215
 
226
216
  ```vue
227
217
  <template>
@@ -275,146 +265,6 @@ const handleDateChange = (val) => {
275
265
  </script>
276
266
  ```
277
267
 
278
- ### SCTJH5hkPlayer 海康播放器
279
-
280
- > ⚠️ **前置准备**:使用此组件前,需要拷贝静态资源:
281
- > 1. 从 `node_modules/sctj-components/public/hkPlayerPlugin/` 目录(及其所有文件)拷贝到宿主项目的 `public/` 根目录
282
- > 2. 在宿主 `index.html` 中添加:`<script src="/hkPlayerPlugin/h5player.min.js" type="application/javascript"></script>`
283
-
284
- ```vue
285
- <template>
286
- <SCTJH5hkPlayer
287
- :device-serial="deviceSerial"
288
- :channel-no="channelNo"
289
- :device-name="deviceName"
290
- :channel-name="channelName"
291
- :get-live-address="getLiveAddress"
292
- :get-replay-address="getReplayAddress"
293
- :download-certificate="downloadCertificate"
294
- />
295
- </template>
296
-
297
- <script setup>
298
- import { ref } from 'vue'
299
- import { SCTJH5hkPlayer } from 'sctj-components'
300
-
301
- const deviceSerial = ref('your-device-serial')
302
- const channelNo = ref('1')
303
- const deviceName = ref('摄像头名称')
304
- const channelName = ref('通道名称')
305
-
306
- // 获取实时播放地址的函数,需要返回 Promise<{ code: number, data: { url: string }, msg?: string }>
307
- const getLiveAddress = async (params) => {
308
- const response = await fetch('/api/camera/live', {
309
- method: 'POST',
310
- body: JSON.stringify(params)
311
- })
312
- return await response.json()
313
- }
314
-
315
- // 获取回放地址的函数,需要返回 Promise<{ code: number, data: { url: string }, msg?: string }>
316
- const getReplayAddress = async (params) => {
317
- const response = await fetch('/api/camera/replay', {
318
- method: 'POST',
319
- body: JSON.stringify(params)
320
- })
321
- return await response.json()
322
- }
323
-
324
- // 下载证书的函数,需要返回 Promise
325
- const downloadCertificate = async (deviceSerial) => {
326
- const response = await fetch(`/api/camera/certificate/${deviceSerial}`, {
327
- method: 'GET'
328
- })
329
- return await response.blob()
330
- }
331
- </script>
332
- ```
333
-
334
- ### SCTJHelmetPlayer 头盔播放器
335
-
336
- ```vue
337
- <template>
338
- <SCTJHelmetPlayer
339
- :device-id="deviceId"
340
- :call-api="callApi"
341
- :handle-streaming-api="handleStreamingApi"
342
- :query-admin-sip-info-api="queryAdminSipInfoApi"
343
- />
344
- </template>
345
-
346
- <script setup>
347
- import { ref } from 'vue'
348
- import { SCTJHelmetPlayer } from 'sctj-components'
349
-
350
- const deviceId = ref('your-device-id')
351
-
352
- // 发起通话的 API 函数,需要返回 Promise<{ status: boolean, sip_id?: string, msg?: string }>
353
- // 参数: { deviceId: string, v_type: number }
354
- const callApi = async (params) => {
355
- const response = await fetch('/api/helmet/call', {
356
- method: 'POST',
357
- body: JSON.stringify(params)
358
- })
359
- return await response.json()
360
- }
361
-
362
- // 处理流媒体的 API 函数,需要返回 Promise<any>
363
- // 参数: { deviceId: string, isPush: number } (isPush: 1-开启, 0-停止)
364
- const handleStreamingApi = async (params) => {
365
- const response = await fetch('/api/helmet/streaming', {
366
- method: 'POST',
367
- body: JSON.stringify(params)
368
- })
369
- return await response.json()
370
- }
371
-
372
- // 获取管理员 SIP 信息的 API 函数,需要返回 Promise<{ status: boolean, admin_info: { sip_info: any }, msg?: string }>
373
- const queryAdminSipInfoApi = async () => {
374
- const response = await fetch('/api/helmet/sip-info')
375
- return await response.json()
376
- }
377
- </script>
378
- ```
379
-
380
- ### SCTJYsyPlayer 萤石云播放器
381
-
382
- > ⚠️ **前置准备**:使用此组件前,需要安装依赖:
383
- > ```bash
384
- > npm install ezuikit-js@^8.1.0
385
- > ```
386
-
387
- ```vue
388
- <template>
389
- <SCTJYsyPlayer
390
- :device-serial="deviceSerial"
391
- :channel-no="channelNo"
392
- :play-type="playType"
393
- :start-time="startTime"
394
- :end-time="endTime"
395
- :get-ys-token="getYsToken"
396
- />
397
- </template>
398
-
399
- <script setup>
400
- import { ref } from 'vue'
401
- import { SCTJYsyPlayer } from 'sctj-components'
402
-
403
- const deviceSerial = ref('your-device-serial')
404
- const channelNo = ref(1)
405
- const playType = ref(0) // 0-直播, 1-回放
406
- const startTime = ref('2023-01-01 12:00:00')
407
- const endTime = ref('2023-01-01 13:00:00')
408
-
409
- // 获取 Token 的函数,需要返回 Promise<{ code: number, data: { accessToken: string, expireTime: number }, msg?: string }>
410
- const getYsToken = async () => {
411
- const response = await fetch('/api/threeController/getYsToken', {
412
- method: 'GET'
413
- })
414
- return await response.json()
415
- }
416
- </script>
417
- ```
418
268
 
419
269
  ### SCTJFileUpload 文件上传
420
270
 
@@ -453,7 +303,12 @@ const customUpload = async (options) => {
453
303
  method: 'POST',
454
304
  body: formData
455
305
  })
456
- return await response.json()
306
+ options.onSuccess({
307
+ code:response.code,
308
+ fileName:response.name,
309
+ url:response.url,
310
+ msg:response.msg
311
+ });
457
312
  }
458
313
 
459
314
  const handleUploadSuccess = (response) => {
@@ -536,65 +391,19 @@ const handleIconSelected = (iconName) => {
536
391
  </script>
537
392
  ```
538
393
 
539
- ### SCTJSvgIcon SVG 图标
394
+ ### SCTJIcon SVG 图标
540
395
 
541
396
  ```vue
542
397
  <template>
543
- <SCTJSvgIcon icon-class="user" :color="'#409EFF'" />
398
+ <SCTJIcon icon-class="user" :color="'#409EFF'" />
544
399
  </template>
545
400
 
546
401
  <script setup>
547
- import { SCTJSvgIcon } from 'sctj-components'
402
+ import { SCTJIcon } from 'sctj-components'
548
403
  </script>
549
404
  ```
550
405
 
551
- ### SCTJTableContainer 表格容器
552
-
553
- ```vue
554
- <template>
555
- <SCTJTableContainer>
556
- <SCTJTableTopActionContainer
557
- v-model:show-search="showSearch"
558
- :show-refresh="true"
559
- @refresh="handleRefresh"
560
- >
561
- <template #left>
562
- <el-button type="primary" @click="handleAdd">新增</el-button>
563
- </template>
564
- </SCTJTableTopActionContainer>
565
-
566
- <SCTJSearch v-model:visible="showSearch">
567
- <!-- 搜索表单内容 -->
568
- </SCTJSearch>
569
-
570
- <SCTJTable :request="fetchData" />
571
- </SCTJTableContainer>
572
- </template>
573
-
574
- <script setup>
575
- import { ref } from 'vue'
576
- import {
577
- SCTJTableContainer,
578
- SCTJTableTopActionContainer,
579
- SCTJSearch,
580
- SCTJTable
581
- } from 'sctj-components'
582
-
583
- const showSearch = ref(true)
584
406
 
585
- const handleRefresh = () => {
586
- // 刷新表格数据
587
- }
588
-
589
- const handleAdd = () => {
590
- // 新增逻辑
591
- }
592
-
593
- const fetchData = async (params) => {
594
- // 获取表格数据
595
- }
596
- </script>
597
- ```
598
407
 
599
408
  ### SCTJRightToolbar 右侧工具栏
600
409
 
@@ -699,7 +508,7 @@ const seriesConfig = ref([
699
508
  {
700
509
  name: '销售额',
701
510
  type: 'bar',
702
- dataKey: 'value'
511
+ prop: 'value'
703
512
  }
704
513
  ])
705
514
  </script>
@@ -793,6 +602,10 @@ const handleContextMenuClick = (key) => {
793
602
 
794
603
  ### SCTJDwgViewer DWG 查看器
795
604
 
605
+ > ⚠️ **前置准备**:使用此组件前,需要拷贝静态资源:
606
+ > 1. 从 `node_modules/sctj-components/public/BimfaceSDKLoader@latest-release.js` 文件拷贝到宿主项目的 `public/` 根目录
607
+ > 2. 在宿主 `index.html` 中添加:`<script src="/BimfaceSDKLoader@latest-release.js" type="application/javascript" charset="utf-8"></script>`
608
+
796
609
  ```vue
797
610
  <template>
798
611
  <SCTJDwgViewer
@@ -843,27 +656,36 @@ const iframeUrl = ref('https://example.com')
843
656
 
844
657
  ```vue
845
658
  <template>
846
- <el-button @click="dialogVisible = true">导入数据</el-button>
659
+ <el-button @click="handleImport">导入数据</el-button>
847
660
  <SCTJImportDialog
848
- v-model:open="dialogVisible"
849
- title="用户"
850
- :upload-url="'/api/import/users'"
851
- :template-title="'用户导入模板'"
852
- :template-url="'/api/import/template/users'"
853
- :show-check-box="true"
854
- @success="handleImportSuccess"
855
- />
661
+ :headers="{ Authorization: 'Bearer ' + getToken() }"
662
+ @loadSucccess="refreshTable"
663
+ v-bind="importConfig"
664
+ ref="importDialogRef"
665
+ />
856
666
  </template>
857
667
 
858
668
  <script setup>
669
+ import {getToken} from "@/utils/auth";
859
670
  import { ref } from 'vue'
860
671
  import { SCTJImportDialog } from 'sctj-components'
861
672
 
862
- const dialogVisible = ref(false)
673
+ const importConfig = reactive({
674
+ templateTitle: '作业设备工作区域模板',
675
+ templateUrl: `${import.meta.env.VITE_APP_BASE_API}/business/deviceWorkArea/importTemplate`,
676
+ uploadUrl: `${import.meta.env.VITE_APP_BASE_API}/business/deviceWorkArea/importData`,
677
+ showCheckBox: false,
678
+ title: "作业设备工作区域信息"
679
+ })
680
+ const refreshTable=()=>{
681
+ //导入成功后要做什么...
682
+ }
863
683
 
864
- const handleImportSuccess = (response) => {
865
- console.log('导入成功:', response)
866
- dialogVisible.value = false
684
+ const importDialogRef = ref(null)
685
+
686
+ // 导入
687
+ const handleImport = () => {
688
+ importDialogRef.value?.init()
867
689
  }
868
690
  </script>
869
691
  ```
@@ -872,77 +694,117 @@ const handleImportSuccess = (response) => {
872
694
 
873
695
  ```vue
874
696
  <template>
875
- <el-button @click="dialogVisible = true">选择数据</el-button>
697
+ <el-button @click="open">选择数据</el-button>
876
698
  <SCTJDialogTable
877
- v-model:open="dialogVisible"
878
- title="选择用户"
879
- :columns="columns"
880
- :request="fetchUsers"
881
- :select-options="{
882
- show: true,
883
- multiple: true,
884
- valueKey: 'id',
885
- reserveSelection: true
886
- }"
887
- :query-columns="queryColumns"
888
- @confirm="handleConfirm"
889
- />
699
+ v-model:select="addCarForm.vehicleManageList"
700
+ v-modal:value="addCarForm.vehicleManageListIds"
701
+ v-modal:names="addCarForm.vehicleManageListNames"
702
+ @change="selectChange"
703
+ :tableColumns="columns"
704
+ ref="addDialogTableRef"
705
+ :request="getList"
706
+ :selectOptions="{
707
+ show: true,//开启选择模式
708
+ multiple: true,// 是否复选
709
+ valueKey: 'id',// 要提取对象的值prop
710
+ nameKey:'licensePlate',// 要提取对象的中文prop
711
+ reserveSelection: true,// 是否翻页记忆
712
+ }"
713
+ />
890
714
  </template>
891
715
 
892
716
  <script setup>
893
717
  import { ref } from 'vue'
718
+ import {getList} from "@/api/baseModule";
894
719
  import { SCTJDialogTable } from 'sctj-components'
895
720
 
896
- const dialogVisible = ref(false)
721
+ const addDialogTableRef = ref(null)
897
722
 
898
- const columns = ref([
899
- { prop: 'name', label: '姓名' },
900
- { prop: 'age', label: '年龄' },
901
- { prop: 'email', label: '邮箱' }
902
- ])
903
-
904
- const queryColumns = ref([
905
- {
906
- prop: 'name',
907
- label: '姓名',
908
- query: {
909
- type: 'input',
910
- queryKey: 'name',
911
- placeholder: '请输入姓名'
912
- }
913
- }
914
- ])
723
+ const addCarForm = reactive({
724
+ projectId: '',
725
+ vehicleManageList: [],
726
+ vehicleManageListIds:'',
727
+ vehicleManageListNames:''
728
+ })
915
729
 
916
- const fetchUsers = async (params) => {
917
- const response = await fetch('/api/users', {
918
- method: 'POST',
919
- body: JSON.stringify(params)
920
- })
921
- return await response.json()
730
+ const columns = ref([
731
+ {
732
+ label: '车牌号',
733
+ prop: 'licensePlate',
734
+ minWidth: 170,
735
+ query: {
736
+ type: 'input',
737
+ placeholder: '请输入车牌号'
738
+ }
739
+ },
740
+ {
741
+ label: '设备类型',
742
+ prop: 'vehicleType',
743
+ minWidth: 80,
744
+ dict: dz_work_device_type.value,// 字典数据源
745
+ query: {
746
+ type: 'select',//查询组件
747
+ placeholder: '请选择设备类型',
748
+ queryKey:"vehicleType",//查询字段
749
+ data: dz_work_device_type.value//下拉选择数据源
750
+ }
751
+ },
752
+ {
753
+ label: '所属项目',
754
+ prop: 'projectName',
755
+ minWidth: 170,
756
+ },
757
+ {
758
+ label: '所属工区',
759
+ prop: 'areaName',
760
+ minWidth: 170,
761
+ },
762
+ {
763
+ label: '入场时间',
764
+ prop: 'entryTime',
765
+ minWidth: 170,
766
+ }
767
+ ])
768
+ // 打开选择弹窗
769
+ const open = async (row) => {
770
+ addDialogTableRef.value?.open({
771
+ title: '选择数据',
772
+ open: true,
773
+ }, {projectId: row.projectId})
922
774
  }
923
775
 
924
- const handleConfirm = (selectedRows) => {
776
+
777
+ const selectChange = (selectedRows) => {
925
778
  console.log('选中的行:', selectedRows)
926
- dialogVisible.value = false
927
779
  }
928
780
  </script>
929
781
  ```
930
782
 
931
783
  ### SCTJMapViewer 地图查看器
932
784
 
785
+ > ⚠️ **前置准备**
786
+ > 1. npm install @amap/amap-jsapi-loader@^1.0.0;
787
+ > 2. 在 `main.js` 文件中添加window._AMapSecurityConfig = {securityJsCode: 替换为你的Web端密钥};
788
+
789
+
933
790
  ```vue
934
791
  <template>
935
792
  <SCTJMapViewer
936
- :height="'600px'"
937
- :width="'100%'"
938
- :center="[116.397428, 39.90923]"
939
- :static-markers="staticMarkers"
940
- :dynamic-markers="dynamicMarkers"
793
+ :amapKey="amapKey"
794
+ :center="center"
795
+ :auto-fit-view="false"
796
+ changeMapType
797
+ ref="mapViewerRef"
798
+ :staticMarkers="staticMarkers"
799
+ :dynamicMarkers="dynamicMarkers"
941
800
  :polylines="polylines"
942
- :polygons="polygons"
801
+ :polygons="polygons"
802
+ :circles="circles"
943
803
  :legend-config="legendConfig"
944
- :change-map-type="true"
945
- @marker-click="handleMarkerClick"
804
+ view-mode="3D"
805
+ mapStyle="amap://styles/darkblue"
806
+ @loaded="maploaded"
807
+ @overlay-click="handleOverlayClick"
946
808
  />
947
809
  </template>
948
810
 
@@ -950,105 +812,238 @@ const handleConfirm = (selectedRows) => {
950
812
  import { ref } from 'vue'
951
813
  import { SCTJMapViewer } from 'sctj-components'
952
814
 
815
+ const center=ref("104.122744,30.668903")
816
+ const amapKey='你的web端key'
817
+
953
818
  const staticMarkers = ref([
954
819
  {
955
- position: [116.397428, 39.90923],
956
- title: '标记点1',
957
- icon: 'https://webapi.amap.com/theme/v1.3/markers/n/mark_b.png'
820
+ id:'1',
821
+ position: [116.397428, 39.90923],//或者"116.397428, 39.90923"
822
+ icon: getAssetURL(`cockpit/'invasionDevice.png'`),
823
+ label: `入侵检测仪`,//显示的名称
824
+ blink: true,// 是否闪烁
825
+ textLabelDefaultStyle: {//label样式
826
+ color: '#FF0000'
827
+ },
828
+ type: 'invasionDevice',//业务类型,联动legendConfig使用,点击显示图例显示隐藏
958
829
  }
959
830
  ])
960
831
 
961
832
  const dynamicMarkers = ref([
962
833
  {
963
834
  id: '1',
964
- position: [116.407428, 39.91923],
965
- title: '动态标记点',
966
- icon: 'https://webapi.amap.com/theme/v1.3/markers/n/mark_r.png'
835
+ position: [116.407428, 39.91923],//或者"116.397428, 39.90923"
836
+ label: `川AXXXX(在线)`,
837
+ icon: getAssetURL(`cockpit/vehicle.png`),
838
+ blink: false,
839
+ textLabelDefaultStyle: {
840
+ color: '#00FF00'
841
+ },
842
+ type: 'workDevice',
967
843
  }
968
844
  ])
969
845
 
970
846
  const polylines = ref([
971
847
  {
972
- path: [
973
- [116.397428, 39.90923],
974
- [116.407428, 39.91923]
975
- ],
976
- strokeColor: '#3366FF',
977
- strokeWeight: 3
848
+ path: ["104.12034,30.66797","104.125375,30.669477"],
849
+ dirImg: getAssetURL(`cockpit/yyxTielu.png`),
850
+ strokeOpacity: 0.5,
851
+ strokeColor: "#fff",// 完全不透明
852
+ strokeWeight: 6,
853
+ outlineColor: '#fff',
854
+ borderWeight: 2,
855
+ lineJoin: 'miter',
856
+ lineCap: 'butt',
857
+ type: 'yyx'
978
858
  }
979
859
  ])
980
860
 
981
861
  const polygons = ref([
982
862
  {
983
- path: [
984
- [116.397428, 39.90923],
985
- [116.407428, 39.91923],
986
- [116.417428, 39.92923]
987
- ],
988
- fillColor: '#FF0000',
989
- strokeColor: '#0000FF',
990
- strokeWeight: 2
863
+ path: ["104.12034,30.66797","104.125375,30.669477"],
864
+ strokeColor: '#409EFF',
865
+ strokeOpacity: 1,
866
+ fillColor:'#409EFF',
867
+ strokeWeight: 2,
868
+ fillOpacity: 0.05,
869
+ strokeStyle: 'dashed',
870
+ strokeDasharray: [20, 5],
871
+ label: '一工区',
872
+ labelStyle: {
873
+ 'background-color': 'transparent',
874
+ 'text-align': 'center',
875
+ 'font-size': '40px',
876
+ 'font-weight': 'bold',
877
+ 'border': 'none',
878
+ 'font-family': 'YEBTH',
879
+ 'color':'#409EFF',
880
+ 'opacity': 0.8,
881
+ },
882
+ type: 'workArea',
883
+ }
884
+ ])
885
+
886
+ const circles=ref([
887
+ {
888
+ center: "104.12473,30.668512",//中心点
889
+ radius: "30",//圆形半径
890
+ strokeColor:'#409EFF',
891
+ strokeOpacity: 1,
892
+ fillColor:'#409EFF',
893
+ strokeWeight: 2,
894
+ fillOpacity: 0.05,
895
+ strokeStyle: 'dashed',
896
+ strokeDasharray: [20, 5],
897
+ label: '人员区域', // 工区名称
898
+ labelStyle: {
899
+ 'background-color': 'transparent',
900
+ 'text-align': 'center',
901
+ 'font-size': '40px',
902
+ 'font-weight': 'bold',
903
+ 'border': 'none',
904
+ 'font-family': 'YEBTH',
905
+ 'color': '#409EFF',
906
+ 'opacity': 0.8,
907
+ },
908
+ type: 'peopleArea',
991
909
  }
992
910
  ])
993
911
 
994
912
  const legendConfig = ref([
995
- { label: '类型A', value: 'typeA' },
996
- { label: '类型B', value: 'typeB' }
913
+ {
914
+ label: '入侵检测仪',
915
+ value: 'invasionDevice'
916
+ },
917
+ {
918
+ label: '作业设备',
919
+ value: 'workDevice'
920
+ },
921
+ {
922
+ label: '工区',
923
+ value: 'workArea'
924
+ },
925
+ {
926
+ label: '营业线',
927
+ value: 'yyx'
928
+ },
929
+ {
930
+ label: '人员区域',
931
+ value: 'peopleArea',
932
+ defaultVisible: false
933
+ }
997
934
  ])
998
935
 
999
- const handleMarkerClick = (marker) => {
1000
- console.log('点击了标记点:', marker)
936
+ const maploaded = () => {
937
+ // 地图加载成后的回调
938
+ }
939
+ // 地图覆盖物点击事件
940
+ const handleOverlayClick = (Overlay) => {
941
+ console.log('点击了覆盖物:', Overlay)
1001
942
  }
1002
943
  </script>
1003
944
  ```
1004
945
 
1005
946
  ### SCTJMapDrawingDialog 地图绘制对话框
1006
947
 
948
+ > ⚠️ **前置准备**
949
+ > 1. npm install @amap/amap-jsapi-loader@^1.0.0;
950
+ > 2. 在 `main.js` 文件中添加window._AMapSecurityConfig = {securityJsCode: 替换为你的Web端密钥};
951
+
1007
952
  ```vue
1008
953
  <template>
1009
- <el-button @click="dialogVisible = true">绘制地图</el-button>
1010
954
  <SCTJMapDrawingDialog
1011
- v-model:open="dialogVisible"
1012
- title="绘制区域"
1013
- @confirm="handleConfirm"
1014
- />
955
+ width="80vw"
956
+ :map-zoom="18"
957
+ center="104.12473,30.668512"
958
+ v-model:markers="form.markers"
959
+ v-model:polygons="form.polygons"
960
+ v-model:circles="form.circles"
961
+ v-model:polylines="form.polylines"
962
+ v-model:bezierCurve="form.bezierCurves"
963
+ :multiple="['point', 'polyline', 'polygon', 'circle', 'bezierCurve']" // multiple接受布尔值或者数组
964
+ :allowedTypes="['point', 'polyline', 'polygon', 'circle', 'bezierCurve']"
965
+ :amapKey="amapKey">
966
+ <!-- trigger 有默认插槽,也可以不传入按钮 -->
967
+ <template #trigger={openDialog}>
968
+ <el-button @click="openDialog">地图绘制</el-button>
969
+ </template>
970
+ </SCTJMapDrawingDialog>
1015
971
  </template>
1016
972
 
1017
973
  <script setup>
1018
974
  import { ref } from 'vue'
1019
975
  import { SCTJMapDrawingDialog } from 'sctj-components'
976
+ const form = reactive({
977
+ markers: [],
978
+ polygons: [],
979
+ circles:[],
980
+ polylines:[],
981
+ bezierCurves:[]
982
+ })
1020
983
 
1021
- const dialogVisible = ref(false)
1022
-
1023
- const handleConfirm = (drawingData) => {
1024
- console.log('绘制的数据:', drawingData)
1025
- dialogVisible.value = false
1026
- }
1027
984
  </script>
1028
985
  ```
1029
986
 
1030
987
  ### SCTJBusinessMapDrawingDialog 业务地图绘制对话框
1031
988
 
989
+ > ⚠️ **前置准备**
990
+ > 1. npm install @amap/amap-jsapi-loader@^1.0.0;
991
+ > 2. 在 `main.js` 文件中添加window._AMapSecurityConfig = {securityJsCode: 替换为你的Web端密钥};
992
+
1032
993
  ```vue
1033
994
  <template>
1034
- <el-button @click="dialogVisible = true">业务绘制</el-button>
1035
995
  <SCTJBusinessMapDrawingDialog
1036
- v-model:open="dialogVisible"
1037
- title="业务区域绘制"
1038
- @confirm="handleConfirm"
1039
- />
996
+ width="80vw"
997
+ center="104.12473,30.668512"
998
+ v-model:markers="form.markers"
999
+ v-model:polygons="form.polygons"
1000
+ v-model:circles="form.circles"
1001
+ v-model:polylines="form.polylines"
1002
+ :businessConfig="businessConfig"
1003
+ :amapKey="amapKey">
1004
+ <!-- trigger 有默认插槽,也可以不传入按钮 -->
1005
+ <template #trigger="{openDialog}">
1006
+ <el-button type="primary" @click="openDialog" size="small">点击绘制</el-button>
1007
+ </template>
1008
+ </SCTJBusinessMapDrawingDialog>
1040
1009
  </template>
1041
1010
 
1042
1011
  <script setup>
1043
1012
  import { ref } from 'vue'
1044
1013
  import { SCTJBusinessMapDrawingDialog } from 'sctj-components'
1045
1014
 
1046
- const dialogVisible = ref(false)
1047
-
1048
- const handleConfirm = (drawingData) => {
1049
- console.log('业务绘制数据:', drawingData)
1050
- dialogVisible.value = false
1051
- }
1015
+ const businessConfig=[
1016
+ {
1017
+ key: 'lngLat',
1018
+ label: '项目中心点',
1019
+ multiple: false,
1020
+ drawTypes: ['point']
1021
+ },
1022
+ {
1023
+ key: 'yyxLngLat',
1024
+ label: '项目营业线',
1025
+ multiple: true,
1026
+ drawTypes: ['polyline']
1027
+ },
1028
+ {
1029
+ key: 'projectWorkArea',
1030
+ label: '项目工区',
1031
+ multiple: true,
1032
+ drawTypes: ['polygon', 'circle']
1033
+ },
1034
+ {
1035
+ key: 'workDeviceArea',
1036
+ label: '作业设备限制区域',
1037
+ multiple: true,
1038
+ drawTypes: ['polygon', 'circle']
1039
+ },
1040
+ {
1041
+ key: 'workPersonnelArea',
1042
+ label: '作业人员区域',
1043
+ multiple: true,
1044
+ drawTypes: ['polygon', 'circle']
1045
+ }
1046
+ ]
1052
1047
  </script>
1053
1048
  ```
1054
1049
 
@@ -1058,9 +1053,6 @@ const handleConfirm = (drawingData) => {
1058
1053
 
1059
1054
  部分组件需要通过 props 传入业务 API 函数:
1060
1055
 
1061
- - **SCTJH5hkPlayer**:需要传入 `getLiveAddress`、`getReplayAddress`、`downloadCertificate` 函数
1062
- - **SCTJHelmetPlayer**:需要传入 `callApi`、`handleStreamingApi`、`queryAdminSipInfoApi` 函数
1063
- - **SCTJYsyPlayer**:需要传入 `getYsToken` 函数
1064
1056
  - **SCTJFileUpload、SCTJImageUpload、SCTJImagePreview**:可选传入 `baseUrl` prop 处理相对路径
1065
1057
 
1066
1058
  ### 2. 样式