king
2020-01-14 7ea1c5f53702951fc4df60e969fc67ef5d7af4dd
src/utils/utils.js
@@ -42,7 +42,11 @@
   */
  static encrypt (str, timestamp) {
    let salt = 'mingke' // 盐值
    return md5(str + salt + timestamp)
    let _str = str + salt + timestamp
    if (_str.length > 8000) {
      _str = _str.slice(_str.length - 8000)
    }
    return md5(_str)
  }
  /**
@@ -213,8 +217,18 @@
        item.value = item.value ? [moment().subtract(item.value * 7, 'days').startOf('week').format('YYYY-MM-DD'),
          moment().subtract(item.value * 7, 'days').endOf('week').format('YYYY-MM-DD')] : ''
      } else if (item.type === 'daterange') {
        item.value = item.value ? [moment().subtract(item.value, 'days').format('YYYY-MM-DD'),
          moment().subtract(item.value === 1 ? 1 : 0, 'days').format('YYYY-MM-DD')] : ''
        let _val = item.value
        if (_val) {
          try {
            _val = JSON.parse(_val)
          } catch {
            _val = ''
          }
        }
        item.value = _val ? [moment().subtract(_val[0], 'days').format('YYYY-MM-DD'),
          moment().subtract(_val[1], 'days').format('YYYY-MM-DD')] : ''
      } else if (item.type === 'multiselect') {
        item.value = item.value ? item.value.split(',').filter(Boolean) : []
      }
      newsearches.push(item)
    })
@@ -234,17 +248,21 @@
    searches.forEach(item => {
      if (item.type === 'date') {
        let timetail = ''
        let _val = item.value
        if (item.match === '<' || item.match === '<=') {
          timetail = ' 23:59:59.999'
          timetail = ' 00:00:00.000'
          if (_val) {
            _val = moment(_val, 'YYYY-MM-DD').add(1, 'days').format('YYYY-MM-DD')
          }
        } else if (item.match === '>' || item.match === '>=') {
          timetail = ' 00:00:00.000'
        }
        if (newsearches[item.key]) {
          newsearches[item.key + '1'] = item.value ? item.value + timetail : null
          newsearches[item.key + '1'] = _val ? _val + timetail : null
        } else {
          newsearches[item.key] = item.value ? item.value + timetail : null
          newsearches[item.key] = _val ? _val + timetail : null
        }
      } else if (item.type === 'datemonth') {
        // 月-过滤条件,从月开始至结束
@@ -253,19 +271,33 @@
        if (item.value) {
          _startval = moment(item.value, 'YYYY-MM').startOf('month').format('YYYY-MM-DD') + ' 00:00:00.000'
          _endval = moment(item.value, 'YYYY-MM').endOf('month').format('YYYY-MM-DD') + ' 23:59:59.999'
          _endval = moment(item.value, 'YYYY-MM').endOf('month').add(1, 'days').format('YYYY-MM-DD') + ' 00:00:00.000'
        }
        
        newsearches[item.key] = _startval
        newsearches[item.key + '1'] = _endval
      } else if (item.type === 'dateweek') {
        let _endval = ''
        if (item.value) {
          _endval = moment(item.value[1], 'YYYY-MM-DD').add(1, 'days').format('YYYY-MM-DD')
        }
        newsearches[item.key] = item.value ? item.value[0] + ' 00:00:00.000' : null
        newsearches[item.key + '1'] = item.value ? item.value[1] + ' 23:59:59.999' : null
        newsearches[item.key + '1'] = item.value ? _endval + ' 00:00:00.000' : null
      } else if (item.type === 'daterange') {
        let _endval = ''
        if (item.value) {
          _endval = moment(item.value[1], 'YYYY-MM-DD').add(1, 'days').format('YYYY-MM-DD')
        }
        newsearches[item.key] = item.value ? item.value[0] + ' 00:00:00.000' : null
        newsearches[item.key + '1'] = item.value ? item.value[1] + ' 23:59:59.999' : null
        newsearches[item.key + '1'] = item.value ? _endval + ' 00:00:00.000' : null
      } else if (item.type === 'text') {
        item.key.split(',').forEach(field => { // 综合搜索,所字段拼接
          newsearches[field] = item.value
        })
      } else if (item.type === 'multiselect') {
        newsearches[item.key] = item.value.join(',')
      } else {
        newsearches[item.key] = item.value
      }
@@ -284,42 +316,57 @@
    let searchText = ''
    searches.forEach(item => {
      if (!item.value) return
      // eslint-disable-next-line
      searchText += (searchText !== '' ? ' ' + 'AND' + ' ' : '')
      if (item.type === 'text' || item.type === 'select') {
        // eslint-disable-next-line
      if (!item.value || (item.type === 'multiselect' && item.value.length === 0)) return
      searchText += (searchText !== '' ? ' AND ' : '')
      if (item.type === 'text') {
        let str = item.match === '=' ? '' : '%'
        // eslint-disable-next-line
        searchText += item.key + ' ' + item.match + ' ' + '\'' + str + item.value + str + '\''
        let fields = item.key.split(',').map(field => { // 综合搜索,所字段拼接
          return field + ' ' + item.match + ' \'' + str + item.value + str + '\''
        })
        searchText += '(' + fields.join(' OR ') + ')'
      } else if (item.type === 'select') {
        let str = item.match === '=' ? '' : '%'
        searchText += item.key + ' ' + item.match + ' \'' + str + item.value + str + '\''
      } else if (item.type === 'multiselect') {
        let str = item.match === '=' ? '' : '%'
        let options = item.value.map(val => {
          return item.key + ' ' + item.match + ' \'' + str + val + str + '\''
        })
        searchText += '(' + options.join(' OR ') + ')'
      } else if (item.type === 'date') {
        let _val = item.value
        let timetail = ' 00:00:00.000'
        if (item.match === '<' || item.match === '<=') {
          timetail = ' 23:59:59.999'
        let _match = item.match
        if (item.match === '<' || item.match === '<=') { // 时间为<=时,匹配后一天的0点,匹配方式为<
          _match = '<'
          _val = moment(_val, 'YYYY-MM-DD').add(1, 'days').format('YYYY-MM-DD')
        } else if (item.match === '=') {
          timetail = ''
        }
        // eslint-disable-next-line
        searchText += '(' + item.key + ' ' + item.match + ' ' + '\'' + item.value + timetail + '\')'
      } else if (item.type === 'datemonth') {
        // 月-过滤条件,从月开始至结束
        searchText += '(' + item.key + ' ' + _match + ' \'' + _val + timetail + '\')'
      } else if (item.type === 'datemonth') { // 月-过滤条件,从月开始至结束,结束时间为月末加一天的0点,方式为<
        let _startval = moment(item.value, 'YYYY-MM').startOf('month').format('YYYY-MM-DD') + ' 00:00:00.000'
        let _endval = moment(item.value, 'YYYY-MM').endOf('month').format('YYYY-MM-DD') + ' 23:59:59.999'
        // eslint-disable-next-line
        searchText += '(' + item.key + ' ' + item.match + ' ' + '\'' + _startval + '\' AND \'' + _endval + '\')'
      } else if (item.type === 'dateweek') {
        let stimetail = ' 00:00:00.000'
        let etimetail = ' 23:59:59.999'
        // eslint-disable-next-line
        searchText += '(' + item.key + ' ' + item.match + ' ' + '\'' + item.value[0] + stimetail + '\' AND \'' + item.value[1] + etimetail + '\')'
        let _endval = moment(item.value, 'YYYY-MM').endOf('month').add(1, 'days').format('YYYY-MM-DD') + ' 00:00:00.000'
        searchText += '(' + item.key + ' >= \'' + _startval + '\' AND ' + item.key + ' < \'' + _endval + '\')'
      } else if (item.type === 'dateweek') { // 周-过滤条件
        let _startval = item.value[0] + ' 00:00:00.000'
        let _endval = moment(item.value[1], 'YYYY-MM-DD').add(1, 'days').format('YYYY-MM-DD') + ' 00:00:00.000'
        searchText += '(' + item.key + ' >= \'' + _startval + '\' AND ' + item.key + ' < \'' + _endval + '\')'
      } else if (item.type === 'daterange') {
        let stimetail = ' 00:00:00.000'
        let etimetail = ' 23:59:59.999'
        // eslint-disable-next-line
        searchText += '(' + item.key + ' ' + item.match + ' ' + '\'' + item.value[0] + stimetail + '\' AND \'' + item.value[1] + etimetail + '\')'
        let _startval = item.value[0] + ' 00:00:00.000'
        let _endval = moment(item.value[1], 'YYYY-MM-DD').add(1, 'days').format('YYYY-MM-DD') + ' 00:00:00.000'
        searchText += '(' + item.key + ' >= \'' + _startval + '\' AND ' + item.key + ' < \'' + _endval + '\')'
      } else {
        // eslint-disable-next-line
        searchText += '(' + item.key + ' ' + item.match + ' ' + '\'' + item.value + '\')'
        searchText += '(' + item.key + ' ' + item.match + ' \'' + item.value + '\')'
      }
    })
    return searchText
@@ -335,24 +382,18 @@
    let searchText = ''
    searches.forEach(item => {
      if (!item.value) return
      // eslint-disable-next-line
      searchText += (searchText !== '' ? ' ' + 'AND' + ' ' : '')
      searchText += (searchText !== '' ? ' AND ' : '')
      if (item.type === 'text') {
        let options = item.key.split(',').map(op => {
          // equal时不添加%
          // eslint-disable-next-line
          let str = item.op === 'equal' ? '' : '%'
          // eslint-disable-next-line
          return op + ' ' + item.op + ' ' + '"' + str + item.value + str + '"'
          return op + ' ' + item.op + ' \'' + str + item.value + str + '\''
        })
        // eslint-disable-next-line
        searchText += '(' + options.join(' ' + 'OR' + ' ') + ')'
        searchText += '(' + options.join(' OR ') + ')'
      } else if (item.type === 'date') {
        // eslint-disable-next-line
        searchText += '(' + item.key + ' ' + item.op + ' ' + '"' + item.value + '")'
        searchText += '(' + item.key + ' ' + item.op + ' \'' + item.value + '\')'
      } else {
        // eslint-disable-next-line
        searchText += '(' + item.key + ' ' + item.op + ' ' + '"' + item.value + '")'
        searchText += '(' + item.key + ' ' + item.op + ' \'' + item.value + '\')'
      }
    })
    return searchText
@@ -370,8 +411,40 @@
    } else {
      baseurl = 'http://qingqiumarket.cn/' + service
    }
    // if (!/Content\/images\/upload\//.test(url)) {
    //   baseurl = baseurl + 'Content/images/upload/'
    // }
    let realurl = url.match(/^http/) || url.match(/^\/\//) ? url : baseurl + url
    return realurl
  }
  /**
   * @description 获取下拉搜索查询sql
   * @return {String} item   搜索条件信息
   */
  static getSelectQuerySql (item) {
    let _datasource = item.dataSource
    let sql = ''
    if (/\s/.test(_datasource)) { // 拼接别名
      _datasource = '(' + _datasource + ') tb'
    }
    if (item.type === 'link') {
      sql = 'select ' + item.valueField + ',' + item.valueText + ',' + item.linkField + ' from ' + _datasource
    } else {
      let _linkSubField = '' // 下拉菜单关联表单
      if (item.linkSubField && item.linkSubField.length > 0) {
        _linkSubField = ',' + item.linkSubField.join(',')
      }
      sql = 'select ' + item.valueField + ',' + item.valueText + _linkSubField + ' from ' + _datasource
    }
    if (item.orderBy) {
      sql = sql + ' order by ' + item.orderBy + ' ' + item.orderType
    }
    return sql
  }
  /**
@@ -379,41 +452,196 @@
   * @return {String} type   执行类型
   * @return {String} table  表名
   */
  static getSysDefaultSql (btn, setting, formdata) {
    let _sql = ''
  static getSysDefaultSql (btn, setting, formdata, param, data) {
    let primaryId = param.ID
    let BID = param.BID
    let verify = btn.verify
    let _formFieldValue = {}
    if (formdata) { // 获取字段键值对
      formdata.forEach(form => {
        _formFieldValue[form.key] = form.value
      })
    }
    let primaryKey = setting.primaryKey || 'id' // 主键字段
    // 系统变量声明与设置初始值
    let _sql = `Declare @tbid nvarchar(50), @ErrorCode nvarchar(50),@retmsg nvarchar(4000),@BillCode nvarchar(50),@BVoucher nvarchar(50),@FIBVoucherDate nvarchar(50), @FiYear nvarchar(50)
      Select @BVoucher='',@FIBVoucherDate='',@FiYear=''
      `
    if (verify && verify.accountdate === 'true') { // 启用账期验证
      _sql += `exec s_FIBVoucherDateCheck @ErrorCode=@ErrorCode OUTPUT,@retmsg=@retmsg OUTPUT
        if @ErrorCode!=''
          GOTO aaa
        `
    }
    if (btn.sqlType !== 'insert' && verify && verify.invalid === 'true' && setting.dataresource) { // 失效验证,添加数据时不用
      let datasource = setting.dataresource
      if (/\s/.test(datasource)) { // 拼接别名
        datasource = '(' + datasource + ') tb'
      }
      _sql += `Select @tbid='', @ErrorCode='',@retmsg=''
        Select @tbid=${primaryKey} from ${datasource} where ${primaryKey} ='${primaryId}'
        If @tbid=''
        Begin
          select @ErrorCode='E',@retmsg='数据已失效'
          goto aaa
        end
        `
    }
    if (formdata && verify && verify.uniques.length > 0) { // 唯一性验证,必须存在表单(表单存在时,主键均为单值),必须填写数据源
      let _primaryId = primaryId
      if (btn.sqlType === 'insert') {
        _primaryId = ''
      }
      verify.uniques.forEach(item => {
        let _fieldValue = [] // 表单键值对field=value
        let _value = []      // 表单值,用于错误提示
        let _labels = item.fieldlabel.split(',')
        item.field.split(',').forEach((_field, index) => {
          _fieldValue.push(`${_field}='${_formFieldValue[_field]}'`)
          _value.push(`${_labels[index] || ''}:${_formFieldValue[_field] || ''}`)
        })
        _sql += `Select @tbid='', @ErrorCode='',@retmsg=''
          Select @tbid='X' from ${btn.sql} where ${_fieldValue.join(' and ')} and ${primaryKey} !='${_primaryId}'
          If @tbid!=''
          Begin
            select @ErrorCode='${item.errorCode}',@retmsg='${_value.join(', ')} 已存在'
            goto aaa
          end
          `
      })
    }
    if (verify && verify.customverifys.length > 0) { // 自定义验证
      let _primaryId = primaryId
      if (btn.sqlType === 'insert') {
        _primaryId = ''
      }
      verify.customverifys.forEach(item => {
        let _cuSql = item.sql
        if (data) {
          _formFieldValue = {...data, ..._formFieldValue}
        }
        let keys = Object.keys(_formFieldValue)
        keys = keys.sort((a, b) => {
          return b.length - a.length
        })
        keys.forEach(key => {
          let reg = new RegExp('@' + key, 'ig')
          _cuSql = _cuSql.replace(reg, `'${_formFieldValue[key]}'`)
        })
        let idreg = new RegExp('@ID', 'ig')
        _cuSql = _cuSql.replace(idreg, `'${_primaryId}'`)
        let bidreg = new RegExp('@BID', 'ig')
        _cuSql = _cuSql.replace(bidreg, `'${BID}'`)
        _sql += `Select @tbid='', @ErrorCode='',@retmsg=''
          Select top 1 @tbid='X' from (${_cuSql}) a
          If @tbid ${item.result === 'true' ? '!=' : '='}''
          Begin
            select @ErrorCode='${item.errorCode}',@retmsg='${item.errmsg}'
            goto aaa
          end
          `
      })
    }
    if (verify && verify.billcodes.length > 0) {
      verify.billcodes.forEach(item => {
        let _ModularDetailCode = ''
        if (item.TypeCharOne === 'Lp' || item.TypeCharOne === 'BN') {
          _ModularDetailCode = item.TypeCharOne + item.linkField
        } else {
          _ModularDetailCode = item.ModularDetailCode
        }
        _sql += `Declare @${item.field} nvarchar(50)
          select @BillCode='', @${item.field}=''
          exec s_get_BillCode
            @ModularDetailCode='${_ModularDetailCode}',
            @Type=${item.Type},
            @TypeCharOne='${item.TypeCharOne}',
            @TypeCharTwo ='${item.TypeCharTwo}',
            @BillCode =@BillCode output,
            @ErrorCode =@ErrorCode output,
            @retmsg=@retmsg output
          if @ErrorCode!=''
            goto aaa
          set @${item.field}=@BillCode
          `
      })
    }
    let _updateconfig = ''
    if (verify && verify.voucher && verify.voucher.enabled) { // 凭证-显示列中选取,必须选行
      let _voucher = verify.voucher
      _updateconfig = ',BVoucher=@BVoucher,FIBVoucherDate=@FIBVoucherDate,FiYear=@FiYear'
      _sql += `exec s_BVoucher_Create
          @Bill ='${data[_voucher.linkField]}',
          @BVoucherType ='${_voucher.BVoucherType}',
          @VoucherTypeOne ='${_voucher.VoucherTypeOne}',
          @VoucherTypeTwo ='${_voucher.VoucherTypeTwo}',
          @Type =${_voucher.Type},
          @BVoucher =@BVoucher OUTPUT ,
          @FIBVoucherDate =@FIBVoucherDate OUTPUT ,
          @FiYear =@FiYear OUTPUT ,
          @ErrorCode =@ErrorCode OUTPUT,
          @retmsg=@retmsg OUTPUT
        if @ErrorCode!=''
          GOTO aaa
        `
    }
    if (btn.OpenType === 'pop' && btn.sqlType === 'insert') {
      let keys = []
      let values = []
      formdata.forEach(item => {
        if (!item.readonly && item.type === 'number') {
        if (item.type === 'number') {
          keys.push(item.key)
          values.push(item.value)
        } else if (!item.readonly) {
        } else {
          keys.push(item.key)
          values.push('\'' + item.value + '\'')
        }
      })
      keys = keys.join(',')
      values = values.join(',')
      _sql = `insert into ${btn.sql} (${keys}, createuserid) select ${values},@userid`
      _sql += `declare @UserName  nvarchar(50),@FullName nvarchar(50)
        select @UserName=UserName,@FullName=FullName from SUsers where UID=@UserID
        `
      _sql += `insert into ${btn.sql} (${keys},createuserid,CreateUser,CreateStaff,BID) select ${values},@BID,@userid,@username,@fullname`
    } else if (btn.OpenType === 'pop' && btn.sqlType === 'update') {
      let _form = []
      formdata.forEach(item => {
        if (!item.readonly && item.type === 'number') {
        if (item.type === 'number') {
          _form.push(item.key + '=' + item.value)
        } else if (!item.readonly) {
        } else {
          _form.push(item.key + '=\'' + item.value + '\'')
        }
      })
      _form = _form.join(',')
      _sql = `update ${btn.sql} set ${_form},modifydate=getdate(),modifyuserid=@userid where ${setting.primaryKey}=@id`
      _sql += `update ${btn.sql} set ${_form},modifydate=getdate(),modifyuserid=@userid${_updateconfig} where ${primaryKey}=@${primaryKey}`
    } else if ((btn.OpenType === 'prompt' || btn.OpenType === 'exec') && btn.sqlType === 'LogicDelete') { // 逻辑删除
      _sql = `update ${btn.sql} set deleted=1,modifydate=getdate(),modifyuserid=@userid where ${setting.primaryKey}=@id`
    } else if ((btn.OpenType === 'prompt' || btn.OpenType === 'exec') && btn.sqlType === 'delete') {
      _sql = `insert into snote (remark,createuserid) select '删除表:${btn.sql} 数据: id='+@id,@userid delete ${btn.sql} where ${setting.primaryKey}=@id`
      _sql += `update ${btn.sql} set deleted=1,modifydate=getdate(),modifyuserid=@userid where ${primaryKey}=@${primaryKey}`
    } else if ((btn.OpenType === 'prompt' || btn.OpenType === 'exec') && btn.sqlType === 'delete') {      // 物理删除
      _sql += `insert into snote (remark,createuserid) select '删除表:${btn.sql} 数据: ${primaryKey}='+@${primaryKey},@userid delete ${btn.sql} where ${primaryKey}=@${primaryKey}`
    }
    _sql += `
      aaa:
      select @ErrorCode as ErrorCode,@retmsg as retmsg
      `
    console.log(_sql)
    return _sql
  }
@@ -433,6 +661,7 @@
    let form = ''
    let formParam = ''
    let _columns = []
    let primaryKey = config.setting.primaryKey || 'ID'
    if (config.search && config.search.length > 0) {
      let _fields = new Map()
@@ -474,11 +703,12 @@
    let Ltext = `create proc ${param.innerFunc}
    ( /*${menu.MenuName}*/
    @BID nvarchar(50)='',
    @ID nvarchar(50)='',${formParam}
    @${primaryKey} nvarchar(50)='',${formParam}
    @PageIndex nvarchar(50)='',
    @PageSize nvarchar(50)='',
    @OrderCol nvarchar(50)='',
    @OrderType nvarchar(50)='',
    @exceltype nvarchar(50)='',
    @sEPTMenuNo nvarchar(50)='${menu.MenuNo}',
    @lang nvarchar(50)='',
    @debug nvarchar(50)='',
@@ -499,7 +729,7 @@
      BEGIN TRAN
        /*具体业务操作*/
        
         /*
        /*
        select top 10 * from sProcExcep order by id desc
        
        declare @UserName  nvarchar(50),@FullName nvarchar(50)
@@ -538,14 +768,14 @@
      RAISERROR(@ErrorMessage, /*-- Message text.*/
        @ErrorSeverity, /*-- Severity.*/
        @ErrorState  /*-- State.*/
        );
      );
    END CATCH
    
    GOTO_RETURN:
      ROLLBACK TRAN
      
    END`
    console.log(Ltext)
    Ltext = Ltext.replace(/\n\s{4}/ig, 'mchr13k')
    return Ltext
@@ -555,9 +785,11 @@
   * @description 创建存储过程
   * @return {String}
   */
  static getfunc (param, btn, menu, columns) {
  static getfunc (param, btn, menu, config) {
    let form = ''
    let formParam = ''
    let columns = config.columns
    let primaryKey = config.setting.primaryKey || 'ID'
    if (param.fields && param.fields.length > 0) {
      let _fields = []
@@ -621,7 +853,7 @@
    let Ltext = `create proc ${param.funcName}
    ( /*${menu.MenuName}  ${btn.label}*/
    @BID nvarchar(50)='',
    @ID nvarchar(50)='',${formParam}
    @${primaryKey} nvarchar(50)='',${formParam}
    @sEPTMenuNo nvarchar(50)='${param.menuNo}',
    @lang nvarchar(50)='',
    @debug nvarchar(50)='',
@@ -642,7 +874,7 @@
      BEGIN TRAN
        /*具体业务操作*/
        
         /*
        /*
        select top 10 * from sProcExcep order by id desc
        
        declare @UserName  nvarchar(50),@FullName nvarchar(50)
@@ -681,7 +913,7 @@
      RAISERROR(@ErrorMessage, /*-- Message text.*/
        @ErrorSeverity, /*-- Severity.*/
        @ErrorState  /*-- State.*/
        );
      );
    END CATCH
    
    GOTO_RETURN: