From 9b0754adb7fbe595eef73010992c0ce53ef6571a Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期三, 11 十月 2023 17:22:36 +0800
Subject: [PATCH] Merge branch 'develop'

---
 src/templates/zshare/modalform/index.jsx                               |    9 
 src/menu/components/form/formaction/index.scss                         |    3 
 src/utils/utils-datamanage.js                                          |   21 +
 src/menu/components/share/sourcecomponent/inputform/index.jsx          |    2 
 src/tabviews/custom/components/chart/antv-X6/nodeupdate/nodeform.jsx   |   70 +++
 src/tabviews/custom/components/module/account/index.jsx                |    5 
 src/menu/components/share/markcomponent/index.jsx                      |   45 ++
 src/menu/components/form/formaction/actionform/index.jsx               |    2 
 src/menu/components/card/prop-card/index.scss                          |    1 
 src/utils/utils-custom.js                                              |   88 ++--
 src/menu/components/form/simple-form/options.jsx                       |    4 
 src/menu/datasource/index.jsx                                          |   21 +
 src/tabviews/zshare/actionList/exceloutbutton/index.jsx                |    2 
 src/menu/components/form/simple-form/index.jsx                         |    6 
 src/templates/sharecomponent/actioncomponent/verifyexcelout/utils.jsx  |   11 
 src/menu/components/share/sourcecomponent/inputform/index.scss         |    4 
 src/menu/components/form/formaction/index.jsx                          |   15 
 src/tabviews/custom/components/share/normalTable/index.jsx             |   34 +
 src/tabviews/custom/components/form/simple-form/index.jsx              |   13 
 src/tabviews/zshare/actionList/normalbutton/index.jsx                  |   14 
 src/tabviews/custom/components/chart/antv-X6/nodeupdate/memberform.jsx |    2 
 src/menu/datasource/verifycard/index.jsx                               |    4 
 src/utils/utils.js                                                     |  157 +++++++-
 src/tabviews/custom/components/chart/antv-X6/nodeupdate/index.jsx      |    2 
 src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx  |    2 
 src/menu/components/form/formaction/formconfig.jsx                     |    2 
 src/menu/components/table/base-table/columns/index.scss                |   19 +
 src/tabviews/custom/components/card/cardcellList/index.jsx             |   40 +
 src/menu/components/card/cardcellcomponent/index.jsx                   |    5 
 src/templates/zshare/formconfig.jsx                                    |   26 +
 src/templates/zshare/verifycard/index.jsx                              |   15 
 src/menu/components/share/sourcecomponent/index.jsx                    |    2 
 src/tabviews/custom/components/table/edit-table/normalTable/index.jsx  |   68 +++
 src/tabviews/zshare/actionList/printbutton/index.jsx                   |   14 
 src/tabviews/custom/components/chart/antv-X6/nodeupdate/index.scss     |    1 
 src/tabviews/zshare/mutilform/index.jsx                                |   14 
 src/tabviews/custom/components/chart/antv-X6/index.jsx                 |  162 ++++++++
 src/tabviews/custom/index.jsx                                          |    9 
 src/menu/components/table/base-table/columns/index.jsx                 |    5 
 src/menu/debug/index.jsx                                               |   13 
 src/templates/zshare/verifycard/baseform/index.jsx                     |   29 +
 src/menu/components/table/normal-table/columns/index.jsx               |    2 
 42 files changed, 781 insertions(+), 182 deletions(-)

diff --git a/src/menu/components/card/cardcellcomponent/index.jsx b/src/menu/components/card/cardcellcomponent/index.jsx
index 1100466..3495c10 100644
--- a/src/menu/components/card/cardcellcomponent/index.jsx
+++ b/src/menu/components/card/cardcellcomponent/index.jsx
@@ -451,10 +451,7 @@
           } else if (res.class !== cell.class || res.show !== cell.show || !res.style) {
             let cl = res.class.replace('border-', '')
             let style = {}
-            if (res.show === 'link' || res.show === 'icon') {
-              style.color = color[cl]
-              style.backgroundColor = 'transparent'
-            } else if (res.class === 'default') {
+            if (res.class === 'default') {
               style.color = 'rgba(0, 0, 0, 0.65)'
               style.backgroundColor = '#fff'
               style.borderColor = '#d9d9d9'
diff --git a/src/menu/components/card/prop-card/index.scss b/src/menu/components/card/prop-card/index.scss
index 6f1ec06..5e0c1e5 100644
--- a/src/menu/components/card/prop-card/index.scss
+++ b/src/menu/components/card/prop-card/index.scss
@@ -82,6 +82,7 @@
     color: orange;
     float: right;
     margin: 5px;
+    clear: left;
   }
 }
 .menu-prop-card-edit-box::after {
diff --git a/src/menu/components/form/formaction/actionform/index.jsx b/src/menu/components/form/formaction/actionform/index.jsx
index b21638c..b65157b 100644
--- a/src/menu/components/form/formaction/actionform/index.jsx
+++ b/src/menu/components/form/formaction/actionform/index.jsx
@@ -54,7 +54,7 @@
       shows = ['typeName', 'label', 'actionType']
     } else if (this.record.type === 'next') {
       shows = ['typeName', 'label', 'actionType']
-    } else if (this.record.type === 'close') {
+    } else if (this.record.type === 'close' || this.record.type === 'reset') {
       shows = ['typeName', 'label']
     } else {
       shows = ['typeName', 'label', 'intertype', 'Ot', 'execSuccess', 'syncComponent', 'anchors', 'linkmenu', 'output', 'reload'] // 閫夐」鍒楄〃
diff --git a/src/menu/components/form/formaction/formconfig.jsx b/src/menu/components/form/formaction/formconfig.jsx
index 2e98dbc..e90047a 100644
--- a/src/menu/components/form/formaction/formconfig.jsx
+++ b/src/menu/components/form/formaction/formconfig.jsx
@@ -14,6 +14,8 @@
     _type = '涓嬩竴姝�'
   } else if (card.type === 'close') {
     _type = '鍏抽棴'
+  } else if (card.type === 'reset') {
+    _type = '閲嶇疆'
   }
 
   let menulist = []
diff --git a/src/menu/components/form/formaction/index.jsx b/src/menu/components/form/formaction/index.jsx
index 50fae57..015c25e 100644
--- a/src/menu/components/form/formaction/index.jsx
+++ b/src/menu/components/form/formaction/index.jsx
@@ -65,6 +65,8 @@
       group.nextButton.style = style
     } else if (card.type === 'close') {
       group.closeButton.style = style
+    } else if (card.type === 'reset') {
+      group.resetButton.style = style
     }
 
     this.props.updateconfig(group)
@@ -148,6 +150,9 @@
       } else if (res.type === 'close') {
         res.enable = group.closeButton.enable || 'true'
         group.closeButton = res
+      } else if (res.type === 'reset') {
+        res.enable = group.resetButton.enable || 'true'
+        group.resetButton = res
       }
 
       this.setState({
@@ -220,13 +225,21 @@
         } trigger="hover">
           <Button type="link" className="submit mk-primary" onDoubleClick={this.changeMenu} style={resetStyle(group.subButton.style)}>{group.subButton.label}</Button>
         </Popover>
+        {group.resetButton && group.resetButton.enable === 'true' ? <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
+          <div className="mk-popover-control">
+            <EditOutlined className="edit" title="缂栬緫" onClick={() => this.handleAction(group.resetButton)} />
+            <FontColorsOutlined className="style" title="璋冩暣鏍峰紡" onClick={() => this.handleStyle(group.resetButton)}/>
+          </div>
+        } trigger="hover">
+          <Button type="link" className="reset" style={resetStyle(group.resetButton.style)}>{group.resetButton.label}</Button>
+        </Popover> : null}
         {group.closeButton && group.closeButton.enable === 'true' ? <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
           <div className="mk-popover-control">
             <EditOutlined className="edit" title="缂栬緫" onClick={() => this.handleAction(group.closeButton)} />
             <FontColorsOutlined className="style" title="璋冩暣鏍峰紡" onClick={() => this.handleStyle(group.closeButton)}/>
           </div>
         } trigger="hover">
-          <Button type="link" style={resetStyle(group.closeButton.style)}>{group.closeButton.label}</Button>
+          <Button type="link" className="reset" style={resetStyle(group.closeButton.style)}>{group.closeButton.label}</Button>
         </Popover> : null}
         {group.nextButton && group.nextButton.enable === 'true' ? <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
           <div className="mk-popover-control">
diff --git a/src/menu/components/form/formaction/index.scss b/src/menu/components/form/formaction/index.scss
index b980900..960834f 100644
--- a/src/menu/components/form/formaction/index.scss
+++ b/src/menu/components/form/formaction/index.scss
@@ -18,4 +18,7 @@
     height: auto;
     right: 0px;
   }
+  .reset {
+    height: auto;
+  }
 }
diff --git a/src/menu/components/form/simple-form/index.jsx b/src/menu/components/form/simple-form/index.jsx
index 15527e3..ba3c39c 100644
--- a/src/menu/components/form/simple-form/index.jsx
+++ b/src/menu/components/form/simple-form/index.jsx
@@ -523,6 +523,7 @@
 
     res.enable = buttons.includes('enable') ? 'true' : 'false'
     res.closeEnable = buttons.includes('closeEnable') ? 'true' : 'false'
+    res.resetEnable = buttons.includes('resetEnable') ? 'true' : 'false'
 
     _card.wrap = res
 
@@ -546,6 +547,11 @@
     } else if (_card.subcards[0].closeButton) {
       _card.subcards[0].closeButton.enable = _card.wrap.closeEnable
     }
+    if (_card.wrap.resetEnable === 'true' && !_card.subcards[0].resetButton) {
+      _card.subcards[0].resetButton = {label: '閲嶇疆', enable: 'true', type: 'reset', style: {backgroundColor: '#ffffff', color: 'rgba(0,0,0,0.65)', borderColor: '#d9d9d9', borderWidth: '1px', paddingLeft: '25px', paddingRight: '25px', paddingTop: '5px', paddingBottom: '5px', marginLeft: '10px'}}
+    } else if (_card.subcards[0].resetButton) {
+      _card.subcards[0].resetButton.enable = _card.wrap.resetEnable
+    }
 
     this.updateComponent(_card)
   }
diff --git a/src/menu/components/form/simple-form/options.jsx b/src/menu/components/form/simple-form/options.jsx
index 1ace5c6..9df9c00 100644
--- a/src/menu/components/form/simple-form/options.jsx
+++ b/src/menu/components/form/simple-form/options.jsx
@@ -53,6 +53,9 @@
   if (wrap.closeEnable === 'true') {
     buttons.push('closeEnable')
   }
+  if (wrap.resetEnable === 'true') {
+    buttons.push('resetEnable')
+  }
 
   const wrapForm = [
     {
@@ -152,6 +155,7 @@
       required: false,
       options: [
         {value: 'enable', label: '鎻愪氦'},
+        {value: 'resetEnable', label: '閲嶇疆'},
         {value: 'closeEnable', label: '鍏抽棴'},
       ],
     },
diff --git a/src/menu/components/share/markcomponent/index.jsx b/src/menu/components/share/markcomponent/index.jsx
index 246f2ea..f198d58 100644
--- a/src/menu/components/share/markcomponent/index.jsx
+++ b/src/menu/components/share/markcomponent/index.jsx
@@ -118,7 +118,21 @@
             'line-through': '涓垝绾�',
             'icon': '鍥炬爣',
             'iconfront': '鍥炬爣',
-            'iconback': '鍥炬爣',
+            'iconback': '鍥炬爣'
+          }
+
+          if (text[0] === 'indent') {
+            return (
+              <div>缂╄繘/{text[1]}涓瓧绗�</div>
+            )
+          } else if (text[0] === 'pointfront') {
+            return (
+              <div><span style={{display: 'inline-block', width: '8px', height: '8px', borderRadius: '14px', background: 'black', verticalAlign: 'middle'}}></span> 鐐癸紙鍓嶏級</div>
+            )
+          } else if (text[0] === 'pointback') {
+            return (
+              <div>鐐癸紙鍚庯級 <span style={{display: 'inline-block', width: '8px', height: '8px', borderRadius: '14px', background: 'black', verticalAlign: 'middle'}}></span></div>
+            )
           }
 
           return (
@@ -249,6 +263,7 @@
         })
       }
     ]
+
     let signs = [
       {
         value: 'font',
@@ -267,6 +282,14 @@
         label: '涓垝绾�'
       },
       {
+        value: 'pointfront',
+        label: '鐐癸紙鍓嶏級'
+      },
+      {
+        value: 'pointback',
+        label: '鐐癸紙鍚庯級'
+      },
+      {
         value: 'iconfront',
         label: '鍥炬爣锛堝墠锛�',
         children: icons
@@ -275,12 +298,32 @@
         value: 'iconback',
         label: '鍥炬爣锛堝悗锛�',
         children: icons
+      },
+      {
+        value: 'indent',
+        label: '缂╄繘',
+        children: [{
+          value: 2,
+          label: '2涓瓧绗�'
+        }, {
+          value: 4,
+          label: '4涓瓧绗�'
+        }, {
+          value: 6,
+          label: '6涓瓧绗�'
+        }, {
+          value: 8,
+          label: '8涓瓧绗�'
+        }]
       }
     ]
 
     if (type === 'line' || type === 'sequence') {
       signs.pop()
       signs.pop()
+      signs.pop()
+      signs.pop()
+      signs.pop()
     } else if (type === 'slider') {
       markColumns = markColumns.filter(col => {
         col.width = '20%'
diff --git a/src/menu/components/share/sourcecomponent/index.jsx b/src/menu/components/share/sourcecomponent/index.jsx
index bf42033..fe17598 100644
--- a/src/menu/components/share/sourcecomponent/index.jsx
+++ b/src/menu/components/share/sourcecomponent/index.jsx
@@ -88,7 +88,7 @@
         </div> : null}
         <Modal
           visible={!!visible}
-          width={visible !== 'system' ? 600 : 1000}
+          width={visible !== 'system' ? 650 : 1000}
           closable={false}
           maskClosable={false}
           okText="纭畾"
diff --git a/src/menu/components/share/sourcecomponent/inputform/index.jsx b/src/menu/components/share/sourcecomponent/inputform/index.jsx
index 5f552ce..0a06300 100644
--- a/src/menu/components/share/sourcecomponent/inputform/index.jsx
+++ b/src/menu/components/share/sourcecomponent/inputform/index.jsx
@@ -174,7 +174,7 @@
     
     return (
       <div className="mk-source-pop-wrap">
-        {keyword === 'input' ? <Form.Item label="鍦板潃" labelCol={{xs: { span: 24 }, sm: { span: 4 }}} wrapperCol={{xs: { span: 24 }, sm: { span: 20 }}}>
+        {keyword === 'input' ? <Form.Item label="鍦板潃" help="鍙娇鐢ˊmywebsite@浠f浛鍩熷悕锛堝惈铏氭嫙鐩綍锛夛紝濡傦細@mywebsite@/Content/images/xxx.jpg" labelCol={{xs: { span: 24 }, sm: { span: 4 }}} wrapperCol={{xs: { span: 24 }, sm: { span: 20 }}}>
           <TextArea id="source-input" value={url} rows={4} onChange={this.changeValue}/>
         </Form.Item> : null}
         {keyword === 'upload' ? <Form.Item label="涓婁紶" labelCol={{xs: { span: 24 }, sm: { span: 4 }}} wrapperCol={{xs: { span: 24 }, sm: { span: 20 }}}>
diff --git a/src/menu/components/share/sourcecomponent/inputform/index.scss b/src/menu/components/share/sourcecomponent/inputform/index.scss
index 576da5d..fc5b77f 100644
--- a/src/menu/components/share/sourcecomponent/inputform/index.scss
+++ b/src/menu/components/share/sourcecomponent/inputform/index.scss
@@ -50,6 +50,10 @@
     position: relative;
     top: -15px;
   }
+  .ant-form-explain {
+    margin-top: 5px;
+    word-break: break-all;
+  }
 }
 .picture-edit-model {
   .ant-modal {
diff --git a/src/menu/components/table/base-table/columns/index.jsx b/src/menu/components/table/base-table/columns/index.jsx
index 1205028..aad0434 100644
--- a/src/menu/components/table/base-table/columns/index.jsx
+++ b/src/menu/components/table/base-table/columns/index.jsx
@@ -2,7 +2,7 @@
 import PropTypes from 'prop-types'
 import { is, fromJS } from 'immutable'
 import { DndProvider, DragSource, DropTarget } from 'react-dnd'
-import { Table, Popover, Modal, message, notification } from 'antd'
+import { Table, Popover, Modal, message, notification, Typography } from 'antd'
 import { PlusOutlined, PlusSquareOutlined, EditOutlined, CopyOutlined, DeleteOutlined, FontColorsOutlined, CloseCircleOutlined, AntDesignOutlined } from '@ant-design/icons'
 
 import asyncComponent from '@/utils/asyncComponent'
@@ -12,6 +12,7 @@
 import './index.scss'
 
 const { confirm } = Modal
+const { Paragraph } = Typography
 const EditColumn = asyncComponent(() => import('./editColumn'))
 const MarkColumn = asyncIconComponent(() => import('@/menu/components/share/markcomponent'))
 const CardCellComponent = asyncComponent(() => import('@/menu/components/card/cardcellcomponent'))
@@ -199,7 +200,7 @@
       }
       return (
         <td style={{...style}} className={className}>
-          {val}
+          {column.field ? <Paragraph className="col-copy" copyable={{ text: column.field }}>{val}</Paragraph> : val}
           {column.Hide === 'true' ? <CloseCircleOutlined style={{marginLeft: '5px', color: 'orange', fontSize: '12px'}}/> : null}
           {column.marks && column.marks.length ? <AntDesignOutlined className="profile"/> : null}
         </td>
diff --git a/src/menu/components/table/base-table/columns/index.scss b/src/menu/components/table/base-table/columns/index.scss
index 45da4dc..48aae5d 100644
--- a/src/menu/components/table/base-table/columns/index.scss
+++ b/src/menu/components/table/base-table/columns/index.scss
@@ -23,6 +23,25 @@
     tr {
       td {
         background: #ffffff;
+        .col-copy {
+          margin-bottom: 0;
+          display: inline-block;
+          color: inherit;
+          .ant-typography-copy {
+            position: absolute;
+            left: 2px;
+            top: 0px;
+            margin-left: 0px;
+            font-size: 12px;
+            opacity: 0;
+            transition: opacity 0.2s;
+          }
+        }
+      }
+      td:hover .col-copy {
+        .ant-typography-copy {
+          opacity: 1;
+        }
       }
       td:not(.ant-table-selection-column) {
         position: relative;
diff --git a/src/menu/components/table/normal-table/columns/index.jsx b/src/menu/components/table/normal-table/columns/index.jsx
index 00f61c5..02653b8 100644
--- a/src/menu/components/table/normal-table/columns/index.jsx
+++ b/src/menu/components/table/normal-table/columns/index.jsx
@@ -12,7 +12,7 @@
 import './index.scss'
 
 const { confirm } = Modal
-const { Paragraph } = Typography 
+const { Paragraph } = Typography
 const EditColumn = asyncComponent(() => import('./editColumn'))
 const MarkColumn = asyncIconComponent(() => import('@/menu/components/share/markcomponent'))
 const CardCellComponent = asyncComponent(() => import('@/menu/components/card/cardcellcomponent'))
diff --git a/src/menu/datasource/index.jsx b/src/menu/datasource/index.jsx
index 759e84e..68edece 100644
--- a/src/menu/datasource/index.jsx
+++ b/src/menu/datasource/index.jsx
@@ -157,13 +157,15 @@
 
       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 if (/^date/ig.test(item.datatype)) {
+            item.type = 'text'
+            item.fieldlength = 50
           } else {
             item.type = 'text'
             item.fieldlength = +item.datatype.replace(/^Nvarchar\(/ig, '').replace(/\)/ig, '')
@@ -211,6 +213,23 @@
       if (config.subtype !== 'dualdatacard') {
         delete res.subColumns
       } else {
+        res.subColumns = res.subColumns.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 if (/^date/ig.test(item.datatype)) {
+            item.type = 'text'
+            item.fieldlength = 50
+          } else {
+            item.type = 'text'
+            item.fieldlength = +item.datatype.replace(/^Nvarchar\(/ig, '').replace(/\)/ig, '')
+          }
+          return item
+        })
+  
         res.subColumns.reverse()
       }
 
diff --git a/src/menu/datasource/verifycard/index.jsx b/src/menu/datasource/verifycard/index.jsx
index 7519b71..8da4cb7 100644
--- a/src/menu/datasource/verifycard/index.jsx
+++ b/src/menu/datasource/verifycard/index.jsx
@@ -2,7 +2,7 @@
 import PropTypes from 'prop-types'
 import { fromJS } from 'immutable'
 import { Form, Tabs, Popconfirm, notification, Modal, Typography, Spin, message, Button, Input } from 'antd'
-import { StopOutlined, CheckCircleOutlined, EditOutlined, SwapOutlined, DeleteOutlined, CopyOutlined, BorderOutlined, SnippetsOutlined } from '@ant-design/icons'
+import { StopOutlined, CheckCircleOutlined, TableOutlined, EditOutlined, SwapOutlined, DeleteOutlined, CopyOutlined, BorderOutlined, SnippetsOutlined } from '@ant-design/icons'
 import moment from 'moment'
 import md5 from 'md5'
 
@@ -1053,7 +1053,7 @@
             <EditTable actions={['edit', 'move', 'copy', 'del', 'clear']} searchKey={searchKey} type="datasourcefield" wrappedComponentRef={(inst) => this.datasource = inst} data={columns} columns={colColumns} onChange={(columns) => this.setState({columns})}/>
           </TabPane> : <TabPane tab={
             <span>
-              瀛楁闆�
+              瀛楁闆�<TableOutlined style={{marginLeft: '5px', fontSize: '12px'}} />
               {columns.length ? <span className="count-tip">{columns.length}</span> : null}
             </span>
           } key="columns">
diff --git a/src/menu/debug/index.jsx b/src/menu/debug/index.jsx
index 6e18351..91b7f27 100644
--- a/src/menu/debug/index.jsx
+++ b/src/menu/debug/index.jsx
@@ -315,7 +315,7 @@
   
             card.backElements.forEach(cell => {
               if (cell.eleType !== 'button' || cell.hidden === 'true') return
-              let sql = this.resetButton(item, cell, process)
+              let sql = this.resetButton(item, cell, process, null, true)
 
               if (sql) {
                 if (typeof(sql) === 'string') {
@@ -364,11 +364,18 @@
     })
   }
 
-  resetButton = (item, cell, process, group) => {
+  resetButton = (item, cell, process, group, isback) => {
     let sql = ''
     if (['exec', 'prompt', 'pop', 'form', 'formSubmit'].includes(cell.OpenType)) {
       if (cell.intertype === 'system' || cell.procMode === 'system') { // 绯荤粺鎺ュ彛
-        sql = this.getSysDefaultSql(cell, item, process, group)
+        if (item.subtype === 'dualdatacard' && isback) {
+          let _item = fromJS(item).toJS()
+          _item.columns = _item.subColumns || []
+          _item.setting.primaryKey = _item.setting.subKey
+          sql = this.getSysDefaultSql(cell, _item, process, group)
+        } else {
+          sql = this.getSysDefaultSql(cell, item, process, group)
+        }
       }
     } else if (cell.OpenType === 'excelIn') {
       if (cell.intertype === 'system') {
diff --git a/src/tabviews/custom/components/card/cardcellList/index.jsx b/src/tabviews/custom/components/card/cardcellList/index.jsx
index 9208d9a..fed3d09 100644
--- a/src/tabviews/custom/components/card/cardcellList/index.jsx
+++ b/src/tabviews/custom/components/card/cardcellList/index.jsx
@@ -426,6 +426,14 @@
             } else {
               val = <span>{val} <MkIcon style={mark.innerStyle} type={mark.icon} /></span>
             }
+          } else if (mark.space) {
+            val = <><span style={{float: 'left'}} dangerouslySetInnerHTML={{__html: mark.space}}></span>{val}</>
+          } else if (mark.point) {
+            if (mark.position === 'front') {
+              val = <>{mark.point}{val}</>
+            } else {
+              val = <>{val}{mark.point}</>
+            }
           }
           className = mark.signType
         }
@@ -507,6 +515,14 @@
               val = <span><MkIcon style={mark.innerStyle} type={mark.icon} /> {val}</span>
             } else {
               val = <span>{val} <MkIcon style={mark.innerStyle} type={mark.icon} /></span>
+            }
+          } else if (mark.space) {
+            val = <><span style={{float: 'left'}} dangerouslySetInnerHTML={{__html: mark.space}}></span>{val}</>
+          } else if (mark.point) {
+            if (mark.position === 'front') {
+              val = <>{mark.point}{val}</>
+            } else {
+              val = <>{val}{mark.point}</>
             }
           }
           className = mark.signType
@@ -774,9 +790,7 @@
             let func = new Function('data', card.formula)
             val = func(_data)
           } catch (e) {
-            if (window.GLOB.debugger === true) {
-              console.warn(e)
-            }
+            console.warn(e)
             val = ''
           }
         } else if (card.$sync) {
@@ -794,10 +808,8 @@
                 // eslint-disable-next-line
                 _val = eval(_val)
               } catch (e) {
-                if (window.GLOB.debugger === true) {
-                  console.info(_val)
-                  console.warn(e)
-                }
+                console.info(_val)
+                console.warn(e)
                 _val = 0
               }
             }
@@ -820,10 +832,8 @@
               // eslint-disable-next-line
               _val = eval(_val)
             } catch (e) {
-              if (window.GLOB.debugger === true) {
-                console.info(_val)
-                console.warn(e)
-              }
+              console.info(_val)
+              console.warn(e)
               _val = ''
             }
           }
@@ -882,6 +892,14 @@
             } else {
               val = <span>{val} <MkIcon style={mark.innerStyle} type={mark.icon} /></span>
             }
+          } else if (mark.space) {
+            val = <><span style={{float: 'left'}} dangerouslySetInnerHTML={{__html: mark.space}}></span>{val}</>
+          } else if (mark.point) {
+            if (mark.position === 'front') {
+              val = <>{mark.point}{val}</>
+            } else {
+              val = <>{val}{mark.point}</>
+            }
           }
           className = mark.signType
         }
diff --git a/src/tabviews/custom/components/chart/antv-X6/index.jsx b/src/tabviews/custom/components/chart/antv-X6/index.jsx
index 97525bc..faedfd9 100644
--- a/src/tabviews/custom/components/chart/antv-X6/index.jsx
+++ b/src/tabviews/custom/components/chart/antv-X6/index.jsx
@@ -989,7 +989,7 @@
     })
     graph.on('edge:click', ({ edge }) => {
       this.selectNode = edge
-      
+
       this.setState({node: edge.store.data})
 
       graph.clearTransformWidgets()
@@ -1561,19 +1561,41 @@
       let start_num = 0
       let end_num = 0
       let unvalid = false
+      let map = new Map()
+      let appMap = new Map()
       
       nodes.cells.forEach(item => {
-        if (item.mknode === 'start') {
+        if (item.shape === 'mk-text' || item.shape === 'lane') return
+
+        if (!item.mkdata) {
+          unvalid = true
+        } else if (item.mknode === 'start') {
           start_num++
         } else if (item.mknode === 'end') {
           end_num++
-        } else if (item.shape === 'edge' && item.mknode !== 'endEdge' && item.mknode !== 'startEdge') {
-          if (!item.mkdata.members || item.mkdata.members.length === 0) {
+        } else if (item.shape === 'edge') {
+          if (item.mknode !== 'endEdge' && item.mknode !== 'startEdge' && (!item.mkdata.members || item.mkdata.members.length === 0)) {
             unvalid = true
+          } else if (item.mknode === 'startEdge' || item.mkdata.flowType === 'reject') {
+            if (map.has(item.source.cell)) {
+              unvalid = true
+            } else {
+              map.set(item.source.cell, true)
+            }
+          } else if (item.mkdata.flowType === 'approval' || item.mknode === 'endEdge') {
+            let val = ''
+            if (item.mkdata.execCondition === 'open') {
+              val = item.mkdata.match + item.mkdata.matchVal
+            }
+            if (appMap.has(item.source.cell + val)) {
+              unvalid = true
+            } else {
+              appMap.set(item.source.cell + val, true)
+            }
           }
         }
-
       })
+
       if (start_num !== 1 || end_num !== 1 || unvalid) {
         _status = 0
       }
@@ -1993,15 +2015,49 @@
       let start_num = 0
       let end_num = 0
       let unvalidId = ''
-      
+      let emptyNode = null
+      let emptyEdge = null
+      let map = new Map()
+      let appMap = new Map()
+      let rejectId = ''
+      let approvalId = ''
+
       nodes.cells.forEach(item => {
-        if (item.mknode === 'start') {
+        if (item.shape === 'mk-text' || item.shape === 'lane') return
+
+        if (!item.mkdata) {
+          if (item.shape !== 'edge') {
+            if (!emptyNode) {
+              emptyNode = item
+            }
+          } else {
+            if (!emptyEdge) {
+              emptyEdge = item
+            }
+          }
+        } else if (item.mknode === 'start') {
           start_num++
         } else if (item.mknode === 'end') {
           end_num++
-        } else if (item.shape === 'edge' && item.mknode !== 'endEdge' && item.mknode !== 'startEdge') {
-          if (!item.mkdata.members || item.mkdata.members.length === 0) {
+        } else if (item.shape === 'edge' && !unvalidId && !rejectId && !approvalId) {
+          if (item.mknode !== 'endEdge' && item.mknode !== 'startEdge' && (!item.mkdata.members || item.mkdata.members.length === 0)) {
             unvalidId = item.id
+          } else if (item.mknode === 'startEdge' || item.mkdata.flowType === 'reject') {
+            if (map.has(item.source.cell)) {
+              rejectId = item.source.cell
+            } else {
+              map.set(item.source.cell, true)
+            }
+          } else if (item.mkdata.flowType === 'approval' || item.mknode === 'endEdge') {
+            let val = ''
+            if (item.mkdata.execCondition === 'open') {
+              val = item.mkdata.match + item.mkdata.matchVal
+            }
+            if (appMap.has(item.source.cell + val)) {
+              approvalId = item.source.cell
+            } else {
+              appMap.set(item.source.cell + val, item)
+            }
           }
         }
       })
@@ -2030,21 +2086,97 @@
           message: '缁撴潫鑺傜偣涓嶅彲娣诲姞澶氫釜锛�',
           duration: 2
         })
-      } else if (unvalidId) {
-        let edge = this.mkGraph.getCellById(unvalidId)
+      } else if (emptyNode) {
+        let errmsg = '閮ㄥ垎鑺傜偣鏈缃熀鏈俊鎭��'
+        if (emptyNode.attrs && emptyNode.attrs.text && emptyNode.attrs.text.text) {
+          errmsg = '鑺傜偣銆�' + emptyNode.attrs.text.text + '銆嬫湭璁剧疆鍩烘湰淇℃伅銆�'
+        }
+        notification.warning({
+          top: 92,
+          message: errmsg,
+          duration: 2
+        })
+      } else if (emptyEdge) {
+        let errmsg = '閮ㄥ垎杩炵嚎鏈缃熀鏈俊鎭��'
 
-        let node = edge.getTargetCell()
+        let edge = this.mkGraph.getCellById(emptyEdge.id)
+        let target = edge.getTargetCell()
+
+        let t_label = ''
+        if (target.attrs && target.attrs.text && target.attrs.text.text) {
+          t_label = target.attrs.text.text
+        }
+
+        let source = edge.getSourceCell()
+
+        let s_label = ''
+        if (source.attrs && source.attrs.text && source.attrs.text.text) {
+          s_label = source.attrs.text.text
+        }
+
+        if (t_label && s_label) {
+          errmsg = '鑺傜偣銆�' + s_label + '銆嬩笌鑺傜偣銆�' + t_label + '銆嬮棿杩炵嚎鏈缃熀鏈俊鎭��'
+        }
+
+        notification.warning({
+          top: 92,
+          message: errmsg,
+          duration: 2
+        })
+      } else if (rejectId) {
+        let node = this.mkGraph.getCellById(rejectId)
 
         let title = ''
-        if (node.attrs && node.attrs.text) {
-          title = node.attrs.text.text + ''
+        if (node.attrs && node.attrs.text && node.attrs.text.text) {
+          title = '鑺傜偣銆�' + node.attrs.text.text + '銆�'
         } else if (node.mkdata) {
           title = '鐘舵�侊細' + node.mkdata.status + ' - ' + node.mkdata.statusName
         }
 
         notification.warning({
           top: 92,
-          message: '杩炴帴锛�' + title + '锛夌殑绾挎湭璁剧疆瀹℃壒浜猴紒',
+          message: title + ' 涓嶅彲璁剧疆涓ゆ潯椹冲洖杩炵嚎锛�',
+          duration: 2
+        })
+      } else if (approvalId) {
+        let node = this.mkGraph.getCellById(approvalId)
+
+        let title = ''
+        if (node.attrs && node.attrs.text && node.attrs.text.text) {
+          title = '鑺傜偣銆�' + node.attrs.text.text + '銆�'
+        } else if (node.mkdata) {
+          title = '鐘舵�侊細' + node.mkdata.status + ' - ' + node.mkdata.statusName
+        }
+
+        notification.warning({
+          top: 92,
+          message: title + ' 鍚庣殑瀹℃壒鍒嗘敮鎵ц鏉′欢閲嶅锛�',
+          duration: 2
+        })
+      } else if (unvalidId) {
+        let edge = this.mkGraph.getCellById(unvalidId)
+
+        let node = edge.getTargetCell()
+
+        let title = ''
+        if (node.attrs && node.attrs.text && node.attrs.text.text) {
+          title = node.attrs.text.text
+        } else if (node.mkdata) {
+          title = '鐘舵�侊細' + node.mkdata.status + ' - ' + node.mkdata.statusName
+        }
+
+        let source = edge.getSourceCell()
+
+        let s_label = ''
+        if (source.attrs && source.attrs.text && source.attrs.text.text) {
+          s_label = source.attrs.text.text
+        } else if (source.mkdata) {
+          s_label = '鐘舵�侊細' + source.mkdata.status + ' - ' + source.mkdata.statusName
+        }
+
+        notification.warning({
+          top: 92,
+          message: '鑺傜偣銆�' + s_label + '銆嬩笌銆�' + title + '銆嬮棿杩炵嚎鏈缃鎵逛汉锛�',
           duration: 2
         })
       } else {
diff --git a/src/tabviews/custom/components/chart/antv-X6/nodeupdate/index.jsx b/src/tabviews/custom/components/chart/antv-X6/nodeupdate/index.jsx
index bf50398..9ff4eb4 100644
--- a/src/tabviews/custom/components/chart/antv-X6/nodeupdate/index.jsx
+++ b/src/tabviews/custom/components/chart/antv-X6/nodeupdate/index.jsx
@@ -499,7 +499,7 @@
           visible={visible}
           closable={false}
           maskClosable={false}
-          width={1000}
+          width={1050}
           onOk={this.confirm}
           onCancel={() => this.setState({visible: false})}
           destroyOnClose
diff --git a/src/tabviews/custom/components/chart/antv-X6/nodeupdate/index.scss b/src/tabviews/custom/components/chart/antv-X6/nodeupdate/index.scss
index 893aaf2..aa7ebb2 100644
--- a/src/tabviews/custom/components/chart/antv-X6/nodeupdate/index.scss
+++ b/src/tabviews/custom/components/chart/antv-X6/nodeupdate/index.scss
@@ -130,6 +130,7 @@
     background-image: none;
     border: 1px solid #d9d9d9;
     border-radius: 4px;
+    vertical-align: middle;
 
     .anticon-form {
       float: right;
diff --git a/src/tabviews/custom/components/chart/antv-X6/nodeupdate/memberform.jsx b/src/tabviews/custom/components/chart/antv-X6/nodeupdate/memberform.jsx
index 65f565d..0d89461 100644
--- a/src/tabviews/custom/components/chart/antv-X6/nodeupdate/memberform.jsx
+++ b/src/tabviews/custom/components/chart/antv-X6/nodeupdate/memberform.jsx
@@ -175,7 +175,7 @@
 
     return (
       <>
-        <div className="member-input">{value.length}浜�<FormOutlined onClick={this.trigger} /></div>
+        <div className="member-input">{value.length > 0 ? value.length + '浜�' : ''}<FormOutlined onClick={this.trigger} /></div>
         <Modal
           wrapClassName="member-modal"
           title="閫夋嫨浜哄憳"
diff --git a/src/tabviews/custom/components/chart/antv-X6/nodeupdate/nodeform.jsx b/src/tabviews/custom/components/chart/antv-X6/nodeupdate/nodeform.jsx
index 4d6fc81..6444785 100644
--- a/src/tabviews/custom/components/chart/antv-X6/nodeupdate/nodeform.jsx
+++ b/src/tabviews/custom/components/chart/antv-X6/nodeupdate/nodeform.jsx
@@ -1,6 +1,6 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
-import { Form, Row, Col, Input, Radio, Tooltip, InputNumber } from 'antd'
+import { Form, Row, Col, Input, Radio, Tooltip, InputNumber, Switch } from 'antd'
 import { QuestionCircleOutlined } from '@ant-design/icons'
 
 import MemberForm from './memberform'
@@ -14,13 +14,23 @@
   }
 
   state = {
-    flowType: this.props.data.flowType || 'approval'
+    flowType: this.props.data.flowType || 'approval',
+    execCondition: this.props.data.execCondition === 'open',
   }
 
   handleConfirm = () => {
     return new Promise((resolve, reject) => {
       this.props.form.validateFieldsAndScroll((err, values) => {
         if (!err) {
+          if (values.execCondition === true) {
+            values.execCondition = 'open'
+          } else if (values.execCondition === false) {
+            values.execCondition = 'close'
+          }
+
+          if (values.matchVal) {
+            values.matchVal = values.matchVal.replace(/\t+|\v+|\s+/g, '')
+          }
           resolve(values)
         } else {
           reject(err)
@@ -32,7 +42,7 @@
   render() {
     const { node, orgs } = this.props
     const { getFieldDecorator } = this.props.form
-    const { flowType } = this.state
+    const { flowType, execCondition } = this.state
     const formItemLayout = {
       labelCol: {
         xs: { span: 24 },
@@ -155,6 +165,60 @@
               )}
             </Form.Item>
           </Col> : null}
+          {nodetype === 'edge' && flowType !== 'reject' ? <Col span={12}>
+            <Form.Item label="鎵ц鏉′欢">
+              {getFieldDecorator('execCondition', {
+                valuePropName: 'checked',
+                initialValue: execCondition
+              })(
+                <Switch checkedChildren="寮�鍚�" unCheckedChildren="鍏抽棴" onChange={(val) => this.setState({execCondition: val})} />
+              )}
+            </Form.Item>
+          </Col> : null}
+          {nodetype === 'edge' && flowType !== 'reject' && execCondition ? <Col span={12}>
+            <Form.Item label="瀵规瘮鏂瑰紡">
+              {getFieldDecorator('match', {
+                initialValue: data.match || '='
+              })(
+                <Radio.Group>
+                  <Radio value="=">=</Radio>
+                  <Radio value="<">&lt;</Radio>
+                  <Radio value=">">&gt;</Radio>
+                  <Radio value="<=">&lt;=</Radio>
+                  <Radio value=">=">&gt;=</Radio>
+                  <Radio value="!=">!=</Radio>
+                </Radio.Group>
+              )}
+            </Form.Item>
+          </Col> : null}
+          {nodetype === 'edge' && flowType !== 'reject' && execCondition ? <Col span={12}>
+            <Form.Item label={
+              <Tooltip placement="topLeft" title="瀵规瘮鍊间腑涓嶅彲鍖呭惈鍒惰〃绗︺�佺┖鏍笺�佹崲琛岀绛夈��">
+                <QuestionCircleOutlined className="mk-form-tip" />
+                瀵规瘮鍊�
+              </Tooltip>
+            }>
+              {getFieldDecorator('matchVal', {
+                initialValue: data.matchVal || ''
+              })(
+                <Input placeholder="" autoComplete="off"/>
+              )}
+            </Form.Item>
+          </Col> : null}
+          {nodetype === 'node' ? <Col span={12}>
+            <Form.Item label={
+              <Tooltip placement="topLeft" title="鏍囪灏嗕綔涓鸿妭鐐笽D">
+                <QuestionCircleOutlined className="mk-form-tip" />
+                鏍囪
+              </Tooltip>
+            }>
+              {getFieldDecorator('sign', {
+                initialValue: data.sign || ''
+              })(
+                <Input placeholder="" autoComplete="off"/>
+              )}
+            </Form.Item>
+          </Col> : null}
           <Col span={24}>
             <Form.Item label="澶囨敞">
               {getFieldDecorator('remark', {
diff --git a/src/tabviews/custom/components/form/simple-form/index.jsx b/src/tabviews/custom/components/form/simple-form/index.jsx
index 8115aea..5b3c32c 100644
--- a/src/tabviews/custom/components/form/simple-form/index.jsx
+++ b/src/tabviews/custom/components/form/simple-form/index.jsx
@@ -63,7 +63,7 @@
 
     let _group = _config.subcards[0]
 
-    if (_group.subButton.enable === 'false' && (!_group.closeButton || _group.closeButton.enable !== 'true')) {
+    if (_group.subButton.enable === 'false' && (!_group.closeButton || _group.closeButton.enable !== 'true') && (!_group.resetButton || _group.resetButton.enable !== 'true')) {
       _group.subButton.style.display = 'none'
       _group.$button = 'no-button'
     }
@@ -318,6 +318,16 @@
     MKEmitter.emit('closeTabView', group.subButton.$MenuID)
   }
 
+  resetTab = () => {
+    const { data } = this.state
+
+    this.setState({
+      data: null
+    }, () => {
+      this.setState({data: data})
+    })
+  }
+
   render() {
     const { config, loading, BID, BData, data, group } = this.state
 
@@ -350,6 +360,7 @@
             columns={config.columns}
             selectedData={data.$$empty ? [] : [data]}
           />
+          {group.resetButton && group.resetButton.enable === 'true' ? <Button type="link" onClick={this.resetTab} style={group.resetButton.style}>{group.resetButton.label}</Button> : null}
           {group.closeButton && group.closeButton.enable === 'true' ? <Button type="link" onClick={this.closeTab} style={group.closeButton.style}>{group.closeButton.label}</Button> : null}
         </div> : null}
       </div>
diff --git a/src/tabviews/custom/components/module/account/index.jsx b/src/tabviews/custom/components/module/account/index.jsx
index 24d04ca..bdc02be 100644
--- a/src/tabviews/custom/components/module/account/index.jsx
+++ b/src/tabviews/custom/components/module/account/index.jsx
@@ -120,10 +120,12 @@
   }
 
   setBook = (item, resolve) => {
+    const { config } = this.props
+
     if (!resolve) {
       this.setState({activeItem: item})
   
-      MKEmitter.emit('resetSelectLine', this.props.config.uuid, item.id, item)
+      MKEmitter.emit('resetSelectLine', config.uuid, item.id, item)
     }
     
     let userid = sessionStorage.getItem('UserID') || ''
@@ -152,6 +154,7 @@
       }
 
       if (resolve) {
+        sessionStorage.setItem('ThirdMenu', config.$pageId)
         window.location.reload()
       }
     })
diff --git a/src/tabviews/custom/components/share/normalTable/index.jsx b/src/tabviews/custom/components/share/normalTable/index.jsx
index 90c6088..be531d2 100644
--- a/src/tabviews/custom/components/share/normalTable/index.jsx
+++ b/src/tabviews/custom/components/share/normalTable/index.jsx
@@ -144,6 +144,14 @@
           }
         } else if (mark.innerStyle) {
           content = <span style={mark.innerStyle}>{content}</span>
+        } else if (mark.space) {
+          content = <><span dangerouslySetInnerHTML={{__html: mark.space}}></span>{content}</>
+        } else if (mark.point) {
+          if (mark.position === 'front') {
+            content = <>{mark.point}{content}</>
+          } else {
+            content = <>{content}{mark.point}</>
+          }
         }
       }
       if (col.blur) {
@@ -208,6 +216,14 @@
           }
         } else if (mark.innerStyle) {
           content = <span style={mark.innerStyle}>{content}</span>
+        } else if (mark.space) {
+          content = <><span dangerouslySetInnerHTML={{__html: mark.space}}></span>{content}</>
+        } else if (mark.point) {
+          if (mark.position === 'front') {
+            content = <>{mark.point}{content}</>
+          } else {
+            content = <>{content}{mark.point}</>
+          }
         }
       }
 
@@ -337,9 +353,7 @@
           let func = new Function('data', col.formula)
           content = func([record])
         } catch (e) {
-          if (window.GLOB.debugger === true) {
-            console.warn(e)
-          }
+          console.warn(e)
           content = ''
         }
       } else {
@@ -352,10 +366,8 @@
             // eslint-disable-next-line
             content = eval(content)
           } catch (e) {
-            if (window.GLOB.debugger === true) {
-              console.info(content)
-              console.warn(e)
-            }
+            console.info(content)
+            console.warn(e)
             content = ''
           }
   
@@ -389,6 +401,14 @@
           }
         } else if (mark.innerStyle) {
           content = <span style={mark.innerStyle}>{content}</span>
+        } else if (mark.space) {
+          content = <><span dangerouslySetInnerHTML={{__html: mark.space}}></span>{content}</>
+        } else if (mark.point) {
+          if (mark.position === 'front') {
+            content = <>{mark.point}{content}</>
+          } else {
+            content = <>{content}{mark.point}</>
+          }
         }
       }
 
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 4ce4d1b..0f95fec 100644
--- a/src/tabviews/custom/components/table/edit-table/normalTable/index.jsx
+++ b/src/tabviews/custom/components/table/edit-table/normalTable/index.jsx
@@ -309,6 +309,14 @@
           }
         } else if (mark.innerStyle) {
           content = <span style={mark.innerStyle}>{content}</span>
+        } else if (mark.space) {
+          content = <><span dangerouslySetInnerHTML={{__html: mark.space}}></span>{content}</>
+        } else if (mark.point) {
+          if (mark.position === 'front') {
+            content = <>{mark.point}{content}</>
+          } else {
+            content = <>{content}{mark.point}</>
+          }
         }
       }
 
@@ -397,6 +405,14 @@
           }
         } else if (mark.innerStyle) {
           content = <span style={mark.innerStyle}>{content}</span>
+        } else if (mark.space) {
+          content = <><span dangerouslySetInnerHTML={{__html: mark.space}}></span>{content}</>
+        } else if (mark.point) {
+          if (mark.position === 'front') {
+            content = <>{mark.point}{content}</>
+          } else {
+            content = <>{content}{mark.point}</>
+          }
         }
       }
 
@@ -441,9 +457,7 @@
           let func = new Function('data', col.formula)
           content = func([record])
         } catch (e) {
-          if (window.GLOB.debugger === true) {
-            console.warn(e)
-          }
+          console.warn(e)
           content = ''
         }
       } else {
@@ -457,10 +471,8 @@
             // eslint-disable-next-line
             content = eval(content)
           } catch (e) {
-            if (window.GLOB.debugger === true) {
-              console.info(content)
-              console.warn(e)
-            }
+            console.info(content)
+            console.warn(e)
             content = ''
           }
         }
@@ -498,6 +510,14 @@
           }
         } else if (mark.innerStyle) {
           content = <span style={mark.innerStyle}>{content}</span>
+        } else if (mark.space) {
+          content = <><span dangerouslySetInnerHTML={{__html: mark.space}}></span>{content}</>
+        } else if (mark.point) {
+          if (mark.position === 'front') {
+            content = <>{mark.point}{content}</>
+          } else {
+            content = <>{content}{mark.point}</>
+          }
         }
       }
 
@@ -750,6 +770,14 @@
             }
           } else if (mark.innerStyle) {
             content = <span style={mark.innerStyle}>{content}</span>
+          } else if (mark.space) {
+            content = <><span dangerouslySetInnerHTML={{__html: mark.space}}></span>{content}</>
+          } else if (mark.point) {
+            if (mark.position === 'front') {
+              content = <>{mark.point}{content}</>
+            } else {
+              content = <>{content}{mark.point}</>
+            }
           }
         }
 
@@ -817,6 +845,14 @@
             }
           } else if (mark.innerStyle) {
             content = <span style={mark.innerStyle}>{content}</span>
+          } else if (mark.space) {
+            content = <><span dangerouslySetInnerHTML={{__html: mark.space}}></span>{content}</>
+          } else if (mark.point) {
+            if (mark.position === 'front') {
+              content = <>{mark.point}{content}</>
+            } else {
+              content = <>{content}{mark.point}</>
+            }
           }
         }
 
@@ -850,9 +886,7 @@
           let func = new Function('data', col.formula)
           content = func([record])
         } catch (e) {
-          if (window.GLOB.debugger === true) {
-            console.warn(e)
-          }
+          console.warn(e)
           content = ''
         }
       } else {
@@ -866,10 +900,8 @@
             // eslint-disable-next-line
             content = eval(content)
           } catch (e) {
-            if (window.GLOB.debugger === true) {
-              console.info(content)
-              console.warn(e)
-            }
+            console.info(content)
+            console.warn(e)
             content = ''
           }
         }
@@ -907,6 +939,14 @@
           }
         } else if (mark.innerStyle) {
           content = <span style={mark.innerStyle}>{content}</span>
+        } else if (mark.space) {
+          content = <><span dangerouslySetInnerHTML={{__html: mark.space}}></span>{content}</>
+        } else if (mark.point) {
+          if (mark.position === 'front') {
+            content = <>{mark.point}{content}</>
+          } else {
+            content = <>{content}{mark.point}</>
+          }
         }
       }
 
diff --git a/src/tabviews/custom/index.jsx b/src/tabviews/custom/index.jsx
index e4f0f5a..55cf1da 100644
--- a/src/tabviews/custom/index.jsx
+++ b/src/tabviews/custom/index.jsx
@@ -238,6 +238,15 @@
       config.$cache = config.cacheLocal === 'true'
       config.$time = config.localCacheTime || 0
 
+      if (window.GLOB.systemType !== 'production' && result.modifydate) {
+        let s = (new Date().getTime() - new Date(result.modifydate).getTime()) / (1000 * 60 * 60)
+        if (!isNaN(s) && s < 2) {
+          config.$cache = false
+          config.$time = 0
+          config.cacheUseful = 'false'
+        }
+      }
+
       let initInters = []
 
       config.interfaces = this.formatInterSetting(config.interfaces, regs, MenuID, initInters)
diff --git a/src/tabviews/zshare/actionList/exceloutbutton/index.jsx b/src/tabviews/zshare/actionList/exceloutbutton/index.jsx
index 30385fe..7e032ca 100644
--- a/src/tabviews/zshare/actionList/exceloutbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/exceloutbutton/index.jsx
@@ -447,7 +447,7 @@
     const { btn } = this.props
     
     let imgCol = false
-    let columns = btn.verify.columns.filter(col => {
+    let columns = btn.verify.columns.map(col => {
       if (col.type === 'image') {
         imgCol = true
       }
diff --git a/src/tabviews/zshare/actionList/normalbutton/index.jsx b/src/tabviews/zshare/actionList/normalbutton/index.jsx
index eeb24ce..816e450 100644
--- a/src/tabviews/zshare/actionList/normalbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/normalbutton/index.jsx
@@ -2882,7 +2882,19 @@
         _item.value = _item.value.replace(/\t+|\v+/g, '')       // 鍘婚櫎鍒惰〃绗�
 
         if (item.interception !== 'false') {                    // 鍘婚櫎棣栧熬绌烘牸
-          _item.value = _item.value.replace(/(^\s*|\s*$)/g, '')
+          if (item.interception === 'func') {
+            try {
+              // eslint-disable-next-line
+              let func = new Function('value', 'data', item.func)
+              _item.value = func(_item.value, _data)
+              _item.value = _item.value !== undefined ? _item.value : ''
+            } catch (e) {
+              console.warn(e)
+              _item.value = ''
+            }
+          } else {
+            _item.value = _item.value.replace(/(^\s*|\s*$)/g, '')
+          }
         }
         if (_item.type === 'text' && /@appkey@|@SessionUid@|@bid@/ig.test(_item.value)) { // 鐗规畩瀛楁鏇挎崲
           _item.value = _item.value.replace(/^(\s*)@appkey@(\s*)$/ig, window.GLOB.appkey).replace(/^(\s*)@SessionUid@(\s*)$/ig, (localStorage.getItem('SessionUid') || '')).replace(/^(\s*)@bid@(\s*)$/ig, (BID || ''))
diff --git a/src/tabviews/zshare/actionList/printbutton/index.jsx b/src/tabviews/zshare/actionList/printbutton/index.jsx
index 6691220..4bd500f 100644
--- a/src/tabviews/zshare/actionList/printbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/printbutton/index.jsx
@@ -2148,7 +2148,19 @@
         _item.value = _item.value.replace(/\t+|\v+/g, '')       // 鍘婚櫎鍒惰〃绗�
 
         if (item.interception !== 'false') {                    // 鍘婚櫎棣栧熬绌烘牸
-          _item.value = _item.value.replace(/(^\s*|\s*$)/g, '')
+          if (item.interception === 'func') {
+            try {
+              // eslint-disable-next-line
+              let func = new Function('value', 'data', item.func)
+              _item.value = func(_item.value, _data)
+              _item.value = _item.value !== undefined ? _item.value : ''
+            } catch (e) {
+              console.warn(e)
+              _item.value = ''
+            }
+          } else {
+            _item.value = _item.value.replace(/(^\s*|\s*$)/g, '')
+          }
         }
         if (_item.type === 'text' && /@appkey@|@SessionUid@|@bid@/ig.test(_item.value)) { // 鐗规畩瀛楁鏇挎崲
           _item.value = _item.value.replace(/^(\s*)@appkey@(\s*)$/ig, window.GLOB.appkey).replace(/^(\s*)@SessionUid@(\s*)$/ig, (localStorage.getItem('SessionUid') || '')).replace(/^(\s*)@bid@(\s*)$/ig, (this.props.BID || ''))
diff --git a/src/tabviews/zshare/mutilform/index.jsx b/src/tabviews/zshare/mutilform/index.jsx
index e4f95d3..b1f23a7 100644
--- a/src/tabviews/zshare/mutilform/index.jsx
+++ b/src/tabviews/zshare/mutilform/index.jsx
@@ -1218,7 +1218,19 @@
             _item.value = _item.value.replace(/\t+|\v+/g, '')       // 鍘婚櫎鍒惰〃绗�
     
             if (item.interception !== 'false') {                    // 鍘婚櫎棣栧熬绌烘牸
-              _item.value = _item.value.replace(/(^\s*|\s*$)/g, '')
+              if (item.interception === 'func') {
+                try {
+                  // eslint-disable-next-line
+                  let func = new Function('value', 'data', item.func)
+                  _item.value = func(_item.value, record)
+                  _item.value = _item.value !== undefined ? _item.value : ''
+                } catch (e) {
+                  console.warn(e)
+                  _item.value = ''
+                }
+              } else {
+                _item.value = _item.value.replace(/(^\s*|\s*$)/g, '')
+              }
             }
             if (item.type === 'text' && /@appkey@|@SessionUid@|@bid@/ig.test(_item.value)) { // 鐗规畩瀛楁鏇挎崲
               _item.value = _item.value.replace(/^(\s*)@appkey@(\s*)$/ig, window.GLOB.appkey).replace(/^(\s*)@SessionUid@(\s*)$/ig, (localStorage.getItem('SessionUid') || '')).replace(/^(\s*)@bid@(\s*)$/ig, (this.props.BID || ''))
diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
index 5b520c4..6555fcc 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
@@ -970,7 +970,7 @@
             <Button className="excel-col-add mk-red" title="娓呯┖Excel鍒�" onClick={this.clearField}>
               娓呯┖Excel鍒�
             </Button>
-            <div style={{color: '#959595', fontSize: '13px', paddingLeft: '10px'}}>濡傞渶瀵煎嚭搴忓彿锛岃浣跨敤瀛楁 $Index锛涙暟鍊肩被鍨嬪鍑烘椂鍙繘琛屾暟鎹鐞嗭紙鍙栫粷瀵瑰�笺�佷繚鐣欏皬鏁颁綅锛夛紱绾㈣壊鏍囬瀵煎嚭鏃跺垪澶存枃瀛椾负绾㈣壊銆�</div>
+            <div style={{color: '#959595', fontSize: '13px', paddingLeft: '10px'}}>濡傞渶瀵煎嚭搴忓彿锛岃浣跨敤瀛楁 $Index锛涙暟鍊肩被鍨嬪鍑烘椂鍙彇缁濆鍊间互鍙婅缃皬鏁颁綅锛涘鍑轰负鍚︽椂锛屼笉浣跨敤琛屼俊鎭紱绾㈣壊鏍囬瀵煎嚭鏃跺垪澶存枃瀛椾负绾㈣壊銆�</div>
             <EditTable actions={['edit', 'move', 'copy', 'del']} type="excelcolumn" wrappedComponentRef={(inst) => this.columnRef = inst} data={verify.columns} columns={excelColumns} onChange={this.changeColumns}/>
           </TabPane>
           {card.intertype === 'system' ? <TabPane tab={
diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelout/utils.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelout/utils.jsx
index 04b1446..20bb8e3 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelout/utils.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelout/utils.jsx
@@ -67,14 +67,7 @@
     let custompage = /@pageSize@|@orderBy@/i.test(_dataresource + _customScript)
     
     // 姝e垯鏇挎崲
-    let _regoptions = regoptions.map(item => {
-      return {
-        reg: new RegExp('@' + item.key + '@', 'ig'),
-        value: `'0'`
-      }
-    })
-
-    _regoptions.push({
+    regoptions.push({
       reg: new RegExp('@orderBy@', 'ig'),
       value: verify.order
     }, {
@@ -85,7 +78,7 @@
       value: 1
     })
 
-    _regoptions.forEach(item => {
+    regoptions.forEach(item => {
       _dataresource = _dataresource.replace(item.reg, item.value)
       _customScript = _customScript.replace(item.reg, item.value)
       _tailScript = _tailScript.replace(item.reg, item.value)
diff --git a/src/templates/zshare/formconfig.jsx b/src/templates/zshare/formconfig.jsx
index 752c7ec..f2373e3 100644
--- a/src/templates/zshare/formconfig.jsx
+++ b/src/templates/zshare/formconfig.jsx
@@ -3615,16 +3615,28 @@
     {
       type: 'radio',
       key: 'interception',
-      label: '鎴彇绌烘牸',
+      label: '鎴彇鏂瑰紡',
       initVal: card.interception || 'true',
-      tooltip: '鎻愪氦鏃讹紝鏄惁鎴彇棣栧熬鐨勭┖鐧藉瓧绗︺��',
+      tooltip: '鎻愪氦鏃剁殑鏂囨湰澶勭悊鏂瑰紡锛岀┖鐧藉瓧绗︽寚寮�澶存垨缁撳熬鐨勭┖鐧藉瓧绗︺��',
       options: [{
-        value: 'true',
-        text: '鏄�'
-      }, {
         value: 'false',
-        text: '鍚�'
+        text: '鏃�'
+      }, {
+        value: 'true',
+        text: '绌虹櫧瀛楃'
+      }, {
+        value: 'func',
+        text: '鑷畾涔夊嚱鏁�'
       }]
+    },
+    {
+      type: 'textarea',
+      key: 'func',
+      label: '鍑芥暟',
+      initVal: card.func || '',
+      tooltip: '鍑芥暟鏈変袱涓叆鍙�(value, data)锛岀涓�涓负褰撳墠琛ㄥ崟鍊硷紝绗簩涓负琛ㄥ崟鎵�鏈夊瓧娈�-鍊肩殑瀵硅薄锛岃杩斿洖澶勭悊鍚庣殑鍊笺��',
+      rows: 2,
+      required: true
     },
     {
       type: 'textarea',
@@ -3858,7 +3870,7 @@
       type: 'radio',
       key: 'constant',
       label: 'Unicode甯搁噺',
-      tooltip: '浣跨敤鏃跺皢鍦ㄦ彁浜ゅ唴瀹瑰墠鍔犱笂 N锛屼唬琛ㄥ瓨鍏ユ暟鎹簱鏃朵互 Unicode 鏍煎紡瀛樺偍銆�',
+      tooltip: `浣跨敤鏃跺皢鍦ㄦ彁浜ゅ唴瀹瑰墠鍔犱笂 N锛屼唬琛ㄥ瓨鍏ユ暟鎹簱鏃朵互 Unicode 鏍煎紡瀛樺偍銆備緥濡傦細@nvarchar=N'脴W30041'銆俙,
       initVal: card.constant || 'false',
       options: [{
         value: 'true',
diff --git a/src/templates/zshare/modalform/index.jsx b/src/templates/zshare/modalform/index.jsx
index be0389c..43d8efa 100644
--- a/src/templates/zshare/modalform/index.jsx
+++ b/src/templates/zshare/modalform/index.jsx
@@ -147,6 +147,9 @@
           shows.push('regularExtra')
         }
       }
+      if (this.record.interception === 'func') {
+        shows.push('func')
+      }
     } else if (type === 'number') {
       reTypes.initval = 'number'
       reRequired.initval = true
@@ -165,6 +168,9 @@
         shows.push('fieldlength')
       } else if (this.record.declare === 'decimal') {
         shows.push('decimal')
+      }
+      if (this.record.interception === 'func') {
+        shows.push('func')
       }
     } else if (['multiselect', 'select', 'link', 'radio', 'checkbox'].includes(type)) {
       if (this.record.resourceType === '0') {        // 鑷畾涔夎祫婧�
@@ -278,6 +284,9 @@
       if (this.record.encryption === 'false') {
         shows.push('enterReplace')
       }
+      if (this.record.interception === 'func') {
+        shows.push('func')
+      }
     }
 
     if (['multiselect', 'select', 'link', 'radio', 'checkbox', 'checkcard', 'cascader'].includes(type)) {
diff --git a/src/templates/zshare/verifycard/baseform/index.jsx b/src/templates/zshare/verifycard/baseform/index.jsx
index 6ea9c9e..83c366d 100644
--- a/src/templates/zshare/verifycard/baseform/index.jsx
+++ b/src/templates/zshare/verifycard/baseform/index.jsx
@@ -279,7 +279,7 @@
   }
 
   render() {
-    const { unionFields, verify, notes, card, appType } = this.props
+    const { unionFields, verify, notes, card, appType, columns } = this.props
     const { wxTemps, selectTemp } = this.state
     const formItemLayout = {
       labelCol: {
@@ -290,6 +290,17 @@
         xs: { span: 24 },
         sm: { span: 16 }
       }
+    }
+
+    let _columns = []
+    if (window.GLOB.process) {
+      _columns = columns.filter(col => {
+        if (!col.field) return false
+        if (col.field.toLowerCase() === 'id') return false
+        if (col.type === 'text' && col.fieldlength > 100)  return false
+  
+        return true
+      })
     }
 
     return (
@@ -462,6 +473,22 @@
               </Radio.Group>
             </Form.Item>
           </Col> : null}
+          {window.GLOB.process && verify.workFlow === 'true' && verify.flowType === 'approval' ? <Col span={8}>
+            <Form.Item label={
+              <Tooltip placement="bottomLeft" title="濡傛灉瀹℃壒瀛樺湪澶氭潯鍒嗘敮锛屽彲娣诲姞瀹℃壒娴佺▼鐨勬帶鍒跺瓧娈碉紝閫氳繃琛屼俊鎭帶鍒舵祦绋嬭蛋鍚戙�傛敞锛氶渶鍦ㄦ祦绋嬪浘涓畬鍠勫垎鏀殑鎵ц鏉′欢銆�">
+                <QuestionCircleOutlined className="mk-form-tip" />
+                娴佺▼鎺у埗
+              </Tooltip>
+            }>
+              <Select allowClear value={verify.flowBranch} onChange={(val) => {this.onOptionChange(val || '', 'flowBranch')}}>
+                {_columns.map(option =>
+                  <Select.Option key={option.field} value={option.field}>
+                    {option.label}
+                  </Select.Option>
+                )}
+              </Select>
+            </Form.Item>
+          </Col> : null}
           <Col span={24}></Col>
           <Col span={8}>
             <Form.Item label={
diff --git a/src/templates/zshare/verifycard/index.jsx b/src/templates/zshare/verifycard/index.jsx
index 3103749..df7c6dc 100644
--- a/src/templates/zshare/verifycard/index.jsx
+++ b/src/templates/zshare/verifycard/index.jsx
@@ -626,7 +626,7 @@
       oriVerify: fromJS(_verify).toJS()
     })
 
-    if (config.Template !== 'FormTab' && card.intertype === 'inner') {
+    if (card.intertype === 'inner') {
       return
     }
 
@@ -637,11 +637,6 @@
           field: card.field,
           label: card.label,
           type: 'text'
-        })
-        resolve(_fields)
-      } else if (config.Template === 'FormTab') {
-        config.groups.forEach(group => {
-          _fields.push(...group.sublist)
         })
         resolve(_fields)
       } else if (card.modal && (card.OpenType === 'pop' || !card.OpenType)) {
@@ -1553,7 +1548,7 @@
   }
 
   render() {
-    const { card } = this.props
+    const { card, columns } = this.props
     const { activeKey, verifyInter, setting, verify, fields, uniqueFields, uniqueColumns, unionFields, onceUniqueColumns, columnsFields, contrastColumns, customColumns, orderColumns, scriptsColumns, cbScriptsColumns, orderModular, orderModularDetail, voucher, voucherDetail, notes, appType } = this.state
     const formItemLayout = {
       labelCol: {
@@ -1576,7 +1571,7 @@
               {verify.default === 'false' ? <span className="count-tip"><ExclamationOutlined style={{color: 'orange'}}/></span> : null}
             </span>
           } key="base">
-            <BaseForm card={card} appType={appType} unionFields={unionFields} setting={setting} verify={verify} notes={notes} onChange={(verify) => this.setState({verify})} wrappedComponentRef={(inst) => this.baseForm = inst}/>
+            <BaseForm card={card} appType={appType} columns={columns} unionFields={unionFields} setting={setting} verify={verify} notes={notes} onChange={(verify) => this.setState({verify})} wrappedComponentRef={(inst) => this.baseForm = inst}/>
           </TabPane> : null}
           {verifyInter === 'system' ? <TabPane tab={
             <span>
@@ -1612,7 +1607,7 @@
               fields={fields}
               btn={this.props.card}
               billcodes={verify.billcodes}
-              columns={this.props.columns}
+              columns={columns}
               modular={orderModular}
               modularDetail={orderModularDetail}
               orderChange={this.orderChange}
@@ -1641,7 +1636,7 @@
           } key="voucher">
             <VoucherForm
               voucher={voucher}
-              columns={this.props.columns}
+              columns={columns}
               voucherobj={verify.voucher}
               voucherDetail={voucherDetail}
               voucherChange={this.voucherChange}
diff --git a/src/utils/utils-custom.js b/src/utils/utils-custom.js
index 59816a5..2af2a61 100644
--- a/src/utils/utils-custom.js
+++ b/src/utils/utils-custom.js
@@ -919,6 +919,13 @@
     if (item.setting && item.setting.supModule && item.setting.supModule[0] !== 'empty') {
       item.setting.supModule = ''
     }
+    
+    if (item.wrap && item.wrap.supType === 'multi') {
+      item.wrap.supType = 'single'
+
+      delete item.supNodes
+    }
+    
     if (item.wrap && item.wrap.supModule) {
       item.wrap.supModule = ''
     }
@@ -1546,6 +1553,11 @@
     } else if (card.type !== 'balcony' && !card.setting.supModule) {  // 鎮诞妗嗕笂绾х粍浠堕渶鍗曠嫭璁剧疆
       errors.push({ level: 0, detail: '鏈缃笂绾х粍浠讹紒'})
     }
+    if (card.subtype === 'dualdatacard' && card.subColumns) {
+      card.subColumns.forEach(col => {
+        columns.push(col.field)
+      })
+    }
   } else if ((card.type === 'balcony' || card.type === 'card') && card.wrap.datatype === 'public') {
     columns = card.columns.map(c => c.field)
   }
@@ -1553,6 +1565,31 @@
   let doubleClick = ''
   if (card.type === 'table') {
     doubleClick = card.wrap.doubleClick || ''
+  }
+
+  let checkBtn = (cell) => {
+    if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
+      if (!cell.modal || cell.modal.fields.length === 0) {
+        errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
+      }
+    } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
+      errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
+    } else if (cell.OpenType === 'excelOut') {
+      if (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0) {
+        errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
+      } else if (cell.intertype === 'system' && cell.verify.dataType !== 'custom' && card.$c_ds && columns.length > 0) {
+        let cols = []
+        cell.verify.columns.forEach(col => {
+          if (col.output === 'false' || col.Column === '$Index') return
+          if (!columns.includes(col.Column)) {
+            cols.push(col.Column)
+          }
+        })
+        if (cols.length) {
+          errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楋紙${cols.join('銆�')}锛夊湪瀛楁闆嗕腑涓嶅瓨鍦紒`})
+        }
+      }
+    }
   }
 
   if (card.$c_ac) {
@@ -1565,15 +1602,7 @@
       //     errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑寮圭獥鏍囩鏈惎鐢╜})
       //   }
       // }
-      if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
-        if (!cell.modal || cell.modal.fields.length === 0) {
-          errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
-        }
-      } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
-        errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
-      } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
-        errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
-      }
+      checkBtn(cell)
       if (doubleClick === cell.uuid) {
         doubleClick = ''
       }
@@ -1586,15 +1615,7 @@
       item.elements.forEach(cell => {
         if (cell.eleType === 'button') {
           if (cell.hidden === 'true') return
-          if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
-            if (!cell.modal || cell.modal.fields.length === 0) {
-              errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
-            }
-          } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
-            errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
-          } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
-            errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
-          }
+          checkBtn(cell)
           if (linkbtn && linkbtn === cell.uuid) {
             linkbtn = ''
           }
@@ -1607,15 +1628,7 @@
         item.backElements.forEach(cell => {
           if (cell.eleType === 'button') {
             if (cell.hidden === 'true') return
-            if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
-              if (!cell.modal || cell.modal.fields.length === 0) {
-                errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
-              }
-            } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
-              errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
-            } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
-              errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
-            }
+            checkBtn(cell)
             if (linkbtn && linkbtn === cell.uuid) {
               linkbtn = ''
             }
@@ -1639,15 +1652,7 @@
     card.elements.forEach(cell => {
       if (cell.eleType === 'button') {
         if (cell.hidden === 'true') return
-        if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
-          if (!cell.modal || cell.modal.fields.length === 0) {
-            errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
-          }
-        } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
-          errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
-        } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
-          errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
-        }
+        checkBtn(cell)
       } else if (cell.datatype === 'dynamic' && cell.field && !columns.includes(cell.field)) {
         errors.push({ level: 1, detail: `鍗$墖涓姩鎬佸瓧娈碘��${cell.field}鈥濇棤鏁坄})
       }
@@ -1660,15 +1665,8 @@
         col.elements.forEach(cell => {
           if (cell.eleType === 'button') {
             if (cell.hidden === 'true') return
-            if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
-              if (!cell.modal || cell.modal.fields.length === 0) {
-                errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑琛ㄥ崟灏氭湭娣诲姞`})
-              }
-            } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
-              errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎叆鍒楁湭璁剧疆锛乣})
-            } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
-              errors.push({ level: 0, detail: `鎸夐挳鈥�${cell.label}鈥濅腑瀵煎嚭鍒楁湭璁剧疆锛乣})
-            }
+
+            checkBtn(cell)
 
             if (doubleClick === cell.uuid) {
               doubleClick = ''
diff --git a/src/utils/utils-datamanage.js b/src/utils/utils-datamanage.js
index 3bac86d..4544fe1 100644
--- a/src/utils/utils-datamanage.js
+++ b/src/utils/utils-datamanage.js
@@ -212,7 +212,14 @@
     }
 
     if (_customScript) {
-      if (LText) {
+      if (DateCount) {
+        DateCount = `${DateCount}
+          ${_tailScript}
+          aaa:
+          if @ErrorCode!=''
+            insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,'${sessionStorage.getItem('UserID') || ''}' 
+        `
+      } else if (LText) {
         LText = `${LText}
           ${_tailScript}
           aaa:
@@ -227,6 +234,17 @@
             insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,'${sessionStorage.getItem('UserID') || ''}' 
         `
       }
+    } else if (_tailScript && DateCount) {
+      LText = `declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000),@UserName nvarchar(50),@FullName nvarchar(50),@RoleID nvarchar(512),@mk_departmentcode nvarchar(512),@mk_organization nvarchar(512),@mk_user_type nvarchar(20),@mk_nation nvarchar(50),@mk_province nvarchar(50),@mk_city nvarchar(50),@mk_district nvarchar(50),@mk_address nvarchar(100)
+        Select @ErrorCode='',@retmsg ='',@UserName='${userName}', @FullName='${fullName}', @RoleID='${RoleID}', @mk_departmentcode='${departmentcode}', @mk_organization='${organization}', @mk_user_type='${mk_user_type}', @mk_nation='${nation}', @mk_province='${province}', @mk_city='${city}', @mk_district='${district}', @mk_address='${address}'
+        ${LText}
+      `
+      DateCount = `${DateCount}
+        ${_tailScript}
+        aaa:
+        if @ErrorCode!=''
+          insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,'${sessionStorage.getItem('UserID') || ''}' 
+      `
     } else if (_tailScript) {
       LText = `declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000),@UserName nvarchar(50),@FullName nvarchar(50),@RoleID nvarchar(512),@mk_departmentcode nvarchar(512),@mk_organization nvarchar(512),@mk_user_type nvarchar(20),@mk_nation nvarchar(50),@mk_province nvarchar(50),@mk_city nvarchar(50),@mk_district nvarchar(50),@mk_address nvarchar(100)
         Select @ErrorCode='',@retmsg ='',@UserName='${userName}', @FullName='${fullName}', @RoleID='${RoleID}', @mk_departmentcode='${departmentcode}', @mk_organization='${organization}', @mk_user_type='${mk_user_type}', @mk_nation='${nation}', @mk_province='${province}', @mk_city='${city}', @mk_district='${district}', @mk_address='${address}'
@@ -247,6 +265,7 @@
     if (window.GLOB.debugger === true) {
       _customScript && console.info(`${setting.$name ? `/*${setting.$name} 鑷畾涔夎剼鏈�*/\n` : ''}${LText ? '' : '/*涓嶆墽琛岄粯璁ql*/\n'}${_customScript}`)
       LText && console.info(`${setting.$name ? `/*${setting.$name} 鏁版嵁婧�*/\n` : ''}` + LText.replace(/\n\s{8}/ig, '\n'))
+      DateCount && console.info(`${setting.$name ? `/*${setting.$name} 鎬绘暟鏌ヨ*/\n` : ''}` + DateCount.replace(/\n\s{8}/ig, '\n'))
     }
 
     if (setting.$name) {
diff --git a/src/utils/utils.js b/src/utils/utils.js
index e874151..7da4357 100644
--- a/src/utils/utils.js
+++ b/src/utils/utils.js
@@ -1,3 +1,4 @@
+import React from 'react'
 import moment from 'moment'
 import md5 from 'md5'
 
@@ -2117,6 +2118,7 @@
     let status = 0
     let statusName = ''
     let detailId = ''
+    let error = ''
 
     if (verify.flowType === 'start') {
       target = flow.cells.filter(cell => cell.mknode === 'start')[0]
@@ -2125,17 +2127,112 @@
         detailId = target.id
         status = target.mkdata.status
         statusName = target.mkdata.statusName
+      } else {
+        error = '宸ヤ綔娴佹棤寮�濮嬭妭鐐�'
       }
     } else if (_data.works_flow_param) {
-      node = JSON.parse(window.decodeURIComponent(window.atob(_data.works_flow_param)))
+      try {
+        node = JSON.parse(window.decodeURIComponent(window.atob(_data.works_flow_param)))
+      } catch (e) {
+        node = null
+      }
 
       if (node) {
         let lines = flow.cells.filter(cell => cell.shape === 'edge' && cell.source.cell === node.id)
         if (verify.flowType === 'reject') {
           line = lines.filter(cell => cell.mkdata.flowType === 'reject' || cell.mknode === 'startEdge')[0]
         } else {
-          line = lines.filter(cell => cell.mkdata.flowType !== 'reject' && cell.mknode !== 'startEdge')[0]
+          let endEdge = null
+          lines = lines.filter(cell => {
+            if (cell.mknode === 'endEdge') {
+              endEdge = cell
+              return false
+            }
+
+            return cell.mkdata.flowType !== 'reject' && cell.mknode !== 'startEdge'
+          })
+
+          if (lines.length === 0) {
+            if (!endEdge) {
+              error = '鏃犲彲鎵ц鐨勬祦绋嬪垎鏀�'
+            } else {
+              line = endEdge
+            }
+          } else {
+            let branchKey = verify.flowBranch ? verify.flowBranch.toLowerCase() : ''
+  
+            if (!branchKey) {
+              lines.forEach(line => {
+                if (line.mkdata.execCondition === 'open') {
+                  error = '鎸夐挳鏈缃祦绋嬫帶鍒跺瓧娈点��'
+                }
+              })
+              if (!error) {
+                line = lines[0]
+              }
+            } else if (!_data.hasOwnProperty(branchKey)) {
+              error = '琛屼俊鎭腑鏃犳祦绋嬫帶鍒跺瓧娈点��'
+            } else {
+              if (endEdge) {
+                line = endEdge
+              }
+
+              let equalLine = null
+              let gtOrLtLine = []
+              let unEqualLine = null
+              let branchVal = _data[branchKey]
+
+              if (branchVal && typeof(branchVal) === 'string' && !isNaN(branchVal)) {
+                branchVal = +branchVal
+              }
+
+              lines.forEach(item => {
+                if (item.mkdata.execCondition !== 'open') {
+                  line = item
+                } else {
+                  if (item.mkdata.match === '=') {
+                    if (item.mkdata.matchVal === branchVal + '') {
+                      equalLine = item
+                    }
+                  } else if (item.mkdata.match === '!=') {
+                    if (item.mkdata.matchVal !== branchVal + '') {
+                      unEqualLine = item
+                    }
+                  } else {
+                    if (item.mkdata.match === '<') {
+                      if (item.mkdata.matchVal < branchVal) {
+                        gtOrLtLine.push({...item, dist: Math.abs(item.mkdata.matchVal - branchVal)})
+                      }
+                    } else if (item.mkdata.match === '>') {
+                      if (item.mkdata.matchVal > branchVal) {
+                        gtOrLtLine.push({...item, dist: Math.abs(item.mkdata.matchVal - branchVal)})
+                      }
+                    } else if (item.mkdata.match === '<=') {
+                      if (item.mkdata.matchVal <= branchVal) {
+                        gtOrLtLine.push({...item, dist: Math.abs(item.mkdata.matchVal - branchVal)})
+                      }
+                    } else if (item.mkdata.match === '>=') {
+                      if (item.mkdata.matchVal >= branchVal) {
+                        gtOrLtLine.push({...item, dist: Math.abs(item.mkdata.matchVal - branchVal)})
+                      }
+                    }
+                  }
+                }
+              })
+
+              if (equalLine) {
+                line = equalLine
+              } else if (gtOrLtLine.length > 0) {
+                gtOrLtLine.sort((a, b) => a.dist - b.dist)
+                line = gtOrLtLine[0]
+              } else if (unEqualLine) {
+                line = unEqualLine
+              }
+            }
+          }
         }
+      } else {
+        error = '琛屼俊鎭腑宸ヤ綔娴佸弬鏁版棤娉曡В鏋�'
       }
       
       if (line) {
@@ -2143,7 +2240,11 @@
         status = line.mkdata.status
         statusName = line.mkdata.statusName
         target = flow.cells.filter(cell => cell.id === line.target.cell)[0]
+      } else if (!error) {
+        error = '宸ヤ綔娴佷腑鏃犲搴旀祦绋�'
       }
+    } else {
+      error = '琛屼俊鎭腑鏃犲伐浣滄祦鍙傛暟'
     }
 
     if (verify.flowSql === 'true' && target) {
@@ -2184,20 +2285,12 @@
       `
       }
     } else if (verify.flowSql === 'true') {
-      target = flow.cells.filter(cell => cell.mknode === 'start')[0]
-
-      if (target) {
-        detailId = target.id
-      }
-
       status = 0
       statusName = '寮傚父'
+
       _sql += `
       /* 宸ヤ綔娴佸紓甯竤ql */
-      update s_my_works_flow set status=@status@,statusname=@statusname@,works_flow_param=@works_flow_param@,works_flow_detail_id=@works_flow_detail_id@,modifydate=getdate(),modifyuserid=@userid@,modifyuser=@username,modifystaff=@fullname
-      where works_flow_id=@ID@ and works_flow_code=@works_flow_code@ and deleted=0
-      insert into s_my_works_flow_log (works_flow_id,works_flow_code,works_flow_name,works_flow_param,status,statusname,works_flow_detail_id,work_group,work_grade,upid)
-      select @ID@,@works_flow_code@,@works_flow_name@ ,@works_flow_param@,@status@,@statusname@,@works_flow_detail_id@,@work_group@,@work_grade@,@time_id@
+      select @ErrorCode='E',@retmsg='${error || '宸ヤ綔娴佹墽琛屽紓甯�'}' goto aaa
       `
     }
 
@@ -2302,10 +2395,7 @@
  * @description 鑾峰彇鏍囪淇℃伅
  */
 export function getMark (marks, record, style = {}) {
-  let icon = null
-  let innerStyle = null
-  let position = null
-  let signType = ''
+  let res = {}
   style = JSON.parse(JSON.stringify(style))
 
   marks.some(mark => {
@@ -2342,42 +2432,45 @@
 
     if (type === 'font') {
       style.color = mark.color
-      innerStyle = {color: mark.color}
-      signType = ' sign-font'
+      res.innerStyle = {color: mark.color}
+      res.signType = ' sign-font'
     } else if (type === 'background') {
       style.backgroundColor = mark.color
       if (mark.fontColor) {
         style.color = mark.fontColor
-        innerStyle = {color: mark.fontColor}
+        res.innerStyle = {color: mark.fontColor}
       }
     } else if (type === 'underline') {
       style.textDecoration = 'underline'
       style.color = mark.color
-      innerStyle = {color: mark.color, textDecoration: 'underline'}
+      res.innerStyle = {color: mark.color, textDecoration: 'underline'}
     } else if (type === 'line-through') {
       style.textDecoration = 'line-through'
       style.color = mark.color
-      innerStyle = {color: mark.color, textDecoration: 'line-through'}
+      res.innerStyle = {color: mark.color, textDecoration: 'line-through'}
     } else if (type.indexOf('icon') > -1) {
-      icon = mark.signType[mark.signType.length - 1]
-      innerStyle = {color: mark.color}
+      res.icon = mark.signType[mark.signType.length - 1]
+      res.innerStyle = {color: mark.color}
       if (type === 'iconfront' || mark.signType[1] === 'front') {
-        position = 'front'
+        res.position = 'front'
       } else {
-        position = 'back'
+        res.position = 'back'
       }
+    } else if (type === 'indent') {
+      style.color = mark.color
+      res.space = Array(mark.signType[1] + 1).join('&nbsp;')
+    } else if (type === 'pointfront') {
+      res.position = 'front'
+      res.point = <span style={{display: 'inline-block', marginRight: '3px', width: '8px', height: '8px', borderRadius: '14px', background: mark.color, verticalAlign: 'middle'}}></span>
+    } else if (type === 'pointback') {
+      res.position = 'back'
+      res.point = <span style={{display: 'inline-block', marginLeft: '3px', width: '8px', height: '8px', borderRadius: '14px', background: mark.color, verticalAlign: 'middle'}}></span>
     }
 
     return true
   })
 
-  return {
-    style,
-    icon,
-    innerStyle,
-    position,
-    signType
-  }
+  return res
 }
 
 /**

--
Gitblit v1.8.0