From 79e1455e4ba4f4a7d04a483dda1a354e53921a69 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期三, 04 十一月 2020 19:04:14 +0800
Subject: [PATCH] 2020-11-04

---
 src/tabviews/custom/components/chart/antv-bar-line/index.jsx      |    2 
 src/tabviews/custom/components/chart/antv-bar-line/index.scss     |    5 
 src/tabviews/custom/components/tabs/antv-tabs/index.jsx           |    1 
 src/menu/components/card/prop-card/index.scss                     |    4 
 src/menu/components/card/cardcellcomponent/dragaction/index.jsx   |   34 ++
 src/tabviews/custom/components/chart/antv-pie/index.scss          |    5 
 src/menu/datasource/index.jsx                                     |   17 +
 src/menu/components/card/cardcellcomponent/dragaction/card.jsx    |    3 
 src/menu/components/chart/antv-bar/index.scss                     |    5 
 src/menu/components/chart/antv-bar/index.jsx                      |   46 +-
 src/menu/components/tabs/tabcomponents/index.jsx                  |    9 
 src/menu/stylecontroller/index.scss                               |    8 
 src/menu/components/card/data-card/index.scss                     |    4 
 src/components/sidemenu/config.jsx                                |   12 
 src/tabviews/custom/components/card/data-card/index.scss          |    2 
 src/views/menudesign/index.jsx                                    |    5 
 src/menu/stylecontroller/styleInput/index.scss                    |   47 --
 src/tabviews/custom/components/card/data-card/index.jsx           |   21 +
 src/tabviews/custom/components/card/prop-card/index.scss          |    2 
 src/tabviews/custom/components/card/cardcellList/index.jsx        |   44 +++
 src/tabviews/custom/components/card/prop-card/index.jsx           |   20 +
 src/mob/colorsketch/index.jsx                                     |    4 
 src/tabviews/custom/components/share/tabtransfer/index.jsx        |  187 ++++++++++++
 src/menu/stylecontroller/index.jsx                                |   32 +
 src/menu/components/chart/antv-pie/index.scss                     |    5 
 src/menu/stylecontroller/styleInput/index.jsx                     |  103 ++++--
 src/tabviews/custom/components/chart/antv-pie/index.jsx           |    2 
 src/menu/components/card/cardcomponent/index.jsx                  |    2 
 src/menu/components/card/data-card/index.jsx                      |   15 
 src/menu/components/chart/antv-pie/index.jsx                      |   46 +-
 src/tabviews/custom/index.jsx                                     |   48 +--
 src/menu/modalconfig/index.jsx                                    |    7 
 src/templates/sharecomponent/actioncomponent/dragaction/index.jsx |    1 
 src/mob/colorsketch/index.scss                                    |   10 
 src/menu/components/card/prop-card/index.jsx                      |   14 
 src/menu/menushell/index.jsx                                      |    9 
 36 files changed, 552 insertions(+), 229 deletions(-)

diff --git a/src/components/sidemenu/config.jsx b/src/components/sidemenu/config.jsx
index 5595166..324df40 100644
--- a/src/components/sidemenu/config.jsx
+++ b/src/components/sidemenu/config.jsx
@@ -51,8 +51,8 @@
       type: 'ManageTable',
       MenuID: '1578900109100np8aqd0a77q3na46oas',
       MenuNo: 'sPrintTemplateM',
-      MenuName: '鎵撳嵃妯℃澘',
-      text: '鎵撳嵃妯℃澘'
+      MenuName: '鏍囩鎵撳嵃妯℃澘',
+      text: '鏍囩鎵撳嵃妯℃澘'
     }, {
       src: '',
       systems: ['SSO', 'cloud'],
@@ -87,6 +87,14 @@
       MenuNo: 'LdropdownmenuNewM',
       MenuName: '閫氱敤涓嬫媺鑿滃崟',
       text: '閫氱敤涓嬫媺鑿滃崟'
+    }, {
+      src: '',
+      PageParam: {OpenType: 'newtab', Template: 'ManageTable'},
+      type: 'ManageTable',
+      MenuID: '1602315375262ikd33ii0nii34pt861o',
+      MenuNo: 's_worksflow_roleM',
+      MenuName: '鍏抽敭瑙掕壊绠$悊',
+      text: '鍏抽敭瑙掕壊绠$悊'
     }]
   }, {
     MenuID: 'systemManageViewInterface',
diff --git a/src/menu/components/card/cardcellcomponent/dragaction/card.jsx b/src/menu/components/card/cardcellcomponent/dragaction/card.jsx
index 78676b6..c2c52ee 100644
--- a/src/menu/components/card/cardcellcomponent/dragaction/card.jsx
+++ b/src/menu/components/card/cardcellcomponent/dragaction/card.jsx
@@ -9,7 +9,7 @@
 import demo4 from '@/assets/img/demo4.jpg'
 import demo5 from '@/assets/img/demo5.jpg'
 
-const Card = ({ id, cardIds, card, moveCard, findCard, editCard, delCard, changeStyle }) => {
+const Card = ({ id, cardIds, card, moveCard, findCard, editCard, delCard, copyCard, changeStyle }) => {
   const originalIndex = findCard(id).index
   const [{ isDragging }, drag] = useDrag({
     item: { type: 'action', id, originalIndex },
@@ -102,6 +102,7 @@
     <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
       <div className="mk-popover-control">
         <Icon className="edit" title="缂栬緫" type="edit" onClick={() => editCard(id)} />
+        <Icon className="copy" title="澶嶅埗" type="copy" onClick={() => copyCard(id)} />
         <Icon className="close" title="鍒犻櫎" type="close" onClick={() => delCard(id)} />
         <Icon className="style" title="璋冩暣鏍峰紡" onClick={() => changeStyle(id)} type="font-colors" />
       </div>
diff --git a/src/menu/components/card/cardcellcomponent/dragaction/index.jsx b/src/menu/components/card/cardcellcomponent/dragaction/index.jsx
index 845cedf..49267a8 100644
--- a/src/menu/components/card/cardcellcomponent/dragaction/index.jsx
+++ b/src/menu/components/card/cardcellcomponent/dragaction/index.jsx
@@ -4,6 +4,7 @@
 import update from 'immutability-helper'
 
 import Card from './card'
+import Utils from '@/utils/utils.js'
 import Action from './action'
 import './index.scss'
 
@@ -30,6 +31,38 @@
   const editCard = id => {
     const { card } = findCard(id)
     handleMenu(card)
+  }
+
+  const copyCard = id => {
+    const { card, index: overIndex } = findCard(id)
+    let copycard = fromJS(card).toJS()
+
+    copycard.uuid = Utils.getuuid()
+    copycard.copyType = 'customCardElement'
+    copycard.focus = true
+
+    let _val = ''
+
+    try {
+      _val = window.btoa(window.encodeURIComponent(JSON.stringify(copycard)))
+    } catch {
+      console.warn('Stringify Failure')
+      _val = ''
+    }
+
+    if (_val) {
+      let oInput = document.createElement('input')
+      oInput.value = _val
+      document.body.appendChild(oInput)
+      oInput.select()
+      document.execCommand('Copy')
+      document.body.removeChild(oInput)
+    }
+
+    const _cards = update(cards, { $splice: [[overIndex + 1, 0, copycard]] })
+
+    handleList(_cards)
+    handleMenu(copycard)
   }
 
   const changeStyle = id => {
@@ -88,6 +121,7 @@
               cardIds={cardIds}
               card={card}
               moveCard={moveCard}
+              copyCard={copyCard}
               editCard={editCard}
               changeStyle={changeStyle}
               delCard={delCard}
diff --git a/src/menu/components/card/cardcomponent/index.jsx b/src/menu/components/card/cardcomponent/index.jsx
index 94835b5..1753712 100644
--- a/src/menu/components/card/cardcomponent/index.jsx
+++ b/src/menu/components/card/cardcomponent/index.jsx
@@ -49,7 +49,7 @@
   }
 
   shouldComponentUpdate (nextProps, nextState) {
-    return !is(fromJS(this.state), fromJS(nextState))
+    return !is(fromJS(this.props.cards), fromJS(nextProps.cards)) || !is(fromJS(this.state), fromJS(nextState))
   }
 
   /**
diff --git a/src/menu/components/card/data-card/index.jsx b/src/menu/components/card/data-card/index.jsx
index 029154a..1b161aa 100644
--- a/src/menu/components/card/data-card/index.jsx
+++ b/src/menu/components/card/data-card/index.jsx
@@ -33,20 +33,9 @@
   }
 
   UNSAFE_componentWillMount () {
-    const { card, menu } = this.props
+    const { card } = this.props
 
     if (card.isNew) {
-      let dataName = ''
-
-      if (card.floor === 1) {
-        while (!dataName) {
-          let _dataName = Utils.getdataName()
-          if (menu.components.filter(com => com.dataName === _dataName).length === 0) {
-            dataName = _dataName
-          }
-        }
-      }
-
       let subcards = null
 
       if (card.config) {
@@ -87,7 +76,7 @@
         format: 'array',   // 缁勪欢灞炴�� - 鏁版嵁鏍煎紡
         pageable: true,    // 缁勪欢灞炴�� - 鏄惁鍙垎椤�
         switchable: true,  // 缁勪欢灞炴�� - 鏁版嵁鏄惁鍙垏鎹�
-        dataName: dataName,
+        dataName: card.dataName || '',
         width: 24,
         name: card.name,
         subtype: card.subtype,
diff --git a/src/menu/components/card/data-card/index.scss b/src/menu/components/card/data-card/index.scss
index 8b61bd1..d6ce6a3 100644
--- a/src/menu/components/card/data-card/index.scss
+++ b/src/menu/components/card/data-card/index.scss
@@ -5,7 +5,7 @@
   background-position: center center;
   background-repeat: no-repeat;
   background-size: cover;
-  min-height: 50px;
+  min-height: 20px;
   
   .card-control {
     position: absolute;
@@ -34,7 +34,7 @@
     background-position: center center;
     background-repeat: no-repeat;
     background-size: cover;
-    min-height: 50px;
+    min-height: 20px;
   }
   
   .card-item:hover {
diff --git a/src/menu/components/card/prop-card/index.jsx b/src/menu/components/card/prop-card/index.jsx
index c7715d5..9fe9948 100644
--- a/src/menu/components/card/prop-card/index.jsx
+++ b/src/menu/components/card/prop-card/index.jsx
@@ -33,19 +33,9 @@
   }
 
   UNSAFE_componentWillMount () {
-    const { card, menu } = this.props
+    const { card } = this.props
 
     if (card.isNew) {
-      let dataName = ''
-      if (card.floor === 1) {
-        while (!dataName) {
-          let _dataName = Utils.getdataName()
-          if (menu.components.filter(com => com.dataName === _dataName).length === 0) {
-            dataName = _dataName
-          }
-        }
-      }
-
       let subcards = null
 
       if (card.config) {
@@ -86,7 +76,7 @@
         format: 'object',   // 缁勪欢灞炴�� - 鏁版嵁鏍煎紡
         pageable: false,    // 缁勪欢灞炴�� - 鏄惁鍙垎椤�
         switchable: true,  // 缁勪欢灞炴�� - 鏁版嵁鏄惁鍙垏鎹�
-        dataName: dataName,
+        dataName: card.dataName || '',
         width: 24,
         name: card.name,
         subtype: card.subtype,
diff --git a/src/menu/components/card/prop-card/index.scss b/src/menu/components/card/prop-card/index.scss
index 81fec21..7c8800b 100644
--- a/src/menu/components/card/prop-card/index.scss
+++ b/src/menu/components/card/prop-card/index.scss
@@ -5,7 +5,7 @@
   background-position: center center;
   background-repeat: no-repeat;
   background-size: cover;
-  min-height: 50px;
+  min-height: 20px;
   
   .card-control {
     position: absolute;
@@ -34,7 +34,7 @@
     background-position: center center;
     background-repeat: no-repeat;
     background-size: cover;
-    min-height: 50px;
+    min-height: 20px;
   }
   
   .card-item:hover {
diff --git a/src/menu/components/chart/antv-bar/index.jsx b/src/menu/components/chart/antv-bar/index.jsx
index 27b33a9..41cfc59 100644
--- a/src/menu/components/chart/antv-bar/index.jsx
+++ b/src/menu/components/chart/antv-bar/index.jsx
@@ -34,7 +34,7 @@
   }
 
   UNSAFE_componentWillMount () {
-    const { card, menu } = this.props
+    const { card } = this.props
 
     if (card.isNew) {
       let _plot = {
@@ -59,17 +59,6 @@
         _plot.shape = 'hv'
       }
 
-      let dataName = ''
-
-      if (card.floor === 1) {
-        while (!dataName) {
-          let _dataName = Utils.getdataName()
-          if (menu.components.filter(com => com.dataName === _dataName).length === 0) {
-            dataName = _dataName
-          }
-        }
-      }
-
       let _card = {
         uuid: card.uuid,
         type: card.type,
@@ -79,16 +68,16 @@
         format: 'array',   // 缁勪欢灞炴�� - 鏁版嵁鏍煎紡
         pageable: false,   // 缁勪欢灞炴�� - 鏄惁鍙垎椤�
         switchable: false, // 缁勪欢灞炴�� - 鏁版嵁鏄惁鍙垏鎹�
-        dataName: dataName,
+        dataName: card.dataName || '',
         width: _plot.width,
         name: _plot.name,
         subtype: card.subtype,
         setting: { interType: 'system' },
         style: {
-          fontSize: '16px',
           borderWidth: '1px', borderColor: 'rgb(217, 217, 217)',
           marginLeft: '8px', marginRight: '8px', marginTop: '8px', marginBottom: '8px'
         },
+        headerStyle: { fontSize: '16px', borderBottomWidth: '1px', borderBottomColor: 'rgb(217, 217, 217)' },
         columns: [],
         scripts: [],
         search: [],
@@ -708,18 +697,31 @@
     MKEmitter.emit('addButton', card.uuid, newcard)
   }
 
+  changeTitleStyle = () => {
+    const { card } = this.state
+
+    MKEmitter.emit('changeStyle', [card.uuid, 'header'], ['font', 'border'], card.headerStyle)
+  }
+
   changeStyle = () => {
     const { card } = this.state
 
-    MKEmitter.emit('changeStyle', [card.uuid], ['font', 'background', 'border', 'padding', 'margin'], card.style)
+    MKEmitter.emit('changeStyle', [card.uuid], ['background', 'border', 'padding', 'margin'], card.style)
   }
 
   getStyle = (comIds, style) => {
     const { card } = this.state
 
-    if (comIds.length !== 1 || comIds[0] !== card.uuid) return
+    if (comIds[0] !== card.uuid) return
 
-    let _card = {...card, style}
+    let _card = {}
+    if (comIds.length === 1) {
+      _card = {...card, style}
+    } else if (comIds.length === 2 && comIds[1] === 'header') {
+      _card = {...card, headerStyle: style}
+    } else {
+      return
+    }
 
     this.setState({
       card: _card
@@ -733,8 +735,14 @@
 
     return (
       <div className="menu-line-chart-edit-box" style={{...card.style, height: card.plot.height || 400}}>
-        <div className="chart-header">
-          <span className="chart-title">{card.plot.title || ''}</span>
+        <div className="chart-header" style={card.headerStyle}>
+          <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
+            <div className="mk-popover-control">
+              <Icon className="style" title="璋冩暣鏍峰紡" onClick={this.changeTitleStyle} type="font-colors" />
+            </div>
+          } trigger="hover">
+            <span className="chart-title">{card.plot.title || ''}</span>
+          </Popover>
           <SearchComponent
             config={card}
             updatesearch={this.updateComponent}
diff --git a/src/menu/components/chart/antv-bar/index.scss b/src/menu/components/chart/antv-bar/index.scss
index 08877af..c37fad1 100644
--- a/src/menu/components/chart/antv-bar/index.scss
+++ b/src/menu/components/chart/antv-bar/index.scss
@@ -19,9 +19,6 @@
     border-bottom: 1px solid #e8e8e8;
     overflow: hidden;
     padding-right: 35px;
-    text-decoration: inherit;
-    font-weight: inherit;
-    font-style: inherit;
 
     >.anticon-tool {
       position: absolute;
@@ -41,6 +38,8 @@
       float: left;
       line-height: 45px;
       margin-left: 10px;
+      position: relative;
+      z-index: 1;
     }
   }
 
diff --git a/src/menu/components/chart/antv-pie/index.jsx b/src/menu/components/chart/antv-pie/index.jsx
index f8dff44..5829643 100644
--- a/src/menu/components/chart/antv-pie/index.jsx
+++ b/src/menu/components/chart/antv-pie/index.jsx
@@ -33,7 +33,7 @@
   }
 
   UNSAFE_componentWillMount () {
-    const { card, menu } = this.props
+    const { card } = this.props
 
     if (card.isNew) {
       let _plot = {
@@ -48,17 +48,6 @@
         _plot.innerRadius = 50
       }
 
-      let dataName = ''
-
-      if (card.floor === 1) {
-        while (!dataName) {
-          let _dataName = Utils.getdataName()
-          if (menu.components.filter(com => com.dataName === _dataName).length === 0) {
-            dataName = _dataName
-          }
-        }
-      }
-
       let _card = {
         uuid: card.uuid,
         type: card.type,
@@ -68,16 +57,16 @@
         format: 'array',   // 缁勪欢灞炴�� - 鏁版嵁鏍煎紡
         pageable: false,   // 缁勪欢灞炴�� - 鏄惁鍙垎椤�
         switchable: false, // 缁勪欢灞炴�� - 鏁版嵁鏄惁鍙垏鎹�
-        dataName: dataName,
+        dataName: card.dataName || '',
         width: _plot.width,
         name: _plot.name,
         subtype: card.subtype,
         setting: { interType: 'system' },
         style: {
-          fontSize: '16px',
           borderWidth: '1px', borderColor: 'rgb(217, 217, 217)',
           marginLeft: '8px', marginRight: '8px', marginTop: '8px', marginBottom: '8px'
         },
+        headerStyle: { fontSize: '16px', borderBottomWidth: '1px', borderBottomColor: 'rgb(217, 217, 217)' },
         columns: [],
         scripts: [],
         search: [],
@@ -385,18 +374,31 @@
     MKEmitter.emit('addSearch', card.uuid, newcard)
   }
 
+  changeTitleStyle = () => {
+    const { card } = this.state
+
+    MKEmitter.emit('changeStyle', [card.uuid, 'header'], ['font', 'border'], card.headerStyle)
+  }
+
   changeStyle = () => {
     const { card } = this.state
 
-    MKEmitter.emit('changeStyle', [card.uuid], ['font', 'background', 'border', 'padding', 'margin'], card.style)
+    MKEmitter.emit('changeStyle', [card.uuid], ['background', 'border', 'padding', 'margin'], card.style)
   }
 
   getStyle = (comIds, style) => {
     const { card } = this.state
 
-    if (comIds.length !== 1 || comIds[0] !== card.uuid) return
+    if (comIds[0] !== card.uuid) return
 
-    let _card = {...card, style}
+    let _card = {}
+    if (comIds.length === 1) {
+      _card = {...card, style}
+    } else if (comIds.length === 2 && comIds[1] === 'header') {
+      _card = {...card, headerStyle: style}
+    } else {
+      return
+    }
 
     this.setState({
       card: _card
@@ -410,8 +412,14 @@
 
     return (
       <div className="menu-pie-chart-edit-box" style={{...card.style, height: card.plot.height || 400}}>
-        <div className="chart-header">
-          <span className="chart-title">{card.plot.title || ''}</span>
+        <div className="chart-header" style={card.headerStyle}>
+          <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
+            <div className="mk-popover-control">
+              <Icon className="style" title="璋冩暣鏍峰紡" onClick={this.changeTitleStyle} type="font-colors" />
+            </div>
+          } trigger="hover">
+            <span className="chart-title">{card.plot.title || ''}</span>
+          </Popover>
           <SearchComponent
             config={card}
             updatesearch={this.updateComponent}
diff --git a/src/menu/components/chart/antv-pie/index.scss b/src/menu/components/chart/antv-pie/index.scss
index d42ee49..87c7aa0 100644
--- a/src/menu/components/chart/antv-pie/index.scss
+++ b/src/menu/components/chart/antv-pie/index.scss
@@ -18,9 +18,6 @@
     border-bottom: 1px solid #e8e8e8;
     overflow: hidden;
     padding-right: 35px;
-    text-decoration: inherit;
-    font-weight: inherit;
-    font-style: inherit;
 
     >.anticon-tool {
       position: absolute;
@@ -40,6 +37,8 @@
       float: left;
       line-height: 45px;
       margin-left: 10px;
+      position: relative;
+      z-index: 1;
     }
   }
 
diff --git a/src/menu/components/tabs/tabcomponents/index.jsx b/src/menu/components/tabs/tabcomponents/index.jsx
index e0f397d..e2b9908 100644
--- a/src/menu/components/tabs/tabcomponents/index.jsx
+++ b/src/menu/components/tabs/tabcomponents/index.jsx
@@ -100,6 +100,14 @@
         }
         i++
       }
+
+      let dataName = ''
+      while (!dataName) {
+        let _dataName = Utils.getdataName()
+        if (config.components.filter(com => com.dataName === _dataName).length === 0) {
+          dataName = _dataName
+        }
+      }
       
       let newcard = {
         uuid: Utils.getuuid(),
@@ -109,6 +117,7 @@
         subtype: item.subtype,
         config: item.config,
         width: item.width || 24,
+        dataName: dataName,
         name: name,
         floor: config.floor ? (config.floor + 1) : 2, // 缁勪欢鐨勫眰绾�
         isNew: true                                   // 鏂版坊鍔犳爣蹇楋紝鐢ㄤ簬鍒濆鍖�
diff --git a/src/menu/datasource/index.jsx b/src/menu/datasource/index.jsx
index 5520997..07031e4 100644
--- a/src/menu/datasource/index.jsx
+++ b/src/menu/datasource/index.jsx
@@ -47,6 +47,23 @@
     this.setState({loading: true})
     this.verifyRef.submitDataSource().then(res => {
 
+      if (res.columns) {
+        res.columns = res.columns.map(item => {
+    
+          if (/int/ig.test(item.datatype)) {
+            item.type = 'number'
+            item.decimal = 0
+          } else if (/Decimal/ig.test(item.datatype)) {
+            item.type = 'number'
+            item.decimal = +item.datatype.replace(/^Decimal\(18,/ig, '').replace(/\)/ig, '')
+          } else {
+            item.type = 'text'
+            item.fieldlength = +item.datatype.replace(/^Nvarchar\(/ig, '').replace(/\)/ig, '')
+          }
+          return item
+        })
+      }
+      
       this.setState({loading: false, visible: false})
       this.props.updateConfig({...config, ...res})
     }, () => {
diff --git a/src/menu/menushell/index.jsx b/src/menu/menushell/index.jsx
index 2656df8..de7b7da 100644
--- a/src/menu/menushell/index.jsx
+++ b/src/menu/menushell/index.jsx
@@ -93,12 +93,21 @@
         i++
       }
 
+      let dataName = ''
+      while (!dataName) {
+        let _dataName = Utils.getdataName()
+        if (menu.components.filter(com => com.dataName === _dataName).length === 0) {
+          dataName = _dataName
+        }
+      }
+
       let newcard = {
         uuid: Utils.getuuid(),
         type: item.component,
         subtype: item.subtype,
         config: item.config,
         width: item.width || 24,
+        dataName: dataName,
         name: name,
         floor: 1,   // 缁勪欢鐨勫眰绾�
         isNew: true // 鏂版坊鍔犳爣蹇楋紝鐢ㄤ簬鍒濆鍖�
diff --git a/src/menu/modalconfig/index.jsx b/src/menu/modalconfig/index.jsx
index 9998550..5a0b8c9 100644
--- a/src/menu/modalconfig/index.jsx
+++ b/src/menu/modalconfig/index.jsx
@@ -177,7 +177,7 @@
    * 3銆佽缃紪杈戝弬鏁伴」-formlist
    */
   handleForm = (_card) => {
-    const { componentConfig } = this.props
+    const { componentConfig, menu } = this.props
     let card = fromJS(_card).toJS()
 
     const { config } = this.state
@@ -239,8 +239,8 @@
     }
 
     let roleList = []
-    if (this.props.sysRoles && this.props.sysRoles.length > 0) {
-      roleList = this.props.sysRoles.map(role => {
+    if (menu.sysRoles && menu.sysRoles.length > 0) {
+      roleList = menu.sysRoles.map(role => {
         return {
           uuid: role.uuid,
           field: role.value,
@@ -917,7 +917,6 @@
 
 const mapStateToProps = (state) => {
   return {
-    sysRoles: state.sysRoles,
     menu: state.customMenu
   }
 }
diff --git a/src/menu/stylecontroller/index.jsx b/src/menu/stylecontroller/index.jsx
index 43cce2d..3d6a28e 100644
--- a/src/menu/stylecontroller/index.jsx
+++ b/src/menu/stylecontroller/index.jsx
@@ -1,7 +1,7 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { is, fromJS } from 'immutable'
-import { Collapse, Form, Input, Col, Icon, InputNumber, Select, Radio, Drawer } from 'antd'
+import { Collapse, Form, Input, Col, Icon, InputNumber, Select, Radio, Drawer, Button } from 'antd'
 
 import MKEmitter from '@/utils/events.js'
 import zhCN from '@/locales/zh-CN/mob.js'
@@ -288,6 +288,7 @@
         width="300"
         className="menu-style-drawer"
         closable={true}
+        maskClosable={false}
         onClose={this.onCloseDrawer}
         maskStyle={{opacity: 0.1}}
         visible={this.state.visible}
@@ -498,73 +499,81 @@
                     label={<Icon title="鍦嗚" type="radius-setting" />}
                     labelCol={{xs: { span: 24 }, sm: { span: 4 }}} wrapperCol={ {xs: { span: 24 }, sm: { span: 20 }} }
                   >
-                    <StyleInput defaultValue={card.borderRadius || ''} options={['px', '%']} onChange={(val) => this.changeNormalStyle(val, 'borderRadius')}/>
+                    <StyleInput defaultValue={card.borderRadius || '0px'} options={['px', '%']} onChange={(val) => this.changeNormalStyle(val, 'borderRadius')}/>
                   </Form.Item>
                 </Col>
               </Panel> : null}
               {options.includes('margin') ? <Panel header="澶栬竟璺�" key="margin">
-                <Col span={12}>
+                <Col span={24}>
                   <Form.Item
                     colon={false}
                     label={<Icon title="涓婅竟璺�" type="arrow-up"/>}
+                    labelCol={{xs: { span: 24 }, sm: { span: 4 }}} wrapperCol={ {xs: { span: 24 }, sm: { span: 20 }} }
                   >
                     <StyleInput defaultValue={card.marginTop || '0px'} options={['px', 'vh', 'vw']} onChange={(val) => this.changeNormalStyle(val, 'marginTop')}/>
                   </Form.Item>
                 </Col>
-                <Col span={12}>
+                <Col span={24}>
                   <Form.Item
                     colon={false}
                     label={<Icon title="涓嬭竟璺�" type="arrow-down"/>}
+                    labelCol={{xs: { span: 24 }, sm: { span: 4 }}} wrapperCol={ {xs: { span: 24 }, sm: { span: 20 }} }
                   >
                     <StyleInput defaultValue={card.marginBottom || '0px'} options={['px', 'vh', 'vw']} onChange={(val) => this.changeNormalStyle(val, 'marginBottom')}/>
                   </Form.Item>
                 </Col>
-                <Col span={12}>
+                <Col span={24}>
                   <Form.Item
                     colon={false}
                     label={<Icon title="宸﹁竟璺�" type="arrow-left"/>}
+                    labelCol={{xs: { span: 24 }, sm: { span: 4 }}} wrapperCol={ {xs: { span: 24 }, sm: { span: 20 }} }
                   >
                     <StyleInput defaultValue={card.marginLeft || '0px'} options={['px', 'vh', 'vw']} onChange={(val) => this.changeNormalStyle(val, 'marginLeft')}/>
                   </Form.Item>
                 </Col>
-                <Col span={12}>
+                <Col span={24}>
                   <Form.Item
                     colon={false}
                     label={<Icon title="鍙宠竟璺�" type="arrow-right"/>}
+                    labelCol={{xs: { span: 24 }, sm: { span: 4 }}} wrapperCol={ {xs: { span: 24 }, sm: { span: 20 }} }
                   >
                     <StyleInput defaultValue={card.marginRight || '0px'} options={['px', 'vh', 'vw']} onChange={(val) => this.changeNormalStyle(val, 'marginRight')}/>
                   </Form.Item>
                 </Col>
               </Panel> : null}
               {options.includes('padding') ? <Panel header="鍐呰竟璺�" key="padding">
-                <Col span={12}>
+                <Col span={24}>
                   <Form.Item
                     colon={false}
                     label={<Icon title="涓婅竟璺�" type="arrow-up"/>}
+                    labelCol={{xs: { span: 24 }, sm: { span: 4 }}} wrapperCol={ {xs: { span: 24 }, sm: { span: 20 }} }
                   >
                     <StyleInput defaultValue={card.paddingTop || '0px'} options={['px', 'vh', 'vw']} onChange={(val) => this.changeNormalStyle(val, 'paddingTop')}/>
                   </Form.Item>
                 </Col>
-                <Col span={12}>
+                <Col span={24}>
                   <Form.Item
                     colon={false}
                     label={<Icon title="涓嬭竟璺�" type="arrow-down"/>}
+                    labelCol={{xs: { span: 24 }, sm: { span: 4 }}} wrapperCol={ {xs: { span: 24 }, sm: { span: 20 }} }
                   >
                     <StyleInput defaultValue={card.paddingBottom || '0px'} options={['px', 'vh', 'vw']} onChange={(val) => this.changeNormalStyle(val, 'paddingBottom')}/>
                   </Form.Item>
                 </Col>
-                <Col span={12}>
+                <Col span={24}>
                   <Form.Item
                     colon={false}
                     label={<Icon title="宸﹁竟璺�" type="arrow-left"/>}
+                    labelCol={{xs: { span: 24 }, sm: { span: 4 }}} wrapperCol={ {xs: { span: 24 }, sm: { span: 20 }} }
                   >
                     <StyleInput defaultValue={card.paddingLeft || '0px'} options={['px', 'vh', 'vw']} onChange={(val) => this.changeNormalStyle(val, 'paddingLeft')}/>
                   </Form.Item>
                 </Col>
-                <Col span={12}>
+                <Col span={24}>
                   <Form.Item
                     colon={false}
                     label={<Icon title="鍙宠竟璺�" type="arrow-right"/>}
+                    labelCol={{xs: { span: 24 }, sm: { span: 4 }}} wrapperCol={ {xs: { span: 24 }, sm: { span: 20 }} }
                   >
                     <StyleInput defaultValue={card.paddingRight || '0px'} options={['px', 'vh', 'vw']} onChange={(val) => this.changeNormalStyle(val, 'paddingRight')}/>
                   </Form.Item>
@@ -587,6 +596,9 @@
               </Panel> : null}
             </Collapse> : null}
           </Form>
+          <div style={{textAlign: 'right'}}>
+            <Button type="link" style={{color: '#ffffff', marginTop: '20px'}} onClick={this.onCloseDrawer}>鍏抽棴</Button>
+          </div>
         </div>
       </Drawer>
     )
diff --git a/src/menu/stylecontroller/index.scss b/src/menu/stylecontroller/index.scss
index 801ed13..f1c1560 100644
--- a/src/menu/stylecontroller/index.scss
+++ b/src/menu/stylecontroller/index.scss
@@ -17,6 +17,14 @@
         color: rgba(255, 255, 255, 0.85);
         background-color: #202735;
         border-top: 1px solid #202735;
+        .ant-collapse-content-box {
+          padding: 5px 10px;
+        }
+        .ant-collapse-content-box::after {
+          content: ' ';
+          display: block;
+          clear: both;
+        }
         .ant-input-number {
           width: 100%;
         }
diff --git a/src/menu/stylecontroller/styleInput/index.jsx b/src/menu/stylecontroller/styleInput/index.jsx
index 3bf883c..a7d3df9 100644
--- a/src/menu/stylecontroller/styleInput/index.jsx
+++ b/src/menu/stylecontroller/styleInput/index.jsx
@@ -1,9 +1,11 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { is, fromJS } from 'immutable'
-import { Menu, Popover, Input } from 'antd'
+import { Select, Input } from 'antd'
 
 import './index.scss'
+
+const { Option } = Select
 
 class StyleInput extends Component {
   static propTpyes = {
@@ -15,14 +17,14 @@
 
   state = {
     value: '',
-    parseVal: '',
-    width: '',
+    unit: '',
     options: null
   }
 
   UNSAFE_componentWillMount () {
     const { defaultValue, value, options } = this.props
     let val = ''
+    let unit = ''
     let _options = ['px']
 
     if (value !== undefined) {
@@ -35,8 +37,18 @@
       _options = options
     }
 
-    if (val === 'auto') {
-      val = ''
+    unit = _options[0]
+
+    if (val) {
+      if (val.indexOf('px') > -1) {
+        unit = 'px'
+      } else if (val.indexOf('%') > -1) {
+        unit = '%'
+      } else if (val.indexOf('vw') > -1) {
+        unit = 'vw'
+      } else if (val.indexOf('vh') > -1) {
+        unit = 'vh'
+      }
     }
 
     let _val = parseInt(val)
@@ -45,7 +57,7 @@
       _val = ''
     }
 
-    this.setState({value: val, options: _options, parseVal: _val})
+    this.setState({value: _val, options: _options, unit})
   }
 
   shouldComponentUpdate (nextProps, nextState) {
@@ -54,13 +66,32 @@
 
   UNSAFE_componentWillReceiveProps(nextProps) {
     if (nextProps.value !== undefined && nextProps.value !== this.state.value) {
-      this.setState({ value: nextProps.value })
+      let val = nextProps.value
+      let unit = this.state.unit
+
+      if (val) {
+        if (val.indexOf('px') > -1) {
+          unit = 'px'
+        } else if (val.indexOf('%') > -1) {
+          unit = '%'
+        } else if (val.indexOf('vw') > -1) {
+          unit = 'vw'
+        } else if (val.indexOf('vh') > -1) {
+          unit = 'vh'
+        }
+      }
+
+      let _val = parseInt(val)
+
+      if (isNaN(_val)) {
+        _val = ''
+      }
+
+      this.setState({value: _val, unit})
     }
   }
 
-  componentDidMount () {
-    this.setState({width: (this.input.offsetWidth - 10) + 'px'})
-  }
+  componentDidMount () {}
 
   /**
    * @description 缁勪欢閿�姣侊紝娓呴櫎state鏇存柊锛屾竻闄ゅ揩鎹烽敭璁剧疆
@@ -72,49 +103,47 @@
   }
 
   changeValue = (e) => {
+    const { unit } = this.state
     let val = e.target.value
     let _val = parseInt(val)
-
+    
     if (isNaN(_val)) {
       _val = ''
     }
 
     this.setState({
-      value: val,
-      parseVal: _val
-    })
-
-    if (!val && this.props.onChange) {
-      this.props.onChange('0px')
-    }
-  }
-
-  submitValue = (val) => {
-    this.setState({
-      value: val
+      value: _val,
     })
 
     if (this.props.onChange) {
-      this.props.onChange(val)
+      if (!_val) {
+        this.props.onChange('0px')
+      } else {
+        this.props.onChange(`${_val}${unit}`)
+      }
+    }
+  }
+
+  changeUnit = (val) => {
+    const { value } = this.state
+
+    this.setState({unit: val})
+    if (value && this.props.onChange) {
+      this.props.onChange(`${value}${val}`)
     }
   }
 
   render () {
-    const { value, options, parseVal, width } = this.state
+    const { value, options, unit } = this.state
 
     return (
-      <Popover placement="bottom" overlayClassName="style-input-popover" content={
-        parseVal !== '' ?
-        <Menu>
-          {options.map(option => (
-            <Menu.Item key={option} style={{width: width}} onClick={() => this.submitValue(`${parseVal}${option}`)}>{parseVal} {option}</Menu.Item>
-          ))}
-        </Menu> : null
-      } trigger="hover">
-        <div ref={dom => { this.input = dom }} style={{lineHeight: '32px'}}>
-          <Input value={value} onChange={this.changeValue}/>
-        </div>
-      </Popover>
+      <div className="style-input-box">
+        <Input value={value} addonAfter={
+          <Select value={unit} onChange={this.changeUnit}>
+            {options.map(item => <Option key={item} value={item}>{item}</Option>)}
+          </Select>
+        } onChange={this.changeValue}/>
+      </div>
     )
   }
 }
diff --git a/src/menu/stylecontroller/styleInput/index.scss b/src/menu/stylecontroller/styleInput/index.scss
index 68798d5..e76a3e4 100644
--- a/src/menu/stylecontroller/styleInput/index.scss
+++ b/src/menu/stylecontroller/styleInput/index.scss
@@ -1,44 +1,9 @@
-.style-input-popover {
-  padding-top: 0px;
-  z-index: 1090!important;
-  .ant-popover-inner-content {
-    padding: 0px 5px;
-    .ant-menu-root.ant-menu-vertical {
-      border: 0;
-      .ant-menu-item {
-        height: 30px;
-        cursor: pointer;
-        line-height: 30px;
-      }
-      .ant-menu-item:not(:last-child) {
-        margin-bottom: 0px;
-      }
-      .ant-menu-item:first-child {
-        margin-top: 10px;
-      }
-      .ant-menu-item:last-child {
-        margin-bottom: 10px;
-      }
+.style-input-box {
+  line-height: 32px;
+  .ant-select {
+    width: 60px!important;
+    .ant-select-selection {
+      color: rgba(0, 0, 0, 0.75)!important;
     }
   }
-  .ant-popover-arrow {
-    display: none;
-  }
-  .ant-popover-content::before {
-    content: ' ';
-    position: absolute;
-    width: 100%;
-    height: 5px;
-    top: -5px;
-  }
-  .ant-popover-content::after {
-    content: ' ';
-    position: absolute;
-    width: 100%;
-    height: 5px;
-    bottom: -5px;
-  }
-}
-.style-input-popover.ant-popover-placement-top {
-  padding-bottom: 0px;
 }
diff --git a/src/mob/colorsketch/index.jsx b/src/mob/colorsketch/index.jsx
index dd401d7..c3fe986 100644
--- a/src/mob/colorsketch/index.jsx
+++ b/src/mob/colorsketch/index.jsx
@@ -58,7 +58,9 @@
         <Popover content={
           <SketchPicker color={ color } presetColors={presetColors} onChange={ this.handleChange } />
         } overlayClassName="color-sketch-popover" placement="bottomRight" title="" trigger="click">
-          <div className="color-sketch-block-inner" style={ {background: color} }></div>
+          <div className="color-sketch-block-box">
+            <div className="color-sketch-block-inner" style={ {background: color} }></div>
+          </div>
         </Popover>
         <div className="color-sketch-value">{color}</div>
       </div>
diff --git a/src/mob/colorsketch/index.scss b/src/mob/colorsketch/index.scss
index 5790603..96900ce 100644
--- a/src/mob/colorsketch/index.scss
+++ b/src/mob/colorsketch/index.scss
@@ -2,14 +2,20 @@
   height: 25px;
   width: 100%;
 
+  .color-sketch-block-box {
+    display: inline-block;
+    width: calc(100% - 160px);
+    height: 100%;
+    border-radius: 2px;
+    background: #ffffff url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAMUlEQVQ4T2NkYGAQYcAP3uCTZhw1gGGYhAGBZIA/nYDCgBDAm9BGDWAAJyRCgLaBCAAgXwixzAS0pgAAAABJRU5ErkJggg==') left center;
+  }
   .color-sketch-block-inner {
     display: inline-block;
     cursor: pointer;
     border-radius: 2px;
     box-shadow: 0 0 0 1px rgba(0, 0, 0, .1);
-    width: calc(100% - 160px);
+    width: 100%;
     height: 100%;
-    border-radius: 2px;
   }
   .color-sketch-value {
     display: inline-block;
diff --git a/src/tabviews/custom/components/card/cardcellList/index.jsx b/src/tabviews/custom/components/card/cardcellList/index.jsx
index 8375248..2c2a41c 100644
--- a/src/tabviews/custom/components/card/cardcellList/index.jsx
+++ b/src/tabviews/custom/components/card/cardcellList/index.jsx
@@ -91,7 +91,7 @@
   getContent = (card) => {
     const { data, BID, cards } = this.props
 
-    if (card.eleType === 'text' || card.eleType === 'number') {
+    if (card.eleType === 'text') {
       let val = ''
 
       if (card.datatype === 'static') {
@@ -100,6 +100,48 @@
         val = data[card.field]
       }
 
+      if (val !== '' && card.format) {
+        if (card.format === 'YYYY-MM-DD' && /^[1-9]\d{3}(-|\/)(0[1-9]|1[0-2])(-|\/)(0[1-9]|[1-2][0-9]|3[0-1])/.test(val)) {
+          val = `${val.substr(0, 4)}-${val.substr(5, 2)}-${val.substr(8, 2)}`
+        }
+      }
+
+      if (val !== '') {
+        val = `${card.prefix || ''}${val}${card.postfix || ''}`
+      }
+
+      return (
+        <Col key={card.uuid} span={card.width}>
+          <div style={card.style}>
+            <div className={'ant-mk-text line' + card.height} style={{height: card.innerHeight || 21}}>{val}</div>
+          </div>
+        </Col>
+      )
+    } else if (card.eleType === 'number') {
+      let val = ''
+
+      if (card.datatype === 'static') {
+        val = card.value
+      } else if (data.hasOwnProperty(card.field)) {
+        val = data[card.field]
+      }
+
+      if (val !== '' && typeof(val) === 'number') {
+        if (card.format === 'percent') {
+          val = val * 100
+        }
+
+        if (card.col && card.col.type === 'number') {
+          val = val.toFixed(card.col.decimal || 0)
+        } else {
+          val = '' + val
+        }
+        
+        if (card.format === 'thdSeparator') {
+          val = val.replace(/\d{1,3}(?=(\d{3})+(\.\d*)?$)/g, '$&,')
+        }
+      }
+
       if (val !== '') {
         val = `${card.prefix || ''}${val}${card.postfix || ''}`
       }
diff --git a/src/tabviews/custom/components/card/data-card/index.jsx b/src/tabviews/custom/components/card/data-card/index.jsx
index 9c52d9c..0efdbeb 100644
--- a/src/tabviews/custom/components/card/data-card/index.jsx
+++ b/src/tabviews/custom/components/card/data-card/index.jsx
@@ -35,10 +35,29 @@
 
   UNSAFE_componentWillMount () {
     let _config = fromJS(this.props.config).toJS()
+    let _card = _config.subcards[0]
+    let _cols = new Map()
+
+    _config.columns.forEach(item => {
+      _cols.set(item.field, item)
+    })
+
+    _card.elements = _card.elements.map(item => {
+      if (item.field && _cols.has(item.field)) {
+        item.col = _cols.get(item.field)
+      }
+      return item
+    })
+    _card.backElements = _card.backElements.map(item => {
+      if (item.field && _cols.has(item.field)) {
+        item.col = _cols.get(item.field)
+      }
+      return item
+    })
 
     this.setState({
       config: _config,
-      card: _config.subcards[0],
+      card: _card,
       arr_field: _config.columns.map(col => col.field).join(','),
     }, () => {
       this.loadData()
diff --git a/src/tabviews/custom/components/card/data-card/index.scss b/src/tabviews/custom/components/card/data-card/index.scss
index 76f84b2..bb60e73 100644
--- a/src/tabviews/custom/components/card/data-card/index.scss
+++ b/src/tabviews/custom/components/card/data-card/index.scss
@@ -3,7 +3,7 @@
   background-position: center center;
   background-repeat: no-repeat;
   background-size: cover;
-  min-height: 50px;
+  min-height: 20px;
   display: flex;
   position: relative;
 
diff --git a/src/tabviews/custom/components/card/prop-card/index.jsx b/src/tabviews/custom/components/card/prop-card/index.jsx
index bb6fef1..b3ff9a4 100644
--- a/src/tabviews/custom/components/card/prop-card/index.jsx
+++ b/src/tabviews/custom/components/card/prop-card/index.jsx
@@ -30,6 +30,26 @@
 
   UNSAFE_componentWillMount () {
     let _config = fromJS(this.props.config).toJS()
+    let _cols = new Map()
+
+    _config.columns.forEach(item => {
+      _cols.set(item.field, item)
+    })
+
+    _config.subcards.forEach(card => {
+      card.elements = card.elements.map(item => {
+        if (item.field && _cols.has(item.field)) {
+          item.col = _cols.get(item.field)
+        }
+        return item
+      })
+      card.backElements = card.backElements.map(item => {
+        if (item.field && _cols.has(item.field)) {
+          item.col = _cols.get(item.field)
+        }
+        return item
+      })
+    })
 
     this.setState({
       config: _config,
diff --git a/src/tabviews/custom/components/card/prop-card/index.scss b/src/tabviews/custom/components/card/prop-card/index.scss
index d2304b4..6ba2875 100644
--- a/src/tabviews/custom/components/card/prop-card/index.scss
+++ b/src/tabviews/custom/components/card/prop-card/index.scss
@@ -3,7 +3,7 @@
   background-position: center center;
   background-repeat: no-repeat;
   background-size: cover;
-  min-height: 50px;
+  min-height: 20px;
   position: relative;
 
   .card-row-list::after {
diff --git a/src/tabviews/custom/components/chart/antv-bar-line/index.jsx b/src/tabviews/custom/components/chart/antv-bar-line/index.jsx
index 0d993cd..3ddb731 100644
--- a/src/tabviews/custom/components/chart/antv-bar-line/index.jsx
+++ b/src/tabviews/custom/components/chart/antv-bar-line/index.jsx
@@ -1039,7 +1039,7 @@
             <Spin />
           </div> : null
         }
-        {showHeader ? <div className="chart-header">
+        {showHeader ? <div className="chart-header" style={config.headerStyle}>
           <span className="chart-title">{title}</span>
           {/* <searchLine /> */}
           {plot.datatype === 'statistics' && chartFields.length > 0 ? <Select
diff --git a/src/tabviews/custom/components/chart/antv-bar-line/index.scss b/src/tabviews/custom/components/chart/antv-bar-line/index.scss
index dd7dc40..7d6a79a 100644
--- a/src/tabviews/custom/components/chart/antv-bar-line/index.scss
+++ b/src/tabviews/custom/components/chart/antv-bar-line/index.scss
@@ -7,11 +7,8 @@
 
   > .chart-header {
     height: 45px;
-    border-bottom: 1px solid #e8e8e8;
+    // border-bottom: 1px solid #e8e8e8;
     overflow: hidden;
-    text-decoration: inherit;
-    font-weight: inherit;
-    font-style: inherit;
 
     .chart-title {
       // font-size: 16px;
diff --git a/src/tabviews/custom/components/chart/antv-pie/index.jsx b/src/tabviews/custom/components/chart/antv-pie/index.jsx
index abe2143..873f630 100644
--- a/src/tabviews/custom/components/chart/antv-pie/index.jsx
+++ b/src/tabviews/custom/components/chart/antv-pie/index.jsx
@@ -456,7 +456,7 @@
             <Spin />
           </div> : null
         }
-        {showHeader ? <div className="chart-header">
+        {showHeader ? <div className="chart-header" style={config.headerStyle}>
           <span className="chart-title">{title}</span>
           {/* <searchLine /> */}
         </div> : null}
diff --git a/src/tabviews/custom/components/chart/antv-pie/index.scss b/src/tabviews/custom/components/chart/antv-pie/index.scss
index bf252bb..e6a1847 100644
--- a/src/tabviews/custom/components/chart/antv-pie/index.scss
+++ b/src/tabviews/custom/components/chart/antv-pie/index.scss
@@ -7,11 +7,8 @@
 
   > .chart-header {
     height: 45px;
-    border-bottom: 1px solid #e8e8e8;
+    // border-bottom: 1px solid #e8e8e8;
     overflow: hidden;
-    text-decoration: inherit;
-    font-weight: inherit;
-    font-style: inherit;
 
     .chart-title {
       // font-size: 16px;
diff --git a/src/tabviews/custom/components/share/tabtransfer/index.jsx b/src/tabviews/custom/components/share/tabtransfer/index.jsx
index 0238c31..f2bb801 100644
--- a/src/tabviews/custom/components/share/tabtransfer/index.jsx
+++ b/src/tabviews/custom/components/share/tabtransfer/index.jsx
@@ -2,17 +2,22 @@
 import PropTypes from 'prop-types'
 import { connect } from 'react-redux'
 import { is, fromJS } from 'immutable'
-import { Row, Col, Empty } from 'antd'
+import { Row, Col, Empty, notification } from 'antd'
+import moment from 'moment'
 
-import asyncSpinComponent from '@/utils/asyncSpinComponent'
+import Api from '@/api'
+import options from '@/store/options.js'
+import asyncComponent from '@/utils/asyncComponent'
 import Utils from '@/utils/utils.js'
 import './index.scss'
 
 // 閫氱敤缁勪欢
-const AntvBarAndLine = asyncSpinComponent(() => import('@/tabviews/custom/components/chart/antv-bar-line'))
-const MainSearch = asyncSpinComponent(() => import('@/tabviews/custom/components/search/main-search'))
-const AntvPie = asyncSpinComponent(() => import('@/tabviews/custom/components/chart/antv-pie'))
-const AntvTabs = asyncSpinComponent(() => import('@/tabviews/custom/components/tabs/antv-tabs'))
+const AntvBarAndLine = asyncComponent(() => import('@/tabviews/custom/components/chart/antv-bar-line'))
+const MainSearch = asyncComponent(() => import('@/tabviews/custom/components/search/main-search'))
+const AntvPie = asyncComponent(() => import('@/tabviews/custom/components/chart/antv-pie'))
+const AntvTabs = asyncComponent(() => import('@/tabviews/custom/components/tabs/antv-tabs'))
+const DataCard = asyncComponent(() => import('@/tabviews/custom/components/card/data-card'))
+const PropCard = asyncComponent(() => import('@/tabviews/custom/components/card/prop-card'))
 
 class TabTransfer extends Component {
   static propTpyes = {
@@ -25,11 +30,13 @@
 
   state = {
     mainSearch: [],
-    self: false
+    self: false,
+    data: null
   }
 
   UNSAFE_componentWillMount () {
     const { config, mainSearch } = this.props
+
     // 鑾峰彇涓绘悳绱㈡潯浠�
     let _mainSearch = []
     let self = false
@@ -56,7 +63,26 @@
       }
     })
 
-    this.setState({mainSearch: self ? _mainSearch : fromJS(mainSearch).toJS(), self})
+    if (!self) {
+      _mainSearch = fromJS(mainSearch).toJS()
+    }
+
+    let params = []
+    config.components.forEach(component => {
+      if (component.type === 'tabs') return
+
+      if (!component.format || (component.subtype === 'propcard' && component.wrap.datatype === 'static')) return
+
+      if (component.dataName && !component.pageable && component.setting.interType === 'system' && component.setting.onload === 'true' && component.setting.sync === 'true') {
+        let param = this.getDefaultParam(component, _mainSearch)
+        params.push(param)
+      } else {
+        component.setting.sync = 'false'
+      }
+    })
+
+    this.setState({mainSearch: _mainSearch, self})
+    this.loadmaindata(params)
   }
 
   UNSAFE_componentWillReceiveProps(nextProps) {
@@ -67,13 +93,136 @@
     }
   }
 
+  /**
+   * @description 鑾峰彇绯荤粺瀛樺偍杩囩▼ sPC_Get_TableData 鐨勫弬鏁�
+   */
+  getDefaultParam = (component, mainSearch) => {
+    const { columns, search, setting, dataName, format } = component
+    
+    let searchlist = []
+    if (search && search.length > 0) {
+      searchlist = Utils.initMainSearch(search)
+    }
+    if (setting.useMSearch === 'true') {
+      searchlist = [...mainSearch, ...searchlist]
+    }
+
+    let arr_field = columns.map(col => col.field)
+    let _dataresource = setting.dataresource
+    let _customScript = setting.customScript
+
+    if (setting.queryType === 'statistics' || _customScript) {
+      let allSearch = Utils.getAllSearchOptions(searchlist)
+      let regoptions = allSearch.map(item => {
+        return {
+          reg: new RegExp('@' + item.key + '@', 'ig'),
+          value: `'${item.value}'`
+        }
+      })
+
+      regoptions.forEach(item => {
+        if (_dataresource && setting.queryType === 'statistics') {
+          _dataresource = _dataresource.replace(item.reg, item.value)
+        }
+        if (_customScript) {
+          _customScript = _customScript.replace(item.reg, item.value)
+        }
+      })
+    }
+
+    let _search = ''
+    if (setting.queryType !== 'statistics' && _dataresource) {
+      _search = Utils.joinMainSearchkey(searchlist)
+      _search = _search ? 'where ' + _search : ''
+    }
+
+    if (setting.order && _dataresource) {
+      _dataresource = `select top 1000 ${arr_field.join(',')} from (select ${arr_field.join(',')} ,ROW_NUMBER() over(order by ${setting.order}) as rows from ${_dataresource} ${_search}) tmptable order by tmptable.rows `
+    } else if (_dataresource) {
+      _dataresource = `select top 1000 ${arr_field.join(',')} from ${_dataresource} ${_search} `
+    }
+
+    // 娴嬭瘯绯荤粺鎵撳嵃鏌ヨ璇彞
+    if ((options.sysType === 'local' && !window.GLOB.systemType) || window.debugger === true) {
+      _customScript &&  console.log(`${_dataresource ? '' : '/*涓嶆墽琛岄粯璁ql*/\n'}${_customScript}`)
+      _dataresource &&  console.log(_dataresource)
+    }
+
+    return {
+      name: dataName,
+      columns: columns,
+      par_tablename: '',
+      type: format === 'array' ? format : '',
+      primaryKey: setting.primaryKey || '',
+      foreign_key: '',
+      sql: _dataresource,
+      script: _customScript
+    }
+  }
+
+  /**
+   * @description 涓昏〃鏁版嵁鍔犺浇
+   */ 
+  loadmaindata = (params) => {
+    if (!params || params.length === 0) return
+    let LText_field = []
+    let LText = params.map((item, index) => {
+      let _sql = item.sql
+      let _script = item.script
+
+      if (index === 0) {
+        _script = `declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000) select @ErrorCode='',@retmsg =''
+          ${_script}
+        `
+      }
+
+      item.columns.forEach(cell => {
+        LText_field.push(`Select '${item.name}' as tablename,'${cell.field}' as fieldname,'${cell.datatype}' as field_type`)
+      })
+      return `Select '${item.name}' as tablename,'${window.btoa(window.encodeURIComponent(_sql))}' as LText,'${window.btoa(window.encodeURIComponent(_script))}' as Lcustomize,'${item.type}' as table_type,'${item.primaryKey}' as primary_key,'${item.par_tablename}' as par_tablename,'${item.foreign_key}' as foreign_key,'${index}' as Sort`
+    })
+
+    let param = {
+      func: 'sPC_Get_structured_data',
+      LText: LText.join(' union all '),
+      LText_field: LText_field.join(' union all ')
+    }
+
+    param.LText = Utils.formatOptions(param.LText)
+    param.LText_field = Utils.formatOptions(param.LText_field)
+    param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+    param.secretkey = Utils.encrypt(param.LText, param.timestamp)
+
+    Api.getLocalConfig(param).then(result => {
+      if (result.status) {
+        delete result.status
+        delete result.message
+        delete result.ErrMesg
+        delete result.ErrCode
+
+        this.setState({
+          data: result
+        })
+      } else {
+        this.setState({
+          data: ''
+        })
+        notification.error({
+          top: 92,
+          message: result.message,
+          duration: 10
+        })
+      }
+    })
+  }
+
   resetSearch = (search) => {
     this.setState({mainSearch: search})
   }
 
   getComponents = () => {
     const { menuType, dataManager, BID, config } = this.props
-    const { mainSearch } = this.state
+    const { mainSearch, data } = this.state
 
     if (!config || !config.components || config.components.length === 0) return (<Empty description={false} />)
 
@@ -81,13 +230,13 @@
       if (item.type === 'bar' || item.type === 'line') {
         return (
           <Col span={item.width} key={item.uuid}>
-            <AntvBarAndLine config={item} BID={BID} mainSearch={mainSearch} menuType={menuType} dataManager={dataManager} />
+            <AntvBarAndLine data={data} config={item} BID={BID} mainSearch={mainSearch} menuType={menuType} dataManager={dataManager} />
           </Col>
         )
       } else if (item.type === 'pie') {
         return (
           <Col span={item.width} key={item.uuid}>
-            <AntvPie config={item} BID={BID} mainSearch={mainSearch} menuType={menuType} dataManager={dataManager} />
+            <AntvPie data={data} config={item} BID={BID} mainSearch={mainSearch} menuType={menuType} dataManager={dataManager} />
           </Col>
         )
       } else if (item.type === 'search') {
@@ -102,6 +251,22 @@
             <AntvTabs config={item} BID={BID} mainSearch={mainSearch} menuType={menuType} dataManager={dataManager} />
           </Col>
         )
+      } else if (item.type === 'card') {
+        if (item.subtype === 'datacard') {
+          return (
+            <Col span={item.width} key={item.uuid}>
+              <DataCard config={item} BID={BID} mainSearch={mainSearch} menuType={menuType} dataManager={dataManager} />
+            </Col>
+          )
+        } else if (item.subtype === 'propcard') {
+          return (
+            <Col span={item.width} key={item.uuid}>
+              <PropCard config={item} data={data} BID={BID} mainSearch={mainSearch} menuType={menuType} dataManager={dataManager} />
+            </Col>
+          )
+        } else {
+          return null
+        }
       } else {
         return null
       }
diff --git a/src/tabviews/custom/components/tabs/antv-tabs/index.jsx b/src/tabviews/custom/components/tabs/antv-tabs/index.jsx
index 1f89c25..d8ef472 100644
--- a/src/tabviews/custom/components/tabs/antv-tabs/index.jsx
+++ b/src/tabviews/custom/components/tabs/antv-tabs/index.jsx
@@ -8,7 +8,6 @@
 import './index.scss'
 
 const TabTransfer = asyncComponent(() => import('../../share/tabtransfer'))
-
 const { TabPane } = Tabs
 
 class antvBarLineChart extends Component {
diff --git a/src/tabviews/custom/index.jsx b/src/tabviews/custom/index.jsx
index a3a5325..9541ee1 100644
--- a/src/tabviews/custom/index.jsx
+++ b/src/tabviews/custom/index.jsx
@@ -10,19 +10,19 @@
 import zhCN from '@/locales/zh-CN/main.js'
 import enUS from '@/locales/en-US/main.js'
 import Utils from '@/utils/utils.js'
-import asyncSpinComponent from '@/utils/asyncSpinComponent'
+import asyncComponent from '@/utils/asyncComponent'
 import { refreshTabView } from '@/store/action'
 
 import NotFount from '@/components/404'
 import './index.scss'
 
 // 閫氱敤缁勪欢
-const AntvBarAndLine = asyncSpinComponent(() => import('./components/chart/antv-bar-line'))
-const AntvPie = asyncSpinComponent(() => import('./components/chart/antv-pie'))
-const AntvTabs = asyncSpinComponent(() => import('./components/tabs/antv-tabs'))
-const DataCard = asyncSpinComponent(() => import('./components/card/data-card'))
-const PropCard = asyncSpinComponent(() => import('./components/card/prop-card'))
-const MainSearch = asyncSpinComponent(() => import('./components/search/main-search'))
+const AntvBarAndLine = asyncComponent(() => import('./components/chart/antv-bar-line'))
+const AntvPie = asyncComponent(() => import('./components/chart/antv-pie'))
+const AntvTabs = asyncComponent(() => import('./components/tabs/antv-tabs'))
+const DataCard = asyncComponent(() => import('./components/card/data-card'))
+const PropCard = asyncComponent(() => import('./components/card/prop-card'))
+const MainSearch = asyncComponent(() => import('./components/search/main-search'))
 
 class CustomPage extends Component {
   static propTpyes = {
@@ -66,6 +66,12 @@
       let config = ''
       let userConfig = null
 
+      setTimeout(() => { // 寤舵椂鍔犺浇鐘舵��
+        this.setState({
+          loadingview: false
+        })
+      }, 1500)
+
       try { // 閰嶇疆淇℃伅瑙f瀽
         config = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
       } catch (e) {
@@ -86,7 +92,6 @@
       // 椤甸潰閰嶇疆瑙f瀽閿欒鏃舵彁绀�
       if (!config) {
         this.setState({
-          loadingview: false,
           viewlost: true
         })
         return
@@ -95,7 +100,6 @@
       // 椤甸潰鏈惎鐢ㄦ椂锛屾樉绀烘湭鍚敤椤甸潰
       if (!config.enabled) {
         this.setState({
-          loadingview: false,
           viewlost: true,
           lostmsg: this.state.dict['main.view.unenabled']
         })
@@ -140,7 +144,6 @@
 
       this.setState({
         BID: param && param.BID ? param.BID : '',
-        loadingview: false,
         userConfig: userConfig,
         setting: config.setting,
         config,
@@ -222,7 +225,7 @@
       if (component.floor === 1 && component.dataName && !component.pageable && component.setting.interType === 'system' && component.setting.onload === 'true' && component.setting.sync === 'true') {
         let param = this.getDefaultParam(component, mainSearch)
         params.push(param)
-      } else {
+      } else if (component.floor === 1) {
         component.setting.sync = 'false'
       }
 
@@ -307,22 +310,11 @@
       let _sql = item.sql
       let _script = item.script
 
-      // if (index === 0) {
-      //   _script = `declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000) select @ErrorCode='',@retmsg =''
-      //     ${_script}
-      //   `
-      // }
-      
-      // if (params.length === index + 1) {
-      //   _sql = `${_sql}
-      //     aaa:
-      //       if @ErrorCode!=''
-      //       begin
-      //         insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,@UserID@ 
-      //         goto bbb
-      //       end
-      //   `
-      // }
+      if (index === 0) {
+        _script = `declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000) select @ErrorCode='',@retmsg =''
+          ${_script}
+        `
+      }
 
       item.columns.forEach(cell => {
         LText_field.push(`Select '${item.name}' as tablename,'${cell.field}' as fieldname,'${cell.datatype}' as field_type`)
@@ -335,7 +327,7 @@
       LText: LText.join(' union all '),
       LText_field: LText_field.join(' union all ')
     }
-    
+
     param.LText = Utils.formatOptions(param.LText)
     param.LText_field = Utils.formatOptions(param.LText_field)
     param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
diff --git a/src/templates/sharecomponent/actioncomponent/dragaction/index.jsx b/src/templates/sharecomponent/actioncomponent/dragaction/index.jsx
index 5e1da18..4fbfca7 100644
--- a/src/templates/sharecomponent/actioncomponent/dragaction/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/dragaction/index.jsx
@@ -53,7 +53,6 @@
     copycard.uuid = Utils.getuuid()
     copycard.origin = false
     copycard.copyType = 'action'
-    copycard.label = copycard.label + '(copy)'
     copycard.focus = true
 
     copycard.originCard = card
diff --git a/src/views/menudesign/index.jsx b/src/views/menudesign/index.jsx
index a21d6c6..a276faa 100644
--- a/src/views/menudesign/index.jsx
+++ b/src/views/menudesign/index.jsx
@@ -13,7 +13,7 @@
 import antdEnUS from 'antd/es/locale/en_US'
 import antdZhCN from 'antd/es/locale/zh_CN'
 import asyncComponent from '@/utils/asyncComponent'
-import { modifyCustomMenu } from '@/store/action'
+import { modifyCustomMenu, initPermission } from '@/store/action'
 
 import './index.scss'
 
@@ -467,7 +467,8 @@
 
 const mapDispatchToProps = (dispatch) => {
   return {
-    modifyCustomMenu: (customMenu) => dispatch(modifyCustomMenu(customMenu))
+    modifyCustomMenu: (customMenu) => dispatch(modifyCustomMenu(customMenu)),
+    initPermission: (sysRoles, permFuncField) => dispatch(initPermission(sysRoles, permFuncField))
   }
 }
 

--
Gitblit v1.8.0