From d492850f1cc64ddcfaf43798af9c76c2505414fd Mon Sep 17 00:00:00 2001
From: renkang <8417338+k94314517@user.noreply.gitee.com>
Date: 星期五, 24 一月 2025 18:24:31 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/2.0.1' into 2.0.1

---
 admin/src/views/operation/components/deviceEdit.vue |  356 ++++++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 301 insertions(+), 55 deletions(-)

diff --git a/admin/src/views/operation/components/deviceEdit.vue b/admin/src/views/operation/components/deviceEdit.vue
index 4c5c8f7..1b125ed 100644
--- a/admin/src/views/operation/components/deviceEdit.vue
+++ b/admin/src/views/operation/components/deviceEdit.vue
@@ -1,52 +1,170 @@
 <template>
   <GlobalWindow :title="param.id ? '缂栬緫璁惧' : '鏂板缓璁惧'" :confirmWorking="subLoading" :visible.sync="isShowModal"
-    width="600px" @close="close" @confirm="handleSub">
+    width="100%" @close="close" @confirm="handleSub">
     <el-form :model="param" ref="paramRef" :rules="rules">
-      <el-form-item label="璁惧缂栫爜" prop="code">
-        <el-input v-model="param.code" placeholder="璇疯緭鍏�" v-trim />
-      </el-form-item>
-      <el-form-item label="璁惧鍚嶇О" prop="name">
-        <el-input v-model="param.name" placeholder="璇疯緭鍏�" v-trim />
-      </el-form-item>
-      <el-form-item label="璁惧鍨嬪彿" prop="">
-        <el-input v-model="param.modelNo" placeholder="璇疯緭鍏�" v-trim />
-      </el-form-item>
-      <el-form-item label="璁惧鍒嗙被" prop="cateId">
-        <el-cascader v-model="param.cateIds" @change="changeSel" placeholder="璇烽�夋嫨璁惧鍒嗙被" clearable :options="cateList"
-          :props="{
-            label: 'name',
-            value: 'id',
-            children: 'childCategoryList'
-          }"></el-cascader>
-      </el-form-item>
-      <el-form-item label="璁惧绠$悊鍛�" prop="">
-        <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>
-      <el-form-item label="鎵�鍦ㄤ綅缃�" prop="">
-        <el-input v-model="param.addr" placeholder="璇疯緭鍏�" v-trim />
-
-      </el-form-item>
-      <el-form-item label="渚涘簲鍟�" prop="">
-        <el-input v-model="param.supplier" placeholder="璇疯緭鍏�" v-trim />
-      </el-form-item>
-      <el-form-item label="杩愮淮鍐呭" prop="">
-        <el-input type="textarea" :rows="4" v-model="param.content" placeholder="璇疯緭鍏�" />
-      </el-form-item>
-      <el-form-item label="璁惧鐘舵��" prop="">
-        <el-select v-model="param.status" filterable>
-          <el-option :value="0" label="姝e父"></el-option>
-          <el-option :value="1" label="鎹熷潖"></el-option>
-          <el-option :value="2" label="鎶ュ簾"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="鐓х墖" prop="">
-        <UploadAvatarImage :file="{ 'imgurlfull': param.fileFullUrl, 'imgurl': param.fileUrl }"
-          :uploadData="{ folder: 'ywDevice/' }" @uploadSuccess="uploadAvatarSuccess" @uploadEnd="isUploading = false"
-          @uploadBegin="isUploading = true" />
-      </el-form-item>
+      <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="姝e父"></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>
 
@@ -56,7 +174,10 @@
 import { fetchList } from '@/api/business/category'
 import { create, updateById, detailById } from '@/api/Inspection/device'
 import { getUserList } from '@/api/system/user'
-import { Message } from 'element-ui'
+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() {
@@ -64,22 +185,126 @@
       isShowModal: false,
       subLoading: false,
       param: {
-        status: 0
+        code: '',
+        name: '',
+        modelNo: '',
+        cateIds: '',
+        userId: '',
+        addr: '',
+        projectId: '',
+        rooms: [],
+        buildingId: '',
+        floorId: '',
+        roomId: '',
+        
+        supplier: [],
+        buyDate: '',
+        content: '',
+        supplierLinker: '',
+        supplierPhone: '',
+        maintenanceUserId: '',
+        maintenanceOverDate: '',
+        maintenanceContent: '',
+        status: 0,
+        multifileList: []
       },
-      cateList: [],
       rules: {
-        name: [{ required: true, message: '璇疯緭鍏�' }],
-        code: [{ required: true, message: '璇疯緭鍏�' }],
-        cateId: [{ required: true, message: '璇烽�夋嫨' }],
+        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' }]
       },
-      staffList: []
-
+      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) => {
@@ -100,6 +325,15 @@
     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) {
@@ -108,7 +342,6 @@
                 item.childCategoryList.forEach(item2 => {
                   if (item2.id == cateId) {
                     this.$set(this.param, 'cateIds', [item.id, item2.id])
-                    console.log('cateId', this.form)
                   }
                 })
               }
@@ -149,4 +382,17 @@
     }
   }
 }
-</script>
\ No newline at end of file
+</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>

--
Gitblit v1.9.3