From bca9d545b6b10e1d0120b8edaece22f9acbe12f3 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期一, 30 十月 2023 16:08:14 +0800
Subject: [PATCH] 2023-10-30

---
 src/tabviews/custom/components/table/edit-table/index.jsx                          |   70 ++++++++
 src/api/index.js                                                                   |    2 
 src/tabviews/custom/components/table/edit-table/normalTable/mkPopSelect/index.scss |    5 
 src/tabviews/custom/components/table/edit-table/normalTable/mkPopSelect/index.jsx  |  305 ++++++++++++++++----------------------
 src/menu/components/table/edit-table/columns/editColumn/index.jsx                  |    2 
 src/menu/components/table/edit-table/index.jsx                                     |   38 ++++
 src/menu/components/table/edit-table/columns/editColumn/formconfig.jsx             |   24 +-
 7 files changed, 253 insertions(+), 193 deletions(-)

diff --git a/src/api/index.js b/src/api/index.js
index a17dc77..8884f3f 100644
--- a/src/api/index.js
+++ b/src/api/index.js
@@ -659,7 +659,7 @@
   /**
    * @description 鑾峰彇绯荤粺閰嶇疆锛屼紭鍏堜粠缂撳瓨涓彇鍊硷紝澧炲姞appkey
    * @param {Object}  param   璇锋眰鍙傛暟
-   * @param {Boolean} SSO     鏄惁涓哄崟鐐圭櫥褰曞湴鍧�
+   * @param {Boolean} cache   鏄惁浣跨敤缂撳瓨
    */
   getSystemCacheConfig (param, cache = true) {
     param.userid = param.userid || sessionStorage.getItem('UserID') || ''
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 6ebce77..29ff601 100644
--- a/src/menu/components/table/edit-table/columns/editColumn/formconfig.jsx
+++ b/src/menu/components/table/edit-table/columns/editColumn/formconfig.jsx
@@ -419,15 +419,6 @@
     },
     {
       type: 'select',
-      key: 'showField',
-      label: '鏄剧ず瀛楁',
-      initVal: card.showField || '',
-      tooltip: '鐢ㄤ簬鎺у埗閫夋嫨妗嗕腑鐨勬樉绀哄唴瀹广��',
-      required: true,
-      options: 'columns'
-    },
-    {
-      type: 'select',
       key: 'controlField',
       label: '绂佺敤瀛楁',
       initVal: card.controlField || '',
@@ -486,6 +477,21 @@
       }]
     },
     {
+      type: 'radio',
+      key: 'cache',
+      label: '閫夐」鏌ヨ',
+      initVal: card.cache || 'true',
+      tooltip: '鏁版嵁鏌ヨ鏄惁浣跨敤缂撳瓨銆�',
+      required: false,
+      options: [{
+        value: 'true',
+        text: '缂撳瓨'
+      }, {
+        value: 'false',
+        text: '瀹炴椂'
+      }]
+    },
+    {
       type: 'text',
       key: 'valueField',
       label: '鍊悸峰瓧娈�',
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 25e6c22..e5f690b 100644
--- a/src/menu/components/table/edit-table/columns/editColumn/index.jsx
+++ b/src/menu/components/table/edit-table/columns/editColumn/index.jsx
@@ -76,7 +76,7 @@
         } else if (this.record.editType === 'date') {
           _options.push('required', 'precision', 'enter', 'declareType')
         } else if (this.record.editType === 'popSelect') {
-          _options.push('required', 'enter', 'linkSubField', 'columns', 'dataSource', 'primaryKey', 'order', 'showField', 'controlField', 'searchKey', 'popWidth', 'laypage', 'onload')
+          _options.push('required', 'enter', 'linkSubField', 'columns', 'dataSource', 'primaryKey', 'order', 'controlField', 'searchKey', 'popWidth', 'laypage', 'cache', 'onload')
         } else if (this.record.editType === 'select') {
           _options.push('required', 'enter', 'resourceType', 'linkSubField', 'dropdown')
 
diff --git a/src/menu/components/table/edit-table/index.jsx b/src/menu/components/table/edit-table/index.jsx
index f211286..2688b14 100644
--- a/src/menu/components/table/edit-table/index.jsx
+++ b/src/menu/components/table/edit-table/index.jsx
@@ -67,8 +67,15 @@
 
       this.updateComponent(_card)
     } else {
+      let _card = fromJS(card).toJS()
+
+      if (_card.mergeCol) {
+        let col = _card.cols[_card.mergeCol[0]]
+        _card.cols.splice(_card.mergeCol[0], 1, ...col.pops)
+      }
+
       this.setState({
-        card: fromJS(card).toJS()
+        card: _card
       })
     }
   }
@@ -133,13 +140,27 @@
       card: card
     })
 
-    let _card = card.isNew ? fromJS(card).toJS() : card
+    let _card = card
     if (_card.isNew) {
+      _card = fromJS(card).toJS()
       _card.cols = _card.cols.filter(a => !a.origin)
 
       delete _card.isNew
+      delete _card.mergeCol
+    } else if (_card.mergeCol) {
+      _card = fromJS(card).toJS()
+      let col = {..._card.cols[_card.mergeCol[0]]}
+      col.initval = ''
+      col.pops = []
+
+      _card.mergeCol.forEach(index => {
+        col.pops.push(_card.cols[index])
+      })
+
+      _card.cols = _card.cols.filter((col, index) => !_card.mergeCol.includes(index))
+      _card.cols.splice(_card.mergeCol[0], 0, col)
     }
-    
+
     this.props.updateConfig(_card)
   }
 
@@ -270,7 +291,11 @@
 
   updatecolumn = (config) => {
     config.absFields = []
-    config.cols.forEach(col => {
+    config.mergeCol = false
+
+    config.cols.forEach((col, index) => {
+      delete col.pops
+
       if (col.type === 'number') {
         if (col.format === 'abs') {
           config.absFields.push(col.field)
@@ -283,6 +308,11 @@
             }
           }
         })
+      } else if (col.type === 'text') {
+        if (col.editable === 'true' && col.editType === 'popSelect' && /^tab:/.test(col.initval)) {
+          config.mergeCol = config.mergeCol || []
+          config.mergeCol.push(index)
+        }
       }
     })
 
diff --git a/src/tabviews/custom/components/table/edit-table/index.jsx b/src/tabviews/custom/components/table/edit-table/index.jsx
index 359886a..4f2d6c0 100644
--- a/src/tabviews/custom/components/table/edit-table/index.jsx
+++ b/src/tabviews/custom/components/table/edit-table/index.jsx
@@ -130,6 +130,15 @@
         
                 return !cell.Hide
               })
+            } else if (item.editType === 'popSelect') {
+              if (item.pops) {
+                item.pops.forEach(cell => {
+                  this.resetPop(cell)
+                  cell.tabName = cell.initval.replace(/^tab:/, '')
+                })
+              } else {
+                this.resetPop(item)
+              }
             }
           }
         }
@@ -200,6 +209,67 @@
     })
   }
 
+  resetPop = (config) => {
+    let arrfield = config.columns.map(f => f.field)
+  
+    if (config.linkSubField && config.linkSubField.length > 0) {
+      config.linkSubField.forEach(n => {
+        if (!arrfield.includes(n)) {
+          arrfield.push(n)
+        }
+      })
+    }
+
+    if (sessionStorage.getItem('dataM') === 'true') { // 鏁版嵁鏉冮檺
+      config.dataSource = config.dataSource.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
+    } else {
+      config.dataSource = config.dataSource.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
+    }
+
+    config.dataSource = config.dataSource.replace(/@LoginUID@/ig, `'${sessionStorage.getItem('LoginUID') || ''}'`)
+    config.dataSource = config.dataSource.replace(/@SessionUid@/ig, `'${localStorage.getItem('SessionUid') || ''}'`)
+    config.dataSource = config.dataSource.replace(/@UserID@/ig, `'${sessionStorage.getItem('UserID') || ''}'`)
+    config.dataSource = config.dataSource.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
+
+    if (/\s/.test(config.dataSource)) { // 鎷兼帴鍒悕
+      config.dataSource = '(' + config.dataSource + ') tb'
+    }
+
+    let labels = {}
+    config.cols = []
+    config.columns.forEach(col => {
+      labels[col.field] = col.label
+
+      if (col.Hide === 'true') return
+
+      config.cols.push({
+        dataIndex: col.field,
+        title: col.label,
+        sorter: col.IsSort === 'true',
+        width: col.Width || 120
+      })
+    })
+
+    let placeholder = ''
+    if (!config.searchKey) {
+      config.onload = 'true'
+    } else {
+      placeholder = []
+      config.searchKey.split(',').forEach(key => {
+        if (!labels[key]) {
+          placeholder = ''
+        } else if (placeholder) {
+          placeholder.push(labels[key])
+        }
+      })
+
+      placeholder = placeholder ? placeholder.join('銆�') : ''
+    }
+
+    config.placeholder = placeholder
+    config.arr_field = arrfield.join(',')
+  }
+
   /**
    * @description 涓昏〃鏁版嵁鍔犺浇
    * @param { Boolean } reset  琛ㄦ牸鏄惁閲嶇疆
diff --git a/src/tabviews/custom/components/table/edit-table/normalTable/mkPopSelect/index.jsx b/src/tabviews/custom/components/table/edit-table/normalTable/mkPopSelect/index.jsx
index 651bc6f..f2444ec 100644
--- a/src/tabviews/custom/components/table/edit-table/normalTable/mkPopSelect/index.jsx
+++ b/src/tabviews/custom/components/table/edit-table/normalTable/mkPopSelect/index.jsx
@@ -1,6 +1,6 @@
 import React, {Component} from 'react'
 import { is, fromJS } from 'immutable'
-import { notification, Modal, Table, Input } from 'antd'
+import { notification, Modal, Table, Input, Tabs } from 'antd'
 import moment from 'moment'
 import { TableOutlined, CloseCircleFilled } from '@ant-design/icons'
 
@@ -9,109 +9,32 @@
 import './index.scss'
 
 const { Search } = Input
+const { TabPane } = Tabs
 
-class MKPopSelect extends Component {
-  constructor(props) {
-    super(props)
-    
-    let config = fromJS(props.config).toJS()
-    let value = props.defaultValue
-
-    let arrfield = config.columns.map(f => f.field)
-  
-    if (config.subFields && config.subFields.length > 0) {
-      config.subFields.forEach(n => {
-        if (!arrfield.includes(n.field)) {
-          arrfield.push(n.field)
-        }
-      })
-    }
-
-    if (sessionStorage.getItem('dataM') === 'true') { // 鏁版嵁鏉冮檺
-      config.dataSource = config.dataSource.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
-    } else {
-      config.dataSource = config.dataSource.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
-    }
-
-    config.dataSource = config.dataSource.replace(/@LoginUID@/ig, `'${sessionStorage.getItem('LoginUID') || ''}'`)
-    config.dataSource = config.dataSource.replace(/@SessionUid@/ig, `'${localStorage.getItem('SessionUid') || ''}'`)
-    config.dataSource = config.dataSource.replace(/@UserID@/ig, `'${sessionStorage.getItem('UserID') || ''}'`)
-    config.dataSource = config.dataSource.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
-
-    if (/\s/.test(config.dataSource)) { // 鎷兼帴鍒悕
-      config.dataSource = '(' + config.dataSource + ') tb'
-    }
-
-    let columns = []
-    let labels = {}
-    config.columns.forEach(col => {
-      labels[col.field] = col.label
-
-      if (col.Hide === 'true') return
-
-      columns.push({
-        dataIndex: col.field,
-        title: col.label,
-        sorter: col.IsSort === 'true',
-        width: col.Width || 120
-      })
-    })
-
-    let placeholder = ''
-    if (!config.searchKey) {
-      config.onload = 'true'
-    } else {
-      placeholder = []
-      config.searchKey.split(',').forEach(key => {
-        if (!labels[key]) {
-          placeholder = ''
-        } else if (placeholder) {
-          placeholder.push(labels[key])
-        }
-      })
-
-      placeholder = placeholder ? placeholder.join('銆�') : ''
-    }
-
-    this.state = {
-      config: config,
-      options: [],
-      columns,
-      value,
-      placeholder,
-      arr_field: arrfield.join(','),
-      searchKey: '',
-      pageIndex: 1,
-      pageSize: 10,
-      orderBy: '',
-      visible: false,
-      loading: false
-    }
-
-    this.timer = null
+class PopTable extends Component {
+  state = {
+    options: [],
+    searchKey: '',
+    pageIndex: 1,
+    pageSize: 10,
+    orderBy: '',
+    loading: false
   }
+
+  timer = null
 
   componentDidMount () {
-    const { mask } = this.props
+    const { config } = this.props
+    const { options } = this.state
 
-    if (mask) {
-      this.trigger()
-    }
-  }
-
-  shouldComponentUpdate (nextProps, nextState) {
-    return !is(fromJS(this.state), fromJS(nextState))
-  }
-
-  componentWillUnmount () {
-    this.setState = () => {
-      return
+    if (config.onload === 'true' && options.length === 0) {
+      this.loadData()
     }
   }
 
   loadData () {
-    const { BID, ID } = this.props
-    const { config, pageIndex, pageSize, arr_field, searchKey, orderBy } = this.state
+    const { BID, ID, config } = this.props
+    const { pageIndex, pageSize, searchKey, orderBy } = this.state
 
     this.setState({
       loading: true
@@ -121,7 +44,7 @@
       func: 'sPC_Get_TableData',
       obj_name: 'data',
       exec_type: 'y',
-      arr_field: arr_field,
+      arr_field: config.arr_field,
       default_sql: 'true',
       custom_script: '',
       menuname: config.label
@@ -142,12 +65,12 @@
     _datasource = _datasource.replace(/@ID@/ig, `'${ID || ''}'`)
 
     if (config.laypage === 'true') {
-      sql = `/*system_query*/select top ${pageSize} ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by ${_orderBy}) as rows from ${_datasource} ${_search}) tmptable where rows > ${pageSize * (pageIndex - 1)} order by tmptable.rows `
+      sql = `/*system_query*/select top ${pageSize} ${config.arr_field} from (select ${config.arr_field} ,ROW_NUMBER() over(order by ${_orderBy}) as rows from ${_datasource} ${_search}) tmptable where rows > ${pageSize * (pageIndex - 1)} order by tmptable.rows `
       DateCount = `/*system_query*/select count(1) as total from ${_datasource} ${_search}`
     } else if (_orderBy) {
-      sql = `/*system_query*/select ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by ${_orderBy}) as rows from ${_datasource} ${_search}) tmptable order by tmptable.rows `
+      sql = `/*system_query*/select ${config.arr_field} from (select ${config.arr_field} ,ROW_NUMBER() over(order by ${_orderBy}) as rows from ${_datasource} ${_search}) tmptable order by tmptable.rows `
     } else {
-      sql = `/*system_query*/select ${arr_field} from ${_datasource} ${_search}  `
+      sql = `/*system_query*/select ${config.arr_field} from ${_datasource} ${_search}  `
     }
 
     let departmentcode = sessionStorage.getItem('departmentcode') || ''
@@ -173,12 +96,11 @@
     param.username = sessionStorage.getItem('User_Name') || ''
     param.fullname = sessionStorage.getItem('Full_Name') || ''
 
-    Api.genericInterface(param).then(result => {
+    Api.getSystemCacheConfig(param, config.cache === 'true').then(result => {
       if (result.status) {
         let options = result.data.map((item, index) => {
           item.key = index
           item.$$uuid = item[config.primaryKey] || ''
-          item.$label = item[config.showField]
 
           if (config.controlField && item[config.controlField] === 'true') {
             item.$disabled = true
@@ -239,10 +161,12 @@
     }, 500)
   }
 
-  selectChange = (val, record) => {
-    const { config } = this.state
+  changeRow = (record) => {
+    const { config } = this.props
 
-    let values = {[config.field]: val}
+    if (record.$disabled) return
+
+    let values = {[config.field]: record.$$uuid}
 
     if (config.linkSubField) {
       config.linkSubField.forEach(m => {
@@ -250,45 +174,7 @@
       })
     }
 
-    this.props.onChange(values)
-    this.setState({value: val})
-  }
-
-  trigger = (e) => {
-    const { config, options } = this.state
-    
-    e && e.stopPropagation()
-
-    this.setState({visible: true}, () => {
-      if (config.onload === 'true' && options.length === 0) {
-        this.loadData()
-      }
-    })
-  }
-
-  changeRow = (record) => {
-
-    if (record.$disabled) return
-
-    this.selectChange(record.$$uuid, record)
-    this.setState({visible: false})
-  }
-
-  clear = (e) => {
-    const { config } = this.state
-
-    e.stopPropagation()
-    
-    let values = {[config.field]: ''}
-
-    if (config.linkSubField) {
-      config.linkSubField.forEach(m => {
-        values[m] = ''
-      })
-    }
-
-    this.props.onChange(values)
-    this.setState({value: ''})
+    this.props.onChange(values, record.$$uuid)
   }
 
   changeTable = (pagination, filters, sorter) => {
@@ -311,6 +197,94 @@
     })
   }
 
+  render() {
+    const { config, value } = this.props
+    const { options, loading, total, pageIndex, pageSize } = this.state
+    
+    return <>
+      {config.searchKey ? <Search placeholder={config.placeholder} onSearch={this.searchOption} enterButton /> : null}
+      <Table
+        rowKey="$$uuid"
+        bordered={true}
+        rowSelection={null}
+        columns={config.cols}
+        dataSource={options}
+        loading={loading}
+        onRow={(record) => {
+          let className = ''
+
+          if (record.$disabled) {
+            className = ' mk-disable-line '
+          } else if (value === record.$$uuid) {
+            className = ' ant-table-row-selected '
+          }
+          
+          return {
+            className: className,
+            onClick: () => {this.changeRow(record)},
+          }
+        }}
+        onChange={this.changeTable}
+        pagination={config.laypage === 'true' ? {
+          current: pageIndex,
+          pageSize: pageSize,
+          showSizeChanger: true,
+          total: total || 0,
+          showTotal: (total, range) => `${range[0]}-${range[1]} 鍏� ${total} 鏉
+        } : false}
+      />
+    </>
+  }
+}
+
+class MKPopSelect extends Component {
+  constructor(props) {
+    super(props)
+    
+    this.state = {
+      value: props.defaultValue,
+      visible: false
+    }
+  }
+
+  shouldComponentUpdate (nextProps, nextState) {
+    return !is(fromJS(this.state), fromJS(nextState))
+  }
+
+  componentWillUnmount () {
+    this.setState = () => {
+      return
+    }
+  }
+
+  selectChange = (values, val) => {
+    this.props.onChange(values)
+    this.setState({value: val, visible: false})
+  }
+
+  trigger = (e) => {
+    e && e.stopPropagation()
+
+    this.setState({visible: true})
+  }
+
+  clear = (e) => {
+    const { config } = this.props
+
+    e.stopPropagation()
+    
+    let values = {[config.field]: ''}
+
+    if (config.linkSubField) {
+      config.linkSubField.forEach(m => {
+        values[m] = ''
+      })
+    }
+
+    this.props.onChange(values)
+    this.setState({value: ''})
+  }
+
   cancel = () => {
     const { mask } = this.props
 
@@ -322,8 +296,8 @@
   }
 
   render() {
-    const { mask } = this.props
-    const { value, config, options, visible, loading, total, pageIndex, pageSize, columns, placeholder } = this.state
+    const { mask, BID, ID, config } = this.props
+    const { value, visible } = this.state
     
     return <>
       {mask ? <div className="mk-pop-select-mask" onClick={this.trigger}></div> : null}
@@ -333,7 +307,7 @@
         <TableOutlined onClick={this.trigger}/>
       </div>
       <Modal
-        wrapClassName='mk-pop-select-modal'
+        wrapClassName='mk-table-pop-select-modal'
         title={config.label}
         visible={visible}
         closable={true}
@@ -344,37 +318,14 @@
         onCancel={this.cancel}
         destroyOnClose
       >
-        {config.searchKey ? <Search placeholder={placeholder} onSearch={this.searchOption} enterButton /> : null}
-        <Table
-          rowKey="$$uuid"
-          bordered={true}
-          rowSelection={null}
-          columns={columns}
-          dataSource={options}
-          loading={loading}
-          onRow={(record) => {
-            let className = ''
-
-            if (record.$disabled) {
-              className = ' mk-disable-line '
-            } else if (value === record.$$uuid) {
-              className = ' ant-table-row-selected '
-            }
-            
-            return {
-              className: className,
-              onClick: () => {this.changeRow(record)},
-            }
-          }}
-          onChange={this.changeTable}
-          pagination={config.laypage === 'true' ? {
-            current: pageIndex,
-            pageSize: pageSize,
-            showSizeChanger: true,
-            total: total || 0,
-            showTotal: (total, range) => `${range[0]}-${range[1]} 鍏� ${total} 鏉
-          } : false}
-        />
+        {config.pops ? <Tabs>
+          {config.pops.map(tab => (
+            <TabPane tab={tab.tabName} key={tab.uuid}>
+              <PopTable config={tab} BID={BID} ID={ID} value={value} onChange={this.selectChange}/>
+            </TabPane>
+          ))}
+        </Tabs> :
+        <PopTable config={config} BID={BID} ID={ID} value={value} onChange={this.selectChange}/>}
       </Modal>
     </>
   }
diff --git a/src/tabviews/custom/components/table/edit-table/normalTable/mkPopSelect/index.scss b/src/tabviews/custom/components/table/edit-table/normalTable/mkPopSelect/index.scss
index bc198f7..9f7e8d9 100644
--- a/src/tabviews/custom/components/table/edit-table/normalTable/mkPopSelect/index.scss
+++ b/src/tabviews/custom/components/table/edit-table/normalTable/mkPopSelect/index.scss
@@ -72,7 +72,7 @@
   box-shadow: none!important;
   padding-left: 0px;
 }
-.mk-pop-select-modal {
+.mk-table-pop-select-modal {
   .ant-modal-body {
     min-height: 200px;
     max-height: calc(100vh - 210px);
@@ -82,6 +82,9 @@
       max-width: 300px;
       margin-bottom: 20px;
     }
+    .ant-tabs {
+      margin-top: -20px;
+    }
     table {
       td {
         padding: 12px 16px;

--
Gitblit v1.8.0