From 291b0107a031282e92d1d1fc0a9d3a3dc8229b85 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期四, 16 五月 2024 11:46:00 +0800
Subject: [PATCH] 2024-05-16

---
 /dev/null                                                  |  177 -----------------
 src/tabviews/custom/components/card/cardcellList/index.jsx |   17 
 src/tabviews/zshare/actionList/funcbutton/index.scss       |    0 
 src/tabviews/zshare/actionList/index.jsx                   |   26 +-
 src/api/index.js                                           |   15 +
 src/tabviews/zshare/actionList/funcbutton/index.jsx        |  344 ++++++++++++++++++++++++++++++++++
 6 files changed, 381 insertions(+), 198 deletions(-)

diff --git a/src/api/index.js b/src/api/index.js
index 42bb5d4..bd49113 100644
--- a/src/api/index.js
+++ b/src/api/index.js
@@ -1061,6 +1061,21 @@
     })
   }
 
+  /**
+   * @description 寰俊鏀粯閫�娆�
+   */
+  setRefund (orderId) {
+    let _param = new FormData()
+    _param.append('out_biz_no', orderId)
+
+    return axios({
+      url: '/wxpay/wxRefund',
+      headers: { 'Content-Type': 'multipart/form-data' },
+      method: 'post',
+      data: _param
+    })
+  }
+
   postekPrint (data) {
     return axios({
       url: 'http://127.0.0.1:888/postek/print',
diff --git a/src/tabviews/custom/components/card/cardcellList/index.jsx b/src/tabviews/custom/components/card/cardcellList/index.jsx
index dee005b..16ec710 100644
--- a/src/tabviews/custom/components/card/cardcellList/index.jsx
+++ b/src/tabviews/custom/components/card/cardcellList/index.jsx
@@ -25,7 +25,7 @@
 const FuncMegvii = asyncComponent(() => import('@/tabviews/zshare/actionList/funcMegvii'))
 const FuncZip = asyncComponent(() => import('@/tabviews/zshare/actionList/funczip'))
 const ExportPdf = asyncComponent(() => import('@/tabviews/zshare/actionList/exportPdf'))
-const ShareLink = asyncComponent(() => import('@/tabviews/zshare/actionList/shareLink'))
+const FuncButton = asyncComponent(() => import('@/tabviews/zshare/actionList/funcbutton'))
 const EditLine = asyncComponent(() => import('@/tabviews/zshare/actionList/editLine'))
 const BarCode = asyncComponent(() => import('@/components/barcode'))
 const QrCode = asyncComponent(() => import('@/components/qrcode'))
@@ -1271,19 +1271,20 @@
               btn={card}
               LID={lid}
             />
-          } else if (card.funcType === 'shareLink') {
-            MkButton = <ShareLink
-              BID={data.$$BID}
-              LID={lid}
-              btn={card}
-              selectedData={_data}
-            />
           } else if (card.funcType === 'addline' || card.funcType === 'delline') {
             MkButton = <EditLine
               btn={card}
               disabled={_disabled}
               selectedData={_data}
             />
+          } else {
+            MkButton = <FuncButton
+              BID={data.$$BID}
+              disabled={_disabled}
+              LID={lid}
+              btn={card}
+              selectedData={_data}
+            />
           }
         }
 
diff --git a/src/tabviews/zshare/actionList/funcbutton/index.jsx b/src/tabviews/zshare/actionList/funcbutton/index.jsx
new file mode 100644
index 0000000..cf887d2
--- /dev/null
+++ b/src/tabviews/zshare/actionList/funcbutton/index.jsx
@@ -0,0 +1,344 @@
+import React, {Component} from 'react'
+import PropTypes from 'prop-types'
+import { is, fromJS } from 'immutable'
+import { Button, notification, message, Modal } from 'antd'
+import md5 from 'md5'
+
+import Api from '@/api'
+import MKEmitter from '@/utils/events.js'
+import MkIcon from '@/components/mk-icon'
+
+// import './index.scss'
+const { confirm } = Modal
+
+class FuncButton extends Component {
+  static propTpyes = {
+    BID: PropTypes.string,
+    btn: PropTypes.object,
+    selectedData: PropTypes.any,
+    disabled: PropTypes.any
+  }
+
+  state = {
+    loading: false,
+    disabled: false,
+    hidden: false,
+  }
+
+  UNSAFE_componentWillMount () {
+    const { btn, selectedData, BData, disabled } = this.props
+
+    if (btn.controlField) {
+      this.setStatus(btn, selectedData || [], BData, disabled)
+    } else if (disabled) {
+      this.setState({disabled: true})
+    }
+  }
+
+  componentDidMount () {
+    MKEmitter.addListener('triggerBtnId', this.actionTrigger)
+  }
+
+  shouldComponentUpdate (nextProps, nextState) {
+    return !is(fromJS(this.state), fromJS(nextState))
+  }
+
+  UNSAFE_componentWillReceiveProps (nextProps) {
+    const { btn } = this.props
+
+    if (btn.controlField) {
+      this.setStatus(btn, nextProps.selectedData || [], nextProps.BData, nextProps.disabled)
+    } else {
+      this.setState({disabled: nextProps.disabled === true})
+    }
+  }
+
+  componentWillUnmount () {
+    this.setState = () => {
+      return
+    }
+    MKEmitter.removeListener('triggerBtnId', this.actionTrigger)
+  }
+
+  setStatus = (btn, data, BData, disprop) => {
+    let disabled = false
+    let hidden = false
+
+    if (btn.control !== 'parent') {
+      if (data.length > 0) {
+        data.forEach(item => {
+          let s = item[btn.controlField] !== undefined ? item[btn.controlField] + '' : ''
+          if (btn.controlVals.includes(s)) {
+            disabled = true
+          }
+        })
+      } else if (btn.controlVals.includes('')) {
+        disabled = true
+      }
+    } else {
+      if (!BData || !BData.hasOwnProperty(btn.controlField)) {
+        hidden = true
+      } else {
+        let s = BData[btn.controlField] + ''
+        if (btn.controlVals.includes(s)) {
+          hidden = true
+        }
+      }
+    }
+
+    if (disabled && btn.control === 'hidden') {
+      hidden = true
+    }
+
+    if (disprop) {
+      disabled = true
+    }
+
+    this.setState({hidden, disabled})
+  }
+
+  /**
+   * @description 瑙﹀彂鎸夐挳鎿嶄綔
+   */
+  actionTrigger = (triggerId, record, type, lid) => {
+    const { btn, BID, selectedData, LID } = this.props
+    const { loading } = this.state
+
+    if (loading) return
+    if (triggerId && btn.uuid !== triggerId) return
+    if (type === 'linkbtn' && !btn.$toolbtn && LID !== lid) return
+
+    let data = record || selectedData || []
+    let error = ''
+
+    if (btn.funcType === 'shareLink' && window.GLOB.systemType === 'production' && !btn.shareProUrl) {
+      error = '灏氭湭璁剧疆姝e紡绯荤粺閾炬帴鍦板潃锛�'
+    } else if (btn.funcType === 'refund') {
+      if (data.length === 0) {
+        error = '璇烽�夋嫨琛岋紒'
+      } else if (data.length !== 1) {
+        error = '璇烽�夋嫨鍗曡鏁版嵁锛�'
+      } else if (!data[0].$$uuid) {
+        error = '鏈幏鍙栧埌璁㈠崟缂栧彿锛�'
+      }
+    }
+
+    if (error) {
+      notification.warning({
+        top: 92,
+        message: error,
+        duration: 5
+      })
+      return
+    }
+
+    if (btn.funcType === 'shareLink') {
+      let bid = BID || ''
+      let id = ''
+      if (data[0]) {
+        id = data[0].$$uuid || ''
+      }
+  
+      let url = btn.shareUrl
+      if (window.GLOB.systemType === 'production') {
+        url = btn.shareProUrl
+      }
+  
+      url = url.replace(/@BID@/ig, bid).replace(/@ID@/ig, id)
+  
+      if (btn.shortUrl === 'true') {
+        this.setState({
+          loading: true
+        }, () => {
+          this.getShortUrl(url)
+        })
+      } else {
+        this.copyUrl(url)
+      }
+    } else if (btn.funcType === 'refund') {
+      let orderId = data[0].$$uuid
+      const that = this
+
+      confirm({
+        title: btn.tipTitle || '纭畾瑕佹墽琛屽悧?',
+        onOk() {
+          that.execRefund(orderId)
+        },
+        onCancel() {}
+      })
+    }
+  }
+
+  execRefund = (orderId) => {
+    Api.setRefund(orderId).then(res => {
+      if (!res.status) {
+        this.execError({ErrCode: 'E', message: '鎵ц澶辫触锛�', ...res})
+      } else {
+        this.execSuccess({ErrCode: 'S', ...res})
+      }
+    })
+  }
+
+  getShortUrl = (url) => {
+    let _rduri = window.atob('aHR0cHM6Ly9lcGMubWs5aC5$mkjbi93ZWJhcGkvZG9zdGFycw=='.replace(/\$mk/ig, ''))
+    let _id = window.atob('YmgwYmFwYWJ0ZDQ1ZXBz$mkZ3JhNzlzZWdiY2g2YzFpYms='.replace(/\$mk/ig, ''))
+
+    let param = {
+      func: 's_url_db_adduptdel',
+      appkey: window.GLOB.appkey,
+      userid: _id,
+      LoginUID: _id,
+      type: 'add_only',
+      validity: 15,
+      linkurl: url,
+      nonc: '' + new Date().getTime(),
+      id: md5(url + window.GLOB.appkey)
+    }
+
+    let keys = Object.keys(param).sort()
+    let values = ''
+    keys.forEach(key => {
+      values += key + param[key]
+    })
+    param.sign = md5(values)
+    param.t = new Date().getTime()
+
+    Api.directRequest({
+      url: _rduri + '/s_url_db_adduptdel',
+      method: 'post',
+      data: JSON.stringify(param)
+    }).then(res => {
+      this.setState({
+        loading: false
+      })
+
+      if (res.status && res.id) {
+        this.copyUrl('https://mk9h.cn/m.asp?m=' + res.id)
+      } else {
+        notification.warning({
+          top: 92,
+          message: res.message || '閾炬帴鐢熸垚澶辫触锛�',
+          duration: 5
+        })
+      }
+    }, () => {
+      this.setState({
+        loading: false
+      })
+    })
+  }
+
+  copyUrl = (url) => {
+    const { btn } = this.props
+
+    let oInput = document.createElement('input')
+    oInput.value = url
+    document.body.appendChild(oInput)
+    oInput.select()
+    document.execCommand('Copy')
+    document.body.removeChild(oInput)
+
+    if (btn.shareTip) {
+      Modal.success({
+        title: btn.shareTip
+      })
+    } else {
+      message.success('宸插鍒跺埌鍓垏鏉裤��')
+    }
+  }
+
+  execSuccess = (res = {}) => {
+    const { btn } = this.props
+
+    if (res.ErrCode === 'S' || !res.ErrCode) { // 鎵ц鎴愬姛
+      notification.success({
+        top: 92,
+        message: res.message || '鎵ц鎴愬姛锛�',
+        duration: btn.verify && btn.verify.stime ? btn.verify.stime : 2
+      })
+    } else if (res.ErrCode === 'Y') { // 鎵ц鎴愬姛
+      Modal.success({
+        title: res.message || '鎵ц鎴愬姛锛�'
+      })
+    } else if (res.ErrCode === '-1') { // 瀹屾垚鍚庝笉鎻愮ず
+
+    }
+
+    this.setState({
+      loading: false
+    })
+
+    if (btn.execSuccess !== 'never') {
+      MKEmitter.emit('refreshByButtonResult', btn.$menuId, btn.execSuccess, btn)
+    }
+  }
+
+  execError = (res) => {
+    const { btn } = this.props
+
+    if (!['LoginError', 'C', '-2', 'E', 'N', 'F', 'NM'].includes(res.ErrCode)) {
+      res.ErrCode = 'E'
+    }
+
+    if (res.ErrCode === 'E') {
+      Modal.error({
+        title: res.message || '鎵ц澶辫触锛�',
+      })
+    } else if (res.ErrCode === 'N') {
+      notification.error({
+        top: 92,
+        message: res.message || '鎵ц澶辫触锛�',
+        duration: btn.verify && btn.verify.ntime ? btn.verify.ntime : 10
+      })
+    } else if (res.ErrCode === 'F') {
+      notification.error({
+        className: 'notification-custom-error',
+        top: 92,
+        message: res.message || '鎵ц澶辫触锛�',
+        duration: btn.verify && btn.verify.ftime ? btn.verify.ftime : 10
+      })
+    } else if (res.ErrCode === 'NM') {
+      message.error(res.message || '鎵ц澶辫触锛�')
+    }
+    
+    this.setState({
+      loading: false
+    })
+
+    if (res.ErrCode === '-2') return
+
+    if (btn.execError !== 'never') {
+      MKEmitter.emit('refreshByButtonResult', btn.$menuId, btn.execError, btn)
+    }
+  }
+
+  render() {
+    const { btn } = this.props
+    const { loading, hidden } = this.state
+
+    if (hidden) return null
+
+    let label = ''
+
+    if (btn.show === 'link') {
+      label = <span>{btn.label}{btn.icon ? <MkIcon style={{marginLeft: '8px'}} type={btn.icon} /> : ''}</span>
+    } else if (btn.show === 'icon') {
+      label = !loading ? <MkIcon type={btn.icon} /> : null
+    } else {
+      label = <span>{!loading && btn.icon ? <MkIcon style={{marginRight: '8px'}} type={btn.icon} /> : ''}{btn.label}</span>
+    }
+    
+    return (
+      <Button
+        type="link"
+        title={btn.show === 'icon' ? btn.label : ''}
+        loading={loading}
+        style={btn.style || null}
+        className={btn.hover || ''}
+        onClick={(e) => {e.stopPropagation(); this.actionTrigger()}}
+      >{label}</Button>
+    )
+  }
+}
+
+export default FuncButton
\ No newline at end of file
diff --git a/src/tabviews/zshare/actionList/shareLink/index.scss b/src/tabviews/zshare/actionList/funcbutton/index.scss
similarity index 100%
rename from src/tabviews/zshare/actionList/shareLink/index.scss
rename to src/tabviews/zshare/actionList/funcbutton/index.scss
diff --git a/src/tabviews/zshare/actionList/index.jsx b/src/tabviews/zshare/actionList/index.jsx
index 3993d7e..8e213d8 100644
--- a/src/tabviews/zshare/actionList/index.jsx
+++ b/src/tabviews/zshare/actionList/index.jsx
@@ -19,7 +19,7 @@
 const FuncZip = asyncComponent(() => import('./funczip'))
 const EditLine = asyncComponent(() => import('./editLine'))
 const ExportPdf = asyncComponent(() => import('./exportPdf'))
-const ShareLink = asyncComponent(() => import('./shareLink'))
+const FuncButton = asyncComponent(() => import('./funcbutton'))
 
 class ActionList extends Component {
   static propTpyes = {
@@ -197,26 +197,26 @@
               btn={item}
             />
           )
-        } else if (item.funcType === 'shareLink') {
+        } else if (item.funcType === 'addline' || item.funcType === 'delline') {
           return (
-            <ShareLink
+            <EditLine
+            key={item.uuid}
+            disabled={false}
+            btn={item}
+            selectedData={selectedData}
+            />
+            )
+          }
+        } else {
+          return (
+            <FuncButton
               key={item.uuid}
               BID={BID}
               btn={item}
               selectedData={selectedData}
             />
           )
-        } else if (item.funcType === 'addline' || item.funcType === 'delline') {
-          return (
-            <EditLine
-              key={item.uuid}
-              disabled={false}
-              btn={item}
-              selectedData={selectedData}
-            />
-          )
         }
-      }
       return null
     })
   }
diff --git a/src/tabviews/zshare/actionList/shareLink/index.jsx b/src/tabviews/zshare/actionList/shareLink/index.jsx
deleted file mode 100644
index c13444a..0000000
--- a/src/tabviews/zshare/actionList/shareLink/index.jsx
+++ /dev/null
@@ -1,177 +0,0 @@
-import React, {Component} from 'react'
-import PropTypes from 'prop-types'
-import { is, fromJS } from 'immutable'
-import { Button, notification, message, Modal } from 'antd'
-import md5 from 'md5'
-
-import Api from '@/api'
-import MKEmitter from '@/utils/events.js'
-import MkIcon from '@/components/mk-icon'
-
-// import './index.scss'
-
-class ShareLink extends Component {
-  static propTpyes = {
-    BID: PropTypes.string,
-    btn: PropTypes.object,
-    selectedData: PropTypes.any
-  }
-
-  state = {
-    loading: false
-  }
-
-  componentDidMount () {
-    MKEmitter.addListener('triggerBtnId', this.actionTrigger)
-  }
-
-  shouldComponentUpdate (nextProps, nextState) {
-    return !is(fromJS(this.state), fromJS(nextState))
-  }
-
-  componentWillUnmount () {
-    this.setState = () => {
-      return
-    }
-    MKEmitter.removeListener('triggerBtnId', this.actionTrigger)
-  }
-
-  /**
-   * @description 瑙﹀彂鎸夐挳鎿嶄綔
-   */
-  actionTrigger = (triggerId) => {
-    const { btn, BID, selectedData } = this.props
-    const { loading } = this.state
-
-    if (loading) return
-    if (triggerId && btn.uuid !== triggerId) return
-
-    if (window.GLOB.systemType === 'production' && !btn.shareProUrl) {
-      notification.warning({
-        top: 92,
-        message: '灏氭湭璁剧疆姝e紡绯荤粺閾炬帴鍦板潃锛�',
-        duration: 5
-      })
-      return
-    }
-
-    let bid = BID || ''
-    let id = ''
-    if (selectedData && selectedData[0]) {
-      id = selectedData[0].$$uuid || ''
-    }
-
-    let url = btn.shareUrl
-    if (window.GLOB.systemType === 'production') {
-      url = btn.shareProUrl
-    }
-
-    url = url.replace(/@BID@/ig, bid).replace(/@ID@/ig, id)
-
-    if (btn.shortUrl === 'true') {
-      this.setState({
-        loading: true
-      }, () => {
-        this.getShortUrl(url)
-      })
-    } else {
-      this.copyUrl(url)
-    }
-  }
-
-  getShortUrl = (url) => {
-    let _rduri = window.atob('aHR0cHM6Ly9lcGMubWs5aC5$mkjbi93ZWJhcGkvZG9zdGFycw=='.replace(/\$mk/ig, ''))
-    let _id = window.atob('YmgwYmFwYWJ0ZDQ1ZXBz$mkZ3JhNzlzZWdiY2g2YzFpYms='.replace(/\$mk/ig, ''))
-
-    let param = {
-      func: 's_url_db_adduptdel',
-      appkey: window.GLOB.appkey,
-      userid: _id,
-      LoginUID: _id,
-      type: 'add_only',
-      validity: 15,
-      linkurl: url,
-      nonc: '' + new Date().getTime(),
-      id: md5(url + window.GLOB.appkey)
-    }
-
-    let keys = Object.keys(param).sort()
-    let values = ''
-    keys.forEach(key => {
-      values += key + param[key]
-    })
-    param.sign = md5(values)
-    param.t = new Date().getTime()
-
-    Api.directRequest({
-      url: _rduri + '/s_url_db_adduptdel',
-      method: 'post',
-      data: JSON.stringify(param)
-    }).then(res => {
-      this.setState({
-        loading: false
-      })
-
-      if (res.status && res.id) {
-        this.copyUrl('https://mk9h.cn/m.asp?m=' + res.id)
-      } else {
-        notification.warning({
-          top: 92,
-          message: res.message || '閾炬帴鐢熸垚澶辫触锛�',
-          duration: 5
-        })
-      }
-    }, () => {
-      this.setState({
-        loading: false
-      })
-    })
-  }
-
-  copyUrl = (url) => {
-    const { btn } = this.props
-
-    let oInput = document.createElement('input')
-    oInput.value = url
-    document.body.appendChild(oInput)
-    oInput.select()
-    document.execCommand('Copy')
-    document.body.removeChild(oInput)
-
-    if (btn.shareTip) {
-      Modal.success({
-        title: btn.shareTip
-      })
-    } else {
-      message.success('宸插鍒跺埌鍓垏鏉裤��')
-    }
-  }
-
-  render() {
-    const { btn } = this.props
-    const { loading } = this.state
-
-    let label = ''
-
-    if (btn.show === 'link') {
-      label = <span>{btn.label}{btn.icon ? <MkIcon style={{marginLeft: '8px'}} type={btn.icon} /> : ''}</span>
-    } else if (btn.show === 'icon') {
-      label = !loading ? <MkIcon type={btn.icon} /> : null
-    } else {
-      label = <span>{!loading && btn.icon ? <MkIcon style={{marginRight: '8px'}} type={btn.icon} /> : ''}{btn.label}</span>
-    }
-    
-    return (
-      <Button
-        type="link"
-        title={btn.show === 'icon' ? btn.label : ''}
-        loading={loading}
-        style={btn.style || null}
-        className={btn.hover || ''}
-        onClick={(e) => {e.stopPropagation(); this.actionTrigger()}}
-      >{label}</Button>
-    )
-  }
-}
-
-export default ShareLink
\ No newline at end of file

--
Gitblit v1.8.0