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 |  545 ++++++++++++++++++++++++++----------------------------
 1 files changed, 263 insertions(+), 282 deletions(-)

diff --git a/src/templates/zshare/verifycard/index.jsx b/src/templates/zshare/verifycard/index.jsx
index 40fcbbb..5bc26a1 100644
--- a/src/templates/zshare/verifycard/index.jsx
+++ b/src/templates/zshare/verifycard/index.jsx
@@ -1,19 +1,22 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { fromJS } from 'immutable'
-import { Form, Tabs, Row, Col, Radio, Button, Table, Select, 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
@@ -33,6 +36,7 @@
   state = {
     initsql: '',            // sql楠岃瘉鏃跺彉閲忓0鏄庡強璧嬪��
     notes: [],              // 鐭俊妯℃澘
+    setting: null,
     verify: {},
     fields: [],
     usefulfields: '',
@@ -95,13 +99,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>
           )
       }
@@ -131,13 +135,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>
           )
       },
@@ -205,13 +209,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>
           )
       }
@@ -257,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>
           )
       },
@@ -273,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>)
       }
@@ -328,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>
           )
       },
@@ -344,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>)
       }
@@ -409,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
         }
@@ -431,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>
           )
       },
@@ -447,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>)
       }
@@ -491,10 +556,31 @@
     _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 (config.Template !== 'FormTab' && (card.intertype === 'inner' || card.intertype === 'outer')) { // 鍐呴儴鎴栧閮ㄦ帴鍙�
+      return
+    }
 
     new Promise(resolve => {
       let _fields = []
@@ -504,13 +590,7 @@
         })
         resolve(_fields)
       } else if (card.modal) {
-        if (card.modal.groups && card.modal.groups.length > 0) {
-          card.modal.groups.forEach(group => {
-            _fields.push(...group.sublist)
-          })
-        } else {
-          _fields = card.modal.fields || []
-        }
+        _fields = card.modal.fields || []
         resolve(_fields)
       } else if (card.OpenType === 'pop') {
         Api.getSystemConfig({
@@ -529,19 +609,10 @@
             }
             
             if (!_LongParam) {
-              notification.warning({
-                top: 92,
-                message: '鏈幏鍙栧埌琛ㄥ崟淇℃伅锛岄儴鍒嗛獙璇佸皢鏃犳硶璁剧疆锛�',
-                duration: 5
-              })
+              message.warning('鏈幏鍙栧埌琛ㄥ崟淇℃伅锛岄儴鍒嗛獙璇佸皢鏃犳硶璁剧疆锛�')
             } else {
-              if (_LongParam.groups.length > 0) {
-                _LongParam.groups.forEach(group => {
-                  _fields.push(...group.sublist)
-                })
-              } else {
-                _fields = _LongParam.fields || []
-              }
+              _LongParam = updateForm(_LongParam)
+              _fields = _LongParam.fields || []
             }
           } else {
             notification.warning({
@@ -556,9 +627,9 @@
         resolve(_fields)
       }
     }).then(_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 _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
 
@@ -603,9 +674,6 @@
 
       if (!hasBid) { // 鍞竴鎬ч獙璇佹坊鍔燘ID
         uniqueFields.unshift({ uuid: 'BID', field: 'BID', label: 'BID', type: 'text' })
-      }
-
-      if (!hasBid && (card.sqlType === 'insert' || card.sqlType === 'insertOrUpdate')) { // 琛ㄥ崟涓鍔燘ID
         _fields.unshift({ uuid: 'BID', field: 'BID', label: 'BID', type: 'text' })
         fieldArr.push('bid')
         _declare.push(`@bid nvarchar(50)`)
@@ -741,9 +809,15 @@
           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@')
@@ -763,7 +837,7 @@
         }
 
         _form = _form.join(', ')
-        _updatesql = `update ${card.sql} set ${_form} where ${config.setting.primaryKey}${card.Ot !== 'requiredOnce' ? '=@ID@' : ' in (select ID  from dbo.SplitComma(@ID@))'};`
+        _updatesql = `update ${card.sql} set ${_form} where ${config.setting.primaryKey || 'id'}${card.Ot !== 'requiredOnce' ? '=@ID@' : ' in (select ID  from dbo.SplitComma(@ID@))'};`
       }
 
       if (card.sqlType === 'insert') {
@@ -772,7 +846,7 @@
         _defaultsql = _updatesql
       } else if (card.sqlType === 'insertOrUpdate') {
         _defaultsql += `select @tbid=''
-          select @tbid='X' from ${card.sql} where ${config.setting.primaryKey}=@ID@
+          select @tbid='X' from ${card.sql} where ${config.setting.primaryKey || 'id'}=@ID@
           if @tbid=''
             begin
             ${_insertsql}
@@ -787,7 +861,7 @@
         if (_verify.voucher && _verify.voucher.enabled) {
           _voucher = ',BVoucher=@BVoucher,FIBVoucherDate=@FIBVoucherDate,FiYear=@FiYear'
         }
-        _defaultsql = `update ${card.sql} set deleted=1,modifydate=getdate(),modifyuserid=@userid@${_voucher} where ${config.setting.primaryKey}${card.Ot !== 'requiredOnce' ? '=@ID@' : ' in (select ID  from dbo.SplitComma(@ID@))'};`
+        _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 && card.Ot !== 'notRequired' && card.Ot !== 'requiredOnce') {
@@ -799,7 +873,7 @@
             _index++
           })
         }
-        _defaultsql += `insert into snote (remark,createuserid,CreateUser,CreateStaff) select left('鍒犻櫎琛�:${card.sql} 鏁版嵁: ${_msg}${config.setting.primaryKey}='+@ID@,200),@userid@,@username,@fullname delete ${card.sql} where ${config.setting.primaryKey}${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 = []
@@ -807,7 +881,7 @@
         _columns = fromJS(columns).toJS()
         let hasbid = false
         _columns = _columns.filter(col => {
-          if (col.field.toLowerCase() === 'bid') {
+          if (col.field && col.field.toLowerCase() === 'bid') {
             hasbid = true
           }
 
@@ -853,7 +927,7 @@
       {
         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 Deleted=0 and Appkey=case when Appkey='' then '' else @Appkey@ end order by ModularDetailCode`))
+        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',
@@ -868,13 +942,13 @@
           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`
+          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',
-        LText: window.btoa(window.encodeURIComponent(`select 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`))
+        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',
@@ -898,7 +972,13 @@
     mutilparam.secretkey = Utils.encrypt(mutilparam.LText, mutilparam.timestamp)
     mutilparam.open_key = Utils.encryptOpenKey(mutilparam.secretkey, mutilparam.timestamp)
 
-    Api.getCloudCacheConfig(mutilparam).then(res => {
+    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) {
         this.setState({
           orderModular: res.modular,
@@ -908,13 +988,14 @@
           notes: res.noteCodes.map(item => {
             return {
               name: item.describe,
-              value: item.templatecode
+              value: item.templatecode,
+              id: item.id
             }
           }),
           systemScripts: res.scripts.map(item => {
             return {
               name: item.funcname,
-              value: Utils.UnformatOptions(item.longparam)
+              value: window.decodeURIComponent(window.atob(item.longparam))
             }
           })
         })
@@ -995,6 +1076,25 @@
     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 = fromJS(this.state.verify).toJS()
 
@@ -1014,11 +1114,11 @@
     this.setState({ verify })
   }
 
-  onNoteCodeChange = (val) => {
+  onNoteCodeChange = (val, option) => {
     const { verify } = this.state
 
     this.setState({
-      verify: {...verify, noteCode: val}
+      verify: {...verify, noteCode: val, noteId: option.props.id}
     })
   }
 
@@ -1056,6 +1156,8 @@
       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 === 'cbscripts') {
+      verify.cbScripts = verify.cbScripts.filter(item => item.uuid !== record.uuid)
     }
 
     this.setState({ verify })
@@ -1068,6 +1170,8 @@
       this.orderForm.edit(record)
     } else if (type === 'scripts') {
       this.scriptsForm.edit(record)
+    } else if (type === 'cbscripts') {
+      this.cbscriptsForm.edit(record)
     }
 
     let node = document.getElementById('verify-card-box-tab').parentNode
@@ -1114,66 +1218,14 @@
           return item
         }
       })
-    }
-
-    this.setState({ verify })
-  }
-
-  handleUpDown = (record, type, direction) => {
-    let verify = fromJS(this.state.verify).toJS()
-    let index = 0
-
-    if (type === 'customverify') {
-      verify.customverifys = verify.customverifys.filter((item, i) => {
+    } else if (type === 'cbscripts') {
+      verify.cbScripts = verify.cbScripts.map(item => {
         if (item.uuid === record.uuid) {
-          index = i
+          return record
+        } else {
+          return item
         }
-
-        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 === '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 })
@@ -1267,11 +1319,12 @@
 
   handleConfirm = () => {
     const { card } = this.props
+    const { setting } = this.state
     let verify = fromJS(this.state.verify).toJS()
     
     // 琛ㄥ崟鎻愪氦鏃舵鏌ヨ緭鍏ュ�兼槸鍚︽纭�
     return new Promise((resolve, reject) => {
-      if (card.sqlType !== 'custom' && verify.default === 'false' && verify.scripts.length === 0) {
+      if ((card.sqlType === 'custom' || verify.default === 'false') && verify.scripts.length === 0) {
         notification.warning({
           top: 92,
           message: '涓嶆墽琛岄粯璁ql鏃讹紝蹇呴』璁剧疆鑷畾涔夎剼鏈紒',
@@ -1285,21 +1338,26 @@
           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
+        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
-      }
-
-      if (this.scriptsForm && this.scriptsForm.props.form.getFieldValue('sql') && this.scriptsForm.props.form.getFieldValue('sql') !== ' ') {
-        _loading = true
-      } else if (this.customForm && this.customForm.props.form.getFieldValue('sql') && this.customForm.props.form.getFieldValue('sql') !== ' ') {
-        _loading = true
+        msg = '鑷畾涔夎剼鏈�'
+      } else if (this.scriptsForm && this.scriptsForm.props.form.getFieldValue('sql') && !/^\s+$/.test(this.scriptsForm.props.form.getFieldValue('sql'))) {
+        msg = '鑷畾涔夎剼鏈�'
       }
 
       if (verify.noteEnable === 'true' && !verify.noteCode) { // 寮�鍚煭淇℃椂锛岄渶瑕佹ā鏉跨紪鐮�
@@ -1308,9 +1366,24 @@
         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)
           },
@@ -1333,7 +1406,7 @@
 
   render() {
     const { card } = this.props
-    const { verify, fields, uniqueFields, uniqueColumns, unionFields, onceUniqueColumns, columnsFields, contrastColumns, customColumns, orderColumns, scriptsColumns, orderModular, orderModularDetail, voucher, voucherDetail, notes } = 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 },
@@ -1347,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>
                   }>
@@ -1386,7 +1459,7 @@
                 {verify.accountdate === 'true' ? <Col span={8}>
                   <Form.Item label={
                     <Tooltip placement="bottomLeft" title={'楠岃瘉鏃ユ湡涓虹┖鏃讹紝榛樿涓哄綋澶┿��'}>
-                      <Icon type="question-circle" style={{color: '#c49f47', marginRight: '5px'}} />
+                      <QuestionCircleOutlined className="mk-form-tip" />
                       楠岃瘉鏃ユ湡
                     </Tooltip>
                   }>
@@ -1410,7 +1483,7 @@
                 <Col span={8}>
                   <Form.Item label={
                     <Tooltip placement="bottomLeft" title={'閫夋嫨鍙戦�佺煭淇℃椂锛岄渶瀹屽杽鐭俊璁剧疆銆�'}>
-                      <Icon type="question-circle" style={{color: '#c49f47', marginRight: '5px'}} />
+                      <QuestionCircleOutlined className="mk-form-tip" />
                       鍙戦�佺煭淇�
                     </Tooltip>
                   }>
@@ -1424,7 +1497,7 @@
                   <Form.Item label="鐭俊妯℃澘">
                     <Select value={verify.noteCode} onSelect={this.onNoteCodeChange}>
                       {notes.map(option =>
-                        <Select.Option key={option.value} value={option.value}>
+                        <Select.Option key={option.value} id={option.id} value={option.value}>
                           {option.name}
                         </Select.Option>
                       )}
@@ -1434,7 +1507,7 @@
                 {verify.noteEnable === 'true' ? <Col span={8}>
                   <Form.Item label={
                     <Tooltip placement="bottomLeft" title={'瀹炴椂鍙戦�佹渶澶氬悓鏃跺彂閫�5涓敤鎴凤紝瀹氭椂鍙戦�佹渶澶氬悓鏃跺彂閫�100涓敤鎴枫��'}>
-                      <Icon type="question-circle" style={{color: '#c49f47', marginRight: '5px'}} />
+                      <QuestionCircleOutlined className="mk-form-tip" />
                       鍙戦�佹柟寮�
                     </Tooltip>
                   }>
@@ -1454,17 +1527,17 @@
                 </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}/>
-            <EditTable data={verify.contrasts} columns={contrastColumns} onChange={(contrasts) => this.setState({verify: {...verify, contrasts}})}/>
-          </TabPane>
-          <TabPane tab={
+            <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}
@@ -1478,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}
@@ -1504,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}
@@ -1525,9 +1584,9 @@
               dict={this.props.dict}
               uniqueChange={this.uniqueChange}
             />
-            <EditTable data={verify.uniques} columns={card.Ot !== 'requiredOnce' ? uniqueColumns : onceUniqueColumns} onChange={this.changeUniques}/>
-          </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}
@@ -1542,33 +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}>
@@ -1656,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