From 0c84df247914f893ef5e41d57a422e10a2dc814c Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期五, 12 十一月 2021 17:02:06 +0800
Subject: [PATCH] 2021-11-12

---
 src/templates/zshare/verifycard/index.jsx | 1791 ++++++++++++++++++++++++++---------------------------------
 1 files changed, 788 insertions(+), 1,003 deletions(-)

diff --git a/src/templates/zshare/verifycard/index.jsx b/src/templates/zshare/verifycard/index.jsx
index 5138724..5bc26a1 100644
--- a/src/templates/zshare/verifycard/index.jsx
+++ b/src/templates/zshare/verifycard/index.jsx
@@ -1,27 +1,31 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { fromJS } from 'immutable'
-import { Form, Tabs, Row, Col, Radio, Button, Table, Popconfirm, Icon, notification, Modal, message, InputNumber, Tooltip, Typography } from 'antd'
+import { Form, Tabs, Row, Col, Radio, Button, Select, Popconfirm, notification, Modal, message, InputNumber, Tooltip, Typography } from 'antd'
+import { QuestionCircleOutlined, CheckCircleOutlined, StopOutlined, EditOutlined, SwapOutlined, DeleteOutlined } from '@ant-design/icons'
 import moment from 'moment'
 
 import Api from '@/api'
 import Utils from '@/utils/utils.js'
-
+import options from '@/store/options.js'
 import UniqueForm from './uniqueform'
 import ContrastForm from './contrastform'
 import CustomForm from './customform'
 import CustomScript from './customscript'
+import CallBackCustomScript from './callbackcustomscript'
 import BillcodeForm from './billcodeform'
 import VoucherForm from './voucherform'
+import asyncComponent from '@/utils/asyncComponent'
+import { updateForm } from '@/utils/utils-update.js'
 import './index.scss'
 
 const { TabPane } = Tabs
 const { confirm } = Modal
 const { Paragraph } = Typography
+const EditTable = asyncComponent(() => import('@/templates/zshare/editTable'))
 
 class VerifyCard extends Component {
   static propTpyes = {
-    floor: PropTypes.any,      // 鏄惁涓哄瓙琛�
     btnTab: PropTypes.any,     // 琛ㄥ崟鏍囩椤碉紙鎸夐挳锛夊弬鏁�
     config: PropTypes.any,     // 琛ㄥ崟鏍囩椤靛弬鏁�
     dict: PropTypes.object,    // 瀛楀吀椤�
@@ -30,7 +34,9 @@
   }
 
   state = {
-    initsql: '',          // sql楠岃瘉鏃跺彉閲忓0鏄庡強璧嬪��
+    initsql: '',            // sql楠岃瘉鏃跺彉閲忓0鏄庡強璧嬪��
+    notes: [],              // 鐭俊妯℃澘
+    setting: null,
     verify: {},
     fields: [],
     usefulfields: '',
@@ -41,170 +47,177 @@
     voucherDetail: [],
     systemScripts: [],
     columnsFields: [],
+    unionFields: [],
+    uniqueFields: [],  // 鍞竴鎬ч獙璇侊紝琛ㄥ崟瀛楁
     uniqueColumns: [
       {
-        title: '瀛楁鍚�',
+        title: '鍚嶇О',
+        dataIndex: 'fieldlabel',
+        width: '20%'
+      },
+      {
+        title: '瀛楁',
         dataIndex: 'field',
-        width: '35%'
+        width: '20%',
+        editable: true,
+        inputType: 'multiStr',
+        options: []
       },
       {
         title: '鎶ラ敊缂栫爜',
         dataIndex: 'errorCode',
-        width: '12%'
+        width: '13%',
+        editable: true,
+        inputType: 'select',
+        options: [
+          { value: 'E', text: 'E' },
+          { value: 'N', text: 'N' },
+          { value: 'F', text: 'F' },
+          { value: 'NM', text: 'NM' }
+        ]
       },
       {
         title: '楠岃瘉绫诲瀷',
         dataIndex: 'verifyType',
-        width: '13%',
-        render: (text, record) => record.verifyType === 'logic' ? '閫昏緫楠岃瘉' : '鐗╃悊楠岃瘉'
+        width: '14%',
+        render: (text, record) => record.verifyType === 'logic' ? '閫昏緫楠岃瘉' : '鐗╃悊楠岃瘉',
+        inputType: 'select',
+        editable: true,
+        options: [
+          { value: 'physical', text: '鐗╃悊楠岃瘉' },
+          { value: 'logic', text: '閫昏緫楠岃瘉' }
+        ]
       },
       {
-        title: '鐘舵��',
+        title: '鏄惁鍚敤',
         dataIndex: 'status',
-        width: '15%',
+        width: '14%',
+        editable: true,
+        required: false,
+        inputType: 'switch',
         render: (text, record) => record.status === 'false' ?
           (
             <div>
               {this.props.dict['model.status.forbidden']}
-              <Icon style={{marginLeft: '5px'}} type="stop" theme="twoTone" twoToneColor="#ff4d4f" />
+              <StopOutlined style={{marginLeft: '5px', color: '#ff4d4f'}} />
             </div>
           ) :
           (
             <div>
               {this.props.dict['model.status.open']}
-              <Icon style={{marginLeft: '5px'}} type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
+              <CheckCircleOutlined style={{marginLeft: '5px', color: '#52c41a'}}/>
             </div>
           )
-      },
-      {
-        title: '鎿嶄綔',
-        align: 'center',
-        width: '25%',
-        dataIndex: 'operation',
-        render: (text, record) =>
-          (<div>
-            <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record, 'unique')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
-            <span className="operation-btn" title={this.props.dict['header.form.up']} onClick={() => this.handleUpDown(record, 'unique', 'up')} style={{color: '#1890ff'}}><Icon type="arrow-up" /></span>
-            <span className="operation-btn" title={this.props.dict['header.form.down']} onClick={() => this.handleUpDown(record, 'unique', 'down')} style={{color: '#ff4d4f'}}><Icon type="arrow-down" /></span>
-            <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'unique')} style={{color: '#8E44AD'}}><Icon type="swap" /></span>
-            <Popconfirm
-              overlayClassName="popover-confirm"
-              title={this.props.dict['model.query.delete']}
-              onConfirm={() => this.handleDelete(record, 'unique')
-            }>
-              <span className="operation-btn" style={{color: '#ff4d4f'}}><Icon type="delete" /></span>
-            </Popconfirm>
-          </div>)
       }
     ],
     onceUniqueColumns: [
       {
-        title: '瀛楁鍚�',
-        dataIndex: 'field',
-        width: '45%'
+        title: '鍚嶇О',
+        dataIndex: 'fieldlabel',
+        width: '30%'
       },
       {
-        title: '鐘舵��',
-        dataIndex: 'status',
+        title: '瀛楁',
+        dataIndex: 'field',
         width: '30%',
+        editable: true,
+        inputType: 'multiStr',
+        options: []
+      },
+      {
+        title: '鏄惁鍚敤',
+        dataIndex: 'status',
+        width: '20%',
+        editable: true,
+        required: false,
+        inputType: 'switch',
         render: (text, record) => record.status === 'false' ?
           (
             <div>
               {this.props.dict['model.status.forbidden']}
-              <Icon style={{marginLeft: '5px'}} type="stop" theme="twoTone" twoToneColor="#ff4d4f" />
+              <StopOutlined style={{marginLeft: '5px', color: '#ff4d4f'}} />
             </div>
           ) :
           (
             <div>
               {this.props.dict['model.status.open']}
-              <Icon style={{marginLeft: '5px'}} type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
+              <CheckCircleOutlined style={{marginLeft: '5px', color: '#52c41a'}}/>
             </div>
           )
       },
-      {
-        title: '鎿嶄綔',
-        align: 'center',
-        width: '25%',
-        dataIndex: 'operation',
-        render: (text, record) =>
-          (<div>
-            <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record, 'unique')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
-            <span className="operation-btn" title={this.props.dict['header.form.up']} onClick={() => this.handleUpDown(record, 'unique', 'up')} style={{color: '#1890ff'}}><Icon type="arrow-up" /></span>
-            <span className="operation-btn" title={this.props.dict['header.form.down']} onClick={() => this.handleUpDown(record, 'unique', 'down')} style={{color: '#ff4d4f'}}><Icon type="arrow-down" /></span>
-            <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'unique')} style={{color: '#8E44AD'}}><Icon type="swap" /></span>
-            <Popconfirm
-              overlayClassName="popover-confirm"
-              title={this.props.dict['model.query.delete']}
-              onConfirm={() => this.handleDelete(record, 'unique')
-            }>
-              <span className="operation-btn" style={{color: '#ff4d4f'}}><Icon type="delete" /></span>
-            </Popconfirm>
-          </div>)
-      }
     ],
     contrastColumns: [
       {
         title: '鍐呭1',
         dataIndex: 'frontfield',
-        width: '13%'
+        width: '14%',
+        inputType: 'input',
+        editable: true
       },
       {
         title: '杩愮畻绗�',
         dataIndex: 'operator',
-        width: '13%'
+        width: '14%',
+        editable: true,
+        inputType: 'select',
+        options: [
+          { value: '=', text: '=' },
+          { value: '!=', text: '!=' },
+          { value: '>', text: '>' },
+          { value: '<', text: '<' },
+          { value: '>=', text: '>=' },
+          { value: '<=', text: '<=' },
+          { value: 'in', text: 'in' },
+          { value: 'like', text: 'like' }
+        ]
       },
       {
         title: '鍐呭2',
         dataIndex: 'backfield',
-        width: '13%',
+        width: '14%',
+        inputType: 'input',
+        editable: true
       },
       {
         title: '鎻愮ず淇℃伅',
         dataIndex: 'errmsg',
-        width: '13%'
+        width: '14%',
+        inputType: 'input',
+        editable: true
       },
       {
         title: '鎶ラ敊缂栫爜',
         dataIndex: 'errorCode',
-        width: '13%'
+        width: '14%',
+        editable: true,
+        inputType: 'select',
+        options: [
+          { value: 'E', text: 'E' },
+          { value: 'N', text: 'N' },
+          { value: 'F', text: 'F' },
+          { value: 'NM', text: 'NM' }
+        ]
       },
       {
-        title: '鐘舵��',
+        title: '鏄惁鍚敤',
         dataIndex: 'status',
-        width: '15%',
+        width: '13%',
+        editable: true,
+        required: false,
+        inputType: 'switch',
         render: (text, record) => record.status === 'false' ?
           (
             <div>
               {this.props.dict['model.status.forbidden']}
-              <Icon style={{marginLeft: '5px'}} type="stop" theme="twoTone" twoToneColor="#ff4d4f" />
+              <StopOutlined style={{marginLeft: '5px', color: '#ff4d4f'}} />
             </div>
           ) :
           (
             <div>
               {this.props.dict['model.status.open']}
-              <Icon style={{marginLeft: '5px'}} type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
+              <CheckCircleOutlined style={{marginLeft: '5px', color: '#52c41a'}}/>
             </div>
           )
-      },
-      {
-        title: '鎿嶄綔',
-        align: 'center',
-        width: '20%',
-        dataIndex: 'operation',
-        render: (text, record) =>
-          (<div>
-            <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record, 'contrast')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
-            <span className="operation-btn" title={this.props.dict['header.form.up']} onClick={() => this.handleUpDown(record, 'contrast', 'up')} style={{color: '#1890ff'}}><Icon type="arrow-up" /></span>
-            <span className="operation-btn" title={this.props.dict['header.form.down']} onClick={() => this.handleUpDown(record, 'contrast', 'down')} style={{color: '#ff4d4f'}}><Icon type="arrow-down" /></span>
-            <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'contrast')} style={{color: '#8E44AD'}}><Icon type="swap" /></span>
-            <Popconfirm
-              overlayClassName="popover-confirm"
-              title={this.props.dict['model.query.delete']}
-              onConfirm={() => this.handleDelete(record, 'contrast')
-            }>
-              <span className="operation-btn" style={{color: '#ff4d4f'}}><Icon type="delete" /></span>
-            </Popconfirm>
-          </div>)
       }
     ],
     customColumns: [
@@ -212,9 +225,18 @@
         title: 'SQL',
         dataIndex: 'sql',
         width: '45%',
-        render: (text) => (
-          <Paragraph copyable ellipsis={{ rows: 5, expandable: true }}>{text}</Paragraph>
-        )
+        render: (text) => {
+          let title = text.match(/^\s*\/\*.+\*\//)
+          title = title && title[0] ? title[0] : ''
+          text = title ? text.replace(title, '') : text
+
+          return (
+            <div>
+              {title ? <span style={{color: '#a50'}}>{title}</span> : null}
+              <Paragraph copyable ellipsis={{ rows: 4, expandable: true }}>{text}</Paragraph>
+            </div>
+          )
+        }
       },
       {
         title: '缁撴灉澶勭悊',
@@ -239,13 +261,13 @@
           (
             <div>
               {this.props.dict['model.status.forbidden']}
-              <Icon style={{marginLeft: '5px'}} type="stop" theme="twoTone" twoToneColor="#ff4d4f" />
+              <StopOutlined style={{marginLeft: '5px', color: '#ff4d4f'}} />
             </div>
           ) :
           (
             <div>
               {this.props.dict['model.status.open']}
-              <Icon style={{marginLeft: '5px'}} type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
+              <CheckCircleOutlined style={{marginLeft: '5px', color: '#52c41a'}}/>
             </div>
           )
       },
@@ -255,17 +277,15 @@
         width: '15%',
         dataIndex: 'operation',
         render: (text, record) =>
-          (<div>
-            <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record, 'customverify')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
-            <span className="operation-btn" title={this.props.dict['header.form.up']} onClick={() => this.handleUpDown(record, 'customverify', 'up')} style={{color: '#1890ff'}}><Icon type="arrow-up" /></span>
-            <span className="operation-btn" title={this.props.dict['header.form.down']} onClick={() => this.handleUpDown(record, 'customverify', 'down')} style={{color: '#ff4d4f'}}><Icon type="arrow-down" /></span>
-            <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'customverify')} style={{color: '#8E44AD'}}><Icon type="swap" /></span>
+          (<div style={{textAlign: 'center'}}>
+            <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record, 'customverify')} style={{color: '#1890ff'}}><EditOutlined /></span>
+            <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'customverify')} style={{color: '#8E44AD'}}><SwapOutlined /></span>
             <Popconfirm
               overlayClassName="popover-confirm"
               title={this.props.dict['model.query.delete']}
               onConfirm={() => this.handleDelete(record, 'customverify')
             }>
-              <span className="operation-btn" style={{color: '#ff4d4f'}}><Icon type="delete" /></span>
+              <span className="operation-btn" style={{color: '#ff4d4f'}}><DeleteOutlined /></span>
             </Popconfirm>
           </div>)
       }
@@ -275,9 +295,18 @@
         title: 'SQL',
         dataIndex: 'sql',
         width: '60%',
-        render: (text) => (
-          <Paragraph copyable ellipsis={{ rows: 5, expandable: true }}>{text}</Paragraph>
-        )
+        render: (text) => {
+          let title = text.match(/^\s*\/\*.+\*\//)
+          title = title && title[0] ? title[0] : ''
+          text = title ? text.replace(title, '') : text
+
+          return (
+            <div>
+              {title ? <span style={{color: '#a50'}}>{title}</span> : null}
+              <Paragraph copyable ellipsis={{ rows: 4, expandable: true }}>{text}</Paragraph>
+            </div>
+          )
+        }
       },
       {
         title: '鎵ц浣嶇疆',
@@ -301,13 +330,13 @@
           (
             <div>
               {this.props.dict['model.status.forbidden']}
-              <Icon style={{marginLeft: '5px'}} type="stop" theme="twoTone" twoToneColor="#ff4d4f" />
+              <StopOutlined style={{marginLeft: '5px', color: '#ff4d4f'}} />
             </div>
           ) :
           (
             <div>
               {this.props.dict['model.status.open']}
-              <Icon style={{marginLeft: '5px'}} type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
+              <CheckCircleOutlined style={{marginLeft: '5px', color: '#52c41a'}}/>
             </div>
           )
       },
@@ -317,17 +346,82 @@
         width: '20%',
         dataIndex: 'operation',
         render: (text, record) =>
-          (<div>
-            <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record, 'scripts')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
-            <span className="operation-btn" title={this.props.dict['header.form.up']} onClick={() => this.handleUpDown(record, 'scripts', 'up')} style={{color: '#1890ff'}}><Icon type="arrow-up" /></span>
-            <span className="operation-btn" title={this.props.dict['header.form.down']} onClick={() => this.handleUpDown(record, 'scripts', 'down')} style={{color: '#ff4d4f'}}><Icon type="arrow-down" /></span>
-            <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'scripts')} style={{color: '#8E44AD'}}><Icon type="swap" /></span>
+          (<div style={{textAlign: 'center'}}>
+            <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record, 'scripts')} style={{color: '#1890ff'}}><EditOutlined /></span>
+            <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'scripts')} style={{color: '#8E44AD'}}><SwapOutlined /></span>
             <Popconfirm
               overlayClassName="popover-confirm"
               title={this.props.dict['model.query.delete']}
               onConfirm={() => this.handleDelete(record, 'scripts')
             }>
-              <span className="operation-btn" style={{color: '#ff4d4f'}}><Icon type="delete" /></span>
+              <span className="operation-btn" style={{color: '#ff4d4f'}}><DeleteOutlined /></span>
+            </Popconfirm>
+          </div>)
+      }
+    ],
+    cbScriptsColumns: [
+      {
+        title: 'SQL',
+        dataIndex: 'sql',
+        width: '60%',
+        render: (text) => {
+          let title = text.match(/^\s*\/\*.+\*\//)
+          title = title && title[0] ? title[0] : ''
+          text = title ? text.replace(title, '') : text
+
+          return (
+            <div>
+              {title ? <span style={{color: '#a50'}}>{title}</span> : null}
+              <Paragraph copyable ellipsis={{ rows: 4, expandable: true }}>{text}</Paragraph>
+            </div>
+          )
+        }
+      },
+      {
+        title: '鎵ц浣嶇疆',
+        dataIndex: 'position',
+        width: '10%',
+        render: (text, record) => {
+          if (record.position === 'front') {
+            return 'sql鍓�'
+          } else {
+            return 'sql鍚�'
+          }
+        }
+      },
+      {
+        title: '鐘舵��',
+        dataIndex: 'status',
+        width: '10%',
+        render: (text, record) => record.status === 'false' ?
+          (
+            <div>
+              {this.props.dict['model.status.forbidden']}
+              <StopOutlined style={{marginLeft: '5px', color: '#ff4d4f'}} />
+            </div>
+          ) :
+          (
+            <div>
+              {this.props.dict['model.status.open']}
+              <CheckCircleOutlined style={{marginLeft: '5px', color: '#52c41a'}}/>
+            </div>
+          )
+      },
+      {
+        title: '鎿嶄綔',
+        align: 'center',
+        width: '20%',
+        dataIndex: 'operation',
+        render: (text, record) =>
+          (<div style={{textAlign: 'center'}}>
+            <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record, 'cbscripts')} style={{color: '#1890ff'}}><EditOutlined /></span>
+            <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'cbscripts')} style={{color: '#8E44AD'}}><SwapOutlined /></span>
+            <Popconfirm
+              overlayClassName="popover-confirm"
+              title={this.props.dict['model.query.delete']}
+              onConfirm={() => this.handleDelete(record, 'cbscripts')
+            }>
+              <span className="operation-btn" style={{color: '#ff4d4f'}}><DeleteOutlined /></span>
             </Popconfirm>
           </div>)
       }
@@ -382,11 +476,11 @@
           if (record.TypeCharOne === 'n') {
             _text = record.ModularDetailCode + Array(_type).join('0') + '1'
           } else if (record.TypeCharOne === 'Y') {
-            _text = record.ModularDetailCode + moment().format('YYYYMMDD') + Array(_type).join('0') + '1'
+            _text = record.ModularDetailCode + moment().format('YYMMDD') + Array(_type).join('0') + '1'
           } else if (record.TypeCharOne === 'Lp') {
             _text = Array(_type).join('0') + '10'
           } else if (record.TypeCharOne === 'BN') {
-            _text = moment().format('YYYYMMDD') + Array(_type).join('0') + '1'
+            _text = moment().format('YYMMDD') + Array(_type).join('0') + '1'
           }
           return _text
         }
@@ -404,13 +498,13 @@
           (
             <div>
               {this.props.dict['model.status.forbidden']}
-              <Icon style={{marginLeft: '5px'}} type="stop" theme="twoTone" twoToneColor="#ff4d4f" />
+              <StopOutlined style={{marginLeft: '5px', color: '#ff4d4f'}} />
             </div>
           ) :
           (
             <div>
               {this.props.dict['model.status.open']}
-              <Icon style={{marginLeft: '5px'}} type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
+              <CheckCircleOutlined style={{marginLeft: '5px', color: '#52c41a'}}/>
             </div>
           )
       },
@@ -420,17 +514,15 @@
         width: '15%',
         dataIndex: 'operation',
         render: (text, record) =>
-          (<div>
-            <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record, 'ordercode')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
-            <span className="operation-btn" title={this.props.dict['header.form.up']} onClick={() => this.handleUpDown(record, 'ordercode', 'up')} style={{color: '#1890ff'}}><Icon type="arrow-up" /></span>
-            <span className="operation-btn" title={this.props.dict['header.form.down']} onClick={() => this.handleUpDown(record, 'ordercode', 'down')} style={{color: '#ff4d4f'}}><Icon type="arrow-down" /></span>
-            <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'ordercode')} style={{color: '#8E44AD'}}><Icon type="swap" /></span>
+          (<div style={{textAlign: 'center'}}>
+            <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record, 'ordercode')} style={{color: '#1890ff'}}><EditOutlined /></span>
+            <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'ordercode')} style={{color: '#8E44AD'}}><SwapOutlined /></span>
             <Popconfirm
               overlayClassName="popover-confirm"
               title={this.props.dict['model.query.delete']}
               onConfirm={() => this.handleDelete(record, 'ordercode')
             }>
-              <span className="operation-btn" style={{color: '#ff4d4f'}}><Icon type="delete" /></span>
+              <span className="operation-btn" style={{color: '#ff4d4f'}}><DeleteOutlined /></span>
             </Popconfirm>
           </div>)
       }
@@ -438,8 +530,8 @@
   }
 
   UNSAFE_componentWillMount() {
-    const { columns, config, card } = this.props
-    let _verify = this.props.card.verify || {}
+    const { columns, config, card, btnTab } = this.props
+    let _verify = card.verify || {}
 
     let _invalid = _verify.invalid
 
@@ -451,80 +543,180 @@
     }
 
     _verify.default = _verify.default || 'true'
+    _verify.noteEnable = _verify.noteEnable || 'false' // 鐭俊鍙戦�佹槸鍚﹀紑鍚�
+    _verify.noteType = _verify.noteType || 'N'         // 鐭俊鍙戦�佹ā寮忥細Y锛堝疄鏃讹級銆丯锛堝畾鏃讹級
+    _verify.noteTemp = _verify.noteTemp || 'Y'         // 鐭俊鍙戦�佹ā鏉匡細Y锛堢浉鍚岋級銆丯锛堜笉鍚岋級
     _verify.invalid = _invalid
     _verify.uniques = _verify.uniques || []
     _verify.contrasts = _verify.contrasts || []
     _verify.accountdate = _verify.accountdate || 'false'
+    _verify.accountfield = _verify.accountfield || ''
+    _verify.voucherdate = _verify.voucherdate || ''
     _verify.customverifys = _verify.customverifys || []
     _verify.billcodes = _verify.billcodes || []
     _verify.voucher = _verify.voucher || {enabled: false}
     _verify.scripts = _verify.scripts || []
+    _verify.cbScripts = _verify.cbScripts || []
+
+    if (window.GLOB.funcs && window.GLOB.funcs.length > 0) {
+      window.GLOB.funcs.forEach(m => {
+        let reg = new RegExp(`\\/\\*\\$ex@${m.func_code}-begin\\*\\/[\\s\\S]+\\/\\*@ex\\$-end\\*\\/`, 'ig')
+        _verify.customverifys.forEach(item => {
+          item.sql = item.sql.replace(reg, `$ex@${m.func_code}@ex$`)
+        })
+        _verify.scripts.forEach(item => {
+          item.sql = item.sql.replace(reg, `$ex@${m.func_code}@ex$`)
+        })
+        _verify.cbScripts.forEach(item => {
+          item.sql = item.sql.replace(reg, `$ex@${m.func_code}@ex$`)
+        })
+      })
+    }
 
     this.setState({
+      setting: config.setting || {},
       verify: _verify
     })
 
-    // 鎸夐挳-琛ㄥ崟鏍囩椤�
-    if (this.props.card.btnType) {
+    if (config.Template !== 'FormTab' && (card.intertype === 'inner' || card.intertype === 'outer')) { // 鍐呴儴鎴栧閮ㄦ帴鍙�
+      return
+    }
+
+    new Promise(resolve => {
       let _fields = []
-
-      config.groups.forEach(group => {
-        _fields.push(...group.sublist)
-      })
-
-      let _usefulfields = ['BID', 'ID', 'LoginUID', 'SessionUid', 'UserID', 'Appkey', 'UserName', 'FullName', 'BillCode', 'BVoucher', 'FIBVoucherDate', 'FiYear', 'ModularDetailCode']
-      let _declare = ['@UserName nvarchar(50)', '@FullName nvarchar(50)', '@ErrorCode nvarchar(50)', '@retmsg nvarchar(4000)', '@BillCode nvarchar(50)', '@BVoucher nvarchar(50)', '@FIBVoucherDate nvarchar(50)', '@FiYear nvarchar(50)', '@ModularDetailCode nvarchar(50)']
-      let _select = ['@UserName=\'\'', '@FullName=\'\'', '@ErrorCode=\'\'', '@retmsg=\'\'', '@BillCode=\'\'', '@BVoucher=\'\'', '@FIBVoucherDate=\'\'', '@FiYear=\'\'', '@ModularDetailCode=\'\'']
-      let fieldArr = _usefulfields.map(_f => _f.toLowerCase())
-
-      _fields.forEach(_f => {
-        if (_f.field) {
-          if (fieldArr.includes(_f.field.toLowerCase())) return
-          fieldArr.push(_f.field.toLowerCase())
-
-          _usefulfields.push(_f.field)
-
-          let _fieldlen = _f.fieldlength || 50
-
-          if (['textarea', 'fileupload', 'multiselect'].includes(_f.type)) {
-            _fieldlen = _f.fieldlength || 512
-          } else if (_f.type === 'number') {
-            _fieldlen = _f.decimal ? _f.decimal : 0
-          }
-
-          if (_fieldlen > 2048) {
-            _fieldlen = 'max'
-          }
-
-          let _type = `nvarchar(${_fieldlen})`
-
-          if (_f.type.match(/date/ig)) {
-            _type = 'datetime'
-            _select.push(`@${_f.field}='1900-01-01'`)
-          } else if (_f.type === 'number') {
-            _type = `decimal(18,${_fieldlen})`
-            _select.push(`@${_f.field}=0`)
+      if (config.Template === 'FormTab') {
+        config.groups.forEach(group => {
+          _fields.push(...group.sublist)
+        })
+        resolve(_fields)
+      } else if (card.modal) {
+        _fields = card.modal.fields || []
+        resolve(_fields)
+      } else if (card.OpenType === 'pop') {
+        Api.getSystemConfig({
+          func: 'sPC_Get_LongParam',
+          MenuID: card.uuid
+        }).then(res => {
+          if (res.status) {
+            let _LongParam = ''
+            if (res.LongParam) {
+              try {
+                _LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
+              } catch (e) {
+                console.warn('Parse Failure')
+                _LongParam = ''
+              }
+            }
+            
+            if (!_LongParam) {
+              message.warning('鏈幏鍙栧埌琛ㄥ崟淇℃伅锛岄儴鍒嗛獙璇佸皢鏃犳硶璁剧疆锛�')
+            } else {
+              _LongParam = updateForm(_LongParam)
+              _fields = _LongParam.fields || []
+            }
           } else {
-            _select.push(`@${_f.field}=''`)
+            notification.warning({
+              top: 92,
+              message: res.message,
+              duration: 5
+            })
           }
+          resolve(_fields)
+        })
+      } else {
+        resolve(_fields)
+      }
+    }).then(_fields => {
+      let _usefulfields = ['BID', 'ID', 'LoginUID', 'SessionUid', 'UserID', 'Appkey', 'UserName', 'FullName', 'RoleID', 'mk_departmentcode', 'mk_organization', 'login_city', 'BillCode', 'BVoucher', 'FIBVoucherDate', 'FiYear', 'ModularDetailCode']
+      let _declare = ['@UserName nvarchar(50)', '@FullName nvarchar(50)', '@RoleID nvarchar(512)', '@mk_departmentcode nvarchar(50)', '@mk_organization nvarchar(50)', '@login_city nvarchar(50)', '@ErrorCode nvarchar(50)', '@retmsg nvarchar(4000)', '@BillCode nvarchar(50)', '@BVoucher nvarchar(50)', '@FIBVoucherDate nvarchar(50)', '@FiYear nvarchar(50)', '@ModularDetailCode nvarchar(50)']
+      let _select = ['@UserName=\'\'', '@FullName=\'\'', '@RoleID=\'\'', '@mk_departmentcode=\'\'', '@mk_organization=\'\'', '@login_city=\'\'', '@ErrorCode=\'\'', '@retmsg=\'\'', '@BillCode=\'\'', '@BVoucher=\'\'', '@FIBVoucherDate=\'\'', '@FiYear=\'\'', '@ModularDetailCode=\'\'']
+      let fieldArr = _usefulfields.map(_f => _f.toLowerCase())
+      let hasBid = false
 
-          _declare.push(`@${_f.field} ${_type}`)
+      _fields = _fields.filter(_f => _f.field)
+      _fields.forEach(_f => {
+        if (fieldArr.includes(_f.field.toLowerCase())) return
+
+        fieldArr.push(_f.field.toLowerCase())
+
+        _usefulfields.push(_f.field)
+
+        let _fieldlen = _f.fieldlength || 50
+
+        if (_f.type === 'number') {
+          _fieldlen = _f.decimal ? _f.decimal : 0
+        }
+
+        if (_fieldlen > 2048) {
+          _fieldlen = 'max'
+        }
+
+        let _type = `nvarchar(${_fieldlen})`
+
+        if (_f.type.match(/date/ig)) {
+          _type = 'datetime'
+          _select.push(`@${_f.field}='1900-01-01'`)
+        } else if (_f.type === 'number') {
+          _type = `decimal(18,${_fieldlen})`
+          _select.push(`@${_f.field}=0`)
+        } else {
+          _select.push(`@${_f.field}=''`)
+        }
+
+        _declare.push(`@${_f.field} ${_type}`)
+
+        if (_f.field.toLowerCase() === 'bid') {
+          hasBid = true
         }
       })
 
-      if (columns && columns.length > 0 && this.props.btnTab.Ot !== 'notRequired' && this.props.btnTab.Ot !== 'requiredOnce') {
+      let uniqueFields = fromJS(_fields).toJS()
+
+      if (!hasBid) { // 鍞竴鎬ч獙璇佹坊鍔燘ID
+        uniqueFields.unshift({ uuid: 'BID', field: 'BID', label: 'BID', type: 'text' })
+        _fields.unshift({ uuid: 'BID', field: 'BID', label: 'BID', type: 'text' })
+        fieldArr.push('bid')
+        _declare.push(`@bid nvarchar(50)`)
+        _select.push(`@bid=''`)
+      }
+
+      let hasColumn = false
+      if (columns && columns.length > 0) {
+        if (btnTab) { // 琛ㄥ崟鏍囩
+          if (btnTab.Ot !== 'notRequired' && btnTab.Ot !== 'requiredOnce') {
+            hasColumn = true
+          }
+        } else if (card.Ot !== 'notRequired' && card.Ot !== 'requiredOnce') {
+          hasColumn = true
+        }
+      }
+
+      let unionFields = fromJS(_fields).toJS()
+      let formArr = _fields.map(_f => _f.field.toLowerCase())
+
+      if (hasColumn) {
         columns.forEach(_f => {
+          if (_f.field && !formArr.includes(_f.field.toLowerCase())) {
+            formArr.push(_f.field.toLowerCase())
+            unionFields.push(_f)
+          }
           if (!_f.field || fieldArr.includes(_f.field.toLowerCase())) return
 
           fieldArr.push(_f.field.toLowerCase())
-
           _usefulfields.push(_f.field)
 
-          let _fieldlen = _f.fieldlength || 50
+          if (_f.datatype) { // 鑷畾涔夊瓧娈�
+            if (/decimal/ig.test(_f.datatype)) {
+              _select.push(`@${_f.field}=0`)
+            } else {
+              _select.push(`@${_f.field}=''`)
+            }
 
-          if (_f.type === 'picture' || _f.type === 'textarea') {
-            _fieldlen = _f.fieldlength || 512
+            _declare.push(`@${_f.field} ${_f.datatype}`)
+            return
           }
+
+          let _fieldlen = _f.fieldlength || 50
 
           if (_fieldlen > 2048) {
             _fieldlen = 'max'
@@ -548,23 +740,29 @@
         })
       }
 
-      _usefulfields = _usefulfields.join(', ')
       let _sql = `Declare ${_declare.join(', ')}
         Select ${_select.join(', ')}
       `
 
       // 榛樿sql
+      let _defaultsql = ''
       let _insertsql = ''
       let _updatesql = ''
 
-      if (this.props.card.sqlType === 'insert' || this.props.card.sqlType === 'insertOrUpdate') {
+      if (card.sqlType === 'insert' || card.sqlType === 'insertOrUpdate') {
         let keys = []
         let values = []
+
         _fields.forEach(item => {
-          if (!item.field) return
+          if (!item.field || item.writein === 'false') return
 
           keys.push(item.field.toLowerCase())
-          values.push('@' + item.field)
+
+          if (item.field.toLowerCase() === 'bid' && item.uuid === 'BID') {
+            values.push('@BID@')
+          } else {
+            values.push('@' + item.field)
+          }
         })
 
         if (config.setting.primaryKey && !keys.includes(config.setting.primaryKey.toLowerCase())) {
@@ -590,25 +788,40 @@
   
         keys = keys.join(', ')
         values = values.join(', ')
-        _insertsql = `insert into ${this.props.card.sql} (${keys}) select ${values};`
+        _insertsql = `insert into ${card.sql} (${keys}) select ${values};`
       }
-      
-      if (this.props.card.sqlType === 'update' || this.props.card.sqlType === 'insertOrUpdate') {
+
+      if (card.sqlType === 'update' || card.sqlType === 'audit' || card.sqlType === 'insertOrUpdate') {
         let _form = []
         let _arr = []
 
         _fields.forEach(item => {
-          if (!item.field) return
+          if (!item.field || item.writein === 'false') return
 
           _arr.push(item.field.toLowerCase())
           _form.push(item.field + '=@' + item.field)
         })
 
-        if (!_arr.includes('modifydate')) {
-          _form.push('modifydate=getdate()')
-        }
-        if (!_arr.includes('modifyuserid')) {
-          _form.push('modifyuserid=@userid@')
+        if (this.props.card.sqlType === 'audit') {
+          if (!_arr.includes('submitdate')) {
+            _form.push('submitdate=getdate()')
+          }
+          if (!_arr.includes('submituserid')) {
+            _form.push('submituserid=@userid@')
+          }
+          if (!_arr.includes('submituser')) {
+            _form.push('submituser=@username')
+          }
+        } else {
+          if (!_arr.includes('modifydate')) {
+            _form.push('modifydate=getdate()')
+          }
+          if (!_arr.includes('modifyuser')) {
+            _form.push('modifyuser=@username')
+          }
+          if (!_arr.includes('modifyuserid')) {
+            _form.push('modifyuserid=@userid@')
+          }
         }
 
         if (_verify.voucher && _verify.voucher.enabled) {
@@ -624,18 +837,16 @@
         }
 
         _form = _form.join(', ')
-        _updatesql = `update ${this.props.card.sql} set ${_form} where ${config.setting.primaryKey}=@ID@;`
+        _updatesql = `update ${card.sql} set ${_form} where ${config.setting.primaryKey || 'id'}${card.Ot !== 'requiredOnce' ? '=@ID@' : ' in (select ID  from dbo.SplitComma(@ID@))'};`
       }
 
-      let _defaultsql = ''
-
-      if (this.props.card.sqlType === 'insert') {
+      if (card.sqlType === 'insert') {
         _defaultsql = _insertsql
-      } else if (this.props.card.sqlType === 'update') {
+      } else if (card.sqlType === 'update' || card.sqlType === 'audit') {
         _defaultsql = _updatesql
-      } else if (this.props.card.sqlType === 'insertOrUpdate') {
+      } else if (card.sqlType === 'insertOrUpdate') {
         _defaultsql += `select @tbid=''
-          select @tbid='X' from ${this.props.card.sql} where ${config.setting.primaryKey}=@ID@
+          select @tbid='X' from ${card.sql} where ${config.setting.primaryKey || 'id'}=@ID@
           if @tbid=''
             begin
             ${_insertsql}
@@ -645,515 +856,148 @@
             ${_updatesql}
             end
         `
-      }
-
-      this.setState({
-        fields: _fields,
-        initsql: _sql,
-        defaultsql: _defaultsql,
-        usefulfields: _usefulfields
-      }, () => {
-        this.getsysScript()
-      })
-
-      return
-    }
-
-    // 閫氱敤鎸夐挳
-    if (this.props.card.OpenType === 'pop') {
-      Api.getSystemConfig({
-        func: 'sPC_Get_LongParam',
-        MenuID: this.props.card.uuid
-      }).then(res => {
-        if (res.status) {
-          let _LongParam = ''
-          if (res.LongParam) {
-            try {
-              _LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
-            } catch (e) {
-              console.warn('Parse Failure')
-              _LongParam = ''
-            }
-          }
-  
-          if (!_LongParam) {
-            notification.warning({
-              top: 92,
-              message: '琛ㄥ崟鏈坊鍔犳垨瑙f瀽閿欒锛岃妫�鏌ヨ〃鍗曡缃紒',
-              duration: 5
-            })
-
-            this.getsysScript()
-
-            return
-          }
-          
-          let _fields = []
-          if (_LongParam.groups.length > 0) {
-            _LongParam.groups.forEach(group => {
-              _fields.push(...group.sublist)
-            })
-          } else {
-            _fields = _LongParam.fields
-          }
-
-          let _usefulfields = ['BID', 'ID', 'LoginUID', 'SessionUid', 'UserID', 'Appkey', 'UserName', 'FullName', 'BillCode', 'BVoucher', 'FIBVoucherDate', 'FiYear', 'ModularDetailCode']
-          let _declare = ['@UserName nvarchar(50)', '@FullName nvarchar(50)', '@ErrorCode nvarchar(50)', '@retmsg nvarchar(4000)', '@BillCode nvarchar(50)', '@BVoucher nvarchar(50)', '@FIBVoucherDate nvarchar(50)', '@FiYear nvarchar(50)', '@ModularDetailCode nvarchar(50)']
-          let _select = ['@UserName=\'\'', '@FullName=\'\'', '@ErrorCode=\'\'', '@retmsg=\'\'', '@BillCode=\'\'', '@BVoucher=\'\'', '@FIBVoucherDate=\'\'', '@FiYear=\'\'', '@ModularDetailCode=\'\'']
-          let hasBid = false
-          let fieldArr = _usefulfields.map(_f => _f.toLowerCase())
-          let _defaultfields = fromJS(_fields).toJS()
-
-          _fields.forEach(_f => {
-            if (_f.field) {
-              if (fieldArr.includes(_f.field.toLowerCase())) return
-              fieldArr.push(_f.field.toLowerCase())
-
-              _usefulfields.push(_f.field)
-
-              let _fieldlen = _f.fieldlength || 50
-
-              if (['textarea', 'fileupload', 'multiselect'].includes(_f.type)) {
-                _fieldlen = _f.fieldlength || 512
-              } else if (_f.type === 'number') {
-                _fieldlen = _f.decimal ? _f.decimal : 0
-              }
-
-              if (_fieldlen > 2048) {
-                _fieldlen = 'max'
-              }
-
-              let _type = `nvarchar(${_fieldlen})`
-
-              if (_f.type.match(/date/ig)) {
-                _type = 'datetime'
-                _select.push(`@${_f.field}='1900-01-01'`)
-              } else if (_f.type === 'number') {
-                _type = `decimal(18,${_fieldlen})`
-                _select.push(`@${_f.field}=0`)
-              } else {
-                _select.push(`@${_f.field}=''`)
-              }
-
-              _declare.push(`@${_f.field} ${_type}`)
-            }
-            if (_f.field && _f.field.toLowerCase() === 'bid') {
-              hasBid = true
-            }
-          })
-
-          if (this.props.floor === 'subtable' && !hasBid) { // 瀛愯〃琛ㄥ崟涓鍔燘ID
-            _fields.unshift({
-              uuid: 'BID',
-              field: 'BID',
-              label: 'BID',
-              type: 'text'
-            })
-          }
-
-          if (columns && columns.length > 0 && this.props.card.Ot !== 'notRequired' && this.props.card.Ot !== 'requiredOnce') {
-            columns.forEach(_f => {
-              if (!_f.field || fieldArr.includes(_f.field.toLowerCase())) return
-
-              fieldArr.push(_f.field.toLowerCase())
-
-              _usefulfields.push(_f.field)
-
-              let _fieldlen = _f.fieldlength || 50
-
-              if (_f.type === 'picture' || _f.type === 'textarea') {
-                _fieldlen = _f.fieldlength || 512
-              }
-
-              if (_fieldlen > 2048) {
-                _fieldlen = 'max'
-              }
-
-              let _type = `nvarchar(${_fieldlen})`
-
-              if (_f.type === 'number') {
-                _type = `decimal(18,${_f.decimal ? _f.decimal : 0})`
-              } else if (_f.type === 'picture' || _f.type === 'textarea') {
-                _type = `nvarchar(${_fieldlen})`
-              }
-
-              if (_f.type === 'number') {
-                _select.push(`@${_f.field}=0`)
-              } else {
-                _select.push(`@${_f.field}=''`)
-              }
-    
-              _declare.push(`@${_f.field} ${_type}`)
-            })
-          }
-
-          _usefulfields = _usefulfields.join(', ')
-          let _sql = `Declare ${_declare.join(', ')}
-            Select ${_select.join(', ')}
-          `
-
-          // 榛樿sql
-          let _defaultsql = ''
-
-          if (this.props.card.sqlType === 'insert') {
-            let keys = []
-            let values = []
-            _defaultfields.forEach(item => {
-              if (!item.field) return
-
-              keys.push(item.field.toLowerCase())
-              values.push('@' + item.field)
-            })
-
-            if (config.setting.primaryKey && !keys.includes(config.setting.primaryKey.toLowerCase())) {
-              keys.push(config.setting.primaryKey.toLowerCase())
-              values.push('@ID@')
-            }
-            if (!keys.includes('createuserid')) {
-              keys.push('createuserid')
-              values.push('@userid@')
-            }
-            if (!keys.includes('createuser')) {
-              keys.push('createuser')
-              values.push('@username')
-            }
-            if (!keys.includes('createstaff')) {
-              keys.push('createstaff')
-              values.push('@fullname')
-            }
-            if (!keys.includes('bid')) {
-              keys.push('bid')
-              values.push('@BID@')
-            }
-      
-            keys = keys.join(', ')
-            values = values.join(', ')
-            _defaultsql = `insert into ${this.props.card.sql} (${keys}) select ${values};`
-          } else if (this.props.card.sqlType === 'update' || this.props.card.sqlType === 'audit') {
-            let _form = []
-            let _arr = []
-
-            _defaultfields.forEach(item => {
-              if (!item.field) return
-
-              _arr.push(item.field.toLowerCase())
-              _form.push(item.field + '=@' + item.field)
-            })
-
-            if (this.props.card.sqlType === 'audit') {
-              if (!_arr.includes('submitdate')) {
-                _form.push('submitdate=getdate()')
-              }
-              if (!_arr.includes('submituserid')) {
-                _form.push('submituserid=@userid@')
-              }
-            } else {
-              if (!_arr.includes('modifydate')) {
-                _form.push('modifydate=getdate()')
-              }
-              if (!_arr.includes('modifyuserid')) {
-                _form.push('modifyuserid=@userid@')
-              }
-            }
-
-            if (_verify.voucher && _verify.voucher.enabled) {
-              if (!_arr.includes('bvoucher')) {
-                _form.push('BVoucher=@BVoucher')
-              }
-              if (!_arr.includes('fibvoucherdate')) {
-                _form.push('FIBVoucherDate=@FIBVoucherDate')
-              }
-              if (!_arr.includes('fiyear')) {
-                _form.push('FiYear=@FiYear')
-              }
-            }
-
-            _form = _form.join(', ')
-            _defaultsql = `update ${this.props.card.sql} set ${_form} where ${config.setting.primaryKey}${this.props.card.Ot !== 'requiredOnce' ? '=@ID@' : ' in (select ID  from dbo.SplitComma(@ID@))'};`
-          }
-          
-          this.setState({
-            fields: _fields,
-            initsql: _sql,
-            defaultsql: _defaultsql,
-            usefulfields: _usefulfields
-          }, () => {
-            this.getsysScript()
-          })
-        } else {
-          notification.warning({
-            top: 92,
-            message: res.message,
-            duration: 5
-          })
-          this.getsysScript()
+      } else if (card.sqlType === 'LogicDelete' || card.sqlType === 'custom') {
+        let _voucher = ''
+        if (_verify.voucher && _verify.voucher.enabled) {
+          _voucher = ',BVoucher=@BVoucher,FIBVoucherDate=@FIBVoucherDate,FiYear=@FiYear'
         }
-      })
-    } else {
-      let _usefulfields = ['BID', 'ID', 'LoginUID', 'SessionUid', 'UserID', 'Appkey', 'UserName', 'FullName', 'BillCode', 'BVoucher', 'FIBVoucherDate', 'FiYear', 'ModularDetailCode']
-      let _declare = ['@UserName nvarchar(50)', '@FullName nvarchar(50)', '@ErrorCode nvarchar(50)', '@retmsg nvarchar(4000)', '@BillCode nvarchar(50)', '@BVoucher nvarchar(50)', '@FIBVoucherDate nvarchar(50)', '@FiYear nvarchar(50)', '@ModularDetailCode nvarchar(50)']
-      let _select = ['@UserName=\'\'', '@FullName=\'\'', '@ErrorCode=\'\'', '@retmsg=\'\'', '@BillCode=\'\'', '@BVoucher=\'\'', '@FIBVoucherDate=\'\'', '@FiYear=\'\'', '@ModularDetailCode=\'\'']
-      let fieldArr = _usefulfields.map(_f => _f.toLowerCase())
-
-      if (columns && columns.length > 0 && this.props.card.Ot !== 'notRequired' && this.props.card.Ot !== 'requiredOnce') {
-        columns.forEach(_f => {
-          if (!_f.field || fieldArr.includes(_f.field.toLowerCase())) return
-
-          fieldArr.push(_f.field.toLowerCase())
-
-          _usefulfields.push(_f.field)
-
-          let _fieldlen = _f.fieldlength || 50
-
-          if (_f.type === 'picture' || _f.type === 'textarea') {
-            _fieldlen = _f.fieldlength || 512
-          }
-
-          if (_fieldlen > 2048) {
-            _fieldlen = 'max'
-          }
-
-          let _type = `nvarchar(${_fieldlen})`
-
-          if (_f.type === 'number') {
-            _type = `decimal(18,${_f.decimal ? _f.decimal : 0})`
-          } else if (_f.type === 'picture' || _f.type === 'textarea') {
-            _type = `nvarchar(${_fieldlen})`
-          }
-
-          if (_f.type === 'number') {
-            _select.push(`@${_f.field}=0`)
-          } else {
-            _select.push(`@${_f.field}=''`)
-          }
-
-          _declare.push(`@${_f.field} ${_type}`)
-        })
-      }
-
-      _usefulfields = _usefulfields.join(', ')
-      let _sql = `Declare ${_declare.join(', ')}
-        Select ${_select.join(', ')}
-      `
-
-      // 榛樿sql
-      let _defaultsql = ''
-
-      if (this.props.card.sqlType === 'LogicDelete') {
-        _defaultsql = `update ${this.props.card.sql} set deleted=1,modifydate=getdate(),modifyuserid=@userid@ where ${config.setting.primaryKey}${this.props.card.Ot !== 'requiredOnce' ? '=@ID@' : ' in (select ID  from dbo.SplitComma(@ID@))'};`
-      } else if (this.props.card.sqlType === 'delete') {
+        _defaultsql = `update ${card.sql} set deleted=1,modifydate=getdate(),modifyuser=@username,modifyuserid=@userid@${_voucher} where ${config.setting.primaryKey || 'id'}${card.Ot !== 'requiredOnce' ? '=@ID@' : ' in (select ID  from dbo.SplitComma(@ID@))'};`
+      } else if (card.sqlType === 'delete') {
         let _msg = ''
-        if (columns && columns.length > 0 && this.props.card.Ot !== 'notRequired' && this.props.card.Ot !== 'requiredOnce') {
+        if (columns && columns.length > 0 && card.Ot !== 'notRequired' && card.Ot !== 'requiredOnce') {
           let _index = 0
           columns.forEach(col => {
-            if (col.field && col.Hide !== 'true' && _index < 4) {
-              _msg += col.label + '=\'\','
-              _index++
-            }
+            if (!col.field || col.Hide === 'true' || _index >= 4) return
+
+            _msg += col.label + '=\'\','
+            _index++
           })
         }
-        _defaultsql += `insert into snote (remark,createuserid,CreateUser,CreateStaff) select left('鍒犻櫎琛�:${this.props.card.sql} 鏁版嵁: ${_msg}${config.setting.primaryKey}='+@ID@,200),@userid@,@username,@fullname delete ${this.props.card.sql} where ${config.setting.primaryKey}${this.props.card.Ot !== 'requiredOnce' ? '=@ID@' : ' in (select ID  from dbo.SplitComma(@ID@))'};`
+        _defaultsql += `insert into snote (remark,createuserid,CreateUser,CreateStaff) select left('鍒犻櫎琛�:${card.sql} 鏁版嵁: ${_msg}${config.setting.primaryKey || 'id'}='+@ID@,200),@userid@,@username,@fullname delete ${card.sql} where ${config.setting.primaryKey}${card.Ot !== 'requiredOnce' ? '=@ID@' : ' in (select ID  from dbo.SplitComma(@ID@))'};`
       }
 
+      let _columns = []
+      if (columns) {
+        _columns = fromJS(columns).toJS()
+        let hasbid = false
+        _columns = _columns.filter(col => {
+          if (col.field && col.field.toLowerCase() === 'bid') {
+            hasbid = true
+          }
+
+          return !!col.field
+        })
+
+        if (!hasbid) {
+          _columns.unshift({ uuid: 'BID', field: 'BID', label: 'BID', type: 'text' })
+        }
+      }
+      
       this.setState({
+        fields: _fields,
+        columnsFields: _columns,
         initsql: _sql,
         defaultsql: _defaultsql,
-        usefulfields: _usefulfields
-      }, () => {
-        this.getsysScript()
+        usefulfields: _usefulfields.join(', '),
+        uniqueColumns: this.state.uniqueColumns.map(col => {
+          if (col.dataIndex === 'field') {
+            col.options = uniqueFields
+          }
+          return col
+        }),
+        onceUniqueColumns: this.state.onceUniqueColumns.map(col => {
+          if (col.dataIndex === 'field') {
+            col.options = _columns
+          }
+          return col
+        }),
+        unionFields,
+        uniqueFields
       })
-    }
-
-    if (this.props.card.Ot === 'requiredOnce') {
-      let _columns = fromJS(config.columns).toJS()
-      _columns = _columns.filter(col => col.field)
-
-      if (this.props.floor === 'subtable' && _columns.filter(col => col.field.toLowerCase() === 'bid').length === 0) { // 瀛愯〃琛ㄥ崟涓鍔燘ID
-        _columns.unshift({
-          uuid: 'BID',
-          field: 'BID',
-          label: 'BID',
-          type: 'text'
-        })
-      }
-      this.setState({
-        columnsFields: _columns
-      })
-    }
+    })
   }
 
   componentDidMount() {
-    // 鑾峰彇鐢熸垚鍗曞彿涓�绾ц彍鍗�
-    let defer1 = new Promise(resolve => {
-      let _orderSql = `select distinct ModularCode as ID,ModularCode+ModularName+ModularNo as NameNO from sModular where deleted=0 and Appkey=case when Appkey='' then '' else @Appkey@ end order by ID asc`
-      _orderSql = Utils.formatOptions(_orderSql)
-
-      let orderParam = {
-        func: 'sPC_Get_SelectedList',
-        LText: _orderSql,
-        obj_name: 'data',
-        arr_field: 'ID,NameNO'
+    let mutilForms = [
+      {
+        obj_name: 'modular',
+        arr_field: 'ID,NameNO',
+        LText: window.btoa(window.encodeURIComponent(`select distinct ModularCode as ID,ModularCode+ModularName+ModularNo as NameNO from sModular where deleted=0 and Appkey=case when Appkey='' then '' else @Appkey@ end order by ID asc`))
+      },
+      {
+        obj_name: 'modularDetail',
+        arr_field: 'ModularDetailCode,CodeName,BID,Type',
+        LText: window.btoa(window.encodeURIComponent(`select distinct ModularDetailCode,ModularDetailCode+ModularDetailName as CodeName,ModularCode as BID,Type from sModularDetail where Appkey= @Appkey@ and deleted=0 order by ModularDetailCode desc`))
+      },
+      {
+        obj_name: 'voucher',
+        arr_field: 'ID,NameNO,TypeCharOne',
+        LText: window.btoa(window.encodeURIComponent(`select distinct ModularCode as ID,ModularCode+ModularName+ModularNo as NameNO,TypeCharOne from sModular where deleted=0  and Appkey=case when Appkey='' then '' else @Appkey@ end  order by ModularCode`))
+      },
+      {
+        obj_name: 'voucherDetail',
+        arr_field: 'ModularDetailCode,CodeName,BID,VoucherTypeTwo,IDefine1',
+        LText: window.btoa(window.encodeURIComponent(`select distinct ModularDetailCode,ModularDetailCode+ModularDetailName as CodeName,ModularCode as BID, VoucherTypeTwo, IDefine1 from sModularDetail where Deleted=0 and VoucherTypeTwo!='' 
+          and Appkey=@Appkey@ union 
+          select distinct a.ModularDetailCode,a.ModularDetailCode+ModularDetailName as CodeName,ModularCode as BID, VoucherTypeTwo, IDefine1 
+          from (select * from sModularDetail where Deleted=0 and VoucherTypeTwo!='' and Appkey='') a
+          left join (select distinct ModularDetailCode from sModularDetail where Deleted=0 and VoucherTypeTwo!='' 
+          and Appkey=@Appkey@) m on a.ModularDetailCode=m.ModularDetailCode where m.ModularDetailCode is null order by ModularDetailCode desc`
+        ))
+      },
+      {
+        obj_name: 'noteCodes',
+        arr_field: 'templatecode,describe,id',
+        LText: window.btoa(window.encodeURIComponent(`select t.id,templatecode,'['+SignName+']'+describe as describe from (select * from bd_msn_sms_temp where  deleted=0 and TypeDesc='QX' and status=20 ) t inner join (select openid from susers where uid=@userid@) u on t.openid =t.openid`))
+      },
+      {
+        obj_name: 'scripts',
+        arr_field: 'funcname,longparam',
+        LText: window.btoa(window.encodeURIComponent(`Select distinct func+Remark as funcname,longparam, s.Sort from s_custom_script s inner join (select OpenID from sapp where ID=@Appkey@) p on s.openid = case when s.appkey='' then s.openid else p.OpenID end order by s.Sort`))
       }
+    ]
 
-      orderParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
-      orderParam.secretkey = Utils.encrypt(orderParam.LText, orderParam.timestamp)
-      orderParam.open_key = Utils.encryptOpenKey(orderParam.secretkey, orderParam.timestamp) // 浜戠鏁版嵁楠岃瘉
-      
-      Api.getSystemConfig(orderParam).then(res => {
-        if (res.status) {
-          resolve(res)
-        } else {
-          notification.warning({
-            top: 92,
-            message: res.message,
-            duration: 5
-          })
-        }
-      })
-    })
+    mutilForms = mutilForms.map(item => `select '${item.obj_name}' as obj_name,'${item.arr_field}' as arr_field,'${item.LText}' as LText`)
 
-    // 鑾峰彇鐢熸垚鍗曞彿浜岀骇鑿滃崟
-    let defer2 = new Promise(resolve => {
-      let _orderDetailSql = `select distinct ModularDetailCode,ModularDetailCode+ModularDetailName as CodeName,ModularCode as BID,Type from sModularDetail where Deleted=0 and Appkey=case when Appkey='' then '' else @Appkey@ end order by ModularDetailCode`
-      _orderDetailSql = Utils.formatOptions(_orderDetailSql)
-
-      let orderDetailParam = {
-        func: 'sPC_Get_SelectedList',
-        LText: _orderDetailSql,
-        obj_name: 'data',
-        arr_field: 'ModularDetailCode,CodeName,BID,Type'
-      }
-
-      orderDetailParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
-      orderDetailParam.secretkey = Utils.encrypt(orderDetailParam.LText, orderDetailParam.timestamp)
-      orderDetailParam.open_key = Utils.encryptOpenKey(orderDetailParam.secretkey, orderDetailParam.timestamp) // 浜戠鏁版嵁楠岃瘉
-      
-      Api.getSystemConfig(orderDetailParam).then(res => {
-        if (res.status) {
-          resolve(res)
-        } else {
-          notification.warning({
-            top: 92,
-            message: res.message,
-            duration: 5
-          })
-        }
-      })
-    })
-    
-    Promise.all([defer1, defer2]).then(result => {
-      this.setState({
-        orderModular: result[0].data,
-        orderModularDetail: result[1].data
-      })
-    })
-
-    // 鑾峰彇鍑瘉浜岀骇鑿滃崟
-    let defer3 = new Promise(resolve => {
-      let _voucherSql = 'select distinct ModularCode as ID,ModularCode+ModularName+ModularNo as NameNO,TypeCharOne from sModular where deleted=0  and Appkey=case when Appkey=\'\' then \'\' else @Appkey@ end  order by ModularCode'
-      _voucherSql = Utils.formatOptions(_voucherSql)
-
-      let voucherParam = {
-        func: 'sPC_Get_SelectedList',
-        LText: _voucherSql,
-        obj_name: 'data',
-        arr_field: 'ID,NameNO,TypeCharOne'
-      }
-
-      voucherParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
-      voucherParam.secretkey = Utils.encrypt(voucherParam.LText, voucherParam.timestamp)
-      voucherParam.open_key = Utils.encryptOpenKey(voucherParam.secretkey, voucherParam.timestamp) // 浜戠鏁版嵁楠岃瘉
-      
-      Api.getSystemConfig(voucherParam).then(res => {
-        if (res.status) {
-          resolve(res)
-        } else {
-          notification.warning({
-            top: 92,
-            message: res.message,
-            duration: 5
-          })
-        }
-      })
-    })
-
-    // 鑾峰彇鍑瘉涓夌骇鑿滃崟
-    let defer4 = new Promise(resolve => {
-      let _voucherDetailSql = 'select distinct ModularDetailCode,ModularDetailCode+ModularDetailName as CodeName,ModularCode as BID, VoucherTypeTwo, IDefine1 from sModularDetail where Deleted=0 and VoucherTypeTwo!=\'\' and Appkey=case when Appkey=\'\' then \'\' else @Appkey@ end  order by ModularDetailCode'
-      _voucherDetailSql = Utils.formatOptions(_voucherDetailSql)
-
-      let voucherDetailParam = {
-        func: 'sPC_Get_SelectedList',
-        LText: _voucherDetailSql,
-        obj_name: 'data',
-        arr_field: 'ModularDetailCode,CodeName,BID,VoucherTypeTwo,IDefine1'
-      }
-
-      voucherDetailParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
-      voucherDetailParam.secretkey = Utils.encrypt(voucherDetailParam.LText, voucherDetailParam.timestamp)
-      voucherDetailParam.open_key = Utils.encryptOpenKey(voucherDetailParam.secretkey, voucherDetailParam.timestamp) // 浜戠鏁版嵁楠岃瘉
-      
-      Api.getSystemConfig(voucherDetailParam).then(res => {
-        if (res.status) {
-          resolve(res)
-        } else {
-          notification.warning({
-            top: 92,
-            message: res.message,
-            duration: 5
-          })
-        }
-      })
-    })
-    
-    Promise.all([defer3, defer4]).then(result => {
-      this.setState({
-        voucher: result[0].data,
-        voucherDetail: result[1].data
-      })
-    })
-  }
-
-  getsysScript = () => {
-    const { defaultsql } = this.state
-
-    let _scriptSql = `Select distinct func+Remark as funcname,longparam, s.Sort from聽 s_custom_script s inner join (select OpenID from sapp where ID=@Appkey@) p on s.openid = case when s.appkey='' then s.openid else p.OpenID end order by s.Sort`
-
-    _scriptSql = Utils.formatOptions(_scriptSql)
-
-    let _sParam = {
+    let mutilparam = {
       func: 'sPC_Get_SelectedList',
-      LText: _scriptSql,
-      obj_name: 'data',
-      arr_field: 'funcname,longparam'
+      LText: mutilForms.join(' union all '),
+      obj_name: '',
+      arr_field: '',
+      table_type: 'Y'
     }
-    
-    _sParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
-    _sParam.secretkey = Utils.encrypt(_sParam.LText, _sParam.timestamp)
-    _sParam.open_key = Utils.encryptOpenKey(_sParam.secretkey, _sParam.timestamp) // 浜戠鏁版嵁楠岃瘉
-    
-    Api.getSystemConfig(_sParam).then(res => {
+
+    mutilparam.LText = Utils.formatOptions(mutilparam.LText)
+    mutilparam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+    mutilparam.secretkey = Utils.encrypt(mutilparam.LText, mutilparam.timestamp)
+    mutilparam.open_key = Utils.encryptOpenKey(mutilparam.secretkey, mutilparam.timestamp)
+
+    if (options.cloudServiceApi) { // 浜戠璇锋眰
+      mutilparam.rduri = options.cloudServiceApi
+      mutilparam.userid = sessionStorage.getItem('CloudUserID') || ''
+      mutilparam.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
+    }
+
+    Api.getSystemCacheConfig(mutilparam).then(res => {
       if (res.status) {
-        let _scripts = []
-
-        if (defaultsql) {
-          _scripts.push({
-            name: '榛樿sql',
-            value: defaultsql
-          })
-        }
-
-        res.data.forEach(item => {
-          let _item = {
-            name: item.funcname,
-            value: Utils.UnformatOptions(item.longparam)
-          }
-
-          _scripts.push(_item)
-        })
-
         this.setState({
-          systemScripts: _scripts
+          orderModular: res.modular,
+          orderModularDetail: res.modularDetail,
+          voucher: res.voucher,
+          voucherDetail: res.voucherDetail,
+          notes: res.noteCodes.map(item => {
+            return {
+              name: item.describe,
+              value: item.templatecode,
+              id: item.id
+            }
+          }),
+          systemScripts: res.scripts.map(item => {
+            return {
+              name: item.funcname,
+              value: window.decodeURIComponent(window.atob(item.longparam))
+            }
+          })
         })
       } else {
         notification.warning({
@@ -1166,7 +1010,7 @@
   }
 
   uniqueChange = (values) => {
-    let verify = JSON.parse(JSON.stringify(this.state.verify))
+    let verify = fromJS(this.state.verify).toJS()
 
     if (values.uuid) {
       verify.uniques = verify.uniques.map(item => {
@@ -1181,34 +1025,21 @@
       verify.uniques.push(values)
     }
 
-    this.setState({
-      verify: verify
-    })
+    this.setState({ verify })
   }
 
   contrastChange = (values) => {
-    let verify = JSON.parse(JSON.stringify(this.state.verify))
+    let verify = fromJS(this.state.verify).toJS()
 
-    if (values.uuid) {
-      verify.contrasts = verify.contrasts.map(item => {
-        if (item.uuid === values.uuid) {
-          return values
-        } else {
-          return item
-        }
-      })
-    } else {
-      values.uuid = Utils.getuuid()
-      verify.contrasts.push(values)
-    }
+    values.status = 'true'
+    values.uuid = Utils.getuuid()
+    verify.contrasts.push(values)
 
-    this.setState({
-      verify: verify
-    })
+    this.setState({ verify })
   }
 
   customChange = (values) => {
-    let verify = JSON.parse(JSON.stringify(this.state.verify))
+    let verify = fromJS(this.state.verify).toJS()
 
     if (values.uuid) {
       verify.customverifys = verify.customverifys.map(item => {
@@ -1223,13 +1054,11 @@
       verify.customverifys.push(values)
     }
 
-    this.setState({
-      verify: verify
-    })
+    this.setState({ verify })
   }
 
   scriptsChange = (values) => {
-    let verify = JSON.parse(JSON.stringify(this.state.verify))
+    let verify = fromJS(this.state.verify).toJS()
 
     if (values.uuid) {
       verify.scripts = verify.scripts.map(item => {
@@ -1244,13 +1073,30 @@
       verify.scripts.push(values)
     }
 
-    this.setState({
-      verify: verify
-    })
+    this.setState({ verify })
+  }
+
+  cbScriptsChange = (values) => {
+    let verify = fromJS(this.state.verify).toJS()
+
+    if (values.uuid) {
+      verify.cbScripts = verify.cbScripts.map(item => {
+        if (item.uuid === values.uuid) {
+          return values
+        } else {
+          return item
+        }
+      })
+    } else {
+      values.uuid = Utils.getuuid()
+      verify.cbScripts.push(values)
+    }
+
+    this.setState({ verify })
   }
 
   orderChange = (values) => {
-    let verify = JSON.parse(JSON.stringify(this.state.verify))
+    let verify = fromJS(this.state.verify).toJS()
 
     if (values.uuid) {
       verify.billcodes = verify.billcodes.map(item => {
@@ -1265,8 +1111,14 @@
       verify.billcodes.push(values)
     }
 
+    this.setState({ verify })
+  }
+
+  onNoteCodeChange = (val, option) => {
+    const { verify } = this.state
+
     this.setState({
-      verify: verify
+      verify: {...verify, noteCode: val, noteId: option.props.id}
     })
   }
 
@@ -1279,35 +1131,47 @@
     })
   }
 
+  changeAccField = (val) => {
+    const { verify } = this.state
+
+    this.setState({
+      verify: {...verify, accountfield: val}
+    })
+  }
+
+  changeAccDate = (val) => {
+    const { verify } = this.state
+
+    this.setState({
+      verify: {...verify, voucherdate: val}
+    })
+  }
+
   handleDelete = (record, type) => {
     const { verify } = this.state
 
     if (type === 'customverify') {
       verify.customverifys = verify.customverifys.filter(item => item.uuid !== record.uuid)
-    } else if (type === 'unique') {
-      verify.uniques = verify.uniques.filter(item => item.uuid !== record.uuid)
     } else if (type === 'ordercode') {
       verify.billcodes = verify.billcodes.filter(item => item.uuid !== record.uuid)
     } else if (type === 'scripts') {
       verify.scripts = verify.scripts.filter(item => item.uuid !== record.uuid)
-    } else if (type === 'contrast') {
-      verify.contrasts = verify.contrasts.filter(item => item.uuid !== record.uuid)
+    } else if (type === 'cbscripts') {
+      verify.cbScripts = verify.cbScripts.filter(item => item.uuid !== record.uuid)
     }
 
-    this.setState({ verify: verify })
+    this.setState({ verify })
   }
 
   handleEdit = (record, type) => {
     if (type === 'customverify') {
       this.customForm.edit(record)
-    } else if (type === 'unique') {
-      this.uniqueForm.edit(record)
     } else if (type === 'ordercode') {
       this.orderForm.edit(record)
     } else if (type === 'scripts') {
       this.scriptsForm.edit(record)
-    } else if (type === 'contrast') {
-      this.contrastForm.edit(record)
+    } else if (type === 'cbscripts') {
+      this.cbscriptsForm.edit(record)
     }
 
     let node = document.getElementById('verify-card-box-tab').parentNode
@@ -1327,27 +1191,11 @@
   }
 
   handleStatus = (record, type) => {
-    let verify = JSON.parse(JSON.stringify(this.state.verify))
+    let verify = fromJS(this.state.verify).toJS()
     record.status = record.status === 'false' ? 'true' : 'false'
 
     if (type === 'customverify') {
       verify.customverifys = verify.customverifys.map(item => {
-        if (item.uuid === record.uuid) {
-          return record
-        } else {
-          return item
-        }
-      })
-    } else if (type === 'unique') {
-      verify.uniques = verify.uniques.map(item => {
-        if (item.uuid === record.uuid) {
-          return record
-        } else {
-          return item
-        }
-      })
-    } else if (type === 'contrast') {
-      verify.contrasts = verify.contrasts.map(item => {
         if (item.uuid === record.uuid) {
           return record
         } else {
@@ -1370,107 +1218,17 @@
           return item
         }
       })
+    } else if (type === 'cbscripts') {
+      verify.cbScripts = verify.cbScripts.map(item => {
+        if (item.uuid === record.uuid) {
+          return record
+        } else {
+          return item
+        }
+      })
     }
 
-    this.setState({
-      verify: verify
-    })
-  }
-
-  handleUpDown = (record, type, direction) => {
-    let verify = JSON.parse(JSON.stringify(this.state.verify))
-    let index = 0
-
-    if (type === 'customverify') {
-      verify.customverifys = verify.customverifys.filter((item, i) => {
-        if (item.uuid === record.uuid) {
-          index = i
-        }
-
-        return item.uuid !== record.uuid
-      })
-      if ((index === 0 && direction === 'up') || (index === verify.customverifys.length && direction === 'down')) {
-        return
-      }
-
-      if (direction === 'up') {
-        verify.customverifys.splice(index - 1, 0, record)
-      } else {
-        verify.customverifys.splice(index + 1, 0, record)
-      }
-    } else if (type === 'unique') {
-      verify.uniques = verify.uniques.filter((item, i) => {
-        if (item.uuid === record.uuid) {
-          index = i
-        }
-
-        return item.uuid !== record.uuid
-      })
-      if ((index === 0 && direction === 'up') || (index === verify.uniques.length && direction === 'down')) {
-        return
-      }
-
-      if (direction === 'up') {
-        verify.uniques.splice(index - 1, 0, record)
-      } else {
-        verify.uniques.splice(index + 1, 0, record)
-      }
-    } else if (type === 'contrast') {
-      verify.contrasts = verify.contrasts.filter((item, i) => {
-        if (item.uuid === record.uuid) {
-          index = i
-        }
-
-        return item.uuid !== record.uuid
-      })
-      if ((index === 0 && direction === 'up') || (index === verify.contrasts.length && direction === 'down')) {
-        return
-      }
-
-      if (direction === 'up') {
-        verify.contrasts.splice(index - 1, 0, record)
-      } else {
-        verify.contrasts.splice(index + 1, 0, record)
-      }
-    } else if (type === 'ordercode') {
-      verify.billcodes = verify.billcodes.filter((item, i) => {
-        if (item.uuid === record.uuid) {
-          index = i
-        }
-
-        return item.uuid !== record.uuid
-      })
-      if ((index === 0 && direction === 'up') || (index === verify.billcodes.length && direction === 'down')) {
-        return
-      }
-
-      if (direction === 'up') {
-        verify.billcodes.splice(index - 1, 0, record)
-      } else {
-        verify.billcodes.splice(index + 1, 0, record)
-      }
-    } else if (type === 'scripts') {
-      verify.scripts = verify.scripts.filter((item, i) => {
-        if (item.uuid === record.uuid) {
-          index = i
-        }
-
-        return item.uuid !== record.uuid
-      })
-      if ((index === 0 && direction === 'up') || (index === verify.scripts.length && direction === 'down')) {
-        return
-      }
-
-      if (direction === 'up') {
-        verify.scripts.splice(index - 1, 0, record)
-      } else {
-        verify.scripts.splice(index + 1, 0, record)
-      }
-    }
-
-    this.setState({
-      verify: verify
-    })
+    this.setState({ verify })
   }
 
   voucherChange = (voucher) => {
@@ -1525,42 +1283,107 @@
     })
   }
 
+  changeUniques = (uniques) => {
+    const { card } = this.props
+    const { verify, fields, columnsFields } = this.state
+
+    let _fields = []
+    let change = {}
+    if (card.Ot !== 'requiredOnce') {
+      _fields = fields
+    } else {
+      _fields = columnsFields
+    }
+    
+    _fields.forEach(col => {
+      change[col.field] = col.label
+    })
+    
+    uniques = uniques.map(item => {
+      item.status = item.status || 'true'
+
+      if (Array.isArray(item.field)) {
+        item.fieldlabel = item.field.map(field => {
+          return change[field] || ''
+        })
+
+        item.fieldlabel = item.fieldlabel.join(',')
+        item.field = item.field.join(',')
+      }
+
+      return item
+    })
+
+    this.setState({verify: {...verify, uniques}})
+  }
+
   handleConfirm = () => {
-    let verify = JSON.parse(JSON.stringify(this.state.verify))
+    const { card } = this.props
+    const { setting } = this.state
+    let verify = fromJS(this.state.verify).toJS()
     
     // 琛ㄥ崟鎻愪氦鏃舵鏌ヨ緭鍏ュ�兼槸鍚︽纭�
     return new Promise((resolve, reject) => {
-      if (verify.default === 'false' && verify.scripts.length === 0) {
+      if ((card.sqlType === 'custom' || verify.default === 'false') && verify.scripts.length === 0) {
         notification.warning({
           top: 92,
           message: '涓嶆墽琛岄粯璁ql鏃讹紝蹇呴』璁剧疆鑷畾涔夎剼鏈紒',
           duration: 5
         })
         return
+      } else if (verify.accountdate === 'true' && !verify.accountfield) {
+        notification.warning({
+          top: 92,
+          message: '寮�鍚处鏈熸椂锛岄渶瑕侀�夋嫨楠岃瘉鍏徃锛�',
+          duration: 5
+        })
+        return
+      } else if (verify.invalid === 'true' && setting.maxScript && setting.maxScript >= 100) {
+        notification.warning({
+          top: 92,
+          message: '鏁版嵁婧愪腑鑷畾涔夎剼鏈繃浜庡鏉傦紝涓嶈兘浣跨敤澶辨晥楠岃瘉锛�',
+          duration: 5
+        })
+        return
       }
 
-      let _loading = false
+      let msg = ''
       if (this.customForm && this.customForm.state.editItem) {
-        _loading = true
-      } else if (this.uniqueForm && this.uniqueForm.state.editItem) {
-        _loading = true
+        msg = '鑷畾涔夐獙璇�'
+      } else if (this.customForm && this.customForm.props.form.getFieldValue('sql') && !/^\s+$/.test(this.customForm.props.form.getFieldValue('sql'))) {
+        msg = '鑷畾涔夐獙璇�'
       } else if (this.orderForm && this.orderForm.state.editItem) {
-        _loading = true
+        msg = '鍗曞彿鐢熸垚'
       } else if (this.scriptsForm && this.scriptsForm.state.editItem) {
-        _loading = true
-      } else if (this.contrastForm && this.contrastForm.state.editItem) {
-        _loading = true
+        msg = '鑷畾涔夎剼鏈�'
+      } else if (this.scriptsForm && this.scriptsForm.props.form.getFieldValue('sql') && !/^\s+$/.test(this.scriptsForm.props.form.getFieldValue('sql'))) {
+        msg = '鑷畾涔夎剼鏈�'
       }
 
-      if (this.scriptsForm && this.scriptsForm.props.form.getFieldValue('sql')) {
-        _loading = true
-      } else if (this.customForm && this.customForm.props.form.getFieldValue('sql')) {
-        _loading = true
+      if (verify.noteEnable === 'true' && !verify.noteCode) { // 寮�鍚煭淇℃椂锛岄渶瑕佹ā鏉跨紪鐮�
+        verify.noteEnable = 'false'
+      } else if (verify.noteEnable !== 'true' && verify.noteCode) {
+        verify.noteCode = ''
       }
 
-      if (_loading) {
+      if (window.GLOB.funcs && window.GLOB.funcs.length > 0) {
+        window.GLOB.funcs.forEach(m => {
+          let reg = new RegExp('\\$ex@' + m.func_code + '@ex\\$', 'ig')
+          verify.customverifys.forEach(item => {
+            item.sql = item.sql.replace(reg, `/*$ex@${m.func_code}-begin*/\n${m.key_sql}\n/*@ex$-end*/`)
+          })
+          verify.scripts.forEach(item => {
+            item.sql = item.sql.replace(reg, `/*$ex@${m.func_code}-begin*/\n${m.key_sql}\n/*@ex$-end*/`)
+          })
+          verify.cbScripts.forEach(item => {
+            item.sql = item.sql.replace(reg, `/*$ex@${m.func_code}-begin*/\n${m.key_sql}\n/*@ex$-end*/`)
+          })
+        })
+      }
+
+      if (msg) {
         confirm({
-          content: `瀛樺湪鏈繚瀛橀」锛岀‘瀹氭彁浜ゅ悧锛焋,
+          content: msg + '鏈繚瀛橈紝纭畾鎻愪氦鍚楋紵',
           onOk() {
             resolve(verify)
           },
@@ -1583,7 +1406,7 @@
 
   render() {
     const { card } = this.props
-    const { verify, fields, uniqueColumns, onceUniqueColumns, columnsFields, contrastColumns, customColumns, orderColumns, scriptsColumns, orderModular, orderModularDetail, voucher, voucherDetail } = this.state
+    const { verify, fields, uniqueFields, uniqueColumns, unionFields, onceUniqueColumns, columnsFields, contrastColumns, customColumns, orderColumns, scriptsColumns, cbScriptsColumns, orderModular, orderModularDetail, voucher, voucherDetail, notes } = this.state
     const formItemLayout = {
       labelCol: {
         xs: { span: 24 },
@@ -1597,14 +1420,14 @@
 
     return (
       <div id="verify-card-box-tab">
-        {card.intertype === 'system' ? <Tabs defaultActiveKey="1" className="verify-card-box">
-          <TabPane tab="鍩虹楠岃瘉" key="1">
+        <Tabs defaultActiveKey="1" className="verify-card-box">
+          {card.intertype === 'system' || (card.intertype === 'custom' && card.procMode === 'system') ? <TabPane tab="鍩虹楠岃瘉" key="1">
             <Form {...formItemLayout}>
               <Row gutter={24}>
                 {this.props.card.sqlType !== 'custom' ? <Col span={8}>
                   <Form.Item label={
                     <Tooltip placement="bottomLeft" title={'榛樿sql鎵ц椤哄簭涓鸿嚜瀹氫箟鑴氭湰涔嬪墠'}>
-                      <Icon type="question-circle" style={{color: '#c49f47', marginRight: '5px'}} />
+                      <QuestionCircleOutlined className="mk-form-tip" />
                       榛樿sql
                     </Tooltip>
                   }>
@@ -1622,6 +1445,33 @@
                     </Radio.Group>
                   </Form.Item>
                 </Col>
+                {verify.accountdate === 'true' ? <Col span={8}>
+                  <Form.Item label={'楠岃瘉鍏徃'} required>
+                    <Select defaultValue={verify.accountfield || ''} onChange={this.changeAccField}>
+                      {unionFields.map(option =>
+                        <Select.Option key={option.uuid} value={option.field}>
+                          {option.label}
+                        </Select.Option>
+                      )}
+                    </Select>
+                  </Form.Item>
+                </Col> : null}
+                {verify.accountdate === 'true' ? <Col span={8}>
+                  <Form.Item label={
+                    <Tooltip placement="bottomLeft" title={'楠岃瘉鏃ユ湡涓虹┖鏃讹紝榛樿涓哄綋澶┿��'}>
+                      <QuestionCircleOutlined className="mk-form-tip" />
+                      楠岃瘉鏃ユ湡
+                    </Tooltip>
+                  }>
+                    <Select allowClear defaultValue={verify.voucherdate || ''} onChange={this.changeAccDate}>
+                      {unionFields.map(option =>
+                        <Select.Option key={option.uuid} value={option.field}>
+                          {option.label}
+                        </Select.Option>
+                      )}
+                    </Select>
+                  </Form.Item>
+                </Col> : null}
                 <Col span={8}>
                   <Form.Item label={'澶辨晥楠岃瘉'}>
                     <Radio.Group value={verify.invalid} onChange={(e) => {this.onOptionChange(e, 'invalid')}}>
@@ -1630,30 +1480,64 @@
                     </Radio.Group>
                   </Form.Item>
                 </Col>
+                <Col span={8}>
+                  <Form.Item label={
+                    <Tooltip placement="bottomLeft" title={'閫夋嫨鍙戦�佺煭淇℃椂锛岄渶瀹屽杽鐭俊璁剧疆銆�'}>
+                      <QuestionCircleOutlined className="mk-form-tip" />
+                      鍙戦�佺煭淇�
+                    </Tooltip>
+                  }>
+                    <Radio.Group value={verify.noteEnable} onChange={(e) => {this.onOptionChange(e, 'noteEnable')}}>
+                      <Radio value="true">寮�鍚�</Radio>
+                      <Radio value="false">涓嶅紑鍚�</Radio>
+                    </Radio.Group>
+                  </Form.Item>
+                </Col>
+                {verify.noteEnable === 'true' ? <Col span={8}>
+                  <Form.Item label="鐭俊妯℃澘">
+                    <Select value={verify.noteCode} onSelect={this.onNoteCodeChange}>
+                      {notes.map(option =>
+                        <Select.Option key={option.value} id={option.id} value={option.value}>
+                          {option.name}
+                        </Select.Option>
+                      )}
+                    </Select>
+                  </Form.Item>
+                </Col> : null}
+                {verify.noteEnable === 'true' ? <Col span={8}>
+                  <Form.Item label={
+                    <Tooltip placement="bottomLeft" title={'瀹炴椂鍙戦�佹渶澶氬悓鏃跺彂閫�5涓敤鎴凤紝瀹氭椂鍙戦�佹渶澶氬悓鏃跺彂閫�100涓敤鎴枫��'}>
+                      <QuestionCircleOutlined className="mk-form-tip" />
+                      鍙戦�佹柟寮�
+                    </Tooltip>
+                  }>
+                    <Radio.Group value={verify.noteType} onChange={(e) => {this.onOptionChange(e, 'noteType')}}>
+                      <Radio value="Y">瀹炴椂</Radio>
+                      <Radio value="N">瀹氭椂</Radio>
+                    </Radio.Group>
+                  </Form.Item>
+                </Col> : null}
+                {verify.noteEnable === 'true' ? <Col span={8}>
+                  <Form.Item label="鐭俊鍐呭">
+                    <Radio.Group value={verify.noteTemp} onChange={(e) => {this.onOptionChange(e, 'noteTemp')}}>
+                      <Radio value="Y">鐩稿悓</Radio>
+                      <Radio value="N">涓嶅悓</Radio>
+                    </Radio.Group>
+                  </Form.Item>
+                </Col> : null}
               </Row>
             </Form>
-          </TabPane>
-          <TabPane tab={
+          </TabPane> : null}
+          {card.intertype === 'system' || (card.intertype === 'custom' && card.procMode === 'system') ? <TabPane tab={
             <span>
               姣旇緝楠岃瘉
               {verify.contrasts.length ? <span className="count-tip">{verify.contrasts.length}</span> : null}
             </span>
           } key="2x">
-            <ContrastForm
-              dict={this.props.dict}
-              contrastChange={this.contrastChange}
-              wrappedComponentRef={(inst) => this.contrastForm = inst}
-            />
-            <Table
-              bordered
-              rowKey="uuid"
-              className="custom-table"
-              dataSource={verify.contrasts}
-              columns={contrastColumns}
-              pagination={false}
-            />
-          </TabPane>
-          <TabPane tab={
+            <ContrastForm dict={this.props.dict} contrastChange={this.contrastChange}/>
+            <EditTable actions={['edit', 'move', 'copy', 'del']} type="contrastverify" data={verify.contrasts} columns={contrastColumns} onChange={(contrasts) => this.setState({verify: {...verify, contrasts}})}/>
+          </TabPane> : null}
+          {card.intertype === 'system' || (card.intertype === 'custom' && card.procMode === 'system') ? <TabPane tab={
             <span>
               鑷畾涔夐獙璇�
               {verify.customverifys.length ? <span className="count-tip">{verify.customverifys.length}</span> : null}
@@ -1667,16 +1551,9 @@
               customChange={this.customChange}
               wrappedComponentRef={(inst) => this.customForm = inst}
             />
-            <Table
-              bordered
-              rowKey="uuid"
-              className="custom-table"
-              dataSource={verify.customverifys}
-              columns={customColumns}
-              pagination={false}
-            />
-          </TabPane>
-          <TabPane tab={
+            <EditTable actions={['move']} data={verify.customverifys} columns={customColumns} onChange={(customverifys) => {this.setState({verify: {...verify, customverifys}})}}/>
+          </TabPane> : null}
+          {card.intertype === 'system' || (card.intertype === 'custom' && card.procMode === 'system') ? <TabPane tab={
             <span>
               鍗曞彿鐢熸垚
               {verify.billcodes.length ? <span className="count-tip">{verify.billcodes.length}</span> : null}
@@ -1693,16 +1570,9 @@
               orderChange={this.orderChange}
               wrappedComponentRef={(inst) => this.orderForm = inst}
             />
-            <Table
-              bordered
-              rowKey="uuid"
-              className="custom-table"
-              dataSource={verify.billcodes}
-              columns={orderColumns}
-              pagination={false}
-            />
-          </TabPane>
-          <TabPane tab={
+            <EditTable actions={['move']} data={verify.billcodes} columns={orderColumns} onChange={(billcodes) => {this.setState({verify: {...verify, billcodes}})}}/>
+          </TabPane> : null}
+          {card.intertype === 'system' || (card.intertype === 'custom' && card.procMode === 'system') ? <TabPane tab={
             <span>
               {card.Ot !== 'requiredOnce' ? '鍞竴鎬ч獙璇�' : '鍚岀被鏁版嵁楠岃瘉'}
               {verify.uniques.length ? <span className="count-tip">{verify.uniques.length}</span> : null}
@@ -1710,21 +1580,13 @@
           } key="2">
             <UniqueForm
               btn={card}
-              fields={card.Ot !== 'requiredOnce' ? fields : columnsFields}
+              fields={card.Ot !== 'requiredOnce' ? uniqueFields : columnsFields}
               dict={this.props.dict}
               uniqueChange={this.uniqueChange}
-              wrappedComponentRef={(inst) => this.uniqueForm = inst}
             />
-            <Table
-              bordered
-              rowKey="uuid"
-              className="custom-table"
-              dataSource={verify.uniques}
-              columns={card.Ot !== 'requiredOnce' ? uniqueColumns : onceUniqueColumns}
-              pagination={false}
-            />
-          </TabPane>
-          <TabPane tab={
+            <EditTable actions={['edit', 'move', 'del']} data={verify.uniques} columns={card.Ot !== 'requiredOnce' ? uniqueColumns : onceUniqueColumns} onChange={this.changeUniques}/>
+          </TabPane> : null}
+          {card.intertype === 'system' || (card.intertype === 'custom' && card.procMode === 'system') ? <TabPane tab={
             <span>
               鍒涘缓鍑瘉
               {verify.voucher && verify.voucher.enabled ? <span className="count-tip">1</span> : null}
@@ -1739,32 +1601,44 @@
               voucherChange={this.voucherChange}
               wrappedComponentRef={(inst) => this.voucherForm = inst}
             />
-          </TabPane>
-          <TabPane tab={
+          </TabPane> : null}
+          {card.intertype === 'system' || (card.intertype === 'custom' && card.procMode === 'system') ? <TabPane tab={
             <span>
               鑷畾涔夎剼鏈�
               {verify.scripts.length ? <span className="count-tip">{verify.scripts.length}</span> : null}
             </span>
           } key="6">
             <CustomScript
-              usefulfields={this.state.usefulfields}
-              initsql={this.state.initsql}
-              dict={this.props.dict}
               btn={this.props.card}
+              dict={this.props.dict}
+              initsql={this.state.initsql}
               customScripts={verify.scripts}
+              defaultsql={this.state.defaultsql}
+              usefulfields={this.state.usefulfields}
               systemScripts={this.state.systemScripts}
               scriptsChange={this.scriptsChange}
               wrappedComponentRef={(inst) => this.scriptsForm = inst}
             />
-            <Table
-              bordered
-              rowKey="uuid"
-              className="custom-table"
-              dataSource={verify.scripts}
-              columns={scriptsColumns}
-              pagination={false}
+            <EditTable actions={['move']} data={verify.scripts} columns={scriptsColumns} onChange={(scripts) => {this.setState({verify: {...verify, scripts}})}}/>
+          </TabPane> : null}
+          {card.callbackType === 'script' && card.intertype === 'custom' ? <TabPane tab={
+            <span>
+              鍥炶皟鑴氭湰
+              {verify.cbScripts.length ? <span className="count-tip">{verify.cbScripts.length}</span> : null}
+            </span>
+          } key="6a">
+            <CallBackCustomScript
+              btn={this.props.card}
+              dict={this.props.dict}
+              initsql={this.state.initsql}
+              customScripts={verify.cbScripts}
+              usefulfields={this.state.usefulfields}
+              systemScripts={this.state.systemScripts}
+              scriptsChange={this.cbScriptsChange}
+              wrappedComponentRef={(inst) => this.cbscriptsForm = inst}
             />
-          </TabPane>
+            <EditTable actions={['move']} data={verify.cbScripts} columns={cbScriptsColumns} onChange={(cbScripts) => {this.setState({verify: {...verify, cbScripts}})}}/>
+          </TabPane> : null}
           <TabPane tab="淇℃伅鎻愮ず" key="7">
             <Form {...formItemLayout}>
               <Row gutter={24}>
@@ -1852,96 +1726,7 @@
               </Row>
             </Form>
           </TabPane>
-        </Tabs> : null}
-        {card.intertype !== 'system' ? <Tabs defaultActiveKey="7" className="verify-card-box">
-          <TabPane tab="淇℃伅鎻愮ず" key="7">
-            <Form {...formItemLayout}>
-              <Row gutter={24}>
-                <Col offset={6} span={6}>
-                  <Form.Item label={'鎻愮ず缂栫爜'}>
-                    <span className="errorval"> S </span>
-                    <Button onClick={() => {this.showError('S')}} type="primary" size="small">
-                      鏌ョ湅
-                    </Button>
-                  </Form.Item>
-                </Col>
-                <Col span={8}>
-                  <Form.Item label={'鍋滅暀鏃堕棿'}>
-                    <InputNumber defaultValue={verify.stime || 2} min={1} max={10000} precision={0} onChange={(val) => {this.timeChange(val, 'stime')}} />
-                  </Form.Item>
-                </Col>
-              </Row>
-              <Row gutter={24}>
-                <Col offset={6} span={6}>
-                  <Form.Item label={'鎻愮ず缂栫爜'}>
-                    <span className="errorval"> Y </span>
-                    <Button onClick={() => {this.showError('Y')}} type="primary" size="small">
-                      鏌ョ湅
-                    </Button>
-                  </Form.Item>
-                </Col>
-              </Row>
-              <Row gutter={24}>
-                <Col offset={6} span={6}>
-                  <Form.Item label={'鎻愮ず缂栫爜'}>
-                    <span className="errorval"> N </span>
-                    <Button onClick={() => {this.showError('N')}} type="primary" size="small">
-                      鏌ョ湅
-                    </Button>
-                  </Form.Item>
-                </Col>
-                <Col span={8}>
-                  <Form.Item label={'鍋滅暀鏃堕棿'}>
-                    <InputNumber defaultValue={verify.ntime || 10} min={1} max={10000} precision={0} onChange={(val) => {this.timeChange(val, 'ntime')}} />
-                  </Form.Item>
-                </Col>
-              </Row>
-              <Row gutter={24}>
-                <Col offset={6} span={6}>
-                  <Form.Item label={'鎻愮ず缂栫爜'}>
-                    <span className="errorval"> F </span>
-                    <Button onClick={() => {this.showError('F')}} type="primary" size="small">
-                      鏌ョ湅
-                    </Button>
-                  </Form.Item>
-                </Col>
-                <Col span={8}>
-                  <Form.Item label={'鍋滅暀鏃堕棿'}>
-                    <InputNumber defaultValue={verify.ftime || 10} min={1} max={10000} precision={0} onChange={(val) => {this.timeChange(val, 'ftime')}} />
-                  </Form.Item>
-                </Col>
-              </Row>
-              <Row gutter={24}>
-                <Col offset={6} span={6}>
-                  <Form.Item label={'鎻愮ず缂栫爜'}>
-                    <span className="errorval"> E </span>
-                    <Button onClick={() => {this.showError('E')}} type="primary" size="small">
-                      鏌ョ湅
-                    </Button>
-                  </Form.Item>
-                </Col>
-              </Row>
-              <Row gutter={24}>
-                <Col offset={6} span={6}>
-                  <Form.Item label={'鎻愮ず缂栫爜'}>
-                    <span className="errorval"> NM </span>
-                    <Button onClick={() => {this.showError('NM')}} type="primary" size="small">
-                      鏌ョ湅
-                    </Button>
-                  </Form.Item>
-                </Col>
-              </Row>
-              <Row gutter={24}>
-                <Col offset={6} span={6}>
-                  <Form.Item label={'鎻愮ず缂栫爜'}>
-                    <span className="errorval"> -1 </span>
-                    涓嶆彁绀�
-                  </Form.Item>
-                </Col>
-              </Row>
-            </Form>
-          </TabPane>
-        </Tabs> : null}
+        </Tabs>
       </div>
     )
   }

--
Gitblit v1.8.0