deviceLedger.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507
  1. <template>
  2. <div>
  3. <!-- 设备台账全部信息 -->
  4. <el-dialog v-if="visible" :title="title" width="60%" custom-class="dialog-max" top="5vh" center
  5. :before-close="dialogClose" :visible.sync="visible" :close-on-click-modal="false" :append-to-body="true">
  6. <el-form ref="deviceLedgerForm" :model="deviceLedgerForm" :rules="deviceLedgerRules" label-width="180px"
  7. label-position="left">
  8. <el-row>
  9. <el-col :span="8">
  10. <el-form-item label="设备类别" prop="deviceType" label-width="22%">
  11. <el-input v-model="deviceLedgerForm.deviceType" disabled placeholder="请选择设备类别" maxlength="10">
  12. <el-button type="primary" slot="append" icon="el-icon-search"
  13. @click="chooseDeviceType">选择</el-button>
  14. </el-input>
  15. </el-form-item>
  16. </el-col>
  17. <el-col :span="8">
  18. <el-form-item label="设备名称" prop="deviceName" label-width="22%">
  19. <el-input v-model="deviceLedgerForm.deviceName" placeholder="设备名称" maxlength="10" />
  20. </el-form-item>
  21. </el-col>
  22. <el-col :span="8">
  23. <el-form-item label="设备编号" prop="deviceNum" label-width="22%">
  24. <el-input v-model="deviceLedgerForm.deviceNum" placeholder="设备编号" maxlength="10" />
  25. </el-form-item>
  26. </el-col>
  27. </el-row>
  28. <el-row>
  29. <el-col :span="8">
  30. <el-form-item label="设备等级" prop="deviceLevel" label-width="22%">
  31. <el-select clearable v-model="deviceLedgerForm.deviceLevel" placeholder="请选择设备等级">
  32. <el-option v-for="deviceLevel in deviceLevelList" :key="deviceLevel.id"
  33. :label="deviceLevel.dictValue" :value="deviceLevel.id">
  34. </el-option>
  35. </el-select>
  36. </el-form-item>
  37. </el-col>
  38. <el-col :span="8">
  39. <el-form-item label="设备规格型号" prop="deviceModel" label-width="30%">
  40. <el-input v-model="deviceLedgerForm.deviceModel" placeholder="设备规格型号" maxlength="10" />
  41. </el-form-item>
  42. </el-col>
  43. <el-col :span="8">
  44. <el-form-item label="设备位置" prop="deviceLocation" label-width="22%">
  45. <el-input v-model="deviceLedgerForm.deviceLocation" placeholder="设备位置" maxlength="10" />
  46. </el-form-item>
  47. </el-col>
  48. </el-row>
  49. <el-row>
  50. <el-col :span="8">
  51. <el-form-item label="设备健康状态" prop="deviceHealth" label-width="30%">
  52. <el-select clearable v-model="deviceLedgerForm.deviceHealth" placeholder="请选择健康状态">
  53. <el-option v-for="deviceHealth in deviceHealthList" :key="deviceHealth.id"
  54. :label="deviceHealth.dictValue" :value="deviceHealth.id">
  55. </el-option>
  56. </el-select>
  57. </el-form-item>
  58. </el-col>
  59. <el-col :span="8">
  60. <el-form-item label="使用部门" prop="deviceDeptName" label-width="22%">
  61. <el-input v-model="deviceLedgerForm.deviceDeptName" disabled placeholder="请选择使用部门" maxlength="10">
  62. <el-button slot="append" icon="el-icon-search" @click="chooseDept"></el-button>
  63. </el-input>
  64. </el-form-item>
  65. </el-col>
  66. <el-col :span="8">
  67. <el-form-item label="责任人" prop="devicePersonName" label-width="22%">
  68. <el-input v-model="deviceLedgerForm.devicePersonName" disabled placeholder="请选择责任人" maxlength="10">
  69. <el-button type="primary" slot="append" icon="el-icon-search"
  70. @click="chooseDevicePerson">选择</el-button>
  71. </el-input>
  72. </el-form-item>
  73. </el-col>
  74. </el-row>
  75. <el-row>
  76. <el-col :span="8">
  77. <el-form-item label="购买时间" prop="buyTime" label-width="22%">
  78. <el-date-picker value-format="yyyy-MM-dd HH:mm:ss" v-model="deviceLedgerForm.buyTime"
  79. type="date" placeholder="选择日期">
  80. </el-date-picker>
  81. </el-form-item>
  82. </el-col>
  83. <el-col :span="8">
  84. <el-form-item label="投用时间" prop="useTime" label-width="22%">
  85. <el-date-picker value-format="yyyy-MM-dd HH:mm:ss" v-model="deviceLedgerForm.useTime"
  86. type="date" placeholder="选择日期">
  87. </el-date-picker>
  88. </el-form-item>
  89. </el-col>
  90. <el-col :span="8">
  91. <el-form-item label="供应商" prop="supplier" label-width="22%">
  92. <el-select clearable v-model="deviceLedgerForm.supplier" placeholder="请选择供应商">
  93. <el-option v-for="supplier in supplierList" :key="supplier.id" :label="supplier.dictValue"
  94. :value="supplier.id">
  95. </el-option>
  96. </el-select>
  97. </el-form-item>
  98. </el-col>
  99. </el-row>
  100. <el-row>
  101. <el-col :span="8">
  102. <el-form-item label="制造商" prop="manufacturer" label-width="22%">
  103. <el-select clearable v-model="deviceLedgerForm.manufacturer" placeholder="请选择制作商">
  104. <el-option v-for="manufacturer in manufacturerList" :key="manufacturer.id"
  105. :label="manufacturer.dictValue" :value="manufacturer.id">
  106. </el-option>
  107. </el-select>
  108. </el-form-item>
  109. </el-col>
  110. <el-col :span="8">
  111. <el-form-item label="设备序列号" prop="serialNumber" label-width="30%">
  112. <el-input v-model="deviceLedgerForm.serialNumber" placeholder="设备位置" maxlength="10" />
  113. </el-form-item>
  114. </el-col>
  115. <el-col :span="8">
  116. <el-form-item label="运行条件" prop="runCondition" label-width="22%">
  117. <el-input v-model="deviceLedgerForm.runCondition" placeholder="设备位置" maxlength="10" />
  118. </el-form-item>
  119. </el-col>
  120. </el-row>
  121. <el-row>
  122. <el-col :span="8">
  123. <el-form-item label="使用状态" prop="deviceState" label-width="22%">
  124. <el-select clearable v-model="deviceLedgerForm.deviceState" placeholder="请选择使用状态">
  125. <el-option v-for="deviceState in deviceStateList" :key="deviceState.id"
  126. :label="deviceState.dictValue" :value="deviceState.id">
  127. </el-option>
  128. </el-select>
  129. </el-form-item>
  130. </el-col>
  131. <el-col :span="8">
  132. <el-form-item label="单位" prop="deviceUnit" label-width="22%">
  133. <el-select clearable v-model="deviceLedgerForm.deviceUnit" placeholder="请选择单位">
  134. <el-option v-for="deviceUnit in deviceUnitList" :key="deviceUnit.id"
  135. :label="deviceUnit.dictValue" :value="deviceUnit.id">
  136. </el-option>
  137. </el-select>
  138. </el-form-item>
  139. </el-col>
  140. </el-row>
  141. <el-row>
  142. <el-col :span="12">
  143. <el-form-item label="设备技术参数" prop="technicalDataList" label-width="22%">
  144. <el-upload class="upload-demo" action="" :multiple="true" :auto-upload="false"
  145. :on-change="handleChangeTechnical" :on-remove="handleRemoveTechnical"
  146. :file-list="deviceLedgerForm.technicalDataList" list-type="text">
  147. <el-button size="small" type="primary">点击上传</el-button>
  148. <img />
  149. </el-upload>
  150. </el-form-item>
  151. </el-col>
  152. <el-col :span="12">
  153. <el-form-item label="设备图片" prop="pictureList" label-width="22%">
  154. <el-upload class="upload-demo" action="" :multiple="true" :auto-upload="false"
  155. :on-change="handleChangePicture" :on-remove="handleRemovePicture"
  156. :file-list="deviceLedgerForm.pictureList" list-type="picture" accept=".jpg,.jpeg,.png">
  157. <el-button size="small" type="primary">点击上传</el-button>
  158. <!-- <div>
  159. deviceLedgerForm.pictureList
  160. <img v-for="picture in pictureList" :src="URL.createObjectURL(picture.raw)" />
  161. </div> -->
  162. </el-upload>
  163. </el-form-item>
  164. </el-col>
  165. </el-row>
  166. <el-form-item label="备注" prop="remark">
  167. <el-input type="textarea" v-model="deviceLedgerForm.remark" placeholder="请输入备注"
  168. maxlength="100"></el-input>
  169. </el-form-item>
  170. <el-form-item style="text-align: center;">
  171. <el-button v-show="!queryShow" type="primary" @click="saveDeviceLedgerEvent">确定</el-button>
  172. <el-button v-show="queryShow" type="primary" @click="queryDeviceLedgerEvent">查询</el-button>
  173. <!-- <el-button type="primary" @click="resetForm('deviceTypeForm')">重置</el-button> -->
  174. <el-button @click="dialogClose">取消</el-button>
  175. </el-form-item>
  176. </el-form>
  177. </el-dialog>
  178. <!-- 选择设备类别 -->
  179. <ChooseDeviceType ref="chooseDeviceType" @receiveChooseDeviceType="receiveChooseDeviceType"></ChooseDeviceType>
  180. <!-- 选择部门 -->
  181. <ChooseDept ref="chooseDept" @receiveChooseDept="receiveChooseDept"></ChooseDept>
  182. <!-- 选择责任人 -->
  183. <ChooseStaff ref="chooseDevicePerson" @receiveChooseStaff="receiveChooseStaff"></ChooseStaff>
  184. </div>
  185. </template>
  186. <script>
  187. import SelectTree from '@/components/SelectTree/index.vue'
  188. import ChooseDeviceType from '@/views/device/deviceType/chooseDeviceType.vue'
  189. import ChooseDept from '@/views/system/dept/chooseDept.vue'
  190. import ChooseStaff from '@/views/system/staff/chooseStaff.vue'
  191. import { getDictListByType } from '@/api/system/dict';
  192. import {
  193. addDeviceLedger,
  194. updateDeviceLedger
  195. } from '@/api/device/deviceLedger'
  196. export default {
  197. components: {
  198. SelectTree,
  199. ChooseDeviceType,
  200. ChooseDept,
  201. ChooseStaff
  202. },
  203. mounted() {
  204. this.getDictListByType('device_level', (data) => {
  205. this.deviceLevelList = data
  206. })
  207. this.getDictListByType('device_health', (data) => {
  208. this.deviceHealthList = data
  209. })
  210. this.getDictListByType('supplier', (data) => {
  211. this.supplierList = data
  212. })
  213. this.getDictListByType('manufacturer', (data) => {
  214. this.manufacturerList = data
  215. })
  216. this.getDictListByType('device_state', (data) => {
  217. this.deviceStateList = data
  218. })
  219. this.getDictListByType('device_unit', (data) => {
  220. this.deviceUnitList = data
  221. })
  222. },
  223. data() {
  224. return {
  225. visible: false,
  226. title: '新增设备台账',
  227. queryShow: false,
  228. //表单参数
  229. deviceLedgerForm: {
  230. id: null,
  231. directoryId: null,
  232. deviceTypeId: null,
  233. deviceType: null,
  234. deviceName: null,
  235. deviceNum: null,
  236. deviceLevel: null,
  237. deviceModel: null,
  238. deviceLocation: null,
  239. deviceHealth: null,
  240. deviceDeptId: null,
  241. deviceDeptName: null,
  242. devicePerson: null,
  243. devicePersonName: null,
  244. buyTime: null,
  245. useTime: null,
  246. supplier: null,
  247. manufacturer: null,
  248. serialNumber: null,
  249. technicalDataList: [],
  250. runCondition: null,
  251. deviceState: null,
  252. pictureList: [],
  253. unit: null,
  254. remark: null
  255. },
  256. //字典回显参数
  257. deviceLevelList: [],
  258. deviceHealthList: [],
  259. supplierList: [],
  260. manufacturerList: [],
  261. deviceStateList: [],
  262. deviceUnitList: [],
  263. //设备技术参数得到的文件
  264. technicalDataFiles: [],
  265. //图片上传得到的文件
  266. pictureFiles: [],
  267. //修改时,删除的技术参数文件名
  268. delTechnicalNameList: [],
  269. //修改时,删除的图片文件名
  270. delPictureNameList: [],
  271. deviceLedgerRules: {
  272. deviceType: [
  273. { required: true, message: '设备类别不能为空', trigger: 'blur' }
  274. ],
  275. deviceName: [
  276. { required: true, message: '设备名称不能为空', trigger: 'blur' }
  277. ],
  278. deviceNum: [
  279. { required: true, message: '设备编号不能为空', trigger: 'blur' }
  280. ],
  281. deviceLevel: [
  282. { required: true, message: '设备等级不能为空', trigger: 'blur' }
  283. ],
  284. deviceModel: [
  285. { required: true, message: '设备规格型号不能为空', trigger: 'blur' }
  286. ],
  287. deviceLocation: [],
  288. deviceHealth: [
  289. { required: true, message: '设备健康状态不能为空', trigger: 'blur' }
  290. ],
  291. deviceDeptName: [
  292. { required: true, message: '使用部门不能为空', trigger: 'blur' }
  293. ],
  294. devicePersonName: [
  295. { required: true, message: '责任人不能为空', trigger: 'blur' }
  296. ],
  297. buyTime: [],
  298. useTime: [
  299. { required: true, message: '投用时间不能为空', trigger: 'blur' }
  300. ],
  301. supplier: [],
  302. manufacturer: [],
  303. serialNumber: [],
  304. runCondition: [],
  305. deviceState: [],
  306. deviceUnit: [],
  307. }
  308. }
  309. },
  310. methods: {
  311. /** 关闭弹出层 */
  312. dialogClose() {
  313. this.resetForm('deviceLedgerForm')
  314. this.$emit('getDeviceLedgerPage')
  315. this.visible = false
  316. this.queryShow = false
  317. },
  318. /** 重置表单 */
  319. resetForm(formName) {
  320. this.$refs[formName].resetFields();
  321. },
  322. /** 获取字典数据 */
  323. getDictListByType(params, callback) {
  324. getDictListByType({ keyType: params }).then(res => {
  325. callback(res.data);
  326. })
  327. },
  328. /** 高级查询 */
  329. queryDeviceLedgerEvent() {
  330. },
  331. /** 保存设备台账 */
  332. saveDeviceLedgerEvent() {
  333. this.$refs['deviceLedgerForm'].validate((valid) => {
  334. if (valid) {
  335. if (!this.deviceLedgerForm.id) {
  336. this.addDeviceLedger()
  337. } else {
  338. this.updateDeviceLedger()
  339. }
  340. }
  341. })
  342. },
  343. /** 新增设备台账 */
  344. addDeviceLedger() {
  345. const formData = new FormData()
  346. Object.keys(this.deviceLedgerForm).forEach(key => {
  347. if (this.deviceLedgerForm[key] instanceof Array) {
  348. // 如果是数组就循环加入表单,key保持相同即可,这就是表达单的数组
  349. // this.deviceLedgerForm[key].forEach(item => {
  350. // formData.append(key, item)
  351. // })
  352. } else {
  353. if (this.deviceLedgerForm[key]) {
  354. // 如果不是数组就直接追加进去
  355. formData.append(key, this.deviceLedgerForm[key])
  356. }
  357. }
  358. })
  359. this.technicalDataFiles.map(item => {
  360. if (item.raw) {
  361. formData.append("technicalDataFiles", item.raw);
  362. }
  363. });
  364. this.pictureFiles.map(item => {
  365. if (item.raw) {
  366. formData.append("pictureFiles", item.raw);
  367. }
  368. });
  369. addDeviceLedger(formData).then(res => {
  370. if (!res || !res.data) {
  371. this.$message({
  372. message: '新增设备台账失败!',
  373. type: 'warning'
  374. })
  375. return
  376. }
  377. this.$message({
  378. message: '新增设备台账成功!',
  379. type: 'success'
  380. })
  381. this.dialogClose()
  382. })
  383. },
  384. /** 修改设备台账 */
  385. updateDeviceLedger() {
  386. const formData = new FormData()
  387. Object.keys(this.deviceLedgerForm).forEach(key => {
  388. if (this.deviceLedgerForm[key] instanceof Array) {
  389. // 如果是数组就循环加入表单,key保持相同即可,这就是表达单的数组
  390. // this.deviceLedgerForm[key].forEach(item => {
  391. // formData.append(key, item)
  392. // })
  393. } else {
  394. if (this.deviceLedgerForm[key]) {
  395. // 如果不是数组就直接追加进去
  396. formData.append(key, this.deviceLedgerForm[key])
  397. }
  398. }
  399. })
  400. //将新上传的文件添加到FormData中
  401. this.technicalDataFiles.map(item => {
  402. if (item.raw) {
  403. formData.append("technicalDataFiles", item.raw);
  404. }
  405. });
  406. this.pictureFiles.map(item => {
  407. if (item.raw) {
  408. formData.append("pictureFiles", item.raw);
  409. }
  410. });
  411. this.delTechnicalNameList.map(item => {
  412. formData.append("delTechnicalNameList", item);
  413. })
  414. this.delPictureNameList.map(item => {
  415. formData.append("delPictureNameList", item);
  416. })
  417. updateDeviceLedger(formData).then(res => {
  418. if (!res || !res.data) {
  419. this.$message({
  420. message: '修改设备台账失败!',
  421. type: 'warning'
  422. })
  423. return
  424. }
  425. this.$message({
  426. message: '修改设备台账成功!',
  427. type: 'success'
  428. })
  429. this.dialogClose()
  430. })
  431. },
  432. /** 选择设备类别 */
  433. chooseDeviceType() {
  434. this.$refs.chooseDeviceType.visible = true
  435. },
  436. /** 接收选择设备类别传过来的值 */
  437. receiveChooseDeviceType(data) {
  438. this.deviceLedgerForm.deviceTypeId = data.id
  439. this.deviceLedgerForm.deviceType = data.deviceType
  440. },
  441. /** 选择部门 */
  442. chooseDept() {
  443. this.$refs.chooseDept.visible = true
  444. },
  445. /** 接收选择部门传过来的值 */
  446. receiveChooseDept(data) {
  447. this.deviceLedgerForm.deviceDeptId = data.id
  448. this.deviceLedgerForm.deviceDeptName = data.departmentName
  449. },
  450. /** 选择责任人 */
  451. chooseDevicePerson() {
  452. this.$refs.chooseDevicePerson.visible = true
  453. },
  454. receiveChooseStaff(data) {
  455. this.deviceLedgerForm.devicePerson = data.id
  456. this.deviceLedgerForm.devicePersonName = data.staffName
  457. },
  458. /** 设备技术参数改变 */
  459. handleChangeTechnical(file, fileList) {
  460. const obj = new Object();
  461. obj.url = file.url;
  462. obj.name = file.name;
  463. this.deviceLedgerForm.technicalDataList.push(obj)
  464. this.technicalDataFiles = fileList
  465. },
  466. /** 设备技术参数移除 */
  467. handleRemoveTechnical(file, fileList) {
  468. this.deviceLedgerForm.technicalDataList = this.deviceLedgerForm.technicalDataList.filter(item => item.url !== file.url)
  469. let url = file.url
  470. this.delTechnicalNameList.push(url.substring(url.indexOf(process.env.VUE_APP_BASE_API + "/") + (process.env.VUE_APP_BASE_API + "/").length))
  471. },
  472. /** 设备图片状态改变 */
  473. handleChangePicture(file, fileList) {
  474. const obj = new Object();
  475. obj.url = file.url;
  476. obj.name = file.name;
  477. this.deviceLedgerForm.pictureList.push(obj)
  478. this.pictureFiles = fileList
  479. },
  480. /** 设备图片移除文件 */
  481. handleRemovePicture(file, fileList) {
  482. this.deviceLedgerForm.pictureList = this.deviceLedgerForm.pictureList.filter(item => item.url !== file.url)
  483. let url = file.url
  484. this.delPictureNameList.push(url.substring(url.indexOf(process.env.VUE_APP_BASE_API + "/") + (process.env.VUE_APP_BASE_API + "/").length))
  485. }
  486. }
  487. }
  488. </script>
  489. <style rel="stylesheet/scss" lang="scss" scoped>
  490. .dialog-max {
  491. height: 90vh;
  492. .el-dialog__body {
  493. height: 77vh;
  494. overflow: auto;
  495. }
  496. }
  497. .el-upload-list {
  498. // height: 40px;
  499. overflow: auto;
  500. }
  501. </style>