From 4d6b9f8a2d7b316633e43b489eae9ada949c07b5 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期二, 10 九月 2024 10:18:08 +0800
Subject: [PATCH] Merge branch 'master' into positec

---
 src/views/rolemanage/index.jsx |  381 ++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 270 insertions(+), 111 deletions(-)

diff --git a/src/views/rolemanage/index.jsx b/src/views/rolemanage/index.jsx
index 26dd053..2fdc6e4 100644
--- a/src/views/rolemanage/index.jsx
+++ b/src/views/rolemanage/index.jsx
@@ -1,10 +1,9 @@
 import React, {Component} from 'react'
 import { fromJS } from 'immutable'
-import { Spin, notification, Button, Table, Modal, ConfigProvider, Tree, Input, Empty } from 'antd'
+import { Spin, notification, Button, Table, Modal, Tree, Input, Empty } from 'antd'
 import moment from 'moment'
 import md5 from 'md5'
-import enUS from 'antd/es/locale/en_US'
-import zhCN from 'antd/es/locale/zh_CN'
+import { ApiOutlined, SoundOutlined } from '@ant-design/icons'
 
 import Api from '@/api'
 import Utils from '@/utils/utils.js'
@@ -15,26 +14,52 @@
 const { TreeNode } = Tree
 const { Search } = Input
 
-const _locale = sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS
 const Header = asyncComponent(() => import('./header'))
 const TransferForm = asyncComponent(() => import('@/templates/zshare/basetransferform'))
-
-sessionStorage.setItem('isEditState', 'true')
 
 class RoleManage extends Component {
   state = {
     app: null,
     loading: false,
     menulist: [],
+    sortType: '',
     columns: [
-      { title: '鑿滃崟鍚嶇О', dataIndex: 'MenuName', key: 'MenuName', align: 'center' },
+      {
+        title: '鑿滃崟鍚嶇О', dataIndex: 'MenuName', key: 'MenuName', align: 'center', render: (text, record) => {
+          if (record.extra || this.state.appKeys.includes(record.MenuID)) {
+            return <span style={{color: '#1890ff'}}>{text}</span>
+          } else if (record.interfaces === 'true' || record.msg === 'true') {
+            return <span>{record.interfaces === 'true' ? <ApiOutlined style={{color: 'orange', marginRight: '5px'}} title="鑿滃崟涓娇鐢ㄤ簡澶栭儴鎺ュ彛" /> : null}{record.msg === 'true' ? <SoundOutlined style={{color: 'orange', marginRight: '5px'}} title="鑿滃崟涓彂閫佷簡娑堟伅" /> : null}{text}</span>
+          }
+          return text
+        }
+      },
+      {
+        title: '鑿滃崟鍙傛暟', dataIndex: 'MenuNo', key: 'MenuNo', align: 'center'
+      },
+      {
+        title: '淇敼鏃堕棿', dataIndex: 'modifydate', key: 'modifydate', align: 'center', sorter: true, render: (text, record) => {
+          if (window.GLOB.upStatus && record.up_action === 'Y') {
+            return <span style={{color: 'orange'}}>{text}</span>
+          }
+          return text
+        }
+      },
       {
         title: '鎿嶄綔',
         key: 'action',
         align: 'center',
         render: (text, record) => (
-          <div>
-            <Button type="link" onClick={() => this.deleteMenu(record)} style={{color: '#ff4d4f'}}>鍒犻櫎</Button>
+          <div style={{minWidth: '125px'}}>
+            {record.type !== 'none' ?
+              <Button type="link" onClick={() => this.deleteMenu(record)} style={{color: '#ff4d4f'}}>鍒犻櫎</Button> :
+              <Button type="link" onClick={() => {
+                notification.warning({
+                  top: 92,
+                  message: '褰撳墠绯荤粺鑿滃崟灏氭湭鍒涘缓銆�',
+                  duration: 5
+                })
+              }} style={{color: '#ff4d4f', opacity: '0.5'}}>鍒犻櫎</Button>}
             <Button type="link" onClick={() => this.jumpApp(record)} style={{color: '#1890ff', marginLeft: '5px'}}>缂栬緫</Button>
           </div>
         ),
@@ -48,17 +73,25 @@
     targetKeys: [],
     trees: null,
     expandedKeys: [],
-    searchkey: ''
+    searchkey: '',
+    appViewList: [],
+    appKeys: []
   }
 
   oriTrees = null
 
   UNSAFE_componentWillMount() {
+    document.body.className = ''
     let param = JSON.parse(window.decodeURIComponent(window.atob(this.props.match.params.param)))
+
+    if (param.lang) {
+      sessionStorage.setItem('lang', param.lang)
+    }
 
     this.setState({app: param}, () => {
       this.getTreeList()
       this.getMenuList()
+      this.getAppViewList()
     })
   }
 
@@ -71,7 +104,28 @@
     }
   }
 
-  getMenuList = (reset) => {
+  getAppViewList = () => {
+    const { app } = this.state
+
+    Api.getCloudConfig({
+      func: 's_get_keyids',
+      bid: app.ID
+    }).then(result => {
+      if (!result.status) {
+        notification.warning({
+          top: 92,
+          message: result.message,
+          duration: 5
+        })
+        return
+      }
+
+      let data = result.data || []
+      this.setState({appViewList: data, appKeys: data.map(item => item.keys_id)})
+    })
+  }
+
+  getMenuList = (reset, resolve) => {
     const { app } = this.state
     let param = {
       func: 's_get_app_menus',
@@ -84,32 +138,70 @@
 
     param.secretkey = Utils.encrypt(param.LText, param.timestamp)
 
-    this.setState({
-      loading: true
-    })
+    if (!resolve) {
+      this.setState({
+        loading: true
+      })
+    }
 
     Api.getCloudConfig(param).then(result => {
       if (result.status) {
-        this.setState({
-          menulist: result.menus.map(item => {
-            item.nodes = ''
-            item.type = 'view'
-            if (item.menus_rolelist) {
-              try {
-                let pageParam = JSON.parse(window.decodeURIComponent(window.atob(item.menus_rolelist)))
-                item.nodes = pageParam
-                if (pageParam.type === 'navbar') {
-                  item.type = 'navbar'
-                }
-              } catch (e) {
+        let ub = app.user_binding === 'true' && app.userbind ? false : true
+        let im = app.instantMessage ? false : true
+
+        let menus = result.menus.map(item => {
+          item.nodes = ''
+          item.type = 'view'
+          if (item.menus_rolelist) {
+            try {
+              let pageParam = JSON.parse(window.decodeURIComponent(window.atob(item.menus_rolelist)))
+              item.nodes = pageParam
+              item.interfaces = pageParam.interfaces || 'false'
+              item.msg = pageParam.msg || 'false'
+              
+              if (pageParam.type) {
+                item.type = pageParam.type
+              }
+
+              if (pageParam.version !== '1.0') {
+                item.nodes = ''
+              } else if (pageParam.login || pageParam.pass) {
+                item.nodes = ''
+              } else if (pageParam.type === 'im') {
                 item.nodes = ''
               }
+            } catch (e) {
+              item.nodes = ''
             }
-            
-            return item
-          })
+
+            delete item.menus_rolelist
+          }
+
+          if (app.userbind === item.MenuID) {
+            item.extra = true
+            ub = true
+          }
+          if (app.instantMessage === item.MenuID) {
+            item.extra = true
+            im = true
+          }
+          
+          return item
+        })
+
+        if (!im) {
+          menus.push({nodes: '', type: 'none', extra: true, MenuID: app.instantMessage, MenuName: '鍗虫椂閫氫俊'})
+        }
+        if (!ub) {
+          menus.push({nodes: '', type: 'none', extra: true, MenuID: app.userbind, MenuName: '鐢ㄦ埛缁戝畾'})
+        }
+
+        this.setState({
+          menulist: menus
         }, () => {
-          if (reset && (!this.oriTrees || this.oriTrees.length === 0)) {
+          if (resolve) {
+            this.initMenutree(resolve)
+          } else if (reset && (!this.oriTrees || this.oriTrees.length === 0)) {
             this.initMenutree()
           } else if (!reset && this.oriTrees && this.oriTrees.length === 0) {
             this.initMenutree()
@@ -294,7 +386,8 @@
       ParentID: 'mk_app',
       TypeCharOne: app.kei_no,
       typename: app.typename,
-      lang: app.lang
+      lang: app.lang,
+      TYPE: 30
     }).then(res => {
       if (res.status) {
         this.setState({
@@ -316,8 +409,8 @@
   }
 
   deleteMenu = (record) => {
-    const { app } = this.state
-    const _this = this
+    const { app, appViewList } = this.state
+    const that = this
 
     let param = {
       func: 'sPC_MainMenu_Del',
@@ -327,8 +420,24 @@
       lang: app.lang
     }
 
-    if (app.typename === 'pc' && record.nodes && record.nodes.popviews && record.nodes.popviews.length > 0) {
-      param.MenuID = param.MenuID + ',' + record.nodes.popviews.join(',')
+    let _param = {
+      func: 's_kei_link_keyids_addupt',
+      BID: app.ID,
+      exec_type: 'x',
+      LText: ''
+    }
+
+    let _appViewList = appViewList.filter(item => item.keys_id !== record.MenuID)
+
+    if (appViewList.length !== _appViewList.length) {
+      _param.LText = _appViewList.map(item => `select '${item.keys_id}','${item.keys_type}','${item.kei_no}','${item.appkey}','${item.bid}','${sessionStorage.getItem('CloudUserID')}','${item.remark}'`)
+      _param.LText = _param.LText.join(' union all ')
+      _param.LText = Utils.formatOptions(_param.LText, 'x')
+  
+      _param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+      _param.secretkey = Utils.encrypt('', _param.timestamp)
+    } else {
+      _param = null
     }
 
     confirm({
@@ -342,7 +451,21 @@
                 message: '鎿嶄綔鎴愬姛锛�',
                 duration: 3
               })
-              _this.getMenuList(true)
+              that.getMenuList(true)
+
+              if (_param) {
+                Api.getCloudConfig(_param).then(res => {
+                  if (!res.status) {
+                    notification.warning({
+                      top: 92,
+                      message: res.message,
+                      duration: 5
+                    })
+                  } else {
+                    that.setState({appViewList: _appViewList})
+                  }
+                })
+              }
             } else {
               notification.warning({
                 top: 92,
@@ -376,7 +499,7 @@
       confirmLoading: true
     })
 
-    Api.getSystemConfig({
+    Api.getCloudConfig({
       func: 'sPC_MainMenu_ReDel',
       MenuID: targetKeys.join(','),
       TypeCharOne: app.kei_no,
@@ -415,16 +538,23 @@
                   try {
                     let pageParam = JSON.parse(window.decodeURIComponent(window.atob(item.menus_rolelist)))
                     item.nodes = pageParam
-                    if (pageParam.type === 'navbar') {
-                      item.type = 'navbar'
+
+                    if (pageParam.type) {
+                      item.type = pageParam.type
+                    }
+
+                    if (pageParam.version !== '1.0') {
+                      item.nodes = ''
+                    } else if (pageParam.login || pageParam.pass) {
+                      item.nodes = ''
+                    } else if (pageParam.type === 'im') {
+                      item.nodes = ''
                     }
                   } catch (e) {
                     item.nodes = ''
                   }
-                }
 
-                if (targetKeys.includes(item.MenuID) && item.nodes && item.nodes.popviews && item.nodes.popviews.length > 0) {
-                  list = [...list, ...item.nodes.popviews]
+                  delete item.menus_rolelist
                 }
                 
                 return item
@@ -436,7 +566,7 @@
             })
 
             if (app.typename === 'pc' && list.length > 0) {
-              Api.getSystemConfig({
+              Api.getCloudConfig({
                 func: 'sPC_MainMenu_ReDel',
                 MenuID: list.join(','),
                 TypeCharOne: app.kei_no,
@@ -553,12 +683,12 @@
   }
 
   initTree = () => {
-    const _this = this
+    const that = this
     confirm({
-      content: '鍒濆鍖栦細鏍规嵁鑿滃崟閲嶇疆鏉冮檺鏍戯紝纭畾鎵ц鍚楋紵',
+      content: '鏉冮檺鏍戜細閲嶆柊鐢熸垚锛岀‘瀹氭墽琛屽悧锛�',
       onOk() {
         return new Promise(resolve => {
-          _this.initMenutree(resolve)
+          that.getMenuList(true, resolve)
         })
       },
       onCancel() {}
@@ -566,13 +696,13 @@
   }
 
   syncTree = () => {
-    const _this = this
+    const that = this
 
     confirm({
       content: '鍚屾浼氭牴鎹彍鍗曞垹闄ゆ垨鏂板鑺傜偣锛岀‘瀹氭墽琛屽悧锛�',
       onOk() {
         return new Promise(resolve => {
-          _this.syncMenutree(resolve)
+          that.syncMenutree(resolve)
         })
       },
       onCancel() {}
@@ -580,23 +710,23 @@
   }
 
   saveTree = () => {
-    const { trees } = this.state
-    const _this = this
+    // const { trees } = this.state
+    const that = this
 
-    if (!trees || trees.length === 0) {
-      notification.warning({
-        top: 92,
-        message: '鏈幏鍙栧埌鏉冮檺淇℃伅锛�',
-        duration: 5
-      })
-      return
-    }
+    // if (!trees || trees.length === 0) {
+    //   notification.warning({
+    //     top: 92,
+    //     message: '鏈幏鍙栧埌鏉冮檺淇℃伅锛�',
+    //     duration: 5
+    //   })
+    //   return
+    // }
 
     confirm({
       content: '纭畾鎵ц鍚楋紵',
       onOk() {
         return new Promise(resolve => {
-          _this.execSave(resolve)
+          that.execSave(resolve)
         })
       },
       onCancel() {}
@@ -749,74 +879,103 @@
     if (app.typename === 'pc') {
       route = 'pcdesign'
     }
+    if (item.type === 'navbar') {
+      notification.warning({
+        top: 92,
+        message: '瀵艰埅鏍忎笉鍙崟鐙紪杈戯紝璇峰湪鍚湁瀵艰埅鏍忕殑椤甸潰涓慨鏀广��',
+        duration: 5
+      })
+      return
+    }
+
+    if (app.instantMessage && item.MenuID === app.instantMessage) {
+      route = 'imdesign'
+    }
 
     window.open(window.location.href.replace(/#.+/ig, `#/${route}/${window.btoa(window.encodeURIComponent(JSON.stringify({...app, MenuID: item.MenuID, type: 'app'})))}`))
   }
 
+  changeTable = (pagination, filters, sorter) => {
+    this.setState({sortType: sorter.order || ''})
+  }
+
   render () {
-    const { app, loading, columns, menulist, trees, searchkey } = this.state
-    let _menulist = menulist
+    const { app, loading, columns, menulist, trees, searchkey, sortType } = this.state
+    let _menulist = fromJS(menulist).toJS()
 
     if (searchkey) {
       _menulist = _menulist.filter(item => item.MenuName.toLowerCase().indexOf(searchkey.toLowerCase()) > -1)
     }
 
+    if (sortType === 'ascend') {
+      _menulist.sort((a, b) => {
+        if (a.modifydate > b.modifydate) return 1
+        if (a.modifydate < b.modifydate) return -1
+        return 0
+      })
+    } else if (sortType === 'descend') {
+      _menulist.sort((a, b) => {
+        if (a.modifydate < b.modifydate) return 1
+        if (a.modifydate > b.modifydate) return -1
+        return 0
+      })
+    }
+
     return (
       <div className="mk-role-manage">
-        <ConfigProvider locale={_locale}>
-          <Header app={app} />
-          {loading ?
-            <div className="loading-mask">
-              <Spin size="large" />
-            </div> : null
-          }
-          <div className="view-wrap">
-            <div className="left-view">
-              <div className="app-table">
-                <div className="app-action">
-                  <Button className="mk-green" onClick={this.triggerThaw}>瑙e喕鑿滃崟</Button>
-                  <Search placeholder="缁煎悎鎼滅储" onSearch={value => this.setState({ searchkey: value })} enterButton />
-                </div>
-                <Table
-                  rowKey="MenuID"
-                  columns={columns}
-                  dataSource={_menulist}
-                  pagination={false}
-                />
-              </div>
-            </div>
-            <div className="right-view">
+        <Header app={app} />
+        {loading ?
+          <div className="loading-mask">
+            <Spin size="large" />
+          </div> : null
+        }
+        <div className="view-wrap">
+          <div className="left-view">
+            <div className="app-table">
               <div className="app-action">
-                <Button className="mk-primary" onClick={this.initTree}>鍒濆鍖�</Button>
-                <Button className="mk-purple" onClick={this.syncTree}>鍚屾</Button>
-                <Button className="mk-green save" onClick={this.saveTree}>淇濆瓨</Button>
+                <Button className="mk-green" onClick={this.triggerThaw}>瑙e喕鑿滃崟</Button>
+                <Search placeholder="缁煎悎鎼滅储" onSearch={value => this.setState({ searchkey: value })} enterButton />
               </div>
-              {trees && trees.length ? <Tree
-                className="draggable-tree"
-                defaultExpandedKeys={this.state.expandedKeys}
-                // showLine
-                draggable
-                blockNode
-                onDrop={this.onDrop}
-              >
-                {this.renderNode(trees)}
-              </Tree> : <div className="empty">
-                <Empty />
-              </div>}
+              <Table
+                rowKey="MenuID"
+                columns={columns}
+                dataSource={_menulist}
+                pagination={false}
+                onChange={this.changeTable}
+              />
             </div>
           </div>
-          <Modal
-            title="瑙i櫎鍐荤粨"
-            visible={this.state.visible}
-            width={600}
-            onOk={this.thawSubmit}
-            confirmLoading={this.state.confirmLoading}
-            onCancel={() => this.setState({visible: false, targetKeys: []})}
-            destroyOnClose
-          >
-            <TransferForm onChange={(vals) => this.setState({targetKeys: vals})} menulist={this.state.thawmenulist}/>
-          </Modal>
-        </ConfigProvider>
+          <div className="right-view">
+            <div className="app-action">
+              <Button className="mk-primary" onClick={this.initTree}>閲嶇疆</Button>
+              {/* <Button className="mk-purple" onClick={this.syncTree}>鍚屾</Button> */}
+              <Button className="mk-green save" onClick={this.saveTree}>淇濆瓨</Button>
+            </div>
+            {trees && trees.length ? <Tree
+              className="draggable-tree"
+              defaultExpandedKeys={this.state.expandedKeys}
+              // showLine
+              draggable
+              blockNode
+              onDrop={this.onDrop}
+            >
+              {this.renderNode(trees)}
+            </Tree> : <div className="empty">
+              <Empty />
+            </div>}
+          </div>
+        </div>
+        <Modal
+          title="瑙i櫎鍐荤粨"
+          visible={this.state.visible}
+          width={600}
+          onOk={this.thawSubmit}
+          confirmLoading={this.state.confirmLoading}
+          onCancel={() => this.setState({visible: false, targetKeys: []})}
+          destroyOnClose
+        >
+          <TransferForm onChange={(vals) => this.setState({targetKeys: vals})} menulist={this.state.thawmenulist}/>
+        </Modal>
       </div>
     )
   }

--
Gitblit v1.8.0