From 725b0706937306c6341e5dddbcc4fd8de7b8f002 Mon Sep 17 00:00:00 2001
From: zhaowei <zhaowei>
Date: 星期二, 01 四月 2025 10:13:18 +0800
Subject: [PATCH] 1、mdc模块实现各利用率图表页面功能并与后端进行联调 2、删除用户修改密码时的输入校验 3、删除用户管理冗余查询字段 4、调整DNC模块获取权限配置功能时调用的获取所有用户列表接口(原先接口有分页参数导致获取不完整)

---
 src/api/dnc.js                                                                   |    2 
 src/views/system/UserList.vue                                                    |   37 
 src/views/mdc/base/GroupUtilizationRateChart.vue                                 |  330 ++++++-
 src/views/system/modules/UserModal.vue                                           | 1076 ++++++++++++------------
 src/views/dnc/base/modules/DeviceStructure/Permission/AssignPermissionModal.vue  |    2 
 src/api/mdc.js                                                                   |   17 
 src/views/mdc/base/GroupUtilizationRateCompareChart.vue                          |  234 +++--
 src/views/system/modules/PasswordModal.vue                                       |  211 ++--
 src/views/mdc/base/modules/DeliveryGroupUtilizationRateChart/ChartComponent.vue  |    6 
 src/views/mdc/base/GroupEquipmentUtilizationRateChart.vue                        |  327 ++++++-
 src/views/mdc/base/DeliveryGroupUtilizationRateChart.vue                         |  363 ++++++-
 src/views/dnc/base/modules/ProductStructure/Permission/AssignPermissionModal.vue |    2 
 12 files changed, 1,652 insertions(+), 955 deletions(-)

diff --git a/src/api/dnc.js b/src/api/dnc.js
index 7945af3..582bfcb 100644
--- a/src/api/dnc.js
+++ b/src/api/dnc.js
@@ -54,7 +54,7 @@
   // 鏉冮檺閰嶇疆寮圭獥涓幏鍙栨墍鏈夎溅闂村垪琛�
   getAllDepartmentsListApi: () => getAction('/mdc/mdcProduction/queryTreeListByConfig'),
   // 鏉冮檺閰嶇疆寮圭獥涓幏鍙栨墍鏈夌敤鎴峰垪琛�
-  getAllUsersListApi: () => getAction('/sys/user/list'),
+  getAllUsersListApi: () => getAction('/sys/user/listAll'),
   // 鏉冮檺閰嶇疆寮圭獥涓幏鍙栨湁鏉冮檺鐨勯儴闂ㄥ垪琛�
   getHasPermissionDepartApi: ({ type, id }) => getAction(`/nc/product/get/perm/depart/${type}/${id}`),
   // 鏉冮檺閰嶇疆寮圭獥涓幏鍙栨湁鏉冮檺鐨勭敤鎴峰垪琛�
diff --git a/src/api/mdc.js b/src/api/mdc.js
index 3511070..636952d 100644
--- a/src/api/mdc.js
+++ b/src/api/mdc.js
@@ -30,4 +30,21 @@
   // -------------------------------------OEE椤甸潰--------------------------------------------
   // 璁$畻OEE
   computeOeeApi: params => postAction('/mdc/mdcOeeInfo/computeOee', params),
+  // -------------------------------------鍚勫埄鐢ㄧ巼鍥捐〃椤甸潰--------------------------------------------
+  // 鑾峰彇涓績鎴栦腑蹇冨搴旂彮缁勫垪琛�
+  getCenterOrGroupListApi: productionId => getAction('/mdc/mdcProduction/loadProductionOptions', { productionId }),
+  // 鑾峰彇璁惧缁煎悎鍒╃敤鐜囧浘琛ㄦ暟鎹�
+  getGroupEquipmentChartDataApi: params => getAction('/mdc/efficiencyReport/equipmentEfficiencyAnalyze', params),
+  // 鑾峰彇鐝粍瀵瑰簲閰嶉�佸皬缁勫垪琛�
+  getDeliveryGroupListApi: productionId => getAction('/mdc/mdcProduction/loadTeamOptions', { productionId }),
+  // 鑾峰彇鏈堥厤閫佸皬缁勭患鍚堝埄鐢ㄧ巼鍥捐〃鏁版嵁
+  getDeliveryGroupChartDataApi: params => getAction('/mdc/efficiencyReport/teamEquipmentEfficiencyAnalyze', params),
+  // 鑾峰彇鐝粍璁惧鍒╃敤鐜囧姣斿浘琛ㄦ暟鎹�
+  getGroupRateCompareChartDataApi: productionId => getAction('/mdc/efficiencyReport/teamEfficiencyAnalyzeByMonth', { productionId }),
+  // 鑾峰彇璁惧绫诲瀷鍒楄〃
+  getEquipmentTypeListApi: () => getAction('/mdc/mdcEquipmentType/queryEquipmentType'),
+  // 鑾峰彇鐝埗鍒楄〃
+  getShiftListApi: () => getAction('/mdc/mdcMdcShift/initShiftList'),
+  // 鑾峰彇鐝粍璁惧鍒╃敤鐜囧浘琛ㄦ暟鎹�
+  getGroupChartDataApi: params => getAction('/mdc/efficiencyReport/comprehensiveRateAnalyze', params)
 }
\ No newline at end of file
diff --git a/src/views/dnc/base/modules/DeviceStructure/Permission/AssignPermissionModal.vue b/src/views/dnc/base/modules/DeviceStructure/Permission/AssignPermissionModal.vue
index 4b23a76..6ea023b 100644
--- a/src/views/dnc/base/modules/DeviceStructure/Permission/AssignPermissionModal.vue
+++ b/src/views/dnc/base/modules/DeviceStructure/Permission/AssignPermissionModal.vue
@@ -69,7 +69,7 @@
         dncApi.getAllUsersListApi()
           .then(res => {
             if (res.success) {
-              this.allUsersList = res.result.records
+              this.allUsersList = res.result
               this.$nextTick(() => this.$refs.userPermissionTransferRef.getHasPermissionUserByApi())
             }
           })
diff --git a/src/views/dnc/base/modules/ProductStructure/Permission/AssignPermissionModal.vue b/src/views/dnc/base/modules/ProductStructure/Permission/AssignPermissionModal.vue
index 6491b13..425111e 100644
--- a/src/views/dnc/base/modules/ProductStructure/Permission/AssignPermissionModal.vue
+++ b/src/views/dnc/base/modules/ProductStructure/Permission/AssignPermissionModal.vue
@@ -116,7 +116,7 @@
       dncApi.getAllUsersListApi()
         .then(res => {
           if (res.success) {
-            this.allUsersList = res.result.records
+            this.allUsersList = res.result
             this.$nextTick(() => this.$refs.userPermissionTransferRef.getHasPermissionUserByApi())
           }
         })
diff --git a/src/views/mdc/base/DeliveryGroupUtilizationRateChart.vue b/src/views/mdc/base/DeliveryGroupUtilizationRateChart.vue
index f7b6e6d..b07adcc 100644
--- a/src/views/mdc/base/DeliveryGroupUtilizationRateChart.vue
+++ b/src/views/mdc/base/DeliveryGroupUtilizationRateChart.vue
@@ -1,82 +1,327 @@
 <template>
-  <div style="width: 100%; height: 100%;">
-    <a-card :bordered="false">
-      <a-row type="flex" :gutter="16">
-        <a-col :md="5">
-          <a-tabs :activeKey="activeKey" @change="tabChange">
-            <a-tab-pane key="1" tab="杞﹂棿灞傜骇" force-render>
-              <base-tree @getCurrSelected="changeSelectionNode"></base-tree>
-            </a-tab-pane>
-            <a-tab-pane v-if="isDepartType == 0" key="2" tab="閮ㄩ棬灞傜骇">,
-              <depart-tree @getCurrSelectedDD="changeSelectionNodedd"></depart-tree>
-            </a-tab-pane>
-          </a-tabs>
-        </a-col>
-        <a-col :md="19">
-          <ChartComponent :nodePeople='selectPeople' :nodeTree='selectEquipment' :Type="selectTypeTree"/>
-        </a-col>
-      </a-row>
-    </a-card>
-  </div>
+  <a-card>
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :md="3" :sm="3">
+            <a-form-item label="涓績">
+              <a-select v-model="queryParam.productionId" placeholder="璇烽�夋嫨涓績" @change="handleCenterSelectChange">
+                <a-select-option v-for="item in centerList" :key="item.key">
+                  {{ item.title }}
+                </a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+
+
+          <a-col :md="8" :sm="8">
+            <a-form-item label="鐝粍">
+              <a-select :value="productionIds" placeholder="璇烽�夋嫨鐝粍" mode="multiple" :maxTagCount="3"
+                        @change="handleGroupSelectChange" allowClear>
+                <a-select-option v-for="item in groupList" :key="item.key">
+                  {{ item.title }}
+                </a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+
+
+          <a-col :md="8" :sm="8">
+            <a-form-item label="閰嶉�佸皬缁�">
+              <a-select v-model="teamCodes" placeholder="璇烽�夋嫨閰嶉�佸皬缁�" mode="multiple" :maxTagCount="3"
+                        @change="handleDeliverGroupSelectChange" allowClear>
+                <a-select-option v-for="item in deliveryGroupList" :key="item.key">{{ item.title }}</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+
+          <a-col :md="3" :sm="3">
+            <a-form-item label="鏈堜唤">
+              <a-month-picker v-model="queryParam.month" style="width: 100%" value-format="YYYYMM" :allowClear="false"
+                              placeholder="璇烽�夋嫨鏈堜唤"/>
+            </a-form-item>
+          </a-col>
+
+          <a-col :md="2" :sm="2">
+            <a-space>
+              <a-button type="primary" @click="searchQuery" icon="search">鏌ヨ</a-button>
+              <!--              <a-button type="primary" @click="searchReset" icon="reload">閲嶇疆</a-button>-->
+            </a-space>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+
+    <div id="chart-container" style="height: 700px"></div>
+  </a-card>
 </template>
 
 <script>
-import BaseTree from '../common/BaseTree'
-import DepartTree from './modules/DepartList/DepartListTree/DepartTree'
-import { mapActions } from 'vuex'
-import ChartComponent from '@views/mdc/base/modules/DeliveryGroupUtilizationRateChart/ChartComponent.vue'
+import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+import moment from 'moment/moment'
+import mdcApi from '@api/mdc'
 
 export default {
   name: 'DeliveryGroupUtilizationRateChart',
-  components: {
-    ChartComponent,
-    BaseTree,
-    DepartTree,
-  },
+  components: {},
+  mixins: [JeecgListMixin],
   data() {
     return {
-      activeKey: '1',
-      selectEquipment: {},
-      selectPeople: {},
-      selectTypeTree: '',
-      isDepartType: ''
+      disableMixinCreated: true,
+      queryParam: {
+        month: moment().subtract('1', 'month').format('YYYYMM')
+      },
+      productionIds: [],//鐝粍
+      teamCodes: [],//閰嶉�佸皬缁�
+      centerList: [],
+      groupList: [],
+      deliveryGroupList: []
     }
   },
-  created() {
-    this.queryTreeData()
+  mounted() {
+    window.addEventListener('resize', this.handleWindowResize)
+    this.getCenterListByApi()
+    this.handleWindowResize()
   },
   methods: {
-    ...mapActions(['QueryDepartTree']),
-
-    queryTreeData() {
-      this.QueryDepartTree().then(res => {
-        if (res.success) {
-          this.isDepartType = res.result[0].value
-        } else {
-          this.$notification.warning({
-            message: '娑堟伅',
-            description: res.message
-          })
-        }
-      }).finally(() => {
+    loadData() {
+      this.chartContainer = this.$echarts.init(document.getElementById('chart-container'))
+      this.initChart({})
+      this.chartContainer.showLoading({
+        text: '鏁版嵁鍔犺浇涓� ...',
+        color: '#0696e1', // 鍔犺浇鍔ㄧ敾棰滆壊
+        textColor: '#0696e1'
       })
+      const that = this
+      mdcApi.getDeliveryGroupChartDataApi(this.queryParam)
+        .then(res => {
+          if (res.success) {
+            if (Object.keys(res.result).length === 0 || res.result.teamCodeList.length === 0) {
+              that.$notification.warning({
+                message: '娑堟伅',
+                description: '鏆傛棤鏁版嵁'
+              })
+              // 姝ゅ鏈猺eturn鏄负淇濊瘉鍥捐〃鏁版嵁鑳借娓呴櫎骞跺睍绀虹┖鍥捐〃
+            }
+            that.initChart(res.result)
+          } else {
+            that.$notification.warning({
+              message: '娑堟伅',
+              description: res.message
+            })
+          }
+        })
+        .catch(err => {
+          that.$notification.error({
+            message: '娑堟伅',
+            description: err.message
+          })
+        })
     },
 
-    tabChange(val) {
-      this.activeKey = val
-      this.selectTypeTree = val
+    /**
+     * 鍒濆鍖栧浘琛�
+     * @param chartDataObj 鏁版嵁瀵硅薄 Object
+     */
+    initChart(chartDataObj) {
+      const option = {
+        title: {
+          text: (this.queryParam.month.slice(-2) >= 10 ? this.queryParam.month.slice(-2) : this.queryParam.month.slice(-1)) + '鏈堥厤閫佸皬缁勭患鍚堝埄鐢ㄧ巼',
+          left: 'center',
+          top: 0,
+          textStyle: {
+            fontSize: 22
+          }
+        },
+        grid: {
+          top: '12%',
+          left: '1%',
+          right: '1%',
+          bottom: '8%',
+          containLabel: true
+        },
+        legend: {
+          top: '6%',
+          right: 'center',
+          itemGap: 20,
+          data: ['24h缁煎悎鍒╃敤鐜�', '鍘婚櫎鏁呴殰璁惧鏃堕棿24h缁煎悎鍒╃敤鐜�', '鐝鍒╃敤鐜�']
+        },
+        tooltip: {
+          show: true,
+          trigger: 'axis'
+        },
+        xAxis: {
+          type: 'category',
+          data: chartDataObj.teamCodeList ? chartDataObj.teamCodeList : []
+          // data: ['鏉庢湁涓虹粍', '涓佺孩鐕曠粍', '鍞愪笢缁�', '鏈卞皬纾婄粍', '寮犲缁�', '瀹嬪畤鍧ょ粍', '缃楀啗缁�', '寮犲弻杩涚粍', '甯告尟鍕囩粍', '钁涘簲榫欑粍', '璧靛箍娑涚粍', '浜庡崕浜粍', '闄堝郴缁�', '鐜嬬户宄扮粍', '鐜嬫檽鏄庣粍', '闄堟灄缁�', '鍚村悏骞崇粍']
+        },
+        yAxis: [
+          {
+            type: 'value',
+            name: '鍒╃敤鐜�(%)',
+            axisLine: {
+              show: true
+            },
+            axisLabel: {
+              formatter: '{value}%'
+            }
+          }
+        ],
+        series: [
+          {
+            type: 'bar',
+            name: '24h缁煎悎鍒╃敤鐜�',
+            // barWidth: '40%',
+            // data: [85, 32, 23, 56, 24, 64, 34, 85, 32, 23, 56, 24, 85, 63, 74, 11, 58]
+            data: chartDataObj.dataList ? chartDataObj.dataList.map(item => item.utilizationRate) : []
+          },
+          {
+            type: 'bar',
+            name: '鍘婚櫎鏁呴殰璁惧鏃堕棿24h缁煎悎鍒╃敤鐜�',
+            // barWidth: '40%',
+            // data: [24, 64, 34, 85, 32, 23, 56, 24, 85, 32, 23, 56, 24, 64, 34, 85, 54],
+            data: chartDataObj.dataList ? chartDataObj.dataList.map(item => item.amendUtilizationRate) : []
+          },
+          {
+            type: 'bar',
+            name: '鐝鍒╃敤鐜�',
+            // barWidth: '40%',
+            // data: [24, 64, 34, 85, 32, 23, 56, 24, 85, 32, 23, 56, 24, 64, 34, 85, 54],
+            data: chartDataObj.dataList ? chartDataObj.dataList.map(item => item.shiftUtilizationRate) : []
+          }
+        ],
+        dataZoom: [
+          {
+            type: 'slider',
+            show: true,
+            xAxisIndex: 0,
+            startValue: 0,
+            endValue: 19,
+            // 鏄惁鏄剧ずdetail锛屽嵆鎷栨嫿鏃跺�欐樉绀鸿缁嗘暟鍊间俊鎭�
+            showDetail: false,
+            // empty锛氬綋鍓嶆暟鎹獥鍙e鐨勬暟鎹紝琚缃负绌恒��
+            // 鍗充笉浼氬奖鍝嶅叾浠栬酱鐨勬暟鎹寖鍥�
+            filterMode: 'empty',
+            // 鎺у埗鎵嬫焺鐨勫昂瀵�
+            // handleSize: 0,
+            // 鏄惁閿佸畾閫夋嫨鍖哄煙锛堟垨鍙仛鏁版嵁绐楀彛锛夌殑澶у皬
+            zoomLock: true,
+            brushSelect: false
+          },
+          {
+            // 娌℃湁涓嬮潰杩欏潡鐨勮瘽锛屽彧鑳芥嫋鍔ㄦ粴鍔ㄦ潯锛�
+            // 榧犳爣婊氳疆鍦ㄥ尯鍩熷唴涓嶈兘鎺у埗澶栭儴婊氬姩鏉�
+            type: 'inside',
+            show: true,
+            // 鎺у埗鍝釜杞达紝濡傛灉鏄痭umber琛ㄧず鎺у埗涓�涓酱锛�
+            xAxisIndex: 0,
+            // 婊氳疆鏄惁瑙﹀彂缂╂斁
+            zoomOnMouseWheel: false,
+            // 榧犳爣绉诲姩鑳藉惁瑙﹀彂骞崇Щ
+            moveOnMouseMove: true,
+            // 榧犳爣婊氳疆鑳藉惁瑙﹀彂骞崇Щ
+            moveOnMouseWheel: true
+          }
+        ]
+      }
+      this.chartContainer.setOption(option, true)
+      this.chartContainer.hideLoading()
     },
 
-    changeSelectionNode(val) {
-      this.selectEquipment = val
-      this.selectTypeTree = '1'
+    // 鑾峰彇涓績鍒楄〃
+    getCenterListByApi() {
+      const that = this
+      mdcApi.getCenterOrGroupListApi()
+        .then(res => {
+          if (res.success) {
+            that.centerList = res.result
+            that.queryParam.productionId = res.result[0].value
+            that.getGroupListByApi(res.result[0].value, true)
+          }
+        })
     },
 
-    changeSelectionNodedd(val) {
-      this.selectPeople = val
-      this.selectTypeTree = '2'
+    /**
+     * 鑾峰彇鐝粍鍒楄〃
+     * @param productionId 涓績Id
+     * @param isInitLoad 鏄惁涓哄垵濮嬪寲鍔犺浇
+     */
+    getGroupListByApi(productionId, isInitLoad = false) {
+      const that = this
+      mdcApi.getCenterOrGroupListApi(productionId)
+        .then(res => {
+          if (res.success) {
+            that.groupList = res.result
+            if (!isInitLoad) return
+            that.handleGroupSelectChange([res.result[0].value])
+            that.loadData()
+          }
+        })
+    },
+
+    /**
+     * 鑾峰彇閰嶉�佸皬缁勫垪琛�
+     * @param productionId 鐝粍Id
+     * @param isReduceSelectOption 鏄惁鍑忓皯鐝粍閫変腑椤�
+     */
+    getDeliveryGroupListByApi(productionId, isReduceSelectOption = false) {
+      const that = this
+      mdcApi.getDeliveryGroupListApi(productionId)
+        .then(res => {
+          if (res.success) {
+            that.deliveryGroupList = res.result
+
+            if (!isReduceSelectOption) return
+            that.teamCodes.forEach((key, keyIndex, self) => {
+              // 濡傛灉灏嗗敮涓�涓�缁勫寘鍚�変腑閰嶉�佸皬缁勯」鐨勭彮缁勫彇娑堝嬀閫夊悗搴斿皢宸插嬀閫夌殑閰嶉�佸皬缁勪竴骞跺彇娑堝嬀閫�
+              if (that.deliveryGroupList.findIndex(item => item.key === key) === -1) self.splice(keyIndex, 1)
+            })
+          }
+        })
+    },
+
+    /**
+     * 涓績鏀瑰彉鏃惰Е鍙�
+     * @param value 鏀瑰彉鍚庣殑涓績Id
+     */
+    handleCenterSelectChange(value) {
+      if (this.productionIds.length > 0) {
+        this.groupList = []
+        this.productionIds = []
+        delete this.queryParam.productionIds
+      }
+      if (this.teamCodes.length > 0) {
+        this.deliveryGroupList = []
+        this.teamCodes = []
+        delete this.queryParam.teamCodes
+      }
+      this.getGroupListByApi(value)
+    },
+
+    /**
+     * 鐝粍鏀瑰彉鏃惰Е鍙�
+     * @param value 鏀瑰彉鍚庣殑鐝粍Id
+     */
+    handleGroupSelectChange(value) {
+      let isReduceSelectOption
+      if (value.length > this.productionIds.length) isReduceSelectOption = false //澧炲姞鍕鹃�夐」
+      else isReduceSelectOption = true // 鍑忓皯鍕鹃�夐」
+      this.productionIds = value
+      this.queryParam.productionIds = value.join(',')
+      this.getDeliveryGroupListByApi(value.join(','), isReduceSelectOption)
+    },
+
+    /**
+     * 閰嶉�佸皬缁勫彂鐢熸敼鍙樻椂瑙﹀彂
+     * @param value 鏀瑰彉鍚庣殑閰嶉�佸皬缁処d
+     */
+    handleDeliverGroupSelectChange(value) {
+      this.queryParam.teamCodes = value.join(',')
+    },
+
+    handleWindowResize() {
+      if (this.chartContainer) this.chartContainer.resize()
     }
   }
-
 }
-</script>
+</script>
\ No newline at end of file
diff --git a/src/views/mdc/base/GroupEquipmentUtilizationRateChart.vue b/src/views/mdc/base/GroupEquipmentUtilizationRateChart.vue
index f0346d8..8e3d7cb 100644
--- a/src/views/mdc/base/GroupEquipmentUtilizationRateChart.vue
+++ b/src/views/mdc/base/GroupEquipmentUtilizationRateChart.vue
@@ -1,82 +1,291 @@
 <template>
-  <div style="width: 100%; height: 100%;">
-    <a-card :bordered="false">
-      <a-row type="flex" :gutter="16">
-        <a-col :md="5">
-          <a-tabs :activeKey="activeKey" @change="tabChange">
-            <a-tab-pane key="1" tab="杞﹂棿灞傜骇" force-render>
-              <base-tree @getCurrSelected="changeSelectionNode"></base-tree>
-            </a-tab-pane>
-            <a-tab-pane v-if="isDepartType == 0" key="2" tab="閮ㄩ棬灞傜骇">,
-              <depart-tree @getCurrSelectedDD="changeSelectionNodedd"></depart-tree>
-            </a-tab-pane>
-          </a-tabs>
-        </a-col>
-        <a-col :md="19">
-          <ChartComponent :nodePeople='selectPeople' :nodeTree='selectEquipment' :Type="selectTypeTree"/>
-        </a-col>
-      </a-row>
-    </a-card>
-  </div>
+  <a-card>
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :md="3" :sm="3">
+            <a-form-item label="涓績">
+              <a-select v-model="queryParam.productionId" placeholder="璇烽�夋嫨涓績" @change="handleCenterSelectChange">
+                <a-select-option v-for="item in centerList" :key="item.key">
+                  {{ item.title }}
+                </a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+
+          <a-col :md="10" :sm="10">
+            <a-form-item label="鐝粍">
+              <a-select :value="productionIds" placeholder="璇烽�夋嫨鐝粍" mode="multiple" :maxTagCount="5"
+                        @change="handleGroupSelectChange" allowClear>
+                <a-select-option v-for="item in groupList" :key="item.key">
+                  {{ item.title }}
+                </a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+
+          <a-col :md="3" :sm="3">
+            <a-form-item label="鏈堜唤">
+              <a-month-picker v-model="queryParam.month" style="width: 100%" value-format="YYYYMM" :allowClear="false"
+                              placeholder="璇烽�夋嫨鏈堜唤"/>
+            </a-form-item>
+          </a-col>
+
+          <a-col :md="5" :sm="5">
+            <a-space>
+              <a-button type="primary" @click="searchQuery" icon="search">鏌ヨ</a-button>
+              <!--              <a-button type="primary" @click="searchReset" icon="reload">閲嶇疆</a-button>-->
+            </a-space>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+
+    <div id="chart-container" style="height: 700px"></div>
+  </a-card>
 </template>
 
 <script>
-import BaseTree from '../common/BaseTree'
-import DepartTree from './modules/DepartList/DepartListTree/DepartTree'
-import { mapActions } from 'vuex'
-import ChartComponent from '@views/mdc/base/modules/GroupEquipmentUtilizationRateChart/ChartComponent.vue'
+import mdcApi from '@api/mdc'
+import moment from 'moment'
+import { JeecgListMixin } from '@/mixins/JeecgListMixin'
 
 export default {
   name: 'GroupEquipmentUtilizationRateChart',
-  components: {
-    ChartComponent,
-    BaseTree,
-    DepartTree,
-  },
+  components: {},
+  mixins: [JeecgListMixin],
   data() {
     return {
-      activeKey: '1',
-      selectEquipment: {},
-      selectPeople: {},
-      selectTypeTree: '',
-      isDepartType: ''
+      disableMixinCreated: true,
+      productionIds: [],//鐝粍
+      centerList: [],
+      groupList: [],
+      queryParam: {
+        month: moment().subtract('1', 'month').format('YYYYMM')
+      }
     }
   },
-  created() {
-    this.queryTreeData()
+  mounted() {
+    window.addEventListener('resize', this.handleWindowResize)
+    this.handleWindowResize()
+    this.getCenterListByApi()
   },
   methods: {
-    ...mapActions(['QueryDepartTree']),
-
-    queryTreeData() {
-      this.QueryDepartTree().then(res => {
-        if (res.success) {
-          this.isDepartType = res.result[0].value
-        } else {
-          this.$notification.warning({
-            message: '娑堟伅',
-            description: res.message
-          })
-        }
-      }).finally(() => {
+    loadData() {
+      this.chartContainer = this.$echarts.init(document.getElementById('chart-container'))
+      this.initChart({})
+      this.chartContainer.showLoading({
+        text: '鏁版嵁鍔犺浇涓� ...',
+        color: '#0696e1', // 鍔犺浇鍔ㄧ敾棰滆壊
+        textColor: '#0696e1'
       })
+      const that = this
+      mdcApi.getGroupEquipmentChartDataApi(this.queryParam)
+        .then(res => {
+          if (res.success) {
+            if (Object.keys(res.result).length === 0 || res.result.equipmentNameList.length === 0) {
+              that.$notification.warning({
+                message: '娑堟伅',
+                description: '鏆傛棤鏁版嵁'
+              })
+              // 姝ゅ鏈猺eturn鏄负淇濊瘉鍥捐〃鏁版嵁鑳借娓呴櫎骞跺睍绀虹┖鍥捐〃
+            }
+            that.initChart(res.result)
+          } else {
+            that.$notification.warning({
+              message: '娑堟伅',
+              description: res.message
+            })
+          }
+        })
+        .catch(err => {
+          that.$notification.error({
+            message: '娑堟伅',
+            description: err.message
+          })
+        })
     },
 
-    tabChange(val) {
-      this.activeKey = val
-      this.selectTypeTree = val
+    /**
+     * 鍒濆鍖栧浘琛�
+     * @param chartDataObj 鏁版嵁瀵硅薄 Object
+     */
+    initChart(chartDataObj) {
+      const option = {
+        title: {
+          text: '璁惧缁煎悎鍒╃敤鐜囷紙' + (this.queryParam.month.slice(-2) >= 10 ? this.queryParam.month.slice(-2) : this.queryParam.month.slice(-1)) + '鏈堬級',
+          left: 'center',
+          top: 0,
+          textStyle: {
+            fontSize: 22
+          }
+        },
+        grid: {
+          top: '12%',
+          left: '1%',
+          right: '1%',
+          bottom: '8%',
+          containLabel: true
+        },
+        legend: {
+          top: '6%',
+          right: 'center',
+          itemGap: 20,
+          data: ['24h缁煎悎鍒╃敤鐜�', '24h鍘婚櫎鏁呴殰', '璁″垝宸ヤ綔鏃堕棿缁煎悎鍒╃敤鐜�']
+        },
+        tooltip: {
+          show: true,
+          trigger: 'axis'
+        },
+        xAxis: {
+          type: 'category',
+          // data: ['绔嬪姞u1000-3', '浜旇酱125P', '浜斿潗鏍囧姞宸ヤ腑蹇僄S1000', 'A杞�1000PLUS', '姊у窞80P_2', '闆曞埢鏈�800TE', '鍥涘潗鏍囩珛鍔�104V', '绔嬪姞u1000-4', '绔嬪姞GX710_1', '涓夊潗鏍囩珛鍔�1350', '鍗у姞H5000-1', '绔嬪姞u1000-2', '绔嬪姞1000HS_1', '绔嬪姞1160_1', '绔嬪姞GX710_2', '绔嬪姞u1000-3', '浜旇酱125P', '浜斿潗鏍囧姞宸ヤ腑蹇僄S1000', 'A杞�1000PLUS', '姊у窞80P_2', '闆曞埢鏈�800TE', '鍥涘潗鏍囩珛鍔�104V', '绔嬪姞u1000-4', '绔嬪姞GX710_1', '涓夊潗鏍囩珛鍔�1350', '鍗у姞H5000-1', '绔嬪姞u1000-2', '绔嬪姞1000HS_1', '绔嬪姞1160_1', '绔嬪姞GX710_2', '绔嬪姞u1000-3', '浜旇酱125P', '浜斿潗鏍囧姞宸ヤ腑蹇僄S1000', 'A杞�1000PLUS', '姊у窞80P_2', '闆曞埢鏈�800TE', '鍥涘潗鏍囩珛鍔�104V'],
+          data: chartDataObj.equipmentNameList ? chartDataObj.equipmentNameList : [],
+          axisLabel: {
+            interval: 0, // 鍧愭爣杞村埢搴︽爣绛剧殑鏄剧ず闂撮殧锛屽湪绫荤洰杞翠腑鏈夋晥锛涢粯璁や細閲囩敤鏍囩涓嶉噸鍙犵殑绛栫暐闂撮殧鏄剧ず鏍囩锛涘彲浠ヨ缃垚0寮哄埗鏄剧ず鎵�鏈夋爣绛撅紱濡傛灉璁剧疆涓�1锛岃〃绀恒�庨殧涓�涓爣绛炬樉绀轰竴涓爣绛俱�忥紝濡傛灉鍊间负2锛岃〃绀洪殧涓や釜鏍囩鏄剧ず涓�涓爣绛撅紝浠ユ绫绘帹銆�
+            rotate: 45, // 鍒诲害鏍囩鏃嬭浆鐨勮搴︼紝鍦ㄧ被鐩酱鐨勭被鐩爣绛炬樉绀轰笉涓嬬殑鏃跺�欏彲浠ラ�氳繃鏃嬭浆闃叉鏍囩涔嬮棿閲嶅彔锛涙棆杞殑瑙掑害浠�-90搴﹀埌90搴�
+            inside: false, // 鍒诲害鏍囩鏄惁鏈濆唴锛岄粯璁ゆ湞澶�
+            margin: 15, // 鍒诲害鏍囩涓庤酱绾夸箣闂寸殑璺濈
+            fontSize: 14,
+            color: '#000'
+          }
+        },
+        yAxis: [
+          {
+            type: 'value',
+            name: '鍒╃敤鐜�(%)',
+            axisLine: {
+              show: true
+            },
+            axisLabel: {
+              formatter: '{value}%'
+            }
+          }
+        ],
+        series: [
+          {
+            type: 'bar',
+            name: '24h缁煎悎鍒╃敤鐜�',
+            // data: [53.28, 32.22, 23, 56, 24, 64, 34, 85, 32, 23, 56, 24, 85, 32, 23, 56, 24, 64, 34, 85, 32, 23, 56, 24, 23, 56, 24, 85, 32, 23, 56, 24, 85, 32, 85, 32, 23, 56, 24, 85, 32]
+            data: chartDataObj.dataList ? chartDataObj.dataList.map(item => item.utilizationRate) : []
+            // label: {
+            //   show: true,
+            //   position: 'top',
+            //   formatter: '{c}%',
+            //   avoidLabelOverlap: true
+            // }
+          },
+          {
+            type: 'bar',
+            name: '24h鍘婚櫎鏁呴殰',
+            data: chartDataObj.dataList ? chartDataObj.dataList.map(item => item.amendUtilizationRate) : []
+            // data: [53.28, 32.22, 23, 56, 24, 64, 34, 85, 32, 23, 56, 24, 85, 32, 23, 56, 24, 64, 34, 85, 32, 23, 56, 24, 23, 56, 24, 85, 32, 23, 56, 24, 85, 32, 85, 32, 23, 56, 24, 85, 32]
+          },
+          {
+            type: 'bar',
+            name: '璁″垝宸ヤ綔鏃堕棿缁煎悎鍒╃敤鐜�',
+            data: chartDataObj.dataList ? chartDataObj.dataList.map(item => item.shiftUtilizationRate) : []
+            // data: [63.25, 32.22, 23, 56, 24, 64, 34, 85, 32, 23, 56, 24, 85, 32, 23, 56, 24, 64, 34, 85, 32, 23, 56, 24, 85, 32, 23, 56, 24, 85, 32, 85, 32, 23, 56, 24, 85, 32]
+          }
+        ],
+        dataZoom: [
+          {
+            type: 'slider',
+            show: true,
+            xAxisIndex: 0,
+            startValue: 0,
+            endValue: 19,
+            // 鏄惁鏄剧ずdetail锛屽嵆鎷栨嫿鏃跺�欐樉绀鸿缁嗘暟鍊间俊鎭�
+            showDetail: false,
+            // empty锛氬綋鍓嶆暟鎹獥鍙e鐨勬暟鎹紝琚缃负绌恒��
+            // 鍗充笉浼氬奖鍝嶅叾浠栬酱鐨勬暟鎹寖鍥�
+            filterMode: 'empty',
+            // 鎺у埗鎵嬫焺鐨勫昂瀵�
+            // handleSize: 0,
+            // 鏄惁閿佸畾閫夋嫨鍖哄煙锛堟垨鍙仛鏁版嵁绐楀彛锛夌殑澶у皬
+            zoomLock: true,
+            brushSelect: false
+          },
+          {
+            // 娌℃湁涓嬮潰杩欏潡鐨勮瘽锛屽彧鑳芥嫋鍔ㄦ粴鍔ㄦ潯锛�
+            // 榧犳爣婊氳疆鍦ㄥ尯鍩熷唴涓嶈兘鎺у埗澶栭儴婊氬姩鏉�
+            type: 'inside',
+            show: true,
+            // 鎺у埗鍝釜杞达紝濡傛灉鏄痭umber琛ㄧず鎺у埗涓�涓酱锛�
+            xAxisIndex: 0,
+            // 婊氳疆鏄惁瑙﹀彂缂╂斁
+            zoomOnMouseWheel: false,
+            // 榧犳爣绉诲姩鑳藉惁瑙﹀彂骞崇Щ
+            moveOnMouseMove: true,
+            // 榧犳爣婊氳疆鑳藉惁瑙﹀彂骞崇Щ
+            moveOnMouseWheel: true
+          }
+        ]
+      }
+      this.chartContainer.setOption(option, true)
+      this.chartContainer.hideLoading()
     },
 
-    changeSelectionNode(val) {
-      this.selectEquipment = val
-      this.selectTypeTree = '1'
+    // 鑾峰彇涓績鍒楄〃
+    getCenterListByApi() {
+      const that = this
+      mdcApi.getCenterOrGroupListApi()
+        .then(res => {
+          if (res.success) {
+            that.centerList = res.result
+            that.queryParam.productionId = res.result[0].value
+            that.getGroupListByApi(res.result[0].value, true)
+          }
+        })
     },
 
-    changeSelectionNodedd(val) {
-      this.selectPeople = val
-      this.selectTypeTree = '2'
+    /**
+     * 鑾峰彇鐝粍鍒楄〃
+     * @param productionId 涓績Id
+     * @param isInitLoad 鏄惁涓哄垵濮嬪寲鍔犺浇
+     */
+    getGroupListByApi(productionId, isInitLoad = false) {
+      const that = this
+      mdcApi.getCenterOrGroupListApi(productionId)
+        .then(res => {
+          if (res.success) {
+            that.groupList = res.result
+            if (!isInitLoad) return
+            that.handleGroupSelectChange([res.result[0].value])
+            that.loadData()
+          }
+        })
+    },
+
+    /**
+     * 涓績鏀瑰彉鏃惰Е鍙�
+     * @param value 鏀瑰彉鍚庣殑涓績Id
+     */
+    handleCenterSelectChange(value) {
+      if (this.productionIds.length > 0) {
+        this.groupList = []
+        this.productionIds = []
+        delete this.queryParam.productionIds
+      }
+      this.getGroupListByApi(value)
+    },
+
+    /**
+     * 鐝粍鍙戠敓鏀瑰彉鏃惰Е鍙�
+     * @param value 鏀瑰彉鍚庣殑鐝粍Id
+     */
+    handleGroupSelectChange(value) {
+      this.productionIds = value
+      if (value.length === 0) {
+        delete this.queryParam.productionIds
+        return
+      }
+      this.queryParam.productionIds = value.join(',')
+    },
+
+    handleWindowResize() {
+      if (this.chartContainer) this.chartContainer.resize()
     }
   }
-
 }
-</script>
+</script>
\ No newline at end of file
diff --git a/src/views/mdc/base/GroupUtilizationRateChart.vue b/src/views/mdc/base/GroupUtilizationRateChart.vue
index 7343d52..ad8c62d 100644
--- a/src/views/mdc/base/GroupUtilizationRateChart.vue
+++ b/src/views/mdc/base/GroupUtilizationRateChart.vue
@@ -1,82 +1,294 @@
 <template>
-  <div style="width: 100%; height: 100%;">
-    <a-card :bordered="false">
-      <a-row type="flex" :gutter="16">
-        <a-col :md="5">
-          <a-tabs :activeKey="activeKey" @change="tabChange">
-            <a-tab-pane key="1" tab="杞﹂棿灞傜骇" force-render>
-              <base-tree @getCurrSelected="changeSelectionNode"></base-tree>
-            </a-tab-pane>
-            <a-tab-pane v-if="isDepartType == 0" key="2" tab="閮ㄩ棬灞傜骇">,
-              <depart-tree @getCurrSelectedDD="changeSelectionNodedd"></depart-tree>
-            </a-tab-pane>
-          </a-tabs>
-        </a-col>
-        <a-col :md="19">
-          <ChartComponent :nodePeople='selectPeople' :nodeTree='selectEquipment' :Type="selectTypeTree"/>
-        </a-col>
-      </a-row>
-    </a-card>
-  </div>
+  <a-card>
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :md="3" :sm="3">
+            <a-form-item label="涓績">
+              <a-select v-model="queryParam.productionId" placeholder="璇烽�夋嫨涓績">
+                <a-select-option v-for="item in centerList" :key="item.key">
+                  {{ item.title }}
+                </a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+
+          <a-col :md="10" :sm="10">
+            <a-form-item label="鐝粍">
+              <a-select :value="productionIds" placeholder="璇烽�夋嫨鐝粍" mode="multiple" :maxTagCount="5"
+                        @change="handleGroupSelectChange($event,'productionIds')" allowClear>
+                <a-select-option v-for="item in groupList" :key="item.key">
+                  {{ item.title }}
+                </a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+
+
+          <a-col :md="4" :sm="4">
+            <a-form-item label="璁惧绫诲瀷">
+              <a-select v-model="queryParam.equipmentType" placeholder="璇烽�夋嫨璁惧绫诲瀷" allowClear>
+                <a-select-option v-for="item in equipmentTypeList" :key="item.id">
+                  {{ item.equipmentTypeName }}
+                </a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+
+
+          <a-col :md="4" :sm="4">
+            <a-form-item label="鐝埗">
+              <a-select v-model="queryParam.shiftId" placeholder="璇烽�夋嫨鐝埗" allowClear>
+                <a-select-option v-for="item in shiftList" :key="item.value">{{ item.label }}</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+
+
+          <!--          <a-col :md="5" :sm="5">-->
+          <!--            <a-form-item label="鐝">-->
+          <!--              <a-select v-model="queryParam.workTime" placeholder="璇烽�夋嫨鐝" mode="multiple" :maxTagCount="2">-->
+          <!--                <a-select-option key="123">涓�鐝�</a-select-option>-->
+          <!--                <a-select-option key="234">浜岀彮</a-select-option>-->
+          <!--                <a-select-option key="345">涓夌彮</a-select-option>-->
+          <!--              </a-select>-->
+          <!--            </a-form-item>-->
+          <!--          </a-col>-->
+
+          <a-col :md="2" :sm="2">
+            <a-space>
+              <a-button type="primary" @click="searchQuery" icon="search">鏌ヨ</a-button>
+              <!--              <a-button type="primary" @click="searchReset" icon="reload">閲嶇疆</a-button>-->
+            </a-space>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+
+    <div id="chart-container" style="height: 700px"></div>
+  </a-card>
 </template>
 
 <script>
-import BaseTree from '../common/BaseTree'
-import DepartTree from './modules/DepartList/DepartListTree/DepartTree'
-import { mapActions } from 'vuex'
-import ChartComponent from '@views/mdc/base/modules/GroupUtilizationRateChart/ChartComponent.vue'
+import mdcApi from '@api/mdc'
+import { JeecgListMixin } from '@/mixins/JeecgListMixin'
 
 export default {
   name: 'GroupUtilizationRateChart',
-  components: {
-    ChartComponent,
-    BaseTree,
-    DepartTree,
-  },
+  components: {},
+  mixins: [JeecgListMixin],
   data() {
     return {
-      activeKey: '1',
-      selectEquipment: {},
-      selectPeople: {},
-      selectTypeTree: '',
-      isDepartType: ''
+      disableMixinCreated: true,
+      queryParam: {},
+      productionIds: [],//鐝粍
+      centerList: [],
+      groupList: [],
+      equipmentTypeList: [],
+      shiftList: []
     }
   },
-  created() {
-    this.queryTreeData()
+  mounted() {
+    window.addEventListener('resize', this.handleWindowResize)
+    this.handleWindowResize()
+    this.getCenterListByApi()
+    this.getEquipmentTypeListApi()
+    this.getShiftListByApi()
   },
   methods: {
-    ...mapActions(['QueryDepartTree']),
-
-    queryTreeData() {
-      this.QueryDepartTree().then(res => {
-        if (res.success) {
-          this.isDepartType = res.result[0].value
-        } else {
-          this.$notification.warning({
-            message: '娑堟伅',
-            description: res.message
-          })
-        }
-      }).finally(() => {
+    // 鑾峰彇鏁版嵁
+    loadData() {
+      this.chartContainer = this.$echarts.init(document.getElementById('chart-container'))
+      this.initChart({})
+      this.chartContainer.showLoading({
+        text: '鏁版嵁鍔犺浇涓� ...',
+        color: '#0696e1', // 鍔犺浇鍔ㄧ敾棰滆壊
+        textColor: '#0696e1'
       })
+      const that = this
+
+      mdcApi.getGroupChartDataApi(this.queryParam)
+        .then(res => {
+          if (res.success) {
+            if (!res.result.dataList || (res.result.dataList && res.result.dataList.length === 0)) {
+              that.$notification.warning({
+                message: '娑堟伅',
+                description: '鏆傛棤鏁版嵁'
+              })
+            }
+            that.initChart(res.result)
+          }
+        })
     },
 
-    tabChange(val) {
-      this.activeKey = val
-      this.selectTypeTree = val
+    /**
+     * 鍒濆鍖栧浘琛�
+     * @param dataList 鍥捐〃鏁版嵁婧�
+     * @param dateList 鏃ユ湡鍒楄〃
+     * @param shiftSubList 鐝鏍囬鍒楄〃
+     * @param shiftDataList 鐝鏁版嵁鍒楄〃
+     */
+    initChart({ dataList, dateList, shiftSubList, shiftDataList }) {
+      const defaultLegendData = ['24灏忔椂', '24灏忔椂锛堝幓闄ゆ晠闅滆澶囷級', '鐝', '绱杩愯鏃堕棿(h)']
+      const defaultSeries = [
+        {
+          type: 'line',
+          name: '24灏忔椂',
+          yAxisIndex: 0,
+          data: dataList ? dataList.map(item => item.utilizationRate) : []
+        },
+        {
+          type: 'line',
+          name: '24灏忔椂锛堝幓闄ゆ晠闅滆澶囷級',
+          yAxisIndex: 0,
+          data: dataList ? dataList.map(item => item.amendUtilizationRate) : []
+        },
+        {
+          type: 'line',
+          name: '鐝',
+          yAxisIndex: 0,
+          data: dataList ? dataList.map(item => item.shiftUtilizationRate) : []
+        },
+        {
+          type: 'bar',
+          name: '绱杩愯鏃堕棿(h)',
+          yAxisIndex: 1,
+          barWidth: '30%',
+          data: dataList ? dataList.map(item => item.processLong) : []
+        }
+      ]
+      const option = {
+        title: {
+          text: '璁惧缁煎悎鍒╃敤鐜�',
+          left: 'center',
+          top: 0,
+          textStyle: {
+            fontSize: 22
+          }
+        },
+        grid: {
+          top: '12%',
+          left: '1%',
+          right: '1%',
+          bottom: '1%',
+          containLabel: true
+        },
+        legend: {
+          top: '6%',
+          right: 'center',
+          itemGap: 20,
+          data: defaultLegendData
+        },
+        tooltip: {
+          show: true,
+          trigger: 'axis'
+        },
+        xAxis: {
+          type: 'category',
+          data: dateList ? dateList : []
+        },
+        yAxis: [
+          {
+            type: 'value',
+            name: '鍒╃敤鐜�(%)',
+            axisLine: {
+              show: true
+            },
+            axisLabel: {
+              formatter: '{value}%'
+            }
+          },
+          {
+            type: 'value',
+            name: '杩愯鏃堕棿(h)',
+            axisLine: {
+              show: true
+            }
+          }
+        ],
+        series: defaultSeries
+      }
+      if (shiftSubList) {
+        option.legend.data = defaultLegendData.concat(shiftSubList)
+        const newSeriesData = shiftDataList.map(item => {
+          return {
+            type: 'line',
+            name: item.shiftSubName,
+            yAxisIndex: 0,
+            data: item.dataList ? item.dataList.map(item => item.utilizationRate) : []
+          }
+        })
+
+        option.series = defaultSeries.concat(newSeriesData)
+      }
+
+      this.chartContainer.setOption(option, true)
+      this.chartContainer.hideLoading()
     },
 
-    changeSelectionNode(val) {
-      this.selectEquipment = val
-      this.selectTypeTree = '1'
+    // 鑾峰彇涓績鍒楄〃
+    getCenterListByApi() {
+      const that = this
+      mdcApi.getCenterOrGroupListApi()
+        .then(res => {
+          if (res.success) {
+            that.centerList = res.result
+            that.queryParam.productionId = res.result[0].value
+            that.getGroupListByApi(res.result[0].value)
+          }
+        })
     },
 
-    changeSelectionNodedd(val) {
-      this.selectPeople = val
-      this.selectTypeTree = '2'
+    /**
+     * 鑾峰彇鐝粍鍒楄〃
+     * @param productionId 涓績Id
+     */
+    getGroupListByApi(productionId) {
+      const that = this
+      mdcApi.getCenterOrGroupListApi(productionId)
+        .then(res => {
+          if (res.success) {
+            that.groupList = res.result
+            that.handleGroupSelectChange([res.result[0].value])
+            that.loadData()
+          }
+        })
+    },
+
+    /**
+     * 鐝粍鍙戠敓鏀瑰彉鏃惰Е鍙�
+     * @param value 鏀瑰彉鍚庣殑鍊�
+     */
+    handleGroupSelectChange(value) {
+      this.productionIds = value
+      this.queryParam.productionIds = value.join(',')
+    },
+
+    // 鑾峰彇璁惧绫诲瀷鍒楄〃
+    getEquipmentTypeListApi() {
+      const that = this
+      mdcApi.getEquipmentTypeListApi()
+        .then(res => {
+          if (res.success) {
+            that.equipmentTypeList = res.result
+          }
+        })
+    },
+
+    // 鑾峰彇鐝埗鍒楄〃
+    getShiftListByApi() {
+      const that = this
+      mdcApi.getShiftListApi()
+        .then(res => {
+          if (res.success) {
+            that.shiftList = res.result
+          }
+        })
+    },
+
+    handleWindowResize() {
+      if (this.chartContainer) this.chartContainer.resize()
     }
   }
-
 }
-</script>
+</script>
\ No newline at end of file
diff --git a/src/views/mdc/base/GroupUtilizationRateCompareChart.vue b/src/views/mdc/base/GroupUtilizationRateCompareChart.vue
index db59115..5ab96c8 100644
--- a/src/views/mdc/base/GroupUtilizationRateCompareChart.vue
+++ b/src/views/mdc/base/GroupUtilizationRateCompareChart.vue
@@ -1,14 +1,38 @@
 <template>
   <a-card>
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :md="3" :sm="3">
+            <a-form-item label="涓績">
+              <a-select v-model="queryParam.productionId" placeholder="璇烽�夋嫨涓績">
+                <a-select-option v-for="item in centerList" :key="item.key">
+                  {{ item.title }}
+                </a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+
+          <a-col :md="5" :sm="5">
+            <a-space>
+              <a-button type="primary" @click="searchQuery" icon="search">鏌ヨ</a-button>
+              <!--              <a-button type="primary" @click="searchReset" icon="reload">閲嶇疆</a-button>-->
+            </a-space>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+
     <div style="display: flex;justify-content: space-between">
-      <div id="chart-container-left" style="height: 700px;width: 48%"></div>
-      <div id="chart-container-right" style="height: 700px;width: 48%"></div>
+      <div id="chart-container-left" style="height: 700px;width: 30%"></div>
+      <div id="chart-container-middle" style="height: 700px;width: 30%"></div>
+      <div id="chart-container-right" style="height: 700px;width: 30%"></div>
     </div>
   </a-card>
 </template>
 
 <script>
-import api from '@api/mdc'
+import mdcApi from '@api/mdc'
 import { JeecgListMixin } from '@/mixins/JeecgListMixin'
 
 export default {
@@ -18,64 +42,87 @@
   data() {
     return {
       disableMixinCreated: true,
-      typeTree: '',
-      queryParam: {},
-      driveTypeList: [],
+      centerList: [],
+      chartsOptionList: [
+        {
+          position: 'left',
+          title: '鐝粍璁惧缁煎悎鍒╃敤鐜囷紙24h锛�',
+          property: 'utilizationRateList'
+        },
+        {
+          position: 'middle',
+          title: '鐝粍璁惧缁煎悎鍒╃敤鐜囷紙24h鍘婚櫎鏁呴殰鏃堕棿锛�',
+          property: 'amendUtilizationRateList'
+        },
+        {
+          position: 'right',
+          title: '鐝粍璁惧缁煎悎鍒╃敤鐜囷紙璁″垝宸ヤ綔鏃堕棿锛�',
+          property: 'shiftUtilizationRateList'
+        }
+      ],
       leftChartContainer: null,
-      rightChartContainer: null,
-      url: {}
+      middleChartContainer: null,
+      rightChartContainer: null
     }
   },
-  props: { nodeTree: '', Type: '', nodePeople: '' },
-  created() {
-  },
+
   mounted() {
     window.addEventListener('resize', this.handleWindowResize)
-    this.getDriveTypeByApi()
-    this.loadData()
+    this.getCenterListByApi()
     this.handleWindowResize()
   },
-  watch: {
-    Type(valmath) {
-      this.dataList = []
-      this.queryParam.typeTree = valmath
-    },
-    nodeTree(val) { //鐩戝惉currSelected 鍙樺寲锛屽皢鍙樺寲鍚庣殑鏁板�间紶閫掔粰 getCurrSelected 浜嬩欢
-      if (JSON.stringify(val) != '{}') {
-        if (val.equipmentId != null) {
-          this.queryParamEquip.parentId = ''
-          this.queryParamEquip.equipmentId = val.equipmentId
-        } else {
-          this.queryParamEquip.parentId = val.key
-          this.queryParamEquip.equipmentId = ''
-        }
-        this.searchQuery()
-      }
-    },
-    nodePeople(val) {
-      if (JSON.stringify(val) != '{}') {
-        if (val.equipmentId != null) {
-          this.queryParamPeople.parentId = val.equipmentId
-          this.queryParamPeople.equipmentId = ''
-        } else {
-          this.queryParamPeople.parentId = val.key
-          this.queryParamPeople.equipmentId = ''
-        }
-        this.searchQuery()
-      }
-    }
-  },
   methods: {
+    // 鑾峰彇鍥捐〃鏁版嵁
     loadData() {
-      this.initChart('left')
-      this.initChart('right')
+      const that = this
+      this.chartsOptionList.forEach(item => {
+        that.initChart(item.position)
+        that.chartSetOption(item.position, item.title, [], [], false)
+      })
+      mdcApi.getGroupRateCompareChartDataApi(this.queryParam.productionId)
+        .then(res => {
+          if (res.success) {
+            that.chartsOptionList.forEach(item => this.chartSetOption(item.position, item.title, res.result[item.property], res.result.dateList))
+          } else {
+            that.$notification.warning({
+              message: '娑堟伅',
+              description: res.message
+            })
+          }
+        })
+        .catch(err => {
+          that.$notification.error({
+            message: '娑堟伅',
+            description: err.message
+          })
+        })
     },
 
+    /**
+     * 鍒濆鍖栧浘琛�
+     * @param position 鍥捐〃浣嶇疆 String
+     */
     initChart(position) {
       this[position + 'ChartContainer'] = this.$echarts.init(document.getElementById(`chart-container-${position}`))
+      this[position + 'ChartContainer'].showLoading({
+        text: '鏁版嵁鍔犺浇涓� ...',
+        color: '#0696e1', // 鍔犺浇鍔ㄧ敾棰滆壊
+        textColor: '#0696e1'
+      })
+    },
+
+    /**
+     * 璁剧疆鍥炬爣閫夐」
+     * @param position 鍥捐〃浣嶇疆 String
+     * @param title 鍥捐〃鏍囬 String
+     * @param dataList 鍥捐〃鏁版嵁婧� Array
+     * @param dateList 鍥捐〃妯潗鏍囨湀浠� Array
+     * @param isHideLoading 鏄惁鍏抽棴鍔犺浇鍥炬爣 Boolean
+     */
+    chartSetOption(position, title, dataList, dateList, isHideLoading = true) {
       const option = {
         title: {
-          text: position === 'left' ? '鍚勭彮缁�24灏忔椂缁煎悎鏁堢巼瀵规瘮' : '鍚勭彮缁�24灏忔椂缁煎悎鏁堢巼瀵规瘮锛堝幓闄ゆ晠闅滆澶囨椂闂达級',
+          text: title,
           left: 'center',
           top: 0,
           textStyle: {
@@ -86,14 +133,13 @@
           top: '10%',
           left: '1%',
           right: '1%',
-          bottom: '5%',
+          bottom: '12%',
           containLabel: true
         },
         legend: {
-          bottom: 0,
+          bottom: '3%',
           right: 'center',
-          itemGap: 20,
-          data: ['鏁伴摚涓�鐝�', '鏁伴摚浜岀彮', '鏁伴摚涓夌彮', '鏁拌溅鐝�']
+          data: dataList.map(item => item.productionName)
         },
         tooltip: {
           show: true,
@@ -101,7 +147,7 @@
         },
         xAxis: {
           type: 'category',
-          data: ['1鏈�', '2鏈�', '3鏈�', '4鏈�', '5鏈�', '6鏈�', '7鏈�', '8鏈�', '9鏈�', '10鏈�', '11鏈�', '12鏈�']
+          data: dateList
         },
         yAxis: [
           {
@@ -115,63 +161,57 @@
             }
           }
         ],
-        series: [
-          {
+        series: dataList.map(item => {
+          return {
             type: 'line',
-            name: '鏁伴摚涓�鐝�',
-            yAxisIndex: 0,
-            data: [85, 32, 23, 56, 24, 64, 34, 85, 32, 23, 56, 24]
-          },
-          {
-            type: 'line',
-            name: '鏁伴摚浜岀彮',
-            yAxisIndex: 0,
-            data: [23, 42, 76, 54, 87, 34, 53, 76, 54, 87, 34, 53]
-          },
-          {
-            type: 'line',
-            name: '鏁伴摚涓夌彮',
-            yAxisIndex: 0,
-            data: [10, 84, 21, 42, 53, 57, 32, 21, 42, 53, 57, 32]
-          },
-          {
-            type: 'line',
-            name: '鏁拌溅鐝�',
-            yAxisIndex: 0,
-            data: [23, 32, 42, 35, 64, 53, 16, 42, 35, 64, 53, 16]
+            name: item.productionName,
+            data: item.dataList.map(item => item.utilizationRate)
           }
-        ]
+        })
+        // series: [
+        //   {
+        //     type: 'line',
+        //     name: '鏁伴摚涓�鐝�',
+        //     data: [85, 32, 23, 56, 24, 64]
+        //   },
+        //   {
+        //     type: 'line',
+        //     name: '鏁伴摚浜岀彮',
+        //     data: [23, 42, 76, 54, 87, 34]
+        //   },
+        //   {
+        //     type: 'line',
+        //     name: '鏁伴摚涓夌彮',
+        //     data: [10, 84, 21, 42, 53, 57]
+        //   },
+        //   {
+        //     type: 'line',
+        //     name: '鏁拌溅鐝�',
+        //     data: [23, 32, 42, 35, 64, 53]
+        //   }
+        // ]
       }
       this[position + 'ChartContainer'].setOption(option, true)
+      if (isHideLoading) this[position + 'ChartContainer'].hideLoading()
     },
 
-    // 璋冪敤鎺ュ彛鑾峰彇鎺у埗绯荤粺绫诲瀷
-    getDriveTypeByApi() {
-      api.getDriveTypeApi().then((res) => {
-        this.driveTypeList = res.result.map(item => item.value)
-      })
-    },
-
-    /**
-     * 鑱旀兂杈撳叆妗嗙瓫閫夊姛鑳�
-     * @param input 杈撳叆鐨勫唴瀹�
-     * @param option 閰嶇疆
-     * @returns {boolean} 鍒ゆ柇鏄惁绛涢��
-     */
-    filterOption(input, option) {
-      return (
-        option.componentOptions.children[0].text.toUpperCase().indexOf(input.toUpperCase()) >= 0
-      )
+    // 鑾峰彇涓績鍒楄〃
+    getCenterListByApi() {
+      mdcApi.getCenterOrGroupListApi()
+        .then(res => {
+          if (res.success) {
+            this.centerList = res.result
+            this.queryParam.productionId = res.result[0].value
+            this.loadData()
+          }
+        })
     },
 
     handleWindowResize() {
       if (this.leftChartContainer) this.leftChartContainer.resize()
+      if (this.middleChartContainer) this.middleChartContainer.resize()
       if (this.rightChartContainer) this.rightChartContainer.resize()
     }
   }
 }
-</script>
-
-<style scoped lang="less">
-
-</style>
\ No newline at end of file
+</script>
\ No newline at end of file
diff --git a/src/views/mdc/base/modules/DeliveryGroupUtilizationRateChart/ChartComponent.vue b/src/views/mdc/base/modules/DeliveryGroupUtilizationRateChart/ChartComponent.vue
index 7ad05bd..372778b 100644
--- a/src/views/mdc/base/modules/DeliveryGroupUtilizationRateChart/ChartComponent.vue
+++ b/src/views/mdc/base/modules/DeliveryGroupUtilizationRateChart/ChartComponent.vue
@@ -106,15 +106,15 @@
           }
         },
         grid: {
-          top: '10%',
+          top: '12%',
           left: '1%',
           right: '1%',
           bottom: '1%',
           containLabel: true
         },
         legend: {
-          top: 0,
-          right: 0,
+          top: '6%',
+          right: 'center',
           itemGap: 20,
           data: ['缁煎悎鏁堢巼锛堝叏閮ㄨ澶囨椂闂达級', '缁煎悎鏁堢巼锛堝幓闄ゆ晠闅滆澶囨椂闂达級']
         },
diff --git a/src/views/system/UserList.vue b/src/views/system/UserList.vue
index 5a29723..e6fa01a 100644
--- a/src/views/system/UserList.vue
+++ b/src/views/system/UserList.vue
@@ -14,48 +14,19 @@
           </a-col>
 
           <a-col :md="6" :sm="8">
-            <a-form-item label="鎬у埆">
-              <a-select v-model="queryParam.sex" placeholder="璇烽�夋嫨鎬у埆">
+            <a-form-item label="鐢ㄦ埛鐘舵��">
+              <a-select v-model="queryParam.status" placeholder="璇烽�夋嫨">
                 <a-select-option value="">璇烽�夋嫨</a-select-option>
-                <a-select-option value="1">鐢�</a-select-option>
-                <a-select-option value="2">濂�</a-select-option>
+                <a-select-option value="1">姝e父</a-select-option>
+                <a-select-option value="2">鍐荤粨</a-select-option>
               </a-select>
             </a-form-item>
           </a-col>
-
-
-          <template v-if="toggleSearchStatus">
-            <a-col :md="6" :sm="8">
-              <a-form-item label="鐪熷疄鍚嶅瓧">
-                <a-input placeholder="璇疯緭鍏ョ湡瀹炲悕瀛�" v-model="queryParam.realname"></a-input>
-              </a-form-item>
-            </a-col>
-
-            <a-col :md="6" :sm="8">
-              <a-form-item label="鎵嬫満鍙风爜">
-                <a-input placeholder="璇疯緭鍏ユ墜鏈哄彿鐮佹煡璇�" v-model="queryParam.phone"></a-input>
-              </a-form-item>
-            </a-col>
-
-            <a-col :md="6" :sm="8">
-              <a-form-item label="鐢ㄦ埛鐘舵��">
-                <a-select v-model="queryParam.status" placeholder="璇烽�夋嫨">
-                  <a-select-option value="">璇烽�夋嫨</a-select-option>
-                  <a-select-option value="1">姝e父</a-select-option>
-                  <a-select-option value="2">鍐荤粨</a-select-option>
-                </a-select>
-              </a-form-item>
-            </a-col>
-          </template>
 
           <a-col :md="6" :sm="8">
             <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
               <a-button type="primary" @click="searchQuery" icon="search">鏌ヨ</a-button>
               <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">閲嶇疆</a-button>
-              <a @click="handleToggleSearch" style="margin-left: 8px">
-                {{ toggleSearchStatus ? '鏀惰捣' : '灞曞紑' }}
-                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
-              </a>
             </span>
           </a-col>
 
diff --git a/src/views/system/modules/PasswordModal.vue b/src/views/system/modules/PasswordModal.vue
index f9f897e..c73b25d 100644
--- a/src/views/system/modules/PasswordModal.vue
+++ b/src/views/system/modules/PasswordModal.vue
@@ -16,12 +16,13 @@
           <a-input placeholder="璇疯緭鍏ョ敤鎴疯处鍙�" v-decorator="[ 'username', {}]" :readOnly="true"/>
         </a-form-item>
 
-        <a-form-item label="鐧诲綍瀵嗙爜" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback >
-          <a-input type="password" placeholder="璇疯緭鍏ョ櫥褰曞瘑鐮�" v-decorator="[ 'password', validatorRules.password]" />
+        <a-form-item label="鐧诲綍瀵嗙爜" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback>
+          <a-input type="password" placeholder="璇疯緭鍏ョ櫥褰曞瘑鐮�" v-decorator="[ 'password', validatorRules.password]"/>
         </a-form-item>
 
-        <a-form-item label="纭瀵嗙爜" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback >
-          <a-input type="password" @blur="handleConfirmBlur" placeholder="璇烽噸鏂拌緭鍏ョ櫥褰曞瘑鐮�" v-decorator="[ 'confirmpassword', validatorRules.confirmpassword]"/>
+        <a-form-item label="纭瀵嗙爜" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback>
+          <a-input type="password" @blur="handleConfirmBlur" placeholder="璇烽噸鏂拌緭鍏ョ櫥褰曞瘑鐮�"
+                   v-decorator="[ 'confirmpassword', validatorRules.confirmpassword]"/>
         </a-form-item>
 
       </a-form>
@@ -30,113 +31,115 @@
 </template>
 
 <script>
-  import {changePassword} from '@/api/api'
+import { changePassword } from '@/api/api'
 
-  export default {
-    name: "PasswordModal",
-    data () {
-      return {
-        visible: false,
-        confirmLoading: false,
-        confirmDirty: false,
-        validatorRules:{
-          password:{
-            rules: [{
+export default {
+  name: 'PasswordModal',
+  data() {
+    return {
+      visible: false,
+      confirmLoading: false,
+      confirmDirty: false,
+      validatorRules: {
+        password: {
+          rules: [
+            {
               required: true,
-              pattern:/^(?=.*[a-zA-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,./]).{8,}$/,
-              message: '瀵嗙爜鐢�8浣嶆暟瀛椼�佸ぇ灏忓啓瀛楁瘝鍜岀壒娈婄鍙风粍鎴�!'
-            }, {
-              validator: this.validateToNextPassword,
-            }],
-          },
-          confirmpassword:{
-            rules: [{
-              required: true, message: '璇烽噸鏂拌緭鍏ョ櫥褰曞瘑鐮�!',
-            }, {
-              validator: this.compareToFirstPassword,
-            }],
-          },
+              // pattern:/^(?=.*[a-zA-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,./]).{8,}$/,
+              message: '璇疯緭鍏ョ櫥褰曞瘑鐮�!'
+            },
+            {
+              validator: this.validateToNextPassword
+            }]
         },
+        confirmpassword: {
+          rules: [{
+            required: true, message: '璇烽噸鏂拌緭鍏ョ櫥褰曞瘑鐮�!'
+          }, {
+            validator: this.compareToFirstPassword
+          }]
+        }
+      },
 
-        model: {},
+      model: {},
 
-        labelCol: {
-          xs: { span: 24 },
-          sm: { span: 5 },
-        },
-        wrapperCol: {
-          xs: { span: 24 },
-          sm: { span: 16 },
-        },
-        form:this.$form.createForm(this)
+      labelCol: {
+        xs: { span: 24 },
+        sm: { span: 5 }
+      },
+      wrapperCol: {
+        xs: { span: 24 },
+        sm: { span: 16 }
+      },
+      form: this.$form.createForm(this)
+    }
+  },
+  created() {
+    console.log('created')
+  },
+
+  methods: {
+    show(username) {
+      this.form.resetFields()
+      this.visible = true
+      this.model.username = username
+      this.$nextTick(() => {
+        this.form.setFieldsValue({ username: username })
+      })
+    },
+    close() {
+      this.$emit('close')
+      this.visible = false
+      this.disableSubmit = false
+      this.selectedRole = []
+    },
+    handleSubmit() {
+      // 瑙﹀彂琛ㄥ崟楠岃瘉
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          this.confirmLoading = true
+          let formData = Object.assign(this.model, values)
+          changePassword(formData).then((res) => {
+            if (res.success) {
+              this.$message.success(res.message)
+              this.$emit('ok')
+            } else {
+              this.$message.warning(res.message)
+            }
+          }).finally(() => {
+            this.confirmLoading = false
+            this.close()
+          })
+        }
+      })
+    },
+    handleCancel() {
+      this.close()
+    },
+    validateToNextPassword(rule, value, callback) {
+      const form = this.form
+      const confirmpassword = form.getFieldValue('confirmpassword')
+      console.log('confirmpassword==>', confirmpassword)
+      if (value && confirmpassword && value !== confirmpassword) {
+        callback('涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鏍凤紒')
+      }
+      if (value && this.confirmDirty) {
+        form.validateFields(['confirm'], { force: true })
+      }
+      callback()
+    },
+    compareToFirstPassword(rule, value, callback) {
+      const form = this.form
+      if (value && value !== form.getFieldValue('password')) {
+        callback('涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鏍凤紒')
+      } else {
+        callback()
       }
     },
-    created () {
-      console.log("created");
-    },
-
-    methods: {
-      show (username) {
-        this.form.resetFields();
-        this.visible = true;
-        this.model.username = username;
-        this.$nextTick(() => {
-          this.form.setFieldsValue({username:username});
-        });
-      },
-      close () {
-        this.$emit('close');
-        this.visible = false;
-        this.disableSubmit = false;
-        this.selectedRole = [];
-      },
-      handleSubmit () {
-        // 瑙﹀彂琛ㄥ崟楠岃瘉
-        this.form.validateFields((err, values) => {
-          if (!err) {
-            this.confirmLoading = true;
-            let formData = Object.assign(this.model, values);
-            changePassword(formData).then((res)=>{
-              if(res.success){
-                this.$message.success(res.message);
-                this.$emit('ok');
-              }else{
-                this.$message.warning(res.message);
-              }
-            }).finally(() => {
-              this.confirmLoading = false;
-              this.close();
-            });
-          }
-        })
-      },
-      handleCancel () {
-        this.close()
-      },
-      validateToNextPassword  (rule, value, callback) {
-        const form = this.form;
-        const confirmpassword=form.getFieldValue('confirmpassword');
-        console.log("confirmpassword==>",confirmpassword);
-        if (value && confirmpassword && value !== confirmpassword) {
-          callback('涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鏍凤紒');
-        }
-        if (value && this.confirmDirty) {
-          form.validateFields(['confirm'], { force: true })
-        }
-        callback();
-      },
-      compareToFirstPassword  (rule, value, callback) {
-        const form = this.form;
-        if (value && value !== form.getFieldValue('password')) {
-          callback('涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鏍凤紒');
-        } else {
-          callback()
-        }
-      },
-      handleConfirmBlur  (e) {
-        const value = e.target.value
-        this.confirmDirty = this.confirmDirty || !!value
-      }
+    handleConfirmBlur(e) {
+      const value = e.target.value
+      this.confirmDirty = this.confirmDirty || !!value
     }
   }
+}
 </script>
\ No newline at end of file
diff --git a/src/views/system/modules/UserModal.vue b/src/views/system/modules/UserModal.vue
index 1bf4935..6f8fbd6 100644
--- a/src/views/system/modules/UserModal.vue
+++ b/src/views/system/modules/UserModal.vue
@@ -157,7 +157,8 @@
           :wrapperCol="wrapperCol"
           v-show="!productionDisabled"
         >
-          <a-tooltip title="閫夋嫨璁惧鍚庯紝鐢ㄦ埛灏卞彧鏈夎繖浜涜澶囩殑鏉冮檺锛佷笉閫夋嫨璁惧锛屽垯浼氭牴鎹溅闂村垎閰嶆帶鍒惰澶囩殑鏉冮檺锛�" placement="topRight">
+          <a-tooltip title="閫夋嫨璁惧鍚庯紝鐢ㄦ埛灏卞彧鏈夎繖浜涜澶囩殑鏉冮檺锛佷笉閫夋嫨璁惧锛屽垯浼氭牴鎹溅闂村垎閰嶆帶鍒惰澶囩殑鏉冮檺锛�"
+                     placement="topRight">
             <a-input-search
               :readOnly="true"
               v-model="model.equipmentIds"
@@ -170,70 +171,69 @@
         </a-form-model-item>
 
 
-
         <!--<a-form-model-item-->
-          <!--label="棣栭〉鏉冮檺"-->
-          <!--:labelCol="labelCol"-->
-          <!--:wrapperCol="wrapperCol"-->
+        <!--label="棣栭〉鏉冮檺"-->
+        <!--:labelCol="labelCol"-->
+        <!--:wrapperCol="wrapperCol"-->
         <!--&gt;-->
-          <!--<a-radio-group-->
-            <!--v-model="model.userType"-->
-            <!--:defaultValue="0"-->
-          <!--&gt;-->
-            <!--<a-radio :value="4">鍏徃绾�</a-radio>-->
-            <!--<a-radio :value="3">杞﹂棿绾�</a-radio>-->
-            <!--<a-radio :value="2">宸ユ绾�</a-radio>-->
-            <!--<a-radio :value="1">鎿嶄綔宸�</a-radio>-->
-            <!--<a-radio :value="0">鏃�</a-radio>-->
-          <!--</a-radio-group>-->
+        <!--<a-radio-group-->
+        <!--v-model="model.userType"-->
+        <!--:defaultValue="0"-->
+        <!--&gt;-->
+        <!--<a-radio :value="4">鍏徃绾�</a-radio>-->
+        <!--<a-radio :value="3">杞﹂棿绾�</a-radio>-->
+        <!--<a-radio :value="2">宸ユ绾�</a-radio>-->
+        <!--<a-radio :value="1">鎿嶄綔宸�</a-radio>-->
+        <!--<a-radio :value="0">鏃�</a-radio>-->
+        <!--</a-radio-group>-->
         <!--</a-form-model-item>-->
 
         <!--<a-form-model-item-->
-          <!--label="鐝粍鍒嗛厤"-->
-          <!--:labelCol="labelCol"-->
-          <!--:wrapperCol="wrapperCol"-->
-          <!--prop="teamId"-->
+        <!--label="鐝粍鍒嗛厤"-->
+        <!--:labelCol="labelCol"-->
+        <!--:wrapperCol="wrapperCol"-->
+        <!--prop="teamId"-->
         <!--&gt;-->
-          <!--<j-dict-select-tag-->
-            <!--v-model="model.teamId"-->
-            <!--:triggerChange="true"-->
-            <!--dictCode="mom_base_team,name,id,del_flag = 0"-->
-            <!--placeholder="璇风淮鎶ょ彮缁�"-->
-          <!--&gt;</j-dict-select-tag>-->
+        <!--<j-dict-select-tag-->
+        <!--v-model="model.teamId"-->
+        <!--:triggerChange="true"-->
+        <!--dictCode="mom_base_team,name,id,del_flag = 0"-->
+        <!--placeholder="璇风淮鎶ょ彮缁�"-->
+        <!--&gt;</j-dict-select-tag>-->
         <!--</a-form-model-item>-->
         <!--<a-form-model-item-->
-          <!--label="涓績鍒嗛厤"-->
-          <!--:labelCol="labelCol"-->
-          <!--:wrapperCol="wrapperCol"-->
-          <!--prop="areaId"-->
+        <!--label="涓績鍒嗛厤"-->
+        <!--:labelCol="labelCol"-->
+        <!--:wrapperCol="wrapperCol"-->
+        <!--prop="areaId"-->
         <!--&gt;-->
-          <!--&lt;!&ndash; <j-dict-select-tag-->
-            <!--v-model="model.areaId"-->
-            <!--:triggerChange="true"-->
-            <!--dictCode="mom_base_area,name,id,del_flag = 0"-->
-            <!--placeholder="璇风淮鎶や腑蹇�"-->
-          <!--&gt;</j-dict-select-tag> &ndash;&gt;-->
-          <!--<j-multi-select-tag-->
-            <!--:triggerChange="true"-->
-            <!--v-model="model.areaId"-->
-            <!--dictCode="mom_base_area,name,id,del_flag = 0 and type = 1"-->
-            <!--placeholder="璇风淮鎶や腑蹇�"-->
-          <!--&gt;-->
-          <!--</j-multi-select-tag>-->
+        <!--&lt;!&ndash; <j-dict-select-tag-->
+        <!--v-model="model.areaId"-->
+        <!--:triggerChange="true"-->
+        <!--dictCode="mom_base_area,name,id,del_flag = 0"-->
+        <!--placeholder="璇风淮鎶や腑蹇�"-->
+        <!--&gt;</j-dict-select-tag> &ndash;&gt;-->
+        <!--<j-multi-select-tag-->
+        <!--:triggerChange="true"-->
+        <!--v-model="model.areaId"-->
+        <!--dictCode="mom_base_area,name,id,del_flag = 0 and type = 1"-->
+        <!--placeholder="璇风淮鎶や腑蹇�"-->
+        <!--&gt;-->
+        <!--</j-multi-select-tag>-->
         <!--</a-form-model-item>-->
         <!--<a-form-model-item-->
-          <!--label="璐熻矗閮ㄩ棬"-->
-          <!--:labelCol="labelCol"-->
-          <!--:wrapperCol="wrapperCol"-->
-          <!--v-if="departIdShow==true"-->
+        <!--label="璐熻矗閮ㄩ棬"-->
+        <!--:labelCol="labelCol"-->
+        <!--:wrapperCol="wrapperCol"-->
+        <!--v-if="departIdShow==true"-->
         <!--&gt;-->
-          <!--<j-multi-select-tag-->
-            <!--:disabled="disableSubmit"-->
-            <!--v-model="model.departIds"-->
-            <!--:options="nextDepartOptions"-->
-            <!--placeholder="璇烽�夋嫨璐熻矗閮ㄩ棬"-->
-          <!--&gt;-->
-          <!--</j-multi-select-tag>-->
+        <!--<j-multi-select-tag-->
+        <!--:disabled="disableSubmit"-->
+        <!--v-model="model.departIds"-->
+        <!--:options="nextDepartOptions"-->
+        <!--placeholder="璇烽�夋嫨璐熻矗閮ㄩ棬"-->
+        <!--&gt;-->
+        <!--</j-multi-select-tag>-->
         <!--</a-form-model-item>-->
 
         <!--<a-form-model-item-->
@@ -348,504 +348,504 @@
 </template>
 
 <script>
-  import moment from 'moment'
-  import Vue from 'vue'
-  import { ACCESS_TOKEN } from '@/store/mutation-types'
-  import { getAction } from '@/api/manage'
-  import { addUser, editUser, queryUserRole, queryall } from '@/api/api'
-  import { disabledAuthFilter } from '@/utils/authFilter'
-  import { duplicateCheck } from '@/api/api'
-  import JSelectProduction from '../../../components/jeecgbiz/JSelectProduction'
-  import { mapActions } from 'vuex'
-  import { ajaxGetDictItems, getDictItemsFromCache } from '@/api/api'
-  import SelectDeviceModal from './SelectDeviceModal'
+import moment from 'moment'
+import Vue from 'vue'
+import { ACCESS_TOKEN } from '@/store/mutation-types'
+import { getAction } from '@/api/manage'
+import { addUser, editUser, queryUserRole, queryall } from '@/api/api'
+import { disabledAuthFilter } from '@/utils/authFilter'
+import { duplicateCheck } from '@/api/api'
+import JSelectProduction from '../../../components/jeecgbiz/JSelectProduction'
+import { mapActions } from 'vuex'
+import { ajaxGetDictItems, getDictItemsFromCache } from '@/api/api'
+import SelectDeviceModal from './SelectDeviceModal'
 
-  export default {
-    name: 'UserModal',
-    components: {
-      SelectDeviceModal,
-      JSelectProduction
-    },
-    data() {
-      return {
-        departDisabled: false, //鏄惁鏄垜鐨勯儴闂ㄨ皟鐢ㄨ椤甸潰
-        productionDisabled: false, //鏄惁鏄垜鐨勮溅闂磋皟鐢ㄨ椤甸潰
-        roleDisabled: false, //鏄惁鏄鑹茬淮鎶よ皟鐢ㄨ椤甸潰
-        modalWidth: 800,
-        drawerWidth: 700,
-        modaltoggleFlag: true,
-        confirmDirty: false,
-        userId: '', //淇濆瓨鐢ㄦ埛id
-        disableSubmit: false,
-        dateFormat: 'YYYY-MM-DD',
-        validatorRules: {
-          username: [{ required: true, message: '璇疯緭鍏ョ敤鎴疯处鍙�!' },
-            { validator: this.validateUsername }],
-          password: [
-          //   {
-          //   required: true,
-          //   pattern: /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,./]).{8,}$/,
-          //   message: '瀵嗙爜鐢�8浣嶆暟瀛椼�佸ぇ灏忓啓瀛楁瘝鍜岀壒娈婄鍙风粍鎴�!'
-          // },
-            { validator: this.validateToNextPassword, trigger: 'change' }],
-          confirmpassword: [{ required: true, message: '璇烽噸鏂拌緭鍏ョ櫥褰曞瘑鐮�!' },
-            { validator: this.compareToFirstPassword }],
-          realname: [{ required: true, message: '璇疯緭鍏ョ敤鎴峰悕绉�!' }],
-          phone: [{ required: false, message: '璇疯緭鍏ユ墜鏈哄彿!' }, { validator: this.validatePhone }],
-          email: [{ validator: this.validateEmail }],
-          roles: {},
-          workNo: [{ required: true, message: '璇疯緭鍏ュ伐鍙�' },
-            { validator: this.validateWorkNo }],
-          telephone: [{ pattern: /^0\d{2,3}-[1-9]\d{6,7}$/, message: '璇疯緭鍏ユ纭殑搴ф満鍙风爜' }],
-          teamId: [{ required: false, message: '璇风淮鎶ょ彮缁�' }]
-        },
-        departIdShow: false,
-        title: '鎿嶄綔',
-        visible: false,
-        model: {},
-        labelCol: {
-          xs: { span: 24 },
-          sm: { span: 5 }
-        },
-        wrapperCol: {
-          xs: { span: 24 },
-          sm: { span: 16 }
-        },
-        uploadLoading: false,
-        confirmLoading: false,
-        headers: {},
-        url: {
-          fileUpload: window._CONFIG['domianURL'] + 'sys/common/upload',
-          userWithDepart: '/sys/user/userDepartList', // 寮曞叆涓烘寚瀹氱敤鎴锋煡鐪嬮儴闂ㄤ俊鎭渶瑕佺殑url
-          //寮曞叆涓烘寚瀹氱敤鎴锋煡鐪嬭溅闂翠俊鎭渶瑕佺殑url
-          userProductionList: '/sys/user/userProductionList',
-          userId: '/sys/user/generateUserId', // 寮曞叆鐢熸垚娣诲姞鐢ㄦ埛鎯呭喌涓嬬殑url
-          syncUserByUserName: '/act/process/extActProcess/doSyncUserByUserName',//鍚屾鐢ㄦ埛鍒板伐浣滄祦
-          queryTenantList: '/sys/tenant/queryList'
-        },
-        tenantsOptions: [],
-        rolesOptions: [],
-        nextDepartOptions: [],
-        nextProductionOptions: [],
-        isDepartType: '',
-        model: {
-          selectedProduction: ''
-        }
-      }
-    },
-    watch: {
-      visible: {
-        handler(value) {
-          if (value) this.initDictData('password_length')
-        }
+export default {
+  name: 'UserModal',
+  components: {
+    SelectDeviceModal,
+    JSelectProduction
+  },
+  data() {
+    return {
+      departDisabled: false, //鏄惁鏄垜鐨勯儴闂ㄨ皟鐢ㄨ椤甸潰
+      productionDisabled: false, //鏄惁鏄垜鐨勮溅闂磋皟鐢ㄨ椤甸潰
+      roleDisabled: false, //鏄惁鏄鑹茬淮鎶よ皟鐢ㄨ椤甸潰
+      modalWidth: 800,
+      drawerWidth: 700,
+      modaltoggleFlag: true,
+      confirmDirty: false,
+      userId: '', //淇濆瓨鐢ㄦ埛id
+      disableSubmit: false,
+      dateFormat: 'YYYY-MM-DD',
+      validatorRules: {
+        username: [{ required: true, message: '璇疯緭鍏ョ敤鎴疯处鍙�!' },
+          { validator: this.validateUsername }],
+        password: [
+          {
+            required: true,
+            // pattern: /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,./]).{8,}$/,
+            message: '璇疯緭鍏ョ櫥褰曞瘑鐮�!'
+          },
+          { validator: this.validateToNextPassword, trigger: 'change' }],
+        confirmpassword: [{ required: true, message: '璇烽噸鏂拌緭鍏ョ櫥褰曞瘑鐮�!' },
+          { validator: this.compareToFirstPassword }],
+        realname: [{ required: true, message: '璇疯緭鍏ョ敤鎴峰悕绉�!' }],
+        phone: [{ required: false, message: '璇疯緭鍏ユ墜鏈哄彿!' }, { validator: this.validatePhone }],
+        email: [{ validator: this.validateEmail }],
+        roles: {},
+        // workNo: [{ required: true, message: '璇疯緭鍏ュ伐鍙�' },
+        //   { validator: this.validateWorkNo }],
+        telephone: [{ pattern: /^0\d{2,3}-[1-9]\d{6,7}$/, message: '璇疯緭鍏ユ纭殑搴ф満鍙风爜' }],
+        teamId: [{ required: false, message: '璇风淮鎶ょ彮缁�' }]
       },
-      'model.selectedProduction': {
-        handler(newVal, oldVal) {
-          if (newVal && this.$refs.selectDeviceModal) {
-            // 濡傛灉杞﹂棿閫夋嫨鍓嶅悗涓嶄竴鑷村垯閲嶇疆閫夋嫨璁惧
-            if ((oldVal && newVal !== oldVal)) this.model.equipmentIds = ''
-            this.$refs.selectDeviceModal.queryTreeData(newVal)
-          }
-          // 濡傛灉娓呯┖杞﹂棿鍊煎垯閲嶇疆閫夋嫨璁惧
-          if (newVal === '') this.model.equipmentIds = ''
-        }
-      }
-    },
-    created() {
-      const token = Vue.ls.get(ACCESS_TOKEN)
-      this.headers = { 'X-Access-Token': token }
-      this.initRoleList()
-      this.initTenantList()
-      this.queryTreeData()
-    },
-    computed: {
-      uploadAction: function () {
-        return this.url.fileUpload
-      }
-    },
-    methods: {
-      ...mapActions(['QueryDepartTree']),
-      queryTreeData() {
-        this.QueryDepartTree().then(res => {
-          if (res.success) {
-            this.isDepartType = res.result[0].value
-          } else {
-            // this.$message.warn(res.message)
-            this.$notification.warning({
-              message: '娑堟伅',
-              description: res.message
-            })
-          }
-        }).finally(() => {
-        })
+      departIdShow: false,
+      title: '鎿嶄綔',
+      visible: false,
+      model: {},
+      labelCol: {
+        xs: { span: 24 },
+        sm: { span: 5 }
       },
-      add() {
-        this.refresh()
-        this.edit({
-          activitiSync: '1',
-          userType: 0,
-          userIdentity: 1,
-          selectedroles: '',
-          selecteddeparts: '',
-          selectedProduction: ''
-        })
+      wrapperCol: {
+        xs: { span: 24 },
+        sm: { span: 16 }
       },
-      edit(record) {
-        let that = this
-        that.visible = true
-        //鏍规嵁灞忓箷瀹藉害鑷�傚簲鎶藉眽瀹藉害
-        this.resetScreenSize()
-        that.userId = record.id
-        console.log('record', record)
-        that.model = Object.assign({}, record)
-        //韬唤涓轰笂绾ф樉绀鸿礋璐i儴闂紝鍚﹀垯涓嶆樉绀�
-        if (this.model.userIdentity == 2) {
-          this.departIdShow = true
-        } else {
-          this.departIdShow = false
-        }
-
-        if (record.hasOwnProperty('id')) {
-          that.getUserRoles(record.id)
-          that.getUserDeparts(record.id)
-        }
+      uploadLoading: false,
+      confirmLoading: false,
+      headers: {},
+      url: {
+        fileUpload: window._CONFIG['domianURL'] + 'sys/common/upload',
+        userWithDepart: '/sys/user/userDepartList', // 寮曞叆涓烘寚瀹氱敤鎴锋煡鐪嬮儴闂ㄤ俊鎭渶瑕佺殑url
+        //寮曞叆涓烘寚瀹氱敤鎴锋煡鐪嬭溅闂翠俊鎭渶瑕佺殑url
+        userProductionList: '/sys/user/userProductionList',
+        userId: '/sys/user/generateUserId', // 寮曞叆鐢熸垚娣诲姞鐢ㄦ埛鎯呭喌涓嬬殑url
+        syncUserByUserName: '/act/process/extActProcess/doSyncUserByUserName',//鍚屾鐢ㄦ埛鍒板伐浣滄祦
+        queryTenantList: '/sys/tenant/queryList'
       },
-      isDisabledAuth(code) {
-        return disabledAuthFilter(code)
-      },
-      //绐楀彛鏈�澶у寲鍒囨崲
-      toggleScreen() {
-        if (this.modaltoggleFlag) {
-          this.modalWidth = window.innerWidth
-        } else {
-          this.modalWidth = 800
-        }
-        this.modaltoggleFlag = !this.modaltoggleFlag
-      },
-      // 鏍规嵁灞忓箷鍙樺寲,璁剧疆鎶藉眽灏哄
-      resetScreenSize() {
-        let screenWidth = document.body.clientWidth
-        if (screenWidth < 500) {
-          this.drawerWidth = screenWidth
-        } else {
-          this.drawerWidth = 700
-        }
-      },
-      //鍒濆鍖栫鎴峰瓧鍏�
-      initTenantList() {
-        getAction(this.url.queryTenantList).then(res => {
-          if (res.success) {
-            this.tenantsOptions = res.result.map((item, index, arr) => {
-              let c = { label: item.name, value: item.id + '' }
-              return c
-            })
-          }
-        })
-      },
-      //鍒濆鍖栬鑹插瓧鍏�
-      initRoleList() {
-        queryall().then((res) => {
-          if (res.success) {
-            this.rolesOptions = res.result.map((item, index, arr) => {
-              let c = { label: item.roleName, value: item.id }
-              return c
-            })
-          }
-        })
-      },
-      getUserRoles(userid) {
-        queryUserRole({ userid: userid }).then((res) => {
-          if (res.success) {
-            this.$set(this.model, 'selectedroles', res.result.join(','))
-          }
-        })
-      },
-      getUserDeparts(userid) {
-        let that = this
-        //閮ㄩ棬鐨剈rl 鑾峰彇閮ㄩ棬鍒嗛厤
-        getAction(that.url.userWithDepart, { userId: userid }).then((res) => {
-          if (res.success) {
-            let departOptions = []
-            let selectDepartKeys = []
-            for (let i = 0; i < res.result.length; i++) {
-              selectDepartKeys.push(res.result[i].key)
-              //鏂板璐熻矗閮ㄩ棬閫夋嫨涓嬫媺妗�
-              departOptions.push({
-                value: res.result[i].key,
-                label: res.result[i].title
-              })
-            }
-
-            this.$set(this.model, 'selecteddeparts', selectDepartKeys.join(','))
-            that.nextDepartOptions = departOptions
-          }
-        })
-
-        // 鑾峰彇杞﹂棿鍒嗛厤
-        getAction(that.url.userProductionList, { userId: userid }).then((res) => {
-          if (res.success) {
-            let ProductionOptions = []
-            let selectProductKeys = []
-            for (let i = 0; i < res.result.length; i++) {
-              selectProductKeys.push(res.result[i].key)
-              //鏂板璐熻矗閮ㄩ棬閫夋嫨涓嬫媺妗�
-              ProductionOptions.push({
-                value: res.result[i].key,
-                label: res.result[i].title
-              })
-            }
-
-            this.$set(this.model, 'selectedProduction', selectProductKeys.join(','))
-            that.nextProductionOptions = ProductionOptions
-          }
-        })
-        //杞﹂棿鐨剈rl
-      },
-      backDepartInfo(info) {
-        this.model.departIds = this.model.selecteddeparts
-        this.nextDepartOptions = info.map((item, index, arr) => {
-          let c = { label: item.text, value: item.value + '' }
-          return c
-        })
-      },
-      backProductionInfo(info) {
-        this.model.productionIds = this.model.selectedProduction
-        this.nextProductionOptions = info.map((item, index, arr) => {
-          let c = { label: item.text, value: item.value + '' }
-          return c
-        })
-      },
-
-      refresh() {
-        this.userId = ''
-        this.nextDepartOptions = []
-        this.nextProductionOptions = []
-        this.departIdShow = false
-      },
-      close() {
-        this.$emit('close')
-        this.visible = false
-        this.disableSubmit = false
-        this.nextDepartOptions = []
-        this.nextProductionOptions = []
-        this.departIdShow = false
-        this.$refs.form.resetFields()
-      },
-      moment,
-      handleSubmit() {
-        const that = this
-        // 瑙﹀彂琛ㄥ崟楠岃瘉
-        this.$refs.form.validate(valid => {
-          if (valid) {
-            that.confirmLoading = true
-            //濡傛灉鏄笂绾ф嫨浼犲叆departIds,鍚﹀垯涓虹┖
-            if (this.model.userIdentity !== 2) {
-              this.model.departIds = ''
-            }
-            let obj
-            if (!this.model.id) {
-              this.model.id = this.userId
-              obj = addUser(this.model)
-            } else {
-              obj = editUser(this.model)
-            }
-            obj.then((res) => {
-              if (res.success) {
-                that.$message.success(res.message)
-                that.$emit('ok')
-              } else {
-                that.$message.warning(res.message)
-              }
-            }).finally(() => {
-              that.confirmLoading = false
-              that.close()
-            })
-          } else {
-            return false
-          }
-        })
-      },
-      handleCancel() {
-        this.close()
-      },
-      validateToNextPassword(rule, value, callback) {
-        const confirmpassword = this.model.confirmpassword
-        if (value && confirmpassword && value !== confirmpassword) {
-          callback('涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鏍凤紒')
-        }
-        if (value && this.confirmDirty) {
-          this.$refs.form.validateField(['confirmpassword'])
-        }
-        callback()
-      },
-      compareToFirstPassword(rule, value, callback) {
-        if (value && value !== this.model.password) {
-          callback('涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鏍凤紒')
-        } else {
-          callback()
-        }
-      },
-      validatePhone(rule, value, callback) {
-        if (!value) {
-          callback()
-        } else {
-          if (new RegExp(/^1[3|4|5|7|8|9][0-9]\d{8}$/).test(value)) {
-            var params = {
-              tableName: 'sys_user',
-              fieldName: 'phone',
-              fieldVal: value,
-              dataId: this.userId
-            }
-            duplicateCheck(params).then((res) => {
-              if (res.success) {
-                callback()
-              } else {
-                callback('鎵嬫満鍙峰凡瀛樺湪!')
-              }
-            })
-          } else {
-            callback('璇疯緭鍏ユ纭牸寮忕殑鎵嬫満鍙风爜!')
-          }
-        }
-      },
-      validateEmail(rule, value, callback) {
-        if (!value) {
-          callback()
-        } else {
-          if (new RegExp(/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/).test(value)) {
-            var params = {
-              tableName: 'sys_user',
-              fieldName: 'email',
-              fieldVal: value,
-              dataId: this.userId
-            }
-            duplicateCheck(params).then((res) => {
-              console.log(res)
-              if (res.success) {
-                callback()
-              } else {
-                callback('閭宸插瓨鍦�!')
-              }
-            })
-          } else {
-            callback('璇疯緭鍏ユ纭牸寮忕殑閭!')
-          }
-        }
-      },
-      validateUsername(rule, value, callback) {
-        var params = {
-          tableName: 'sys_user',
-          fieldName: 'username',
-          fieldVal: value,
-          dataId: this.userId
-        }
-        duplicateCheck(params).then((res) => {
-          if (res.success) {
-            callback()
-          } else {
-            callback('鐢ㄦ埛鍚嶅凡瀛樺湪!')
-          }
-        })
-      },
-      validateWorkNo(rule, value, callback) {
-        var params = {
-          tableName: 'sys_user',
-          fieldName: 'work_no',
-          fieldVal: value,
-          dataId: this.userId
-        }
-        duplicateCheck(params).then((res) => {
-          if (res.success) {
-            callback()
-          } else {
-            callback('宸ュ彿宸插瓨鍦�!')
-          }
-        })
-      },
-      handleConfirmBlur(e) {
-        const value = e.target.value
-        this.confirmDirty = this.confirmDirty || !!value
-      },
-      beforeUpload: function (file) {
-        var fileType = file.type
-        if (fileType.indexOf('image') < 0) {
-          this.$message.warning('璇蜂笂浼犲浘鐗�')
-          return false
-        }
-        //TODO 楠岃瘉鏂囦欢澶у皬
-      },
-      identityChange(e) {
-        if (e.target.value === 1) {
-          this.departIdShow = false
-        } else {
-          this.departIdShow = true
-        }
-      },
-      initDictData(dictCode) {
-        //鏍规嵁瀛楀吀Code, 鍒濆鍖栧瓧鍏告暟缁�
-        ajaxGetDictItems(dictCode, null).then((res) => {
-          if (res.success) {
-            const regExp = new RegExp('^(?=.*[a-zA-Z])(?=.*\\\d)(?=.*[~!@#$%^&*()_+`\\-={}:";\'<>?,./]).{' + Number(res.result[0].value) + ',}$')
-
-            this.validatorRules.password[0] = {
-              required: true,
-              pattern: regExp,
-              message: `瀵嗙爜鐢�${res.result[0].value}浣嶆暟瀛椼�佸ぇ灏忓啓瀛楁瘝鍜岀壒娈婄鍙风粍鎴�!`
-            }
-
-          }
-        })
-      },
-
-      deviceSearch() {
-        this.$refs.selectDeviceModal.visible = true
-        this.$refs.selectDeviceModal.selectedRowKeys = []
-        this.$refs.selectDeviceModal.selectedRows = []
-        this.$refs.selectDeviceModal.checkedKeys = this.model.equipmentIds ? this.model.equipmentIds.split(',') : []
-      },
-
-      /**
-       * 閫夋嫨宸叉湁璁惧鍚庣偣鍑荤‘瀹氭椂瑙﹀彂
-       * @param data 宸查�夋嫨鐨勮澶囨暟缁�
-       */
-      selectOK(data) {
-        console.log('data=', data)
-        this.$set(this.model, 'equipmentIds', data.join(','))
+      tenantsOptions: [],
+      rolesOptions: [],
+      nextDepartOptions: [],
+      nextProductionOptions: [],
+      isDepartType: '',
+      model: {
+        selectedProduction: ''
       }
     }
+  },
+  watch: {
+    visible: {
+      handler(value) {
+        if (value) this.initDictData('password_length')
+      }
+    },
+    'model.selectedProduction': {
+      handler(newVal, oldVal) {
+        if (newVal && this.$refs.selectDeviceModal) {
+          // 濡傛灉杞﹂棿閫夋嫨鍓嶅悗涓嶄竴鑷村垯閲嶇疆閫夋嫨璁惧
+          if ((oldVal && newVal !== oldVal)) this.model.equipmentIds = ''
+          this.$refs.selectDeviceModal.queryTreeData(newVal)
+        }
+        // 濡傛灉娓呯┖杞﹂棿鍊煎垯閲嶇疆閫夋嫨璁惧
+        if (newVal === '') this.model.equipmentIds = ''
+      }
+    }
+  },
+  created() {
+    const token = Vue.ls.get(ACCESS_TOKEN)
+    this.headers = { 'X-Access-Token': token }
+    this.initRoleList()
+    this.initTenantList()
+    this.queryTreeData()
+  },
+  computed: {
+    uploadAction: function() {
+      return this.url.fileUpload
+    }
+  },
+  methods: {
+    ...mapActions(['QueryDepartTree']),
+    queryTreeData() {
+      this.QueryDepartTree().then(res => {
+        if (res.success) {
+          this.isDepartType = res.result[0].value
+        } else {
+          // this.$message.warn(res.message)
+          this.$notification.warning({
+            message: '娑堟伅',
+            description: res.message
+          })
+        }
+      }).finally(() => {
+      })
+    },
+    add() {
+      this.refresh()
+      this.edit({
+        activitiSync: '1',
+        userType: 0,
+        userIdentity: 1,
+        selectedroles: '',
+        selecteddeparts: '',
+        selectedProduction: ''
+      })
+    },
+    edit(record) {
+      let that = this
+      that.visible = true
+      //鏍规嵁灞忓箷瀹藉害鑷�傚簲鎶藉眽瀹藉害
+      this.resetScreenSize()
+      that.userId = record.id
+      console.log('record', record)
+      that.model = Object.assign({}, record)
+      //韬唤涓轰笂绾ф樉绀鸿礋璐i儴闂紝鍚﹀垯涓嶆樉绀�
+      if (this.model.userIdentity == 2) {
+        this.departIdShow = true
+      } else {
+        this.departIdShow = false
+      }
+
+      if (record.hasOwnProperty('id')) {
+        that.getUserRoles(record.id)
+        that.getUserDeparts(record.id)
+      }
+    },
+    isDisabledAuth(code) {
+      return disabledAuthFilter(code)
+    },
+    //绐楀彛鏈�澶у寲鍒囨崲
+    toggleScreen() {
+      if (this.modaltoggleFlag) {
+        this.modalWidth = window.innerWidth
+      } else {
+        this.modalWidth = 800
+      }
+      this.modaltoggleFlag = !this.modaltoggleFlag
+    },
+    // 鏍规嵁灞忓箷鍙樺寲,璁剧疆鎶藉眽灏哄
+    resetScreenSize() {
+      let screenWidth = document.body.clientWidth
+      if (screenWidth < 500) {
+        this.drawerWidth = screenWidth
+      } else {
+        this.drawerWidth = 700
+      }
+    },
+    //鍒濆鍖栫鎴峰瓧鍏�
+    initTenantList() {
+      getAction(this.url.queryTenantList).then(res => {
+        if (res.success) {
+          this.tenantsOptions = res.result.map((item, index, arr) => {
+            let c = { label: item.name, value: item.id + '' }
+            return c
+          })
+        }
+      })
+    },
+    //鍒濆鍖栬鑹插瓧鍏�
+    initRoleList() {
+      queryall().then((res) => {
+        if (res.success) {
+          this.rolesOptions = res.result.map((item, index, arr) => {
+            let c = { label: item.roleName, value: item.id }
+            return c
+          })
+        }
+      })
+    },
+    getUserRoles(userid) {
+      queryUserRole({ userid: userid }).then((res) => {
+        if (res.success) {
+          this.$set(this.model, 'selectedroles', res.result.join(','))
+        }
+      })
+    },
+    getUserDeparts(userid) {
+      let that = this
+      //閮ㄩ棬鐨剈rl 鑾峰彇閮ㄩ棬鍒嗛厤
+      getAction(that.url.userWithDepart, { userId: userid }).then((res) => {
+        if (res.success) {
+          let departOptions = []
+          let selectDepartKeys = []
+          for (let i = 0; i < res.result.length; i++) {
+            selectDepartKeys.push(res.result[i].key)
+            //鏂板璐熻矗閮ㄩ棬閫夋嫨涓嬫媺妗�
+            departOptions.push({
+              value: res.result[i].key,
+              label: res.result[i].title
+            })
+          }
+
+          this.$set(this.model, 'selecteddeparts', selectDepartKeys.join(','))
+          that.nextDepartOptions = departOptions
+        }
+      })
+
+      // 鑾峰彇杞﹂棿鍒嗛厤
+      getAction(that.url.userProductionList, { userId: userid }).then((res) => {
+        if (res.success) {
+          let ProductionOptions = []
+          let selectProductKeys = []
+          for (let i = 0; i < res.result.length; i++) {
+            selectProductKeys.push(res.result[i].key)
+            //鏂板璐熻矗閮ㄩ棬閫夋嫨涓嬫媺妗�
+            ProductionOptions.push({
+              value: res.result[i].key,
+              label: res.result[i].title
+            })
+          }
+
+          this.$set(this.model, 'selectedProduction', selectProductKeys.join(','))
+          that.nextProductionOptions = ProductionOptions
+        }
+      })
+      //杞﹂棿鐨剈rl
+    },
+    backDepartInfo(info) {
+      this.model.departIds = this.model.selecteddeparts
+      this.nextDepartOptions = info.map((item, index, arr) => {
+        let c = { label: item.text, value: item.value + '' }
+        return c
+      })
+    },
+    backProductionInfo(info) {
+      this.model.productionIds = this.model.selectedProduction
+      this.nextProductionOptions = info.map((item, index, arr) => {
+        let c = { label: item.text, value: item.value + '' }
+        return c
+      })
+    },
+
+    refresh() {
+      this.userId = ''
+      this.nextDepartOptions = []
+      this.nextProductionOptions = []
+      this.departIdShow = false
+    },
+    close() {
+      this.$emit('close')
+      this.visible = false
+      this.disableSubmit = false
+      this.nextDepartOptions = []
+      this.nextProductionOptions = []
+      this.departIdShow = false
+      this.$refs.form.resetFields()
+    },
+    moment,
+    handleSubmit() {
+      const that = this
+      // 瑙﹀彂琛ㄥ崟楠岃瘉
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          that.confirmLoading = true
+          //濡傛灉鏄笂绾ф嫨浼犲叆departIds,鍚﹀垯涓虹┖
+          if (this.model.userIdentity !== 2) {
+            this.model.departIds = ''
+          }
+          let obj
+          if (!this.model.id) {
+            this.model.id = this.userId
+            obj = addUser(this.model)
+          } else {
+            obj = editUser(this.model)
+          }
+          obj.then((res) => {
+            if (res.success) {
+              that.$message.success(res.message)
+              that.$emit('ok')
+            } else {
+              that.$message.warning(res.message)
+            }
+          }).finally(() => {
+            that.confirmLoading = false
+            that.close()
+          })
+        } else {
+          return false
+        }
+      })
+    },
+    handleCancel() {
+      this.close()
+    },
+    validateToNextPassword(rule, value, callback) {
+      const confirmpassword = this.model.confirmpassword
+      if (value && confirmpassword && value !== confirmpassword) {
+        callback('涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鏍凤紒')
+      }
+      if (value && this.confirmDirty) {
+        this.$refs.form.validateField(['confirmpassword'])
+      }
+      callback()
+    },
+    compareToFirstPassword(rule, value, callback) {
+      if (value && value !== this.model.password) {
+        callback('涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鏍凤紒')
+      } else {
+        callback()
+      }
+    },
+    validatePhone(rule, value, callback) {
+      if (!value) {
+        callback()
+      } else {
+        if (new RegExp(/^1[3|4|5|7|8|9][0-9]\d{8}$/).test(value)) {
+          var params = {
+            tableName: 'sys_user',
+            fieldName: 'phone',
+            fieldVal: value,
+            dataId: this.userId
+          }
+          duplicateCheck(params).then((res) => {
+            if (res.success) {
+              callback()
+            } else {
+              callback('鎵嬫満鍙峰凡瀛樺湪!')
+            }
+          })
+        } else {
+          callback('璇疯緭鍏ユ纭牸寮忕殑鎵嬫満鍙风爜!')
+        }
+      }
+    },
+    validateEmail(rule, value, callback) {
+      if (!value) {
+        callback()
+      } else {
+        if (new RegExp(/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/).test(value)) {
+          var params = {
+            tableName: 'sys_user',
+            fieldName: 'email',
+            fieldVal: value,
+            dataId: this.userId
+          }
+          duplicateCheck(params).then((res) => {
+            console.log(res)
+            if (res.success) {
+              callback()
+            } else {
+              callback('閭宸插瓨鍦�!')
+            }
+          })
+        } else {
+          callback('璇疯緭鍏ユ纭牸寮忕殑閭!')
+        }
+      }
+    },
+    validateUsername(rule, value, callback) {
+      var params = {
+        tableName: 'sys_user',
+        fieldName: 'username',
+        fieldVal: value,
+        dataId: this.userId
+      }
+      duplicateCheck(params).then((res) => {
+        if (res.success) {
+          callback()
+        } else {
+          callback('鐢ㄦ埛鍚嶅凡瀛樺湪!')
+        }
+      })
+    },
+    validateWorkNo(rule, value, callback) {
+      var params = {
+        tableName: 'sys_user',
+        fieldName: 'work_no',
+        fieldVal: value,
+        dataId: this.userId
+      }
+      duplicateCheck(params).then((res) => {
+        if (res.success) {
+          callback()
+        } else {
+          callback('宸ュ彿宸插瓨鍦�!')
+        }
+      })
+    },
+    handleConfirmBlur(e) {
+      const value = e.target.value
+      this.confirmDirty = this.confirmDirty || !!value
+    },
+    beforeUpload: function(file) {
+      var fileType = file.type
+      if (fileType.indexOf('image') < 0) {
+        this.$message.warning('璇蜂笂浼犲浘鐗�')
+        return false
+      }
+      //TODO 楠岃瘉鏂囦欢澶у皬
+    },
+    identityChange(e) {
+      if (e.target.value === 1) {
+        this.departIdShow = false
+      } else {
+        this.departIdShow = true
+      }
+    },
+    initDictData(dictCode) {
+      //鏍规嵁瀛楀吀Code, 鍒濆鍖栧瓧鍏告暟缁�
+      ajaxGetDictItems(dictCode, null).then((res) => {
+        if (res.success) {
+          const regExp = new RegExp('^(?=.*[a-zA-Z])(?=.*\\\d)(?=.*[~!@#$%^&*()_+`\\-={}:";\'<>?,./]).{' + Number(res.result[0].value) + ',}$')
+
+          this.validatorRules.password[0] = {
+            required: true,
+            pattern: regExp,
+            message: `瀵嗙爜鐢�${res.result[0].value}浣嶆暟瀛椼�佸ぇ灏忓啓瀛楁瘝鍜岀壒娈婄鍙风粍鎴�!`
+          }
+
+        }
+      })
+    },
+
+    deviceSearch() {
+      this.$refs.selectDeviceModal.visible = true
+      this.$refs.selectDeviceModal.selectedRowKeys = []
+      this.$refs.selectDeviceModal.selectedRows = []
+      this.$refs.selectDeviceModal.checkedKeys = this.model.equipmentIds ? this.model.equipmentIds.split(',') : []
+    },
+
+    /**
+     * 閫夋嫨宸叉湁璁惧鍚庣偣鍑荤‘瀹氭椂瑙﹀彂
+     * @param data 宸查�夋嫨鐨勮澶囨暟缁�
+     */
+    selectOK(data) {
+      console.log('data=', data)
+      this.$set(this.model, 'equipmentIds', data.join(','))
+    }
   }
+}
 </script>
 
 <style scoped>
-  .avatar-uploader > .ant-upload {
-    width: 104px;
-    height: 104px;
-  }
+.avatar-uploader > .ant-upload {
+  width: 104px;
+  height: 104px;
+}
 
-  .ant-upload-select-picture-card i {
-    font-size: 49px;
-    color: #999;
-  }
+.ant-upload-select-picture-card i {
+  font-size: 49px;
+  color: #999;
+}
 
-  .ant-upload-select-picture-card .ant-upload-text {
-    margin-top: 8px;
-    color: #666;
-  }
+.ant-upload-select-picture-card .ant-upload-text {
+  margin-top: 8px;
+  color: #666;
+}
 
-  .ant-table-tbody .ant-table-row td {
-    padding-top: 10px;
-    padding-bottom: 10px;
-  }
+.ant-table-tbody .ant-table-row td {
+  padding-top: 10px;
+  padding-bottom: 10px;
+}
 
-  .drawer-bottom-button {
-    position: absolute;
-    bottom: -8px;
-    width: 100%;
-    border-top: 1px solid #e8e8e8;
-    padding: 10px 16px;
-    text-align: right;
-    left: 0;
-    background: #fff;
-    border-radius: 0 0 2px 2px;
-  }
+.drawer-bottom-button {
+  position: absolute;
+  bottom: -8px;
+  width: 100%;
+  border-top: 1px solid #e8e8e8;
+  padding: 10px 16px;
+  text-align: right;
+  left: 0;
+  background: #fff;
+  border-radius: 0 0 2px 2px;
+}
 </style>
\ No newline at end of file

--
Gitblit v1.9.3