AddCameraByNVR.vue 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. <template>
  2. <div>
  3. <div>
  4. <el-form
  5. ref="NVRFormRef"
  6. class="ip-form"
  7. :inline="true"
  8. :model="cameraNVRData"
  9. :rules="rules"
  10. label-width="124px"
  11. label-position="left"
  12. >
  13. <el-form-item label="名称:" prop="name">
  14. <el-input v-model="cameraNVRData.name" placeholder="请输入名称" style="width: 200px" />
  15. </el-form-item>
  16. <el-form-item label="NVR平台IP地址:" prop="nvrIp">
  17. <el-input
  18. v-model="cameraNVRData.nvrIp"
  19. placeholder="请输入NVR平台地址"
  20. style="width: 200px"
  21. />
  22. </el-form-item>
  23. <el-form-item label="端口:" prop="cameraPort">
  24. <el-input
  25. v-model="cameraNVRData.cameraPort"
  26. placeholder="请输入端口号"
  27. style="width: 200px"
  28. />
  29. </el-form-item>
  30. <el-form-item label="协议类型:" prop="cameraType">
  31. <el-select
  32. v-model="cameraNVRData.cameraType"
  33. placeholder="请输入协议类型"
  34. style="width: 200px"
  35. >
  36. <el-option
  37. v-for="protocal in protocalTypeSelect"
  38. :key="protocal.value"
  39. :label="protocal.label"
  40. :value="protocal.value"
  41. />
  42. </el-select>
  43. </el-form-item>
  44. <el-form-item label="NVR平台用户名:" prop="nvrUsername">
  45. <el-input
  46. v-model="cameraNVRData.nvrUsername"
  47. placeholder="请输入NVR平台用户名"
  48. style="width: 200px"
  49. />
  50. </el-form-item>
  51. <el-form-item label="场景:" prop="workspaceCode">
  52. <el-tree-select
  53. v-model="cameraNVRData.workspaceCode"
  54. :data="scenesTree"
  55. :render-after-expand="false"
  56. :default-expand-all="props.formData ? true : false"
  57. check-strictly
  58. placeholder="请输入场景名称"
  59. style="width: 200px"
  60. @node-click="handleTreeSelect"
  61. />
  62. </el-form-item>
  63. <el-form-item label="NVR平台密码:" prop="nvrPassword">
  64. <el-input
  65. v-model="cameraNVRData.nvrPassword"
  66. placeholder="请输入NVR平台密码"
  67. style="width: 200px"
  68. />
  69. </el-form-item>
  70. <el-form-item label="工位负责人:" prop="principal">
  71. <el-input
  72. v-model="cameraNVRData.principal"
  73. placeholder="请输入工位负责人"
  74. disabled
  75. style="width: 200px"
  76. />
  77. </el-form-item>
  78. <el-form-item label="设备ID号:" prop="code">
  79. <el-input
  80. v-model="cameraNVRData.code"
  81. placeholder="自定义ID,不能重复"
  82. style="width: 200px"
  83. />
  84. </el-form-item>
  85. <el-form-item label="备注:" prop="remark">
  86. <el-input v-model="cameraNVRData.remark" placeholder="请输入备注" style="width: 200px" />
  87. </el-form-item>
  88. <el-form-item label="NVR平台通道号:" prop="nvrChannel">
  89. <el-input
  90. v-model="cameraNVRData.nvrChannel"
  91. placeholder="请输入NVR平台通道号"
  92. style="width: 200px"
  93. />
  94. </el-form-item>
  95. <el-form-item label="服务类型:" prop="videoServiceType">
  96. <el-select
  97. v-model="cameraNVRData.videoServiceType"
  98. placeholder="请输入服务类型"
  99. style="width: 200px"
  100. >
  101. <el-option
  102. v-for="protocal in serviceTypeSelect"
  103. :key="protocal.value"
  104. :label="protocal.label"
  105. :value="protocal.value"
  106. />
  107. </el-select>
  108. </el-form-item>
  109. <el-form-item label="视频编码标准:" prop="videoStandard">
  110. <el-select
  111. v-model="cameraNVRData.videoStandard"
  112. placeholder="请输入视频编码标准"
  113. style="width: 200px"
  114. >
  115. <el-option
  116. v-for="protocal in standardTypeSelect"
  117. :key="protocal.value"
  118. :label="protocal.label"
  119. :value="protocal.value"
  120. />
  121. </el-select>
  122. </el-form-item>
  123. </el-form>
  124. </div>
  125. <span class="pop-footer">
  126. <el-button @click="handleCancel">取消</el-button>
  127. <el-button type="primary" @click="handleConfirm">确定</el-button>
  128. </span>
  129. </div>
  130. </template>
  131. <script setup lang="ts">
  132. import { onBeforeMount, ref } from 'vue';
  133. import { CameraNVRItem } from '../type';
  134. import { protocalTypeSelect, serviceTypeSelect, standardTypeSelect } from '../constant';
  135. import useSceneInfos from '@/hooks/useSceneInfos';
  136. import { cloneDeep } from 'lodash-es';
  137. import { ElMessage } from 'element-plus';
  138. const props = defineProps<{ formData?: CameraNVRItem | null }>();
  139. const emits = defineEmits(['cancel-execute', 'confirm-execute']);
  140. const sceneInfos = useSceneInfos();
  141. const { scenesTree, flattendWorkspaces, getScenesTree } = sceneInfos;
  142. const NVRFormRef = ref();
  143. const cameraNVRData = ref<CameraNVRItem>({} as CameraNVRItem);
  144. const rules = {
  145. name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
  146. nvrIp: [{ required: true, message: '请输入NVR平台地址', trigger: 'blur' }],
  147. cameraPort: [{ required: true, message: '请输入端口号', trigger: 'blur' }],
  148. cameraType: [{ required: true, message: '请输入协议类型', trigger: 'blur' }],
  149. nvrUsername: [{ required: true, message: '请输入NVR平台用户名', trigger: 'blur' }],
  150. workspaceCode: [{ required: true, message: '请输入场景名称', trigger: 'blur' }],
  151. nvrPassword: [{ required: true, message: '请输入NVR平台密码', trigger: 'blur' }],
  152. principal: [{ required: false }],
  153. code: [{ required: true, message: '请输入设备ID号', trigger: 'blur' }],
  154. remark: [{ required: false }],
  155. nvrChannel: [{ required: true, message: '请输入NVR平台通道号', trigger: 'blur' }],
  156. videoServiceType: [{ required: false }],
  157. videoStandard: [{ required: true, message: '请输入视频编码标准', trigger: 'blur' }],
  158. };
  159. const handleCancel = () => {
  160. emits('cancel-execute');
  161. };
  162. const handleConfirm = () => {
  163. NVRFormRef.value.validate((valid) => {
  164. if (valid) {
  165. const copyData = cloneDeep(cameraNVRData.value);
  166. console.log();
  167. copyData.workspaceId = flattendWorkspaces.value.find(
  168. (item) => item.code === cameraNVRData.value.workspaceCode,
  169. ).id;
  170. delete (copyData as any).workspaceCode;
  171. delete (copyData as any).principal;
  172. emits('confirm-execute', copyData);
  173. }
  174. });
  175. };
  176. const handleTreeSelect = (node) => {
  177. const space = flattendWorkspaces.value.find((item) => item.code === node.value);
  178. cameraNVRData.value.workspaceId = space?.id;
  179. cameraNVRData.value.principal = space?.principal;
  180. if (node.disabled && node.children.length < 1) {
  181. ElMessage.error('请先添加工位');
  182. }
  183. };
  184. onBeforeMount(() => {
  185. getScenesTree({ level: 3, valueKey: 'code', labelKey: 'name', disabled: true });
  186. if (props.formData) {
  187. cameraNVRData.value = props.formData;
  188. }
  189. });
  190. </script>
  191. <style scoped>
  192. .ip-form {
  193. width: 768px;
  194. display: flex;
  195. flex-wrap: wrap;
  196. justify-content: space-between;
  197. align-content: space-around;
  198. }
  199. .pop-footer {
  200. position: absolute;
  201. right: 24px;
  202. bottom: 27px;
  203. display: flex;
  204. justify-content: flex-end;
  205. }
  206. :deep(.el-form-item__label) {
  207. font-size: 14px;
  208. color: #363636;
  209. padding: 0;
  210. }
  211. :deep(.el-form--inline .el-form-item) {
  212. display: flex;
  213. margin-right: 0;
  214. margin-bottom: 28px;
  215. }
  216. </style>