king
2022-12-19 102be577a7f8df2ae30045d55a1a5fc584f90363
src/tabviews/zshare/actionList/printbutton/index.jsx
@@ -1,7 +1,6 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import moment from 'moment'
import {connect} from 'react-redux'
import { is, fromJS } from 'immutable'
import { Button, Modal, notification, message } from 'antd'
@@ -22,17 +21,14 @@
class PrintButton extends Component {
  static propTpyes = {
    show: PropTypes.any,              // 按钮显示样式控制
    BID: PropTypes.string,            // 主表ID
    BData: PropTypes.any,             // 主表数据
    selectedData: PropTypes.any,      // 子表中选择数据
    Tab: PropTypes.any,               // 如果当前元素为标签时,tab为标签信息
    MenuID: PropTypes.string,         // 菜单ID
    btn: PropTypes.object,            // 按钮
    setting: PropTypes.any,           // 页面通用设置
    ContainerId: PropTypes.any,       // tab页面ID,用于弹窗控制
    columns: PropTypes.array,
    disabled: PropTypes.any,          // 行按钮禁用
    lineId: PropTypes.any,            // 行索引+主键值,用于行按钮双击
  }
  state = {
@@ -41,10 +37,10 @@
    formdata: null,
    selines: null,
    btnconfig: null,
    confirmLoading: false,
    loading: false,
    disabled: false,
    hidden: false,
    loadingNumber: '',
    autoMatic: false
  }
@@ -146,28 +142,21 @@
   * @description 触发按钮操作
   */
  actionTrigger = (triggerId, record, type) => {
    const { Tab, BID, btn, selectedData, setting } = this.props
    const { BID, btn, selectedData, setting } = this.props
    const { loading, disabled } = this.state
    if (loading || disabled) return
    if (triggerId) {
      if (btn.uuid !== triggerId) return
      if (this.props.lineId && record && record[0] && this.props.lineId !== record[0].$$key) {
        return
      }
    }
    if (triggerId && btn.uuid !== triggerId) return
    if (((Tab && Tab.supMenu) || setting.supModule) && !BID) {
    if (setting.supModule && !BID) {
      notification.warning({
        top: 92,
        message: '需要上级主键值!',
        duration: 5
      })
      return
    } else if (type === 'linkbtn' && selectedData && selectedData.length === 1) {
      if (record[0].$Index !== selectedData[0].$Index) {
        return
      }
    } else if (type === 'linkbtn' && !btn.$toolbtn && !is(fromJS(selectedData || []), fromJS(record))) {
      return
    }
    this.setState({autoMatic: type === 'autoMatic'})
@@ -195,14 +184,17 @@
      // 数据选择类型校验
      this.actionSettingError()
      return
    } else if (
      !btn.verify ||
      (btn.verify.printMode === 'normal' && (!btn.verify.Template || !btn.verify.linkUrl)) ||
      (btn.verify.printMode === 'custom' && (!btn.verify.printFunc || !btn.verify.linkUrl))
    ) {
    } else if (!btn.verify || !btn.verify.printMode) {
      notification.warning({
        top: 92,
        message: '请完善打印验证信息!',
        duration: 5
      })
      return
    } else if (btn.intertype === 'system' && btn.verify.dataType === 'custom' && (!btn.verify.setting || btn.verify.columns.length === 0)) {
      notification.warning({
        top: 92,
        message: '自定义打印数据请设置数据源!',
        duration: 5
      })
      return
@@ -244,82 +236,134 @@
    }
  }
  triggerPrint = (data, formlist = []) => {
    const { btn } = this.props
    if (btn.verify.printMode === 'RFID') {
      this.triggerRFIDPrint(data, formlist)
    } else {
      this.triggerNormalPrint(data, formlist)
    }
  }
  /**
   * @description 触发打印
   */
  triggerPrint = (data, formlist = []) => {
  triggerNormalPrint = (data, formlist) => {
    const { btn } = this.props
    let formdata = {}
    
    formlist.forEach(_data => {
      formdata[_data.key] = _data.value
      let _key = _data.key.toLowerCase()
      formdata[_key] = _data.value
    })
    let printlist = []
    let templates = []
    let printCount = +(formdata.printCount || formdata.PrintCount || formdata.printcount || formdata.Printcount || 1)
    if (isNaN(printCount) || printCount < 1) {
      printCount = 1
    }
    new Promise(resolve => {
      if (btn.intertype === 'system') { // 使用系统时,直接从表格或表单中选取数据
        let printcell = {}
        printcell.printType = formdata.printType || formdata.PrintType || formdata.printtype || formdata.Printtype || ''
        printcell.printCount = printCount
        printcell.templateID = btn.verify.Template || ''
      if (btn.intertype === 'system' && btn.verify.dataType !== 'custom') { // 使用系统时,直接从表格或表单中选取数据
        if (btn.Ot === 'notRequired') {
          let printcell = {}
          printcell.printType = formdata.printtype || ''
          printcell.printCount = +(formdata.printcount || 1)
          printcell.templateID = formdata.templateid || btn.verify.Template || ''
          printcell.data = [formdata]
          if (isNaN(printcell.printCount) || printcell.printCount < 1) {
            printcell.printCount = 1
          }
          templates.push(printcell.templateID)
          printlist.push(printcell)
        } else {
          printcell.data = data.map(cell => {
            return {...cell, ...formdata}
          data.forEach(cell => {
            let _cell = {}
            Object.keys(cell).forEach(key => {
              let _key = key.toLowerCase()
              _cell[_key] = cell[key]
            })
            _cell = {..._cell, ...formdata}
            let printcell = {data: [_cell]}
            printcell.printType = _cell.printtype || ''
            printcell.printCount = +(_cell.printcount || 1)
            printcell.templateID = _cell.templateid || btn.verify.Template || ''
            if (isNaN(printcell.printCount) || printcell.printCount < 1) {
              printcell.printCount = 1
            }
            templates.push(printcell.templateID)
            printlist.push(printcell)
          })
        }
        templates.push(printcell.templateID)
        printlist.push(printcell)
        resolve(true)
        if (btn.verify.printMode === 'custom') {
          this.execCustomPrint(printlist, formdata)
          resolve(false)
        } else {
          resolve(true)
        }
      } else {
        this.getprintdata(btn, data, formdata, formlist).then(result => {
          if (result.next) {
            result.list.forEach(cell => {
              // 系统打印数据,校验data字段
              if (btn.verify.printMode !== 'custom' && (!cell.data || cell.data.length === 0)) return
              cell.templateID = cell.templateID || cell.TemplateID || cell.Templateid || cell.templateid || btn.verify.Template
              cell.printType = cell.printType || cell.PrintType || cell.printtype || cell.Printtype || formdata.printType || formdata.PrintType || formdata.printtype || formdata.Printtype || ''
              let _printCount = +(cell.printCount || cell.PrintCount || cell.printcount || cell.Printcount || 0)
              if (isNaN(_printCount) || _printCount < 1) {
                _printCount = printCount
              }
              cell.printCount = _printCount
              templates.push(cell.templateID)
              printlist.push(cell)
            })
          if (!result.next) {
            resolve(false)
            return
          }
          // 自定义打印
          if (btn.verify.printMode === 'custom') {
            this.execCustomPrint(result.list, formdata)
            resolve(false)
            return
          }
          result.list.forEach(cell => {
            // 系统打印数据,校验data字段
            if (!cell.data || cell.data.length === 0) return
            cell.data.forEach(item => {
              let _item = {...formdata}
              _item.printtype = cell.printtype || ''
              _item.printcount = cell.printcount || 1
              _item.templateid = cell.templateid || ''
              Object.keys(item).forEach(key => {
                let _key = key.toLowerCase()
                _item[_key] = item[key]
              })
              let printcell = {data: [_item]}
              printcell.printType = _item.printtype || ''
              printcell.printCount = +(_item.printcount || 1)
              printcell.templateID = _item.templateid || btn.verify.Template || ''
              if (isNaN(printcell.printCount) || printcell.printCount < 1) {
                printcell.printCount = 1
              }
              templates.push(printcell.templateID)
              printlist.push(printcell)
            })
          })
          
          resolve(result.next)
          resolve(true)
        })
      }
    }).then(res => {
      // 获取打印模板 getTemp
      if (!res) return false
      if (btn.verify.printMode === 'custom') {
        this.execCustomPrint(printlist, formdata)
        return false
      }
      templates = Array.from(new Set(templates)) // 去重
@@ -336,7 +380,7 @@
            param.rduri = window.GLOB.mainSystemApi
          }
    
          Api.getLocalConfig(param).then(result => {
          Api.getSystemCacheConfig(param).then(result => {
            result.tempId = tempId
            resolve(result)
          })
@@ -399,13 +443,116 @@
              })
            }
            this.execPrint(printlist, _temps, formdata)
            this.execPrint(printlist, _temps)
          }, 500)
        } else {
          this.execPrint(printlist, _temps, formdata)
          this.execPrint(printlist, _temps)
        }
      } else {
        this.execError(errorMsg)
      }
    })
  }
  /**
   * @description 触发RFID打印
   */
  triggerRFIDPrint = (data, formlist) => {
    const { btn } = this.props
    let formdata = {}
    let list = []
    formlist.forEach(_data => {
      formdata[_data.key] = _data.value
    })
    new Promise(resolve => {
      if (btn.intertype === 'system' && btn.verify.dataType !== 'custom') { // 使用系统时,直接从表格或表单中选取数据
        if (btn.Ot === 'notRequired') {
          if (formlist.length > 0) {
            list = [formdata]
          }
        } else {
          data.forEach(cell => {
            let _cell = {...cell, ...formdata}
            list.push(_cell)
          })
        }
        resolve(true)
      } else {
        this.getprintdata(btn, data, formdata, formlist).then(result => {
          if (result.next) {
            result.list.forEach(cell => {
              // 系统打印数据,校验data字段
              if (!cell.data || cell.data.length === 0) return
              cell.data.forEach(m => {
                let _cell = {...m, ...formdata}
                list.push(_cell)
              })
            })
          }
          resolve(result.next)
        })
      }
    }).then(res => {
      // 获取打印模板 getTemp
      if (!res) return false
      if (list.length === 0) {
        notification.warning({
          top: 92,
          message: '未获取到打印数据!',
          duration: 5
        })
        return false
      }
      let param = {
        func: 's_PrintTemplateMGetData',
        Type: 'Y',
        // ID: tempId, // 添加模板时,保存及查询使用模板参数
        PrintTempNO: btn.verify.Template
      }
      if (window.GLOB.mainSystemApi) { // 从单点登录服务器取打印配置信息
        param.rduri = window.GLOB.mainSystemApi
      }
      return Api.getSystemCacheConfig(param)
    }).then(result => {
      if (!result) {
        this.setState({ loading: false })
        return
      }
      if (!result.ConfigParam) {
        notification.warning({
          top: 92,
          message: '未获取到打印模板信息!',
          duration: 5
        })
        this.setState({ loading: false })
      } else {
        let configParam = ''
        try {
          configParam = JSON.parse(window.decodeURIComponent(window.atob(result.ConfigParam)))
        } catch (e) {
          configParam = ''
        }
        if (!configParam) {
          notification.warning({
            top: 92,
            message: '打印模板解析错误!',
            duration: 5
          })
          this.setState({ loading: false })
        } else {
          this.execRfidPrint(list, configParam)
        }
      }
    })
  }
@@ -641,65 +788,124 @@
   * @description 获取打印数据
   */
  getprintdata = (btn, data, formdata, formlist) => {
    const { setting } = this.props
    const { setting, BID } = this.props
    let _list = []
    return new Promise(resolve => {
      let params = []
      let param = {}
      if (this.props.BID) {
        param.BID = this.props.BID
      }
      if (btn.Ot === 'notRequired') {
        let _param = { ...param, ...formdata }
        params.push(_param)
      } else if (btn.Ot === 'requiredSgl') {
        if (setting.primaryKey) {
          param[setting.primaryKey] = data[0][setting.primaryKey]
        }
        let _param = { ...param, ...formdata }
        params.push(_param)
      } else if (btn.Ot === 'requiredOnce') {
        if (setting.primaryKey) {
          let ids = data.map(d => { return d[setting.primaryKey]})
          ids = ids.filter(Boolean)
          ids = ids.join(',')
      if (btn.intertype === 'system' && btn.verify.dataType === 'custom') {
        if (btn.Ot === 'notRequired') {
          let _param = this.getDefaultSql(formlist, null, '')
  
          param[setting.primaryKey] = ids
        }
        let _param = { ...param, ...formdata }
        params.push(_param)
      } else if (btn.Ot === 'required') {
        params = data.map((cell, index) => {
          let _param = { ...param }
          params.push(_param)
        } else if (btn.Ot === 'requiredSgl') {
          let ID = ''
          if (setting.primaryKey) {
            _param[setting.primaryKey] = cell[setting.primaryKey]
            ID = data[0][setting.primaryKey] || ''
          }
          formlist.forEach(_data => {
            if (index !== 0 && _data.readin && cell.hasOwnProperty(_data.key)) {
              _param[_data.key] = cell[_data.key]
            } else {
              _param[_data.key] = _data.value
          let _param = this.getDefaultSql(formlist, data[0], ID)
          params.push(_param)
        } else if (btn.Ot === 'requiredOnce') {
          let ID = ''
          if (setting.primaryKey) {
            let ids = data.map(d => { return d[setting.primaryKey]})
            ids = ids.filter(Boolean)
            ID = ids.join(',')
          }
          let _param = this.getDefaultSql(formlist, data[0], ID)
          params.push(_param)
        } else if (btn.Ot === 'required') {
          params = data.map(cell => {
            let ID = ''
            if (setting.primaryKey) {
              ID = cell[setting.primaryKey] || ''
            }
            return this.getDefaultSql(formlist, cell, ID)
          })
          return _param
        })
        }
      } else {
        if (btn.Ot === 'notRequired') {
          let _param = { ...formdata }
          if (BID) {
            _param.BID = BID
          }
          params.push(_param)
        } else if (btn.Ot === 'requiredSgl') {
          let _param = { ...formdata }
          if (setting.primaryKey) {
            _param[setting.primaryKey] = data[0][setting.primaryKey]
          }
          if (BID) {
            _param.BID = BID
          }
          params.push(_param)
        } else if (btn.Ot === 'requiredOnce') {
          let _param = { ...formdata }
          if (setting.primaryKey) {
            let ids = data.map(d => { return d[setting.primaryKey]})
            ids = ids.filter(Boolean)
            ids = ids.join(',')
            _param[setting.primaryKey] = ids
          }
          if (BID) {
            _param.BID = BID
          }
          params.push(_param)
        } else if (btn.Ot === 'required') {
          params = data.map((cell, index) => {
            let _param = {}
            if (setting.primaryKey) {
              _param[setting.primaryKey] = cell[setting.primaryKey]
            }
            if (BID) {
              _param.BID = BID
            }
            let _cell = {}
            if (index !== 0) {
              Object.keys(cell).forEach(key => {
                _cell[key.toLowerCase()] = cell[key]
              })
            }
            formlist.forEach(_data => {
              if (index !== 0 && _data.readin && _cell.hasOwnProperty(_data.key.toLowerCase())) {
                _param[_data.key] = _cell[_data.key.toLowerCase()]
              } else {
                _param[_data.key] = _data.value
              }
            })
            return _param
          })
        }
      }
      if (btn.intertype === 'inner') {
        params = params.map(_param => {
          _param.func = btn.innerFunc
          return _param
        })
      if (btn.intertype === 'inner' || btn.intertype === 'system') {
        if (btn.intertype === 'inner') {
          params = params.map(_param => {
            _param.func = btn.innerFunc
            return _param
          })
        }
        if (params.length <= 20) {
          let deffers = params.map(par => {
@@ -717,7 +923,16 @@
              }
            })
            if (!errorMsg) {
              resolve({next: true, list: result})
              resolve({next: true, list: result.map(res => {
                Object.keys(res).forEach(key => {
                  let _key = key.toLowerCase()
                  if (['templateid', 'printtype', 'printcount'].includes(_key)) {
                    res[_key] = res[key]
                  }
                })
                return res
              })})
            } else {
              this.execError(errorMsg)
              resolve({next: false, list: []})
@@ -730,6 +945,233 @@
        this.printOuterLoopRequest(params, btn, _list, resolve)
      }
    })
  }
  /**
   * @description 获取默认存储过程请求参数
   */
  getDefaultSql = (formlist, data, ID) => {
    const { BID, btn, columns } = this.props
    let arrFields = btn.verify.columns.map(col => col.field).join(',')
    let param = {
      func: 'sPC_Get_TableData',
      obj_name: 'data',
      exec_type: 'y',
      arr_field: arrFields,
      default_sql: btn.verify.setting.defaultSql
    }
    if (BID) {
      param.BID = BID
    }
    if (ID) {
      param.ID = ID
    }
    let userName = sessionStorage.getItem('User_Name') || ''
    let fullName = sessionStorage.getItem('Full_Name') || ''
    let RoleID = sessionStorage.getItem('role_id') || ''
    let departmentcode = sessionStorage.getItem('departmentcode') || ''
    let organization = sessionStorage.getItem('organization') || ''
    let mk_user_type = sessionStorage.getItem('mk_user_type') || ''
    let nation = sessionStorage.getItem('nation') || ''
    let province = sessionStorage.getItem('province') || ''
    let city = sessionStorage.getItem('city') || ''
    let district = sessionStorage.getItem('district') || ''
    let address = sessionStorage.getItem('address') || ''
    let _dataresource = btn.verify.setting.dataresource
    let _customScript = ''
    btn.verify.scripts && btn.verify.scripts.forEach(script => {
      if (script.status !== 'false') {
        _customScript += `
        ${script.sql}
        `
      }
    })
    if (btn.verify.setting.defaultSql === 'false') {
      _dataresource = ''
    }
    if (/\s/.test(_dataresource)) {
      _dataresource = '(' + _dataresource + ') tb'
    }
    if (sessionStorage.getItem('dataM') === 'true') { // 数据权限
      _dataresource = _dataresource.replace(/\$@/ig, '/*').replace(/@datam@/ig, '\'Y\'')
      _dataresource = _dataresource.replace(/@\$/ig, '*/')
      _customScript = _customScript.replace(/\$@/ig, '/*').replace(/@datam@/ig, '\'Y\'')
      _customScript = _customScript.replace(/@\$/ig, '*/')
    } else {
      _dataresource = _dataresource.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
      _customScript = _customScript.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
    }
    let initsql = `declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000),@UserName nvarchar(50),@FullName nvarchar(50),@RoleID nvarchar(512),@mk_departmentcode nvarchar(512),@mk_organization nvarchar(512),@mk_user_type nvarchar(20),@mk_nation nvarchar(50),@mk_province nvarchar(50),@mk_city nvarchar(50),@mk_district nvarchar(50),@mk_address nvarchar(100)
      Select @ErrorCode='',@retmsg ='',@UserName='${userName}', @FullName='${fullName}', @RoleID='${RoleID}', @mk_departmentcode='${departmentcode}', @mk_organization='${organization}', @mk_user_type='${mk_user_type}', @mk_nation='${nation}', @mk_province='${province}', @mk_city='${city}', @mk_district='${district}', @mk_address='${address}'
    `
    let _vars = []
    let _initvars = []
    let _declare = []
    // 获取字段键值对
    formlist.forEach(form => {
      let _key = form.key.toLowerCase()
      if (_vars.includes(_key)) return
      _vars.push(_key)
      if (form.type === 'number' || form.type === 'rate') {
        let val = form.value
        if (isNaN(val)) {
          val = 0
        }
        _initvars.push(`@${_key}=${val}`)
      } else if (['date', 'datemonth'].includes(form.type)) {
        _initvars.push(`@${_key}='${form.value || '1949-10-01'}'`)
      } else {
        _initvars.push(`@${_key}='${form.value}'`)
      }
      if (form.fieldlen && form.fieldlen > 2048) {
        form.fieldlen = 'max'
      }
      let _type = `nvarchar(${form.fieldlen})`
      if (form.type.match(/date/ig)) {
        _type = 'datetime'
      } else if (form.type === 'number') {
        _type = `decimal(18,${form.fieldlen})`
      } else if (form.type === 'rate') {
        _type = `decimal(18,2)`
      }
      _declare.push(`@${_key} ${_type}`)
    })
    if (_declare.length > 0) {
      initsql += `/* 表单变量 */
        Declare ${_declare.join(',')}
        select ${_initvars.join(',')}
      `
      _declare = []
      _initvars = []
    }
    if (data && columns && columns.length > 0) {
      let datavars = {}
      Object.keys(data).forEach(key => {
        datavars[key.toLowerCase()] = data[key]
      })
      columns.forEach(col => {
        if (!col.field || !col.datatype) return
        let _key = col.field.toLowerCase()
        if (_vars.includes(_key)) return
        let _val = datavars.hasOwnProperty(_key) ? datavars[_key] : ''
        if (/^date/ig.test(col.datatype) && !_val) {
          _val = '1949-10-01'
        }
        _initvars.push(`@${_key}='${_val}'`)
        _declare.push(`@${_key} ${col.datatype}`)
      })
    }
    if (_declare.length > 0) {
      initsql += `/* 显示列变量 */
        Declare ${_declare.join(',')}
        select ${_initvars.join(',')}
      `
    }
    if (_customScript) {
      _customScript = `${initsql}
        ${_customScript}
      `
    }
    _dataresource = _dataresource.replace(/@select\$|\$select@/ig, '')
    _customScript = _customScript.replace(/@select\$|\$select@/ig, '')
    _dataresource = _dataresource.replace(/\$sum@/ig, '/*')
    _dataresource = _dataresource.replace(/@sum\$/ig, '*/')
    _customScript = _customScript.replace(/\$sum@/ig, '/*')
    _customScript = _customScript.replace(/@sum\$/ig, '*/')
    _dataresource = _dataresource.replace(/@ID@/ig, `'${ID}'`)
    _customScript = _customScript.replace(/@ID@/ig, `'${ID}'`)
    _dataresource = _dataresource.replace(/@BID@/ig, `'${BID || ''}'`)
    _customScript = _customScript.replace(/@BID@/ig, `'${BID || ''}'`)
    _dataresource = _dataresource.replace(/@LoginUID@/ig, `'${sessionStorage.getItem('LoginUID') || ''}'`)
    _customScript = _customScript.replace(/@LoginUID@/ig, `'${sessionStorage.getItem('LoginUID') || ''}'`)
    _dataresource = _dataresource.replace(/@SessionUid@/ig, `'${localStorage.getItem('SessionUid') || ''}'`)
    _customScript = _customScript.replace(/@SessionUid@/ig, `'${localStorage.getItem('SessionUid') || ''}'`)
    _dataresource = _dataresource.replace(/@UserID@/ig, `'${sessionStorage.getItem('UserID') || ''}'`)
    _customScript = _customScript.replace(/@UserID@/ig, `'${sessionStorage.getItem('UserID') || ''}'`)
    _dataresource = _dataresource.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
    _customScript = _customScript.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
    let LText = ''
    if (_dataresource) {
      LText = `/*system_query*/select ${arrFields} from (select ${arrFields} ,ROW_NUMBER() over(order by ${btn.verify.setting.order}) as rows from ${_dataresource}) tmptable order by tmptable.rows `
    }
    if (_customScript) {
      if (LText) {
        LText = `${LText}
          aaa:
          if @ErrorCode!=''
            insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,@UserID@
        `
      } else {
        _customScript = `${_customScript}
          aaa:
          if @ErrorCode!=''
            insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,@UserID@
        `
      }
    } else {
      LText = `${initsql}
        ${LText}
      `
    }
    // 测试系统打印查询语句
    if (window.GLOB.debugger === true || (window.debugger === true && options.sysType !== 'cloud')) {
      _customScript && console.info(`${btn.logLabel ? `/*${btn.logLabel} 自定义脚本*/\n` : ''}${LText ? '' : '/*不执行默认sql*/\n'}${_customScript}`)
      LText && console.info(`${btn.logLabel ? `/*${btn.logLabel} 数据源*/\n` : ''}` + LText.replace(/\n\s{8}/ig, '\n'))
    }
    if (btn.logLabel) {
      param.menuname = btn.logLabel
    }
    param.custom_script = Utils.formatOptions(_customScript)
    param.LText = Utils.formatOptions(LText)
    param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
    param.secretkey = Utils.encrypt('', param.timestamp)
    if (window.GLOB.probation) {
      param.s_debug_type = 'Y'
    }
    return param
  }
  /**
@@ -772,9 +1214,11 @@
      // 外部请求
      _outParam = JSON.parse(JSON.stringify(res))
      if (this.props.menuType === 'HS') {
      if (window.GLOB.mkHS) {
        if (btn.sysInterface === 'true' && options.cloudServiceApi) {
          res.rduri = options.cloudServiceApi
          res.userid = sessionStorage.getItem('CloudUserID') || ''
          res.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
        } else if (btn.sysInterface !== 'true') {
          if (window.GLOB.systemType === 'production' && btn.proInterface) {
            res.rduri = btn.proInterface
@@ -783,13 +1227,26 @@
          }
        }
      } else {
        if (btn.sysInterface === 'true' && window.GLOB.mainSystemApi) {
          res.rduri = window.GLOB.mainSystemApi
        } else if (btn.sysInterface !== 'true') {
        if (btn.sysInterface === 'true') {
          if (window.GLOB.mainSystemApi) {
            res.rduri = window.GLOB.mainSystemApi
          }
        } else if (btn.sysInterface === 'external') {
          if (window.GLOB.systemType === 'production') {
            res.$token = btn.exProInterface || ''
          } else {
            res.$token = btn.exInterface || ''
          }
        } else {
          if (window.GLOB.systemType === 'production' && btn.proInterface) {
            res.rduri = btn.proInterface
          } else {
            res.rduri = btn.interface
          }
          let host = window.GLOB.baseurl.replace(/http(s):\/\//, '')
          if (res.rduri.indexOf(host) === -1 && /\/dostars/.test(res.rduri)) {
            res.$login = true
          }
        }
      }
@@ -813,6 +1270,12 @@
        return Api.genericInterface(_callbackparam)
      } else if (response.status) {
        Object.keys(response).forEach(key => {
          let _key = key.toLowerCase()
          if (['templateid', 'printtype', 'printcount'].includes(_key)) {
            response[_key] = response[key]
          }
        })
        _list.push(response)
@@ -830,6 +1293,13 @@
      if (!response) return
      if (response.status) {
        Object.keys(response).forEach(key => {
          let _key = key.toLowerCase()
          if (['templateid', 'printtype', 'printcount'].includes(_key)) {
            response[_key] = response[key]
          }
        })
        _list.push(response)
        // 一次请求成功,进行下一项请求
@@ -853,6 +1323,12 @@
    Api.genericInterface(param).then(res => {
      if (res.status) {
        Object.keys(res).forEach(key => {
          let _key = key.toLowerCase()
          if (['templateid', 'printtype', 'printcount'].includes(_key)) {
            res[_key] = res[key]
          }
        })
        _list.push(res)
        if (params.length === 0) {
@@ -887,8 +1363,19 @@
      if (!configParam) {
        error = '打印模板解析错误!'
      } else {
        let control = configParam.elements.map(element => {
          let _field = element.field
        let control = []
        let rotate = configParam.rotate || 0
        let offsetTop = 0
        let offsetLeft = 0
        if (rotate === 90) {
          offsetTop = configParam.width - configParam.height
        } else if (rotate === 270) {
          offsetLeft = configParam.height - configParam.width
        }
        configParam.elements.forEach(element => {
          let _field = element.field || ''
          if (_field === 'other_field') {
            _field = element.cusfield || ''
@@ -898,12 +1385,13 @@
            Name: element.name || '',
            Type: element.type,
            Value: element.value || '',
            Field: _field,
            Left: element.left,
            Top: element.top,
            Field: _field.toLowerCase(),
            Left: element.left + offsetLeft,
            Top: element.top + offsetTop,
            Width: element.width,
            Height: element.height,
            Rotate: element.rotate,
            Rotate: rotate,
            // Rotate: element.rotate,
            BorderSize: element.borderSize / 10,
            BorderColor: element.borderColor,
            Align: element.align,
@@ -923,21 +1411,24 @@
            item.Trimming = ''
            if (!item.Width) {
              item.Width = item.BorderSize
              item.Left = item.Left - item.Width
              item.Left = item.Left - item.Width + 0.1
            } else if (!item.Height) {
              item.Height = item.BorderSize
              item.Top = item.Top - item.Height
              item.Top = item.Top - item.Height + 0.1
            }
            item.BackColor = element.borderColor
            item.BorderSize = 0
          } else if (item.Type === 'image') {
            item.ImageWidth = element.imgWidth
            item.ImageHeight = element.imgHeight
            item.Trimming = ''
            if (element.productValue && window.GLOB.systemType === 'production') {
              item.Value = element.productValue
              imgs.push(item.Value)
            } else if (item.Value) {
              imgs.push(item.Value)
            if (!item.Field) {
              if (element.productValue && window.GLOB.systemType === 'production') {
                item.Value = element.productValue
                imgs.push(item.Value)
              } else if (item.Value) {
                imgs.push(item.Value)
              }
            }
          } else if (item.Type === 'text') {
            item.FontFamily = element.fontFamily
@@ -967,8 +1458,14 @@
            }
          }
          return item
          control.push(item)
        })
        let down = false
        if (rotate === 90 || rotate === 270) {
          down = true
        }
        _configparam = {
          Version: '',
@@ -977,8 +1474,8 @@
          Description: configParam.remark,
          PrintTempNO: configParam.PrintTempNO,
          PageSetting: {
            Width: configParam.width,
            Height: configParam.height,
            Width: down ? configParam.height : configParam.width,
            Height: down ? configParam.width : configParam.height,
            Left: '0',
            Right: '0',
            Top: '0',
@@ -998,16 +1495,159 @@
    return {
      error: error,
      config: _configparam,
      fields: fields,
      nonEFields: nonEFields,
      fields: Array.from(new Set(fields)),
      nonEFields: Array.from(new Set(nonEFields)),
      imgs: imgs
    }
  }
  execPrint = (list, template, formdata) => {
  execRfidPrint = (list, template) => {
    const { btn } = this.props
    list = list.filter(item => !!item[btn.verify.valueField])
    if (list.length === 0) {
      notification.warning({
        top: 92,
        message: '未获取到打印数据!',
        duration: 5
      })
      this.setState({ loading: false })
      return
    }
    let width = template.width
    let height = template.height
    let gap = template.gap || 0
    let mm = 12
    if (btn.verify.DPI === '203') {
      mm = 8
    } else if (btn.verify.DPI === '600') {
      mm = 24
    }
    let items = []
    template.elements.forEach(element => {
      if (!['text', 'barcode', 'qrcode'].includes(element.type)) return
      let _field = element.field
      if (_field === 'other_field') {
        _field = element.cusfield || ''
      }
      let item = {
        type: element.type,
        value: element.value || '',
        field: _field
      }
      if (item.type === 'text') {
        let size = Math.floor(4 * mm * (element.fontSize || 12) / 12)
        let fontWeight = 400
        if (element.fontWeight === 'bold') {
          fontWeight = 600
        } else if (element.fontWeight === 'bolder') {
          fontWeight = 800
        } else if (element.fontWeight === 'lighter') {
          fontWeight = 300
        }
        item.draw = `${element.left * mm},${element.top * mm},${size},0,${element.fontFamily || '微软雅黑'},${element.align === 'center' ? 5 : 1},${fontWeight},0,0,0,`
      } else if (item.type === 'barcode') {
        let codeType = 1
        if (element.barcodeType === 'EAN13') {
          codeType = 'E30'
        }
        let narrowWidth = element.narrowWidth || 2
        let horizontal = element.narrowWidth || 2
        let vertical = Math.ceil(element.barcodeHeight * mm)
        item.draw = `${element.left * mm},${element.top * mm},0,${codeType},${narrowWidth},${horizontal},${vertical},${element.barcodeLabel === 'true' ? 'B' : 'N'},`
      } else if (item.type === 'qrcode') {
        let r = Math.ceil(element.qrcodeWidth / 2)
        item.draw = `${element.left * mm},${element.top * mm},0,0,0,${r},0,0,8,`
      }
      items.push(item)
    })
    let ip = '192.168.1.2'
    let params = list.map(cell => {
      let array = []
      let value = cell[btn.verify.valueField]
      if (btn.verify.linkType !== 'USB') {
        array.push({PTK_Connect_Timer: `${ip},${btn.verify.port},5`}); // 打开打印机网络端口
      } else {
        array.push({PTK_OpenUSBPort: btn.verify.port}); // 打开打印机USB端口
      }
      array.push({PTK_ClearBuffer: ''}); // 清空缓存
      array.push({PTK_SetDirection: 'B'}); // 设置打印方向
      array.push({PTK_SetLabelHeight: height * mm + ',' + gap * mm + ',' + 0 + ',' + false}); // 设置标签高度、间隙及偏移
      array.push({PTK_SetLabelWidth: width * mm}); // 设置标签宽度
      array.push({PTK_SetRFID: '0,0,0,0,0'}); // UHF RFID打印设置
      array.push({PTK_RWRFIDLabel: '1,0,0,4,1,' + value});
      items.forEach(m => {
        let val = ''
        if (m.field) {
          val = cell[m.field]
        } else {
          val = m.value
        }
        if (!val && val !== 0) return
        if (m.type === 'text') {
          array.push({PTK_DrawText_TrueType: m.draw + val});
        } else if (m.type === 'barcode') {
          array.push({PTK_DrawBarcode: m.draw + val});
        } else if (m.type === 'qrcode') {
          array.push({PTK_DrawBar2D_QR: m.draw + val});
        }
      })
      array.push({PTK_PrintLabel: '1,1'});
      array.push({PTK_CloseUSBPort: ''}); // 关闭USB通讯端口
      return {
        reqParam: '1',
        printparams: JSON.stringify(array)
      }
    })
    this.loopRFIDPrint(params)
  }
  loopRFIDPrint = (params) => {
    let param = params.shift()
    Api.postekPrint(param).then(res => {
      if (res.retval === '0') {
        if (params.length === 0) {
          this.execSuccess({ ErrCode: 'S', message: '', ErrMesg: '打印请求已发出。', status: true })
        } else {
          setTimeout(() => {
            this.loopRFIDPrint(params)
          }, 200)
        }
      } else {
        if (res.retval === '30021') {
          res.msg = res.msg.replace(/PTK_ClearBuffer[\s\S]*/, '')
        }
        this.execError({ErrCode: 'N', message: res.msg})
      }
    })
  }
  execPrint = (list, template) => {
    const { btn } = this.props
    let _errors = []
    let defaultPrinter = btn.verify.defaultPrinter || 'lackprinter'
    let printers = {}
    if (btn.verify.printerTypeList && btn.verify.printerTypeList.length > 0) {
@@ -1044,30 +1684,25 @@
        _datalist.forEach(res => {
          res.data.forEach(_cell => {
            for (let i = 0; i < res.printCount; i++) {
              _data.push({...formdata, ..._cell})
              _data.push(_cell)
            }
          })
        })
        let _fields = Array.from(new Set(template[key].fields))
        let _nonEFields = Array.from(new Set(template[key].nonEFields))
        let lacks = []
        let emptys = []
        _data.forEach(d => {
          _fields.forEach(f => {
          template[key].fields.forEach(f => {
            if (!d.hasOwnProperty(f)) {
              lacks.push(f)
            } else if (_nonEFields.includes(f) && !d[f] && d[f] !== 0) {
            } else if (template[key].nonEFields.includes(f) && !d[f] && d[f] !== 0) {
              emptys.push(f)
            }
          })
        })
        if (lacks.length > 0 || emptys.length > 0) {
          lacks = Array.from(new Set(lacks))
          emptys = Array.from(new Set(emptys))
          _errors.push({
            title: template[key].config.Title,
            lacks: lacks,
@@ -1108,12 +1743,21 @@
    })
    if (list.length === 0) {
      this.execError({
        ErrCode: 'N',
        message: '未获取到打印信息!',
        ErrMesg: '',
        status: false
      })
      if (btn.verify.emptyTip === 'false') {
        this.execSuccess({
          ErrCode: '-1',
          message: '未获取到打印信息!',
          ErrMesg: '',
          status: true
        })
      } else {
        this.execError({
          ErrCode: 'N',
          message: '未获取到打印信息!',
          ErrMesg: '',
          status: false
        })
      }
      return
    } else if (_errors.length > 0) {
      let lackerror = []
@@ -1146,49 +1790,29 @@
      return
    }
    // let lackItems = printerList.filter(cell => cell.task.printer === 'lackprinter')[0]
    if (!socket || socket.readyState !== 1 || socket.url !== 'ws://' + btn.verify.linkUrl) {
      socket = new WebSocket('ws://' + btn.verify.linkUrl)
    } else {
      // if (lackItems) {
      //   let request  = {
      //     requestID: '',
      //     version: '',
      //     cmd: 'getPrinters'
      //   }
      //   socket.send(JSON.stringify(request))
      // } else {
        this.syncMessageSend(printerList)
      this.syncMessageSend(printerList)
        this.execSuccess({
          ErrCode: 'S',
          message: '',
          ErrMesg: '打印请求已发出。',
          status: true
        })
      // }
      this.execSuccess({
        ErrCode: 'S',
        message: '',
        ErrMesg: '打印请求已发出。',
        status: true
      })
    }
    // 打开Socket
    socket.onopen = () =>{
      // if (lackItems) {
      //   let request  = {
      //     requestID: '',
      //     version: '',
      //     cmd: 'getPrinters'
      //   }
      //   socket.send(JSON.stringify(request))
      // } else {
        this.syncMessageSend(printerList)
      this.syncMessageSend(printerList)
        this.execSuccess({
          ErrCode: 'S',
          message: '',
          ErrMesg: '打印请求已发出。',
          status: true
        })
      // }
      this.execSuccess({
        ErrCode: 'S',
        message: '',
        ErrMesg: '打印请求已发出。',
        status: true
      })
    }
    // 监听消息
    socket.onmessage = (event) => {
@@ -1267,24 +1891,31 @@
   */
  execSuccess = (res) => {
    const { btn } = this.props
    const { autoMatic } = this.state
    const { autoMatic, btnconfig } = this.state
    if ((res && (res.ErrCode === 'S' || !res.ErrCode)) || autoMatic) { // 执行成功
    if ((res.ErrCode === 'S' || !res.ErrCode) || autoMatic) { // 执行成功
      notification.success({
        top: 92,
        message: res.ErrMesg || this.state.dict['main.action.confirm.success'],
        duration: btn.verify && btn.verify.stime ? btn.verify.stime : 2
      })
    } else if (res && res.ErrCode === 'Y') { // 执行成功
    } else if (res.ErrCode === 'Y') { // 执行成功
      Modal.success({
        title: res.ErrMesg || this.state.dict['main.action.confirm.success']
      })
    } else if (res && res.ErrCode === '-1') { // 完成后不提示
    } else if (res.ErrCode === '-1') { // 完成后不提示
    }
    if (autoMatic || !btnconfig || btnconfig.setting.finish !== 'unclose') {
      this.setState({
        visible: false
      })
    }
    this.setState({
      loading: false
      loading: false,
      confirmLoading: false
    })
    if (autoMatic) {
@@ -1329,7 +1960,8 @@
    }
    
    this.setState({
      loading: false
      loading: false,
      confirmLoading: false
    })
    if (autoMatic) {
@@ -1364,8 +1996,7 @@
      if (['select', 'link', 'multiselect', 'radio', 'checkbox', 'checkcard'].includes(cell.type) && cell.resourceType === '1') {
        let _option = Utils.getSelectQueryOptions(cell)
        cell.data_sql = Utils.formatOptions(_option.sql)
        cell.base_sql = window.btoa(window.encodeURIComponent(_option.sql))
        cell.base_sql = _option.sql
        cell.arr_field = _option.field
      }
@@ -1449,16 +2080,10 @@
   * @description 模态框(表单),确认
   */
  handleOk = () => {
    const { btnconfig, autoMatic } = this.state
    if (!this.formRef) return
    this.formRef.handleConfirm().then(res => {
      if (btnconfig.setting.finish !== 'unclose' || autoMatic) {
        this.setState({
          visible: false
        })
      }
      this.setState({ confirmLoading: true })
      this.triggerPrint(this.state.selines, res)
    })
  }
@@ -1469,15 +2094,28 @@
  handleCancel = () => {
    this.setState({
      loading: false,
      visible: false
      visible: false,
      confirmLoading: false
    })
  }
  modelconfirm = () => {
    const { BData } = this.props
    const { btnconfig, selines } = this.state
    let _this = this
    let result = []
    let _data = {}
    let BData = {}
    if (selines[0]) {
      Object.keys(selines[0]).forEach(key => {
        _data[key.toLowerCase()] = selines[0][key]
      })
    }
    if (this.props.BData) {
      Object.keys(this.props.BData).forEach(key => {
        BData[key.toLowerCase()] = this.props.BData[key]
      })
    }
    
    btnconfig.fields.forEach(item => {
      if (!item.field) return
@@ -1488,10 +2126,10 @@
        _readin = false
      }
      if (item.type === 'linkMain' && BData && BData.hasOwnProperty(item.field)) {
        _initval = BData[item.field]
      } else if (_readin && selines[0] && selines[0].hasOwnProperty(item.field)) {
        _initval = selines[0][item.field]
      if (item.type === 'linkMain' && BData.hasOwnProperty(item.field.toLowerCase())) {
        _initval = BData[item.field.toLowerCase()]
      } else if (_readin && _data.hasOwnProperty(item.field.toLowerCase())) {
        _initval = _data[item.field.toLowerCase()]
      } else if (item.type === 'date' && _initval) {
        _initval = moment().subtract(_initval, 'days').format('YYYY-MM-DD')
      } else if (item.type === 'datemonth' && _initval) {
@@ -1558,22 +2196,19 @@
   * @description 显示模态框
   */
  getModels = () => {
    const { setting, BID, btn } = this.props
    const { BID, btn } = this.props
    const { btnconfig } = this.state
    if (!this.state.visible || !btnconfig || !btnconfig.setting) return null
    let title = btnconfig.setting.title
    let title = btn.label
    let width = btnconfig.setting.width > 100 ? btnconfig.setting.width : btnconfig.setting.width + 'vw'
    let clickouter = false
    let container = document.body
    if (
      (setting.tabType === 'main' && btnconfig.setting.container === 'tab' && this.props.ContainerId) ||
      (btnconfig.setting.container === 'tab' && btn.ContainerId)
    ) {
    if (btnconfig.setting.container === 'tab' && btn.ContainerId) {
      width = btnconfig.setting.width > 100 ? btnconfig.setting.width : btnconfig.setting.width + '%'
      container = () => document.getElementById(this.props.ContainerId || btn.ContainerId)
      container = () => document.getElementById(btn.ContainerId)
    }
    if (btnconfig.setting.clickouter === 'close') {
@@ -1587,6 +2222,7 @@
        getContainer={container}
        wrapClassName='action-modal'
        visible={this.state.visible}
        confirmLoading={this.state.confirmLoading}
        width={width}
        onOk={this.handleOk}
        onCancel={this.handleCancel}
@@ -1595,7 +2231,6 @@
        <MutilForm
          BID={BID}
          dict={this.state.dict}
          menuType={this.props.menuType}
          action={btnconfig}
          inputSubmit={this.handleOk}
          data={this.state.selines[0]}
@@ -1607,63 +2242,49 @@
  }
  render() {
    const { btn, show } = this.props
    const { loadingNumber, loading, disabled, hidden } = this.state
    const { btn } = this.props
    const { loading, disabled, hidden } = this.state
    if (hidden) return null
    if (show === 'actionList') {
      return <div style={{display: 'inline-block'}} onClick={(e) => e.stopPropagation()}>
        <Button
          icon={btn.icon}
          loading={loading}
          disabled={disabled}
          className={'mk-btn mk-' + btn.class}
          onClick={() => {this.actionTrigger()}}
        >{loadingNumber ? `(${loadingNumber})` : '' + btn.label}</Button>
        {this.getModels()}
      </div>
    } else { // icon、text、 all 卡片
      let label = ''
      let icon = ''
    let label = ''
    let icon = ''
    let type = 'link'
    let className = ''
      if (show === 'button') {
        label = btn.label
        icon = btn.icon || ''
      } else if (show === 'link') {
        label = <span>{btn.label}{btn.icon ? <MkIcon style={{marginLeft: '8px'}} type={btn.icon}/> : ''}</span>
        icon = ''
      } else if (show === 'icon') {
        icon = btn.icon || ''
      // } else if (show === 'text') {
      } else {
        label = btn.label
      }
      return <div style={{display: 'inline-block'}} onClick={(e) => e.stopPropagation()}>
        <Button
          type="link"
          title={show === 'icon' ? btn.label : ''}
          loading={loading}
          disabled={disabled}
          style={btn.style}
          icon={icon}
          onClick={() => {this.actionTrigger()}}
        >{label}</Button>
        {this.getModels()}
      </div>
    if (btn.show === 'button') {
      label = btn.label
      icon = btn.icon || ''
    } else if (btn.show === 'link') {
      label = <span>{btn.label}{btn.icon ? <MkIcon style={{marginLeft: '8px'}} type={btn.icon}/> : ''}</span>
      icon = ''
    } else if (btn.show === 'icon') {
      icon = btn.icon || ''
    } else if (!btn.$toolbtn) {
      icon = btn.icon || ''
      label = btn.label
      className = 'mk-btn mk-' + btn.class
    } else {
      type = ''
      icon = btn.icon || ''
      label = btn.label
      className = 'mk-btn mk-' + btn.class
    }
    return <>
      <Button
        type={type}
        title={disabled ? (btn.reason || '') : (btn.show === 'icon' ? btn.label : '')}
        loading={loading}
        disabled={disabled}
        style={btn.style || null}
        icon={icon}
        className={className}
        onClick={(e) => {e.stopPropagation(); this.actionTrigger()}}
      >{label}</Button>
      <span onClick={(e) => {e.stopPropagation()}}>{this.getModels()}</span>
    </>
  }
}
const mapStateToProps = (state) => {
  return {
    menuType: state.editLevel
  }
}
const mapDispatchToProps = () => {
  return {}
}
export default connect(mapStateToProps, mapDispatchToProps)(PrintButton)
export default PrintButton