king
2023-05-09 7b0dbecd1d6155d26ec67be0a47a16264c738c85
src/utils/utils-custom.js
@@ -1,3 +1,5 @@
import md5 from 'md5'
export default class MenuUtils {
  /**
   * @description 获取下级模块
@@ -394,7 +396,7 @@
   * @description 重置菜单配置,页面整体复制
   * @return {String}  components 配置信息
   */
  static resetConfig = (components, uuids = {}, clear = false) => {
  static resetConfig = (components, commonId, clear = false) => {
    return components.map(item => {
      if (item.type === 'navbar') {
        return item
@@ -404,18 +406,16 @@
        item.type = 'card'
      }
      uuids[item.uuid] = this.getuuid()
      item.uuid = uuids[item.uuid]
      item.uuid = md5(commonId + item.uuid)
      if (item.type === 'tabs') {
        item.subtabs.forEach(tab => {
          uuids[tab.uuid] = this.getuuid()
          tab.uuid = uuids[tab.uuid]
          tab.uuid = md5(commonId + tab.uuid)
          tab.components = this.resetConfig(tab.components, uuids, clear)
          tab.components = this.resetConfig(tab.components, commonId, clear)
        })
      } else if (item.type === 'group') {
        item.components = this.resetConfig(item.components, uuids, clear)
        item.components = this.resetConfig(item.components, commonId, clear)
      } else if (item.type === 'menubar') {
        item.subMenus = item.subMenus.map(cell => {
          cell.uuid = this.getuuid()
@@ -426,8 +426,20 @@
          return cell
        })
      } else if (['card', 'carousel', 'timeline'].includes(item.type)) {
        if (item.wrap.datatype === 'public' && uuids[item.wrap.publicId]) {
          item.wrap.publicId = uuids[item.wrap.publicId]
        if (item.wrap.datatype === 'public' && item.wrap.publicId) {
          item.wrap.publicId = md5(commonId + item.wrap.publicId)
        }
        if (item.wrap.autoExec) {
          item.wrap.autoExec = md5(commonId + item.wrap.autoExec)
        }
        if (item.supNodes && item.supNodes.length > 0) {
          item.supNodes = item.supNodes.map(cell => {
            cell.nodes = cell.nodes.map(n => md5(commonId + n))
            cell.componentId = cell.nodes[cell.nodes.length - 1]
            return cell
          })
        }
        
        item.subcards.forEach(card => {
@@ -444,13 +456,21 @@
            }
          }
          if (card.setting.click === 'button' && card.setting.linkbtn) {
            card.setting.linkbtn = md5(commonId + card.setting.linkbtn)
          }
          if (card.elements) {
            card.elements = card.elements.map(cell => {
              cell.uuid = this.getuuid()
              if (clear && cell.eleType === 'button' && cell.pageTemplate === 'linkpage' && cell.linkmenu) {
                cell.pageTemplate = ''
                cell.linkmenu = ''
              if (cell.eleType === 'button') {
                cell.uuid = md5(commonId + cell.uuid)
                if (clear && cell.pageTemplate === 'linkpage' && cell.linkmenu) {
                  cell.pageTemplate = ''
                  cell.linkmenu = ''
                }
                this.resetBtn(cell, commonId)
              } else {
                cell.uuid = this.getuuid()
              }
              
              return cell
@@ -458,11 +478,15 @@
          }
          if (card.backElements) {
            card.backElements = card.backElements.map(cell => {
              cell.uuid = this.getuuid()
              if (clear && cell.eleType === 'button' && cell.pageTemplate === 'linkpage' && cell.linkmenu) {
                cell.pageTemplate = ''
                cell.linkmenu = ''
              if (cell.eleType === 'button') {
                cell.uuid = md5(commonId + cell.uuid)
                if (clear && cell.pageTemplate === 'linkpage' && cell.linkmenu) {
                  cell.pageTemplate = ''
                  cell.linkmenu = ''
                }
                this.resetBtn(cell, commonId)
              } else {
                cell.uuid = this.getuuid()
              }
              return cell
@@ -470,16 +494,23 @@
          }
        })
      } else if (item.type === 'balcony') {
        if (item.wrap.datatype === 'public' && uuids[item.wrap.publicId]) {
          item.wrap.publicId = uuids[item.wrap.publicId]
        if (item.wrap.datatype === 'public' && item.wrap.publicId) {
          item.wrap.publicId = md5(commonId + item.wrap.publicId)
        }
        if (item.wrap.linkbtn) {
          item.wrap.linkbtn = md5(commonId + item.wrap.linkbtn)
        }
        if (item.elements) {
          item.elements = item.elements.map(cell => {
            cell.uuid = this.getuuid()
            if (clear && cell.eleType === 'button' && cell.pageTemplate === 'linkpage' && cell.linkmenu) {
              cell.pageTemplate = ''
              cell.linkmenu = ''
            if (cell.eleType === 'button') {
              cell.uuid = md5(commonId + cell.uuid)
              if (clear && cell.pageTemplate === 'linkpage' && cell.linkmenu) {
                cell.pageTemplate = ''
                cell.linkmenu = ''
              }
              this.resetBtn(cell, commonId)
            } else {
              cell.uuid = this.getuuid()
            }
            return cell
@@ -488,7 +519,7 @@
      } else if (item.type === 'table' && item.cols) {
        let loopCol = (col) => {
          col.subcols = col.subcols.map(c => {
            c.uuid = this.getuuid()
            c.uuid = md5(commonId + c.uuid)
  
            if (c.type === 'colspan' && c.subcols) {
              c = loopCol(c)
@@ -500,12 +531,14 @@
              })
            } else if (c.type === 'action' && c.elements) {
              c.elements = c.elements.map(cell => {
                cell.uuid = this.getuuid()
                cell.uuid = md5(commonId + cell.uuid)
                if (clear && cell.pageTemplate === 'linkpage' && cell.linkmenu) {
                  cell.pageTemplate = ''
                  cell.linkmenu = ''
                }
                this.resetBtn(cell, commonId)
                return cell
              })
@@ -515,12 +548,9 @@
  
          return col
        }
        let _uuids = {}
        item.cols = item.cols.map(col => {
          let uuid = this.getuuid()
          _uuids[col.uuid] = uuid
          col.uuid = uuid
        item.cols = item.cols.map(col => {
          col.uuid = md5(commonId + col.uuid)
  
          if (col.type === 'colspan' && col.subcols) {
            col = loopCol(col)
@@ -531,7 +561,8 @@
            })
          } else if (col.type === 'action' && col.elements) {
            col.elements = col.elements.map(cell => {
              cell.uuid = this.getuuid()
              cell.uuid = md5(commonId + cell.uuid)
              this.resetBtn(cell, commonId)
              return cell
            })
          }
@@ -540,8 +571,15 @@
        if (item.subtype === 'editable') {
          item.cols = item.cols.map(col => {
            if (col.editable === 'true' && col.enter && _uuids[col.enter]) {
              col.enter = _uuids[col.enter]
            if (col.editable === 'true' && col.enter) {
              col.enter = md5(commonId + col.enter)
            } else if (col.type === 'colspan' && col.subcols) {
              col.subcols = col.subcols.map(c => {
                if (c.editable === 'true' && c.enter) {
                  c.enter = md5(commonId + c.enter)
                }
                return c
              })
            }
            return col
          })
@@ -555,6 +593,11 @@
    
            return m
          })
          if (cell.subButton) {
            this.resetBtn(cell.subButton, commonId)
          }
          return cell
        })
      }
@@ -563,18 +606,16 @@
        item.btnlog = null
      }
  
      let oriUids = {}
      if (item.action) {
        item.action = item.action.map(cell => {
          let _uuid = this.getuuid()
          oriUids[cell.uuid] = _uuid
          cell.uuid = _uuid
          cell.uuid = md5(commonId + cell.uuid)
          if (clear && cell.pageTemplate === 'linkpage' && cell.linkmenu) {
            cell.pageTemplate = ''
            cell.linkmenu = ''
          }
          this.resetBtn(cell, commonId)
          return cell
        })
@@ -613,27 +654,43 @@
      }
      if (item.setting && item.setting.supModule && item.setting.supModule[0] !== 'empty') {
        let em = false
        item.setting.supModule = item.setting.supModule.map(c => {
          if (!uuids[c]) {
            em = true
          }
          return uuids[c] || ''
          return md5(commonId + c)
        })
        if (em) {
          item.setting.supModule = ''
        }
        if (item.wrap && item.wrap.supModule) {
          item.wrap.supModule = item.setting.supModule
        }
      }
      if (item.wrap && item.wrap.doubleClick) {
        item.wrap.doubleClick = oriUids[item.wrap.doubleClick] || ''
        item.wrap.doubleClick = md5(commonId + item.wrap.doubleClick)
      }
  
      return item
    })
  }
  /**
   * @description 按钮重置
   */
  static resetBtn (btn, commonId) {
    if (btn.OpenType === 'pop' || (btn.OpenType === 'funcbutton' && btn.execMode === 'pop')) {
      if (btn.modal && btn.modal.fields.length > 0) {
        btn.modal.fields = btn.modal.fields.map(m => {
          m.uuid = this.getuuid()
          return m
        })
      }
    }
    if (btn.switchTab && btn.switchTab.length > 0) {
      btn.switchTab = btn.switchTab.map(m => md5(commonId + m))
    }
    if (btn.anchors && btn.anchors.length > 0) {
      btn.anchors = btn.anchors.map(m => md5(commonId + m))
    }
    if (btn.syncComponent && btn.syncComponent.length > 0) {
      btn.syncComponent = btn.syncComponent.map(m => md5(commonId + m))
    }
  }
  /**
@@ -652,7 +709,7 @@
  * @description 重置组件配置
  * @return {String}  item 组件信息
  */
  static resetComponentConfig = (item, uuids = {}) => {
  static resetComponentConfig = (item, appType) => {
    if (item.type === 'navbar') {
      return item
    }
@@ -661,11 +718,8 @@
      item.type = 'card'
    }
    let _uuid = this.getuuid()
    uuids[item.uuid] = _uuid
    item.uuid = _uuid
    item.uuid = this.getuuid()
    let commonId = this.getuuid()
    // 重置组件名称
    let sign = this.getSignName()
@@ -686,14 +740,46 @@
        return cell
      })
    } else if (['card', 'carousel', 'timeline'].includes(item.type)) {
      if (item.wrap.autoExec) {
        item.wrap.autoExec = md5(commonId + item.wrap.autoExec)
      }
      if (appType !== 'mob') {
        if (item.wrap.pagestyle === 'slide') {
          item.wrap.pagestyle = 'page'
        }
      } else {
        if (item.wrap.pagestyle === 'switch') {
          item.wrap.pagestyle = 'page'
        }
      }
      item.subcards.forEach(card => {
        card.uuid = this.getuuid()
        if (card.setting.click === 'button' && card.setting.linkbtn) {
          card.setting.linkbtn = md5(commonId + card.setting.linkbtn)
        }
        if (card.elements) {
          if (sessionStorage.getItem('editMenuType') === 'popview') {
            card.elements = card.elements.filter(b => b.OpenType !== 'popview' && b.OpenType !== 'funcbutton')
          }
          card.elements = card.elements.map(cell => {
            cell.uuid = this.getuuid()
            if (cell.eleType === 'button') {
              cell.uuid = md5(commonId + cell.uuid)
              if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
                if (cell.modal && cell.modal.fields.length > 0) {
                  cell.modal.fields = cell.modal.fields.map(m => {
                    m.uuid = this.getuuid()
                    return m
                  })
                }
              }
            } else {
              cell.uuid = this.getuuid()
            }
            return cell
          })
        }
@@ -702,7 +788,19 @@
            card.elements = card.elements.filter(b => b.OpenType !== 'popview' && b.OpenType !== 'funcbutton')
          }
          card.backElements = card.backElements.map(cell => {
            cell.uuid = this.getuuid()
            if (cell.eleType === 'button') {
              cell.uuid = md5(commonId + cell.uuid)
              if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
                if (cell.modal && cell.modal.fields.length > 0) {
                  cell.modal.fields = cell.modal.fields.map(m => {
                    m.uuid = this.getuuid()
                    return m
                  })
                }
              }
            } else {
              cell.uuid = this.getuuid()
            }
            return cell
          })
        }
@@ -712,8 +810,23 @@
        if (sessionStorage.getItem('editMenuType') === 'popview') {
          item.elements = item.elements.filter(b => b.OpenType !== 'popview' && b.OpenType !== 'funcbutton')
        }
        if (item.wrap.linkbtn) {
          item.wrap.linkbtn = md5(commonId + item.wrap.linkbtn)
        }
        item.elements = item.elements.map(cell => {
          cell.uuid = this.getuuid()
          if (cell.eleType === 'button') {
            cell.uuid = md5(commonId + cell.uuid)
            if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
              if (cell.modal && cell.modal.fields.length > 0) {
                cell.modal.fields = cell.modal.fields.map(m => {
                  m.uuid = this.getuuid()
                  return m
                })
              }
            }
          } else {
            cell.uuid = this.getuuid()
          }
          return cell
        })
      }
@@ -736,12 +849,8 @@
        return col
      }
      let _uuids = {}
      item.cols = item.cols.map(col => {
        let uuid = this.getuuid()
        _uuids[col.uuid] = uuid
        col.uuid = uuid
        col.uuid = md5(commonId + col.uuid)
        if (col.type === 'colspan' && col.subcols) {
          col = loopCol(col)
@@ -755,7 +864,16 @@
            col.elements = col.elements.filter(c => c.OpenType !== 'popview' && c.OpenType !== 'funcbutton')
          }
          col.elements = col.elements.map(cell => {
            cell.uuid = this.getuuid()
            cell.uuid = md5(commonId + cell.uuid)
            if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
              if (cell.modal && cell.modal.fields.length > 0) {
                cell.modal.fields = cell.modal.fields.map(m => {
                  m.uuid = this.getuuid()
                  return m
                })
              }
            }
            return cell
          })
        }
@@ -764,8 +882,8 @@
      if (item.subtype === 'editable') {
        item.cols = item.cols.map(col => {
          if (col.editable === 'true' && col.enter && _uuids[col.enter]) {
            col.enter = _uuids[col.enter]
          if (col.editable === 'true' && col.enter) {
            col.enter = md5(commonId + col.enter)
          }
          return col
        })
@@ -785,17 +903,20 @@
    delete item.btnlog
    let oriUids = {}
    if (item.action) {
      if (sessionStorage.getItem('editMenuType') === 'popview') {
        item.action = item.action.filter(c => c.OpenType !== 'popview' && c.OpenType !== 'funcbutton')
      }
      item.action = item.action.map(cell => {
        let _uuid = this.getuuid()
        oriUids[cell.uuid] = _uuid
        cell.uuid = _uuid
        cell.uuid = md5(commonId + cell.uuid)
        if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
          if (cell.modal && cell.modal.fields.length > 0) {
            cell.modal.fields = cell.modal.fields.map(m => {
              m.uuid = this.getuuid()
              return m
            })
          }
        }
        return cell
      })
@@ -840,7 +961,7 @@
    }
    if (item.wrap && item.wrap.doubleClick) {
      item.wrap.doubleClick = oriUids[item.wrap.doubleClick] || ''
      item.wrap.doubleClick = md5(commonId + item.wrap.doubleClick)
    }
    return item
@@ -896,12 +1017,12 @@
export function getTables (config, pops) {
  let tables = []
  let cuts = []
  let cutreg = /(from|update|insert\s+into)\s+(@db@)?[a-z_]+/ig
  let cutreg = /(from|update|insert\s+into)\s+(@db@)?[a-z0-9_]+/ig
  let trimreg = /(from|update|insert\s+into)\s+(@db@)?/ig
  if (config.setting && (!config.wrap || !config.wrap.datatype || config.wrap.datatype === 'dynamic')) {
    if (config.setting.interType === 'system') {
      if (config.setting.execute !== 'false') {
      if (config.setting.execute !== 'false' && config.setting.dataresource) {
        let tbs = config.setting.dataresource.match(cutreg)
        tbs && cuts.push(...tbs)
      }
@@ -943,6 +1064,8 @@
        if (cell.eleType !== 'button') return
        if (['form', 'pop', 'prompt', 'exec', 'excelIn', 'excelOut'].includes(cell.OpenType)) {
          action.push(cell)
        } else if (cell.OpenType === 'funcbutton' && cell.funcType === 'print' && cell.verify) {
          action.push(cell)
        } else if (cell.OpenType === 'popview') {
          if (pops) {
            pops.push({...cell, parentId: config.uuid})
@@ -956,6 +1079,8 @@
        item.backElements.forEach(cell => {
          if (cell.eleType !== 'button') return
          if (['form', 'pop', 'prompt', 'exec', 'excelIn', 'excelOut'].includes(cell.OpenType)) {
            action.push(cell)
          } else if (cell.OpenType === 'funcbutton' && cell.funcType === 'print' && cell.verify) {
            action.push(cell)
          } else if (cell.OpenType === 'popview') {
            if (pops) {
@@ -974,6 +1099,8 @@
      col.elements.forEach(cell => {
        if (['form', 'pop', 'prompt', 'exec', 'excelIn', 'excelOut'].includes(cell.OpenType)) {
          action.push(cell)
        } else if (cell.OpenType === 'funcbutton' && cell.funcType === 'print' && cell.verify) {
          action.push(cell)
        } else if (cell.OpenType === 'popview') {
          if (pops) {
            pops.push({...cell, parentId: config.uuid})
@@ -989,6 +1116,8 @@
    if (cell.eleType !== 'button') return
    if (['form', 'pop', 'prompt', 'exec', 'excelIn', 'excelOut'].includes(cell.OpenType)) {
      action.push(cell)
    } else if (cell.OpenType === 'funcbutton' && cell.funcType === 'print' && cell.verify) {
      action.push(cell)
    } else if (cell.OpenType === 'popview') {
      if (pops) {
        pops.push({...cell, parentId: config.uuid})
@@ -1000,6 +1129,8 @@
  config.action && config.action.forEach(cell => {
    if (['pop', 'prompt', 'exec', 'excelIn', 'excelOut'].includes(cell.OpenType)) {
      action.push(cell)
    } else if (cell.OpenType === 'funcbutton' && cell.funcType === 'print' && cell.verify) {
      action.push(cell)
    } else if (cell.OpenType === 'popview') {
      if (pops) {
@@ -1021,6 +1152,19 @@
      }
      if (btn.intertype === 'system' && btn.verify.scripts) {
        btn.verify.scripts.forEach(script => {
          if (script.status === 'false') return
          let tbs = script.sql.match(cutreg)
          tbs && cuts.push(...tbs)
        })
      }
    } else if (btn.OpenType === 'funcbutton') {
      if (btn.intertype !== 'system' || !btn.verify || !btn.verify.setting) return
      if (btn.verify.dataType === 'custom') {
        if (btn.verify.setting.defaultSql !== 'false') {
          let tbs = btn.verify.setting.dataresource.match(cutreg)
          tbs && cuts.push(...tbs)
        }
        btn.verify.scripts && btn.verify.scripts.forEach(script => {
          if (script.status === 'false') return
          let tbs = script.sql.match(cutreg)
          tbs && cuts.push(...tbs)
@@ -1102,8 +1246,186 @@
  cuts = cuts.map(item => item.replace(trimreg, ''))
  tables.push(...cuts)
  tables = tables.filter(Boolean)
  tables = tables.filter(tb => tb && tb !== 'dbo' && tb.length > 1)
  tables = Array.from(new Set(tables))
  return tables
}
/**
 * @description 检测组件内容
 */
export function checkComponent (card) {
  let errors = []
  let columns = []
  if (card.$c_ds) {
    columns = card.columns.map(c => c.field)
    if (card.setting.interType === 'system' && card.setting.execute !== 'false' && !card.setting.dataresource) {
      errors.push({ level: 0, detail: '未设置数据源!'})
    } else if (card.setting.interType === 'system' && card.setting.execute === 'false' && card.scripts.filter(script => script.status !== 'false').length === 0) {
      errors.push({ level: 0, detail: '数据源中无可用脚本!'})
    } else if (!card.setting.primaryKey) {
      errors.push({ level: 0, detail: '未设置主键!'})
    } else if (!columns.includes(card.setting.primaryKey)) {
      errors.push({ level: 0, detail: '主键已失效!'})
    } else if (card.subtype === 'dualdatacard') {                     // 双重卡
      if (!card.setting.subKey) {
        errors.push({ level: 0, detail: '未设置子表主键!'})
      } else if (!card.setting.subBID) {
        errors.push({ level: 0, detail: '未设置子表BID!'})
      } else if (!card.setting.supModule) {
        errors.push({ level: 0, detail: '未设置上级组件!'})
      }
    } else if (card.type === 'card' && card.subtype === 'datacard') { // 数据卡,可能有多上级
      if (card.wrap.supType !== 'multi' && !card.setting.supModule) {
        errors.push({ level: 0, detail: '未设置上级组件!'})
      }
    } else if (card.type !== 'balcony' && !card.setting.supModule) {  // 悬浮框上级组件需单独设置
      errors.push({ level: 0, detail: '未设置上级组件!'})
    }
  } else if ((card.type === 'balcony' || card.type === 'card') && card.wrap.datatype === 'public') {
    columns = card.columns.map(c => c.field)
  }
  let doubleClick = ''
  if (card.type === 'table') {
    doubleClick = card.wrap.doubleClick || ''
  }
  if (card.$c_ac) {
    card.action.forEach(cell => {
      if (cell.hidden === 'true' || cell.origin) return
      // if (cell.OpenType === 'popview') {
      //   if (!cell.config) {
      //     errors.push({ level: 0, detail: `按钮“${cell.label}”中弹窗标签尚未设置`})
      //   } else if (!cell.config.enabled) {
      //     errors.push({ level: 0, detail: `按钮“${cell.label}”中弹窗标签未启用`})
      //   }
      // }
      if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
        if (!cell.modal || cell.modal.fields.length === 0) {
          errors.push({ level: 0, detail: `按钮“${cell.label}”中表单尚未添加`})
        }
      } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
        errors.push({ level: 0, detail: `按钮“${cell.label}”中导入列未设置!`})
      } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
        errors.push({ level: 0, detail: `按钮“${cell.label}”中导出列未设置!`})
      }
      if (doubleClick === cell.uuid) {
        doubleClick = ''
      }
    })
  }
  if (card.$c_sc) {
    card.subcards.forEach((item, i) => {
      let linkbtn = item.setting.linkbtn || ''
      item.elements.forEach(cell => {
        if (cell.eleType === 'button') {
          if (cell.hidden === 'true') return
          if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
            if (!cell.modal || cell.modal.fields.length === 0) {
              errors.push({ level: 0, detail: `按钮“${cell.label}”中表单尚未添加`})
            }
          } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
            errors.push({ level: 0, detail: `按钮“${cell.label}”中导入列未设置!`})
          } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
            errors.push({ level: 0, detail: `按钮“${cell.label}”中导出列未设置!`})
          }
          if (linkbtn && linkbtn === cell.uuid) {
            linkbtn = ''
          }
        } else if (cell.datatype === 'dynamic' && cell.field && !columns.includes(cell.field)) {
          errors.push({ level: 1, detail: `卡片中动态字段“${cell.field}”无效`})
        }
      })
      if (card.subtype === 'dualdatacard' || (item.setting.type === 'multi' && item.backElements && sessionStorage.getItem('appType') !== 'mob')) {
        item.backElements.forEach(cell => {
          if (cell.eleType === 'button') {
            if (cell.hidden === 'true') return
            if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
              if (!cell.modal || cell.modal.fields.length === 0) {
                errors.push({ level: 0, detail: `按钮“${cell.label}”中表单尚未添加`})
              }
            } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
              errors.push({ level: 0, detail: `按钮“${cell.label}”中导入列未设置!`})
            } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
              errors.push({ level: 0, detail: `按钮“${cell.label}”中导出列未设置!`})
            }
            if (linkbtn && linkbtn === cell.uuid) {
              linkbtn = ''
            }
          } else if (cell.datatype === 'dynamic' && cell.field && !columns.includes(cell.field)) {
            errors.push({ level: 1, detail: `卡片中动态字段“${cell.field}”无效`})
          }
        })
      }
      if (linkbtn) {
        errors.push({ level: 1, detail: `第${i + 1}张卡片中绑定按钮已删除`})
      }
    })
    if (card.subcards.length === 0) {
      errors.push({ level: 0, detail: '卡片不可为空!'})
    }
  }
  if (card.$c_el) {
    card.elements.forEach(cell => {
      if (cell.eleType === 'button') {
        if (cell.hidden === 'true') return
        if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
          if (!cell.modal || cell.modal.fields.length === 0) {
            errors.push({ level: 0, detail: `按钮“${cell.label}”中表单尚未添加`})
          }
        } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
          errors.push({ level: 0, detail: `按钮“${cell.label}”中导入列未设置!`})
        } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
          errors.push({ level: 0, detail: `按钮“${cell.label}”中导出列未设置!`})
        }
      } else if (cell.datatype === 'dynamic' && cell.field && !columns.includes(cell.field)) {
        errors.push({ level: 1, detail: `卡片中动态字段“${cell.field}”无效`})
      }
    })
  }
  if (card.$c_cl) {
    card.cols.forEach(col => {
      if (col.type === 'action') {
        col.elements.forEach(cell => {
          if (cell.hidden === 'true') return
          if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
            if (!cell.modal || cell.modal.fields.length === 0) {
              errors.push({ level: 0, detail: `按钮“${cell.label}”中表单尚未添加`})
            }
          } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
            errors.push({ level: 0, detail: `按钮“${cell.label}”中导入列未设置!`})
          } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
            errors.push({ level: 0, detail: `按钮“${cell.label}”中导出列未设置!`})
          }
          if (doubleClick === cell.uuid) {
            doubleClick = ''
          }
        })
      } else if (col.type === 'custom') {
        col.elements.forEach(cell => {
          if (cell.datatype === 'dynamic' && cell.field && !columns.includes(cell.field)) {
            errors.push({ level: 1, detail: `显示列“${col.label}”中动态字段“${cell.field}”无效`})
          }
        })
      } else if (col.field && !columns.includes(col.field)) {
        errors.push({ level: 1, detail: `显示列“${col.label}”中字段“${col.field}”无效`})
      }
    })
    if (doubleClick) {
      errors.push({ level: 1, detail: `绑定的双击按钮已删除`})
    }
  }
  return errors
}