From ea689dd91eaa72425dc01759042c3b4eb2186512 Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期三, 17 六月 2026 10:14:44 +0800
Subject: [PATCH] 新增智能电表、空调管理

---
 admin/src/views/client/components/staffEdit.vue |  344 ++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 252 insertions(+), 92 deletions(-)

diff --git a/admin/src/views/client/components/staffEdit.vue b/admin/src/views/client/components/staffEdit.vue
index c85f098..4390a98 100644
--- a/admin/src/views/client/components/staffEdit.vue
+++ b/admin/src/views/client/components/staffEdit.vue
@@ -1,51 +1,105 @@
 <template>
-  <GlobalWindow :title="title" width="820px" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
-    <el-form :model="form" ref="form" label-position="top" :rules="rules">
-      <div class="list">
-        <el-form-item label="瀹㈡埛鍚嶇О" prop="customerId">
-          <el-select v-model="form.customerId" clearable filterable>
-            <el-option v-for="item in clientList" :value="item.id" :label="item.name" />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="濮撳悕" prop="name">
-          <div class="df">
-            <el-input v-model="form.name" placeholder="璇疯緭鍏�" v-trim />
-          </div>
-        </el-form-item>
-        <el-form-item label="鎵嬫満鍙�" prop="phone">
-          <el-input v-model="form.phone" placeholder="璇疯緭鍏ユ墜鏈哄彿" v-trim />
-        </el-form-item>
-        <el-form-item label="韬唤">
-          <el-select v-model="form.highCheckor" filterable>
-            <el-option :value="0" label="鑰佹澘/瓒呯骇绠$悊鍛�" />
-            <el-option :value="1" label="浜轰簨/绠$悊鍛�" />
-            <el-option :value="2" label="鍛樺伐/鏅�氬憳宸�" />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="璇佷欢绫诲瀷">
-          <el-select v-model="form.idcardType" filterable>
-            <el-option :value="0" label="韬唤璇�" />
-            <el-option :value="1" label="娓境璇佷欢" />
-            <el-option :value="2" label="鎶ょ収" />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="璇佷欢鍙风爜" prop="member.idcardNo">
-          <el-input v-model="form.idcardNo" placeholder="璇疯緭鍏�" v-trim />
-        </el-form-item>
-        <el-form-item label="閭" prop="email">
-          <el-input v-model="form.email" placeholder="璇疯緭鍏ラ偖绠�" v-trim />
-        </el-form-item>
-        <el-form-item label="鎬у埆">
-          <el-select v-model="form.sex" filterable>
-            <el-option :value="1" label="鐢�" />
-            <el-option :value="2" label="濂�" />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="鍑虹敓鏃ユ湡">
-          <el-date-picker type="date" v-model="form.birthday" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨" />
-        </el-form-item>
+  <GlobalWindow :title="title" width="720px" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
+    <el-form
+      ref="form"
+      :model="form"
+      :rules="rules"
+      label-width="88px"
+      label-position="right"
+      class="staff-edit-form"
+    >
+      <section class="form-section">
+        <div class="form-section__title">褰掑睘淇℃伅</div>
+        <div class="form-grid">
+          <el-form-item label="瀹㈡埛鍚嶇О" prop="customerId" class="col-full">
+            <el-select
+              v-model="form.customerId"
+              :disabled="form.id || customerId != ''"
+              clearable
+              filterable
+              placeholder="璇烽�夋嫨瀹㈡埛"
+            >
+              <el-option v-for="item in clientList" :key="item.id" :value="item.id" :label="item.name" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="韬唤">
+            <el-select v-model="form.highCheckor" filterable placeholder="璇烽�夋嫨韬唤">
+              <el-option :value="0" label="鑰佹澘/瓒呯骇绠$悊鍛�" />
+              <el-option :value="1" label="浜轰簨/绠$悊鍛�" />
+              <el-option :value="2" label="鍛樺伐/鏅�氬憳宸�" />
+            </el-select>
+          </el-form-item>
+        </div>
+      </section>
 
-      </div>
+      <section class="form-section">
+        <div class="form-section__title">鍩烘湰淇℃伅</div>
+        <div class="form-grid">
+          <el-form-item label="濮撳悕" prop="name">
+            <el-input v-model="form.name" placeholder="璇疯緭鍏ュ鍚�" v-trim />
+          </el-form-item>
+          <el-form-item label="鎵嬫満鍙�" prop="phone">
+            <el-input v-model="form.phone" placeholder="璇疯緭鍏ユ墜鏈哄彿" v-trim maxlength="11" />
+          </el-form-item>
+          <el-form-item label="鎬у埆">
+            <el-select v-model="form.sex" filterable clearable placeholder="璇烽�夋嫨鎬у埆">
+              <el-option :value="1" label="鐢�" />
+              <el-option :value="2" label="濂�" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="鍑虹敓鏃ユ湡">
+            <el-date-picker
+              v-model="form.birthday"
+              type="date"
+              value-format="yyyy-MM-dd"
+              placeholder="璇烽�夋嫨鍑虹敓鏃ユ湡"
+            />
+          </el-form-item>
+          <el-form-item
+            label="閭"
+            prop="email"
+            class="col-full"
+            :rules="[{ required: false, type: 'email', message: '璇疯緭鍏ユ纭殑閭鏍煎紡' }]"
+          >
+            <el-input v-model="form.email" placeholder="璇疯緭鍏ラ偖绠�" v-trim />
+          </el-form-item>
+        </div>
+      </section>
+
+      <section class="form-section">
+        <div class="form-section__title">璇佷欢淇℃伅</div>
+        <div class="form-grid">
+          <el-form-item label="璇佷欢绫诲瀷">
+            <el-select v-model="form.idcardType" filterable placeholder="璇烽�夋嫨璇佷欢绫诲瀷">
+              <el-option :value="0" label="韬唤璇�" />
+              <el-option :value="1" label="娓境璇佷欢" />
+              <el-option :value="2" label="鎶ょ収" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="璇佷欢鍙风爜" :prop="form.id ? '' : 'idcardNo'" class="col-full">
+            <el-input
+              v-if="!form.id"
+              v-model="form.idcardNo"
+              placeholder="璇疯緭鍏ヨ瘉浠跺彿鐮�"
+              v-trim
+              clearable
+            />
+            <div v-else class="idcard-field">
+              <div class="idcard-field__current">
+                <i class="el-icon-bank-card" />
+                <span class="idcard-field__label">褰撳墠璇佷欢鍙�</span>
+                <span class="idcard-field__value">{{ form.idcardDecode || '鏈櫥璁�' }}</span>
+              </div>
+              <el-input
+                v-model="form.idcardNoNew"
+                placeholder="濡傞渶鍙樻洿锛岃杈撳叆鏂拌瘉浠跺彿锛堢暀绌鸿〃绀轰笉淇敼锛�"
+                v-trim
+                clearable
+              />
+            </div>
+          </el-form-item>
+        </div>
+      </section>
     </el-form>
   </GlobalWindow>
 </template>
@@ -53,17 +107,15 @@
 <script>
 import BaseOpera from '@/components/base/BaseOpera'
 import GlobalWindow from '@/components/common/GlobalWindow'
-import { fetchCateList } from '@/api/business/category'
 import { staffRules } from './config'
-import { detailById } from '@/api/client/ywCustomer'
 import { fetchList } from '@/api/client/ywCustomer'
+
 export default {
   name: 'OperaYwCustomerWindow',
   extends: BaseOpera,
   components: { GlobalWindow },
   data() {
     return {
-      // 琛ㄥ崟鏁版嵁
       form: {
         id: null,
         customerId: '',
@@ -79,27 +131,25 @@
         sex: '',
         status: '',
         memberName: '',
-
         lastLoginDate: '',
         loginNum: '',
         userId: '',
-
         accountBank: '',
         accountNo: '',
         accountPhone: '',
         creditCard: '',
         fpType: '',
         accountAddr: '',
-        // identityType: '0',
-        name: "",
-        phone: "",
+        name: '',
+        phone: '',
         highCheckor: 0,
         idcardType: 0,
         idcardNo: '',
-        email: '',
+        idcardNoNew: '',
+        email: ''
       },
+      customerId: '',
       clientList: [],
-      // 楠岃瘉瑙勫垯
       rules: staffRules
     }
   },
@@ -109,7 +159,6 @@
       'field.id': 'id'
     })
   },
-
   methods: {
     initData() {
       fetchList({
@@ -123,55 +172,166 @@
     open(title, target) {
       this.title = title
       this.visible = true
+      this.customerId = ''
       this.initData()
-      // 鏂板缓
       if (target == null) {
         this.$nextTick(() => {
-          this.$refs.form.resetFields()
+          this.form = {
+            id: null,
+            customerId: '',
+            creator: '',
+            createDate: '',
+            editor: '',
+            editDate: '',
+            isdeleted: '',
+            birthday: '',
+            industryId: '',
+            type: '1',
+            idcardDecode: '',
+            sex: '',
+            status: '',
+            memberName: '',
+            lastLoginDate: '',
+            loginNum: '',
+            userId: '',
+            accountBank: '',
+            accountNo: '',
+            accountPhone: '',
+            creditCard: '',
+            fpType: '',
+            accountAddr: '',
+            name: '',
+            phone: '',
+            highCheckor: 0,
+            idcardType: 0,
+            idcardNo: '',
+            idcardNoNew: '',
+            email: ''
+          }
         })
         return
       }
-      // 缂栬緫
       this.$nextTick(() => {
         for (const key in this.form) {
           this.form[key] = target[key]
         }
+        this.form.idcardNo = ''
+        this.form.idcardNoNew = ''
       })
     },
     changeValid(e) {
       this.$set(this.form, 'validity', e ? '2099-12-31' : '')
-    },
-  }
-}
-</script>
-<style lang='scss' scoped>
-@import '@/assets/style/variables.scss';
-
-div {
-  box-sizing: border-box;
-}
-
-.title {
-  width: 100%;
-  font-weight: 500;
-  font-size: 15px;
-  margin-top: 16px;
-}
-
-.list {
-  /* padding-top: 14px; */
-  display: flex;
-  flex-wrap: wrap;
-
-  .el-form-item {
-    width: 33.33%;
-    margin-bottom: 12px;
-    padding: 0 12px;
-
-    .la {
-      color: #7f7f7f;
-      margin-top: 2px;
     }
   }
 }
-</style>
\ No newline at end of file
+</script>
+
+<style lang="scss" scoped>
+@import '@/assets/style/variables.scss';
+
+.staff-edit-form {
+  padding-top: 4px;
+
+  ::v-deep .el-form-item {
+    margin-bottom: 14px;
+  }
+
+  ::v-deep .el-form-item__label {
+    color: #606266;
+    font-size: 13px;
+    line-height: 32px;
+    padding-right: 12px;
+  }
+
+  ::v-deep .el-input,
+  ::v-deep .el-select,
+  ::v-deep .el-date-editor {
+    width: 100%;
+  }
+}
+
+.form-section {
+  margin-bottom: 14px;
+  padding: 16px 16px 2px;
+  background: #fff;
+  border: 1px solid #ebeef5;
+  border-radius: 6px;
+
+  &:last-child {
+    margin-bottom: 0;
+  }
+
+  &__title {
+    margin-bottom: 14px;
+    padding-bottom: 10px;
+    border-bottom: 1px solid #f0f2f5;
+    font-size: 14px;
+    font-weight: 600;
+    color: #303133;
+    line-height: 22px;
+
+    &::before {
+      content: '';
+      display: inline-block;
+      width: 3px;
+      height: 14px;
+      margin-right: 8px;
+      background: $primary-color;
+      border-radius: 2px;
+      vertical-align: -2px;
+    }
+  }
+}
+
+.form-grid {
+  display: grid;
+  grid-template-columns: repeat(2, minmax(0, 1fr));
+  column-gap: 20px;
+
+  .col-full {
+    grid-column: 1 / -1;
+  }
+}
+
+.idcard-field {
+  display: flex;
+  flex-direction: column;
+  gap: 8px;
+
+  &__current {
+    display: flex;
+    align-items: center;
+    min-height: 32px;
+    padding: 0 12px;
+    background: linear-gradient(90deg, #f8fafc 0%, #f5f7fa 100%);
+    border: 1px solid #e4e7ed;
+    border-radius: 4px;
+    font-size: 13px;
+    color: #606266;
+  }
+
+  .el-icon-bank-card {
+    margin-right: 6px;
+    font-size: 15px;
+    color: $primary-color;
+  }
+
+  &__label {
+    flex-shrink: 0;
+    margin-right: 8px;
+    color: #909399;
+    font-size: 12px;
+  }
+
+  &__value {
+    flex: 1;
+    min-width: 0;
+    color: #303133;
+    font-weight: 500;
+    letter-spacing: 0.4px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+}
+</style>

--
Gitblit v1.9.3