king
2020-02-05 74f42024805abe7850dbeeb03dae48a0d9ef0b79
src/utils/utils.js
@@ -445,26 +445,54 @@
   * @return {String} type   执行类型
   * @return {String} table  表名
   */
  static getSysDefaultSql (btn, setting, formdata, param, data) {
  static getSysDefaultSql (btn, setting, formdata, param, data, logcolumns) {
    let primaryId = param.ID
    let BID = param.BID
    let verify = btn.verify
    let _formFieldValue = {}
    if (formdata) { // 获取字段键值对
    // 需要声明的变量集
    let _vars = ['tbid', 'ErrorCode', 'retmsg', 'BillCode', 'BVoucher', 'FIBVoucherDate', 'FiYear', 'UserName', 'FullName']
    // 主键字段
    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), @UserName nvarchar(50),@FullName nvarchar(50)
      `
    // 获取字段键值对
    if (formdata) {
      formdata.forEach(form => {
        _formFieldValue[form.key] = form.value
      })
    }
    let _vars = ['tbid', 'ErrorCode', 'retmsg', 'BillCode', 'BVoucher', 'FIBVoucherDate', 'FiYear', 'UserName', 'FullName']
    // 去除禁用的验证
    if (verify) {
      if (verify.uniques) {
        verify.uniques = verify.uniques.filter(item => item.status !== 'false')
      }
      if (verify.customverifys) {
        verify.customverifys = verify.customverifys.filter(item => item.status !== 'false')
      }
      if (verify.billcodes) {
        verify.billcodes = verify.billcodes.filter(item => item.status !== 'false')
      }
      if (verify.scripts) {
        verify.scripts = verify.scripts.filter(item => item.status !== 'false')
      }
    }
    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), @UserName nvarchar(50),@FullName nvarchar(50)
      `
    if (verify && verify.scripts && verify.scripts.length > 0 && formdata) {
      let _formfields = formdata.filter(form => !_vars.includes(form.key))
    // 设置有自定义脚本时,声明变量中添加所有表单字段,并避免重复
    if (verify && verify.scripts && verify.scripts.length > 0 && formdata && formdata.length > 0) {
      let _initfields = []
      let _formfields = formdata.filter(form => {
        _initfields.push(`@${form.key}='${form.value}'`)
        return !_vars.includes(form.key)
      })
      _formfields = _formfields.map(form => {
        _vars.push(form.key)
        return `@${form.key} nvarchar(50)`
@@ -472,25 +500,33 @@
      _formfields = _formfields.join(',')
      _sql += `,${_formfields}
        `
      _initfields = _initfields.join(',')
      _sql += `select ${_initfields}
        `
    }
    _sql += `Select @BVoucher='',@FIBVoucherDate='',@FiYear=''
    // 初始化凭证字段
    _sql += `select @BVoucher='',@FIBVoucherDate='',@FiYear=''
      `
    if (verify && verify.accountdate === 'true') { // 启用账期验证
    // 启用账期验证
    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) { // 失效验证,添加数据时不用
    // 失效验证,添加数据时不用
    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}'
      _sql += `select @tbid='', @ErrorCode='',@retmsg=''
        select @tbid=${primaryKey} from ${datasource} where ${primaryKey} ='${primaryId}'
        If @tbid=''
        Begin
          select @ErrorCode='E',@retmsg='数据已失效'
@@ -498,24 +534,26 @@
        end
        `
    }
    if (formdata && verify && verify.uniques.length > 0) { // 唯一性验证,必须存在表单(表单存在时,主键均为单值),必须填写数据源
    // 唯一性验证,必须存在表单(表单存在时,主键均为单值),必须填写数据源
    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(',')
        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}'
        _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(', ')} 已存在'
@@ -525,7 +563,8 @@
      })
    }
    
    if (verify && verify.customverifys.length > 0) { // 自定义验证
    // 自定义验证,使用列表及表单数据(表单优先),替换所有@相同字段、@ID、@BID
    if (verify && verify.customverifys.length > 0) {
      let _primaryId = primaryId
      if (btn.sqlType === 'insert') {
        _primaryId = ''
@@ -551,8 +590,8 @@
        let bidreg = new RegExp('@BID', 'ig')
        _cuSql = _cuSql.replace(bidreg, `'${BID}'`)
        _sql += `Select @tbid='', @ErrorCode='',@retmsg=''
          Select top 1 @tbid='X' from (${_cuSql}) a
        _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}'
@@ -562,7 +601,8 @@
      })
    }
    if (verify && verify.billcodes.length > 0) { // 单号生成
    // 单号生成,使用上级id(BID)或列表数据,声明变量(检验)
    if (verify && verify.billcodes.length > 0) {
      verify.billcodes.forEach(item => {
        let _ModularDetailCode = ''
        if (item.TypeCharOne === 'Lp' || item.TypeCharOne === 'BN') {
@@ -602,7 +642,8 @@
    let _updateconfig = ''
    if (verify && verify.voucher && verify.voucher.enabled && data) { // 凭证-显示列中选取,必须选行
    // 凭证-显示列中选取,必须选行
    if (verify && verify.voucher && verify.voucher.enabled && data) {
      let _voucher = verify.voucher
      _updateconfig = ',BVoucher=@BVoucher,FIBVoucherDate=@FIBVoucherDate,FiYear=@FiYear'
@@ -623,9 +664,11 @@
        `
    }
    // 用于取用户信息
    let _user = `select @UserName=UserName,@FullName=FullName from SUsers where UID=@UserID
      `
    // 添加、修改、逻辑删除、物理删除
    if (btn.OpenType === 'pop' && btn.sqlType === 'insert') {
      let keys = []
      let values = []
@@ -662,10 +705,17 @@
    } else if ((btn.OpenType === 'prompt' || btn.OpenType === 'exec') && btn.sqlType === 'LogicDelete') { // 逻辑删除
      _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') {      // 物理删除
      let _msg = ''
      if (data && logcolumns && logcolumns.length > 0) {
        logcolumns.forEach(col => {
          _msg += col.label + '=' + data[col.field] + ','
        })
      }
      _sql += _user
      _sql += `insert into snote (remark,createuserid) select '删除表:${btn.sql} 数据: ${primaryKey}='+@${primaryKey},@userid,@username,@fullname delete ${btn.sql} where ${primaryKey}=@${primaryKey};`
      _sql += `insert into snote (remark,createuserid,CreateUser,CreateStaff) select '删除表:${btn.sql} 数据: ${_msg}${primaryKey}='+@${primaryKey},@userid,@username,@fullname delete ${btn.sql} where ${primaryKey}=@${primaryKey};`
    }
    // 拼接自定义脚本
    if (verify && verify.scripts && verify.scripts.length > 0) {
      let _scripts = ''
      verify.scripts.forEach(item => {