index.vue 81 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989
  1. <template>
  2. <div class="app-container">
  3. <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="100px">
  4. <el-form-item label="名称" prop="cameraName">
  5. <el-input
  6. v-model="queryParams.cameraName"
  7. placeholder="请输入摄像头名称"
  8. clearable
  9. @keyup.enter.native="handleQuery"
  10. />
  11. </el-form-item>
  12. <el-form-item label="摄像头厂家" prop="cameraFactory">
  13. <el-select v-model="queryParams.cameraFactory" placeholder="摄像头厂家">
  14. <el-option
  15. v-for="dict in dict.type.camera_factory"
  16. :key="dict.value"
  17. :label="dict.label"
  18. :value="dict.value"
  19. />
  20. </el-select>
  21. </el-form-item>
  22. <el-form-item label="运营商类型" prop="operatorType">
  23. <el-select v-model="queryParams.operatorType" placeholder="运营商类型">
  24. <el-option
  25. v-for="dict in dict.type.operator_type"
  26. :key="dict.value"
  27. :label="dict.label"
  28. :value="dict.value"
  29. />
  30. </el-select>
  31. </el-form-item>
  32. <el-form-item label="摄像头用途" prop="cameraUse">
  33. <el-select v-model="queryParams.cameraUse" placeholder="摄像头用途">
  34. <el-option
  35. v-for="dict in dict.type.camera_use"
  36. :key="dict.value"
  37. :label="dict.label"
  38. :value="dict.value"
  39. />
  40. </el-select>
  41. </el-form-item>
  42. <el-form-item label="摄像头ip" prop="cameraIp">
  43. <el-input
  44. v-model="queryParams.cameraIp"
  45. placeholder="请输入摄像头ip"
  46. clearable
  47. @keyup.enter.native="handleQuery"
  48. />
  49. </el-form-item>
  50. <el-form-item label="工作状态" prop="workingStatus">
  51. <el-select v-model="queryParams.workingStatus" placeholder="工作状态" clearable>
  52. <el-option
  53. v-for="dict in dict.type.device_status"
  54. :key="dict.value"
  55. :label="dict.label"
  56. :value="dict.value"
  57. />
  58. </el-select>
  59. </el-form-item>
  60. <el-form-item label="离线时间">
  61. <el-date-picker
  62. v-model="dateRange"
  63. style="width: 280px"
  64. value-format="yyyy-MM-dd HH:mm:ss"
  65. :default-time="['00:00:00', '23:59:59']"
  66. type="datetimerange"
  67. range-separator="-"
  68. start-placeholder="开始日期"
  69. end-placeholder="结束日期"
  70. ></el-date-picker>
  71. </el-form-item>
  72. <el-form-item>
  73. <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  74. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  75. </el-form-item>
  76. </el-form>
  77. <el-row :gutter="10" class="mb8">
  78. <el-col :span="1.5">
  79. <el-button
  80. type="primary"
  81. plain
  82. icon="el-icon-plus"
  83. size="mini"
  84. @click="handleAdd"
  85. v-hasPermi="['camera:camera:add']"
  86. >新增
  87. </el-button>
  88. </el-col>
  89. <el-col :span="1.5">
  90. <el-button
  91. type="success"
  92. plain
  93. icon="el-icon-edit"
  94. size="mini"
  95. :disabled="single"
  96. @click="handleUpdate"
  97. v-hasPermi="['camera:camera:edit']"
  98. >修改
  99. </el-button>
  100. </el-col>
  101. <el-col :span="1.5">
  102. <el-button
  103. type="danger"
  104. plain
  105. icon="el-icon-delete"
  106. size="mini"
  107. :disabled="multiple"
  108. @click="handleDelete"
  109. v-hasPermi="['camera:camera:remove']"
  110. >删除
  111. </el-button>
  112. </el-col>
  113. <el-col :span="1.5">
  114. <el-button
  115. type="warning"
  116. plain
  117. icon="el-icon-download"
  118. size="mini"
  119. @click="handleExport"
  120. v-hasPermi="['camera:camera:export']"
  121. >导出
  122. </el-button>
  123. </el-col>
  124. <!-- <el-col :span="1.5">-->
  125. <!-- <el-button-->
  126. <!-- icon="el-icon-refresh"-->
  127. <!-- size="mini"-->
  128. <!-- :disabled="multiple"-->
  129. <!-- @click="replayPreview_hik"-->
  130. <!-- >查看电视墙-->
  131. <!-- </el-button>-->
  132. <!-- </el-col>-->
  133. <el-col :span="1.5">
  134. <el-button
  135. icon="el-icon-refresh"
  136. type="success"
  137. size="mini"
  138. @click="synchronizeCamera"
  139. v-hasPermi="['DahuaController:DahuaController:edit']"
  140. >同步设备状态
  141. </el-button>
  142. </el-col>
  143. <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
  144. </el-row>
  145. <el-table v-loading="loading" :visible.sync="loading" :data="cameraList" @selection-change="handleSelectionChange">
  146. <el-table-column type="selection" width="55" align="center"/>
  147. <el-table-column label="摄像头名称" align="center" prop="cameraName"/>
  148. <el-table-column label="ip" align="center" prop="cameraIp"/>
  149. <el-table-column label="摄像头厂家" align="center" prop="cameraFactory" width="100">
  150. <template slot-scope="scope">
  151. <dict-tag :options="dict.type.camera_factory" :value="scope.row.cameraFactory"/>
  152. </template>
  153. </el-table-column>
  154. <!-- <el-table-column label="融合平台" align="center" prop="convergencePlatform">-->
  155. <!-- <template slot-scope="scope">-->
  156. <!-- <dict-tag :options="dict.type.convergence_platform" :value="scope.row.convergencePlatform"/>-->
  157. <!-- </template>-->
  158. <!-- </el-table-column>-->
  159. <!-- <el-table-column label="所属区域" align="center" prop="cameraRegion"/>-->
  160. <el-table-column label="设备状态" align="center" prop="workingStatus" width="100">
  161. <template slot-scope="scope">
  162. <dict-tag :options="dict.type.device_status" :value="scope.row.workingStatus"/>
  163. </template>
  164. </el-table-column>
  165. <el-table-column label="离线原因" align="center" prop="offlineReason">
  166. <template slot-scope="scope">
  167. <dict-tag :options="dict.type.camera_offline_reason" :value="scope.row.offlineReason"/>
  168. </template>
  169. </el-table-column>
  170. <el-table-column label="操作" align="center" width="550" class-name="small-padding fixed-width">
  171. <template slot-scope="scope">
  172. <el-button
  173. size="mini"
  174. type="text"
  175. icon="el-icon-thumb"
  176. @click="drawFence(scope.row)"
  177. >绘制围栏
  178. </el-button>
  179. <el-button
  180. size="mini"
  181. type="text"
  182. icon="el-icon-video-camera"
  183. @click="preview(scope.row)"
  184. v-hasPermi="['camerachannel:camerachannel:selectchannel']"
  185. >预览
  186. </el-button>
  187. <el-button
  188. size="mini"
  189. type="text"
  190. icon="el-icon-video-camera"
  191. @click="playBack(scope.row)"
  192. v-hasPermi="['camerachannel:camerachannel:selectchannel']"
  193. >回放
  194. </el-button>
  195. <el-button
  196. size="mini"
  197. type="text"
  198. icon="el-icon-edit"
  199. @click="handleUpdate(scope.row)"
  200. v-hasPermi="['camera:camera:edit']"
  201. >修改
  202. </el-button>
  203. <el-button
  204. size="mini"
  205. type="text"
  206. icon="el-icon-delete"
  207. @click="handleDelete(scope.row)"
  208. v-hasPermi="['camera:camera:remove']"
  209. >删除
  210. </el-button>
  211. <el-button
  212. size="mini"
  213. type="text"
  214. icon="el-icon-view"
  215. @click="handleSee(scope.row)"
  216. v-hasPermi="['camera:camera:query']"
  217. >查看
  218. </el-button>
  219. <el-button
  220. size="mini"
  221. type="text"
  222. icon="el-icon-link"
  223. @click="handleCameraChannel(scope.row)"
  224. v-hasPermi="['camerachannel:camerachannel:list']"
  225. >通道管理
  226. </el-button>
  227. <el-button
  228. size="mini"
  229. type="text"
  230. icon="el-icon-s-management"
  231. @click="handleCameraDept(scope.row)"
  232. v-hasPermi="['aidevicedept:aidevicedept:list']"
  233. >部门管理
  234. </el-button>
  235. <el-button
  236. size="mini"
  237. type="text"
  238. icon="el-icon-document"
  239. @click="handleCameraEvent(scope.row)"
  240. v-hasPermi="['aideviceevent:aideviceevent:list']"
  241. >事件管理
  242. </el-button>
  243. <el-button
  244. size="mini"
  245. type="text"
  246. icon="el-icon-document"
  247. @click="handleCameraLog(scope.row)"
  248. v-hasPermi="['camera:camera:listLog']"
  249. >运行历史
  250. </el-button>
  251. </template>
  252. </el-table-column>
  253. </el-table>
  254. <pagination
  255. v-show="total>0"
  256. :total="total"
  257. :page.sync="queryParams.pageNum"
  258. :limit.sync="queryParams.pageSize"
  259. @pagination="getListByDept"
  260. />
  261. <!-- 添加或修改摄像头对话框 -->
  262. <el-dialog :title="title" :visible.sync="open" width="700px" append-to-body :close-on-click-modal="false">
  263. <el-card class="box-card">
  264. <el-steps :active="active" align-center>
  265. <el-step title="设备基础信息" icon="el-icon-video-camera-solid"></el-step>
  266. <el-step title="设备详细信息" icon="el-icon-success"></el-step>
  267. </el-steps>
  268. </el-card>
  269. <el-card class="box-card" style="margin-top:15px;">
  270. <el-form ref="form" :model="form" :rules="rules" label-width="100px">
  271. <div v-show="active == 1">
  272. <el-row>
  273. <el-col :span="20">
  274. <el-form-item label="摄像头厂家" prop="cameraFactory">
  275. <el-select v-model="form.cameraFactory" placeholder="摄像头厂家">
  276. <el-option v-for="dict in dict.type.camera_factory" :key="dict.value" :label="dict.label"
  277. :value="dict.value"
  278. />
  279. </el-select>
  280. </el-form-item>
  281. <el-form-item label="融合平台" prop="convergencePlatform">
  282. <el-select v-model="form.convergencePlatform" placeholder="融合平台">
  283. <el-option v-for="dict in dict.type.convergence_platform" :key="dict.value" :label="dict.label"
  284. :value="dict.value"
  285. />
  286. </el-select>
  287. </el-form-item>
  288. <el-form-item label="摄像头名称" prop="cameraName">
  289. <el-input v-model="form.cameraName" placeholder="请输入摄像头名称"/>
  290. </el-form-item>
  291. <el-form-item label="所属区域" prop="cameraRegion">
  292. <el-input v-model="form.cameraRegion" placeholder="请输入所属区域"/>
  293. </el-form-item>
  294. <el-form-item label="半径" prop="cameraRadius">
  295. <el-input v-model="form.cameraRadius" placeholder="请输入半径"/>
  296. </el-form-item>
  297. <el-form-item label="高度" prop="height">
  298. <el-input v-model="form.height" placeholder="请输入高度"/>
  299. </el-form-item>
  300. <el-form-item label="经度" prop="longitude">
  301. <el-input v-model="form.longitude" placeholder="请输入经度" @dblclick.native="showMap"/>
  302. </el-form-item>
  303. <el-form-item label="纬度" prop="latitude">
  304. <el-input v-model="form.latitude" placeholder="请输入纬度" @dblclick.native="showMap"/>
  305. </el-form-item>
  306. <el-form-item label="摄像头用途" prop="cameraUse">
  307. <el-select v-model="form.cameraUse" placeholder="请选择摄像头用途">
  308. <el-option
  309. v-for="dict in dict.type.camera_use"
  310. :key="dict.value"
  311. :label="dict.label"
  312. :value="dict.value"
  313. ></el-option>
  314. </el-select>
  315. </el-form-item>
  316. </el-col>
  317. </el-row>
  318. </div>
  319. <div v-show="active == 2 ">
  320. <el-row>
  321. <el-col :span="18">
  322. <el-form-item label="ip" prop="cameraIp">
  323. <el-input v-model="form.cameraIp" placeholder="请输入ip"/>
  324. </el-form-item>
  325. <el-form-item label="端口" prop="cameraPort">
  326. <el-input v-model="form.cameraPort" maxlength="10" placeholder="请输入端口"/>
  327. </el-form-item>
  328. <el-form-item label="账号" prop="cameraAccount">
  329. <el-input v-model="form.cameraAccount" maxlength="20" placeholder="请输入账号"/>
  330. </el-form-item>
  331. <el-form-item label="密码" prop="cameraPasword">
  332. <el-input v-model="form.cameraPasword" maxlength="20" placeholder="请输入密码" show-password
  333. autocomplete="new-password"
  334. />
  335. </el-form-item>
  336. <el-form-item label="摄像头编码" prop="cameraCode">
  337. <el-input v-model="form.cameraCode" :disabled="cameraCodeDisabled" placeholder="请输入摄像头编码"/>
  338. </el-form-item>
  339. <el-form-item label="通道编号" prop="channelNum">
  340. <el-input v-model="form.channelNum" placeholder="请输入通道编号"/>
  341. </el-form-item>
  342. <el-form-item label="摄像头类型" prop="cameraType">
  343. <el-select v-model="form.cameraType" placeholder="请选择摄像头类型">
  344. <el-option
  345. v-for="dict in dict.type.camera_type"
  346. :key="dict.value"
  347. :label="dict.label"
  348. :value="dict.value"
  349. ></el-option>
  350. </el-select>
  351. </el-form-item>
  352. <el-form-item label="可用系统" prop="list">
  353. <el-select v-model="form.list" multiple placeholder="请选择用途">
  354. <el-option
  355. v-for="dict in dict.type.camera_system"
  356. :key="dict.value"
  357. :label="dict.label"
  358. :value="dict.value"
  359. ></el-option>
  360. </el-select>
  361. </el-form-item>
  362. <el-form-item label="运营商类型" prop="operatorType">
  363. <el-select v-model="form.operatorType" placeholder="请选择运营商类型">
  364. <el-option
  365. v-for="dict in dict.type.operator_type"
  366. :key="dict.value"
  367. :label="dict.label"
  368. :value="dict.value"
  369. ></el-option>
  370. </el-select>
  371. </el-form-item>
  372. <el-form-item label="图片" prop="cameraImagesList">
  373. <image-upload v-model="form.cameraImagesList"/>
  374. </el-form-item>
  375. </el-col>
  376. </el-row>
  377. </div>
  378. </el-form>
  379. </el-card>
  380. <div slot="footer" class="dialog-footer" v-show="active != 3">
  381. <el-button v-if="active < 2 && form.cameraFactory !== undefined" :disabled="isFormIncomplete()"
  382. style="margin-top: 12px" type="primary" @click="next"
  383. >下一步
  384. </el-button>
  385. </div>
  386. <div slot="footer" class="dialog-footer" v-show="active == 2">
  387. <el-button v-if="active > 1" style="margin-top: 12px" @click="pre">上一步</el-button>
  388. <el-button type="primary" @click="submitForm">确定</el-button>
  389. </div>
  390. </el-dialog>
  391. <!-- 详情 -->
  392. <el-dialog :title="title" :visible.sync="openSee" width="1000px" append-to-body>
  393. <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  394. <el-row>
  395. <el-col :span="12">
  396. <!--<el-form-item label="数据所属部门" prop="dataDeptId">
  397. <deptselector :setValue=setDataDeptId ></deptselector>
  398. </el-form-item>-->
  399. <el-form-item label="融合平台" prop="convergencePlatform" label-width="120px">
  400. <el-select v-model="form.convergencePlatform" placeholder="融合平台" :disabled="true"
  401. style="width: 360px;"
  402. >
  403. <el-option
  404. v-for="dict in dict.type.convergence_platform"
  405. :key="dict.value"
  406. :label="dict.label"
  407. :value="dict.value"
  408. />
  409. </el-select>
  410. </el-form-item>
  411. <el-form-item label="摄像头厂家" prop="cameraFactory" label-width="120px">
  412. <el-select v-model="form.cameraFactory" placeholder="摄像头厂家" :disabled="true " style="width: 360px;">
  413. <el-option
  414. v-for="dict in dict.type.camera_factory"
  415. :key="dict.value"
  416. :label="dict.label"
  417. :value="dict.value"
  418. />
  419. </el-select>
  420. </el-form-item>
  421. <el-form-item label="摄像头类型" prop="cameraType" label-width="120px">
  422. <el-select v-model="form.cameraType" placeholder="请选择摄像头类型" :disabled="true"
  423. style="width: 360px;"
  424. >
  425. <el-option
  426. v-for="dict in dict.type.camera_type"
  427. :key="dict.value"
  428. :label="dict.label"
  429. :value="dict.value"
  430. ></el-option>
  431. </el-select>
  432. </el-form-item>
  433. <el-form-item label="摄像头名称" prop="cameraName" label-width="120px">
  434. <el-input v-model="form.cameraName" :disabled="true"/>
  435. </el-form-item>
  436. <el-form-item label="摄像头编码" prop="cameraCode" label-width="120px">
  437. <el-input v-model="form.cameraCode" :disabled="true"/>
  438. </el-form-item>
  439. <el-form-item label="通道编号" prop="channelNum" label-width="120px">
  440. <el-input v-model="form.channelNum" :disabled="true"/>
  441. </el-form-item>
  442. <el-form-item label="账号" prop="cameraAccount" label-width="120px">
  443. <el-input v-model="form.cameraAccount" :disabled="true"/>
  444. </el-form-item>
  445. <el-form-item label="密码" prop="cameraPasword" label-width="120px">
  446. <el-input v-model="form.cameraPasword" :disabled="true" show-password/>
  447. </el-form-item>
  448. <el-form-item label="摄像头用途" prop="cameraUse" label-width="120px">
  449. <el-select v-model="form.cameraUse" placeholder="请选择摄像头用途" :disabled="true" style="width: 360px;">
  450. <el-option
  451. v-for="dict in dict.type.camera_use"
  452. :key="dict.value"
  453. :label="dict.label"
  454. :value="dict.value"
  455. ></el-option>
  456. </el-select>
  457. </el-form-item>
  458. </el-col>
  459. <el-col :span="12">
  460. <el-form-item label="所属区域" prop="cameraRegion" label-width="120px">
  461. <el-input v-model="form.cameraRegion" :disabled="true"/>
  462. </el-form-item>
  463. <el-form-item label="运营商类型" prop="operatorType" label-width="120px">
  464. <el-select v-model="form.operatorType" placeholder="请选择运营商类型" :disabled="true"
  465. style="width: 360px;"
  466. >
  467. <el-option
  468. v-for="dict in dict.type.operator_type"
  469. :key="dict.value"
  470. :label="dict.label"
  471. :value="dict.value"
  472. ></el-option>
  473. </el-select>
  474. </el-form-item>
  475. <el-form-item label="半径" prop="cameraRadius" label-width="120px">
  476. <el-input type="number" v-model="form.cameraRadius" :disabled="true"/>
  477. </el-form-item>
  478. <el-form-item label="高度" prop="height" label-width="120px">
  479. <el-input type="number" v-model="form.height" :disabled="true"/>
  480. </el-form-item>
  481. <el-form-item label="经度" prop="longitude" label-width="120px">
  482. <el-input type="number" v-model="form.longitude" :disabled="true"/>
  483. </el-form-item>
  484. <el-form-item label="纬度" prop="latitude" label-width="120px">
  485. <el-input type="number" v-model="form.latitude" :disabled="true"/>
  486. </el-form-item>
  487. <el-form-item label="ip" prop="cameraIp" label-width="120px">
  488. <el-input v-model="form.cameraIp" :disabled="true"/>
  489. </el-form-item>
  490. <el-form-item label="端口" prop="cameraPort" label-width="120px">
  491. <el-input v-model="form.cameraPort" :disabled="true"/>
  492. </el-form-item>
  493. <el-form-item label="可用系统" prop="list" label-width="120px">
  494. <el-select v-model="form.list" multiple placeholder="请选择用途" :disabled="true" style="width: 360px;">
  495. <el-option
  496. v-for="dict in dict.type.camera_system"
  497. :key="dict.value"
  498. :label="dict.label"
  499. :value="dict.value"
  500. ></el-option>
  501. </el-select>
  502. </el-form-item>
  503. </el-col>
  504. </el-row>
  505. </el-form>
  506. <div slot="footer" class="dialog-footer">
  507. <el-button @click="cancelSel">取 消</el-button>
  508. </div>
  509. </el-dialog>
  510. <!-- 超图弹框 -->
  511. <ISuperMap ref="ISuperMap" v-if="ISuperMapvisible" @send="send"/>
  512. <!--<el-dialog :title="titleLongitude" :visible.sync="showLongitude">-->
  513. <!--<el-input v-show="false" v-model="form.longitude"></el-input>-->
  514. <!--<el-input v-show="false" v-model="form.latitude"></el-input>-->
  515. <!--<supermap style="width: 100%;height: 500px;" :mapDiv="'cameraMap'" :mapSite="{doubleClickZoom:false}"-->
  516. <!--:codes="['9fa5']" :isSideBySide="false" :showLatLng="showLatLng"></supermap>-->
  517. <!--<el-button type="primary" @click="showLongitude=false">确 定</el-button>-->
  518. <!--</el-dialog>-->
  519. <!-- 通道管理弹框 -->
  520. <el-dialog :title="titleCameraChannel" :visible.sync="showCameraChannel" @close="closeDialog">
  521. <camerachannel v-if="showCameraChannel" ref="cameraChannel" :sonId="sonIdValue" :channelCameraIp="channelCameraIp"
  522. :channelCameraPort="channelCameraPort" :channelCameraAccount="channelCameraAccount"
  523. :channelCameraPasword="channelCameraPasword" :deviceCode="deviceCode"
  524. :deviceSn="deviceSn" :deviceProtocolType="deviceProtocolType" :deviceLoginType="deviceLoginType"
  525. :cameraUse="cameraUse" style="width: 100%;height: 100%;"
  526. ></camerachannel>
  527. </el-dialog>
  528. <!-- 运行历史弹框 -->
  529. <el-dialog :title="titleCameraLog" :visible.sync="showCameraLog" @close="closeDialog">
  530. <camerastatelog v-if="showCameraLog" ref="cameraLog" :sonId="sonIdValue"
  531. style="width: 100%;height: 100%;"
  532. ></camerastatelog>
  533. </el-dialog>
  534. <!-- 部门管理弹框 -->
  535. <el-dialog :title="titleCameraDept" :visible.sync="showCameraDept" @close="closeDialog">
  536. <aidevicedept v-if="showCameraDept" ref="cameraDept" :sonId="sonIdValue" :sonCode="sonCodeValue"
  537. :sonName="sonNameValue" :sonType="sonTypeValue" style="width: 100%;height: 100%;"
  538. ></aidevicedept>
  539. </el-dialog>
  540. <!-- 事件管理弹框 -->
  541. <el-dialog :title="titleCameraEvent" :visible.sync="showCameraEvent" @close="closeDialog">
  542. <!--<cameraevent v-if="showCameraEvent" ref="cameraEvent" :sonId="sonIdValue"
  543. style="width: 100%;height: 100%;"></cameraevent>-->
  544. <aideviceevent v-if="showCameraEvent" ref="cameraEvent" :sonId="sonIdValue" :sonCode="sonCodeValue"
  545. :sonName="sonNameValue" :sonType="sonTypeValue"
  546. style="width: 100%;height: 100%;"
  547. ></aideviceevent>
  548. </el-dialog>
  549. <!--大华预览回放窗口-->
  550. <el-dialog :title="dssPreviewTitle" :visible.sync="dssPreviewVisible" v-if="dssPreviewVisible"
  551. customClass="videoCustomWidth"
  552. @close="destroy" append-to-body
  553. >
  554. <div id="dssPreview" style="width:1020px;height:625px;position:relative;"></div>
  555. </el-dialog>
  556. <!--海康预览回放窗口-->
  557. <!--预览-->
  558. <el-dialog :title="cameraTitle" :visible.sync="cameraVisible" v-if="cameraVisible" customClass="videoCustomWidth"
  559. @close="hikDisconnect" append-to-body
  560. >
  561. <div id="playWnd" style="width:1020px;height:625px;position:relative;"></div>
  562. </el-dialog>
  563. <!--回放-->
  564. <el-dialog :title="cameraTitlePlayBack" :visible.sync="cameraVisiblePlayBack" v-if="cameraVisiblePlayBack"
  565. customClass="videoCustomWidthPlayBack"
  566. @close="cancelEventLocationShow()"
  567. >
  568. <div class="item" style="z-index: 99999"><span class="label">回放开始时间:</span>
  569. <input type="datetime-local" value-format="yyyy-MM-dd HH:mm:ss" v-model="startTimeStamp"/>
  570. <span class="label">回放结束时间:</span>
  571. <input type="datetime-local" value-format="yyyy-MM-dd HH:mm:ss" v-model="endTimeStamp"/>
  572. </div>
  573. <div class="item" style="margin-top: 20px;margin-left: -20px;">
  574. <button style="width:90px;padding:0;margin:0;" class="btn" @click="startPlayback">回放</button>
  575. <button style="width:90px;padding:0;margin:0;" class="btn" @click="stopAllPlayback">停止全部回放</button>
  576. </div>
  577. <div style="width:1020px;height:625px;position:relative;">
  578. <div id="playWndPlayBack" class="playWndPlayBack" style="left: 0px; top: 0px;"></div>
  579. </div>
  580. </el-dialog>
  581. <haikang-t-v-walls ref="haikangTVWalls"></haikang-t-v-walls>
  582. </div>
  583. </template>
  584. <script>
  585. import {
  586. listCamera,
  587. listCameraByDept,
  588. getCamera,
  589. delCamera,
  590. addCamera,
  591. updateCamera,
  592. selectchannelCodeByCameraId,
  593. listStateLog,
  594. synchronizeOfflineCamera
  595. } from '@/api/centerMonitor/camera/camera'
  596. import { listCamerachannel } from '@/api/centerMonitor/camera/camerachannel'
  597. import deptselector from '@/views/components/deptselector'
  598. import supermap from '@/views/components/supermap'
  599. import ISuperMap from '@/views/components/ISuperMap'
  600. import camerachannel from './camerachannel'
  601. import camerastatelog from './camerastatelog'
  602. import aidevicedept from '@/views/centerMonitor/aidevicedept/aidevicedept'
  603. import aideviceevent from '@/views/centerMonitor/aideviceevent/aideviceevent'
  604. import haikangTVWalls from '@/views/components/haikangTVWalls.vue'
  605. import { checkNonnegativeInteger, checkLat, checkLon } from '@/api/system/rules'
  606. import {
  607. selectConfigKey
  608. } from '@/api/system/config'
  609. // import moment from 'moment';
  610. /** ----------------------------------摄像头预览开始------------------------------------- */
  611. import { getDahuaVideoServer } from '@/api/centerMonitor/dahua/dahua'
  612. import DHWs from '@/daHua/lib/DHWs'
  613. import {
  614. getHaiKangVideoServer
  615. } from '@/api/haikang/haikang'
  616. /** ----------------------------------摄像头预览结束------------------------------------- */
  617. export default {
  618. name: 'Camera',
  619. metaInfo() {
  620. return {
  621. title: this.pageName
  622. }
  623. },
  624. components: {
  625. deptselector,
  626. supermap,
  627. camerachannel,
  628. camerastatelog,
  629. aidevicedept,
  630. aideviceevent,
  631. ISuperMap,
  632. haikangTVWalls
  633. },
  634. dicts: ['camera_system', 'operator_type', 'camera_factory', 'camera_type', 'camera_use', 'device_status', 'camera_offline_reason', 'convergence_platform'],
  635. data() {
  636. let disabledDate = date => {
  637. return date.getTime() > new Date().getTime() - 24 * 60 * 60 * 1000
  638. }
  639. return {
  640. pageName: '态势感知平台',
  641. pickerOptions: {
  642. disabledDate,
  643. // selectableRange 用来限制时分秒的选择,这里要求只能选择当前时间之后到0点的时间点 但应该只限今天
  644. selectableRange: '00:00:00 - 23:59:59'
  645. },
  646. /***海康***/
  647. cameraTitle: '',
  648. cameraVisible: false,
  649. cameraTitlePlayBack: '',
  650. cameraVisiblePlayBack: false,
  651. cameraIndexCodePlayBack: '',
  652. startTimeStamp: '',
  653. endTimeStamp: '',
  654. initCount: 0,
  655. pubKey: '',
  656. oWebControl: null,
  657. /***大华***/
  658. dssPreviewTitle: '',
  659. dssPreviewVisible: false,
  660. ctrl: 'ctrl1',
  661. active: 1,
  662. // 选中数组
  663. ids: [],
  664. //摄像头编码是否可编辑
  665. cameraCodeDisabled: true,
  666. // 遮罩层
  667. loading: true,
  668. // 选中数组
  669. cameraCodes: [],
  670. // 非单个禁用
  671. single: true,
  672. // 非多个禁用
  673. multiple: true,
  674. // 显示搜索条件
  675. showSearch: true,
  676. // 日期范围
  677. dateRange: [],
  678. // 总条数
  679. total: 0,
  680. // 摄像头表格数据
  681. cameraList: [],
  682. // 弹出层标题
  683. title: '',
  684. // 是否显示弹出层
  685. open: false,
  686. // 是否显示详情弹出层
  687. openSee: false,
  688. // 超图
  689. sign: 1,
  690. ISuperMapvisible: false,
  691. showLongitude: false,
  692. titleLongitude: '',
  693. // 通道
  694. showCameraChannel: false,
  695. titleCameraChannel: '',
  696. // 日志
  697. showCameraLog: false,
  698. titleCameraLog: '',
  699. // 部门
  700. showCameraDept: false,
  701. titleCameraDept: '',
  702. // 事件
  703. showCameraEvent: false,
  704. titleCameraEvent: '',
  705. //传递到子页面摄像头ID
  706. sonIdValue: null,
  707. //传递到子页面摄像头Code
  708. sonCodeValue: null,
  709. //传递到子页面摄像头Name
  710. sonNameValue: null,
  711. //传递到子页面设备类型
  712. sonTypeValue: null,
  713. //通道子页面传值
  714. channelCameraIp: null,
  715. channelCameraPort: null,
  716. channelCameraAccount: null,
  717. channelCameraPasword: null,
  718. cameraUse: null,
  719. deviceCode: null,
  720. deviceSn: null,
  721. deviceProtocolType: null,
  722. deviceLoginType: null,
  723. // 查询参数
  724. queryParams: {
  725. pageNum: 1,
  726. pageSize: 10,
  727. dataStatus: null,
  728. dataDeptId: null,
  729. cameraName: null,
  730. cameraIp: null,
  731. cameraPort: null,
  732. cameraAccount: null,
  733. cameraPasword: null,
  734. cameraCode: null,
  735. cameraFactory: null,
  736. convergencePlatform: null,
  737. cameraRegion: null,
  738. cameraRadius: null,
  739. height: null,
  740. longitude: null,
  741. latitude: null,
  742. operatorType: null,
  743. cameraUse: null,
  744. channelNum: null,
  745. workingStatus: null,
  746. cameraImg: null,
  747. deviceCode: null,
  748. deviceSn: null,
  749. deviceProtocolType: null,
  750. deviceLoginType: null
  751. },
  752. // 通道查询参数
  753. queryChannelParams: {
  754. pageNum: 1,
  755. pageSize: 10,
  756. dataStatus: null,
  757. cameraId: null,
  758. channelCode: null,
  759. channelName: null,
  760. channelType: null
  761. },
  762. cameraSystemList: [],
  763. // 表单参数
  764. form: {
  765. cameraImages: [],
  766. cameraImagesList: []
  767. },
  768. // 表单校验
  769. rules: {
  770. cameraName: [
  771. { required: true, message: '摄像头名称不能为空', trigger: 'blur' }
  772. ],
  773. // cameraIp: [
  774. // {
  775. // required: true,
  776. // pattern: /^(?:[1-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])$/,
  777. // message: "请输入正确的IP地址",
  778. // trigger: "blur",
  779. // validator: (rule, value, callback) => {
  780. // if (this.form.cameraFactory == 0 && !value.match(rule.pattern)) {
  781. // callback(new Error("请输入正确的IP地址"));
  782. // } else if (this.form.cameraFactory == 0 && !value) {
  783. // callback(new Error("IP不能为空"));
  784. // } else {
  785. // callback();
  786. // }
  787. // },
  788. // },
  789. // ],
  790. cameraIp: [
  791. {
  792. validator: (rule, value, callback) => {
  793. if (!value) {
  794. // 如果值为空,则不进行验证
  795. callback()
  796. } else {
  797. // 进行 IP 地址格式验证
  798. if (!value.match(/^(?:[1-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])$/)) {
  799. // 如果值不符合规定格式,则返回错误
  800. callback(new Error('请输入正确的IP地址'))
  801. } else {
  802. callback()
  803. }
  804. }
  805. }
  806. }
  807. ],
  808. cameraPort: [
  809. {
  810. validator: (rule, value, callback) => {
  811. if (!value) {
  812. callback()
  813. } else if (!value.match(/^[1-9]\d*$/)) {
  814. callback(new Error('请输入正确的端口'))
  815. } else {
  816. callback()
  817. }
  818. }
  819. }
  820. ],
  821. // cameraPort: [
  822. // {
  823. // validator: (rule, value, callback) => {
  824. // // 处理存入前的值
  825. // const processedValue = value === null ? '' : value;
  826. //
  827. // if (processedValue === "") {
  828. // // 如果值为空,则不进行验证
  829. // callback();
  830. // } else if (!/^[1-9]\d*$/.test(processedValue)) {
  831. // // 如果值不符合规定格式,则返回错误
  832. // callback(new Error("请输入正确的端口"));
  833. // } else {
  834. // callback();
  835. // }
  836. // },
  837. // },
  838. // ],
  839. // cameraAccount: [
  840. // {required: true, message: "账号不能为空", trigger: "blur",
  841. // validator: (rule, value, callback) => {
  842. // if (this.form.cameraFactory == 0 && !value) {
  843. // callback(new Error("账号不能为空"));
  844. // } else {
  845. // callback();
  846. // }
  847. // },
  848. //
  849. // },
  850. // ],
  851. // cameraPasword: [
  852. // {required: true, message: "密码不能为空", trigger: "blur",
  853. // validator: (rule, value, callback) => {
  854. // if (this.form.cameraFactory == 0 && !value) {
  855. // callback(new Error("密码不能为空"));
  856. // } else {
  857. // callback();
  858. // }
  859. // },
  860. // },
  861. // ],
  862. cameraCode: [
  863. { required: true, message: '摄像头编码不能为空', trigger: 'blur' }
  864. ],
  865. convergencePlatform: [
  866. { required: true, message: '融合平台不能为空', trigger: 'blur' }
  867. ],
  868. cameraFactory: [
  869. { required: true, message: '摄像头厂家不能为空', trigger: 'blur' }
  870. ],
  871. height: [
  872. { required: true, message: '高度不能为空', trigger: 'blur' }
  873. ],
  874. cameraRegion: [
  875. { required: true, message: '所属区域不能为空', trigger: 'blur' }
  876. ],
  877. cameraRadius: [
  878. { required: true, message: '半径不能为空', trigger: 'blur' },
  879. { validator: checkNonnegativeInteger, trigger: 'blur' }
  880. ],
  881. longitude: [
  882. { required: true, message: '经度不能为空', trigger: 'change' },
  883. { validator: checkLon, trigger: 'blur' }
  884. ],
  885. latitude: [
  886. { required: true, message: '纬度不能为空', trigger: 'change' },
  887. { validator: checkLat, trigger: 'blur' }
  888. ],
  889. list: [
  890. { required: true, message: '可用系统不能为空', trigger: 'blur' }
  891. ],
  892. cameraType: [
  893. { required: true, message: '摄像头类型不能为空', trigger: 'blur' }
  894. ],
  895. cameraUse: [
  896. { required: true, message: '摄像头用途不能为空', trigger: 'blur' }
  897. ]
  898. }
  899. }
  900. },
  901. activated: function() {
  902. let startTime = this.$route.query.startTime // 从url中获取startTime参数
  903. let endTime = this.$route.query.endTime // 从url中获取endTime参数
  904. if (startTime && endTime) {
  905. startTime = startTime + ' 00:00:00'
  906. endTime = endTime + ' 23:59:59'
  907. this.dateRange = [startTime, endTime]
  908. }
  909. this.queryParams.workingStatus = this.$route.query.workingStatus
  910. this.queryParams.deptId = this.$route.query.deptId
  911. this.queryParams.pageNum = 1
  912. if (this.queryParams.deptId != null && this.queryParams.workingStatus != null) {
  913. this.getListByDept()
  914. } else {
  915. this.getList()
  916. }
  917. },
  918. created() {
  919. //此处必须第二次调用 防止组件注册后直接F5刷新页面 导致不走getList方法
  920. this.getList()
  921. /** ----------------------------------摄像头预览开始------------------------------------- */
  922. const DHWsInstance = DHWs.getInstance()
  923. this.ws = DHWsInstance
  924. /** ----------------------------------摄像头预览结束------------------------------------- */
  925. },
  926. mounted() {
  927. this.cameraSystemList = this.dict.type.camera_system
  928. window.alertLoginFailed = this.alertLoginFailed// 登陆失败
  929. window.alertReinstall = this.alertReinstall// 请重新安装客户端
  930. setTimeout(() => {
  931. this.pageName = '全域视联平台'
  932. }, 2000)
  933. },
  934. methods: {
  935. isFormIncomplete() {
  936. return !this.form.cameraFactory || !this.form.cameraName || !this.form.cameraRegion || !this.form.cameraRadius || !this.form.height || !this.form.longitude || !this.form.latitude
  937. },
  938. login: function(row) { // 调用登录接口
  939. console.log('row', row)
  940. },
  941. next() {
  942. this.$refs['form'].validateField('longitude', (valid, message) => {
  943. if (valid == '') {
  944. this.$refs['form'].validateField('latitude', (valids, message) => {
  945. if (valids == '') {
  946. if (this.active++ > 5) this.active = 1
  947. }
  948. })
  949. }
  950. })
  951. },
  952. pre() {
  953. if (this.active-- < 1) this.active = 1
  954. },
  955. showMap() {
  956. this.ISuperMapvisible = true
  957. this.$nextTick(() => {
  958. this.$refs.ISuperMap.init(this.sign, {
  959. id: this.form.id,
  960. longitude: this.form.longitude,
  961. latitude: this.form.latitude,
  962. xiantude: this.form.longitude//this.form.longitude换成每个页面对应线或者面对应的字段
  963. })
  964. })
  965. },
  966. send(val) {
  967. if (val === true) {
  968. this.ISuperMapvisible = false
  969. return
  970. }
  971. if (this.sign === 1) {
  972. this.form.longitude = val.longitude
  973. this.form.latitude = val.latitude
  974. }
  975. if (this.sign === 2 || this.sign === 3) this.form.longitude = val.xiantude//this.form.longitude 换成对应的线或区域的字段
  976. this.ISuperMapvisible = false
  977. },
  978. showLatLng: function(lat, lng) {
  979. this.form.latitude = lat
  980. this.form.longitude = lng
  981. },
  982. // 取消按钮
  983. cancelSel() {
  984. this.openSee = false
  985. this.reset()
  986. },
  987. /** 查询摄像头详情 */
  988. handleSee(row) {
  989. this.reset()
  990. const id = row.id || this.ids
  991. getCamera(id).then(response => {
  992. this.form = response.data
  993. const selectList = []
  994. for (let index in this.form.list) {
  995. selectList.push(this.form.list[index].type)
  996. }
  997. this.form.list = selectList
  998. this.openSee = true
  999. this.title = '详情'
  1000. })
  1001. },
  1002. /** 查询摄像头列表 */
  1003. getList() {
  1004. this.loading = true
  1005. listCamera(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
  1006. this.cameraList = response.rows
  1007. this.total = response.total
  1008. this.loading = false
  1009. })
  1010. },
  1011. /** 查询摄像头列表 */
  1012. getListByDept() {
  1013. if (this.queryParams.workingStatus != null && this.queryParams.deptId != null) {
  1014. this.loading = true
  1015. listCameraByDept(this.queryParams).then(response => {
  1016. this.cameraList = response.rows
  1017. this.total = response.total
  1018. this.loading = false
  1019. })
  1020. } else {
  1021. // 执行查询所有列表的逻辑
  1022. this.getList()
  1023. }
  1024. },
  1025. /** 通道管理列表 */
  1026. handleCameraChannel(row) {
  1027. const id = row.id || this.ids
  1028. this.sonIdValue = id
  1029. this.channelCameraIp = row.cameraIp
  1030. this.channelCameraPort = row.cameraPort
  1031. this.channelCameraAccount = row.cameraAccount
  1032. this.channelCameraPasword = row.cameraPasword
  1033. this.cameraUse = row.cameraUse
  1034. this.deviceCode = row.deviceCode
  1035. this.deviceSn = row.deviceSn
  1036. this.deviceProtocolType = row.deviceProtocolType
  1037. this.deviceLoginType = row.deviceLoginType
  1038. this.showCameraChannel = true
  1039. this.titleCameraChannel = '通道管理列表'
  1040. },
  1041. /** 日志管理列表 */
  1042. handleCameraLog(row) {
  1043. const id = row.id || this.ids
  1044. this.sonIdValue = id
  1045. this.showCameraLog = true
  1046. this.titleCameraLog = '运行历史列表'
  1047. },
  1048. /** 部门管理列表 */
  1049. handleCameraDept(row) {
  1050. const id = row.id
  1051. this.sonIdValue = id
  1052. this.sonTypeValue = 'device_type_1'
  1053. this.sonCodeValue = row.cameraCode
  1054. this.sonNameValue = row.cameraName
  1055. this.showCameraDept = true
  1056. this.titleCameraDept = '部门管理列表'
  1057. },
  1058. /** 事件类型管理列表 */
  1059. handleCameraEvent(row) {
  1060. const id = row.id
  1061. this.sonIdValue = id
  1062. this.sonTypeValue = 'device_type_1'
  1063. this.sonCodeValue = row.cameraCode
  1064. this.sonNameValue = row.cameraName
  1065. this.showCameraEvent = true
  1066. this.titleCameraEvent = '事件类型管理列表'
  1067. },
  1068. closeDialog() {
  1069. this.showCameraChannel = false
  1070. this.showCameraDept = false
  1071. this.showCameraEvent = false
  1072. this.showCameraLog = false
  1073. },
  1074. // 取消按钮
  1075. cancel() {
  1076. this.open = false
  1077. this.reset()
  1078. },
  1079. setDataDeptId(e) {
  1080. this.form.dataDeptId = e
  1081. this.queryParams.dataDeptId = e
  1082. },
  1083. // 表单重置
  1084. reset() {
  1085. this.active = 1
  1086. this.form = {
  1087. id: null,
  1088. createBy: null,
  1089. createTime: null,
  1090. updateBy: null,
  1091. updateTime: null,
  1092. dataStatus: 'data_status_1',
  1093. dataDeptId: null,
  1094. cameraName: null,
  1095. cameraIp: null,
  1096. cameraPort: null,
  1097. cameraAccount: null,
  1098. cameraPasword: null,
  1099. cameraCode: null,
  1100. cameraFactory: null,
  1101. convergencePlatform: null,
  1102. cameraRegion: null,
  1103. cameraRadius: null,
  1104. height: null,
  1105. longitude: null,
  1106. latitude: null,
  1107. workingStatus: '0',
  1108. deptId: null
  1109. }
  1110. this.resetForm('form')
  1111. },
  1112. /** 搜索按钮操作 */
  1113. handleQuery() {
  1114. this.queryParams.pageNum = 1
  1115. this.getList()
  1116. },
  1117. /** 重置按钮操作 */
  1118. resetQuery() {
  1119. this.dateRange = []
  1120. this.resetForm('queryForm')
  1121. this.handleQuery()
  1122. },
  1123. /** 新增按钮操作 */
  1124. handleAdd() {
  1125. //设置新增时可以改摄像头编码
  1126. this.cameraCodeDisabled = false
  1127. this.reset()
  1128. this.open = true
  1129. this.title = '添加摄像头'
  1130. },
  1131. /** 修改按钮操作 */
  1132. handleUpdate(row) {
  1133. this.reset()
  1134. //设置修改时不能改摄像头编码
  1135. this.cameraCodeDisabled = false
  1136. const id = row.id || this.ids
  1137. getCamera(id).then(response => {
  1138. this.form = response.data
  1139. const updateList = []
  1140. for (let index in this.form.list) {
  1141. updateList.push(this.form.list[index].type)
  1142. }
  1143. this.form.list = updateList
  1144. this.open = true
  1145. this.title = '修改摄像头'
  1146. })
  1147. },
  1148. /** 删除按钮操作 */
  1149. handleDelete(row) {
  1150. const ids = row.id || this.ids
  1151. this.$modal.confirm('是否确认删除摄像头数据?').then(function() {
  1152. return delCamera(ids)
  1153. }).then(() => {
  1154. this.getList()
  1155. this.$modal.msgSuccess('删除成功')
  1156. }).catch(() => {
  1157. })
  1158. },
  1159. // 多选框选中数据
  1160. handleSelectionChange(selection) {
  1161. this.ids = selection.map(item => item.id)
  1162. this.single = selection.length !== 1
  1163. this.multiple = !selection.length
  1164. },
  1165. //绘制围栏
  1166. drawFence(row) {
  1167. window.open('http://' + row.cameraIp + ':1036?username=sooka&password=Sooka6688!!')
  1168. },
  1169. /** ----------------------------------摄像头预览开始------------------------------------- */
  1170. preview(row) {
  1171. selectConfigKey('DssVersion').then(res => {
  1172. if (this.ws.getLocalDssVersion() != res.data) {
  1173. this.$modal.confirm('系统检测到新客户端版本,请更新后使用', '系统提示', {
  1174. confirmButtonText: '确定',
  1175. cancelButtonText: '取消',
  1176. type: 'warning'
  1177. }).then(() => {
  1178. selectConfigKey('video_plugin_url').then(response => {
  1179. window.open(response.data)
  1180. })
  1181. }).catch(() => {
  1182. return
  1183. })
  1184. return
  1185. }
  1186. const convergencePlatform = row.convergencePlatform
  1187. const cameraCode = row.cameraCode
  1188. const cameraName = row.cameraName
  1189. const deviceSn = row.deviceSn
  1190. const deviceCode = row.deviceCode
  1191. const deviceProtocolType = row.deviceProtocolType
  1192. const deviceLoginType = row.deviceLoginType
  1193. console.log(convergencePlatform)
  1194. //如果是大华摄像头
  1195. if (convergencePlatform === '1') {
  1196. selectchannelCodeByCameraId(row.id).then(res => {
  1197. if (cameraCode != null && cameraCode.length > 0) {
  1198. this.dssPreviewTitle = '视频预览'
  1199. this.dssPreviewVisible = true
  1200. this.preview_dss(cameraCode, cameraName, deviceCode, deviceSn, deviceProtocolType, deviceLoginType)
  1201. } else {
  1202. this.$modal.msg('没有匹配到相对应摄像头!!!')
  1203. }
  1204. })
  1205. } else {
  1206. //海康头
  1207. console.log('haikang')
  1208. const cameraIndexCode = row.cameraCode
  1209. this.$refs.haikangTVWalls.showTVWall(cameraIndexCode, 0)
  1210. }
  1211. })
  1212. },
  1213. /** ----------------------------------摄像头预览结束------------------------------------- */
  1214. /** ----------------------------------摄像头回放开始------------------------------------- */
  1215. playBack(row) {
  1216. selectConfigKey('DssVersion').then(res => {
  1217. if (this.ws.getLocalDssVersion() != res.data) {
  1218. this.$modal.confirm('系统检测到新客户端版本,请更新后使用', '系统提示', {
  1219. confirmButtonText: '确定',
  1220. cancelButtonText: '取消',
  1221. type: 'warning'
  1222. }).then(() => {
  1223. selectConfigKey('video_plugin_url').then(response => {
  1224. window.open(response.data)
  1225. })
  1226. }).catch(() => {
  1227. return
  1228. })
  1229. return
  1230. }
  1231. const cameraCode = row.cameraCode
  1232. const cameraName = row.cameraName
  1233. const deviceSn = row.deviceSn
  1234. const deviceCode = row.deviceCode
  1235. const deviceProtocolType = row.deviceProtocolType
  1236. const deviceLoginType = row.deviceLoginType
  1237. const convergencePlatform = row.convergencePlatform
  1238. //如果是大华摄像头
  1239. if (convergencePlatform === '1') {
  1240. selectchannelCodeByCameraId(row.id).then(res => {
  1241. if (cameraCode != null && cameraCode.length > 0) {
  1242. this.dssPreviewTitle = '视频回放'
  1243. this.dssPreviewVisible = true
  1244. this.playBack_dss(cameraCode, cameraName, deviceCode, deviceSn, deviceProtocolType, deviceLoginType)
  1245. } else {
  1246. this.$modal.msg('没有匹配到相对应摄像头!!!')
  1247. }
  1248. })
  1249. } else {
  1250. //海康头
  1251. console.log('haikang')
  1252. const cameraIndexCode = row.cameraCode
  1253. this.$refs.haikangTVWalls.showTVWall(cameraIndexCode, 1)
  1254. }
  1255. })
  1256. },
  1257. /** ----------------------------------摄像头回放结束------------------------------------- */
  1258. /** ----------------------------------大华摄像头预览开始------------------------------------- */
  1259. alertLogin: function() {
  1260. this.$modal.msg('登录中....')
  1261. },
  1262. alertLoginSuccess: function() {
  1263. this.$modal.msgSuccess('登录成功!')
  1264. },
  1265. alertLoginFailed: function() {
  1266. this.$modal.msgError('登陆失败!')
  1267. },
  1268. alertReinstall: function() {
  1269. this.$modal.msgWarning('请重新安装客户端')
  1270. },
  1271. /** 预览按钮操作 */
  1272. preview_dss(cameraCode, cameraName, deviceCode, deviceSn, deviceProtocolType, deviceLoginType) {
  1273. getDahuaVideoServer().then(newResponse => {
  1274. this.ws.detectConnectQt().then(res => {
  1275. console.log('检测连接结果:', res)
  1276. if (res) { // 连接客户端成功
  1277. this.alertLogin()
  1278. this.ws.login({
  1279. loginIp: newResponse.loginIp,
  1280. loginPort: newResponse.loginPort,
  1281. userName: newResponse.userName,
  1282. userPwd: newResponse.userPwd,
  1283. token: '',
  1284. https: 1
  1285. })
  1286. console.log('登录结果:', res)
  1287. this.ws.on('loginState', (res) => {
  1288. this.isLogin = res
  1289. if (res) {
  1290. this.alertLoginSuccess()
  1291. this.activePanel = 'key2'
  1292. // this.realTimeVideoDialog(channelCode)
  1293. let channelList = []
  1294. for (let i = 0; i < cameraCode.length; i++) {
  1295. let code = { 'channelId': cameraCode }
  1296. channelList.push(code)
  1297. }
  1298. // 构建参数对象
  1299. let params
  1300. if (deviceCode === null && deviceSn === null && deviceProtocolType === null && deviceLoginType === null) {
  1301. params = this.careteListJson(cameraCode, cameraName)
  1302. } else {
  1303. params = this.careteListJson(cameraCode, cameraName, deviceCode, deviceSn, deviceProtocolType, deviceLoginType)
  1304. }
  1305. // 过滤掉 null 参数
  1306. if (deviceCode === null) delete params.deviceCode
  1307. if (deviceSn === null) delete params.deviceSn
  1308. if (deviceProtocolType === null) delete params.deviceProtocolType
  1309. if (deviceLoginType === null) delete params.deviceLoginType
  1310. this.create(params, channelList, 'dssPreview', 'realMonitorUI')
  1311. this.playRealMonitorVideo(channelList)
  1312. } else {
  1313. this.alertLoginFailed()
  1314. }
  1315. })
  1316. } else { // 连接客户端失败
  1317. this.alertReinstall()
  1318. }
  1319. })
  1320. })
  1321. },
  1322. careteListJson(cameraCode, cameraName, deviceCode = null, deviceSn = null, deviceProtocolType = null, deviceLoginType = null) {
  1323. const treeLabels = [{
  1324. 'id': null,
  1325. 'labelCode': '999',
  1326. 'labelName': '电视墙',
  1327. 'cameraType': null,
  1328. 'parentLabelCode': ''
  1329. },
  1330. {
  1331. 'id': null,
  1332. 'labelCode': cameraCode,
  1333. 'labelName': cameraName,
  1334. 'cameraType': '1',
  1335. 'parentLabelCode': '999'
  1336. }]
  1337. const channelDates = []
  1338. for (let i in cameraCode) {
  1339. let currentParams = {
  1340. 'channelCode': cameraCode,
  1341. 'channelName': cameraName,
  1342. 'channelSn': null,
  1343. 'cameraType': '1',
  1344. 'online': '1',
  1345. 'cameraCode': '1'
  1346. }
  1347. if (deviceCode !== null) {
  1348. currentParams.deviceCode = deviceCode
  1349. }
  1350. if (deviceSn !== null) {
  1351. currentParams.deviceSn = deviceSn
  1352. }
  1353. if (deviceProtocolType !== null) {
  1354. currentParams.deviceProtocolType = deviceProtocolType
  1355. }
  1356. if (deviceLoginType !== null) {
  1357. currentParams.deviceLoginType = deviceLoginType
  1358. }
  1359. channelDates.push(currentParams)
  1360. }
  1361. const labelChannels = [{
  1362. 'labelCode': cameraCode,
  1363. 'channelDates': channelDates
  1364. }]
  1365. let tvListJson = [{
  1366. 'switchTab': '2',
  1367. 'treeLabels': treeLabels,
  1368. 'labelChannels': labelChannels
  1369. }]
  1370. console.log('11111111111111111111111111', {
  1371. cameraCode, cameraName, deviceCode, deviceSn, deviceProtocolType, deviceLoginType
  1372. })
  1373. return tvListJson
  1374. },
  1375. create(tvListJson, channelList, domId, ctrlType) { // 调用创建控件接口
  1376. let _this = this
  1377. const params = [
  1378. {
  1379. 'ctrlType': ctrlType,
  1380. 'ctrlCode': 'ctrl1',
  1381. 'ctrlProperty': {
  1382. 'displayMode': 1,
  1383. 'splitNum': 1,
  1384. 'channelList': [
  1385. {
  1386. 'channelId': ''
  1387. }
  1388. ]
  1389. },
  1390. 'visible': true,
  1391. 'domId': domId
  1392. }
  1393. ]
  1394. this.setPos(domId)
  1395. this.customizeTree(tvListJson)
  1396. _this.ws.createCtrl(params)
  1397. },
  1398. setPos(domId) {
  1399. let target = document.getElementById(domId)
  1400. target.style.right = `19px`
  1401. target.style.top = `-20px`
  1402. target.style.width = `1070px`
  1403. target.style.height = `700px`
  1404. if (document.createEvent) {
  1405. var event = document.createEvent('HTMLEvents')
  1406. event.initEvent('resize', true, true)
  1407. window.dispatchEvent(event)
  1408. } else if (document.createEventObject) {
  1409. window.fireEvent('onresize')
  1410. }
  1411. },
  1412. destroy() { // 调用销毁控件接口
  1413. if (!this.isLogin) {
  1414. this.$modal.msgWarning('正在登陆客户端,请稍等......')
  1415. return false
  1416. }
  1417. const ctrls = this.ws.ctrls.map(i => {
  1418. if (i.ctrlCode === this.ctrl) {
  1419. return i.ctrlCode
  1420. }
  1421. })
  1422. this.ws.destroyCtrl(ctrls)
  1423. },
  1424. customizeTree(tvListJson) { // 调用控件接口树
  1425. const config = this.ws.config
  1426. const { loginIp, userCode } = config
  1427. this.ws.postMessage('customizeTree', {
  1428. loginIp,
  1429. userCode,
  1430. params: {
  1431. array: tvListJson
  1432. }
  1433. })
  1434. },
  1435. playRealMonitorVideo(array) { // 自定义设备树自动播放指定通道编码视频
  1436. const config = this.ws.config
  1437. const { loginIp, userCode } = config
  1438. this.ws.postMessage('playRealMonitorVideo', {
  1439. loginIp,
  1440. userCode,
  1441. params: {
  1442. ctrlCode: 'ctrl1',
  1443. array: array
  1444. }
  1445. })
  1446. },
  1447. /** ----------------------------------大华摄像头预览结束------------------------------------- */
  1448. /** ----------------------------------大华摄像头回放开始------------------------------------- */
  1449. /** 预览按钮操作 */
  1450. // playBack_dss(channelCode, channelName,cameraCode,cameraName) {
  1451. playBack_dss(cameraCode, cameraName, deviceCode, deviceSn, deviceProtocolType, deviceLoginType) {
  1452. getDahuaVideoServer().then(newResponse => {
  1453. this.ws.detectConnectQt().then(res => {
  1454. if (res) { // 连接客户端成功
  1455. this.alertLogin()
  1456. this.ws.login({
  1457. loginIp: newResponse.loginIp,
  1458. loginPort: newResponse.loginPort,
  1459. userName: newResponse.userName,
  1460. userPwd: newResponse.userPwd,
  1461. token: '',
  1462. https: 1
  1463. })
  1464. this.ws.on('loginState', (res) => {
  1465. this.isLogin = res
  1466. if (res) {
  1467. this.alertLoginSuccess()
  1468. this.activePanel = 'key2'
  1469. let channelList = []
  1470. for (let i = 0; i < cameraCode.length; i++) {
  1471. let code = { 'channelId': cameraCode }
  1472. channelList.push(code)
  1473. }
  1474. this.create(this.careteListJson(cameraCode, cameraName, deviceCode, deviceSn, deviceProtocolType, deviceLoginType), channelList, 'dssPreview', 'playbackUI')
  1475. } else {
  1476. this.alertLoginFailed()
  1477. }
  1478. })
  1479. } else { // 连接客户端失败
  1480. this.alertReinstall()
  1481. }
  1482. })
  1483. })
  1484. },
  1485. /** ----------------------------------大华摄像头回放结束------------------------------------- */
  1486. /** ----------------------------------海康摄像头预览开始------------------------------------- */
  1487. /** 预览按钮操作 */
  1488. preview_hik(row) {
  1489. let that = this
  1490. let cameraCode = row.cameraCode
  1491. getHaiKangVideoServer({ cameraCode: cameraCode }).then(newResponse => {
  1492. if (newResponse.code == 200) {
  1493. that.cameraVisible = true
  1494. that.cameraTitle = '摄像头-' + newResponse.data.cameraName
  1495. that.initPlugin(newResponse.data.appkey, newResponse.data.loginIp, newResponse.data.secret, newResponse.data.loginPort)
  1496. setTimeout(function() {
  1497. that.playhk(newResponse.data.channelCode)
  1498. }, 5000)
  1499. }
  1500. })
  1501. },
  1502. replayPreview_hik(row) {
  1503. const cameraCodes = row.cameraCode || this.cameraCodes
  1504. let that = this
  1505. that.cameraVisible = true
  1506. that.cameraTitle = '查看电视墙'
  1507. that.initPluginTvWall()
  1508. setTimeout(function() {
  1509. for (let j = 0; j < cameraCodes.length; j++) {
  1510. getHaiKangVideoServer({ cameraCode: cameraCodes[j] }).then(newResponse => {
  1511. if (newResponse.code == 200) {
  1512. that.playhk(newResponse.data.channelCode)
  1513. }
  1514. })
  1515. }
  1516. }, 3000)
  1517. },
  1518. cancelEventLocationShow() {
  1519. if (this.oWebControl != null) {
  1520. this.oWebControl.JS_HideWnd() // 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题
  1521. this.oWebControl.JS_Disconnect().then(function() { // 断开与插件服务连接成功
  1522. },
  1523. function() { // 断开与插件服务连接失败
  1524. })
  1525. }
  1526. this.cameraIndexCodePlayBack = ''
  1527. },
  1528. /** 回放预览按钮操作 */
  1529. // playBack(row) {
  1530. // let that = this;
  1531. // let cameraCode = row.cameraCode;
  1532. // getHaiKangVideoServer({cameraCode: cameraCode}).then(newResponse => {
  1533. // if (newResponse.code == 200) {
  1534. // that.cameraVisiblePlayBack = true
  1535. // that.cameraTitlePlayBack = '摄像头-回放-' + newResponse.data.cameraName
  1536. // that.initPluginPlayBack()
  1537. // this.cameraIndexCodePlayBack = newResponse.data.channelCode
  1538. // }
  1539. // })
  1540. // },
  1541. startPlayback() {
  1542. //录像回放功能
  1543. var cameraIndexCode = this.cameraIndexCodePlayBack //获取输入的监控点编号值,必填
  1544. var startTimeStamp = new Date(this.startTimeStamp).getTime() //回放开始时间戳,必填
  1545. var endTimeStamp = new Date(this.endTimeStamp).getTime() //回放结束时间戳,必填
  1546. var recordLocation = 0 //录像存储位置:0-中心存储,1-设备存储
  1547. var transMode = 1 //传输协议:0-UDP,1-TCP
  1548. var gpuMode = 0 //是否启用GPU硬解,0-不启用,1-启用
  1549. var wndId = -1 //播放窗口序号(在2x2以上布局下可指定播放窗口)
  1550. this.oWebControl.JS_RequestInterface({
  1551. funcName: 'startPlayback',
  1552. argument: JSON.stringify({
  1553. cameraIndexCode: cameraIndexCode, //监控点编号
  1554. startTimeStamp: Math.floor(startTimeStamp / 1000).toString(), //录像查询开始时间戳,单位:秒
  1555. endTimeStamp: Math.floor(endTimeStamp / 1000).toString(), //录像结束开始时间戳,单位:秒
  1556. recordLocation: recordLocation, //录像存储类型:0-中心存储,1-设备存储
  1557. transMode: transMode, //传输协议:0-UDP,1-TCP
  1558. gpuMode: gpuMode, //是否启用GPU硬解,0-不启用,1-启用
  1559. wndId: wndId //可指定播放窗口
  1560. })
  1561. })
  1562. },
  1563. stopAllPlayback() {
  1564. //录像回放停止
  1565. this.oWebControl.JS_RequestInterface({
  1566. funcName: 'stopAllPlayback'
  1567. })
  1568. },
  1569. // 创建播放实例--回放
  1570. initPluginPlayBack() {
  1571. let that = this
  1572. that.oWebControl = new WebControl({
  1573. szPluginContainer: 'playWndPlayBack', // 指定容器id
  1574. iServicePortStart: 15900, // 指定起止端口号,建议使用该值
  1575. iServicePortEnd: 15909,
  1576. szClassId: '23BF3B0A-2C56-4D97-9C03-0CB103AA8F11', // 用于IE10使用ActiveX的clsid
  1577. cbConnectSuccess: function() { // 创建WebControl实例成功
  1578. that.oWebControl.JS_StartService('window', { // WebControl实例创建成功后需要启动服务
  1579. dllPath: './VideoPluginConnect.dll' // 值"./VideoPluginConnect.dll"写死
  1580. }).then(function() { // 启动插件服务成功
  1581. that.oWebControl.JS_SetWindowControlCallback({ // 设置消息回调
  1582. cbIntegrationCallBack: cbIntegrationCallBack
  1583. })
  1584. that.oWebControl.JS_CreateWnd('playWndPlayBack', 1020, 600).then(function() { //JS_CreateWnd创建视频播放窗口,宽高可设定
  1585. that.initPlayBack() // 创建播放实例成功后初始化
  1586. })
  1587. }, function() { // 启动插件服务失败
  1588. })
  1589. },
  1590. cbConnectError: function() { // 创建WebControl实例失败
  1591. that.oWebControl = null
  1592. $('#playWndPlayBack').html('插件未启动,正在尝试启动,请稍候...')
  1593. WebControl.JS_WakeUp('VideoWebPlugin://') // 程序未启动时执行error函数,采用wakeup来启动程序
  1594. initCount++
  1595. if (initCount < 3) {
  1596. setTimeout(function() {
  1597. that.initPluginPlayBack()
  1598. }, 3000)
  1599. } else {
  1600. $('#playWndPlayBack').html('插件启动失败,请检查插件是否安装!')
  1601. }
  1602. },
  1603. cbConnectClose: function(bNormalClose) {
  1604. // 异常断开:bNormalClose = false
  1605. // JS_Disconnect正常断开:bNormalClose = true
  1606. console.log('cbConnectClose')
  1607. that.oWebControl = null
  1608. }
  1609. })
  1610. },
  1611. // 创建播放实例电视墙
  1612. initPluginTvWall() {
  1613. let that = this
  1614. that.oWebControl = new WebControl({
  1615. szPluginContainer: 'playWnd', // 指定容器id
  1616. iServicePortStart: 15900, // 指定起止端口号,建议使用该值
  1617. iServicePortEnd: 15909,
  1618. szClassId: '23BF3B0A-2C56-4D97-9C03-0CB103AA8F11', // 用于IE10使用ActiveX的clsid
  1619. cbConnectSuccess: function() { // 创建WebControl实例成功
  1620. that.oWebControl.JS_StartService('window', { // WebControl实例创建成功后需要启动服务
  1621. dllPath: './VideoPluginConnect.dll' // 值"./VideoPluginConnect.dll"写死
  1622. }).then(function() { // 启动插件服务成功
  1623. that.oWebControl.JS_SetWindowControlCallback({ // 设置消息回调
  1624. cbIntegrationCallBack: cbIntegrationCallBack
  1625. })
  1626. that.oWebControl.JS_CreateWnd('playWnd', 1020, 600).then(function() { //JS_CreateWnd创建视频播放窗口,宽高可设定
  1627. that.initTvWall() // 创建播放实例成功后初始化
  1628. })
  1629. }, function() { // 启动插件服务失败
  1630. })
  1631. },
  1632. cbConnectError: function() { // 创建WebControl实例失败
  1633. that.oWebControl = null
  1634. $('#playWnd').html('插件未启动,正在尝试启动,请稍候...')
  1635. WebControl.JS_WakeUp('VideoWebPlugin://') // 程序未启动时执行error函数,采用wakeup来启动程序
  1636. initCount++
  1637. if (initCount < 3) {
  1638. setTimeout(function() {
  1639. that.initPluginTvWall()
  1640. }, 3000)
  1641. } else {
  1642. $('#playWnd').html('插件启动失败,请检查插件是否安装!')
  1643. }
  1644. },
  1645. cbConnectClose: function(bNormalClose) {
  1646. // 异常断开:bNormalClose = false
  1647. // JS_Disconnect正常断开:bNormalClose = true
  1648. console.log('cbConnectClose')
  1649. that.oWebControl = null
  1650. }
  1651. })
  1652. },
  1653. //初始化回放
  1654. initPlayBack() {
  1655. let that = this
  1656. this.getPubKey(function() {
  1657. ////////////////////////////////// 请自行修改以下变量值 ////////////////////////////////////
  1658. var appkey = '24699060' //综合安防管理平台提供的appkey,必填
  1659. var secret = that.setEncrypt('tt1pMbsrlwGZUWucdAPw') //综合安防管理平台提供的secret,必填
  1660. var ip = '36.49.108.22' //综合安防管理平台IP地址,必填
  1661. var playMode = 1 //初始播放模式:0-预览,1-回放
  1662. var port = 1443 //综合安防管理平台端口,若启用HTTPS协议,默认443
  1663. var snapDir = 'D:\\SnapDir' //抓图存储路径
  1664. var videoDir = 'D:\\VideoDir' //紧急录像或录像剪辑存储路径
  1665. var layout = '1x1' //playMode指定模式的布局
  1666. var enableHTTPS = 1 //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1
  1667. var encryptedFields = 'secret' //加密字段,默认加密领域为secret
  1668. var showToolbar = 1 //是否显示工具栏,0-不显示,非0-显示
  1669. var showSmart = 1 //是否显示智能信息(如配置移动侦测后画面上的线框),0-不显示,非0-显示
  1670. var buttonIDs = '0,16,256,257,258,259,260,512,513,514,515,516,517,768,769' //自定义工具条按钮
  1671. ////////////////////////////////// 请自行修改以上变量值 ////////////////////////////////////
  1672. that.oWebControl.JS_RequestInterface({
  1673. funcName: 'init',
  1674. argument: JSON.stringify({
  1675. appkey: appkey, //API网关提供的appkey
  1676. secret: secret, //API网关提供的secret
  1677. ip: ip, //API网关IP地址
  1678. playMode: playMode, //播放模式(决定显示预览还是回放界面)
  1679. port: port, //端口
  1680. snapDir: snapDir, //抓图存储路径
  1681. videoDir: videoDir, //紧急录像或录像剪辑存储路径
  1682. layout: layout, //布局
  1683. enableHTTPS: enableHTTPS, //是否启用HTTPS协议
  1684. encryptedFields: encryptedFields, //加密字段
  1685. showToolbar: showToolbar, //是否显示工具栏
  1686. showSmart: showSmart, //是否显示智能信息
  1687. buttonIDs: buttonIDs //自定义工具条按钮
  1688. })
  1689. }).then(function(oData) {
  1690. that.oWebControl.JS_Resize(1020, 600) // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
  1691. })
  1692. })
  1693. },
  1694. //初始化电视墙
  1695. initTvWall() {
  1696. let that = this
  1697. this.getPubKey(function() {
  1698. ////////////////////////////////// 请自行修改以下变量值 ////////////////////////////////////
  1699. var appkey = '24699060' //综合安防管理平台提供的appkey,必填
  1700. var secret = that.setEncrypt('tt1pMbsrlwGZUWucdAPw') //综合安防管理平台提供的secret,必填
  1701. var ip = '36.49.108.22' //综合安防管理平台IP地址,必填
  1702. var playMode = 0 //初始播放模式:0-预览,1-回放
  1703. var port = 1443 //综合安防管理平台端口,若启用HTTPS协议,默认443
  1704. var snapDir = 'D:\\SnapDir' //抓图存储路径
  1705. var videoDir = 'D:\\VideoDir' //紧急录像或录像剪辑存储路径
  1706. var layout = '3x3' //playMode指定模式的布局
  1707. var enableHTTPS = 1 //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1
  1708. var encryptedFields = 'secret' //加密字段,默认加密领域为secret
  1709. var showToolbar = 1 //是否显示工具栏,0-不显示,非0-显示
  1710. var showSmart = 1 //是否显示智能信息(如配置移动侦测后画面上的线框),0-不显示,非0-显示
  1711. var buttonIDs = '0,16,256,257,258,259,260,512,513,514,515,516,517,768,769' //自定义工具条按钮
  1712. ////////////////////////////////// 请自行修改以上变量值 ////////////////////////////////////
  1713. that.oWebControl.JS_RequestInterface({
  1714. funcName: 'init',
  1715. argument: JSON.stringify({
  1716. appkey: appkey, //API网关提供的appkey
  1717. secret: secret, //API网关提供的secret
  1718. ip: ip, //API网关IP地址
  1719. playMode: playMode, //播放模式(决定显示预览还是回放界面)
  1720. port: port, //端口
  1721. snapDir: snapDir, //抓图存储路径
  1722. videoDir: videoDir, //紧急录像或录像剪辑存储路径
  1723. layout: layout, //布局
  1724. enableHTTPS: enableHTTPS, //是否启用HTTPS协议
  1725. encryptedFields: encryptedFields, //加密字段
  1726. showToolbar: showToolbar, //是否显示工具栏
  1727. showSmart: showSmart, //是否显示智能信息
  1728. buttonIDs: buttonIDs //自定义工具条按钮
  1729. })
  1730. }).then(function(oData) {
  1731. that.oWebControl.JS_Resize(1020, 600) // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
  1732. })
  1733. })
  1734. },
  1735. // 创建播放实例
  1736. initPlugin(newappkey, newloginIp, newsecret, newloginPort) {
  1737. let that = this
  1738. that.oWebControl = new WebControl({
  1739. szPluginContainer: 'playWnd', // 指定容器id
  1740. iServicePortStart: 15900, // 指定起止端口号,建议使用该值
  1741. iServicePortEnd: 15909,
  1742. szClassId: '23BF3B0A-2C56-4D97-9C03-0CB103AA8F11', // 用于IE10使用ActiveX的clsid
  1743. cbConnectSuccess: function() { // 创建WebControl实例成功
  1744. that.oWebControl.JS_StartService('window', { // WebControl实例创建成功后需要启动服务
  1745. dllPath: './VideoPluginConnect.dll' // 值"./VideoPluginConnect.dll"写死
  1746. }).then(function() { // 启动插件服务成功
  1747. that.oWebControl.JS_SetWindowControlCallback({ // 设置消息回调
  1748. cbIntegrationCallBack: cbIntegrationCallBack
  1749. })
  1750. that.oWebControl.JS_CreateWnd('playWnd', 1020, 600).then(function() { //JS_CreateWnd创建视频播放窗口,宽高可设定
  1751. that.init(newappkey, newloginIp, newsecret, newloginPort) // 创建播放实例成功后初始化
  1752. })
  1753. }, function() { // 启动插件服务失败
  1754. })
  1755. },
  1756. cbConnectError: function() { // 创建WebControl实例失败
  1757. that.oWebControl = null
  1758. $('#playWnd').html('插件未启动,正在尝试启动,请稍候...')
  1759. WebControl.JS_WakeUp('VideoWebPlugin://') // 程序未启动时执行error函数,采用wakeup来启动程序
  1760. initCount++
  1761. if (initCount < 3) {
  1762. setTimeout(function() {
  1763. that.initPlugin(newappkey, newloginIp, newsecret, newloginPort)
  1764. }, 3000)
  1765. } else {
  1766. $('#playWnd').html('插件启动失败,请检查插件是否安装!<a href="./public/hk/VideoWebPlugin.exe">点击下载插件</a>')
  1767. }
  1768. },
  1769. cbConnectClose: function(bNormalClose) {
  1770. // 异常断开:bNormalClose = false
  1771. // JS_Disconnect正常断开:bNormalClose = true
  1772. console.log('cbConnectClose')
  1773. that.oWebControl = null
  1774. }
  1775. })
  1776. },
  1777. //播放海康摄像头
  1778. playhk(channelCode) {
  1779. var cameraIndexCode = channelCode //获取输入的监控点编号值,必填
  1780. var streamMode = 0 //主子码流标识:0-主码流,1-子码流
  1781. var transMode = 1 //传输协议:0-UDP,1-TCP
  1782. var gpuMode = 0 //是否启用GPU硬解,0-不启用,1-启用
  1783. var wndId = -1 //播放窗口序号(在2x2以上布局下可指定播放窗口)
  1784. cameraIndexCode = cameraIndexCode.replace(/(^\s*)/g, '')
  1785. cameraIndexCode = cameraIndexCode.replace(/(\s*$)/g, '')
  1786. this.oWebControl.JS_RequestInterface({
  1787. funcName: 'startPreview',
  1788. argument: JSON.stringify({
  1789. cameraIndexCode: cameraIndexCode, //监控点编号
  1790. streamMode: streamMode, //主子码流标识
  1791. transMode: transMode, //传输协议
  1792. gpuMode: gpuMode, //是否开启GPU硬解
  1793. wndId: wndId //可指定播放窗口
  1794. })
  1795. })
  1796. },
  1797. //初始化
  1798. init(newappkey, newloginIp, newsecret, newloginPort) {
  1799. let that = this
  1800. that.getPubKey(function() {
  1801. ////////////////////////////////// 请自行修改以下变量值 ////////////////////////////////////
  1802. var appkey = newappkey //综合安防管理平台提供的appkey,必填
  1803. var secret = that.setEncrypt(newsecret) //综合安防管理平台提供的secret,必填
  1804. var ip = newloginIp //综合安防管理平台IP地址,必填
  1805. var playMode = 0 //初始播放模式:0-预览,1-回放
  1806. var port = Number(newloginPort) //综合安防管理平台端口,若启用HTTPS协议,默认443
  1807. var snapDir = 'D:\\SnapDir' //抓图存储路径
  1808. var videoDir = 'D:\\VideoDir' //紧急录像或录像剪辑存储路径
  1809. var layout = '1x1' //playMode指定模式的布局
  1810. var enableHTTPS = 1 //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1
  1811. var encryptedFields = 'secret' //加密字段,默认加密领域为secret
  1812. var showToolbar = 1 //是否显示工具栏,0-不显示,非0-显示
  1813. var showSmart = 1 //是否显示智能信息(如配置移动侦测后画面上的线框),0-不显示,非0-显示
  1814. var buttonIDs = '0,16,256,257,258,259,260,512,513,514,515,516,517,768,769' //自定义工具条按钮
  1815. ////////////////////////////////// 请自行修改以上变量值 ////////////////////////////////////
  1816. that.oWebControl.JS_RequestInterface({
  1817. funcName: 'init',
  1818. argument: JSON.stringify({
  1819. appkey: appkey, //API网关提供的appkey
  1820. secret: secret, //API网关提供的secret
  1821. ip: ip, //API网关IP地址
  1822. playMode: playMode, //播放模式(决定显示预览还是回放界面)
  1823. port: port, //端口
  1824. snapDir: snapDir, //抓图存储路径
  1825. videoDir: videoDir, //紧急录像或录像剪辑存储路径
  1826. layout: layout, //布局
  1827. enableHTTPS: enableHTTPS, //是否启用HTTPS协议
  1828. encryptedFields: encryptedFields, //加密字段
  1829. showToolbar: showToolbar, //是否显示工具栏
  1830. showSmart: showSmart, //是否显示智能信息
  1831. buttonIDs: buttonIDs //自定义工具条按钮
  1832. })
  1833. }).then(function(oData) {
  1834. that.oWebControl.JS_Resize(1020, 600) // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
  1835. })
  1836. })
  1837. },
  1838. //获取公钥
  1839. getPubKey(callback) {
  1840. let that = this
  1841. that.oWebControl.JS_RequestInterface({
  1842. funcName: 'getRSAPubKey',
  1843. argument: JSON.stringify({
  1844. keyLength: 1024
  1845. })
  1846. }).then(function(oData) {
  1847. console.log(oData)
  1848. if (oData.responseMsg.data) {
  1849. that.pubKey = oData.responseMsg.data
  1850. callback()
  1851. }
  1852. })
  1853. },
  1854. //RSA加密
  1855. setEncrypt(value) {
  1856. var encrypt = new JSEncrypt()
  1857. encrypt.setPublicKey(this.pubKey)
  1858. return encrypt.encrypt(value)
  1859. },
  1860. hikDisconnect() {
  1861. console.log('111')
  1862. let that = this
  1863. if (that.oWebControl != null) {
  1864. that.oWebControl.JS_HideWnd() // 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题
  1865. that.oWebControl.JS_Disconnect().then(function() {
  1866. }, function() {
  1867. }) // 断开与插件服务连接成功 // 断开与插件服务连接失败
  1868. }
  1869. },
  1870. /** ----------------------------------海康摄像头预览结束------------------------------------- */
  1871. /** 提交按钮 */
  1872. submitForm() {
  1873. this.$refs['form'].validate(valid => {
  1874. if (valid) {
  1875. //如果后台报错:比如IP重复,需要将原来的form.list 赋值回去,否则再次点击保存时,form.list值已经改变,上面的for循环会出问题
  1876. let old_form_list = this.form.list
  1877. let list = []
  1878. for (let item in this.form.list) {
  1879. for (let items in this.cameraSystemList) {
  1880. if (this.cameraSystemList[items].value == this.form.list[item]) {
  1881. const yongtu = {}
  1882. yongtu.type = this.cameraSystemList[items].value
  1883. yongtu.typeName = this.cameraSystemList[items].label
  1884. list.push(yongtu)
  1885. }
  1886. }
  1887. }
  1888. let that = this
  1889. that.form.list = list
  1890. if (that.form.id != null) {
  1891. that.form.cameraImages = this.form.cameraImagesList ? typeof this.form.cameraImagesList == 'string' ? this.form.cameraImagesList.split(',') : this.form.cameraImagesList : []
  1892. that.form.cameraImagesList = []
  1893. updateCamera(that.form).then(response => {
  1894. that.$modal.msgSuccess('修改成功')
  1895. that.open = false
  1896. that.getList()
  1897. }).catch((error) => {
  1898. //如果后台报错:比如IP重复,需要将原来的form.list 赋值回去,否则再次点击保存时,form.list值已经改变,上面的双层for循环会出问题
  1899. that.form.list = old_form_list
  1900. })
  1901. } else {
  1902. that.form.cameraImages = this.form.cameraImagesList ? typeof this.form.cameraImagesList == 'string' ? this.form.cameraImagesList.split(',') : this.form.cameraImagesList : []
  1903. that.form.cameraImagesList = []
  1904. addCamera(this.form).then(response => {
  1905. this.$modal.msgSuccess('新增成功')
  1906. this.open = false
  1907. this.getList()
  1908. this.resetForm('form')
  1909. }).catch((error) => {
  1910. //如果后台报错:比如IP重复,需要将原来的form.list 赋值回去,否则再次点击保存时,form.list值已经改变,上面的双层for循环会出问题
  1911. this.form.list = old_form_list
  1912. })
  1913. }
  1914. }
  1915. })
  1916. },
  1917. /** 导出按钮操作 */
  1918. handleExport() {
  1919. this.download('sooka-sponest-center-monitor/camera/export', {
  1920. ...this.queryParams
  1921. }, `camera_${new Date().getTime()}.xlsx`)
  1922. },
  1923. synchronizeCamera() {
  1924. let that = this
  1925. that.loading = true
  1926. that.$modal.msgSuccess('开始同步')
  1927. synchronizeOfflineCamera().then(function(res) {
  1928. if (res.code == 200) {
  1929. that.loading = false
  1930. that.$modal.msgSuccess('设备状态同步成功')
  1931. that.getList()
  1932. } else {
  1933. that.loading = false
  1934. that.$modal.warn('设备状态同步失败')
  1935. }
  1936. })
  1937. }
  1938. }
  1939. }
  1940. // 推送消息
  1941. function cbIntegrationCallBack(oData) {
  1942. console.log(JSON.stringify(oData.responseMsg))
  1943. }
  1944. </script>
  1945. <style rel="stylesheet/scss" lang="scss">
  1946. //视频摄像头预览弹层样式
  1947. .videoCustomWidth {
  1948. width: 1070px !important;
  1949. height: 760px !important;
  1950. }
  1951. //视频摄像头预览弹层样式
  1952. .videoCustomWidthPlayBack {
  1953. width: 1080px !important;
  1954. height: 780px !important;
  1955. }
  1956. </style>