【前端】智能库房综合管理系统前端项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

559 lines
25 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. <template>
  2. <div>
  3. <!--工具栏-->
  4. <div class="head-container" style="padding:0 0 20px 0">
  5. <crudOperation :permission="permission">
  6. <template v-slot:left>
  7. <el-button v-permission="permission.add" size="mini" type="primary" icon="el-icon-plus" :disabled="!activeAddBtn" @click="selectDeviceType">新增</el-button>
  8. </template>
  9. <template v-slot:right>
  10. <el-button v-permission="permission.del" icon="el-icon-delete" size="mini" :loading="crud.delAllLoading" :disabled="crud.selections && crud.selections.length === 0" @click="toDelete(crud.selections)">删除</el-button>
  11. <el-select v-model="deviceType" class="filter-item" style="margin-left:10px" placeholder="全部" @change="crud.toQuery">
  12. <el-option :key="0" label="全部" value="" />
  13. <el-option v-for="item in deviceTypeOptions" :key="item.id" :label="item.name" :value="item.id" />
  14. </el-select>
  15. </template>
  16. <template v-slot:rightButtonGroup>
  17. <div class="archives-handler-btn">
  18. <el-button class="binding-mac-btn iconfont icon-bangdingshebei-fanbai" type="primary" :disabled="crud.selections.length !== 1 || (crud.selections[0].deviceTypeId && crud.selections[0].deviceTypeId.name !== '桌面式RFID读写器')" @click="bindingMac()">绑定设备</el-button>
  19. <el-button class="binding-param-btn iconfont icon-bangdingcanshu-fanbai" type="primary" :disabled="crud.selections.length !== 1 || (crud.selections[0].deviceTypeId && (crud.selections[0].deviceTypeId.name !== '漏水传感器' && crud.selections[0].deviceTypeId.name !== '温湿度感应器' && crud.selections[0].deviceTypeId.name !== '空气质量检测设备'))" @click="bindingParam(crud.selections[0].id)">绑定参数</el-button>
  20. </div>
  21. </template>
  22. </crudOperation>
  23. </div>
  24. <!--表单组件-->
  25. <el-dialog ref="dialog" append-to-body :close-on-click-modal="false" :before-close="crud.cancelCU" :visible="crud.status.cu > 0" :title="addTypeStr" @open="open">
  26. <span class="dialog-right-top" />
  27. <span class="dialog-left-bottom" />
  28. <div class="setting-dialog">
  29. <el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="80px">
  30. <el-form-item label="设备厂商" prop="supplier">
  31. <el-select v-model="form.supplier" style="width: 370px;" :disabled="crud.status.edit === 1">
  32. <el-option v-for="item in supplierOptions" :key="item.id" :label="item.name" :value="item.id" />
  33. </el-select>
  34. </el-form-item>
  35. <el-form-item v-if="isInsidedevices || isOutsidedevices" label="设备ID" prop="deviceId">
  36. <el-input v-model="form.deviceId" style="width: 370px;" :disabled="crud.status.edit === 1" />
  37. </el-form-item>
  38. <el-form-item label="设备名称" prop="deviceName">
  39. <el-input v-model="form.deviceName" style="width: 370px;" />
  40. </el-form-item>
  41. <el-form-item v-if="selectedDeviceType === '密集架' || selectedDeviceType === '回转柜' || selectedDeviceType === '摄像头' || isInsidedevices" label="接口IP" prop="deviceIp">
  42. <el-input v-model="form.deviceIp" style="width: 370px;" />
  43. </el-form-item>
  44. <el-form-item v-if="selectedDeviceType === '密集架' || selectedDeviceType === '回转柜' || selectedDeviceType === '摄像头' || isInsidedevices" label="端口" prop="devicePort">
  45. <el-input v-model="form.devicePort" style="width: 370px;" />
  46. </el-form-item>
  47. <!-- 密集架 || 回转柜 -->
  48. <el-form-item v-if="selectedDeviceType === '密集架' || selectedDeviceType === '回转柜'" label="库房代码" prop="storeroomCode">
  49. <el-input v-model="form.storeroomCode" style="width: 370px;" />
  50. </el-form-item>
  51. <!-- 密集架 -->
  52. <el-form-item v-if="selectedDeviceType === '密集架'" label="区号" prop="areaNo">
  53. <el-input v-model="form.areaNo" style="width: 370px;" :disabled="crud.status.edit === 1" />
  54. </el-form-item>
  55. <el-form-item v-if="selectedDeviceType === '密集架'" label="起始列号" prop="firstColumnNo">
  56. <el-input v-model.number="form.firstColumnNo" style="width: 150px;" :disabled="crud.status.edit === 1" />
  57. </el-form-item>
  58. <el-form-item v-if="selectedDeviceType === '密集架'" label="总列数" prop="sumColumnNo">
  59. <el-input v-model.number="form.sumColumnNo" style="width: 150px;" :disabled="crud.status.edit === 1" />
  60. </el-form-item>
  61. <el-form-item v-if="selectedDeviceType === '密集架'" label="节数" prop="partNo">
  62. <el-input v-model.number="form.partNo" style="width: 150px;" :disabled="crud.status.edit === 1" />
  63. </el-form-item>
  64. <!-- 回转柜 || 摄像头 -->
  65. <el-form-item v-if="selectedDeviceType === '回转柜' || selectedDeviceType === '摄像头'" label="账号" prop="deviceAccount">
  66. <el-input v-model="form.deviceAccount" style="width: 370px;" />
  67. </el-form-item>
  68. <el-form-item v-if="selectedDeviceType === '回转柜' || selectedDeviceType === '摄像头'" label="密码" prop="devicePassword">
  69. <el-input v-model="form.devicePassword" style="width: 370px;" />
  70. </el-form-item>
  71. <!-- 回转柜 -->
  72. <el-form-item v-if="selectedDeviceType === '回转柜'" label="柜号" prop="cupboardNo">
  73. <el-input v-model="form.cupboardNo" style="width: 370px;" :disabled="crud.status.edit === 1" />
  74. </el-form-item>
  75. <!-- 摄像头 -->
  76. <el-form-item v-if="selectedDeviceType === '摄像头'" label="频道" prop="videoRoute">
  77. <el-input v-model="form.videoRoute" style="width: 370px;" />
  78. </el-form-item>
  79. <!-- 密集架 || 回转柜 -->
  80. <el-form-item v-if="selectedDeviceType === '密集架' || selectedDeviceType === '回转柜'" label="层数" prop="rowNo">
  81. <el-input v-model.number="form.rowNo" style="width: 150px;" :disabled="crud.status.edit === 1" />
  82. </el-form-item>
  83. <!-- 回转柜 -->
  84. <el-form-item v-if="selectedDeviceType === '回转柜'" label="每层列数" prop="columnRowNo">
  85. <el-input v-model.number="form.columnRowNo" style="width: 150px;" :disabled="crud.status.edit === 1" />
  86. </el-form-item>
  87. <!-- 密集架 || 回转柜 -->
  88. <el-form-item v-if="selectedDeviceType === '密集架' || selectedDeviceType === '回转柜'" label="联动操作" prop="isLinkage">
  89. <el-checkbox v-model="form.isLinkage.lend" @change="checked=>isLinkageChange(checked,'lend')">借出</el-checkbox>
  90. <el-checkbox v-model="form.isLinkage.borrow" @change="checked=>isLinkageChange(checked,'borrow')">归还</el-checkbox>
  91. <el-checkbox v-model="form.isLinkage.inBound" @change="checked=>isLinkageChange(checked,'inBound')">入库</el-checkbox>
  92. <el-checkbox v-model="form.isLinkage.outBound" @change="checked=>isLinkageChange(checked,'outBound')">出库</el-checkbox>
  93. </el-form-item>
  94. <el-form-item v-if="selectedDeviceType === '密集架' || selectedDeviceType === '回转柜'" label="回调确认" prop="isCallback">
  95. <el-checkbox v-model="form.isCallback.lend" @change="checked=>isCallbackChange(checked,'lend')">借出</el-checkbox>
  96. <el-checkbox v-model="form.isCallback.borrow" @change="checked=>isCallbackChange(checked,'lend')">归还</el-checkbox>
  97. <el-checkbox v-model="form.isCallback.inBound" @change="checked=>isCallbackChange(checked,'lend')">入库</el-checkbox>
  98. <el-checkbox v-model="form.isCallback.outBound" @change="checked=>isCallbackChange(checked,'lend')">出库</el-checkbox>
  99. </el-form-item>
  100. <el-form-item v-if="selectedDeviceType === '密集架' || selectedDeviceType === '回转柜'" label="下发通知" prop="isNotice" style="display: block;">
  101. <el-checkbox v-model="form.isNotice">通知</el-checkbox>
  102. </el-form-item>
  103. </el-form>
  104. <div slot="footer" class="dialog-footer">
  105. <el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">保存</el-button>
  106. </div>
  107. </div>
  108. </el-dialog>
  109. <el-dialog title="删除设备" :visible.sync="deleteVisible" :before-close="handleClose">
  110. <span class="dialog-right-top" />
  111. <span class="dialog-left-bottom" />
  112. <div class="setting-dialog">
  113. <div class="dialog-delt">
  114. <p><span>确定删除当前设备吗</span></p>
  115. </div>
  116. <div slot="footer" class="dialog-footer">
  117. <el-button type="primary" @click.native="handleConfirm">确定</el-button>
  118. </div>
  119. </div>
  120. </el-dialog>
  121. <el-dialog :close-on-click-modal="false" :visible.sync="selectDeviceTypeVisible" title="新增设备">
  122. <span class="dialog-right-top" />
  123. <span class="dialog-left-bottom" />
  124. <div class="setting-dialog">
  125. <el-form size="small" label-width="80px">
  126. <el-form-item label="设备类型">
  127. <el-select v-model="selectedDeviceType" style="width: 370px;">
  128. <el-option v-for="item in deviceTypeOptions" :key="item.id" :label="item.name" :value="item.name" />
  129. </el-select>
  130. </el-form-item>
  131. </el-form>
  132. <div slot="footer" class="dialog-footer">
  133. <el-button type="primary" @click="nextStep()">
  134. 下一步
  135. </el-button>
  136. </div>
  137. </div>
  138. </el-dialog>
  139. <el-dialog :close-on-click-modal="false" :visible.sync="bindingMacVisible" title="绑定设备">
  140. <span class="dialog-right-top" />
  141. <span class="dialog-left-bottom" />
  142. <div class="setting-dialog">
  143. <el-form size="small" label-width="140px">
  144. <el-form-item label="当前电脑Mac地址">
  145. <el-input v-model="currentMac" style="width: 370px;" :disabled="true" />
  146. </el-form-item>
  147. </el-form>
  148. <div slot="footer" class="dialog-footer">
  149. <el-button type="primary" @click="doBindingMac()">
  150. 确定绑定
  151. </el-button>
  152. </div>
  153. </div>
  154. </el-dialog>
  155. <bindParams ref="bindingParamsDlg" @refresh="crud.refresh" />
  156. <div class="container-right" style="min-height: calc(100vh - 242px);">
  157. <span class="right-top-line" />
  158. <span class="left-bottom-line" />
  159. <!--表格渲染-->
  160. <el-table ref="table" v-loading="crud.loading" :data="crud.data" highlight-current-row style="width: 100%;" height="calc(100vh - 295px)" @selection-change="selectionChangeHandler" @row-click="clickRowHandler">
  161. <el-table-column align="center" type="selection" width="50" />
  162. <el-table-column align="center" type="index" label="序号" width="55" />
  163. <el-table-column align="center" prop="storeroomId.name" label="所属区域" width="100" show-overflow-tooltip />
  164. <el-table-column align="center" label="设备状态" width="100">
  165. <template slot-scope="scope">
  166. <span :class="{ 'spk-a': scope.row.deviceState === 1, 'off-line': scope.row.deviceState !== 1 }" />
  167. </template>
  168. </el-table-column>
  169. <el-table-column align="center" prop="deviceTypeId.name" label="设备类型" show-overflow-tooltip />
  170. <el-table-column align="center" prop="supplierId.name" label="设备厂商" width="100" show-overflow-tooltip />
  171. <el-table-column align="center" prop="deviceName" label="设备名称" show-overflow-tooltip />
  172. <el-table-column align="center" label="设备ID" show-overflow-tooltip>
  173. <template slot-scope="scope">
  174. <span v-if="scope.row.deviceId"> {{ scope.row.deviceId }} </span>
  175. <span v-else></span>
  176. </template>
  177. </el-table-column>
  178. <el-table-column align="center" label="接口IP" width="120" show-overflow-tooltip>
  179. <template slot-scope="scope">
  180. <span v-if="scope.row.deviceIp"> {{ scope.row.deviceIp }} </span>
  181. <span v-else></span>
  182. </template>
  183. </el-table-column>
  184. <el-table-column align="center" label="端口" width="90">
  185. <template slot-scope="scope">
  186. <span v-if="scope.row.devicePort"> {{ scope.row.devicePort }} </span>
  187. <span v-else></span>
  188. </template>
  189. </el-table-column>
  190. <el-table-column align="center" label="绑定设备" width="100">
  191. <template slot-scope="scope">
  192. <span v-if="scope.row.deviceSpecParamId && scope.row.deviceSpecParamId.macAddress !== null"> 已绑定 </span>
  193. <span v-else></span>
  194. </template>
  195. </el-table-column>
  196. <el-table-column align="center" label="绑定参数" width="100">
  197. <template slot-scope="scope">
  198. <span v-if="scope.row.deviceSpecParamId && scope.row.deviceSpecParamId.paramId !== null"> 已绑定 </span>
  199. <span v-else></span>
  200. </template>
  201. </el-table-column>
  202. </el-table>
  203. <!--分页组件-->
  204. <pagination />
  205. </div>
  206. </div>
  207. </template>
  208. <script>
  209. import crudDevice from '@/api/storeManage/deviceManage/device'
  210. import macApi from '@/api/storeManage/deviceManage/mac'
  211. import paramApi from '@/api/storeManage/deviceManage/param'
  212. import CRUD, { presenter, header, form } from '@crud/crud'
  213. import crudOperation from '@crud/CRUD.operation'
  214. import pagination from '@crud/Pagination'
  215. import bindParams from './bindParams'
  216. const defaultForm = { supplier: null, id: null, deviceId: null, deviceName: null, deviceIp: null, devicePort: null, rowNo: null, areaNo: null, sumColumnNo: null, firstColumnNo: null, partNo: null, storeroomCode: null, columnRowNo: null, deviceAccount: null, devicePassword: null, cupboardNo: null, videoRoute: null, isLinkage: { stateType: 1, lend: false, borrow: false, inBound: false, outBound: false }, isCallback: { stateType: 2, lend: false, borrow: false, inBound: false, outBound: false }, isNotice: false }
  217. export default {
  218. components: { crudOperation, pagination, bindParams },
  219. cruds() {
  220. return [
  221. CRUD({
  222. title: '设备', url: 'api/device/list',
  223. crudMethod: { ...crudDevice },
  224. optShow: {
  225. add: false,
  226. edit: true,
  227. del: false,
  228. reset: false,
  229. download: false,
  230. group: false
  231. },
  232. sort: ['sequence,asc']
  233. })
  234. ]
  235. },
  236. mixins: [
  237. presenter(),
  238. header(),
  239. form(defaultForm)
  240. ],
  241. props: {
  242. activeAddBtn: {
  243. type: Boolean
  244. }
  245. },
  246. data() {
  247. return {
  248. storeroomId: null,
  249. deviceType: null, // 设备列表筛选项目(设备类型)
  250. needRefreshTree: false,
  251. permission: {
  252. add: ['admin', 'device:add'],
  253. edit: ['admin', 'device:edit'],
  254. del: ['admin', 'device:del']
  255. },
  256. deleteVisible: false,
  257. selectDeviceTypeVisible: false,
  258. bindingMacVisible: false,
  259. currentMac: '',
  260. deviceTypeOptions: [],
  261. selectedDeviceType: '密集架', // 选择添加的设备种类
  262. supplierOptions: [] // 厂商
  263. }
  264. },
  265. computed: {
  266. addTypeStr() {
  267. const addType = this.deviceTypeOptions.find(deviceType => deviceType.name === this.selectedDeviceType)
  268. const preTitle = this.crud.status.add > CRUD.STATUS.NORMAL ? '新增' : '编辑'
  269. if (addType) {
  270. return preTitle + addType.name
  271. } else {
  272. return preTitle
  273. }
  274. },
  275. isInsidedevices() {
  276. if (this.selectedDeviceType === '空调' || this.selectedDeviceType === '桌面式RFID读写器' || this.selectedDeviceType === '盘点机' || this.selectedDeviceType === '恒湿机' || this.selectedDeviceType === '漏水传感器' || this.selectedDeviceType === '温湿度感应器' || this.selectedDeviceType === '空气质量检测设备' || this.selectedDeviceType === '漏水传感器') {
  277. return true
  278. } else {
  279. return false
  280. }
  281. },
  282. isOutsidedevices() {
  283. if (this.selectedDeviceType === '通道门' || this.selectedDeviceType === '手持式RFID读写器') {
  284. return true
  285. } else {
  286. return false
  287. }
  288. },
  289. rules() {
  290. // const checkDeviceIp = (rule, value, callback) => {
  291. // const reg = /^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/
  292. // if (reg.test(value)) {
  293. // callback()
  294. // } else {
  295. // callback(new Error('设备IP格式错误'))
  296. // }
  297. // }
  298. const checkDevicePort = (rule, value, callback) => {
  299. const reg = /^([0-9]|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{4}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/
  300. if (reg.test(value)) {
  301. callback()
  302. } else {
  303. callback(new Error('端口号输入错误'))
  304. }
  305. }
  306. const validateRule = {
  307. // deviceInfo.
  308. supplier: [
  309. { required: true, message: '请选择设备产商', trigger: 'blur' }
  310. ],
  311. deviceName: [
  312. { required: true, message: '请输入设备名称', trigger: 'blur' }
  313. ]
  314. }
  315. if (this.isInsidedevices || this.isOutsidedevices) {
  316. this.$set(validateRule, 'deviceId', [
  317. { required: true, message: '请输入设备ID', trigger: 'blur' }
  318. ])
  319. }
  320. if (this.selectedDeviceType === '密集架' || this.selectedDeviceType === '回转柜' || this.selectedDeviceType === '摄像头' || this.isInsidedevices) {
  321. this.$set(validateRule, 'deviceIp', [
  322. { required: true, message: '请输入接口IP', trigger: 'blur' }
  323. // ,
  324. // { validator: checkDeviceIp, trigger: 'blur' }
  325. ])
  326. this.$set(validateRule, 'devicePort', [
  327. { required: true, message: '请输入端口号', trigger: 'blur' },
  328. { validator: checkDevicePort, trigger: 'blur' }
  329. ])
  330. if (this.selectedDeviceType === '密集架') {
  331. this.$set(validateRule, 'areaNo', [
  332. { required: true, message: '请输入区号', trigger: 'blur' }
  333. ])
  334. this.$set(validateRule, 'firstColumnNo', [
  335. { required: true, message: '请输入起始列号', trigger: 'blur' }
  336. ])
  337. this.$set(validateRule, 'sumColumnNo', [
  338. { required: true, message: '请输入总列数', trigger: 'blur' }
  339. ])
  340. this.$set(validateRule, 'partNo', [
  341. { required: true, message: '请输入节数', trigger: 'blur' }
  342. ])
  343. this.$set(validateRule, 'rowNo', [
  344. { required: true, message: '请输入层数', trigger: 'blur' }
  345. ])
  346. } else {
  347. // 回转柜 || 摄像头
  348. this.$set(validateRule, 'deviceAccount', [
  349. { required: true, message: '请输入账号', trigger: 'blur' }
  350. ])
  351. this.$set(validateRule, 'devicePassword', [
  352. { required: true, message: '请输入密码', trigger: 'blur' }
  353. ])
  354. if (this.selectedDeviceType === '回转柜') {
  355. this.$set(validateRule, 'cupboardNo', [
  356. { required: true, message: '请输入柜号', trigger: 'blur' }
  357. ])
  358. this.$set(validateRule, 'rowNo', [
  359. { required: true, message: '请输入层数', trigger: 'blur' }
  360. ])
  361. this.$set(validateRule, 'columnRowNo', [
  362. { required: true, message: '请输入每层列数', trigger: 'blur' }
  363. ])
  364. } else {
  365. // 摄像头
  366. this.$set(validateRule, 'videoRoute', [
  367. { required: true, message: '请输入频道', trigger: 'blur' }
  368. ])
  369. }
  370. }
  371. }
  372. return validateRule
  373. }
  374. },
  375. created() {
  376. crudDevice.getDeviceType().then((data) => {
  377. this.deviceTypeOptions.splice(0, 0, ...data)
  378. })
  379. },
  380. methods: {
  381. // 设备是密集架或回转柜时,需要先处理 联动操作,回调操作 数据是null的情况
  382. // async
  383. async [CRUD.HOOK.beforeToEdit](crud, form) {
  384. if (form.deviceTypeId.name === '密集架' || form.deviceTypeId.name === '回转柜') {
  385. if (form.deviceTypeId.name === '密集架') {
  386. // 获取密集架行号列号等信息
  387. await crudDevice.getDesecabinetById({ deviceInfoId: this.crud.selections[0].id }).then((data) => {
  388. form.rowNo = data.rowNo
  389. form.areaNo = data.areaNo
  390. form.sumColumnNo = data.sumColumnNo
  391. form.firstColumnNo = data.firstColumnNo
  392. form.partNo = data.partNo
  393. form.storeroomCode = data.storeroomCode
  394. })
  395. } else if (form.deviceTypeId.name === '回转柜') {
  396. // 获取回转柜行号列号等信息
  397. await crudDevice.getRotarycabinetById({ deviceInfoId: this.crud.selections[0].id }).then((data) => {
  398. form.columnRowNo = data.columnRowNo
  399. form.cupboardNo = data.cupboardNo
  400. form.rowNo = data.rowNo
  401. form.storeroomCode = data.storeroomCode
  402. })
  403. }
  404. // 获取联动和回调结果
  405. await crudDevice.getDeviceById({ deviceInfoId: this.crud.selections[0].id }).then((data) => {
  406. if (data.length === 3) {
  407. form.isLinkage = data.find(element => element.stateType === 1)
  408. form.isCallback = data.find(element => element.stateType === 2)
  409. }
  410. })
  411. }
  412. form.supplier = form.supplierId.id
  413. this.selectedDeviceType = form.deviceTypeId.name
  414. crud.status.edit = CRUD.STATUS.PREPARED
  415. crud.getDataStatus(this.crud.selections[0].id).edit = CRUD.STATUS.PREPARED
  416. return false
  417. },
  418. [CRUD.HOOK.beforeSubmit]() {
  419. this.crud.form.storeroomId = this.storeroomId
  420. this.crud.form.supplierId = this.supplierOptions.find(item => item.id === this.crud.form.supplier)
  421. this.crud.form.deviceTypeId = this.deviceTypeOptions.find(item => item.name === this.selectedDeviceType)
  422. },
  423. // 获取数据前设置默认参数
  424. [CRUD.HOOK.beforeRefresh]() {
  425. if (this.storeroomId) {
  426. this.crud.query.storeroomId = this.storeroomId.id
  427. }
  428. if (this.deviceType !== '0') {
  429. this.crud.query.deviceTypeId = this.deviceType
  430. }
  431. },
  432. // 防止编辑时,isLinkage是null,isLinkage.lend报错
  433. [CRUD.HOOK.afterRefresh](crud) {
  434. crud.data.forEach(element => {
  435. element.isLinkage = { stateType: 1, lend: null, borrow: null, inBound: null, outBound: null }
  436. element.isCallback = { stateType: 2, lend: null, borrow: null, inBound: null, outBound: null }
  437. })
  438. },
  439. clickRowHandler(row) {
  440. this.$refs.table.toggleRowSelection(row)
  441. },
  442. selectionChangeHandler(val) {
  443. this.crud.selections = val
  444. },
  445. toDelete(data) {
  446. this.deleteVisible = true
  447. },
  448. handleConfirm() {
  449. this.deleteVisible = false
  450. this.crud.delAllLoading = true
  451. this.crud.doDelete(this.crud.selections)
  452. },
  453. handleClose(done) {
  454. done()
  455. },
  456. selectDeviceType() {
  457. this.selectDeviceTypeVisible = true
  458. },
  459. nextStep() {
  460. this.selectDeviceTypeVisible = false
  461. this.crud.toAdd()
  462. },
  463. open() {
  464. this.supplierOptions.splice(0, this.supplierOptions.length)
  465. crudDevice.getSupplier().then((data) => {
  466. this.supplierOptions.splice(0, 0, ...data)
  467. })
  468. },
  469. bindingMac() {
  470. macApi.getMac().then((data) => {
  471. this.currentMac = data
  472. this.bindingMacVisible = true
  473. })
  474. },
  475. doBindingMac() {
  476. macApi.bindMac({ deviceId: this.crud.selections[0].id, macAddress: this.currentMac }).then((data) => {
  477. this.bindingMacVisible = false
  478. this.$message({
  479. message: '绑定成功',
  480. type: 'success'
  481. })
  482. })
  483. },
  484. bindingParam(id) {
  485. this.$refs.bindingParamsDlg.deviceInfoId = id
  486. paramApi.getParams({ deviceInfoId: id }).then((data) => {
  487. this.$refs.bindingParamsDlg.params = data
  488. this.$refs.bindingParamsDlg.bindParamsVisible = true
  489. })
  490. },
  491. isLinkageChange(value, type) {
  492. if (!value && this.form.isCallback[type]) {
  493. this.$message.error('取消对应回调选项后才能取消联动操作')
  494. this.form.isLinkage[type] = true
  495. }
  496. },
  497. isCallbackChange(value, type) {
  498. if (value && !this.form.isLinkage[type]) {
  499. this.$message.error('选中对应联动选项后才能勾选回调操作')
  500. this.form.isCallback[type] = false
  501. }
  502. }
  503. }
  504. }
  505. </script>
  506. <style rel="stylesheet/scss" lang="scss" scoped>
  507. .archives-handler-btn {
  508. .el-button {
  509. padding: 0 13px 0 13px;
  510. ::v-deep span {
  511. margin-left: 10px;
  512. }
  513. &.binding-mac-btn {
  514. border-color: #fd8042;
  515. background-color: #fd8042;
  516. &.is-disabled {
  517. border-color: #7e4021;
  518. background-color: #7e4021;
  519. }
  520. }
  521. &.binding-param-btn {
  522. border-color: #1aae93;
  523. background-color: #1aae93;
  524. &.is-disabled {
  525. border-color: #0d5649;
  526. background-color: #0d5649;
  527. }
  528. }
  529. &.is-disabled {
  530. color: #666;
  531. }
  532. }
  533. .iconfont {
  534. line-height: 28px;
  535. }
  536. margin-left: auto;
  537. }
  538. .spk-a {
  539. display: inline-block;
  540. width: 12px;
  541. height: 12px;
  542. border-radius: 6px;
  543. background-color: #1aae93;
  544. box-shadow: 0px 0px 6px 1px #1aae93;
  545. vertical-align: middle;
  546. }
  547. .off-line {
  548. display: inline-block;
  549. width: 12px;
  550. height: 12px;
  551. border-radius: 6px;
  552. background-color: #F65163;
  553. box-shadow: 0px 0px 6px 1px #F65163;
  554. vertical-align: middle;
  555. }
  556. </style>