From 9bb75a9bd734c24d1913b37ab6ce7693359b139c Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 15 一月 2026 13:26:15 +0800
Subject: [PATCH] 进销存-升级 1.供应商往来展示联调修改 2.指标统计页面展示联调修改 3.用户管理新增修改时字段修改 4.不需要多用户登录

---
 src/api/salesManagement/indicatorStats.js                   |   20 
 src/store/modules/user.js                                   |    3 
 src/views/system/dept/index.vue                             |  452 +++++-----
 src/layout/components/Navbar.vue                            |   73 -
 src/views/salesManagement/receiptPaymentLedger/index.vue    |    9 
 src/components/PIMTable/PIMTable.vue                        |   18 
 src/views/salesManagement/salesLedger/index.vue             |    2 
 src/views/procurementManagement/paymentLedger/index.vue     |   47 
 src/views/procurementManagement/procurementLedger/index.vue |    2 
 src/views/system/user/index.vue                             | 1225 +++++++++++--------------------
 src/api/procurementManagement/paymentLedger.js              |    7 
 src/views/login.vue                                         |   23 
 src/views/salesManagement/indicatorStats/index.vue          |  346 ++++++--
 13 files changed, 959 insertions(+), 1,268 deletions(-)

diff --git a/src/api/procurementManagement/paymentLedger.js b/src/api/procurementManagement/paymentLedger.js
index 3e20b78..a6de8bc 100644
--- a/src/api/procurementManagement/paymentLedger.js
+++ b/src/api/procurementManagement/paymentLedger.js
@@ -4,16 +4,17 @@
 // 鍒嗛〉鏌ヨ
 export function paymentLedgerList(query) {
   return request({
-    url: "/purchase/paymentRegistration/paymentLedgerList",
+    url: "/purchase/paymentRegistration/supplierNameListPage",
     method: "get",
     params: query,
   });
 }
 
 // 鍒嗛〉鏌ヨ
-export function paymentRecordList(supplierId) {
+export function paymentRecordList(query) {
   return request({
-    url: "/purchase/paymentRegistration/getPaymentRecordList/" + supplierId,
+    url: "/purchase/paymentRegistration/supplierNameListPageDetails",
     method: "get",
+    params: query,
   });
 }
diff --git a/src/api/salesManagement/indicatorStats.js b/src/api/salesManagement/indicatorStats.js
new file mode 100644
index 0000000..47d7794
--- /dev/null
+++ b/src/api/salesManagement/indicatorStats.js
@@ -0,0 +1,20 @@
+// 鎸囨爣缁熻椤甸潰鎺ュ彛
+import request from "@/utils/request";
+
+// 澶撮儴缁熻鎺ュ彛
+export function getTotalStatistics(query) {
+  return request({
+    url: "/metricStatistics/total",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鏌辩姸鍥炬暟鎹帴鍙�
+export function getStatisticsTable(query) {
+  return request({
+    url: "/metricStatistics/statisticsTable",
+    method: "get",
+    params: query,
+  });
+}
diff --git a/src/components/PIMTable/PIMTable.vue b/src/components/PIMTable/PIMTable.vue
index 4174151..01462f0 100644
--- a/src/components/PIMTable/PIMTable.vue
+++ b/src/components/PIMTable/PIMTable.vue
@@ -214,6 +214,7 @@
     </el-table-column>
   </el-table>
   <pagination
+		v-if="isShowPagination"
     :total="page.total"
     :layout="page.layout"
     :page="page.current"
@@ -276,6 +277,10 @@
   isSelection: {
     type: Boolean,
     default: false,
+  },
+	isShowPagination: {
+    type: Boolean,
+    default: true,
   },
   isShowSummary: {
     type: Boolean,
@@ -438,19 +443,6 @@
   text-overflow: ellipsis;
   padding-right: 0 !important;
   padding-left: 0 !important;
-}
-
-.pim-table-header-cell {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  gap: 4px;
-  text-align: center;
-}
-
-.pim-table-header-title {
-  font-weight: 500;
 }
 
 .pim-table-header-extra :deep(.el-input),
diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue
index 03e2101..d4e938d 100644
--- a/src/layout/components/Navbar.vue
+++ b/src/layout/components/Navbar.vue
@@ -6,23 +6,6 @@
       <breadcrumb v-if="!settingsStore.topNav" id="breadcrumb-container" class="breadcrumb-container" />
     </div>
     <!--    <top-nav v-if="settingsStore.topNav" id="topmenu-container" class="topmenu-container" />-->
-    <div class="center-menu">
-      <span class="label">{{ userStore.currentFactoryName }}</span>
-      <el-dropdown @command="handleFactoryChange" class="right-menu-item hover-effect" trigger="click">
-        <div>
-          <el-icon size="20">
-            <Switch />
-          </el-icon>
-        </div>
-        <template #dropdown>
-          <el-dropdown-menu>
-            <el-dropdown-item v-for="item in factoryList" :key="item.deptId" :command="item">
-              {{ item.deptName }}
-            </el-dropdown-item>
-          </el-dropdown-menu>
-        </template>
-      </el-dropdown>
-    </div>
     <div class="right-menu">
       <!-- 娑堟伅閫氱煡 -->
       <el-popover
@@ -87,14 +70,10 @@
 import useAppStore from '@/store/modules/app'
 import useUserStore from '@/store/modules/user'
 import useSettingsStore from '@/store/modules/settings'
-import { userLoginFacotryList } from "@/api/system/user.js"
-import Cookies from "js-cookie";
-import { decrypt } from "@/utils/jsencrypt"
 
 const appStore = useAppStore()
 const userStore = useUserStore()
 const settingsStore = useSettingsStore()
-const factoryList = ref([])
 const notificationVisible = ref(false)
 const notificationCenterRef = ref(null)
 const unreadCount = ref(0)
@@ -139,42 +118,6 @@
 function toggleTheme() {
   settingsStore.toggleTheme()
 }
-
-function getUserLoginFacotryList() {
-  if (userStore.id) {
-    userLoginFacotryList({ userId: userStore.id }).then(res => {
-      console.log('res', res)
-      factoryList.value = res.data
-    })
-  } else {
-    factoryList.value = []
-  }
-}
-
-function handleFactoryChange(command) {
-  console.log('command', command)
-  handleLogin(command.deptId);
-}
-
-function handleLogin(currentFatoryId) {
-  const loginForm = {
-    username: Cookies.get("username"),
-    password: Cookies.get("password") === undefined ? null : decrypt(Cookies.get("password")),
-    currentFatoryId: currentFatoryId
-  }
-  userStore.loginCheckFactory(loginForm).then(res => {
-    forceReload();
-  }).catch((err) => {
-    console.log(err)
-  })
-}
-function forceReload() {
-  const currentUrl = window.location.origin + window.location.pathname;
-  const timestamp = new Date().getTime();
-  window.location.href = `${currentUrl}?reload=${timestamp}`;
-}
-
-getUserLoginFacotryList();
 
 // 娑堟伅閫氱煡鐩稿叧
 function handleUnreadCountChange(count) {
@@ -221,22 +164,6 @@
   position: relative;
   background: var(--navbar-bg);
   box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
-
-  .center-menu {
-    line-height: 50px;
-    position: absolute;
-    left: 50%;
-    transform: translateX(-50%);
-    display: flex;
-    align-items: center;
-
-    .label {
-      font-weight: bold;
-      font-size: 18px;
-      color: #333333;
-      margin-right: 10px;
-    }
-  }
 
   .hamburger-container {
     line-height: 46px;
diff --git a/src/store/modules/user.js b/src/store/modules/user.js
index 057af50..4f3eab4 100644
--- a/src/store/modules/user.js
+++ b/src/store/modules/user.js
@@ -99,9 +99,8 @@
       loginCheckFactory(userInfo) {
         const username = userInfo.username.trim()
         const password = userInfo.password
-        const factoryId = userInfo.currentFatoryId
         return new Promise((resolve, reject) => {
-          loginCheckFactory(username, password, factoryId).then(res => {
+          loginCheckFactory(username, password).then(res => {
             setToken(res.token)
             this.token = res.token
             resolve()
diff --git a/src/views/login.vue b/src/views/login.vue
index 5300637..6217877 100644
--- a/src/views/login.vue
+++ b/src/views/login.vue
@@ -10,7 +10,6 @@
           size="large"
           auto-complete="off"
           placeholder="璐﹀彿"
-          @input="getUserLoginFacotryList"
         >
           <template #prefix><el-icon><User /></el-icon></template>
         </el-input>
@@ -27,11 +26,6 @@
         >
           <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template>
         </el-input>
-      </el-form-item>
-      <el-form-item prop="currentFatoryId">
-        <el-select v-model="loginForm.currentFatoryId" placeholder="璇烽�夋嫨鍏徃" >
-          <el-option  v-for="item in factoryList" :key="item.deptId" :label="item.deptName" :value="item.deptId" />
-        </el-select>
       </el-form-item>
 <!--      <el-form-item prop="code" v-if="captchaEnabled">-->
 <!--        <el-input-->
@@ -77,7 +71,6 @@
 import Cookies from "js-cookie"
 import { encrypt, decrypt } from "@/utils/jsencrypt"
 import useUserStore from '@/store/modules/user'
-import {userLoginFacotryList} from "@/api/system/user.js"
 
 const title = import.meta.env.VITE_APP_TITLE
 const userStore = useUserStore()
@@ -89,7 +82,6 @@
   username: "",
   password: "",
   rememberMe: false,
-  currentFatoryId:'',
 })
 
 const loginRules = {
@@ -105,9 +97,6 @@
 // 娉ㄥ唽寮�鍏�
 const register = ref(false)
 const redirect = ref(undefined)
-
-const factoryList = ref([])
-const currentFatoryId = ref('')
 
 watch(route, (newRoute) => {
     redirect.value = newRoute.query && newRoute.query.redirect
@@ -162,20 +151,8 @@
   }
 }
 
-function getUserLoginFacotryList() {
-  if(loginForm.value.username){
-    userLoginFacotryList({userName:loginForm.value.username}).then(res => {
-      console.log('res', res)
-      factoryList.value = res.data
-    })
-  }else {
-    factoryList.value = []
-  }
-}
-
 getCode()
 getCookie()
-getUserLoginFacotryList()
 </script>
 
 <style lang='scss' scoped>
diff --git a/src/views/procurementManagement/paymentLedger/index.vue b/src/views/procurementManagement/paymentLedger/index.vue
index 741e6ac..294561d 100644
--- a/src/views/procurementManagement/paymentLedger/index.vue
+++ b/src/views/procurementManagement/paymentLedger/index.vue
@@ -43,7 +43,7 @@
             />
             <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" />
             <el-table-column
-              label="鍙戠エ閲戦(鍏�)"
+              label="鍚堝悓閲戦(鍏�)"
               prop="invoiceAmount"
               show-overflow-tooltip
               :formatter="formattedNumber"
@@ -83,6 +83,7 @@
             :column="tableColumnSon"
             :tableData="originalTableDataSon"
             :isSelection="false"
+            :isShowPagination="false"
             :tableLoading="tableLoadingSon"
             :isShowSummary="isShowSummarySon"
             :summaryMethod="summarizeMainTable1"
@@ -94,14 +95,6 @@
               </el-text>
             </template>
           </PIMTable>
-          <pagination
-            v-show="sonTotal > 0"
-            :total="sonTotal"
-            @pagination="sonPaginationSearch"
-            :layout="page.layout"
-            :page="sonPage.current"
-            :limit="sonPage.size"
-          />
         </div>
       </el-col>
     </el-row>
@@ -117,25 +110,6 @@
 } from "@/api/procurementManagement/paymentLedger.js";
 import Pagination from "../../../components/PIMTable/Pagination.vue";
 
-const tableColumn = ref([
-  {
-    label: "渚涘簲鍟嗗悕绉�",
-    prop: "supplierName",
-    width:240
-  },
-  {
-    label: "鍙戠エ閲戦(鍏�)",
-    prop: "invoiceAmount",
-  },
-  {
-    label: "浠樻閲戦(鍏�)",
-    prop: "paymentAmount",
-  },
-  {
-    label: "搴斾粯閲戦(鍏�)",
-    prop: "payableAmount",
-  },
-]);
 const tableData = ref([]);
 const tableLoading = ref(false);
 const data = reactive({
@@ -164,11 +138,16 @@
 const tableColumnSon = ref([
   {
     label: "鍙戠敓鏃ユ湡",
-    prop: "happenTime",
+    prop: "paymentDate",
 		width: 110,
   },
   {
-    label: "鍙戠エ閲戦(鍏�)",
+    label: "閲囪喘鍚堝悓鍙�",
+    prop: "purchaseContractNumber",
+		width: 150,
+  },
+  {
+    label: "鍚堝悓閲戦(鍏�)",
     prop: "invoiceAmount",
 		width: 200,
     formatData: (params) => {
@@ -177,7 +156,7 @@
   },
   {
     label: "浠樻閲戦(鍏�)",
-    prop: "currentPaymentAmount",
+    prop: "paymentAmount",
 		width: 200,
     formatData: (params) => {
       return params ? parseFloat(params).toFixed(2) : 0;
@@ -214,7 +193,7 @@
 const summarizeMainTable1 = (param) => {
   let summarizeTable = proxy.summarizeTable(
     param,
-    ["invoiceAmount", "currentPaymentAmount"],
+    ["invoiceAmount", "paymentAmount"],
     {
       ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
       futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
@@ -245,8 +224,6 @@
   paymentLedgerList({
     ...searchForm.value,
     ...page,
-    detailPageNum: detailPageNum.value, // 鏂板
-    detailPageSize: detailPageSize.value, // 鏂板
   }).then((res) => {
     let result = res.data;
     tableLoading.value = false;
@@ -261,7 +238,7 @@
 
 const getPaymenRecordtList = (supplierId) => {
   tableLoadingSon.value = true;
-  paymentRecordList(supplierId)
+  paymentRecordList({supplierId: supplierId})
     .then((res) => {
       tableLoadingSon.value = false;
       tableDataSon.value = res.data;
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index da4266e..4fde128 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -52,7 +52,7 @@
           show-summary
           :summary-method="summarizeMainTable"
           @expand-change="expandChange"
-          height="calc(100vh - 18.5em)"
+          height="calc(100vh - 22em)"
           :row-class-name="tableRowClassName"
       >
         <el-table-column align="center" type="selection" width="55" />
diff --git a/src/views/salesManagement/indicatorStats/index.vue b/src/views/salesManagement/indicatorStats/index.vue
index 7bd609e..65dae96 100644
--- a/src/views/salesManagement/indicatorStats/index.vue
+++ b/src/views/salesManagement/indicatorStats/index.vue
@@ -31,7 +31,7 @@
               <el-icon :size="30" color="#e6a23c"><Van /></el-icon>
             </div>
             <div class="stat-content">
-              <div class="stat-value">{{ indicatorKpis.shipmentRate }}%</div>
+              <div class="stat-value">{{ indicatorKpis.shipRate }}%</div>
               <div class="stat-label">鍙戣揣鐜�</div>
             </div>
           </div>
@@ -41,44 +41,27 @@
       <!-- 缁村害绛涢�� -->
       <el-row :gutter="20" class="search-row">
         <el-col :span="6">
-          <el-select v-model="indicatorFilter.product" placeholder="浜у搧" clearable>
-            <el-option label="鍏ㄩ儴浜у搧" value="" />
-            <el-option label="P.O 42.5鏅�氱閰哥洂姘存偿" value="P.O 42.5鏅�氱閰哥洂姘存偿" />
-            <el-option label="P.S 32.5鐭挎福纭呴吀鐩愭按娉�" value="P.S 32.5鐭挎福纭呴吀鐩愭按娉�" />
-            <el-option label="P.C 32.5澶嶅悎纭呴吀鐩愭按娉�" value="P.C 32.5澶嶅悎纭呴吀鐩愭按娉�" />
-          </el-select>
+          <el-tree-select v-model="indicatorFilter.productCategory" placeholder="浜у搧绫诲埆" clearable check-strictly
+            :data="productOptions" :render-after-expand="false" style="width: 100%" />
         </el-col>
         <el-col :span="6">
-          <el-select v-model="indicatorFilter.customer" placeholder="瀹㈡埛" clearable>
-            <el-option label="鍏ㄩ儴瀹㈡埛" value="" />
-            <el-option label="鍗庝笢寤烘潗闆嗗洟" value="鍗庝笢寤烘潗闆嗗洟" />
-            <el-option label="闀挎睙娣峰嚌鍦熷叕鍙�" value="闀挎睙娣峰嚌鍦熷叕鍙�" />
-            <el-option label="娴︽睙姘存偿鍒跺搧鍘�" value="娴︽睙姘存偿鍒跺搧鍘�" />
-          </el-select>
-        </el-col>
-        <el-col :span="6">
-          <el-select v-model="indicatorFilter.region" placeholder="鍖哄煙" clearable>
-            <el-option label="鍏ㄩ儴鍖哄煙" value="" />
-            <el-option label="鍗庝笢鍦板尯" value="鍗庝笢鍦板尯" />
-            <el-option label="鍗庡崡鍦板尯" value="鍗庡崡鍦板尯" />
-            <el-option label="鍗庡寳鍦板尯" value="鍗庡寳鍦板尯" />
+          <el-select v-model="indicatorFilter.customerName" placeholder="瀹㈡埛" clearable filterable>
+            <el-option v-for="item in customerOption" :key="item.id" :label="item.customerName" :value="item.customerName" />
           </el-select>
         </el-col>
         <el-col :span="6">
           <el-date-picker v-model="indicatorFilter.dateRange" type="daterange" range-separator="鑷�"
                           start-placeholder="寮�濮嬫棩鏈�" end-placeholder="缁撴潫鏃ユ湡" value-format="YYYY-MM-DD" style="width: 100%" />
         </el-col>
-        <el-col :span="24" style="text-align: right; margin-top: 10px;">
+        <el-col :span="6" style="text-align: right;">
           <el-button type="primary" @click="applyIndicatorFilter">鏌ヨ</el-button>
           <el-button @click="resetIndicatorFilter">閲嶇疆</el-button>
-          <el-button @click="exportIndicatorTable">瀵煎嚭鎶ヨ〃</el-button>
-          <el-button @click="exportIndicatorChart">瀵煎嚭鍥捐〃</el-button>
         </el-col>
       </el-row>
 
       <!-- 鍥捐〃鍖� -->
       <div class="chart-container">
-        <div ref="indicatorChartRef" style="width: 100%; height: 360px;"></div>
+        <div ref="indicatorChartRef" class="chart-wrapper"></div>
       </div>
 
       <!-- 涓氱哗缁熻锛堝洟闃熺淮搴︼紝鏃犱釜浜哄鍚嶏級 -->
@@ -88,8 +71,8 @@
         <el-table-column prop="salesAmount" label="閿�鍞">
           <template #default="scope">楼{{ scope.row.salesAmount.toLocaleString() }}</template>
         </el-table-column>
-        <el-table-column prop="shipmentRate" label="鍙戣揣鐜�">
-          <template #default="scope">{{ scope.row.shipmentRate }}%</template>
+        <el-table-column prop="shipRate" label="鍙戣揣鐜�">
+          <template #default="scope">{{ scope.row.shipRate }}</template>
         </el-table-column>
         <el-table-column prop="attainment" label="鐩爣杈炬垚鐜�">
           <template #default="scope">
@@ -104,35 +87,209 @@
 </template>
 
 <script setup>
-import { ref, reactive, onMounted, nextTick } from 'vue'
+import { ref, reactive, onMounted, onUnmounted, nextTick } from 'vue'
 import { Document, Van, Tickets } from '@element-plus/icons-vue'
 import * as echarts from 'echarts'
+import { getTotalStatistics, getStatisticsTable } from '@/api/salesManagement/indicatorStats'
+import { productTreeList } from '@/api/basicData/product.js'
+import { customerList } from '@/api/salesManagement/salesLedger.js'
+import { ElMessage } from 'element-plus'
 
 const indicatorKpis = reactive({
-  orderCount: 1280,
-  salesAmount: 9650000,
-  shipmentRate: 89.2
+  orderCount: 0,
+  salesAmount: 0,
+  shipRate: 0
 })
 
 // 鏄惁灞曠ず閿�鍞洟闃熸槑缁嗚〃锛屾寜闇�寮�鍚�
 const showTeamPerformance = ref(false)
+const loading = ref(false)
 
 const indicatorFilter = reactive({
-  product: '',
-  customer: '',
-  region: '',
+  productCategory: '',
+  customerName: '',
   dateRange: []
 })
 
 const indicatorChartRef = ref(null)
 let indicatorChart = null
 
+const productOptions = ref([])
+const customerOption = ref([])
+
 const teamPerformanceList = ref([
-  { team: '鍗庝笢澶у尯', orderCount: 320, salesAmount: 2850000, shipmentRate: 90, attainment: 105 },
-  { team: '鍗庡寳澶у尯', orderCount: 280, salesAmount: 2150000, shipmentRate: 86, attainment: 92 },
-  { team: '鍗庡崡澶у尯', orderCount: 210, salesAmount: 1850000, shipmentRate: 88, attainment: 78 },
-  { team: '瑗垮崡澶у尯', orderCount: 180, salesAmount: 1500000, shipmentRate: 83, attainment: 74 }
+  { team: '鍗庝笢澶у尯', orderCount: 320, salesAmount: 2850000, shipRate: 90, attainment: 105 },
+  { team: '鍗庡寳澶у尯', orderCount: 280, salesAmount: 2150000, shipRate: 86, attainment: 92 },
+  { team: '鍗庡崡澶у尯', orderCount: 210, salesAmount: 1850000, shipRate: 88, attainment: 78 },
+  { team: '瑗垮崡澶у尯', orderCount: 180, salesAmount: 1500000, shipRate: 83, attainment: 74 }
 ])
+
+// 杞崲浜у搧鏍戞暟鎹紝灏� id 鏀逛负 value
+function convertIdToValue(data) {
+  return data.map((item) => {
+    const { id, children, ...rest } = item
+    const newItem = {
+      ...rest,
+      value: id, // 灏� id 鏀逛负 value
+    }
+    if (children && children.length > 0) {
+      newItem.children = convertIdToValue(children)
+    }
+    return newItem
+  })
+}
+
+// 鑾峰彇浜у搧鏍戞暟鎹�
+const getProductOptions = () => {
+  return productTreeList().then((res) => {
+    productOptions.value = convertIdToValue(res)
+  }).catch((error) => {
+    console.error('鑾峰彇浜у搧鏍戝け璐�:', error)
+    ElMessage.error('鑾峰彇浜у搧绫诲埆澶辫触')
+  })
+}
+
+// 鑾峰彇瀹㈡埛鍒楄〃
+const getCustomerList = () => {
+  return customerList().then((res) => {
+    customerOption.value = res || []
+  }).catch((error) => {
+    console.error('鑾峰彇瀹㈡埛鍒楄〃澶辫触:', error)
+    ElMessage.error('鑾峰彇瀹㈡埛鍒楄〃澶辫触')
+  })
+}
+
+// 鏍规嵁 id 鏌ユ壘浜у搧绫诲埆鍚嶇О
+const findNodeLabelById = (nodes, id) => {
+  if (!id) return null
+  for (let i = 0; i < nodes.length; i++) {
+    if (nodes[i].value === id) {
+      return nodes[i].label
+    }
+    if (nodes[i].children && nodes[i].children.length > 0) {
+      const found = findNodeLabelById(nodes[i].children, id)
+      if (found) return found
+    }
+  }
+  return null
+}
+
+// 鑾峰彇澶撮儴缁熻鏁版嵁
+const fetchTotalStatistics = async () => {
+  try {
+    loading.value = true
+    const params = {}
+    if (indicatorFilter.customerName) {
+      params.customerName = indicatorFilter.customerName
+    }
+    if (indicatorFilter.productCategory) {
+      // 鏍规嵁 id 鏌ユ壘浜у搧绫诲埆鍚嶇О
+      const categoryName = findNodeLabelById(productOptions.value, indicatorFilter.productCategory)
+      if (categoryName) {
+        params.productCategory = categoryName
+      }
+    }
+    if (indicatorFilter.dateRange && indicatorFilter.dateRange.length === 2) {
+      params.entryDateStart = indicatorFilter.dateRange[0]
+      params.entryDateEnd = indicatorFilter.dateRange[1]
+    }
+    const res = await getTotalStatistics(params)
+    if (res && res.data) {
+      indicatorKpis.orderCount = res.data.total || 0
+      indicatorKpis.salesAmount = res.data.contractAmountTotal || 0
+      // 鍙戣揣鐜囧鏋滄帴鍙f病鏈夎繑鍥烇紝淇濇寔鍘熷�兼垨璁句负0
+      // indicatorKpis.shipRate = res.data.shipRate || 0
+    }
+  } catch (error) {
+    console.error('鑾峰彇澶撮儴缁熻澶辫触:', error)
+    ElMessage.error('鑾峰彇缁熻鏁版嵁澶辫触')
+  } finally {
+    loading.value = false
+  }
+}
+
+// 鑾峰彇鏌辩姸鍥炬暟鎹�
+const fetchStatisticsTable = async () => {
+  try {
+    loading.value = true
+    const params = {}
+    if (indicatorFilter.customerName) {
+      params.customerName = indicatorFilter.customerName
+    }
+    if (indicatorFilter.productCategory) {
+      // 鏍规嵁 id 鏌ユ壘浜у搧绫诲埆鍚嶇О
+      const categoryName = findNodeLabelById(productOptions.value, indicatorFilter.productCategory)
+      if (categoryName) {
+        params.productCategory = categoryName
+      }
+    }
+    if (indicatorFilter.dateRange && indicatorFilter.dateRange.length === 2) {
+      params.entryDateStart = indicatorFilter.dateRange[0]
+      params.entryDateEnd = indicatorFilter.dateRange[1]
+    }
+    const res = await getStatisticsTable(params)
+    if (res && res.data) {
+      updateChart(res.data)
+    }
+  } catch (error) {
+    console.error('鑾峰彇鍥捐〃鏁版嵁澶辫触:', error)
+    ElMessage.error('鑾峰彇鍥捐〃鏁版嵁澶辫触')
+  } finally {
+    loading.value = false
+  }
+}
+
+// 鏇存柊鍥捐〃
+const updateChart = (chartData) => {
+  if (!indicatorChartRef.value) return
+  if (indicatorChart) indicatorChart.dispose()
+  indicatorChart = echarts.init(indicatorChartRef.value)
+  
+  // 鏍规嵁鎺ュ彛杩斿洖鐨勬暟鎹粨鏋勬洿鏂板浘琛�
+  // 鎺ュ彛杩斿洖: dateList, orderCountList, salesAmountList
+  const option = {
+    title: { text: '澶氱淮搴﹂攢鍞寚鏍囪秼鍔�', left: 'center' },
+    tooltip: { trigger: 'axis' },
+    legend: { data: ['璁㈠崟鏁�', '閿�鍞'], top: 30 },
+    grid: { left: '3%', right: '8%', bottom: '3%', containLabel: true },
+    xAxis: { 
+      type: 'category', 
+      data: chartData.dateList || [] 
+    },
+    yAxis: [
+      { type: 'value', name: '閲戦', position: 'left', axisLabel: { formatter: '{value}' } },
+      { 
+        type: 'value', 
+        name: '鏁伴噺', 
+        position: 'right', 
+        minInterval: 1,
+        axisLabel: { 
+          formatter: (value) => {
+            const intValue = Math.round(value)
+            return intValue.toString()
+          }
+        }
+      }
+    ],
+    series: [
+      { 
+        name: '璁㈠崟鏁�', 
+        type: 'line', 
+        yAxisIndex: 1,
+        data: chartData.orderCountList || [], 
+        itemStyle: { color: '#409eff' } 
+      },
+      { 
+        name: '閿�鍞', 
+        type: 'bar', 
+        yAxisIndex: 0,
+        data: chartData.salesAmountList || [], 
+        itemStyle: { color: '#67c23a' } 
+      }
+    ]
+  }
+  indicatorChart.setOption(option)
+}
 
 const initIndicatorChart = () => {
   if (!indicatorChartRef.value) return
@@ -141,75 +298,73 @@
   const option = {
     title: { text: '澶氱淮搴﹂攢鍞寚鏍囪秼鍔�', left: 'center' },
     tooltip: { trigger: 'axis' },
-    legend: { data: ['璁㈠崟鏁�', '閿�鍞', '鍙戣揣鐜�'], top: 30 },
-    grid: { left: '3%', right: '4%', bottom: '3%', containLabel: true },
-    xAxis: { type: 'category', data: ['2024-12', '2025-01', '2025-02', '2025-03', '2025-04', '2025-05'] },
+    legend: { data: ['璁㈠崟鏁�', '閿�鍞'], top: 30 },
+    grid: { left: '3%', right: '8%', bottom: '3%', containLabel: true },
+    xAxis: { type: 'category', data: [] },
     yAxis: [
-      { type: 'value', name: '鏁伴噺/閲戦', axisLabel: { formatter: '{value}' } },
-      { type: 'value', name: '姣斾緥(%)', min: 0, max: 100, axisLabel: { formatter: '{value}%' } }
+      { type: 'value', name: '閲戦', position: 'left', axisLabel: { formatter: '{value}' } },
+      { 
+        type: 'value', 
+        name: '鏁伴噺', 
+        position: 'right', 
+        minInterval: 1,
+        axisLabel: { 
+          formatter: (value) => {
+            const intValue = Math.round(value)
+            return intValue.toString()
+          }
+        }
+      }
     ],
     series: [
-      { name: '璁㈠崟鏁�', type: 'bar', data: [180, 220, 210, 260, 205, 225], itemStyle: { color: '#409eff' } },
-      { name: '閿�鍞', type: 'bar', data: [820, 950, 910, 1080, 980, 1020], itemStyle: { color: '#67c23a' } },
-      { name: '鍙戣揣鐜�', type: 'line', yAxisIndex: 1, data: [86, 89, 88, 91, 87, 90], itemStyle: { color: '#e6a23c' } }
+      { name: '璁㈠崟鏁�', type: 'line', yAxisIndex: 1, data: [], itemStyle: { color: '#409eff' } },
+      { name: '閿�鍞', type: 'bar', yAxisIndex: 0, data: [], itemStyle: { color: '#67c23a' } }
     ]
   }
   indicatorChart.setOption(option)
 }
 
-const applyIndicatorFilter = () => {
-  const random = (base, delta) => {
-    const v = base + Math.round((Math.random() - 0.5) * delta)
-    return v < 0 ? 0 : v
-  }
-  indicatorKpis.orderCount = random(1280, 120)
-  indicatorKpis.salesAmount = random(9650000, 350000)
-  indicatorKpis.shipmentRate = (85 + Math.random() * 10).toFixed(1) * 1
-  setTimeout(() => initIndicatorChart(), 200)
+const applyIndicatorFilter = async () => {
+  await Promise.all([
+    fetchTotalStatistics(),
+    fetchStatisticsTable()
+  ])
 }
 
 const resetIndicatorFilter = () => {
-  indicatorFilter.product = ''
-  indicatorFilter.customer = ''
-  indicatorFilter.region = ''
+  indicatorFilter.productCategory = ''
+  indicatorFilter.customerName = ''
   indicatorFilter.dateRange = []
   applyIndicatorFilter()
 }
 
-const exportIndicatorTable = () => {
-  const header = ['閿�鍞洟闃�', '璁㈠崟鏁�', '閿�鍞', '鍙戣揣鐜�(%)', '鐩爣杈炬垚鐜�(%)']
-  const rows = teamPerformanceList.value.map(r => [
-    r.team,
-    r.orderCount,
-    r.salesAmount,
-    r.shipmentRate,
-    r.attainment
-  ])
-  const csv = [header, ...rows].map(r => r.join(',')).join('\n')
-  const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' })
-  const url = URL.createObjectURL(blob)
-  const link = document.createElement('a')
-  link.href = url
-  link.download = '鎸囨爣缁熻-鍥㈤槦涓氱哗.csv'
-  document.body.appendChild(link)
-  link.click()
-  document.body.removeChild(link)
-  URL.revokeObjectURL(url)
-}
-
-const exportIndicatorChart = () => {
-  if (!indicatorChart) return
-  const url = indicatorChart.getDataURL({ type: 'png', pixelRatio: 2, backgroundColor: '#fff' })
-  const link = document.createElement('a')
-  link.href = url
-  link.download = '鎸囨爣缁熻-鍥捐〃.png'
-  document.body.appendChild(link)
-  link.click()
-  document.body.removeChild(link)
+// 绐楀彛澶у皬鍙樺寲鏃惰皟鏁村浘琛ㄥぇ灏�
+const handleResize = () => {
+  if (indicatorChart) {
+    indicatorChart.resize()
+  }
 }
 
 onMounted(() => {
-  nextTick(() => initIndicatorChart())
+  nextTick(() => {
+    initIndicatorChart()
+    getProductOptions()
+    getCustomerList()
+    fetchTotalStatistics()
+    fetchStatisticsTable()
+  })
+  // 鐩戝惉绐楀彛澶у皬鍙樺寲
+  window.addEventListener('resize', handleResize)
+})
+
+onUnmounted(() => {
+  // 绉婚櫎绐楀彛澶у皬鍙樺寲鐩戝惉鍣�
+  window.removeEventListener('resize', handleResize)
+  // 閿�姣佸浘琛ㄥ疄渚�
+  if (indicatorChart) {
+    indicatorChart.dispose()
+    indicatorChart = null
+  }
 })
 </script>
 
@@ -225,7 +380,20 @@
 .stat-content { flex: 1; }
 .stat-value { font-size: 28px; font-weight: bold; color: #303133; margin-bottom: 4px; }
 .stat-label { font-size: 14px; color: #909399; }
-.chart-container { margin: 20px 0; padding: 20px; background: #fff; border-radius: 8px; box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); }
+.chart-container { 
+  margin: 20px 0; 
+  padding: 20px; 
+  background: #fff; 
+  border-radius: 8px; 
+  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+  width: 100%;
+  overflow: hidden;
+}
+.chart-wrapper {
+  width: 100%;
+  height: 360px;
+  min-width: 0;
+}
 </style>
 
 
diff --git a/src/views/salesManagement/receiptPaymentLedger/index.vue b/src/views/salesManagement/receiptPaymentLedger/index.vue
index 31bee75..7029cfc 100644
--- a/src/views/salesManagement/receiptPaymentLedger/index.vue
+++ b/src/views/salesManagement/receiptPaymentLedger/index.vue
@@ -130,14 +130,6 @@
             </template>
           </el-table-column>
         </el-table>
-        <pagination
-          v-show="recordTotal > 0"
-          :total="recordTotal"
-          layout="total, sizes, prev, pager, next, jumper"
-          :page="recordPage.current"
-          :limit="recordPage.size"
-          @pagination="recordPaginationChange"
-        />
       </div>
     </div>
   </div>
@@ -178,7 +170,6 @@
   getList();
 };
 const paginationChange = (obj) => {
-  console.log("paginationChange", current, limit);
   page.current = obj.page;
   page.size = obj.limit;
   getList();
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 6fe7057..35d5cba 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -75,8 +75,8 @@
           </template>
         </el-table-column>
         <el-table-column label="鍙戣揣鏃ユ湡" prop="shippingDate" width="120" show-overflow-tooltip />
-        <el-table-column label="褰曞叆鏃ユ湡" prop="entryDate" width="120" show-overflow-tooltip />
         <el-table-column label="绛捐鏃ユ湡" prop="executionDate" width="120" show-overflow-tooltip />
+        <el-table-column label="褰曞叆鏃ユ湡" prop="entryDate" width="120" show-overflow-tooltip />
         <el-table-column fixed="right" label="鎿嶄綔" min-width="200" align="center">
           <template #default="scope">
             <el-button link type="primary" size="small" @click="openForm('edit', scope.row)">缂栬緫</el-button>
diff --git a/src/views/system/dept/index.vue b/src/views/system/dept/index.vue
index f68bbec..bcc70ee 100644
--- a/src/views/system/dept/index.vue
+++ b/src/views/system/dept/index.vue
@@ -1,148 +1,148 @@
 <template>
-   <div class="app-container">
-      <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
-         <el-form-item label="鍏徃鍚嶇О" prop="deptName">
-            <el-input
-               v-model="queryParams.deptName"
-               placeholder="璇疯緭鍏ュ叕鍙稿悕绉�"
-               clearable
-               style="width: 200px"
-               @keyup.enter="handleQuery"
-            />
-         </el-form-item>
-         <el-form-item label="鐘舵��" prop="status">
-            <el-select v-model="queryParams.status" placeholder="鍏徃鐘舵��" clearable style="width: 200px">
-               <el-option
-                  v-for="dict in sys_normal_disable"
-                  :key="dict.value"
-                  :label="dict.label"
-                  :value="dict.value"
-               />
-            </el-select>
-         </el-form-item>
-         <el-form-item>
-            <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
-            <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
-         </el-form-item>
-      </el-form>
-
-      <el-row :gutter="10" class="mb8">
-         <el-col :span="1.5">
-            <el-button
-               type="primary"
-               plain
-               icon="Plus"
-               @click="handleAdd"
-               v-hasPermi="['system:dept:add']"
-            >鏂板</el-button>
-         </el-col>
-         <el-col :span="1.5">
-            <el-button
-               type="info"
-               plain
-               icon="Sort"
-               @click="toggleExpandAll"
-            >灞曞紑/鎶樺彔</el-button>
-         </el-col>
-         <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
-      </el-row>
-
-      <el-table
-         v-if="refreshTable"
-         v-loading="loading"
-         :data="deptList"
-         row-key="deptId"
-         :default-expand-all="isExpandAll"
-         :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
-      >
-         <el-table-column prop="deptName" label="鍏徃鍚嶇О" width="260"></el-table-column>
-         <el-table-column prop="orderNum" label="鎺掑簭" width="200"></el-table-column>
-         <el-table-column prop="status" label="鐘舵��" width="100">
-            <template #default="scope">
-               <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
-            </template>
-         </el-table-column>
-         <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="200">
-            <template #default="scope">
-               <span>{{ parseTime(scope.row.createTime) }}</span>
-            </template>
-         </el-table-column>
-         <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
-            <template #default="scope">
-               <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dept:edit']">淇敼</el-button>
-               <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['system:dept:add']">鏂板</el-button>
-               <el-button v-if="scope.row.parentId != 0" link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dept:remove']">鍒犻櫎</el-button>
-            </template>
-         </el-table-column>
-      </el-table>
-
-      <!-- 娣诲姞鎴栦慨鏀瑰叕鍙稿璇濇 -->
-      <el-dialog :title="title" v-model="open" width="600px" append-to-body>
-         <el-form ref="deptRef" :model="form" :rules="rules" label-width="80px">
-            <el-row>
-               <el-col :span="24" v-if="form.parentId !== 0">
-                  <el-form-item label="涓婄骇鍏徃" prop="parentId">
-                     <el-tree-select
-                        v-model="form.parentId"
-                        :data="deptOptions"
-                        :props="{ value: 'deptId', label: 'deptName', children: 'children' }"
-                        value-key="deptId"
-                        placeholder="閫夋嫨涓婄骇鍏徃"
-                        check-strictly
-                     />
-                  </el-form-item>
-               </el-col>
-               <el-col :span="12">
-                  <el-form-item label="鍏徃鍚嶇О" prop="deptName">
-                     <el-input v-model="form.deptName" placeholder="璇疯緭鍏ュ叕鍙稿悕绉�" />
-                  </el-form-item>
-               </el-col>
-               <el-col :span="12">
-                  <el-form-item label="鏄剧ず鎺掑簭" prop="orderNum">
-                     <el-input-number v-model="form.orderNum" controls-position="right" :min="0"/>
-                  </el-form-item>
-               </el-col>
-               <el-col :span="12">
-                  <el-form-item label="璐熻矗浜�" prop="leader">
-                     <el-input v-model="form.leader" placeholder="璇疯緭鍏ヨ礋璐d汉" maxlength="20" />
-                  </el-form-item>
-               </el-col>
-               <el-col :span="12">
-                  <el-form-item label="鑱旂郴鐢佃瘽" prop="phone">
-                     <el-input v-model="form.phone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�" maxlength="11" />
-                  </el-form-item>
-               </el-col>
-               <el-col :span="12">
-                  <el-form-item label="閭" prop="email">
-                     <el-input v-model="form.email" placeholder="璇疯緭鍏ラ偖绠�" maxlength="50" />
-                  </el-form-item>
-               </el-col>
-               <el-col :span="12">
-                  <el-form-item label="鍏徃鐘舵��">
-                     <el-radio-group v-model="form.status">
-                        <el-radio
-                           v-for="dict in sys_normal_disable"
-                           :key="dict.value"
-                           :value="dict.value"
-                        >{{ dict.label }}</el-radio>
-                     </el-radio-group>
-                  </el-form-item>
-               </el-col>
-              <el-col :span="12">
-                <el-form-item label="鍏徃缂栧彿" prop="deptNick">
-                  <el-input v-model="form.deptNick" placeholder="璇疯緭鍏ュ叕鍙哥紪鍙�" maxlength="50" />
-                </el-form-item>
-              </el-col>
-            </el-row>
-         </el-form>
-         <template #footer>
-            <div class="dialog-footer">
-               <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
-               <el-button @click="cancel">鍙� 娑�</el-button>
-            </div>
-         </template>
-      </el-dialog>
-   </div>
+	<div class="app-container">
+		<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
+			<el-form-item label="閮ㄩ棬鍚嶇О" prop="deptName">
+				<el-input
+					v-model="queryParams.deptName"
+					placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�"
+					clearable
+					style="width: 200px"
+					@keyup.enter="handleQuery"
+				/>
+			</el-form-item>
+			<el-form-item label="鐘舵��" prop="status">
+				<el-select v-model="queryParams.status" placeholder="閮ㄩ棬鐘舵��" clearable style="width: 200px">
+					<el-option
+						v-for="dict in sys_normal_disable"
+						:key="dict.value"
+						:label="dict.label"
+						:value="dict.value"
+					/>
+				</el-select>
+			</el-form-item>
+			<el-form-item>
+				<el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
+				<el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
+			</el-form-item>
+		</el-form>
+		
+		<el-row :gutter="10" class="mb8">
+			<el-col :span="1.5">
+				<el-button
+					type="primary"
+					plain
+					icon="Plus"
+					@click="handleAdd"
+					v-hasPermi="['system:dept:add']"
+				>鏂板</el-button>
+			</el-col>
+			<el-col :span="1.5">
+				<el-button
+					type="info"
+					plain
+					icon="Sort"
+					@click="toggleExpandAll"
+				>灞曞紑/鎶樺彔</el-button>
+			</el-col>
+			<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+		</el-row>
+		
+		<el-table
+			v-if="refreshTable"
+			v-loading="loading"
+			:data="deptList"
+			row-key="deptId"
+			:default-expand-all="isExpandAll"
+			:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
+		>
+			<el-table-column prop="deptName" label="閮ㄩ棬鍚嶇О" width="260"></el-table-column>
+			<el-table-column prop="orderNum" label="鎺掑簭" width="200"></el-table-column>
+			<el-table-column prop="status" label="鐘舵��" width="100">
+				<template #default="scope">
+					<dict-tag :options="sys_normal_disable" :value="scope.row.status" />
+				</template>
+			</el-table-column>
+			<el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="200">
+				<template #default="scope">
+					<span>{{ parseTime(scope.row.createTime) }}</span>
+				</template>
+			</el-table-column>
+			<el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+				<template #default="scope">
+					<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dept:edit']">淇敼</el-button>
+					<el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['system:dept:add']">鏂板</el-button>
+					<el-button v-if="scope.row.parentId != 0" link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dept:remove']">鍒犻櫎</el-button>
+				</template>
+			</el-table-column>
+		</el-table>
+		
+		<!-- 娣诲姞鎴栦慨鏀归儴闂ㄥ璇濇 -->
+		<el-dialog :title="title" v-model="open" width="600px" append-to-body>
+			<el-form ref="deptRef" :model="form" :rules="rules" label-width="80px">
+				<el-row>
+					<el-col :span="24" v-if="form.parentId !== 0">
+						<el-form-item label="涓婄骇閮ㄩ棬" prop="parentId">
+							<el-tree-select
+								v-model="form.parentId"
+								:data="deptOptions"
+								:props="{ value: 'deptId', label: 'deptName', children: 'children' }"
+								value-key="deptId"
+								placeholder="閫夋嫨涓婄骇閮ㄩ棬"
+								check-strictly
+							/>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="閮ㄩ棬鍚嶇О" prop="deptName">
+							<el-input v-model="form.deptName" placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="鏄剧ず鎺掑簭" prop="orderNum">
+							<el-input-number v-model="form.orderNum" controls-position="right" :min="0"/>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="璐熻矗浜�" prop="leader">
+							<el-input v-model="form.leader" placeholder="璇疯緭鍏ヨ礋璐d汉" maxlength="20" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="鑱旂郴鐢佃瘽" prop="phone">
+							<el-input v-model="form.phone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�" maxlength="11" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="閭" prop="email">
+							<el-input v-model="form.email" placeholder="璇疯緭鍏ラ偖绠�" maxlength="50" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="閮ㄩ棬鐘舵��">
+							<el-radio-group v-model="form.status">
+								<el-radio
+									v-for="dict in sys_normal_disable"
+									:key="dict.value"
+									:value="dict.value"
+								>{{ dict.label }}</el-radio>
+							</el-radio-group>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="閮ㄩ棬缂栧彿" prop="deptNick">
+							<el-input v-model="form.deptNick" placeholder="璇疯緭鍏ラ儴闂ㄧ紪鍙�" maxlength="50" />
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+			<template #footer>
+				<div class="dialog-footer">
+					<el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+					<el-button @click="cancel">鍙� 娑�</el-button>
+				</div>
+			</template>
+		</el-dialog>
+	</div>
 </template>
 
 <script setup name="Dept">
@@ -161,129 +161,129 @@
 const refreshTable = ref(true)
 
 const data = reactive({
-  form: {},
-  queryParams: {
-    deptName: undefined,
-    status: undefined
-  },
-  rules: {
-    parentId: [{ required: true, message: "涓婄骇鍏徃涓嶈兘涓虹┖", trigger: "blur" }],
-    deptName: [{ required: true, message: "鍏徃鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }],
-    orderNum: [{ required: true, message: "鏄剧ず鎺掑簭涓嶈兘涓虹┖", trigger: "blur" }],
-    email: [{ type: "email", message: "璇疯緭鍏ユ纭殑閭鍦板潃", trigger: ["blur", "change"] }],
-    phone: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜", trigger: "blur" }],
-    deptNick: [{ required: true, message: "鍏徃缂栧彿涓嶈兘涓虹┖", trigger: "blur" }],
-  },
+	form: {},
+	queryParams: {
+		deptName: undefined,
+		status: undefined
+	},
+	rules: {
+		parentId: [{ required: true, message: "涓婄骇閮ㄩ棬涓嶈兘涓虹┖", trigger: "blur" }],
+		deptName: [{ required: true, message: "閮ㄩ棬鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }],
+		orderNum: [{ required: true, message: "鏄剧ず鎺掑簭涓嶈兘涓虹┖", trigger: "blur" }],
+		email: [{ type: "email", message: "璇疯緭鍏ユ纭殑閭鍦板潃", trigger: ["blur", "change"] }],
+		phone: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜", trigger: "blur" }],
+		deptNick: [{ required: true, message: "閮ㄩ棬缂栧彿涓嶈兘涓虹┖", trigger: "blur" }],
+	},
 })
 
 const { queryParams, form, rules } = toRefs(data)
 
-/** 鏌ヨ鍏徃鍒楄〃 */
+/** 鏌ヨ閮ㄩ棬鍒楄〃 */
 function getList() {
-  loading.value = true
-  listDept(queryParams.value).then(response => {
-    deptList.value = proxy.handleTree(response.data, "deptId")
-    loading.value = false
-  })
+	loading.value = true
+	listDept(queryParams.value).then(response => {
+		deptList.value = proxy.handleTree(response.data, "deptId")
+		loading.value = false
+	})
 }
 
 /** 鍙栨秷鎸夐挳 */
 function cancel() {
-  open.value = false
-  reset()
+	open.value = false
+	reset()
 }
 
 /** 琛ㄥ崟閲嶇疆 */
 function reset() {
-  form.value = {
-    deptId: undefined,
-    parentId: undefined,
-    deptName: undefined,
-    orderNum: 0,
-    leader: undefined,
-    phone: undefined,
-    email: undefined,
-    status: "0",
-    deptNick: undefined,
-  }
-  proxy.resetForm("deptRef")
+	form.value = {
+		deptId: undefined,
+		parentId: undefined,
+		deptName: undefined,
+		orderNum: 0,
+		leader: undefined,
+		phone: undefined,
+		email: undefined,
+		status: "0",
+		deptNick: undefined,
+	}
+	proxy.resetForm("deptRef")
 }
 
 /** 鎼滅储鎸夐挳鎿嶄綔 */
 function handleQuery() {
-  getList()
+	getList()
 }
 
 /** 閲嶇疆鎸夐挳鎿嶄綔 */
 function resetQuery() {
-  proxy.resetForm("queryRef")
-  handleQuery()
+	proxy.resetForm("queryRef")
+	handleQuery()
 }
 
 /** 鏂板鎸夐挳鎿嶄綔 */
 function handleAdd(row) {
-  reset()
-  listDept().then(response => {
-    deptOptions.value = proxy.handleTree(response.data, "deptId")
-  })
-  if (row != undefined) {
-    form.value.parentId = row.deptId
-  }
-  open.value = true
-  title.value = "娣诲姞鍏徃"
+	reset()
+	listDept().then(response => {
+		deptOptions.value = proxy.handleTree(response.data, "deptId")
+	})
+	if (row != undefined) {
+		form.value.parentId = row.deptId
+	}
+	open.value = true
+	title.value = "娣诲姞閮ㄩ棬"
 }
 
 /** 灞曞紑/鎶樺彔鎿嶄綔 */
 function toggleExpandAll() {
-  refreshTable.value = false
-  isExpandAll.value = !isExpandAll.value
-  nextTick(() => {
-    refreshTable.value = true
-  })
+	refreshTable.value = false
+	isExpandAll.value = !isExpandAll.value
+	nextTick(() => {
+		refreshTable.value = true
+	})
 }
 
 /** 淇敼鎸夐挳鎿嶄綔 */
 function handleUpdate(row) {
-  reset()
-  listDeptExcludeChild(row.deptId).then(response => {
-    deptOptions.value = proxy.handleTree(response.data, "deptId")
-  })
-  getDept(row.deptId).then(response => {
-    form.value = response.data
-    open.value = true
-    title.value = "淇敼鍏徃"
-  })
+	reset()
+	listDeptExcludeChild(row.deptId).then(response => {
+		deptOptions.value = proxy.handleTree(response.data, "deptId")
+	})
+	getDept(row.deptId).then(response => {
+		form.value = response.data
+		open.value = true
+		title.value = "淇敼閮ㄩ棬"
+	})
 }
 
 /** 鎻愪氦鎸夐挳 */
 function submitForm() {
-  proxy.$refs["deptRef"].validate(valid => {
-    if (valid) {
-      if (form.value.deptId != undefined) {
-        updateDept(form.value).then(response => {
-          proxy.$modal.msgSuccess("淇敼鎴愬姛")
-          open.value = false
-          getList()
-        })
-      } else {
-        addDept(form.value).then(response => {
-          proxy.$modal.msgSuccess("鏂板鎴愬姛")
-          open.value = false
-          getList()
-        })
-      }
-    }
-  })
+	proxy.$refs["deptRef"].validate(valid => {
+		if (valid) {
+			if (form.value.deptId != undefined) {
+				updateDept(form.value).then(response => {
+					proxy.$modal.msgSuccess("淇敼鎴愬姛")
+					open.value = false
+					getList()
+				})
+			} else {
+				addDept(form.value).then(response => {
+					proxy.$modal.msgSuccess("鏂板鎴愬姛")
+					open.value = false
+					getList()
+				})
+			}
+		}
+	})
 }
 
 /** 鍒犻櫎鎸夐挳鎿嶄綔 */
 function handleDelete(row) {
-  proxy.$modal.confirm('鏄惁纭鍒犻櫎鍚嶇О涓�"' + row.deptName + '"鐨勬暟鎹」?').then(function() {
-    return delDept(row.deptId)
-  }).then(() => {
-    getList()
-    proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
-  }).catch(() => {})
+	proxy.$modal.confirm('鏄惁纭鍒犻櫎鍚嶇О涓�"' + row.deptName + '"鐨勬暟鎹」?').then(function() {
+		return delDept(row.deptId)
+	}).then(() => {
+		getList()
+		proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
+	}).catch(() => {})
 }
 
 getList()
diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue
index 40fb371..0855f11 100644
--- a/src/views/system/user/index.vue
+++ b/src/views/system/user/index.vue
@@ -1,902 +1,541 @@
 <template>
-  <div class="app-container">
-    <el-row :gutter="20" style="height: calc(100vh - 8em)">
-      <splitpanes
-        :horizontal="appStore.device === 'mobile'"
-        class="default-theme"
-      >
-        <!--閮ㄩ棬鏁版嵁-->
-        <pane size="16">
-          <el-col style="padding: 10px">
-            <div class="head-container">
-              <el-input
-                v-model="deptName"
-                placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�"
-                clearable
-                prefix-icon="Search"
-                style="margin-bottom: 20px"
-              />
-            </div>
-            <div class="head-container">
-              <el-tree
-                :data="deptOptions"
-                :props="{ label: 'label', children: 'children' }"
-                :expand-on-click-node="false"
-                :filter-node-method="filterNode"
-                ref="deptTreeRef"
-                node-key="id"
-                highlight-current
-                default-expand-all
-                @node-click="handleNodeClick"
-              />
-            </div>
-          </el-col>
-        </pane>
-        <!--鐢ㄦ埛鏁版嵁-->
-        <pane size="84">
-          <el-col style="padding: 10px">
-            <el-form
-              :model="queryParams"
-              ref="queryRef"
-              :inline="true"
-              v-show="showSearch"
-              label-width="68px"
-            >
-              <el-form-item label="鐧诲綍璐﹀彿" prop="userName">
-                <el-input
-                  v-model="queryParams.userName"
-                  placeholder="璇疯緭鍏ョ櫥褰曡处鍙�"
-                  clearable
-                  style="width: 240px"
-                  @keyup.enter="handleQuery"
-                />
-              </el-form-item>
-              <el-form-item label="鎵嬫満鍙风爜" prop="phonenumber">
-                <el-input
-                  v-model="queryParams.phonenumber"
-                  placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�"
-                  clearable
-                  style="width: 240px"
-                  @keyup.enter="handleQuery"
-                />
-              </el-form-item>
-              <el-form-item label="鐘舵��" prop="status">
-                <el-select
-                  v-model="queryParams.status"
-                  placeholder="鐢ㄦ埛鐘舵��"
-                  clearable
-                  style="width: 240px"
-                >
-                  <el-option
-                    v-for="dict in sys_normal_disable"
-                    :key="dict.value"
-                    :label="dict.label"
-                    :value="dict.value"
-                  />
-                </el-select>
-              </el-form-item>
-              <el-form-item label="鍒涘缓鏃堕棿" style="width: 308px">
-                <el-date-picker
-                  v-model="dateRange"
-                  value-format="YYYY-MM-DD"
-                  type="daterange"
-                  range-separator="-"
-                  start-placeholder="寮�濮嬫棩鏈�"
-                  end-placeholder="缁撴潫鏃ユ湡"
-                ></el-date-picker>
-              </el-form-item>
-              <el-form-item>
-                <el-button type="primary" icon="Search" @click="handleQuery"
-                  >鎼滅储</el-button
-                >
-                <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
-              </el-form-item>
-            </el-form>
-
-            <el-row :gutter="10" class="mb8">
-              <el-col :span="1.5">
-                <el-button
-                  type="primary"
-                  plain
-                  icon="Plus"
-                  @click="handleAdd"
-                  v-hasPermi="['system:user:add']"
-                  >鏂板</el-button
-                >
-              </el-col>
-              <el-col :span="1.5">
-                <el-button
-                  type="success"
-                  plain
-                  icon="Edit"
-                  :disabled="single"
-                  @click="handleUpdate"
-                  v-hasPermi="['system:user:edit']"
-                  >淇敼</el-button
-                >
-              </el-col>
-              <el-col :span="1.5">
-                <el-button
-                  type="danger"
-                  plain
-                  icon="Delete"
-                  :disabled="multiple"
-                  @click="handleDelete"
-                  v-hasPermi="['system:user:remove']"
-                  >鍒犻櫎</el-button
-                >
-              </el-col>
-              <el-col :span="1.5">
-                <el-button
-                  type="info"
-                  plain
-                  icon="Upload"
-                  @click="handleImport"
-                  v-hasPermi="['system:user:import']"
-                  >瀵煎叆</el-button
-                >
-              </el-col>
-              <el-col :span="1.5">
-                <el-button
-                  type="warning"
-                  plain
-                  icon="Download"
-                  @click="handleExport"
-                  v-hasPermi="['system:user:export']"
-                  >瀵煎嚭</el-button
-                >
-              </el-col>
-              <right-toolbar
-                v-model:showSearch="showSearch"
-                @queryTable="getList"
-                :columns="columns"
-              ></right-toolbar>
-            </el-row>
-
-            <el-table
-              v-loading="loading"
-              :data="userList"
-              @selection-change="handleSelectionChange"
-            >
-              <el-table-column type="selection" width="50" align="center" />
-              <el-table-column
-                label="鐢ㄦ埛缂栧彿"
-                align="center"
-                key="userId"
-                prop="userId"
-                v-if="columns[0].visible"
-              />
-              <el-table-column
-                label="鐧诲綍璐﹀彿"
-                align="center"
-                key="userName"
-                prop="userName"
-                v-if="columns[1].visible"
-                :show-overflow-tooltip="true"
-              />
-              <el-table-column
-                label="鐢ㄦ埛鏄电О"
-                align="center"
-                key="nickName"
-                prop="nickName"
-                v-if="columns[2].visible"
-                :show-overflow-tooltip="true"
-              />
-              <el-table-column
-                label="閮ㄩ棬"
-                align="center"
-                key="deptNames"
-                prop="deptNames"
-                v-if="columns[3].visible"
-                :show-overflow-tooltip="true"
-              />
-              <el-table-column
-                label="鎵嬫満鍙风爜"
-                align="center"
-                key="phonenumber"
-                prop="phonenumber"
-                v-if="columns[4].visible"
-                width="120"
-              />
-              <el-table-column
-                label="鐘舵��"
-                align="center"
-                key="status"
-                v-if="columns[5].visible"
-              >
-                <template #default="scope">
-                  <el-switch
-                    v-model="scope.row.status"
-                    active-value="0"
-                    inactive-value="1"
-                    @change="handleStatusChange(scope.row)"
-                  ></el-switch>
-                </template>
-              </el-table-column>
-              <el-table-column
-                label="鍒涘缓鏃堕棿"
-                align="center"
-                prop="createTime"
-                v-if="columns[6].visible"
-                width="160"
-              >
-                <template #default="scope">
-                  <span>{{ parseTime(scope.row.createTime) }}</span>
-                </template>
-              </el-table-column>
-              <el-table-column
-                label="鎿嶄綔"
-                align="center"
-                width="150"
-                class-name="small-padding fixed-width"
-              >
-                <template #default="scope">
-                  <el-tooltip
-                    content="淇敼"
-                    placement="top"
-                    v-if="scope.row.userId !== 1"
-                  >
-                    <el-button
-                      link
-                      type="primary"
-                      icon="Edit"
-                      @click="handleUpdate(scope.row)"
-                      v-hasPermi="['system:user:edit']"
-                    ></el-button>
-                  </el-tooltip>
-                  <el-tooltip
-                    content="鍒犻櫎"
-                    placement="top"
-                    v-if="scope.row.userId !== 1"
-                  >
-                    <el-button
-                      link
-                      type="primary"
-                      icon="Delete"
-                      @click="handleDelete(scope.row)"
-                      v-hasPermi="['system:user:remove']"
-                    ></el-button>
-                  </el-tooltip>
-                  <el-tooltip
-                    content="閲嶇疆瀵嗙爜"
-                    placement="top"
-                    v-if="scope.row.userId !== 1"
-                  >
-                    <el-button
-                      link
-                      type="primary"
-                      icon="Key"
-                      @click="handleResetPwd(scope.row)"
-                      v-hasPermi="['system:user:resetPwd']"
-                    ></el-button>
-                  </el-tooltip>
-                  <el-tooltip
-                    content="鍒嗛厤瑙掕壊"
-                    placement="top"
-                    v-if="scope.row.userId !== 1"
-                  >
-                    <el-button
-                      link
-                      type="primary"
-                      icon="CircleCheck"
-                      @click="handleAuthRole(scope.row)"
-                      v-hasPermi="['system:user:edit']"
-                    ></el-button>
-                  </el-tooltip>
-                </template>
-              </el-table-column>
-            </el-table>
-            <pagination
-              v-show="total > 0"
-              :total="total"
-              v-model:page="queryParams.pageNum"
-              v-model:limit="queryParams.pageSize"
-              @pagination="getList"
-            />
-          </el-col>
-        </pane>
-      </splitpanes>
-    </el-row>
-
-    <!-- 娣诲姞鎴栦慨鏀圭敤鎴烽厤缃璇濇 -->
-    <el-dialog :title="title" v-model="open" width="600px" append-to-body>
-      <el-form :model="form" :rules="rules" ref="userRef" label-width="80px">
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="鐢ㄦ埛鏄电О" prop="nickName">
-              <el-input
-                v-model="form.nickName"
-                placeholder="璇疯緭鍏ョ敤鎴锋樀绉�"
-                maxlength="30"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="褰掑睘鍏徃" prop="deptIds">
-              <el-tree-select
-                v-model="form.deptIds"
-                :data="enabledDeptOptions"
-                :render-after-expand="false"
-                show-checkbox
-                multiple
-                placeholder="璇烽�夋嫨褰掑睘鍏徃"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="鎵嬫満鍙风爜" prop="phonenumber">
-              <el-input
-                v-model="form.phonenumber"
-                placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�"
-                maxlength="11"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="閭" prop="email">
-              <el-input
-                v-model="form.email"
-                placeholder="璇疯緭鍏ラ偖绠�"
-                maxlength="50"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="12">
-            <el-form-item
-              v-if="form.userId == undefined"
-              label="鐧诲綍璐﹀彿"
-              prop="userName"
-            >
-              <el-input
-                v-model="form.userName"
-                placeholder="璇疯緭鍏ョ櫥褰曡处鍙�"
-                maxlength="30"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item
-              v-if="form.userId == undefined"
-              label="鐢ㄦ埛瀵嗙爜"
-              prop="password"
-            >
-              <el-input
-                v-model="form.password"
-                placeholder="璇疯緭鍏ョ敤鎴峰瘑鐮�"
-                type="password"
-                maxlength="20"
-                show-password
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="鐢ㄦ埛鎬у埆">
-              <el-select v-model="form.sex" placeholder="璇烽�夋嫨">
-                <el-option
-                  v-for="dict in sys_user_sex"
-                  :key="dict.value"
-                  :label="dict.label"
-                  :value="dict.value"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鐘舵��">
-              <el-radio-group v-model="form.status">
-                <el-radio
-                  v-for="dict in sys_normal_disable"
-                  :key="dict.value"
-                  :value="dict.value"
-                  >{{ dict.label }}</el-radio
-                >
-              </el-radio-group>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="宀椾綅">
-              <el-select v-model="form.postIds" multiple placeholder="璇烽�夋嫨">
-                <el-option
-                  v-for="item in postOptions"
-                  :key="item.postId"
-                  :label="item.postName"
-                  :value="item.postId"
-                  :disabled="item.status == 1"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="瑙掕壊" prop="roleIds">
-              <el-select v-model="form.roleIds" multiple placeholder="璇烽�夋嫨">
-                <el-option
-                  v-for="item in roleOptions"
-                  :key="item.roleId"
-                  :label="item.roleName"
-                  :value="item.roleId"
-                  :disabled="item.status == 1"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="24">
-            <el-form-item label="澶囨敞">
-              <el-input
-                v-model="form.remark"
-                type="textarea"
-                placeholder="璇疯緭鍏ュ唴瀹�"
-              ></el-input>
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
-          <el-button @click="cancel">鍙� 娑�</el-button>
-        </div>
-      </template>
-    </el-dialog>
-
-    <!-- 鐢ㄦ埛瀵煎叆瀵硅瘽妗� -->
-    <el-dialog
-      :title="upload.title"
-      v-model="upload.open"
-      width="400px"
-      append-to-body
-    >
-      <el-upload
-        ref="uploadRef"
-        :limit="1"
-        accept=".xlsx, .xls"
-        :headers="upload.headers"
-        :action="upload.url + '?updateSupport=' + upload.updateSupport"
-        :disabled="upload.isUploading"
-        :on-progress="handleFileUploadProgress"
-        :on-success="handleFileSuccess"
-        :auto-upload="false"
-        drag
-      >
-        <el-icon class="el-icon--upload"><upload-filled /></el-icon>
-        <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
-        <template #tip>
-          <div class="el-upload__tip text-center">
-            <div class="el-upload__tip">
-              <el-checkbox
-                v-model="upload.updateSupport"
-              />鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
-            </div>
-            <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span>
-            <el-link
-              type="primary"
-              :underline="false"
-              style="font-size: 12px; vertical-align: baseline"
-              @click="importTemplate"
-              >涓嬭浇妯℃澘</el-link
-            >
-          </div>
-        </template>
-      </el-upload>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
-          <el-button @click="upload.open = false">鍙� 娑�</el-button>
-        </div>
-      </template>
-    </el-dialog>
-  </div>
+	<div class="app-container">
+		<el-row :gutter="20" style="height: calc(100vh - 8em)">
+			<splitpanes :horizontal="appStore.device === 'mobile'" class="default-theme">
+				<!--閮ㄩ棬鏁版嵁-->
+				<pane size="16">
+					<el-col style="padding: 10px">
+						<div class="head-container">
+							<el-input v-model="deptName" placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�" clearable prefix-icon="Search" style="margin-bottom: 20px" />
+						</div>
+						<div class="head-container">
+							<el-tree :data="deptOptions" :props="{ label: 'label', children: 'children' }" :expand-on-click-node="false" :filter-node-method="filterNode" ref="deptTreeRef" node-key="id" highlight-current default-expand-all @node-click="handleNodeClick" />
+						</div>
+					</el-col>
+				</pane>
+				<!--鐢ㄦ埛鏁版嵁-->
+				<pane size="84">
+					<el-col style="padding: 10px">
+						<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+							<el-form-item label="鐧诲綍璐﹀彿" prop="userName">
+								<el-input v-model="queryParams.userName" placeholder="璇疯緭鍏ョ櫥褰曡处鍙�" clearable style="width: 240px" @keyup.enter="handleQuery" />
+							</el-form-item>
+							<el-form-item label="鎵嬫満鍙风爜" prop="phonenumber">
+								<el-input v-model="queryParams.phonenumber" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" clearable style="width: 240px" @keyup.enter="handleQuery" />
+							</el-form-item>
+							<el-form-item label="鐘舵��" prop="status">
+								<el-select v-model="queryParams.status" placeholder="鐢ㄦ埛鐘舵��" clearable style="width: 240px">
+									<el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
+								</el-select>
+							</el-form-item>
+							<el-form-item label="鍒涘缓鏃堕棿" style="width: 308px">
+								<el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-" start-placeholder="寮�濮嬫棩鏈�" end-placeholder="缁撴潫鏃ユ湡"></el-date-picker>
+							</el-form-item>
+							<el-form-item>
+								<el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
+								<el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
+							</el-form-item>
+						</el-form>
+						
+						<el-row :gutter="10" class="mb8">
+							<el-col :span="1.5">
+								<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:user:add']">鏂板</el-button>
+							</el-col>
+							<el-col :span="1.5">
+								<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate" v-hasPermi="['system:user:edit']">淇敼</el-button>
+							</el-col>
+							<el-col :span="1.5">
+								<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['system:user:remove']">鍒犻櫎</el-button>
+							</el-col>
+							<el-col :span="1.5">
+								<el-button type="info" plain icon="Upload" @click="handleImport" v-hasPermi="['system:user:import']">瀵煎叆</el-button>
+							</el-col>
+							<el-col :span="1.5">
+								<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:user:export']">瀵煎嚭</el-button>
+							</el-col>
+							<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
+						</el-row>
+						
+						<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
+							<el-table-column type="selection" width="50" align="center" />
+							<el-table-column label="鐢ㄦ埛缂栧彿" align="center" key="userId" prop="userId" v-if="columns[0].visible" />
+							<el-table-column label="鐧诲綍璐﹀彿" align="center" key="userName" prop="userName" v-if="columns[1].visible" :show-overflow-tooltip="true" />
+							<el-table-column label="鐢ㄦ埛鏄电О" align="center" key="nickName" prop="nickName" v-if="columns[2].visible" :show-overflow-tooltip="true" />
+							<el-table-column label="閮ㄩ棬" align="center" key="deptName" prop="dept.deptName" v-if="columns[3].visible" :show-overflow-tooltip="true" />
+							<el-table-column label="鎵嬫満鍙风爜" align="center" key="phonenumber" prop="phonenumber" v-if="columns[4].visible" width="120" />
+							<el-table-column label="鐘舵��" align="center" key="status" v-if="columns[5].visible">
+								<template #default="scope">
+									<el-switch
+										v-model="scope.row.status"
+										active-value="0"
+										inactive-value="1"
+										@change="handleStatusChange(scope.row)"
+									></el-switch>
+								</template>
+							</el-table-column>
+							<el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" v-if="columns[6].visible" width="160">
+								<template #default="scope">
+									<span>{{ parseTime(scope.row.createTime) }}</span>
+								</template>
+							</el-table-column>
+							<el-table-column label="鎿嶄綔" align="center" width="150" class-name="small-padding fixed-width">
+								<template #default="scope">
+									<el-tooltip content="淇敼" placement="top" v-if="scope.row.userId !== 1">
+										<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:user:edit']"></el-button>
+									</el-tooltip>
+									<el-tooltip content="鍒犻櫎" placement="top" v-if="scope.row.userId !== 1">
+										<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:user:remove']"></el-button>
+									</el-tooltip>
+									<el-tooltip content="閲嶇疆瀵嗙爜" placement="top" v-if="scope.row.userId !== 1">
+										<el-button link type="primary" icon="Key" @click="handleResetPwd(scope.row)" v-hasPermi="['system:user:resetPwd']"></el-button>
+									</el-tooltip>
+									<el-tooltip content="鍒嗛厤瑙掕壊" placement="top" v-if="scope.row.userId !== 1">
+										<el-button link type="primary" icon="CircleCheck" @click="handleAuthRole(scope.row)" v-hasPermi="['system:user:edit']"></el-button>
+									</el-tooltip>
+								</template>
+							</el-table-column>
+						</el-table>
+						<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+					</el-col>
+				</pane>
+			</splitpanes>
+		</el-row>
+		
+		<!-- 娣诲姞鎴栦慨鏀圭敤鎴烽厤缃璇濇 -->
+		<el-dialog :title="title" v-model="open" width="600px" append-to-body>
+			<el-form :model="form" :rules="rules" ref="userRef" label-width="80px">
+				<el-row>
+					<el-col :span="12">
+						<el-form-item v-if="form.userId == undefined" label="鐧诲綍璐﹀彿" prop="userName">
+							<el-input v-model="form.userName" placeholder="璇疯緭鍏ョ敤鎴峰悕绉�" maxlength="30" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item v-if="form.userId == undefined" label="鐢ㄦ埛瀵嗙爜" prop="password">
+							<el-input v-model="form.password" placeholder="璇疯緭鍏ョ敤鎴峰瘑鐮�" type="password" maxlength="20" show-password />
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="12">
+						<el-form-item label="鐢ㄦ埛鏄电О" prop="nickName">
+							<el-input v-model="form.nickName" placeholder="璇疯緭鍏ョ敤鎴锋樀绉�" maxlength="30" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="褰掑睘閮ㄩ棬" prop="deptId">
+							<el-tree-select v-model="form.deptId" :data="enabledDeptOptions" :props="{ value: 'id', label: 'label', children: 'children' }" value-key="id" placeholder="璇烽�夋嫨褰掑睘閮ㄩ棬" check-strictly />
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="12">
+						<el-form-item label="宀椾綅" prop="postIds">
+							<el-select v-model="form.postIds" multiple placeholder="璇烽�夋嫨">
+								<el-option v-for="item in postOptions" :key="item.postId" :label="item.postName" :value="item.postId" :disabled="item.status == 1"></el-option>
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="瑙掕壊" prop="roleIds">
+							<el-select v-model="form.roleIds" multiple placeholder="璇烽�夋嫨">
+								<el-option v-for="item in roleOptions" :key="item.roleId" :label="item.roleName" :value="item.roleId" :disabled="item.status == 1"></el-option>
+							</el-select>
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="12">
+						<el-form-item label="鎵嬫満鍙风爜" prop="phonenumber">
+							<el-input v-model="form.phonenumber" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" maxlength="11" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="閭" prop="email">
+							<el-input v-model="form.email" placeholder="璇疯緭鍏ラ偖绠�" maxlength="50" />
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="12">
+						<el-form-item label="鐢ㄦ埛鎬у埆">
+							<el-select v-model="form.sex" placeholder="璇烽�夋嫨">
+								<el-option v-for="dict in sys_user_sex" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="鐘舵��">
+							<el-radio-group v-model="form.status">
+								<el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
+							</el-radio-group>
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="24">
+						<el-form-item label="澶囨敞">
+							<el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�"></el-input>
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+			<template #footer>
+				<div class="dialog-footer">
+					<el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+					<el-button @click="cancel">鍙� 娑�</el-button>
+				</div>
+			</template>
+		</el-dialog>
+		
+		<!-- 鐢ㄦ埛瀵煎叆瀵硅瘽妗� -->
+		<el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
+			<el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
+				<el-icon class="el-icon--upload"><upload-filled /></el-icon>
+				<div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+				<template #tip>
+					<div class="el-upload__tip text-center">
+						<div class="el-upload__tip">
+							<el-checkbox v-model="upload.updateSupport" />鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
+						</div>
+						<span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span>
+						<el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="importTemplate">涓嬭浇妯℃澘</el-link>
+					</div>
+				</template>
+			</el-upload>
+			<template #footer>
+				<div class="dialog-footer">
+					<el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
+					<el-button @click="upload.open = false">鍙� 娑�</el-button>
+				</div>
+			</template>
+		</el-dialog>
+	</div>
 </template>
 
 <script setup name="User">
-import { getToken } from "@/utils/auth";
-import useAppStore from "@/store/modules/app";
-import {
-  changeUserStatus,
-  listUser,
-  resetUserPwd,
-  delUser,
-  getUser,
-  updateUser,
-  addUser,
-  deptTreeSelect,
-} from "@/api/system/user";
-import { Splitpanes, Pane } from "splitpanes";
-import "splitpanes/dist/splitpanes.css";
-import {onMounted} from "vue";
+import { getToken } from "@/utils/auth"
+import useAppStore from '@/store/modules/app'
+import { changeUserStatus, listUser, resetUserPwd, delUser, getUser, updateUser, addUser, deptTreeSelect } from "@/api/system/user"
+import { Splitpanes, Pane } from "splitpanes"
+import "splitpanes/dist/splitpanes.css"
 
-const router = useRouter();
-const appStore = useAppStore();
-const { proxy } = getCurrentInstance();
-const { sys_normal_disable, sys_user_sex } = proxy.useDict(
-  "sys_normal_disable",
-  "sys_user_sex"
-);
+const router = useRouter()
+const appStore = useAppStore()
+const { proxy } = getCurrentInstance()
+const { sys_normal_disable, sys_user_sex } = proxy.useDict("sys_normal_disable", "sys_user_sex")
 
-const userList = ref([]);
-const open = ref(false);
-const loading = ref(true);
-const showSearch = ref(true);
-const ids = ref([]);
-const single = ref(true);
-const multiple = ref(true);
-const total = ref(0);
-const title = ref("");
-const dateRange = ref([]);
-const deptName = ref("");
-const deptOptions = ref(undefined);
-const enabledDeptOptions = ref(undefined);
-const initPassword = ref(undefined);
-const postOptions = ref([]);
-const roleOptions = ref([]);
+const userList = ref([])
+const open = ref(false)
+const loading = ref(true)
+const showSearch = ref(true)
+const ids = ref([])
+const single = ref(true)
+const multiple = ref(true)
+const total = ref(0)
+const title = ref("")
+const dateRange = ref([])
+const deptName = ref("")
+const deptOptions = ref(undefined)
+const enabledDeptOptions = ref(undefined)
+const initPassword = ref(undefined)
+const postOptions = ref([])
+const roleOptions = ref([])
 /*** 鐢ㄦ埛瀵煎叆鍙傛暟 */
 const upload = reactive({
-  // 鏄惁鏄剧ず寮瑰嚭灞傦紙鐢ㄦ埛瀵煎叆锛�
-  open: false,
-  // 寮瑰嚭灞傛爣棰橈紙鐢ㄦ埛瀵煎叆锛�
-  title: "",
-  // 鏄惁绂佺敤涓婁紶
-  isUploading: false,
-  // 鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
-  updateSupport: 0,
-  // 璁剧疆涓婁紶鐨勮姹傚ご閮�
-  headers: { Authorization: "Bearer " + getToken() },
-  // 涓婁紶鐨勫湴鍧�
-  url: import.meta.env.VITE_APP_BASE_API + "/system/user/importData",
-});
+	// 鏄惁鏄剧ず寮瑰嚭灞傦紙鐢ㄦ埛瀵煎叆锛�
+	open: false,
+	// 寮瑰嚭灞傛爣棰橈紙鐢ㄦ埛瀵煎叆锛�
+	title: "",
+	// 鏄惁绂佺敤涓婁紶
+	isUploading: false,
+	// 鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
+	updateSupport: 0,
+	// 璁剧疆涓婁紶鐨勮姹傚ご閮�
+	headers: { Authorization: "Bearer " + getToken() },
+	// 涓婁紶鐨勫湴鍧�
+	url: import.meta.env.VITE_APP_BASE_API + "/system/user/importData"
+})
 // 鍒楁樉闅愪俊鎭�
 const columns = ref([
-  { key: 0, label: `鐢ㄦ埛缂栧彿`, visible: true },
-  { key: 1, label: `鐧诲綍璐﹀彿`, visible: true },
-  { key: 2, label: `鐢ㄦ埛鏄电О`, visible: true },
-  { key: 3, label: `閮ㄩ棬`, visible: true },
-  { key: 4, label: `鎵嬫満鍙风爜`, visible: true },
-  { key: 5, label: `鐘舵�乣, visible: true },
-  { key: 6, label: `鍒涘缓鏃堕棿`, visible: true },
-]);
+	{ key: 0, label: `鐢ㄦ埛缂栧彿`, visible: true },
+	{ key: 1, label: `鐧诲綍璐﹀彿`, visible: true },
+	{ key: 2, label: `鐢ㄦ埛鏄电О`, visible: true },
+	{ key: 3, label: `閮ㄩ棬`, visible: true },
+	{ key: 4, label: `鎵嬫満鍙风爜`, visible: true },
+	{ key: 5, label: `鐘舵�乣, visible: true },
+	{ key: 6, label: `鍒涘缓鏃堕棿`, visible: true }
+])
 
 const data = reactive({
-  form: {},
-  queryParams: {
-    pageNum: 1,
-    pageSize: 10,
-    userName: undefined,
-    phonenumber: undefined,
-    status: undefined,
-    deptId: undefined,
-  },
-  rules: {
-    userName: [
-      { required: true, message: "鐧诲綍璐﹀彿涓嶈兘涓虹┖", trigger: "blur" },
-      {
-        min: 2,
-        max: 20,
-        message: "鐧诲綍璐﹀彿闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿",
-        trigger: "blur",
-      },
-    ],
-    nickName: [
-      { required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" },
-    ],
-    deptIds: [{ required: true, message: "鍏徃涓嶈兘涓虹┖", trigger: "change" }],
-		roleIds: [{ required: true, message: "瑙掕壊涓嶈兘涓虹┖", trigger: "change" }],
-    password: [
-      { required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
-      {
-        min: 5,
-        max: 20,
-        message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
-        trigger: "blur",
-      },
-      {
-        pattern: /^[^<>"'|\\]+$/,
-        message: "涓嶈兘鍖呭惈闈炴硶瀛楃锛�< > \" ' \\\ |",
-        trigger: "blur",
-      },
-    ],
-    email: [
-      {
-        type: "email",
-        message: "璇疯緭鍏ユ纭殑閭鍦板潃",
-        trigger: ["blur", "change"],
-      },
-    ],
-    phonenumber: [
-      {
-        pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
-        message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
-        trigger: "blur",
-      },
-    ],
-  },
-});
+	form: {},
+	queryParams: {
+		pageNum: 1,
+		pageSize: 10,
+		userName: undefined,
+		phonenumber: undefined,
+		status: undefined,
+		deptId: undefined
+	},
+	rules: {
+		userName: [{ required: true, message: "鐢ㄦ埛鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }, { min: 2, max: 20, message: "鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿", trigger: "blur" }],
+		nickName: [{ required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" }],
+		password: [{ required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" }, { min: 5, max: 20, message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿", trigger: "blur" }, { pattern: /^[^<>"'|\\]+$/, message: "涓嶈兘鍖呭惈闈炴硶瀛楃锛�< > \" ' \\\ |", trigger: "blur" }],
+		email: [{ type: "email", message: "璇疯緭鍏ユ纭殑閭鍦板潃", trigger: ["blur", "change"] }],
+		phonenumber: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜", trigger: "blur" }],
+		deptId: [{ required: true, message: "褰掑睘閮ㄩ棬涓嶈兘涓虹┖", trigger: "change" }],
+		postIds: [{ required: true, message: "宀椾綅涓嶈兘涓虹┖", trigger: "change" }],
+		roleIds: [{ required: true, message: "瑙掕壊涓嶈兘涓虹┖", trigger: "change" }]
+	}
+})
 
-const { queryParams, form, rules } = toRefs(data);
+const { queryParams, form, rules } = toRefs(data)
 
 /** 閫氳繃鏉′欢杩囨护鑺傜偣  */
 const filterNode = (value, data) => {
-  if (!value) return true;
-  return data.label.indexOf(value) !== -1;
-};
+	if (!value) return true
+	return data.label.indexOf(value) !== -1
+}
 
 /** 鏍规嵁鍚嶇О绛涢�夐儴闂ㄦ爲 */
-watch(deptName, (val) => {
-  proxy.$refs["deptTreeRef"].filter(val);
-});
+watch(deptName, val => {
+	proxy.$refs["deptTreeRef"].filter(val)
+})
 
 /** 鏌ヨ鐢ㄦ埛鍒楄〃 */
 function getList() {
-  loading.value = true;
-  listUser(proxy.addDateRange(queryParams.value, dateRange.value)).then(
-    (res) => {
-      loading.value = false;
-      userList.value = res.rows;
-      total.value = res.total;
-    }
-  );
+	loading.value = true
+	listUser(proxy.addDateRange(queryParams.value, dateRange.value)).then(res => {
+		loading.value = false
+		userList.value = res.rows
+		total.value = res.total
+	})
 }
 
 /** 鏌ヨ閮ㄩ棬涓嬫媺鏍戠粨鏋� */
 function getDeptTree() {
-  deptTreeSelect().then((response) => {
-    deptOptions.value = response.data;
-    enabledDeptOptions.value = filterDisabledDept(
-      JSON.parse(JSON.stringify(response.data))
-    );
-  });
+	deptTreeSelect().then(response => {
+		deptOptions.value = response.data
+		enabledDeptOptions.value = filterDisabledDept(JSON.parse(JSON.stringify(response.data)))
+	})
 }
 
 /** 杩囨护绂佺敤鐨勯儴闂� */
 function filterDisabledDept(deptList) {
-  return deptList.filter((dept) => {
-    if (dept.disabled) {
-      return false;
-    }
-    if (dept.children && dept.children.length) {
-      dept.children = filterDisabledDept(dept.children);
-    }
-    return true;
-  });
+	return deptList.filter(dept => {
+		if (dept.disabled) {
+			return false
+		}
+		if (dept.children && dept.children.length) {
+			dept.children = filterDisabledDept(dept.children)
+		}
+		return true
+	})
 }
 
 /** 鑺傜偣鍗曞嚮浜嬩欢 */
 function handleNodeClick(data) {
-  queryParams.value.deptId = data.id;
-  handleQuery();
+	queryParams.value.deptId = data.id
+	handleQuery()
 }
 
 /** 鎼滅储鎸夐挳鎿嶄綔 */
 function handleQuery() {
-  queryParams.value.pageNum = 1;
-  getList();
+	queryParams.value.pageNum = 1
+	getList()
 }
 
 /** 閲嶇疆鎸夐挳鎿嶄綔 */
 function resetQuery() {
-  dateRange.value = [];
-  proxy.resetForm("queryRef");
-  queryParams.value.deptId = undefined;
-  proxy.$refs.deptTreeRef.setCurrentKey(null);
-  handleQuery();
+	dateRange.value = []
+	proxy.resetForm("queryRef")
+	queryParams.value.deptId = undefined
+	proxy.$refs.deptTreeRef.setCurrentKey(null)
+	handleQuery()
 }
 
 /** 鍒犻櫎鎸夐挳鎿嶄綔 */
 function handleDelete(row) {
-  const userIds = row.userId || ids.value;
-  proxy.$modal
-    .confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�')
-    .then(function () {
-      return delUser(userIds);
-    })
-    .then(() => {
-      getList();
-      proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-    })
-    .catch(() => {});
+	const userIds = row.userId || ids.value
+	proxy.$modal.confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�').then(function () {
+		return delUser(userIds)
+	}).then(() => {
+		getList()
+		proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
+	}).catch(() => {})
 }
 
 /** 瀵煎嚭鎸夐挳鎿嶄綔 */
 function handleExport() {
-  proxy.download(
-    "system/user/export",
-    {
-      ...queryParams.value,
-    },
-    `user_${new Date().getTime()}.xlsx`
-  );
+	proxy.download("system/user/export", {
+		...queryParams.value,
+	},`user_${new Date().getTime()}.xlsx`)
 }
 
 /** 鐢ㄦ埛鐘舵�佷慨鏀�  */
 function handleStatusChange(row) {
-  let text = row.status === "0" ? "鍚敤" : "鍋滅敤";
-  proxy.$modal
-    .confirm('纭瑕�"' + text + '""' + row.userName + '"鐢ㄦ埛鍚�?')
-    .then(function () {
-      return changeUserStatus(row.userId, row.status);
-    })
-    .then(() => {
-      proxy.$modal.msgSuccess(text + "鎴愬姛");
-    })
-    .catch(function () {
-      row.status = row.status === "0" ? "1" : "0";
-    });
+	let text = row.status === "0" ? "鍚敤" : "鍋滅敤"
+	proxy.$modal.confirm('纭瑕�"' + text + '""' + row.userName + '"鐢ㄦ埛鍚�?').then(function () {
+		return changeUserStatus(row.userId, row.status)
+	}).then(() => {
+		proxy.$modal.msgSuccess(text + "鎴愬姛")
+	}).catch(function () {
+		row.status = row.status === "0" ? "1" : "0"
+	})
 }
 
 /** 鏇村鎿嶄綔 */
 function handleCommand(command, row) {
-  switch (command) {
-    case "handleResetPwd":
-      handleResetPwd(row);
-      break;
-    case "handleAuthRole":
-      handleAuthRole(row);
-      break;
-    default:
-      break;
-  }
+	switch (command) {
+		case "handleResetPwd":
+			handleResetPwd(row)
+			break
+		case "handleAuthRole":
+			handleAuthRole(row)
+			break
+		default:
+			break
+	}
 }
 
 /** 璺宠浆瑙掕壊鍒嗛厤 */
 function handleAuthRole(row) {
-  const userId = row.userId;
-  router.push("/system/user-auth/role/" + userId);
+	const userId = row.userId
+	router.push("/system/user-auth/role/" + userId)
 }
 
 /** 閲嶇疆瀵嗙爜鎸夐挳鎿嶄綔 */
 function handleResetPwd(row) {
-  proxy
-    .$prompt('璇疯緭鍏�"' + row.userName + '"鐨勬柊瀵嗙爜', "鎻愮ず", {
-      confirmButtonText: "纭畾",
-      cancelButtonText: "鍙栨秷",
-      closeOnClickModal: false,
-      inputPattern: /^.{5,20}$/,
-      inputErrorMessage: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
-      inputValidator: (value) => {
-        if (/<|>|"|'|\||\\/.test(value)) {
-          return "涓嶈兘鍖呭惈闈炴硶瀛楃锛�< > \" ' \\\ |";
-        }
-      },
-    })
-    .then(({ value }) => {
-      resetUserPwd(row.userId, value).then((response) => {
-        proxy.$modal.msgSuccess("淇敼鎴愬姛锛屾柊瀵嗙爜鏄細" + value);
-      });
-    })
-    .catch(() => {});
+	proxy.$prompt('璇疯緭鍏�"' + row.userName + '"鐨勬柊瀵嗙爜', "鎻愮ず", {
+		confirmButtonText: "纭畾",
+		cancelButtonText: "鍙栨秷",
+		closeOnClickModal: false,
+		inputPattern: /^.{5,20}$/,
+		inputErrorMessage: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+		inputValidator: (value) => {
+			if (/<|>|"|'|\||\\/.test(value)) {
+				return "涓嶈兘鍖呭惈闈炴硶瀛楃锛�< > \" ' \\\ |"
+			}
+		},
+	}).then(({ value }) => {
+		resetUserPwd(row.userId, value).then(response => {
+			proxy.$modal.msgSuccess("淇敼鎴愬姛锛屾柊瀵嗙爜鏄細" + value)
+		})
+	}).catch(() => {})
 }
 
 /** 閫夋嫨鏉℃暟  */
 function handleSelectionChange(selection) {
-  ids.value = selection.map((item) => item.userId);
-  single.value = selection.length != 1;
-  multiple.value = !selection.length;
+	ids.value = selection.map(item => item.userId)
+	single.value = selection.length != 1
+	multiple.value = !selection.length
 }
 
 /** 瀵煎叆鎸夐挳鎿嶄綔 */
 function handleImport() {
-  upload.title = "鐢ㄦ埛瀵煎叆";
-  upload.open = true;
+	upload.title = "鐢ㄦ埛瀵煎叆"
+	upload.open = true
 }
 
 /** 涓嬭浇妯℃澘鎿嶄綔 */
 function importTemplate() {
-  proxy.download(
-    "system/user/importTemplate",
-    {},
-    `user_template_${new Date().getTime()}.xlsx`
-  );
+	proxy.download("system/user/importTemplate", {
+	}, `user_template_${new Date().getTime()}.xlsx`)
 }
 
 /**鏂囦欢涓婁紶涓鐞� */
 const handleFileUploadProgress = (event, file, fileList) => {
-  upload.isUploading = true;
-};
+	upload.isUploading = true
+}
 
 /** 鏂囦欢涓婁紶鎴愬姛澶勭悊 */
 const handleFileSuccess = (response, file, fileList) => {
-  upload.open = false;
-  upload.isUploading = false;
-  proxy.$refs["uploadRef"].handleRemove(file);
-  proxy.$alert(
-    "<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
-      response.msg +
-      "</div>",
-    "瀵煎叆缁撴灉",
-    { dangerouslyUseHTMLString: true }
-  );
-  getList();
-};
+	upload.open = false
+	upload.isUploading = false
+	proxy.$refs["uploadRef"].handleRemove(file)
+	proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "瀵煎叆缁撴灉", { dangerouslyUseHTMLString: true })
+	getList()
+}
 
 /** 鎻愪氦涓婁紶鏂囦欢 */
 function submitFileForm() {
-  proxy.$refs["uploadRef"].submit();
+	proxy.$refs["uploadRef"].submit()
 }
 
 /** 閲嶇疆鎿嶄綔琛ㄥ崟 */
 function reset() {
-  form.value = {
-    userId: undefined,
-    deptId: undefined,
-    userName: undefined,
-    nickName: undefined,
-    password: undefined,
-    phonenumber: undefined,
-    email: undefined,
-    sex: undefined,
-    status: "0",
-    remark: undefined,
-    postIds: [],
-    roleIds: [],
-  };
-  proxy.resetForm("userRef");
+	form.value = {
+		userId: undefined,
+		deptId: undefined,
+		userName: undefined,
+		nickName: undefined,
+		password: undefined,
+		phonenumber: undefined,
+		email: undefined,
+		sex: undefined,
+		status: "0",
+		remark: undefined,
+		postIds: [],
+		roleIds: []
+	}
+	proxy.resetForm("userRef")
 }
 
 /** 鍙栨秷鎸夐挳 */
 function cancel() {
-  open.value = false;
-  reset();
+	open.value = false
+	reset()
 }
 
 /** 鏂板鎸夐挳鎿嶄綔 */
 function handleAdd() {
-  reset();
-  getUser().then((response) => {
-    postOptions.value = response.posts;
-    roleOptions.value = response.roles;
-    open.value = true;
-    title.value = "娣诲姞鐢ㄦ埛";
-    form.value.password = initPassword.value;
-  });
+	reset()
+	getUser().then(response => {
+		postOptions.value = response.posts
+		roleOptions.value = response.roles
+		open.value = true
+		title.value = "娣诲姞鐢ㄦ埛"
+		form.value.password = initPassword.value
+	})
 }
 
 /** 淇敼鎸夐挳鎿嶄綔 */
 function handleUpdate(row) {
-  reset();
-  const userId = row.userId || ids.value;
-  getUser(userId).then((response) => {
-    form.value = response.data;
-    postOptions.value = response.posts;
-    roleOptions.value = response.roles;
-    form.value.postIds = response.postIds;
-    form.value.roleIds = response.roleIds;
-    form.value.deptIds = response.deptIds;
-    open.value = true;
-    title.value = "淇敼鐢ㄦ埛";
-    form.password = "";
-  });
+	reset()
+	const userId = row.userId || ids.value
+	getUser(userId).then(response => {
+		form.value = response.data
+		postOptions.value = response.posts
+		roleOptions.value = response.roles
+		form.value.postIds = response.postIds
+		form.value.roleIds = response.roleIds
+		open.value = true
+		title.value = "淇敼鐢ㄦ埛"
+		form.password = ""
+	})
 }
 
 /** 鎻愪氦鎸夐挳 */
 function submitForm() {
-  proxy.$refs["userRef"].validate((valid) => {
-    if (valid) {
-      if (form.value.userId != undefined) {
-        updateUser(form.value).then((response) => {
-          proxy.$modal.msgSuccess("淇敼鎴愬姛");
-          open.value = false;
-          getList();
-        });
-      } else {
-        addUser(form.value).then((response) => {
-          proxy.$modal.msgSuccess("鏂板鎴愬姛");
-          open.value = false;
-          getList();
-        });
-      }
-    }
-  });
+	proxy.$refs["userRef"].validate(valid => {
+		if (valid) {
+			if (form.value.userId != undefined) {
+				updateUser(form.value).then(response => {
+					proxy.$modal.msgSuccess("淇敼鎴愬姛")
+					open.value = false
+					getList()
+				})
+			} else {
+				addUser(form.value).then(response => {
+					proxy.$modal.msgSuccess("鏂板鎴愬姛")
+					open.value = false
+					getList()
+				})
+			}
+		}
+	})
 }
-onMounted(() => {
-	getDeptTree();
-	getList();
-});
+
+getDeptTree()
+getList()
 </script>

--
Gitblit v1.9.3