From c8c8bdf0c362ca76253d8e0cbb0dbaa13efad4a3 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期三, 12 二月 2025 23:09:48 +0800
Subject: [PATCH] 2025-02-12

---
 src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx |  287 ++++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 232 insertions(+), 55 deletions(-)

diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx
index 40af7ca..677ab76 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx
@@ -17,8 +17,11 @@
 
 const { TabPane } = Tabs
 const { confirm } = Modal
+const { Search } = Input
 const { Paragraph } = Typography
+
 const EditTable = asyncComponent(() => import('@/templates/zshare/editTable'))
+const CodeMirror = asyncComponent(() => import('@/templates/zshare/codemirror'))
 const FullScripts = asyncComponent(() => import('@/templates/zshare/verifycard/fullScripts'))
 
 class VerifyCard extends Component {
@@ -31,6 +34,7 @@
     verify: {},
     systemScripts: [],
     activeKey: 'basemsg',
+    searchKey: '',
     excelColumns: [
       {
         title: '瀛楁',
@@ -39,6 +43,8 @@
         inputType: 'input',
         unique: true,
         strict: true,
+        searchable: true,
+        copy: true,
         editable: true
       },
       {
@@ -46,6 +52,7 @@
         dataIndex: 'Text',
         width: '14%',
         inputType: 'input',
+        searchable: true,
         editable: true
       },
       {
@@ -54,6 +61,7 @@
         width: '15%',
         editable: true,
         inputType: 'select',
+        keyCol: true,
         options: [
           { value: 'Nvarchar(10)', text: 'Nvarchar(10)' },
           { value: 'Nvarchar(20)', text: 'Nvarchar(20)' },
@@ -70,6 +78,8 @@
           { value: 'Decimal(18,2)', text: 'Decimal(18,2)' },
           { value: 'Decimal(18,4)', text: 'Decimal(18,4)' },
           { value: 'Decimal(18,6)', text: 'Decimal(18,6)' },
+          { value: 'Decimal(18,8)', text: 'Decimal(18,8)' },
+          { value: 'Decimal(18,10)', text: 'Decimal(18,10)' },
           { value: 'date', text: 'date' },
           { value: 'datetime', text: 'datetime' }
         ]
@@ -109,7 +119,10 @@
         required: false,
         inputType: 'number',
         unlimit: true,
-        editable: true
+        editable: true,
+        keyVals: ['Int', 'Decimal(18,0)', 'Decimal(18,2)', 'Decimal(18,4)', 'Decimal(18,6)'],
+        render: (text, record) => record.required === 'true' && (/^Decimal/ig.test(record.type) || /^int/ig.test(record.type)) ? text : ''
+        
       },
       {
         title: '鏈�澶у��',
@@ -118,7 +131,9 @@
         required: false,
         inputType: 'number',
         unlimit: true,
-        editable: true
+        editable: true,
+        keyVals: ['Int', 'Decimal(18,0)', 'Decimal(18,2)', 'Decimal(18,4)', 'Decimal(18,6)'],
+        render: (text, record) => record.required === 'true' && (/^Decimal/ig.test(record.type) || /^int/ig.test(record.type)) ? text : ''
       }
     ],
     uniqueColumns: [
@@ -192,6 +207,89 @@
             </div>
           )
       },
+      {
+        dataIndex: 'sqlRender',
+        render: (record) => {
+          let columns = this.state.verify.columns
+
+          let textFields = []
+          let numberFields = []
+          let dateFields = []
+          columns.forEach((col) => {
+            if (/Nvarchar/ig.test(col.type)) {
+              textFields.push(col.Column)
+            } else if (/Decimal|int/ig.test(col.type)) {
+              numberFields.push(col.Column)
+            } else if (/date/ig.test(col.type)) {
+              dateFields.push(col.Column)
+            }
+          })
+
+          let _fields = record.field.split(',')
+          let _fields_ = _fields.map(_field => `a.${_field}=b.${_field}`)
+          _fields_ = _fields_.join(' and ')
+
+          let _where = []
+          _fields.forEach(f => {
+            if (textFields.includes(f)) {
+              _where.push(`${f}!=''`)
+            } else if (numberFields.includes(f)) {
+              _where.push(`${f}!=0`)
+            } else if (dateFields.includes(f)) {
+              _where.push(`${f}>'1949-10-01'`)
+            }
+          })
+          _where = _where.length ? `where ${_where.join(' and ')} ` : ''
+
+          if (record.verifyType === 'logic' || record.verifyType === 'logic_temp') {
+            _fields_ += ' and b.deleted=0'
+          }
+
+          let _afields = []
+          _fields = _fields.map(f => {
+            if (numberFields.includes(f)) {
+              _afields.push(`cast(a.${f} as nvarchar(50))`)
+              return `cast(${f} as nvarchar(50))`
+            } else if (dateFields.includes(f)) {
+              _afields.push(`CONVERT(nvarchar(50), a.${f}, 21)`)
+              return `CONVERT(nvarchar(50), ${f}, 21)`
+            }
+            _afields.push(`a.${f}`)
+
+            return f
+          })
+
+          let _sheet = this.props.card.sheet
+
+          let database = _sheet.match(/(.*)\.(.*)\.|@db@/ig) || ''
+          let sheet = _sheet.replace(/(.*)\.(.*)\.|@db@/ig, '')
+          
+          database = database ? (database[0] || '') : ''
+
+          let sql = `
+          /* 閲嶅鎬ч獙璇� */
+          Set @tbid=''
+          Select top 1 @tbid=${_fields.join('+\' \'+')} from (select 1 as n,${record.field} from #${sheet} ${_where}) a group by ${record.field} having sum(n)>1
+          
+          If @tbid!=''
+          Begin
+            select @ErrorCode='${record.errorCode}',@retmsg=@tbid+' 閲嶅'
+            goto aaa
+          end
+          
+          ${record.verifyType.indexOf('temp') === -1 ? `Set @tbid=''
+          Select top 1 @tbid=${_afields.join('+\' \'+')} from ${_where ? `(select * from #${sheet} ${_where})` : `#${sheet}`} a Inner join ${database}${sheet} b on ${_fields_}
+          
+          If @tbid!=''
+          Begin
+            select @ErrorCode='${record.errorCode}',@retmsg=@tbid+' 涓庡凡鏈夋暟鎹噸澶�'
+            goto aaa
+          end` : ''}
+          `
+          
+          return sql.split(/\n\s{10}/ig).map(n => n.replace(/^\s{2}/ig, '&nbsp;&nbsp;'))
+        }
+      }
     ],
     scriptsColumns: [
       {
@@ -296,16 +394,27 @@
       _verify.range = 1
     }
 
+    _verify.excelHandle = _verify.excelHandle || 'false'
+    _verify.default = _verify.default || 'true'
+    _verify.sheet = _verify.sheet || 'Sheet1'
+    _verify.range = _verify.range || 0
+    _verify.columns = _columns
+    _verify.scripts = _verify.scripts || []
+    _verify.uniques = _verify.uniques || []
+
+    if (window.GLOB.process && card.intertype === 'system') {
+      _verify.workFlow = _verify.workFlow || 'false'
+      _verify.flowType = 'start'
+      _verify.flowSql = _verify.flowSql || 'true'
+    } else {
+      delete _verify.workFlow
+      delete _verify.flowType
+      delete _verify.flowSql
+    }
+
     this.setState({
-      verify: {
-        ..._verify,
-        default: _verify.default || 'true',
-        sheet: _verify.sheet || 'Sheet1',
-        range: _verify.range || 0,
-        columns: _columns,
-        scripts: _verify.scripts || [],
-        uniques: _verify.uniques || []
-      }
+      searchKey: '',
+      verify: _verify
     }, () => {
       this.resetUniqueColumns()
     })
@@ -325,17 +434,18 @@
     
     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)
+    _scriptSql = Utils.formatOptions(_scriptSql, 'x')
 
     let _sParam = {
       func: 'sPC_Get_SelectedList',
       LText: _scriptSql,
       obj_name: 'data',
-      arr_field: 'funcname,longparam'
+      arr_field: 'funcname,longparam',
+      exec_type: 'x'
     }
     
     _sParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
-    _sParam.secretkey = Utils.encrypt(_sParam.LText, _sParam.timestamp)
+    _sParam.secretkey = Utils.encrypt('', _sParam.timestamp)
     _sParam.open_key = Utils.encryptOpenKey(_sParam.secretkey, _sParam.timestamp) // 浜戠鏁版嵁楠岃瘉
     
     Api.getCloudConfig(_sParam).then(res => {
@@ -441,6 +551,8 @@
 
       confirm({
         content: '閮ㄥ垎瀛楁鍚嶇О涓庢樉绀哄垪涓嶄竴鑷达紝鏄惁鏇存柊锛�',
+        okText: '鏇存柊',
+        cancelText: '涓嶆洿鏂�',
         onOk() {
           _columns = _columns.map(item => {
             let key = item.Column.toLowerCase()
@@ -486,35 +598,37 @@
 
   clearField = () => {
     const { verify } = this.state
-    const _this = this
+    const that = this
 
     confirm({
       content: `纭畾娓呯┖Excel鍒楀悧锛焋,
       onOk() {
-        _this.setState({
+        that.setState({
           verify: {
             ...verify,
             columns: []
           }
         }, () => {
-          _this.resetUniqueColumns()
+          that.resetUniqueColumns()
         })
       },
       onCancel() {}
     })
   }
 
-  columnChange = (values) => {
+  columnChange = (values, callback) => {
     let verify = JSON.parse(JSON.stringify(this.state.verify))
 
-    let fields = verify.columns.map(item => item.Column)
-    if (fields.includes(values.Column)) {
+    let fields = verify.columns.map(item => item.Column.toLowerCase())
+    if (fields.includes(values.Column.toLowerCase())) {
       notification.warning({
         top: 92,
         message: values.Column + '瀛楁宸插瓨鍦紒',
         duration: 5
       })
       return
+    } else {
+      callback()
     }
 
     values.uuid = Utils.getuuid()
@@ -697,33 +811,44 @@
         if (!err) {
           let _verify = {...verify, ...values}
 
+          if (_verify.excelHandle !== 'true') { 
+            delete _verify.excel_func
+          }
+          if (_verify.default === 'false' && _verify.scripts.length === 0) {
+            notification.warning({
+              top: 92,
+              message: '涓嶆墽琛岄粯璁ql鏃讹紝蹇呴』璁剧疆鑷畾涔夎剼鏈紒',
+              duration: 5
+            })
+            return
+          }
+
           let cols = _verify.columns.map(col => col.Column.toLowerCase())
           cols = Array.from(new Set(cols))
+          let error = ''
 
           if (_verify.columns.length === 0) {
-            notification.warning({
-              top: 92,
-              message: '璇疯缃瓻xcel鍒楀瓧娈�!',
-              duration: 5
-            })
-            return
+            error = '璇疯缃瓻xcel鍒楀瓧娈�!'
           } else if (_verify.columns.length > cols.length) {
-            notification.warning({
-              top: 92,
-              message: 'Excel鍒楀瓧娈靛悕锛屼笉鍙噸澶�!',
-              duration: 5
-            })
-            return
+            error = 'Excel鍒楀瓧娈靛悕锛屼笉鍙噸澶�!'
+          } else if (cols.includes('bid')) {
+            error = 'bid瀛楁涓轰繚鐣欏瓧锛屼笉鍙娇鐢�!'
+          } else if (cols.includes('jskey')) {
+            error = 'jskey瀛楁涓轰繚鐣欏瓧锛屼笉鍙娇鐢�!'
           } else if (_verify.range === 1) {
             let tEmptys = _verify.columns.filter(op => !op.Text)
             if (tEmptys.length > 0) {
-              notification.warning({
-                top: 92,
-                message: '蹇界暐棣栬鏃讹紝浼氫娇鐢═ext鍊兼牎楠孍xcel棣栬鍐呭锛孴ext鍊间笌Excel琛ㄩ琛屽唴瀹圭浉鍚岋紝涓斿潎涓嶅彲涓虹┖锛�',
-                duration: 5
-              })
-              return
+              error = '蹇界暐棣栬鏃讹紝浼氫娇鐢═ext鍊兼牎楠孍xcel棣栬鍐呭锛孴ext鍊间笌Excel琛ㄩ琛屽唴瀹圭浉鍚岋紝涓斿潎涓嶅彲涓虹┖锛�'
             }
+          }
+
+          if (error) {
+            notification.warning({
+              top: 92,
+              message: error,
+              duration: 5
+            })
+            return
           }
 
           _verify.columns.sort((a, b) => {
@@ -756,22 +881,17 @@
             resolve(_verify)
           }
         } else {
-          notification.warning({
-            top: 92,
-            message: '璇疯缃瓻xcel琛ㄥ悕!',
-            duration: 5
-          })
+          this.setState({activeKey: 'basemsg'})
         }
       })
     })
   }
 
-  onOptionChange = (e, key) => {
+  onOptionChange = (value, key) => {
     const { verify } = this.state
-    let value = e.target.value
 
     this.setState({
-      verify: {...verify, default: value}
+      verify: {...verify, [key]: value}
     })
   }
 
@@ -833,7 +953,7 @@
   render() {
     const { card } = this.props
     const { getFieldDecorator } = this.props.form
-    const { verify, excelColumns, scriptsColumns, uniqueColumns, activeKey } = this.state
+    const { verify, excelColumns, scriptsColumns, uniqueColumns, activeKey, searchKey } = this.state
     const formItemLayout = {
       labelCol: {
         xs: { span: 24 },
@@ -852,7 +972,31 @@
           <TabPane tab="鍩虹楠岃瘉" key="basemsg">
             <Form {...formItemLayout}>
               <Row gutter={24}>
+                {card.intertype === 'system' ? <Col span={8}>
+                  <Form.Item label="榛樿sql">
+                    <Radio.Group value={verify.default} onChange={(e) => this.onOptionChange(e.target.value, 'default')}>
+                      <Radio value="true">鎵ц</Radio>
+                      <Radio value="false">涓嶆墽琛�</Radio>
+                    </Radio.Group>
+                  </Form.Item>
+                </Col> : null}
                 <Col span={8}>
+                  <Form.Item label={
+                    <Tooltip placement="topRight" title="鑷畾涔夐獙璇丒xcel鏍煎紡锛屽彲鐢ㄥ弬鏁颁负 XLSX銆亀orkbook銆乥tn銆乧allback銆�">
+                      <QuestionCircleOutlined className="mk-form-tip" />
+                      瀵煎叆鏍煎紡
+                    </Tooltip>
+                  }>
+                    {getFieldDecorator('excelHandle', {
+                      initialValue: verify.excelHandle
+                    })(
+                    <Radio.Group onChange={(e) => this.onOptionChange(e.target.value, 'excelHandle')}>
+                      <Radio value="false">榛樿</Radio>
+                      <Radio value="true">鑷畾涔�</Radio>
+                    </Radio.Group>)}
+                  </Form.Item>
+                </Col>
+                {verify.excelHandle !== 'true' ? <Col span={8}>
                   <Form.Item label={
                     <Tooltip placement="bottomLeft" title="瀵煎叆鏃跺伐浣滆〃鍚嶄笌excel涓繀椤讳竴鑷达紝娉細宸ヤ綔琛ㄥ悕涓篠heet1涓攅xcel涓粎鏈変竴涓伐浣滆〃鏃朵笉杩涜琛ㄥ悕楠岃瘉銆�">
                       <QuestionCircleOutlined className="mk-form-tip" />
@@ -869,7 +1013,7 @@
                       ]
                     })(<Input placeholder="" autoComplete="off" />)}
                   </Form.Item>
-                </Col>
+                </Col> : null}
                 <Col span={8}>
                   <Form.Item label={
                     <Tooltip placement="bottomLeft" title="蹇界暐棣栬鏃讹紝浼氭牎楠宔xcel涓〃澶村悕绉颁笌excel鍒楄缃槸鍚︿竴鑷淬��">
@@ -882,9 +1026,35 @@
                     })(<InputNumber min={0} max={100} precision={0} />)}
                   </Form.Item>
                 </Col>
-                {card.intertype === 'system' ? <Col span={8}>
-                  <Form.Item label={'榛樿sql'}>
-                    <Radio.Group value={verify.default} onChange={this.onOptionChange}>
+                {verify.excelHandle === 'true' ? <Col span={24} style={{paddingLeft: '30px'}}>
+                  <Form.Item wrapperCol={ {xs: { span: 24 }, sm: { span: 24 }} } label="">
+                    {getFieldDecorator('excel_func', {
+                      initialValue: verify.excel_func || '',
+                      rules: [
+                        {
+                          required: true,
+                          message: '璇峰~鍐欒嚜瀹氫箟閫昏緫!'
+                        }
+                      ]
+                    })(<CodeMirror mode="text/javascript" theme="cobalt" />)}
+                  </Form.Item>
+                </Col> : null}
+                {window.GLOB.process && card.intertype === 'system' ? <Col span={8}>
+                  <Form.Item label={
+                    <Tooltip placement="bottomLeft" title="瀵煎叆Excel宸ヤ綔娴佷粎鏀寔鍙戣捣娴佺▼銆�">
+                      <QuestionCircleOutlined className="mk-form-tip" />
+                      宸ヤ綔娴�
+                    </Tooltip>
+                  }>
+                    <Radio.Group value={verify.workFlow} onChange={(e) => {this.onOptionChange(e.target.value, 'workFlow')}}>
+                      <Radio value="true">寮�鍚�</Radio>
+                      <Radio value="false">涓嶅紑鍚�</Radio>
+                    </Radio.Group>
+                  </Form.Item>
+                </Col> : null}
+                {verify.workFlow === 'true' ? <Col span={8}>
+                  <Form.Item label="榛樿sql锛堝伐浣滄祦锛�">
+                    <Radio.Group value={verify.flowSql} onChange={(e) => {this.onOptionChange(e.target.value, 'flowSql')}}>
                       <Radio value="true">鎵ц</Radio>
                       <Radio value="false">涓嶆墽琛�</Radio>
                     </Radio.Group>
@@ -906,8 +1076,8 @@
             <Button className="excel-col-add mk-red" title="娓呯┖Excel鍒�" onClick={this.clearField}>
               娓呯┖Excel鍒�
             </Button>
-            <Col style={{fontSize: '12px', color: '#757575', paddingLeft: '10px'}} span={24}>娉細鏁板�肩被鍨嬶紙int 鎴� decimal锛夛紝鍐呭涓哄繀濉紱鏈�澶у�煎拰鏈�灏忓�煎湪绫诲瀷涓烘暟鍊兼椂鏈夋晥銆傚鍏�-鍒濆鍖栵細鐢ㄤ簬excel涓笉瀛樺湪锛屽鍏ユ椂闇�瑕佸垵濮嬪寲鐨勫瓧娈�</Col>
-            <EditTable actions={['edit', 'move', 'copy', 'del', 'extra:required:鏄惁蹇呭~']} type="excelcolumn" data={verify.columns} columns={excelColumns} onChange={this.changeColumns}/>
+            <Col style={{fontSize: '12px', color: '#757575', paddingLeft: '10px'}} span={24}>娉細鏁板�肩被鍨嬶紙int 鎴� decimal锛夛紝鍐呭涓哄繀濉紱鏈�澶у�煎拰鏈�灏忓�煎湪绫诲瀷涓烘暟鍊兼椂锛堝繀濉級鏈夋晥銆傚鍏�-鍒濆鍖栵細鐢ㄤ簬excel涓笉瀛樺湪锛屽鍏ユ椂闇�瑕佸垵濮嬪寲鐨勫瓧娈�</Col>
+            <EditTable actions={['edit', 'move', 'copy', 'del', 'extra:required:鏄惁蹇呭~']} searchKey={searchKey} type="excelcolumn" data={verify.columns} columns={excelColumns} onChange={this.changeColumns}/>
           </TabPane>
           {card.intertype === 'system' ? <TabPane tab={
             <span>
@@ -916,7 +1086,7 @@
             </span>
           } key="unique">
             <UniqueForm fields={verify.columns} uniqueChange={this.uniqueChange}/>
-            <EditTable actions={['edit', 'move', 'del', 'status']} data={verify.uniques} columns={uniqueColumns} onChange={this.changeUniques}/>
+            <EditTable actions={['edit', 'move', 'del', 'status', 'sql']} data={verify.uniques} columns={uniqueColumns} onChange={this.changeUniques}/>
           </TabPane> : null}
           {card.intertype === 'system' ? <TabPane tab={
             <span>
@@ -936,6 +1106,7 @@
                 btn={this.props.card}
                 usefulfields={verify.columns}
                 scripts={verify.scripts}
+                workFlow={verify.workFlow}
                 systemScripts={this.state.systemScripts}
                 scriptsChange={this.scriptsChange}
                 wrappedComponentRef={(inst) => this.scriptsFullForm = inst}
@@ -945,13 +1116,19 @@
               btn={this.props.card}
               usefulfields={verify.columns}
               scripts={verify.scripts}
+              workFlow={verify.workFlow}
               systemScripts={this.state.systemScripts}
               scriptsChange={this.scriptsChange}
               wrappedComponentRef={(inst) => this.scriptsForm = inst}
             />
             <EditTable actions={['move']} data={verify.scripts} columns={scriptsColumns} onChange={(scripts) => {this.setState({verify: {...verify, scripts}})}}/>
           </TabPane> : null}
-          <TabPane tab="淇℃伅鎻愮ず" key="tip">
+          <TabPane tab={
+            <span>
+              淇℃伅鎻愮ず
+              {activeKey === 'excelcolumn' ? <span onClick={(e) => {e.stopPropagation()}}><Search className="mk-search-fields" defaultValue={searchKey} allowClear onSearch={(val, e) => {e.stopPropagation();this.setState({searchKey: val})}} /></span> : null}
+            </span>
+          } key="tip">
             <Form {...formItemLayout}>
               <Row gutter={24}>
                 <Col offset={6} span={6}>

--
Gitblit v1.8.0