From c2580fb8de3bdaabb4179b0ce0fcd2fbac802441 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期三, 01 三月 2023 00:49:14 +0800
Subject: [PATCH] 2023-03-01

---
 src/tabviews/zshare/actionList/index.scss                                        |    1 
 src/tabviews/custom/components/table/base-table/index.jsx                        |    6 
 src/assets/css/viewstyle.scss                                                    |    5 
 src/tabviews/custom/components/module/account/index.jsx                          |   81 ++++-
 src/tabviews/zshare/actionList/popupbutton/index.jsx                             |    2 
 src/templates/zshare/verifycard/customscript/index.jsx                           |    8 
 public/options.json                                                              |   10 
 src/tabviews/zshare/actionList/excelInbutton/excelin/index.jsx                   |    2 
 src/tabviews/zshare/actionList/exceloutbutton/index.jsx                          |   79 ++++
 src/tabviews/custom/components/table/edit-table/index.jsx                        |    4 
 src/views/tabledesign/index.jsx                                                  |   17 +
 src/menu/components/table/edit-table/options.jsx                                 |   15 +
 src/tabviews/zshare/actionList/normalbutton/index.jsx                            |    4 
 src/menu/components/table/edit-table/columns/editColumn/index.jsx                |   24 
 src/views/mobdesign/index.jsx                                                    |   19 +
 src/menu/components/table/edit-table/index.jsx                                   |    8 
 src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx             |    9 
 src/views/menudesign/index.jsx                                                   |   21 +
 src/menu/components/table/edit-table/columns/editColumn/formconfig.jsx           |   28 +
 src/tabviews/custom/components/module/voucher/index.jsx                          |    2 
 src/views/pcdesign/index.jsx                                                     |   19 +
 src/menu/components/share/actioncomponent/formconfig.jsx                         |   30 ++
 src/tabviews/custom/components/table/normal-table/index.jsx                      |   13 
 src/tabviews/custom/components/timeline/normal-timeline/index.jsx                |    1 
 src/tabviews/custom/components/table/edit-table/normalTable/index.jsx            |  146 +++++----
 src/tabviews/custom/components/module/account/index.scss                         |    9 
 src/tabviews/custom/components/table/edit-table/normalTable/index.scss           |    5 
 src/menu/components/share/actioncomponent/actionform/index.jsx                   |    3 
 src/tabviews/custom/components/module/voucher/voucherTable/index.jsx             |   15 +
 src/menu/components/table/edit-table/columns/index.scss                          |    1 
 src/menu/components/module/account/options.jsx                                   |   16 +
 src/templates/sharecomponent/actioncomponent/verifyexcelout/datasource/index.jsx |   42 ++
 src/menu/components/table/normal-table/columns/index.jsx                         |    1 
 src/menu/components/table/edit-table/columns/index.jsx                           |  193 +++++++++----
 34 files changed, 608 insertions(+), 231 deletions(-)

diff --git a/public/options.json b/public/options.json
index bedcbee..4e405d0 100644
--- a/public/options.json
+++ b/public/options.json
@@ -1,12 +1,12 @@
 {
-  "appId": "202108312122504607B107A83F55B40C98CCF",
-  "appkey": "20210831212235413F287EC3BF489424496C8",
+  "appId": "201912040924165801464FF1788654BC5AC73",
+  "appkey": "20191106103859640976D6E924E464D029CF0",
   "mainSystemApi": "http://sso.mk9h.cn/cloud/webapi/dostars",
   "systemType": "",
   "externalDatabase": "",
   "lineColor": "",
   "filter": "false",
-  "defaultApp": "mkindustry",
+  "defaultApp": "mk",
   "defaultLang": "zh-CN",
   "WXAppID": "",
   "WXminiAppID": "",
@@ -17,6 +17,6 @@
   "transfer": "false",
   "keepPassword": "true",
   "platforms": ["H5", "wechat", "android", "ios", "wxMiniProgram"],
-  "host": "http://demo.mk9h.cn",
-  "service": "erp_new/"
+  "host": "http://qingqiumarket.cn",
+  "service": "MKWMS/"
 }
\ No newline at end of file
diff --git a/src/assets/css/viewstyle.scss b/src/assets/css/viewstyle.scss
index b79b5a2..0bd4ba1 100644
--- a/src/assets/css/viewstyle.scss
+++ b/src/assets/css/viewstyle.scss
@@ -293,6 +293,11 @@
     .ant-pagination-next:hover .ant-pagination-item-link {
       color: $color6;
     }
+    .ant-pagination-options {
+      > div:not(:first-child) {
+        z-index: 1;
+      }
+    }
   }
   // 琛ㄦ牸鎺掑簭鍥炬爣
   .ant-table-thead > tr > th .ant-table-column-sorter .ant-table-column-sorter-inner .ant-table-column-sorter-up.on, .ant-table-thead > tr > th .ant-table-column-sorter .ant-table-column-sorter-inner .ant-table-column-sorter-down.on {
diff --git a/src/menu/components/module/account/options.jsx b/src/menu/components/module/account/options.jsx
index 9d027e8..8faa66c 100644
--- a/src/menu/components/module/account/options.jsx
+++ b/src/menu/components/module/account/options.jsx
@@ -35,13 +35,27 @@
     },
     {
       type: 'radio',
+      field: 'readonly',
+      label: '鍙',
+      initval: wrap.readonly || 'false',
+      required: true,
+      options: [
+        {value: 'false', label: '鍚�'},
+        {value: 'true', label: '鏄�'},
+      ],
+      controlFields: [
+        {field: 'addable', values: ['false']},
+      ]
+    },
+    {
+      type: 'radio',
       field: 'addable',
       label: '鍙柊澧�',
       initval: wrap.addable || 'false',
       required: true,
       options: [
-        {value: 'true', label: '鏄�'},
         {value: 'false', label: '鍚�'},
+        {value: 'true', label: '鏄�'},
       ],
       controlFields: [
         {field: 'linkmenu', values: ['true']},
diff --git a/src/menu/components/share/actioncomponent/actionform/index.jsx b/src/menu/components/share/actioncomponent/actionform/index.jsx
index b78ff7f..0beb228 100644
--- a/src/menu/components/share/actioncomponent/actionform/index.jsx
+++ b/src/menu/components/share/actioncomponent/actionform/index.jsx
@@ -214,6 +214,9 @@
       if (Ot === 'required') {
         shows.push('progress')
       }
+      if (Ot === 'required' && (intertype === 'inner' || intertype === 'system')) {
+        shows.push('execType')
+      }
       if (this.record.openmenu && this.record.openmenu !== 'goback') {
         shows.push('open')
       }
diff --git a/src/menu/components/share/actioncomponent/formconfig.jsx b/src/menu/components/share/actioncomponent/formconfig.jsx
index 2a0179a..1eab40a 100644
--- a/src/menu/components/share/actioncomponent/formconfig.jsx
+++ b/src/menu/components/share/actioncomponent/formconfig.jsx
@@ -1075,6 +1075,21 @@
     },
     {
       type: 'radio',
+      key: 'execType',
+      label: '璇锋眰鏂瑰紡',
+      initVal: card.execType || 'multi',
+      tooltip: '閫変腑澶氭潯鏁版嵁鏃剁殑璇锋眰鏂瑰紡锛屾敞锛氬綋閫変腑鏁版嵁瓒呰繃20鏉℃椂灏嗛�愭潯璇锋眰銆�',
+      required: false,
+      options: [{
+        value: 'multi',
+        text: '鎵归噺璇锋眰'
+      }, {
+        value: 'single',
+        text: '閫愭潯璇锋眰'
+      }]
+    },
+    {
+      type: 'radio',
       key: 'progress',
       label: '杩涘害鎻愮ず',
       initVal: card.progress || 'number',
@@ -1804,6 +1819,21 @@
     },
     {
       type: 'radio',
+      key: 'execType',
+      label: '璇锋眰鏂瑰紡',
+      initVal: card.execType || 'multi',
+      tooltip: '閫変腑澶氭潯鏁版嵁鏃剁殑璇锋眰鏂瑰紡锛屾敞锛氬綋閫変腑鏁版嵁瓒呰繃20鏉℃椂灏嗛�愭潯璇锋眰銆�',
+      required: false,
+      options: [{
+        value: 'multi',
+        text: '鎵归噺璇锋眰'
+      }, {
+        value: 'single',
+        text: '閫愭潯璇锋眰'
+      }]
+    },
+    {
+      type: 'radio',
       key: 'progress',
       label: '杩涘害鎻愮ず',
       initVal: card.progress || 'number',
diff --git a/src/menu/components/table/edit-table/columns/editColumn/formconfig.jsx b/src/menu/components/table/edit-table/columns/editColumn/formconfig.jsx
index bd69d85..6120716 100644
--- a/src/menu/components/table/edit-table/columns/editColumn/formconfig.jsx
+++ b/src/menu/components/table/edit-table/columns/editColumn/formconfig.jsx
@@ -14,7 +14,8 @@
     roleList = []
   }
 
-  if (['picture', 'link', 'colspan'].includes(card.type)) {
+  // if (['picture', 'link', 'colspan'].includes(card.type)) {
+  if (['picture', 'link'].includes(card.type)) {
     card.type = 'text'
   }
 
@@ -31,8 +32,11 @@
     value: 'custom',
     text: '鑷畾涔夊垪'
   }, {
-    value: 'action',
-    text: '鎿嶄綔'
+    value: 'colspan',
+    text: '鍚堝苟鍒�'
+  // }, {
+  //   value: 'action',
+  //   text: '鎿嶄綔'
   }, {
     value: 'formula',
     text: '鍏紡'
@@ -40,6 +44,13 @@
     value: 'index',
     text: '搴忓彿'
   }]
+
+  if (!card.isSub) {
+    options.push({
+      value: 'action',
+      text: '鎿嶄綔'
+    })
+  }
 
   let editCols = [
     {
@@ -60,6 +71,15 @@
       editCols.push({
         field: col.uuid,
         label: col.label
+      })
+    } else if (col.type === 'colspan') {
+      col.subcols.forEach(subcol => {
+        if (subcol.editable === 'true' && subcol.uuid !== card.uuid) {
+          editCols.push({
+            field: subcol.uuid,
+            label: col.label + '-' + subcol.label
+          })
+        }
       })
     }
   })
@@ -116,7 +136,7 @@
       type: 'radio',
       key: 'IsSort',
       label: '鎺掑簭',
-      initVal: card.IsSort || 'false',
+      initVal: card.IsSort || (card.isSub ? 'false' : 'true'),
       required: true,
       options: [{
         value: 'true',
diff --git a/src/menu/components/table/edit-table/columns/editColumn/index.jsx b/src/menu/components/table/edit-table/columns/editColumn/index.jsx
index 88c227d..e445b43 100644
--- a/src/menu/components/table/edit-table/columns/editColumn/index.jsx
+++ b/src/menu/components/table/edit-table/columns/editColumn/index.jsx
@@ -17,6 +17,7 @@
   number: ['label', 'field', 'type', 'Align', 'Hide', 'IsSort', 'Width', 'decimal', 'format', 'prefix', 'postfix', 'editable', 'initval', 'sum', 'blacklist'],
   textarea: ['label', 'field', 'type', 'Align', 'Hide', 'Width', 'prefix', 'initval', 'postfix', 'blacklist'],
   custom: ['label', 'type', 'Align', 'Hide', 'Width', 'blacklist'],
+  colspan: ['label', 'type', 'Align', 'Hide', 'blacklist'],
   action: ['label', 'type', 'Align', 'Width'],
   formula: ['label', 'type', 'Align', 'Hide', 'Width', 'prefix', 'postfix', 'eval', 'formula', 'blacklist'],
   index: ['label', 'type', 'Align', 'Width']
@@ -131,7 +132,7 @@
           return item
         })
       }, () => {
-        if (value === 'action') {
+        if (value === 'action' || value === 'colspan') {
           this.props.form.setFieldsValue({Align: 'center'})
         }
       })
@@ -349,21 +350,18 @@
   }
 
   handleSubmit = () => {
-    const { columns, column } = this.props
+    // const { columns } = this.props
     // 琛ㄥ崟鎻愪氦鏃舵鏌ヨ緭鍏ュ�兼槸鍚︽纭�
     this.props.form.validateFieldsAndScroll((err, values) => {
       if (!err) {
-        values.uuid = column.uuid
-        values.marks = column.marks || []
-        
-        if (values.field && columns.filter(col => col.field && col.uuid !== values.uuid && col.field === values.field).length > 0) {
-          notification.warning({
-            top: 92,
-            message: '瀛楁宸叉坊鍔狅紒',
-            duration: 5
-          })
-          return
-        }
+        // if (values.field && columns.filter(col => col.field && col.uuid !== values.uuid && col.field === values.field).length > 0) {
+        //   notification.warning({
+        //     top: 92,
+        //     message: '瀛楁宸叉坊鍔狅紒',
+        //     duration: 5
+        //   })
+        //   return
+        // }
         this.setState({visible: false, formlist: null})
         this.props.submitCol(values)
 
diff --git a/src/menu/components/table/edit-table/columns/index.jsx b/src/menu/components/table/edit-table/columns/index.jsx
index 319b9af..afa1eba 100644
--- a/src/menu/components/table/edit-table/columns/index.jsx
+++ b/src/menu/components/table/edit-table/columns/index.jsx
@@ -59,31 +59,57 @@
       </th>
     )
 
-    let style = {cursor: 'move', textAlign: align}
-    if (column.Width) {
-      style.width = column.Width
-      style.minWidth = column.Width
-    }
+    if (index !== undefined) {
+      let style = {cursor: 'move', textAlign: align}
+      if (column.Width) {
+        style.width = column.Width
+        style.minWidth = column.Width
+      }
 
-    return connectDragSource(
-      connectDropTarget(<th {...restProps} index={index} style={style} onDoubleClick={() => this.props.editColumn(column)}>
-        <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
-          <div className="mk-popover-control" onDoubleClick={(e) => e.stopPropagation()}>
-            {['custom', 'action'].includes(column.type) ?
-              <PlusOutlined className="plus" title="娣诲姞" onClick={() => this.props.addElement(column)} /> : null
-            }
-            <EditOutlined className="edit" title="缂栬緫" onClick={() => this.props.editColumn(column)} />
-            {column.type === 'custom' ? <PasteComponent options={['customCardElement']} updateConfig={(res, resolve) => this.props.pasteCell(column, res, resolve)} /> : null}
-            {column.type === 'action' ? <PasteComponent options={['action']} updateConfig={(res, resolve) => this.props.pasteCell(column, res, resolve)} /> : null}
-            {column.type === 'custom' || column.type === 'action' ? <FontColorsOutlined className="style" title="璋冩暣鏍峰紡" onClick={() => this.props.changeStyle(column)}/> : null}
-            <DeleteOutlined className="close" title="鍒犻櫎" onClick={this.deleteCol} />
-            {['text', 'number', 'formula'].includes(column.type) ? <MarkColumn field={column.field || ''} columns={fields} marks={column.marks} onSubmit={this.updateMarks} /> : null }
-          </div>
-        } trigger="hover">
-          {children}
-        </Popover>
-      </th>),
-    )
+      return connectDragSource(
+        connectDropTarget(<th {...restProps} index={index} style={style} onDoubleClick={() => this.props.editColumn(column)}>
+          <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
+            <div className="mk-popover-control" onDoubleClick={(e) => e.stopPropagation()}>
+              {['custom', 'colspan', 'action'].includes(column.type) ?
+                <PlusOutlined className="plus" title="娣诲姞" onClick={() => this.props.addElement(column)} /> : null
+              }
+              <EditOutlined className="edit" title="缂栬緫" onClick={() => this.props.editColumn(column)} />
+              {column.type === 'custom' ? <PasteComponent options={['customCardElement']} updateConfig={(res, resolve) => this.props.pasteCell(column, res, resolve)} /> : null}
+              {column.type === 'action' ? <PasteComponent options={['action']} updateConfig={(res, resolve) => this.props.pasteCell(column, res, resolve)} /> : null}
+              {column.type === 'custom' || column.type === 'action' ? <FontColorsOutlined className="style" title="璋冩暣鏍峰紡" onClick={() => this.props.changeStyle(column)}/> : null}
+              <DeleteOutlined className="close" title="鍒犻櫎" onClick={this.deleteCol} />
+              {['text', 'number', 'formula'].includes(column.type) ? <MarkColumn field={column.field || ''} columns={fields} marks={column.marks} onSubmit={this.updateMarks} /> : null }
+            </div>
+          } trigger="hover">
+            {children}
+          </Popover>
+        </th>),
+      )
+    } else if (column) {
+      let style = {textAlign: align}
+      if (column.Width) {
+        style.width = column.Width
+        style.minWidth = column.Width
+      }
+
+      return (
+        <th {...restProps} style={style} key={column.uuid} onDoubleClick={() => this.props.editColumn(column)}>
+          <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
+            <div className="mk-popover-control" onDoubleClick={(e) => e.stopPropagation()}>
+              {['custom', 'colspan'].includes(column.type) ?
+                <PlusOutlined className="plus" title="娣诲姞" onClick={() => this.props.addElement(column)} /> : null
+              }
+              <EditOutlined className="edit" title="缂栬緫" onClick={() => this.props.editColumn(column)} />
+              {column.type === 'custom' ? <PasteComponent options={['customCardElement']} updateConfig={(res, resolve) => this.props.pasteCell(column, res, resolve)} /> : null}
+              <DeleteOutlined className="close" title="鍒犻櫎" onClick={this.deleteCol} />
+              {column && ['text', 'number', 'formula'].includes(column.type) ? <MarkColumn field={column.field || ''} columns={fields} marks={column.marks} onSubmit={this.updateMarks} /> : null }
+            </div>
+          } trigger="hover">
+            {children}
+          </Popover>
+        </th>
+      )
+    }
   }
 }
 
@@ -267,12 +293,14 @@
     let _columns = fromJS(this.state.columns).toJS()
     let type = item.subType
 
-    if (!['text', 'number', 'textarea', 'custom', 'action', 'formula', 'index'].includes(item.subType)) {
+    if (!['text', 'number', 'textarea', 'custom', 'action', 'formula', 'index', 'colspan'].includes(item.subType)) {
       type = 'text'
     }
 
     let col = { focus: true, uuid: Utils.getuuid(), label: 'label', field: '', type: type, elements: [] }
-    if (col.type === 'action') {
+    if (col.type === 'colspan') {
+      col.subcols = []
+    } else if (col.type === 'action') {
       col.label = '鎿嶄綔'
     } else if (col.type === 'index') {
       col.label = '搴忓彿'
@@ -287,14 +315,21 @@
     })
   }
 
-  updateCol = (col, btn) => {
-    let _columns = fromJS(this.state.columns).toJS()
-    _columns = _columns.map(column => {
+  loopCol = (columns, col) => {
+    return columns.map(column => {
+      if (column.type === 'colspan') {
+        column.subcols = this.loopCol(column.subcols || [], col)
+      }
       if (column.uuid === col.uuid) {
         return col
       }
       return column
     })
+  }
+
+  updateCol = (col, btn) => {
+    let _columns = fromJS(this.state.columns).toJS()
+    _columns = this.loopCol(_columns, col)
 
     this.setState({
       columns: _columns,
@@ -331,7 +366,16 @@
   addElement = (col) => {
     let column = fromJS(col).toJS()
 
-    if (column.type === 'custom') {
+    if (column.type === 'colspan') {
+      column.subcols = column.subcols || []
+      let subcol = { isSub: true, focus: true, uuid: Utils.getuuid(), label: 'label', field: '', type: 'text' }
+      column.subcols.push(subcol)
+
+      this.setState({
+        card: subcol
+      })
+      this.updateCol(column)
+    } else if (column.type === 'custom') {
       let newcard = {uuid: Utils.getuuid(), focus: true, width: 24, eleType: 'text', datatype: 'dynamic', style: {paddingLeft: '4px'}}
   
       // 娉ㄥ唽浜嬩欢-娣诲姞鍏冪礌
@@ -358,7 +402,13 @@
   submitCol = (col) => {
     const { card } = this.state
     
-    if (col.type === 'custom') {
+    col.uuid = card.uuid
+    col.isSub = card.isSub === true
+    col.marks = card.marks || []
+
+    if (col.type === 'colspan') {
+      col.subcols = card.subcols || []
+    } else if (col.type === 'custom') {
       col.style = card.style || {}
       col.elements = card.type === 'custom' ? (card.elements || []) : []
     } else if (col.type === 'action') {
@@ -410,10 +460,19 @@
     this.setState({card: null})
   }
 
+  loopDelCol = (columns, col) => {
+    return columns.filter(column => {
+      if (column.type === 'colspan') {
+        column.subcols = this.loopDelCol(column.subcols, col)
+      }
+      return column.uuid !== col.uuid
+    })
+  }
+
   deleteCol = (col) => {
     let _columns = fromJS(this.state.columns).toJS()
 
-    _columns = _columns.filter(column => column.uuid !== col.uuid)
+    _columns = this.loopDelCol(_columns, col)
 
     this.setState({
       columns: _columns
@@ -541,6 +600,43 @@
     MKEmitter.removeListener('submitStyle', this.getStyle)
   }
 
+  handlecolumns = (columns, fields, config, isSub) => {
+    return columns.map((col, index) => {
+      let title = col.label
+      if (col.editable === 'true') {
+        title = <span>{col.label}<EditOutlined style={{position: 'absolute', bottom: 0, right: 0, color: '#1890ff', opacity: '0.7'}}/></span>
+      }
+
+      return {
+        title: title,
+        dataIndex: col.uuid,
+        align: col.Align,
+        sorter: col.IsSort === 'true',
+        onCell: () => ({
+          column: col,
+          width: col.Width,
+          config: config,
+          upComponent: this.updateCol
+        }),
+        onHeaderCell: () => ({
+          index: isSub ? undefined : index,
+          column: col,
+          fields: fields,
+          align: col.Align,
+          moveCol: this.moveCol,
+          dropCol: this.dropCol,
+          updateCol: this.updateCol,
+          addElement: this.addElement,
+          editColumn: this.editColumn,
+          pasteCell: this.pasteCell,
+          changeStyle: this.changeStyle,
+          deleteCol: this.deleteCol,
+        }),
+        children: col.subcols && col.subcols.length ? this.handlecolumns(col.subcols, fields, config, true) : null,
+      }
+    })
+  }
+
   render() {
     const { config } = this.props
     const { fields, card, lineMarks, tableId, visible } = this.state
@@ -560,38 +656,7 @@
       }
     }
 
-    const columns = this.state.columns.map((col, index) => {
-      let title = col.label
-      if (col.editable === 'true') {
-        title = <span>{col.label}<EditOutlined style={{position: 'absolute', bottom: 0, right: 0, color: '#1890ff', opacity: '0.7'}}/></span>
-      }
-      return {
-        title: title,
-        dataIndex: col.uuid,
-        align: col.Align,
-        sorter: col.IsSort === 'true',
-        onCell: () => ({
-          column: col,
-          width: col.Width,
-          config: config,
-          upComponent: this.updateCol
-        }),
-        onHeaderCell: () => ({
-          index,
-          column: col,
-          fields: fields,
-          align: col.Align,
-          moveCol: this.moveCol,
-          dropCol: this.dropCol,
-          updateCol: this.updateCol,
-          addElement: this.addElement,
-          editColumn: this.editColumn,
-          pasteCell: this.pasteCell,
-          changeStyle: this.changeStyle,
-          deleteCol: this.deleteCol,
-        }),
-      }
-    })
+    const columns = this.handlecolumns(this.state.columns, fields, config)
 
     return (
       <div className={`edit-table-columns ${config.setting.laypage} ${config.wrap.mode || ''} table-vertical-${config.wrap.vertical || ''}`} id={tableId}>
diff --git a/src/menu/components/table/edit-table/columns/index.scss b/src/menu/components/table/edit-table/columns/index.scss
index b7e3f7b..0accff1 100644
--- a/src/menu/components/table/edit-table/columns/index.scss
+++ b/src/menu/components/table/edit-table/columns/index.scss
@@ -113,6 +113,7 @@
     }
     >.anticon-copy {
       color: #26C281;
+      margin-left: 5px;
     }
     >.anticon-delete {
       color: #ff4d4f;
diff --git a/src/menu/components/table/edit-table/index.jsx b/src/menu/components/table/edit-table/index.jsx
index ec5c659..ac0caff 100644
--- a/src/menu/components/table/edit-table/index.jsx
+++ b/src/menu/components/table/edit-table/index.jsx
@@ -350,6 +350,14 @@
         if (col.format === 'abs') {
           config.absFields.push(col.field)
         }
+      } else if (col.type === 'colspan' && col.subcols) {
+        col.subcols.forEach(scol => {
+          if (scol.type === 'number') {
+            if (scol.format === 'abs') {
+              config.absFields.push(scol.field)
+            }
+          }
+        })
       }
     })
 
diff --git a/src/menu/components/table/edit-table/options.jsx b/src/menu/components/table/edit-table/options.jsx
index d04ef9a..9e47b44 100644
--- a/src/menu/components/table/edit-table/options.jsx
+++ b/src/menu/components/table/edit-table/options.jsx
@@ -62,6 +62,9 @@
       options: [
         {value: 'true', label: '鍙紪杈�'},
         {value: 'false', label: '涓嶅彲缂栬緫'},
+      ],
+      controlFields: [
+        {field: 'switchable', values: ['true']},
       ]
     },
     {
@@ -280,6 +283,18 @@
       forbid: !appType || sessionStorage.getItem('editMenuType') === 'popview'
     },
     {
+      type: 'radio',
+      field: 'switchable',
+      label: '鐘舵�佸垏鎹�',
+      initval: wrap.switchable || 'true',
+      tooltip: '鏄惁鍙互鍦ㄧ紪杈戝拰榛樿table鐘舵�侀棿鍒囨崲銆�',
+      required: false,
+      options: [
+        {value: 'true', label: '鍚敤'},
+        {value: 'false', label: '绂佺敤'},
+      ]
+    },
+    {
       type: 'multiselect',
       field: 'blacklist',
       label: '榛戝悕鍗�',
diff --git a/src/menu/components/table/normal-table/columns/index.jsx b/src/menu/components/table/normal-table/columns/index.jsx
index 6477d10..917976c 100644
--- a/src/menu/components/table/normal-table/columns/index.jsx
+++ b/src/menu/components/table/normal-table/columns/index.jsx
@@ -501,7 +501,6 @@
         title: col.label,
         dataIndex: col.uuid,
         align: col.Align,
-        // sorter: !isSub && col.IsSort === 'true',
         sorter: col.IsSort === 'true',
         onCell: () => ({
           column: col,
diff --git a/src/tabviews/custom/components/module/account/index.jsx b/src/tabviews/custom/components/module/account/index.jsx
index 943e10d..14f4937 100644
--- a/src/tabviews/custom/components/module/account/index.jsx
+++ b/src/tabviews/custom/components/module/account/index.jsx
@@ -1,7 +1,7 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { is, fromJS } from 'immutable'
-import { notification, Select, Divider } from 'antd'
+import { notification, Select, Divider, Modal } from 'antd'
 import { PlusOutlined } from '@ant-design/icons'
 import moment from 'moment'
 
@@ -11,6 +11,7 @@
 import './index.scss'
 
 const { Option } = Select
+const { confirm } = Modal
 
 class AccountModule extends Component {
   static propTpyes = {
@@ -82,31 +83,63 @@
   }
 
   changeBook = (value) => {
-    const { books } = this.state
+    const { books, activeItem } = this.state
 
-    let activeItem = books.filter(item => item.id === value)[0]
+    let Item = books.filter(item => item.id === value)[0]
 
-    this.setState({activeItem})
-
-    if (activeItem) {
-      MKEmitter.emit('resetSelectLine', this.props.config.uuid, activeItem.id, activeItem)
-      
-      let userid = sessionStorage.getItem('UserID') || ''
-      let sid = localStorage.getItem('SessionUid') || ''
-      let param = {
-        func: 'sPC_TableData_InUpDe',
-        LText: `delete  tmp_session_show_key where createuserid='${userid}' and createuser='${sid}' and key_type='fcc_years'
-          insert into tmp_session_show_key ( key_id,key_type,createuserid,CreateUser,CreateStaff) 
-          select '${activeItem.id}','fcc_years','${userid}','${sid}','${sessionStorage.getItem('Full_Name') || ''}'`,
-        exec_type: 'y'
-      }
-  
-      param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
-      param.secretkey = Utils.encrypt('', param.timestamp)
-      param.LText = Utils.formatOptions(param.LText)
-
-      Api.genericInterface(param)
+    if (!activeItem && Item) {
+      this.setBook(Item)
+    } else if (Item) {
+      const _this = this
+      confirm({
+        title: '纭畾鍒囨崲璐﹀鍚楋紵',
+        content: '鍒囨崲璐﹀鏃剁郴缁熼渶瑕佸埛鏂般��',
+        onOk() {
+          return new Promise(resolve => {
+            _this.setBook(Item, resolve)
+          })
+        },
+        onCancel() {}
+      })
     }
+  }
+
+  setBook = (item, resolve) => {
+    if (!resolve) {
+      this.setState({activeItem: item})
+  
+      MKEmitter.emit('resetSelectLine', this.props.config.uuid, item.id, item)
+    }
+    
+    let userid = sessionStorage.getItem('UserID') || ''
+    let sid = localStorage.getItem('SessionUid') || ''
+    let param = {
+      func: 'sPC_TableData_InUpDe',
+      LText: `delete  tmp_session_show_key where createuserid='${userid}' and createuser='${sid}' and key_type='fcc_years'
+        insert into tmp_session_show_key ( key_id,key_type,createuserid,CreateUser,CreateStaff) 
+        select '${item.id}','fcc_years','${userid}','${sid}','${sessionStorage.getItem('Full_Name') || ''}'`,
+      exec_type: 'y'
+    }
+
+    param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+    param.secretkey = Utils.encrypt('', param.timestamp)
+    param.LText = Utils.formatOptions(param.LText)
+
+    Api.genericInterface(param).then(res => {
+      if (!res.status) {
+        notification.warning({
+          top: 92,
+          message: res.message,
+          duration: 5
+        })
+        resolve && resolve()
+        return
+      }
+
+      if (resolve) {
+        window.location.reload()
+      }
+    })
   }
 
   addBook = () => {
@@ -150,7 +183,7 @@
           {books.map(item => (
             <Option disabled={!item.months} key={item.id}>{item.account_name}</Option>
           ))}
-        </Select> : <Select value={activeItem ? activeItem.id : ''} placeholder="璇烽�夋嫨璐﹀" onChange={this.changeBook}>
+        </Select> : <Select value={activeItem ? activeItem.id : ''} disabled={config.wrap.readonly === 'true'} placeholder="璇烽�夋嫨璐﹀" onChange={this.changeBook}>
           {books.map(item => (
             <Option disabled={!item.months} key={item.id}>{item.account_name}</Option>
           ))}
diff --git a/src/tabviews/custom/components/module/account/index.scss b/src/tabviews/custom/components/module/account/index.scss
index 4b04107..1821b31 100644
--- a/src/tabviews/custom/components/module/account/index.scss
+++ b/src/tabviews/custom/components/module/account/index.scss
@@ -16,6 +16,15 @@
   .date {
     margin-left: 15px;
   }
+  .ant-select.ant-select-disabled {
+    .ant-select-selection:hover {
+      border-color: #d9d9d9;
+    }
+    .ant-select-selection, .ant-select-selection:focus, .ant-select-selection:active {
+      border-color: #d9d9d9;
+      box-shadow: none;
+    }
+  }
 }
 
 .mk-add-book {
diff --git a/src/tabviews/custom/components/module/voucher/index.jsx b/src/tabviews/custom/components/module/voucher/index.jsx
index aae840b..c230975 100644
--- a/src/tabviews/custom/components/module/voucher/index.jsx
+++ b/src/tabviews/custom/components/module/voucher/index.jsx
@@ -83,7 +83,7 @@
     }
 
     // config.wrap.type = 'checkVoucher'
-    // BID = '20230214130744811P0K95RQ155KG0QIQOFV'
+    // BID = '20230228173542370E2F4FC1773704C29A6A4'
 
     // config.wrap.type = 'checkTemp'
     // BID = '20230214174458780MFR8IA576ON4VKNOLVH'
diff --git a/src/tabviews/custom/components/module/voucher/voucherTable/index.jsx b/src/tabviews/custom/components/module/voucher/voucherTable/index.jsx
index 327a6c9..2acf108 100644
--- a/src/tabviews/custom/components/module/voucher/voucherTable/index.jsx
+++ b/src/tabviews/custom/components/module/voucher/voucherTable/index.jsx
@@ -191,6 +191,16 @@
     let line = {...record}
     line[col.field] = value
 
+    if (col.field === 'subject_voucher_text') {
+      MKEmitter.emit('changeRecord', col.tableId, line)
+
+      setTimeout(() => {
+        let cl = {subject_voucher_text: 'subject_code', subject_code: 'debit', debit: 'credit'}
+        MKEmitter.emit('tdFocus', cl[col.uuid] + record.uuid)
+      }, 50)
+      return
+    }
+
     if (col.field === 'debit') {
       line.credit = ''
       if (isNaN(line.debit)) {
@@ -260,6 +270,11 @@
     if (value !== record[col.field]) {
       let line = {...record, [col.field]: value}
 
+      if (col.field === 'subject_voucher_text') {
+        MKEmitter.emit('changeRecord', col.tableId, line)
+        return
+      }
+
       if (col.field === 'debit') {
         line.credit = ''
         if (isNaN(line.debit)) {
diff --git a/src/tabviews/custom/components/table/base-table/index.jsx b/src/tabviews/custom/components/table/base-table/index.jsx
index 08bd627..80579fb 100644
--- a/src/tabviews/custom/components/table/base-table/index.jsx
+++ b/src/tabviews/custom/components/table/base-table/index.jsx
@@ -75,12 +75,6 @@
       setting.orisel = true
     }
 
-    _config.cols.forEach(column => {
-      if (column.type === 'action') {
-        column.operations = column.elements
-      }
-    })
-
     _config.style = _config.style || {}
 
     this.setState({
diff --git a/src/tabviews/custom/components/table/edit-table/index.jsx b/src/tabviews/custom/components/table/edit-table/index.jsx
index c8c762b..3496def 100644
--- a/src/tabviews/custom/components/table/edit-table/index.jsx
+++ b/src/tabviews/custom/components/table/edit-table/index.jsx
@@ -111,10 +111,6 @@
         })
       }
 
-      if (column.type === 'action') {
-        column.operations = column.elements
-      }
-
       _columns.push(column)
     })
 
diff --git a/src/tabviews/custom/components/table/edit-table/normalTable/index.jsx b/src/tabviews/custom/components/table/edit-table/normalTable/index.jsx
index bcf4ee3..8c85c47 100644
--- a/src/tabviews/custom/components/table/edit-table/normalTable/index.jsx
+++ b/src/tabviews/custom/components/table/edit-table/normalTable/index.jsx
@@ -916,7 +916,7 @@
     pageIndex: 1,         // 鍒濆椤甸潰绱㈠紩
     pageSize: 10,         // 姣忛〉鏁版嵁鏉℃暟
     columns: null,        // 鏄剧ず鍒�
-    fields: [],
+    forms: [],
     pickup: false,        // 鏀惰捣鏈�夋嫨椤�
     orderfields: {},      // 鎺掑簭id涓巉ield杞崲
     loading: false,
@@ -932,51 +932,81 @@
 
     let _columns = []
     let deForms = []
-    columns.forEach(item => {
-      if (!initEditLine && item.editable === 'true') {
-        initEditLine = item
-      }
+    let _forms = {}
 
-      if (item.type === 'text' && item.editable === 'true' && item.editType === 'select' && item.resourceType === '1') {
-        let _option = Utils.getSelectQueryOptions(item)
+    let getColumns = (cols) => {
+      return cols.map(item => {
+        let cell = null
+  
+        if (item.type === 'colspan') {
+          cell = { title: item.label, align: item.Align }
+          cell.children = getColumns(item.subcols)
+        } else {
+          if (item.editable === 'true') {
+            _forms[item.field] = item
+            if (!initEditLine) {
+              initEditLine = item
+            }
+          }
+    
+          if (item.type === 'text' && item.editable === 'true' && item.editType === 'select' && item.resourceType === '1') {
+            let _option = Utils.getSelectQueryOptions(item)
+    
+            if (window.GLOB.debugger === true || window.debugger === true) {
+              console.info(_option.sql)
+            }
+    
+            item.base_sql = window.btoa(window.encodeURIComponent(_option.sql))
+            item.arr_field = _option.field
+    
+            deForms.push(item)
+          }
+    
+          if (item.field) {
+            orderfields[item.uuid] = item.field
+          }
 
-        if (window.GLOB.debugger === true || window.debugger === true) {
-          console.info(_option.sql)
+          cell = {
+            align: item.Align,
+            dataIndex: item.uuid,
+            title: item.label,
+            sorter: !!(item.field && item.IsSort === 'true'),
+            width: item.Width || 120,
+            $type: item.type,
+            onCell: record => ({
+              record,
+              col: item,
+              config: item.type === 'custom' || item.type === 'action' ? {setting, columns: fields} : null,
+            })
+          }
         }
+  
+        return cell
+      })
+    }
+    _columns = getColumns(columns)
 
-        item.base_sql = window.btoa(window.encodeURIComponent(_option.sql))
-        item.arr_field = _option.field
+    let forms = []
+    fields.forEach(item => {
+      if (item.field === setting.primaryKey) return
 
-        deForms.push(item)
+      if (_forms[item.field]) {
+        forms.push({..._forms[item.field], datatype: item.datatype})
+      } else {
+        forms.push(item)
       }
+    })
 
-      if (item.field) {
-        orderfields[item.uuid] = item.field
+    _columns.forEach(item => {
+      if (item.$type === 'action') return
+
+      let _copy = fromJS(item).toJS()
+      _copy.sorter = false
+
+      if (item.editable === 'true') {
+        _copy.title = <span>{item.label}<EditOutlined className="system-color mk-edit-sign"/></span>
       }
-
-      let _item = {
-        align: item.Align,
-        dataIndex: item.uuid,
-        title: item.label,
-        sorter: item.field && item.IsSort === 'true',
-        width: item.Width || 120,
-        onCell: record => ({
-          record,
-          col: item,
-          config: item.type === 'custom' || item.type === 'action' ? {setting, columns: fields} : null,
-        })
-      }
-
-      if (item.type !== 'action') {
-        let _copy = fromJS(_item).toJS()
-        _copy.sorter = false
-
-        if (item.editable === 'true') {
-          _copy.title = <span>{item.label}<EditOutlined className="system-color mk-edit-sign"/></span>
-        }
-        edColumns.push(_copy)
-      }
-      _columns.push(_item)
+      edColumns.push(_copy)
     })
 
     if (setting.delable !== 'false' && setting.operType !== 'buoyMode') {
@@ -993,13 +1023,6 @@
       })
     }
 
-    // if (setting.borderColor) { // 杈规棰滆壊
-    //   let style = `#${setting.tableId} table, #${setting.tableId} tr, #${setting.tableId} th, #${setting.tableId} td {border-color: ${setting.borderColor}}`
-    //   let ele = document.createElement('style')
-    //   ele.innerHTML = style
-    //   document.getElementsByTagName('head')[0].appendChild(ele)
-    // }
-
     let size = (setting.pageSize || 10) + ''
     let pageOptions = ['10', '25', '50', '100', '500', '1000']
 
@@ -1009,6 +1032,7 @@
     }
 
     this.setState({
+      forms,
       pageSize: setting.pageSize || 10,
       pageOptions,
       columns: _columns,
@@ -1035,12 +1059,6 @@
   }
 
   componentDidMount () {
-    const { fields, setting } = this.props
-
-    this.setState({
-      fields: fields.filter(item => item.field !== setting.primaryKey),
-    })
-
     MKEmitter.addListener('subLine', this.subLine)
     MKEmitter.addListener('nextLine', this.nextLine)
     MKEmitter.addListener('addRecord', this.addLine)
@@ -1286,7 +1304,7 @@
   }
 
   subLine = (col, record) => {
-    const { tableId, fields, edData } = this.state
+    const { tableId, forms, edData } = this.state
 
     if (col && col.tableId !== tableId) return
 
@@ -1300,7 +1318,7 @@
     setTimeout(() => {
       let item = fromJS(record).toJS()
       let line = []
-      fields.forEach(col => {
+      forms.forEach(col => {
         if (col.editable !== 'true' || item.$deleted) {
           if (col.type === 'number') {
             item[col.field] = +item[col.field]
@@ -1357,7 +1375,7 @@
   }
 
   plusLine = () => {
-    const { edData, fields, initEditLine } = this.state
+    const { edData, forms, initEditLine } = this.state
 
     let item = {...edData[edData.length - 1]}
 
@@ -1365,7 +1383,7 @@
     item.$type = 'add'
     item.$Index = ''
 
-    fields.forEach(col => {
+    forms.forEach(col => {
       if (col.initval !== '$copy') {
         item[col.field] = col.initval
       }
@@ -1434,7 +1452,7 @@
 
   addLine = (id, record) => {
     const { BID } = this.props
-    const { edData, fields, tableId } = this.state
+    const { edData, forms, tableId } = this.state
 
     if (id) {
       if (id !== tableId) return
@@ -1448,7 +1466,7 @@
       item.$Index = ''
       item.$$BID = BID || ''
   
-      fields.forEach(col => {
+      forms.forEach(col => {
         if (col.initval !== '$copy') {
           item[col.field] = col.initval
         }
@@ -1481,7 +1499,7 @@
         item.$$BID = BID || ''
       }
   
-      fields.forEach(col => {
+      forms.forEach(col => {
         if (col.initval !== '$copy') {
           item[col.field] = col.initval
         }
@@ -1502,7 +1520,7 @@
   }
 
   checkData = () => {
-    const { edData, fields } = this.state
+    const { edData, forms } = this.state
 
     if (edData.length === 0) {
       notification.warning({
@@ -1516,7 +1534,7 @@
     let Index = 1
     let data = fromJS(edData).toJS().map(item => {
       let line = []
-      fields.forEach(col => {
+      forms.forEach(col => {
         if (col.editable !== 'true' || item.$deleted) {
           if (col.type === 'number') {
             item[col.field] = +item[col.field]
@@ -1581,7 +1599,7 @@
 
   submit = (data, type) => {
     const { submit, BID, setting } = this.props
-    const { fields } = this.state
+    const { forms } = this.state
 
     if (type !== 'simple' && (setting.commit === 'change' || setting.commit === 'simple')) {
       data = data.filter(item => !item.$origin)
@@ -1596,7 +1614,7 @@
       return
     }
 
-    let result = getEditTableSql(submit, data, fields)
+    let result = getEditTableSql(submit, data, forms)
 
     let param = {
       excel_in: result.lines,
@@ -1996,9 +2014,9 @@
         </div> : null}
         <div className="edit-custom-table-btn-wrap" style={submit.wrapStyle}>
           {!submit.hasAction && pickup ? <Button style={submit.style} onClick={() => setTimeout(() => {this.checkData()}, 10)} loading={loading} className="submit-table" type="link">鎻愪氦</Button> : null}
-          <Switch title="缂栬緫" className="main-pickup" checkedChildren="寮�" unCheckedChildren="鍏�" disabled={loading || this.props.loading} checked={pickup} onChange={this.pickupChange} />
+          {setting.switchable !== 'false' ? <Switch title="缂栬緫" className="main-pickup" checkedChildren="寮�" unCheckedChildren="鍏�" disabled={loading || this.props.loading} checked={pickup} onChange={this.pickupChange} /> : null}
         </div>
-        <div className={`edit-custom-table ${pickup ? 'editable' : ''} ${setting.tableHeader || ''} ${setting.operType || ''} ${height ? 'fixed-height' : ''} ${setting.mode || ''} table-vertical-${setting.vertical || ''}`} id={tableId}>
+        <div className={`edit-custom-table ${pickup ? 'editable' : ''} ${setting.tableHeader || ''} ${setting.operType || ''} ${height ? 'fixed-height' : ''} ${setting.mode || ''} table-vertical-${setting.vertical || ''} mk-edit-${setting.editType || 'simple'}`} id={tableId}>
           <Table
             rowKey="$$uuid"
             components={components}
diff --git a/src/tabviews/custom/components/table/edit-table/normalTable/index.scss b/src/tabviews/custom/components/table/edit-table/normalTable/index.scss
index 25f0089..6d3798c 100644
--- a/src/tabviews/custom/components/table/edit-table/normalTable/index.scss
+++ b/src/tabviews/custom/components/table/edit-table/normalTable/index.scss
@@ -318,6 +318,11 @@
     }
   }
 }
+.edit-custom-table.mk-edit-multi {
+  th .ant-table-column-title .anticon-edit {
+    display: none;
+  }
+}
 .edit-custom-table.editable {
   td {
     background-color: #ffffff!important;
diff --git a/src/tabviews/custom/components/table/normal-table/index.jsx b/src/tabviews/custom/components/table/normal-table/index.jsx
index efacce5..7f66256 100644
--- a/src/tabviews/custom/components/table/normal-table/index.jsx
+++ b/src/tabviews/custom/components/table/normal-table/index.jsx
@@ -130,19 +130,6 @@
       }
     }
 
-    _config.cols.forEach(column => {
-      if (column.type === 'action') {
-        column.operations = column.elements
-      }
-    })
-
-    // if (setting.color) {
-    //   setting.style.color = setting.color
-    // }
-    // if (setting.fontSize) {
-    //   setting.style.fontSize = setting.fontSize
-    // }
-
     if (_config.wrap.collapse === 'true') {
       _config.wrap.title = _config.wrap.title || ' '
     }
diff --git a/src/tabviews/custom/components/timeline/normal-timeline/index.jsx b/src/tabviews/custom/components/timeline/normal-timeline/index.jsx
index 2d9f4c7..e97abb9 100644
--- a/src/tabviews/custom/components/timeline/normal-timeline/index.jsx
+++ b/src/tabviews/custom/components/timeline/normal-timeline/index.jsx
@@ -257,6 +257,7 @@
       return
     }
 
+    // 鍐呴儴鍑芥暟涓簔_mk_express锛岃〃绀烘煡璇㈠揩閫掍俊鎭�
     if (config.setting.interType === 'inner' && config.setting.innerFunc === 'z_mk_express') {
       this.getExpress()
       return
diff --git a/src/tabviews/zshare/actionList/excelInbutton/excelin/index.jsx b/src/tabviews/zshare/actionList/excelInbutton/excelin/index.jsx
index 86891ed..7610cae 100644
--- a/src/tabviews/zshare/actionList/excelInbutton/excelin/index.jsx
+++ b/src/tabviews/zshare/actionList/excelInbutton/excelin/index.jsx
@@ -45,7 +45,7 @@
         let sheetName = btn.verify.sheet
         let errDetail = ''
 
-        if (Object.keys(workbook.Sheets).length === 1) {
+        if (sheetName === 'Sheet1' && Object.keys(workbook.Sheets).length === 1) {
           sheetName = Object.keys(workbook.Sheets)[0]
         }
 
diff --git a/src/tabviews/zshare/actionList/exceloutbutton/index.jsx b/src/tabviews/zshare/actionList/exceloutbutton/index.jsx
index 41f9ddb..5615c35 100644
--- a/src/tabviews/zshare/actionList/exceloutbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/exceloutbutton/index.jsx
@@ -594,29 +594,68 @@
 
         this.table2excel(column, table, this.state.excelName.replace(/\.xlsx/ig, '.xls'))
 
-        if (btn.verify && btn.verify.enable === 'true' && btn.verify.script) {
+        if (btn.verify.enable === 'true' && btn.verify.script) {
           this.execCustomScript()
         } else {
           this.execSuccess({ErrCode: 'S', ErrMesg: '瀵煎嚭鎴愬姛锛�'})
         }
       } else {
+        let letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+        let cols = []
+
+        for (let index = 0; index < columns.length; index++) {
+          let i = Math.floor(index / 26)
+          let s = letters[i - 1] || ''
+          
+          cols.push(s + letters[index % 26])
+        }
+
+        let table = []
         let _header = []
         let _topRow = {}
         let colwidth = []
         let requires = []
+        let merges = []
 
         columns.forEach((col, i) => {
           _header.push(col.Column)
           _topRow[col.Column] = col.Text
-          colwidth.push({width: col.Width || 20})
+          colwidth.push({wch: col.Width || 20})
           if (col.required === 'true') {
             requires.push(i)
           }
         })
-  
-        let table = []
-  
-        table.push(_topRow)
+
+        if (btn.verify.merge === 'true') {
+          let fLine = {}
+          let sLine = {}
+          let sign = ''
+          columns.forEach((col, i) => {
+            if (/.+-.+/.test(col.Text)) {
+              let _sign = col.Text.split('-')[0]
+              let _name = col.Text.split('-')[1]
+              fLine[col.Column] = _sign
+              sLine[col.Column] = _name
+
+              if (sign === _sign) {
+                merges[merges.length - 1] = merges[merges.length - 1].split(':')[0] + `:${cols[i]}1`
+              } else {
+                merges.push(`${cols[i]}1:${cols[i]}2`)
+                sign = _sign
+              }
+            } else {
+              fLine[col.Column] = col.Text
+              sLine[col.Column] = col.Text
+              sign = ''
+              merges.push(`${cols[i]}1:${cols[i]}2`)
+            }
+          })
+
+          table.push(fLine)
+          table.push(sLine)
+        } else {
+          table.push(_topRow)
+        }
   
         data && data.forEach((item, index) => {
           let _row = {}
@@ -646,22 +685,42 @@
 
         ws['!cols'] = colwidth
 
+        if (btn.verify.rowHeight) {
+          ws['!rows'] = Array(table.length).fill({hpx: btn.verify.rowHeight})
+        }
+
         if (requires.length) {
-          let cols = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
           requires.forEach(col => {
             if (cols[col]) {
               ws[cols[col] + '1'].s = {font: { color: { rgb: 'F5222D' } }}
             }
           })
         }
+
+        if (merges.length) {
+          ws['!merges'] = []
+          merges.forEach(item => {
+            ws['!merges'].push(XLSX.utils.decode_range(item))
+          })
+
+          cols.forEach(col => {
+            if (ws[col + '1'].s) {
+              ws[col + '1'].s = {font: { color: { rgb: 'F5222D' } }, alignment: { horizontal: 'center', vertical: 'center' }}
+            } else {
+              ws[col + '1'].s = {alignment: { horizontal: 'center', vertical: 'center' }}
+            }
+            ws[col + '2'].s = {alignment: { horizontal: 'center', vertical: 'center' }}
+          })
+        }
+
         // ws["A1"].s = {fill: { bgColor: { rgb: "FFFFAA"  }}, font: { color: { rgb: "1890FF" } }}
-  
+
         const wb = XLSX.utils.book_new()
-        XLSX.utils.book_append_sheet(wb, ws, 'Sheet1')
+        XLSX.utils.book_append_sheet(wb, ws, btn.verify.sheet || 'Sheet1')
   
         XLSX.writeFile(wb, this.state.excelName)
   
-        if (btn.verify && btn.verify.enable === 'true' && btn.verify.script) {
+        if (btn.verify.enable === 'true' && btn.verify.script) {
           this.execCustomScript()
         } else {
           this.execSuccess({ErrCode: 'S', ErrMesg: '瀵煎嚭鎴愬姛锛�'})
diff --git a/src/tabviews/zshare/actionList/index.scss b/src/tabviews/zshare/actionList/index.scss
index 8efb160..99ac35f 100644
--- a/src/tabviews/zshare/actionList/index.scss
+++ b/src/tabviews/zshare/actionList/index.scss
@@ -49,6 +49,7 @@
     height: 34px;
     border-radius: 0px;
     padding-left: 15px!important;
+    border-bottom-width: 1px!important;
     .anticon {
       display: none;
     }
diff --git a/src/tabviews/zshare/actionList/normalbutton/index.jsx b/src/tabviews/zshare/actionList/normalbutton/index.jsx
index 036c51b..1735f7a 100644
--- a/src/tabviews/zshare/actionList/normalbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/normalbutton/index.jsx
@@ -1023,7 +1023,7 @@
 
       if (params[0].$unCheckParam) {
         this.checkLoopRequest(params, _resolve)
-      } else if (params.length <= 20) {
+      } else if (params.length <= 20 && btn.execType !== 'single') {
         let deffers = params.map((param, i) => {
           return new Promise(resolve => {
             setTimeout(() => {
@@ -1085,7 +1085,7 @@
           _resolve()
         })
       } else { // 瓒呭嚭20涓姹傛椂寰幆鎵ц
-        if (btn.progress === 'progressbar' && btn.$toolbtn) {
+        if (btn.progress === 'progressbar' && btn.$toolbtn && params.length > 1) {
           this.setState({
             loadingTotal: params.length
           })
diff --git a/src/tabviews/zshare/actionList/popupbutton/index.jsx b/src/tabviews/zshare/actionList/popupbutton/index.jsx
index bf6178c..43b9afa 100644
--- a/src/tabviews/zshare/actionList/popupbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/popupbutton/index.jsx
@@ -348,7 +348,7 @@
           className={className}
           onClick={(e) => {e.stopPropagation(); this.actionTrigger()}}
         >{label}</Button>
-        <span onClick={(e) => {e.stopPropagation()}}>{this.getPop()}</span>
+        <span onClick={(e) => {e.stopPropagation()}} onDoubleClick={(e) => {e.stopPropagation()}}>{this.getPop()}</span>
       </>
     )
   }
diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx
index 6224ab7..249c732 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx
@@ -762,13 +762,18 @@
             <Form {...formItemLayout}>
               <Row gutter={24}>
                 <Col span={8}>
-                  <Form.Item label="琛ㄥ悕">
+                  <Form.Item label={
+                    <Tooltip placement="bottomLeft" title="瀵煎叆鏃跺伐浣滆〃鍚嶄笌excel涓繀椤讳竴鑷达紝娉細宸ヤ綔琛ㄥ悕涓篠heet1涓攅xcel涓粎鏈変竴涓伐浣滆〃鏃朵笉杩涜琛ㄥ悕楠岃瘉銆�">
+                      <QuestionCircleOutlined className="mk-form-tip" />
+                      宸ヤ綔琛�
+                    </Tooltip>
+                  }>
                     {getFieldDecorator('sheet', {
                       initialValue: verify.sheet || '',
                       rules: [
                         {
                           required: true,
-                          message: '璇疯緭鍏ヨ〃鍚�!'
+                          message: '璇疯緭鍏ュ伐浣滆〃鍚�!'
                         }
                       ]
                     })(<Input placeholder="" autoComplete="off" />)}
diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelout/datasource/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelout/datasource/index.jsx
index c4df36d..0159b4e 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelout/datasource/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelout/datasource/index.jsx
@@ -1,6 +1,6 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
-import { Form, Row, Col, Input, Radio, Tooltip, notification } from 'antd'
+import { Form, Row, Col, Input, Radio, Tooltip, notification, InputNumber } from 'antd'
 import { QuestionCircleOutlined } from '@ant-design/icons'
 
 import Utils from '@/utils/utils.js'
@@ -234,6 +234,46 @@
                 </Radio.Group>)}
               </Form.Item>
             </Col> : null}
+            {btnType !== 'print' ? <Col span={8}>
+              <Form.Item label={
+                <Tooltip placement="topLeft" title="瀵煎嚭excel涓伐浣滆〃鍚嶇О锛岄粯璁や负Sheet1銆�">
+                  <QuestionCircleOutlined className="mk-form-tip" />
+                  宸ヤ綔琛�
+                </Tooltip>
+              }>
+                {getFieldDecorator('sheet', {
+                  initialValue: setting.sheet || ''
+                })(<Input placeholder="" autoComplete="off" />)}
+              </Form.Item>
+            </Col> : null}
+            {btnType !== 'print' ? <Col span={8}>
+              <Form.Item label={
+                <Tooltip placement="topLeft" title="瀵煎嚭excel涓殑琛岄珮銆�">
+                  <QuestionCircleOutlined className="mk-form-tip" />
+                  琛岄珮
+                </Tooltip>
+              }>
+                {getFieldDecorator('rowHeight', {
+                  initialValue: setting.rowHeight || ''
+                })(<InputNumber min={10} max={200} precision={0} />)}
+              </Form.Item>
+            </Col> : null}
+            {btnType !== 'print' ? <Col span={8}>
+              <Form.Item label={
+                <Tooltip placement="topLeft" title="璇峰皢闇�瑕佸悎骞剁殑琛ㄥご浣跨敤涓í绾垮垎闅旓紙濡傦細鍟嗗搧-鏁伴噺銆佸晢鍝�-鍗曚环锛夛紝鍓嶉儴鍒嗗皢浣滀负涓昏〃澶达紝鍚庨儴鍒嗗皢浣滀负瀛愯〃澶淬��">
+                  <QuestionCircleOutlined className="mk-form-tip" />
+                  琛ㄥご鍚堝苟
+                </Tooltip>
+              }>
+                {getFieldDecorator('merge', {
+                  initialValue: setting.merge || 'false'
+                })(
+                <Radio.Group>
+                  <Radio value="false">鍚�</Radio>
+                  <Radio value="true">鏄�</Radio>
+                </Radio.Group>)}
+              </Form.Item>
+            </Col> : null}
           </Row>
         </Form>
       </div>
diff --git a/src/templates/zshare/verifycard/customscript/index.jsx b/src/templates/zshare/verifycard/customscript/index.jsx
index 1f172d4..4c4a094 100644
--- a/src/templates/zshare/verifycard/customscript/index.jsx
+++ b/src/templates/zshare/verifycard/customscript/index.jsx
@@ -68,6 +68,10 @@
         values.uuid = editItem ? editItem.uuid : ''
         values.position = values.position || (editItem ? editItem.position : 'front')
 
+        if (type === 'fullscreen' && editItem) {
+          values.status = editItem.status || 'true'
+        }
+
         let _quot = values.sql.match(/'{1}/g)
         let _lparen = values.sql.match(/\({1}/g)
         let _rparen = values.sql.match(/\){1}/g)
@@ -119,10 +123,10 @@
         let _backCustomScript = '' // 榛樿sql鍚庢墽琛岃剼鏈�
 
         this.props.customScripts.forEach(item => {
-          if (item.status === 'false' && values.uuid !== item.uuid) return
-
           let _item = values.uuid === item.uuid ? values : item
 
+          if (_item.status === 'false') return
+
           if (_item.position === 'init') {
             _initCustomScript += `
             /* 鍒濆鍖栬剼鏈� */
diff --git a/src/views/menudesign/index.jsx b/src/views/menudesign/index.jsx
index 93dd0b6..ce3e6e5 100644
--- a/src/views/menudesign/index.jsx
+++ b/src/views/menudesign/index.jsx
@@ -876,7 +876,7 @@
               } else {
                 resolve(result)
               }
-            })
+            }, this.netError)
           })
         } else {
           resolve({status: true})
@@ -909,7 +909,7 @@
           }
           return Api.getSystemConfig(_param)
         }
-      }).then(res => { // 椤甸潰鎸夐挳鍏崇郴淇濆瓨
+      }, this.netError).then(res => { // 椤甸潰鎸夐挳鍏崇郴淇濆瓨
         if (!res || !res.status) return res
 
         this.setState({
@@ -923,7 +923,7 @@
             status: true
           }
         }
-      }).then(res => {
+      }, this.netError).then(res => {
         this.setState({
           menuloading: false
         })
@@ -944,10 +944,23 @@
             duration: 5
           })
         }
-      })
+      }, this.netError)
     }, 300 + (+sessionStorage.getItem('mkDelay')))
   }
 
+  netError = (error) => {
+    this.setState({
+      menuloading: false
+    })
+    if (!error) {
+      notification.warning({
+        top: 92,
+        message: '淇濆瓨澶辫触锛岃妫�鏌ョ綉缁滄槸鍚︽甯搞��',
+        duration: 5
+      })
+    }
+  }
+
   getRoleFields = () => {
     if (sessionStorage.getItem('sysRoles')) return
 
diff --git a/src/views/mobdesign/index.jsx b/src/views/mobdesign/index.jsx
index f54144d..1b227df 100644
--- a/src/views/mobdesign/index.jsx
+++ b/src/views/mobdesign/index.jsx
@@ -1607,14 +1607,14 @@
                     }
 
                     resolve(result)
-                  })
+                  }, this.netError)
                 } else {
                   resolve(res)
                 }
               } else {
                 resolve(res)
               }
-            })
+            }, this.netError)
           }
         }
       }).then(res => { // 椤甸潰淇濆瓨
@@ -1652,10 +1652,23 @@
             duration: 5
           })
         }
-      })
+      }, this.netError)
     }, 300 + (+sessionStorage.getItem('mkDelay')))
   }
 
+  netError = (error) => {
+    this.setState({
+      menuloading: false
+    })
+    if (!error) {
+      notification.warning({
+        top: 92,
+        message: '淇濆瓨澶辫触锛岃妫�鏌ョ綉缁滄槸鍚︽甯搞��',
+        duration: 5
+      })
+    }
+  }
+
   getRoleFields = () => {
     if (sessionStorage.getItem('sysRoles')) return
 
diff --git a/src/views/pcdesign/index.jsx b/src/views/pcdesign/index.jsx
index 36018b0..10b55fc 100644
--- a/src/views/pcdesign/index.jsx
+++ b/src/views/pcdesign/index.jsx
@@ -1374,14 +1374,14 @@
                     }
 
                     resolve(result)
-                  })
+                  }, this.netError)
                 } else {
                   resolve(res)
                 }
               } else {
                 resolve(res)
               }
-            })
+            }, this.netError)
           }
         }
       }).then(res => { // 椤甸潰淇濆瓨
@@ -1419,10 +1419,23 @@
             duration: 5
           })
         }
-      })
+      }, this.netError)
     }, 300 + (+sessionStorage.getItem('mkDelay')))
   }
 
+  netError = (error) => {
+    this.setState({
+      menuloading: false
+    })
+    if (!error) {
+      notification.warning({
+        top: 92,
+        message: '淇濆瓨澶辫触锛岃妫�鏌ョ綉缁滄槸鍚︽甯搞��',
+        duration: 5
+      })
+    }
+  }
+
   getRoleFields = () => {
     if (sessionStorage.getItem('sysRoles') || sessionStorage.getItem('permFuncField')) return
     Api.getSystemConfig({func: 'sPC_Get_Roles_sModular'}).then(res => {
diff --git a/src/views/tabledesign/index.jsx b/src/views/tabledesign/index.jsx
index 5a0b0c8..0689387 100644
--- a/src/views/tabledesign/index.jsx
+++ b/src/views/tabledesign/index.jsx
@@ -595,7 +595,7 @@
       new Promise(resolve => {
         Api.getSystemConfig(param).then(res => {
           resolve(res)
-        })
+        }, this.netError)
       }).then(res => {
         if (!res || !res.status) return res
 
@@ -629,10 +629,23 @@
             duration: 5
           })
         }
-      })
+      }, this.netError)
     }, 300 + (+sessionStorage.getItem('mkDelay')))
   }
 
+  netError = (error) => {
+    this.setState({
+      menuloading: false
+    })
+    if (!error) {
+      notification.warning({
+        top: 92,
+        message: '淇濆瓨澶辫触锛岃妫�鏌ョ綉缁滄槸鍚︽甯搞��',
+        duration: 5
+      })
+    }
+  }
+
   getRoleFields = () => {
     if (sessionStorage.getItem('sysRoles')) return
     Api.getSystemConfig({func: 'sPC_Get_Roles_sModular'}).then(res => {

--
Gitblit v1.8.0