| <template> | 
|   <GlobalWindow :title="param.id ? '编辑设备' : '新建设备'" :confirmWorking="subLoading" :visible.sync="isShowModal" | 
|     width="100%" @close="close" @confirm="handleSub"> | 
|     <el-form :model="param" ref="paramRef" :rules="rules"> | 
|       <div style="width: 100%; display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; padding-top: 20px; box-sizing: border-box;"> | 
|         <div class="title">基础信息</div> | 
|         <div style="width: 31%;"> | 
|           <el-form-item label="设备编码" prop="code"> | 
|             <el-input v-model="param.code" placeholder="请输入" v-trim /> | 
|           </el-form-item> | 
|         </div> | 
|         <div style="width: 31%;"> | 
|           <el-form-item label="设备名称" prop="name"> | 
|             <el-input v-model="param.name" placeholder="请输入" v-trim /> | 
|           </el-form-item> | 
|         </div> | 
|         <div style="width: 31%;"> | 
|           <el-form-item label="设备型号" prop="modelNo"> | 
|             <el-input v-model="param.modelNo" placeholder="请输入" v-trim /> | 
|           </el-form-item> | 
|         </div> | 
|         <div style="width: 31%;"> | 
|           <el-form-item label="设备分类" prop="cateIds"> | 
|             <el-cascader v-model="param.cateIds" @change="changeSel" placeholder="请选择设备分类" clearable :options="cateList" | 
|              :props="{ | 
|               label: 'name', | 
|               value: 'id', | 
|               children: 'childCategoryList' | 
|             }"></el-cascader> | 
|           </el-form-item> | 
|         </div> | 
|         <div style="width: 31%;"> | 
|           <el-form-item label="设备管理员" prop="userId"> | 
|             <el-select v-model="param.userId" clearable filterable> | 
|               <el-option v-for="item in staffList" :label="item.realname" :value="item.id"></el-option> | 
|             </el-select> | 
|           </el-form-item> | 
|         </div> | 
|         <div style="width: 31%;"> | 
|           <el-form-item label="所在位置" prop="addr"> | 
|             <el-input v-model="param.addr" placeholder="请输入" v-trim /> | 
|           </el-form-item> | 
|         </div> | 
|         <div style="width: 31%;"> | 
|           <el-form-item label="所属项目" prop="projectId"> | 
|             <el-select v-model="param.projectId" @change="changeProject" filterable> | 
|               <el-option v-for="item in projectList" :label="item.name" :value="item.id"></el-option> | 
|             </el-select> | 
|           </el-form-item> | 
|         </div> | 
|         <div style="width: 31%;"> | 
|           <el-form-item label="关联房源" prop="rooms"> | 
|             <el-cascader v-model="param.rooms" :disabled="!param.projectId" ref="cascader" @change="getHouseVal" placeholder="请选择关联房源" :options="houseList" | 
|              :props="{ | 
|               label: 'name', | 
|               value: 'id', | 
|               children: 'projectDataVOList' | 
|             }"></el-cascader> | 
|           </el-form-item> | 
|         </div> | 
|         <div style="width: 31%;"> | 
|           <el-form-item label="购入时间" prop="buyDate"> | 
|             <el-date-picker | 
|               v-model="param.buyDate" | 
|               type="date" | 
|               value-format="yyyy-MM-dd" | 
|               placeholder="选择日期"> | 
|             </el-date-picker> | 
|           </el-form-item> | 
|         </div> | 
|         <div style="width: 31%;"> | 
|           <el-form-item label="设备状态" prop="status"> | 
|             <el-select v-model="param.status" filterable> | 
|               <el-option :value="0" label="正常"></el-option> | 
|               <el-option :value="1" label="损坏"></el-option> | 
|               <el-option :value="2" label="报废"></el-option> | 
|             </el-select> | 
|           </el-form-item> | 
|         </div> | 
|         <div style="width: 100%;"> | 
|           <el-form-item label="运维内容" prop="content"> | 
|             <el-input type="textarea" :rows="4" v-model="param.content" placeholder="请输入" /> | 
|           </el-form-item> | 
|         </div> | 
|         <div style="width: 100%;"> | 
|           <el-form-item label="照片" prop=""> | 
|             <UploadAvatarImage :file="{ 'imgurlfull': param.fileFullUrl, 'imgurl': param.fileUrl }" | 
|              :uploadData="{ folder: 'ywDevice/' }" @uploadSuccess="uploadAvatarSuccess" @uploadEnd="isUploading = false" | 
|              @uploadBegin="isUploading = true" /> | 
|             <div style="width: 100%; height: 40px;"></div> | 
|           </el-form-item> | 
|         </div> | 
|         <div style="width: 100%;"> | 
|           <el-form-item label="附件" prop="multifileList"> | 
|             <div style="display: flex; flex-direction: column; align-items: flex-start;"> | 
|               <el-button type="text" @click="$refs.uploadFile.click()">+添加附件</el-button> | 
|               <el-table | 
|                 :data="param.multifileList" | 
|                 border | 
|                 style="width: 100%"> | 
|                 <el-table-column | 
|                   prop="name" | 
|                   label="附件名称"> | 
|                 </el-table-column> | 
|                 <el-table-column | 
|                   prop="createUserName" | 
|                   label="操作人"> | 
|                 </el-table-column> | 
|                 <el-table-column | 
|                   prop="createTime" | 
|                   label="操作时间"> | 
|                 </el-table-column> | 
|                 <el-table-column | 
|                   label="操作"> | 
|                   <template slot-scope="scope"> | 
|                     <el-button type="text" @click="deleFile(scope.$index)">删除</el-button> | 
|                   </template> | 
|                 </el-table-column> | 
|               </el-table> | 
|             </div> | 
|           </el-form-item> | 
|         </div> | 
|    | 
|         <div class="title">供应商信息</div> | 
|         <div style="width: 31%;"> | 
|           <el-form-item label="供应商" prop="supplier"> | 
|             <el-input v-model="param.supplier" placeholder="请输入" v-trim /> | 
|           </el-form-item> | 
|         </div> | 
|         <div style="width: 31%;"> | 
|           <el-form-item label="联系人" prop="supplierLinker"> | 
|             <el-input v-model="param.supplierLinker" placeholder="请输入" v-trim /> | 
|           </el-form-item> | 
|         </div> | 
|         <div style="width: 31%;"> | 
|           <el-form-item label="联系方式" prop="supplierPhone"> | 
|             <el-input v-model="param.supplierPhone" placeholder="请输入" v-trim /> | 
|           </el-form-item> | 
|         </div> | 
|    | 
|         <div class="title">维保信息</div> | 
|         <div style="width: 31%;"> | 
|           <el-form-item label="维保负责人" prop="maintenanceUserId"> | 
|             <el-select v-model="param.maintenanceUserId" clearable filterable> | 
|               <el-option v-for="item in staffList" :label="item.realname" :value="item.id"></el-option> | 
|             </el-select> | 
|           </el-form-item> | 
|         </div> | 
|         <div style="width: 31%;"> | 
|           <el-form-item label="维保到期日" prop="maintenanceOverDate"> | 
|             <el-date-picker | 
|               v-model="param.maintenanceOverDate" | 
|               type="date" | 
|               value-format="yyyy-MM-dd" | 
|               placeholder="选择日期"> | 
|             </el-date-picker> | 
|           </el-form-item> | 
|         </div> | 
|         <div style="width: 31%;"></div> | 
|         <div style="width: 100%;"> | 
|           <el-form-item label="维保说明" prop="maintenanceContent"> | 
|             <el-input v-model="param.maintenanceContent" type="textarea" placeholder="请输入" v-trim /> | 
|           </el-form-item> | 
|         </div> | 
|       </div> | 
|     </el-form> | 
|     <input type="file" ref="uploadFile" style="position: fixed; top: -20px; left: 0;" @change="getFile" /> | 
|   </GlobalWindow> | 
| </template> | 
|   | 
| <script> | 
| import GlobalWindow from '@/components/common/GlobalWindow' | 
| import UploadAvatarImage from '@/components/common/UploadAvatarImage' | 
| import { fetchList } from '@/api/business/category' | 
| import { create, updateById, detailById } from '@/api/Inspection/device' | 
| import { getUserList } from '@/api/system/user' | 
| import { uploadBatch } from '@/api/system/common' | 
| import { getProjectList, tree } from '@/api/project/ywProject' | 
| import { Loading, Message } from 'element-ui' | 
| import { mapState } from 'vuex' | 
| export default { | 
|   components: { GlobalWindow, UploadAvatarImage }, | 
|   data() { | 
|     return { | 
|       isShowModal: false, | 
|       subLoading: false, | 
|       param: { | 
|         code: '', | 
|         name: '', | 
|         modelNo: '', | 
|         cateIds: '', | 
|         userId: '', | 
|         addr: '', | 
|         projectId: '', | 
|         rooms: [], | 
|         buildingId: '', | 
|         floorId: '', | 
|         roomId: '', | 
|          | 
|         supplier: [], | 
|         buyDate: '', | 
|         content: '', | 
|         supplierLinker: '', | 
|         supplierPhone: '', | 
|         maintenanceUserId: '', | 
|         maintenanceOverDate: '', | 
|         maintenanceContent: '', | 
|         status: 0, | 
|         multifileList: [] | 
|       }, | 
|       rules: { | 
|         name: [{ required: true, message: '请输入', trigger: 'blur' }], | 
|         code: [{ required: true, message: '请输入', trigger: 'blur' }], | 
|         cateId: [{ required: true, message: '请选择', trigger: 'blur' }], | 
|         projectId: [{ required: true, message: '请选择', trigger: 'blur' }], | 
|         rooms: [{ required: true, message: '请选择', trigger: 'blur' }] | 
|       }, | 
|       loadings: false, | 
|       cateList: [], | 
|       houseList: [], | 
|       staffList: [], | 
|       projectList: [] | 
|     } | 
|   }, | 
|   computed: { | 
|     ...mapState(['userInfo']) | 
|   }, | 
|   created() { | 
|     this.initData() | 
|     this.getProjectLists() | 
|     console.log(this.userInfo) | 
|   }, | 
|   methods: { | 
|     getHouseVal(e) { | 
|       this.param.buildingId = e[1] | 
|       this.param.floorId = e[2] | 
|       this.param.roomId = e[3] | 
|     }, | 
|     changeProject(e) { | 
|       this.getHouseTree() | 
|     }, | 
|     getHouseTree() { | 
|       tree({ | 
|         projectId: this.param.projectId | 
|       }).then(res => { | 
|         this.addParamToArray(res) | 
|         this.houseList = res | 
|       }) | 
|     }, | 
|     addParamToArray(arr) { | 
|       for (let i = 0; i < arr.length; i++) { | 
|         const currentItem = arr[i].projectDataVOList | 
|         if (currentItem && currentItem.length >= 0) { | 
|           currentItem.forEach(item => { | 
|             if (item.lv === 3) { | 
|               delete item.projectDataVOList | 
|             } | 
|           }) | 
|         } | 
|         if (currentItem && currentItem.length > 0) { | 
|           this.addParamToArray(currentItem) | 
|         } | 
|       } | 
|     }, | 
|     deleFile(index) { | 
|       this.param.multifileList.splice(index, 1) | 
|     }, | 
|     // 获取项目 | 
|     getProjectLists() { | 
|       getProjectList({}) | 
|         .then(res => { | 
|           this.projectList = res | 
|         }) | 
|     }, | 
|     // 上传附件 | 
|     getFile(e) { | 
|       this.loadings = Loading.service({ | 
|         lock: true, | 
|         text: 'Loading', | 
|         spinner: 'el-icon-loading', | 
|         background: 'rgba(0, 0, 0, 0.7)' | 
|       }) | 
|       let formDate = new FormData() | 
|       formDate.append('folder', 'YW_DEVICE') | 
|       formDate.append('file', e.target.files[0]) | 
|       uploadBatch(formDate) | 
|         .then(res => { | 
|           this.param.multifileList.push({ ...res[0], fileurl: res[0].imgaddr, name: res[0].originname, createUserName: this.userInfo.realname, createTime: this.getDate() }) | 
|         }) | 
|         .finally(() => { | 
|           e.target.files = null | 
|           this.loadings.close() | 
|         }) | 
|     }, | 
|     getDate() { | 
|       const currentDate = new Date(); | 
|   | 
|       const year = currentDate.getFullYear(); // 获取当前年份 | 
|       const month = currentDate.getMonth() + 1; // 获取当前月份 (0-11,所以需要 +1) | 
|       const day = currentDate.getDate(); // 获取当前日期 | 
|       const hours = currentDate.getHours(); // 获取当前小时 | 
|       const minutes = currentDate.getMinutes(); // 获取当前分钟 | 
|       const seconds = currentDate.getSeconds(); // 获取当前秒钟 | 
|        | 
|       return `${year}-${month < 10 ? '0' + month : month}-${day < 10 ? '0' + day : day} ` | 
|               + `${hours < 10 ? '0' + hours : hours}:${minutes < 10 ? '0' + minutes : minutes}:${seconds < 10 ? '0' + seconds : seconds}`; | 
|     }, | 
|     handleSub() { | 
|       const { param, subLoading } = this | 
|       this.$refs['paramRef'].validate((valid) => { | 
|         if (valid) { | 
|           let fn = param.id ? updateById : create | 
|           this.subLoading = true | 
|           fn(param).then(res => { | 
|             this.subLoading = false | 
|             this.$emit('success') | 
|             Message.success('保存成功') | 
|             this.close() | 
|           }).catch(() => { | 
|             this.subLoading = false | 
|           }) | 
|         } | 
|       }) | 
|     }, | 
|     getDetail(id) { | 
|       detailById(id).then(res => { | 
|         this.param = res | 
|         this.param.rooms = [res.projectId, res.buildingId, res.floorId, res.roomId] | 
|         this.param.multifileList = res.multifileList.map(item => { | 
|           return { | 
|             ...item, | 
|             createUserName: item.userName, | 
|             createTime: item.createDate | 
|           } | 
|         }) | 
|         this.getHouseTree() | 
|         const cateId = this.param.cateId || '' | 
|         setTimeout(() => { | 
|           if (cateId) { | 
|             this.cateList.forEach(item => { | 
|               if (item.childCategoryList) { | 
|                 item.childCategoryList.forEach(item2 => { | 
|                   if (item2.id == cateId) { | 
|                     this.$set(this.param, 'cateIds', [item.id, item2.id]) | 
|                   } | 
|                 }) | 
|               } | 
|             }) | 
|           } | 
|         },1000) | 
|       }) | 
|     }, | 
|     getStaff() { | 
|       getUserList({}).then(res => { | 
|         this.staffList = res | 
|       }) | 
|     }, | 
|     initData() { | 
|       fetchList({ | 
|         model: { type: 5 }, | 
|         capacity: 1000, | 
|         page: 1, | 
|       }).then(res => { | 
|         this.cateList = res.records || [] | 
|       }) | 
|       this.getStaff() | 
|     }, | 
|     changeSel(e) { | 
|       if (e && e.length == 2) { | 
|         this.$set(this.param, 'cateId', e[1]) | 
|       } else { | 
|         this.$set(this.param, 'cateId', '') | 
|       } | 
|     }, | 
|     uploadAvatarSuccess(file) { | 
|       this.$set(this.param, 'fileUrl', file.imgurl) | 
|       this.$set(this.param, 'fileFullUrl', file.imgurlfull) | 
|     }, | 
|     close() { | 
|       this.isShowModal = false | 
|       this.$emit('close') | 
|     } | 
|   } | 
| } | 
| </script> | 
|   | 
| <style lang="scss" scoped> | 
|   @import '@/assets/style/variables.scss'; | 
|   .title { | 
|     width: 100%; | 
|     font-weight: 500; | 
|     font-size: 18px; | 
|     color: $primary-color; | 
|     margin-bottom: 10px; | 
|     display: flex; | 
|     align-items: center; | 
|   } | 
| </style> |