king
2024-08-20 58826d6f4eab9f8c9acf9fa8696f60039c645cfe
src/utils/utils-custom.js
@@ -1,4 +1,5 @@
import md5 from 'md5'
import { fromJS } from 'immutable'
import { notification } from 'antd'
export default class MenuUtils {
@@ -558,6 +559,9 @@
          })
        }
      } else if (item.type === 'form') {
        if (item.wrap.datatype === 'public' && item.wrap.publicId) {
          item.wrap.publicId = md5(commonId + item.wrap.publicId)
        }
        item.subcards = item.subcards.map(cell => {
          cell.uuid = this.getuuid()
  
@@ -626,7 +630,7 @@
        })
      }
      if (item.setting && item.setting.supModule && item.setting.supModule[0] !== 'empty') {
      if (item.setting && item.setting.supModule && item.setting.supModule[0] !== 'empty' && item.setting.supModule[0] !== 'preview') {
        item.setting.supModule = item.setting.supModule.map(c => {
          return md5(commonId + c)
        })
@@ -700,10 +704,6 @@
  * @return {String}  item 组件信息
  */
  static resetComponentConfig = (item, appType, commonId) => {
    if (item.type === 'navbar') {
      return item
    }
    if (item.subtype === 'tablecard') { // 兼容
      item.type = 'card'
    }
@@ -721,7 +721,22 @@
      item.name = item.setting.name
    }
    if (item.type === 'menubar') {
    if (item.columns) {
      item.columns = item.columns.map(cell => {
        cell.uuid = this.getuuid()
        return cell
      })
    }
    if (item.type === 'navbar') {
      if (appType === 'mob') {
        item.menus.forEach(menu => {
          menu.MenuID = this.getuuid()
        })
        item.wrap.MenuNo = item.wrap.MenuNo + sign
      }
      return item
    } else if (item.type === 'menubar') {
      item.subMenus = item.subMenus.map(cell => {
        cell.uuid = this.getuuid()
        return cell
@@ -924,12 +939,6 @@
        return cell
      })
    }
    if (item.columns) {
      item.columns = item.columns.map(cell => {
        cell.uuid = this.getuuid()
        return cell
      })
    }
    if (item.wrap && item.wrap.doubleClick) {
      item.wrap.doubleClick = md5(commonId + item.wrap.doubleClick)
@@ -1105,6 +1114,8 @@
        value = item.initval || `${item.minValue || '-999999999'},${item.maxValue || '999999999'}`
      } else if (item.type === 'multiselect' || (item.type === 'checkcard' && item.multiple === 'true')) {
        type = 'multi'
      } else {
        value = item.initval || '0'
      }
      newsearches.push({
@@ -1794,23 +1805,31 @@
      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 === 'excelIn') {
      if (!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') {
      if (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0) {
        errors.push({ level: 0, detail: `按钮“${cell.label}”中导出列未设置!`})
      } else if (cell.intertype === 'system' && cell.verify.dataType !== 'custom' && card.$c_ds && columns.length > 0) {
        let cols = []
        cell.verify.columns.forEach(col => {
          if (col.output === 'false' || col.Column === '$Index') return
          if (!columns.includes(col.Column)) {
            cols.push(col.Column)
      } else if (cell.intertype === 'system' && cell.verify.dataType !== 'custom') {
        if (!card.setting || card.setting.interType !== 'system') {
          errors.push({ level: 0, detail: `按钮“${cell.label}”需自定义导出数据源!`})
        } else if (card.type === 'balcony' || card.subtype === 'propcard') {
          errors.push({ level: 0, detail: `按钮“${cell.label}”需自定义导出数据源!`})
        } else if (card.$c_ds && columns.length > 0) {
          let cols = []
          cell.verify.columns.forEach(col => {
            if (col.output === 'false' || col.Column === '$Index') return
            if (!columns.includes(col.Column)) {
              cols.push(col.Column)
            }
          })
          if (cols.length) {
            errors.push({ level: 0, detail: `按钮“${cell.label}”中导出列(${cols.join('、')})在字段集中不存在!`})
          }
        })
        if (cols.length) {
          errors.push({ level: 0, detail: `按钮“${cell.label}”中导出列(${cols.join('、')})在字段集中不存在!`})
        }
      }
      }
    }
    if (['pop', 'prompt', 'exec'].includes(cell.OpenType) && cell.verify && !cell.output) {
@@ -1818,6 +1837,38 @@
        errors.push({ level: 0, detail: `按钮“${cell.label}”未设置返回值短信发送无效!`})
      } else if (cell.verify.emailEnable === 'true') {
        errors.push({ level: 0, detail: `按钮“${cell.label}”未设置返回值邮件发送无效!`})
      }
    }
    if (['exec', 'prompt', 'pop', 'form', 'formSubmit'].includes(cell.OpenType)) {
      if (cell.OpenType === 'form' && cell.formType === 'count_line') return
      if (cell.intertype === 'system') {
        if (cell.Ot === 'notRequired' && cell.verify && cell.verify.voucher && cell.verify.voucher.enabled) {
          errors.push({ level: 0, detail: `按钮“${cell.label}”使用了创建凭证函数,需要选择行!`})
        }
      } else if (cell.intertype === 'custom' || cell.intertype === 'outer') {
        if (cell.callbackType === 'script' && (!cell.verify || !cell.verify.cbScripts || cell.verify.cbScripts.filter(item => item.status !== 'false').length === 0)) {
          errors.push({ level: 0, detail: `按钮“${cell.label}”使用了自定义脚本回调,回调脚本不可为空!`})
        } else if (cell.procMode === 'system' && cell.Ot === 'notRequired' && cell.verify && cell.verify.voucher && cell.verify.voucher.enabled) {
          errors.push({ level: 0, detail: `按钮“${cell.label}”使用了创建凭证函数,需要选择行!`})
        }
      }
    } else if (cell.OpenType === 'funcbutton') {
      if (cell.funcType === 'print') {
        if (!cell.verify || !cell.verify.printMode) {
          errors.push({ level: 0, detail: `按钮“${cell.label}”请完善验证信息!`})
        } else if (cell.intertype === 'system' && cell.verify.dataType === 'custom' && (!cell.verify.setting || cell.verify.columns.length === 0)) {
          errors.push({ level: 0, detail: `按钮“${cell.label}”使用了自定义打印数据,请设置数据源!`})
        }
      } else if ((cell.funcType === 'refund' || cell.funcType === 'pay') && cell.payMode === 'system' && (!cell.verify || !cell.verify.scripts || cell.verify.scripts.filter(item => item.status !== 'false').length === 0)) {
        errors.push({ level: 0, detail: `按钮“${cell.label}”需添加自定义脚本!`})
      }
    } else if (cell.OpenType === 'innerpage' || cell.OpenType === 'outerpage') {
      if (!cell.pageTemplate) {
        errors.push({ level: 0, detail: `按钮“${cell.label}”页面类型设置错误!`})
      } else if (cell.pageTemplate === 'pay' && cell.payMode === 'system' && (!cell.verify || !cell.verify.scripts || cell.verify.scripts.filter(item => item.status !== 'false').length === 0)) {
        errors.push({ level: 0, detail: `按钮“${cell.label}”需添加自定义脚本!`})
      }
    }
  }
@@ -2004,13 +2055,27 @@
      duration: 5
    })
    return false
  } else if (/\send\s+begin\s/ig.test(sql)) {
    notification.warning({
      top: 92,
      message: `end 后不可紧跟 begin。`,
      duration: 5
    })
    return false
  } else if (/\sdecimal\(8,/ig.test(sql)) {
    notification.warning({
      top: 92,
      message: `不可使用 decimal(8`,
      duration: 5
    })
    return false
  } else if (type === 'customscript' && /\son\s+[a-z0-9_]+\.[a-z0-9_]+\s*=\s*[a-z0-9_]+\.[a-z0-9_]+/ig.test(sql)) {
    let list = sql.match(/\son\s+[a-z0-9_]+\.[a-z0-9_]+\s*=\s*[a-z0-9_]+\.[a-z0-9_]+/ig)
    let errors = []
    list.forEach(str => {
      str = str.replace(/^\s/, '')
      let strs = str.match(/(\s|=)[a-z0-9_]+\./ig)
      if (strs.length === 2 && (strs[0].replace(/\s|\./g, '') === strs[1].replace(/\s|\./g, ''))) {
      if (strs.length === 2 && (strs[0].replace(/\s|\.|=/g, '') === strs[1].replace(/\s|\.|=/g, ''))) {
        errors.push(str)
      }
    })
@@ -2064,4 +2129,2154 @@
  }
  return true
}
/**
 * @description 获取语言转换信息
 */
export function getLangTrans (config) {
  let langList = sessionStorage.getItem('langList')
  let appType = sessionStorage.getItem('appType')
  if (appType === 'mob' || appType === 'pc') {
    langList = sessionStorage.getItem('applangList')
  }
  if (!langList) return
  let defLang = ''
  try {
    langList = JSON.parse(langList)
    defLang = langList[0]
  } catch (e) {
    defLang = ''
  }
  if (!defLang) return ''
  let sql = []
  let btn = []
  let ops = []
  let text = []
  let menu = []
  let filterElement = (card) => {
    if (card.datatype === 'static' && card.eleType === 'text' && !/@.+@/g.test(card.value)) {
      sql.push(card.value)
    }
    if (card.prefix) {
      sql.push(card.prefix)
    }
    if (card.postfix) {
      sql.push(card.postfix)
    }
  }
  let filterSql = (sl) => {
    if (!sl) return
    let cutreg = /[\u4E00-\u9FA5。!,、]+/ig
    let tbs = sl.match(cutreg)
    if (!tbs) return
    text.push(...tbs)
  }
  let filterBtn = (btn) => {
    if (!btn.verify) return
    btn.verify.customverifys && btn.verify.customverifys.forEach(script => {
      filterSql(script.sql)
    })
    btn.verify.scripts && btn.verify.scripts.forEach(script => {
      filterSql(script.sql)
    })
    btn.verify.cbScripts && btn.verify.cbScripts.forEach(script => {
      filterSql(script.sql)
    })
    if (btn.OpenType === 'funcbutton') {
      if (btn.intertype === 'system' && btn.verify.dataType === 'custom' && btn.verify.setting) {
        filterSql(btn.verify.setting.dataresource)
      }
    } else if (btn.OpenType === 'excelOut') {
      filterSql(btn.verify.dataresource)
    }
  }
  let filterForm = (n) => {
    sql.push(n.label)
    if (n.resourceType === '1') {
      filterSql(n.dataSource)
    } else if (n.options) {
      n.options.forEach(o => {
        ops.push(o.Text)
      })
    }
  }
  let traversal = (components) => {
    if (!components) return
    components.forEach(item => {
      if (item.type === 'tabs') {
        item.subtabs.forEach(tab => {
          sql.push(tab.label)
          traversal(tab.components)
        })
      } else if (item.type === 'group') {
        traversal(item.components)
      } else {
        if (item.setting && (!item.wrap || !item.wrap.datatype || item.wrap.datatype === 'dynamic')) {
          if (item.setting.interType === 'system') {
            filterSql(item.setting.dataresource)
            item.scripts && item.scripts.forEach(script => {
              filterSql(script.sql)
            })
          }
        }
        if (item.columns) {
          item.columns.forEach(cell => {
            sql.push(cell.label)
          })
        }
        if (item.search) {
          if (item.type === 'topbar') {
            if (item.search.fields) {
              item.search.fields.forEach(cell => {
                filterForm(cell)
              })
            }
            if (item.search.groups) {
              item.search.groups.forEach(group => {
                if (group.fields) {
                  group.fields.forEach(cell => {
                    filterForm(cell)
                  })
                }
              })
            }
          } else {
            item.search.forEach(cell => {
              filterForm(cell)
            })
          }
        }
        if (item.action) {
          item.action.forEach(cell => {
            btn.push(cell.label)
            filterBtn(cell)
            if (cell.OpenType === 'popview' && cell.config) {
              traversal(cell.config.components)
            } else if (cell.OpenType === 'pop') {
              if (cell.modal && cell.modal.fields.length) {
                cell.modal.fields.forEach(n => {
                  filterForm(n)
                })
              }
            }
          })
        }
        if (item.type === 'navbar') {
          if (item.menus) {
            item.menus.forEach(first => {
              menu.push(first.name)
              if (first.sublist) {
                first.sublist.forEach(sec => {
                  menu.push(sec.name)
                  if (sec.sublist) {
                    sec.sublist.forEach(thd => {
                      menu.push(thd.name)
                    })
                  }
                })
              }
            })
          }
        } else if (item.type === 'menubar') {
          item.subMenus.forEach(cell => {
            if (cell.setting.name) {
              menu.push(cell.setting.name)
            }
          })
        } else if (item.type === 'card' || item.type === 'carousel' || item.type === 'timeline') {
          item.subcards.forEach(card => {
            card.elements && card.elements.forEach(cell => {
              if (cell.eleType === 'button') {
                btn.push(cell.label)
                filterBtn(cell)
                if (cell.OpenType === 'popview' && cell.config) {
                  traversal(cell.config.components)
                } else if (cell.OpenType === 'pop') {
                  if (cell.modal && cell.modal.fields.length) {
                    cell.modal.fields.forEach(n => {
                      filterForm(n)
                    })
                  }
                }
              } else {
                filterElement(cell)
              }
            })
            card.backElements && card.backElements.forEach(cell => {
              if (cell.eleType === 'button') {
                btn.push(cell.label)
                filterBtn(cell)
                if (cell.OpenType === 'popview' && cell.config) {
                  traversal(cell.config.components)
                } else if (cell.OpenType === 'pop') {
                  if (cell.modal && cell.modal.fields.length) {
                    cell.modal.fields.forEach(n => {
                      filterForm(n)
                    })
                  }
                }
              } else {
                filterElement(cell)
              }
            })
          })
        } else if (item.type === 'balcony') {
          item.elements && item.elements.forEach(cell => {
            if (cell.eleType === 'button') {
              btn.push(cell.label)
              filterBtn(cell)
              if (cell.OpenType === 'popview' && cell.config) {
                traversal(cell.config.components)
              } else if (cell.OpenType === 'pop') {
                if (cell.modal && cell.modal.fields.length) {
                  cell.modal.fields.forEach(n => {
                    filterForm(n)
                  })
                }
              }
            } else {
              filterElement(cell)
            }
          })
        } else if (item.type === 'table') {
          let loopCol = (cols) => {
            cols.forEach(col => {
              sql.push(col.label)
              if (col.prefix) {
                sql.push(col.prefix)
              }
              if (col.postfix) {
                sql.push(col.postfix)
              }
              if (col.type === 'colspan') {
                loopCol(col.subcols)
              } else if (col.type === 'custom') {
                col.elements.forEach(cell => {
                  if (cell.eleType === 'button') {
                    btn.push(cell.label)
                    filterBtn(cell)
                    if (cell.OpenType === 'popview' && cell.config) {
                      traversal(cell.config.components)
                    } else if (cell.OpenType === 'pop') {
                      if (cell.modal && cell.modal.fields.length) {
                        cell.modal.fields.forEach(n => {
                          filterForm(n)
                        })
                      }
                    }
                  } else {
                    filterElement(cell)
                  }
                })
              }
            })
          }
          loopCol(item.cols)
        } else if (item.type === 'form') {
          item.subcards.forEach(cell => {
            filterBtn(cell.subButton)
            cell.fields.forEach(n => {
              filterForm(n)
            })
          })
        }
      }
    })
  }
  if (config.interfaces) {
    config.interfaces.forEach(item => {
      if (item.setting.interType === 'system') {
        filterSql(item.setting.dataresource)
        item.scripts && item.scripts.forEach(script => {
          filterSql(script.sql)
        })
      }
    })
  }
  traversal(config.components)
  if (config.MenuName) {
    menu.push(config.MenuName)
  }
  if (config.fstMenuId && config.parentId && config.fstMenuId !== 'BillPrintTemp') {
    let menulist = sessionStorage.getItem('fstMenuList')
    try {
      menulist = JSON.parse(menulist)
    } catch(e) {
      menulist = []
    }
    menulist.forEach(item => {
      if (item.MenuID !== config.fstMenuId) return
      menu.push(item.MenuName)
      item.children.forEach(cell => {
        if (cell.MenuID !== config.parentId) return
        menu.push(cell.MenuName)
      })
    })
  }
  sql = sql.filter(Boolean)
  btn = btn.filter(Boolean)
  ops = ops.filter(Boolean)
  text = text.filter(Boolean)
  menu = menu.filter(Boolean)
  sql = Array.from(new Set(sql))
  btn = Array.from(new Set(btn))
  ops = Array.from(new Set(ops))
  text = Array.from(new Set(text))
  menu = Array.from(new Set(menu))
  sql = sql.map(l => `'${l}','title'`)
  btn = btn.map(l => `'${l}','button'`)
  ops = ops.map(l => `'${l}','list'`)
  text = text.map(l => `'${l}','text'`)
  menu = menu.map(l => `'${l}','menu'`)
  let list = [...menu, ...btn, ...sql, ...ops, ...text]
  let result = []
  langList.forEach(lan => {
    if (lan === defLang) return
    list.forEach(n => {
      result.push(`'${lan}',${n}`)
    })
  })
  config.trans = true
  return result.join(';')
}
/**
 * @description 语言转换
 */
export function setLangTrans (config, btnDict, titDict, lisDict, menuDict, regs, tail) {
  let filterElement = (card) => {
    if (card.datatype === 'static' && card.eleType === 'text' && !/@.+@/g.test(card.value)) {
      if (card.value && titDict[card.value]) {
        card.value = titDict[card.value]
      }
    }
    if (card.prefix && titDict[card.prefix]) {
      card.prefix = titDict[card.prefix]
    }
    if (card.postfix && titDict[card.postfix]) {
      card.postfix = titDict[card.postfix]
    }
  }
  let filterSql = (sl) => {
    if (!sl) return
    regs.forEach(item => {
      sl = sl.replace(item.reg, item.value)
    })
    return sl
  }
  let filterBtn = (btn) => {
    if (btn.label && btnDict[btn.label]) {
      btn.label = btnDict[btn.label]
    }
    if (btn.OpenType === 'tab' && btn.linkmenu) {
      if (btn.linkmenu[0] === 'multiMenu') {
        btn.multiMenus.forEach(menu => {
          menu.menuId = menu.menuId.map(c => {
            if (c.length <= 24) {
              return md5(window.GLOB.appkey + c + sessionStorage.getItem('lang')).toLowerCase()
            } else {
              return c.slice(0, 24) + tail
            }
          })
          menu.MenuID = menu.menuId[menu.menuId.length - 1]
        })
      } else {
        btn.linkmenu = btn.linkmenu.map(c => {
          if (c.length <= 24) {
            return md5(window.GLOB.appkey + c + sessionStorage.getItem('lang')).toLowerCase()
          } else {
            return c.slice(0, 24) + tail
          }
        })
        btn.MenuID = btn.linkmenu[btn.linkmenu.length - 1]
      }
    } else {
      if (btn.refreshTab && btn.refreshTab.length > 0) {
        btn.refreshTab = btn.refreshTab.map(c => {
          if (c.length <= 24) {
            return md5(window.GLOB.appkey + c + sessionStorage.getItem('lang')).toLowerCase()
          } else {
            return c.slice(0, 24) + tail
          }
        })
      }
      if (btn.openmenu && Array.isArray(btn.openmenu) && btn.openmenu.length > 0) {
        btn.openmenu = btn.openmenu.map(c => {
          if (c.length <= 24) {
            return md5(window.GLOB.appkey + c + sessionStorage.getItem('lang')).toLowerCase()
          } else {
            return c.slice(0, 24) + tail
          }
        })
        btn.MenuID = btn.openmenu[btn.openmenu.length - 1]
      } else if (btn.openmenu && typeof(btn.openmenu) === 'string' && btn.openmenu !== 'goback') {
        btn.openmenu = btn.openmenu.slice(0, 24) + tail
      }
      if (btn.pageTemplate === 'linkpage' && btn.linkmenu && typeof(btn.linkmenu) === 'string') {
        btn.linkmenu = btn.linkmenu.slice(0, 24) + tail
      }
    }
    if (!btn.verify) return
    btn.verify.customverifys && btn.verify.customverifys.forEach(script => {
      script.sql = filterSql(script.sql)
    })
    btn.verify.scripts && btn.verify.scripts.forEach(script => {
      script.sql = filterSql(script.sql)
    })
    btn.verify.cbScripts && btn.verify.cbScripts.forEach(script => {
      script.sql = filterSql(script.sql)
    })
    if (btn.OpenType === 'funcbutton') {
      if (btn.intertype === 'system' && btn.verify.dataType === 'custom' && btn.verify.setting) {
        btn.verify.setting.dataresource = filterSql(btn.verify.setting.dataresource)
      }
    } else if (btn.OpenType === 'excelOut' && btn.verify.dataresource) {
      btn.verify.dataresource = filterSql(btn.verify.dataresource)
    }
  }
  let filterForm = (n) => {
    if (n.label && titDict[n.label]) {
      n.label = titDict[n.label]
    }
    if (n.resourceType === '1') {
      n.dataSource = filterSql(n.dataSource)
    } else if (n.options) {
      n.options.forEach(o => {
        if (o.Text && lisDict[o.Text]) {
          o.Text = lisDict[o.Text]
        }
      })
    }
  }
  let resetMenu = (wrap) => {
    if (!wrap.menu) return
    if (typeof(wrap.menu) === 'string') {
      wrap.menu = wrap.menu.slice(0, 24) + tail
      if (wrap.MenuID) {
        wrap.MenuID = wrap.menu
      }
    } else {
      wrap.menu = wrap.menu.map(c => {
        if (c.length <= 24) {
          return md5(window.GLOB.appkey + c + sessionStorage.getItem('lang')).toLowerCase()
        } else {
          return c.slice(0, 24) + tail
        }
      })
      if (wrap.MenuID) {
        wrap.MenuID = wrap.menu[wrap.menu.length - 1]
      }
    }
  }
  let resetMenus = (wrap) => {
    if (!wrap.menus) return
    wrap.menus.forEach(m => {
      if (typeof(m.menu) === 'string') {
        m.menu = m.menu.slice(0, 24) + tail
      } else {
        m.menu = m.menu.map(c => {
          if (c.length <= 24) {
            return md5(window.GLOB.appkey + c + sessionStorage.getItem('lang')).toLowerCase()
          } else {
            return c.slice(0, 24) + tail
          }
        })
        if (m.MenuID) {
          m.MenuID = m.menu[m.menu.length - 1]
        }
      }
    })
  }
  let traversal = (components) => {
    if (!components) return
    components.forEach(item => {
      if (item.type === 'tabs') {
        item.subtabs.forEach(tab => {
          if (tab.label && titDict[tab.label]) {
            tab.label = titDict[tab.label]
          }
          traversal(tab.components)
        })
      } else if (item.type === 'group') {
        traversal(item.components)
      } else {
        if (item.wrap && (item.wrap.click === 'menu' || item.wrap.click === 'menus')) {
          if (item.wrap.click === 'menu') {
            resetMenu(item.wrap)
          } else if (item.wrap.click === 'menus') {
            resetMenus(item.wrap)
          }
        } else if (item.plot && (item.plot.click === 'menu' || item.plot.click === 'menus')) {
          if (item.plot.click === 'menu') {
            resetMenu(item.plot)
          } else if (item.plot.click === 'menus') {
            resetMenus(item.plot)
          }
        }
        if (item.setting && (!item.wrap || !item.wrap.datatype || item.wrap.datatype === 'dynamic')) {
          if (item.setting.interType === 'system') {
            item.setting.dataresource = filterSql(item.setting.dataresource)
            item.scripts && item.scripts.forEach(script => {
              script.sql = filterSql(script.sql)
            })
          }
        }
        if (item.columns) {
          item.columns.forEach(cell => {
            if (cell.label && titDict[cell.label]) {
              cell.label = titDict[cell.label]
            }
          })
        }
        if (item.search) {
          if (item.type === 'topbar') {
            if (item.search.fields) {
              item.search.fields.forEach(cell => {
                filterForm(cell)
              })
            }
            if (item.search.groups) {
              item.search.groups.forEach(group => {
                if (group.fields) {
                  group.fields.forEach(cell => {
                    filterForm(cell)
                  })
                }
              })
            }
          } else {
            item.search.forEach(cell => {
              filterForm(cell)
            })
          }
        }
        if (item.action) {
          item.action.forEach(cell => {
            filterBtn(cell)
            if (cell.OpenType === 'popview' && cell.config) {
              traversal(cell.config.components)
            } else if (cell.OpenType === 'pop') {
              if (cell.modal && cell.modal.fields.length) {
                cell.modal.fields.forEach(n => {
                  filterForm(n)
                })
              }
            }
          })
        }
        if (item.type === 'navbar') {
          item.uuid = item.uuid.slice(0, 24) + tail
        } else if (item.type === 'login') {
          item.wrap.linkmenu = item.wrap.linkmenu.slice(0, 24) + tail
        } else if (item.type === 'menubar') {
          item.subMenus = item.subMenus.map(cell => {
            if (cell.setting.name && menuDict[cell.setting.name]) {
              cell.setting.name = menuDict[cell.setting.name]
            }
            if (cell.setting.type === 'linkmenu') {
              cell.setting.linkMenuId = cell.setting.linkMenuId.slice(0, 24) + tail
            }
            return cell
          })
        } else if (item.type === 'topbar') {
          if (item.wrap.menus) {
            resetMenus(item.wrap)
          }
        } else if (item.type === 'card' || item.type === 'carousel' || item.type === 'timeline') {
          item.subcards.forEach(card => {
            if (card.setting.click === 'menus') {
              resetMenus(card)
            } else if (card.setting.click === 'menu') {
              resetMenu(card.setting)
            }
            card.elements && card.elements.forEach(cell => {
              if (cell.eleType === 'button') {
                filterBtn(cell)
                if (cell.OpenType === 'popview' && cell.config) {
                  traversal(cell.config.components)
                } else if (cell.OpenType === 'pop') {
                  if (cell.modal && cell.modal.fields.length) {
                    cell.modal.fields.forEach(n => {
                      filterForm(n)
                    })
                  }
                }
              } else {
                filterElement(cell)
              }
            })
            card.backElements && card.backElements.forEach(cell => {
              if (cell.eleType === 'button') {
                filterBtn(cell)
                if (cell.OpenType === 'popview' && cell.config) {
                  traversal(cell.config.components)
                } else if (cell.OpenType === 'pop') {
                  if (cell.modal && cell.modal.fields.length) {
                    cell.modal.fields.forEach(n => {
                      filterForm(n)
                    })
                  }
                }
              } else {
                filterElement(cell)
              }
            })
          })
        } else if (item.type === 'balcony') {
          item.elements && item.elements.forEach(cell => {
            if (cell.eleType === 'button') {
              filterBtn(cell)
              if (cell.OpenType === 'popview' && cell.config) {
                traversal(cell.config.components)
              } else if (cell.OpenType === 'pop') {
                if (cell.modal && cell.modal.fields.length) {
                  cell.modal.fields.forEach(n => {
                    filterForm(n)
                  })
                }
              }
            } else {
              filterElement(cell)
            }
          })
        } else if (item.type === 'table') {
          let loopCol = (cols) => {
            cols.forEach(col => {
              if (col.label && titDict[col.label]) {
                col.label = titDict[col.label]
              }
              if (col.prefix && titDict[col.prefix]) {
                col.prefix = titDict[col.prefix]
              }
              if (col.postfix && titDict[col.postfix]) {
                col.postfix = titDict[col.postfix]
              }
              if (col.type === 'colspan') {
                loopCol(col.subcols)
              } else if (col.type === 'custom') {
                col.elements.forEach(cell => {
                  if (cell.eleType === 'button') {
                    filterBtn(cell)
                    if (cell.OpenType === 'popview' && cell.config) {
                      traversal(cell.config.components)
                    } else if (cell.OpenType === 'pop') {
                      if (cell.modal && cell.modal.fields.length) {
                        cell.modal.fields.forEach(n => {
                          filterForm(n)
                        })
                      }
                    }
                  } else {
                    filterElement(cell)
                  }
                })
              }
            })
          }
          loopCol(item.cols)
        } else if (item.type === 'form') {
          item.subcards.forEach(cell => {
            filterBtn(cell.subButton)
            cell.fields.forEach(n => {
              filterForm(n)
            })
          })
        }
      }
    })
  }
  if (config.interfaces) {
    config.interfaces.forEach(item => {
      if (item.setting.interType === 'system') {
        item.setting.dataresource = filterSql(item.setting.dataresource)
        item.scripts && item.scripts.forEach(script => {
          script.sql = filterSql(script.sql)
        })
      }
    })
  }
  traversal(config.components)
}
/**
 * @description 获取执行脚本
 */
export function getAllSqls (config) {
  let sqls = []
  let urlFields = config.urlFields
  let appType = sessionStorage.getItem('appType')
  let process = config.process === 'true'
  let filterComponent = (components, mainSearch) => {
    components.forEach(item => {
      if (item.type === 'tabs') {
        item.subtabs.forEach(tab => {
          let _mainSearch = mainSearch || []
          if (appType !== 'mob') {
            tab.components.forEach(com => {
              if (com.type !== 'search') return
              _mainSearch = com.search || []
            })
          }
          filterComponent(tab.components, _mainSearch)
        })
      } else if (item.type === 'group') {
        filterComponent(item.components, mainSearch)
      } else {
        if (item.wrap && item.setting) {
          if (item.wrap.datatype === 'public' || item.wrap.datatype === 'static') {
            item.setting.interType = 'other'
          }
        }
        if (appType === 'mob' && item.type !== 'search' && item.type !== 'topbar' && item.search && item.search.length > 0) {
          item.search = []
        }
        if (item.subtype === 'tablecard') { // 兼容
          item.type = 'card'
        }
        if (item.setting && item.setting.interType === 'system') {
          if (item.format === 'object') {
            item.setting.laypage = 'false'
            item.setting.$top = true
          }
          let msg = getDataSource(item, mainSearch)
          sqls.push({uuid: item.uuid, ...msg})
        } else if (item.setting && item.setting.useMSearch === 'true') {
          let searches = item.search || []
          if (mainSearch.length > 0) {
            searches = [...searches, ...mainSearch]
          }
          item.$searches = fromJS(searches).toJS()
        }
        item.action && item.action.forEach(cell => {
          if (cell.hidden === 'true') return false
          resetButton(item, cell)
        })
        if (item.type === 'table') {
          let getCols = (cols) => {
            cols.forEach(col => {
              if (col.type === 'action') {
                col.type = 'custom'
              }
              if (col.type === 'colspan') {
                getCols(col.subcols || [])
              } else if (col.type === 'custom') {
                col.elements.forEach(cell => {
                  if (cell.eleType !== 'button' || cell.hidden === 'true') return
                  resetButton(item, cell)
                })
              }
            })
          }
          getCols(item.cols)
          if (item.subtype === 'editable' && item.submit.intertype === 'system') {
            // let sql = this.getEditTableSql(item.submit, item.cols, item.columns)
          }
        } else if (item.type === 'card' || item.type === 'carousel' || item.type === 'timeline') {
          item.subcards && item.subcards.forEach(card => {
            card.elements && card.elements.forEach(cell => {
              if (cell.eleType !== 'button' || cell.hidden === 'true') return
              resetButton(item, cell)
            })
            if (!card.backElements || card.backElements.length === 0) return
            card.backElements.forEach(cell => {
              if (cell.eleType !== 'button' || cell.hidden === 'true') return
              resetButton(item, cell, true)
            })
          })
        } else if (item.type === 'balcony') {
          item.elements.forEach(cell => {
            if (cell.eleType !== 'button' || cell.hidden === 'true') return
            resetButton(item, cell)
          })
        } else if (item.type === 'form') {
          item.subcards.forEach(group => {
            group.subButton.OpenType = 'formSubmit'
            if (!group.subButton.Ot) {
              group.subButton.Ot = item.wrap.datatype === 'static' ? 'notRequired' : 'requiredSgl'
            }
            group.subButton.uuid = group.uuid
            group.subButton.modal = {
              fields: group.fields
            }
            resetButton(item, group.subButton)
          })
        }
      }
    })
  }
  let resetButton = (item, cell, isback) => {
    if (['exec', 'prompt', 'pop', 'form', 'formSubmit'].includes(cell.OpenType)) {
      if (cell.intertype === 'system' || cell.procMode === 'system') { // 系统接口
        if (item.subtype === 'dualdatacard' && isback) {
          let _item = fromJS(item).toJS()
          _item.columns = _item.subColumns || []
          _item.setting.primaryKey = _item.setting.subKey
          let msg = getSysDefaultSql(cell, _item)
          sqls.push({uuid: cell.uuid, ...msg})
        } else {
          let msg = getSysDefaultSql(cell, item)
          sqls.push({uuid: cell.uuid, ...msg})
        }
      }
      if (cell.callbackType === 'script' && cell.verify && cell.verify.cbScripts) {
        // if (item.subtype === 'dualdatacard' && isback) {
        //   let _item = fromJS(item).toJS()
        //   _item.columns = _item.subColumns || []
        //   _item.setting.primaryKey = _item.setting.subKey
        //   getSysDefaultSql(cell, _item, true)
        // } else {
        //   getSysDefaultSql(cell, item, true)
        // }
        // let backSql = this.getSysBackSql(cell.verify.cbScripts, cell.cbTable)
        // if (backSql) {
        //   backSql = `${defSql}
        //     ${backSql}
        //   `
        //   if (cell.output) {
        //     backSql += `
        //       aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg,${cell.output} as mk_b_id`
        //   } else {
        //     backSql += `
        //       aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg`
        //   }
        //   backSql = backSql.replace(/@typename@/ig, `'typename'`)
        //   backSql = backSql.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, `''`)
        // }
      }
    } else if (cell.OpenType === 'excelIn') {
      if (cell.intertype === 'system') {
        // sql = this.getExcelInSql(cell, process)
      }
    } else if (cell.OpenType === 'excelOut') {
      if (cell.intertype === 'system' && cell.verify && cell.verify.dataType === 'custom') {
        // sql = this.getExcelOutSql(cell, item)
      }
    } else if (cell.OpenType === 'funcbutton') {
      if (cell.funcType === 'print') {
      } else if ((cell.funcType === 'refund' || cell.funcType === 'pay') && cell.payMode === 'system') {
        // sql = this.getPaySql(cell, item)
      }
    } else if (cell.OpenType === 'innerpage' || cell.OpenType === 'outerpage') {
      if (cell.pageTemplate === 'pay' && cell.payMode === 'system') {
        // sql = this.getPaySql(cell, item)
      }
    } else if (cell.OpenType === 'popview') {
      if (cell.config && cell.config.components) {
        let _mainSearch = []
        if (appType === 'mob') {
          cell.config.components.forEach(item => {
            if (item.type === 'search' && item.wrap.field) {
              _mainSearch.push({
                type: 'text',
                label: item.wrap.label,
                field: item.wrap.field,
                match: item.wrap.match,
                required: item.wrap.required,
                value: item.wrap.initval || ''
              })
            }
          })
        } else {
          cell.config.components.forEach(component => {
            if (component.type !== 'search') return
            _mainSearch = component.search || []
          })
        }
        filterComponent(cell.config.components, _mainSearch)
      }
    }
  }
  let getSearches = (searches) => {
    let sFields = []
    let query = false
    searches.forEach(item => {
      if (!item.field) return
      if (item.type === 'group') {
        sFields.push(item.field)
        sFields.push(item.datefield)
        sFields.push(item.datefield + '1')
      } else if (item.type === 'date') {
        if (sFields.includes(item.field)) {
          sFields.push(item.field + '1')
        } else {
          sFields.push(item.field)
        }
      } else if (item.type === 'dateweek') {
        sFields.push(item.field)
        sFields.push(item.field + '1')
      } else if (item.type === 'range') {
        sFields.push(item.field)
        sFields.push(item.field + '1')
      } else if (item.type === 'datemonth') {
        if (item.match === '=') {
          sFields.push(item.field)
        } else {
          sFields.push(item.field)
          sFields.push(item.field + '1')
        }
      } else if (item.type === 'daterange') {
        if (/,/.test(item.field)) {
          sFields.push(item.field.split(',')[0])
          sFields.push(item.field.split(',')[1])
        } else {
          sFields.push(item.field)
          sFields.push(item.field + '1')
        }
      } else if (item.type === 'text' || item.type === 'select') {
        item.field.split(',').forEach(field => {
          sFields.push(field)
        })
      } else {
        sFields.push(item.field)
      }
      if (query) return
      query = item.query !== 'false'
    })
    return { sFields, query }
  }
  let getSysDefaultSql = (btn, component) => {
    let primaryId = '@ID@'
    let BID = '@BID@'
    let verify = btn.verify || {}
    let _actionType = null
    let setting = component.setting || {}
    let columns = component.columns || []
    let primaryKey = setting.primaryKey || 'id'
    let colreps = [] // 待替换变量集
    if (verify.invalid === 'true') {
      if (component.wrap && (component.wrap.datatype === 'static' || component.wrap.datatype === 'public')) {
        verify.invalid = 'false'
      } else if (setting.maxScript && setting.maxScript >= 300) {
        verify.invalid = 'false'
      } else if (!setting.dataresource) {
        verify.invalid = 'false'
      } else if (btn.intertype !== 'system' && btn.procMode !== 'system') {
        verify.invalid = 'false'
      } else if (btn.sqlType === 'insert') {
        verify.invalid = 'false'
      } else if (btn.Ot === 'notRequired') {
        verify.invalid = 'false'
      }
    }
    if (verify.default !== 'false') { // 判断是否使用默认sql
      _actionType = btn.sqlType
    }
    let _initCustomScript = '' // 初始化脚本
    let _prevCustomScript = '' // 默认sql前执行脚本
    let _backCustomScript = '' // 默认sql后执行脚本
    verify.scripts && verify.scripts.forEach(item => {
      if (item.status === 'false') return
      if (item.position === 'init') {
        _initCustomScript += `
        /* 自定义脚本 */
        ${item.sql}
        `
      } else if (item.position === 'front') {
        _prevCustomScript += `
        /* 自定义脚本 */
        ${item.sql}
        `
      } else {
        _backCustomScript += `
        /* 自定义脚本 */
        ${item.sql}
        `
      }
    })
    // 需要声明的变量集
    let _vars = ['tbid', 'errorcode', 'retmsg', 'billcode', 'bvoucher', 'fibvoucherdate', 'fiyear', 'username', 'fullname', 'modulardetailcode', 'roleid', 'mk_departmentcode', 'mk_organization', 'mk_user_type', 'mk_nation', 'mk_province', 'mk_city', 'mk_district', 'mk_address', 'mk_deleted', 'bid']
    let _sql = ''
    let _initFormfields = []
    let _declares = []
    let formdata = null
    let formkeys = []
    if (btn.OpenType === 'pop' || btn.OpenType === 'formSubmit') {
      formdata = []
      if (btn.modal && btn.modal.fields) {
        btn.modal.fields.forEach(item => {
          if (!item.field) return
          let _item = {
            key: item.field,
            fieldlen: item.fieldlength || 50,
            writein: item.writein !== 'false',
            type: item.type
          }
          if (_item.type === 'datemonth') {
            _item.type = 'text'
          } else if (_item.type === 'number' || _item.type === 'rate') {
            _item.fieldlen = item.decimal || 0
          } else if (_item.type === 'date') {
            _item.type = item.declareType === 'nvarchar(50)' ? 'text' : 'date'
          } else if (_item.type === 'datetime') {
            _item.type = 'date'
          } else if (item.declare === 'decimal') {
            _item.type = 'number'
            _item.fieldlen = item.decimal || 0
          }
          formdata.push(_item)
        })
      }
    } else if (btn.OpenType === 'form') {
      formdata = []
      let item = {
        type: 'text',
        readin: true,
        writein: true,
        fieldlen: 50,
        key: btn.field
      }
      if (btn.formType === 'counter') {
        item.type = 'number'
        item.fieldlen = 0
      } else if (btn.formType === 'switch' || btn.formType === 'radio') {
        if (typeof(btn.openVal) === 'number') {
          item.type = 'number'
          item.fieldlen = 0
        }
      }
      formdata.push(item)
    }
    // 获取字段键值对
    formdata && formdata.forEach(form => {
      let _key = form.key.toLowerCase()
      if (!formkeys.includes(_key)) {
        formkeys.push(_key)
        if (form.type === 'number' || form.type === 'rate') {
          _initFormfields.push(`@${_key}=@mk_${_key}_mk@`)
        } else if (form.type === 'date') {
          _initFormfields.push(`@${_key}='@mk_${_key}_mk@'`)
        } else if (form.type === 'select' || form.type === 'link' || form.type === 'radio') {
          _initFormfields.push(`@${_key}='@mk_${_key}_mk@'`)
        } else {
          _initFormfields.push(`@${_key}='@mk_${_key}_mk@'`)
        }
      }
      if (!_vars.includes(_key)) {
        _vars.push(_key)
        if (form.fieldlen && form.fieldlen > 4000) {
          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)`
        }
        _declares.push(`@${_key} ${_type}`)
      }
    })
    // 表单变量赋值
    if (_initFormfields.length > 0) {
      _sql += `
        /* 表单变量赋值 */
        select ${_initFormfields.join(',')}
        `
    }
    if (btn.Ot !== 'notRequired' && columns.length > 0) {
      _sql += '@mk_cols_values@'
    }
    // 去除禁用的验证
    if (verify.contrasts) {
      verify.contrasts = verify.contrasts.filter(item => item.status !== 'false')
    }
    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 (_initCustomScript) {
      _sql += _initCustomScript
    }
    // 启用账期验证
    if (verify.accountdate === 'true') {
      let orgcode = `''`
      let date = `''`
      if (verify.accountfield) {
        orgcode = '@' + verify.accountfield
      }
      if (verify.voucherdate) {
        date = '@' + verify.voucherdate
      }
      _sql += `
        /* 账期验证 */
        exec s_FIBVoucherDateCheck @OrgCode=${orgcode},@FIBVoucherDate=${date},@ErrorCode=@ErrorCode OUTPUT,@retmsg=@retmsg OUTPUT
        if @ErrorCode!=''
          GOTO aaa
        `
    }
    // 失效验证,添加数据时不用
    if (verify.invalid === 'true') {
      let datasource = setting.dataresource
      let customScript = setting.customScript || ''
      let regoptions = [{
        reg: new RegExp('@orderBy@', 'ig'),
        value: setting.order || primaryKey
      }, {
        reg: new RegExp('@pageSize@', 'ig'),
        value: 1
      }, {
        reg: new RegExp('@pageIndex@', 'ig'),
        value: 1
      }]
      regoptions.forEach(item => {
        datasource = datasource.replace(item.reg, item.value)
        customScript = customScript.replace(item.reg, item.value)
      })
      if (customScript) {
        _sql += `
        /* 数据源自定义脚本,请注意变量定义是否重复 */
        ${customScript}
        `
      }
      if (btn.Ot === 'requiredOnce') {
        _sql += `
        /* 失效验证 */
        select @tbid='', @ErrorCode='',@retmsg=''
        select @tbid='X' from ${datasource} right join (select ID from  dbo.SplitComma(@ID@)) sp
        on tb.${primaryKey} =sp.id where tb.${primaryKey} is null
        If @tbid!=''
        Begin
          select @ErrorCode='E',@retmsg='数据已失效'
          goto aaa
        end
        `
      } else {
        _sql += `
        /* 失效验证 */
        select @tbid='', @ErrorCode='',@retmsg=''
        select @tbid=${primaryKey} from ${datasource} where ${primaryKey}=@ID@
        If @tbid=''
        Begin
          select @ErrorCode='E',@retmsg='数据已失效'
          goto aaa
        end
        `
      }
    }
    // 比较验证
    if (verify.contrasts && verify.contrasts.length > 0) {
      verify.contrasts.forEach(item => {
        _sql += `
        /* 比较验证 */
        If ${item.frontfield} ${item.operator} ${item.backfield}
        Begin
          select @ErrorCode='${item.errorCode}',@retmsg='${item.errmsg}'
            goto aaa
        end
        `
      })
    }
    // 自定义验证
    verify.customverifys && verify.customverifys.forEach(item => {
      _sql += `
        /* 自定义验证 */
        select @tbid='', @ErrorCode='',@retmsg=''
        select top 1 @tbid='X' from (${item.sql}) a
        If @tbid ${item.result === 'true' ? '!=' : '='}''
        Begin
          select @ErrorCode='${item.errorCode}',@retmsg='${item.errmsg}'
          goto aaa
        end
        `
    })
    // 单号生成,使用上级id(BID)或列表数据,声明变量(检验)
    let _billcodesSql  = ''
    if (formdata && verify.billcodes && verify.billcodes.length > 0) {
      verify.billcodes.forEach(item => {
        let _key = item.field.toLowerCase()
        let _linkKey = item.linkField ? item.linkField.toLowerCase() : ''
        if (!formkeys.includes(_key)) return // 表单中不含单号生成字段
        let _lpline = ''
        if (item.TypeCharOne === 'Lp') {
          if (_linkKey === 'bid' && BID) { // 替换bid
            _lpline = `set @ModularDetailCode= 'Lp'+ right('${item.mark || btn.uuid}'+@BID@,48)`
          } else {
            _lpline = `set @ModularDetailCode= 'Lp'+ right('${item.mark || btn.uuid}'+@${_linkKey},48)`
          }
        } else if (item.TypeCharOne === 'BN') {
          if (_linkKey === 'bid' && BID) { // 替换bid
            _lpline = `set @ModularDetailCode= 'BN'+ right(@BID@,48)`
          } else {
            _lpline = `set @ModularDetailCode= 'BN'+ right(@${_linkKey},48)`
          }
        } else {
          _lpline = `set @ModularDetailCode= right('${item.ModularDetailCode}',50)`
        }
        _billcodesSql += `
        /* 单号生成 */
        select @BillCode='', @${_key}='', @ModularDetailCode=''
        ${_lpline}
        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 @${_key}=@BillCode
        `
      })
      if (_actionType !== 'insertOrUpdate') {
        _sql += _billcodesSql
      }
    }
    // 唯一性验证,必须存在表单(表单存在时,主键均为单值),必须填写数据源,多行拼接时不可用
    if (formdata && verify.uniques && verify.uniques.length > 0 && btn.Ot !== 'requiredOnce') {
      verify.uniques.forEach(item => {
        let _fieldValue = []                     // 表单键值对field=value
        let _value = []                          // 表单值,用于错误提示
        let _labels = item.fieldlabel.split(',') // 表单提示文字
        let arr = [] // 验证主键
        item.field.split(',').forEach((_field, index) => {
          let _key = _field.toLowerCase()
          let _val = ''
          arr.push(_key)
          if (_key === 'bid') { // 表单中没有bid则使用系统bid变量
            _val = BID
          } else {
            _val = `'@mk_${_key}_mk@'`
          }
          _fieldValue.push(`${_key}=${_val}`)
          _value.push(`${_labels[index] || ''}:${_val || ''}`)
        })
        if (!arr.includes(primaryKey.toLowerCase())) {
          _fieldValue.push(`${primaryKey} !=${primaryId}`)
        }
        _sql += `
        /* 唯一性验证 */
        select @tbid='', @ErrorCode='',@retmsg=''
        select @tbid='X' from ${btn.sql} where ${_fieldValue.join(' and ')}${item.verifyType === 'logic' ? ' and deleted=0' : ''}
        If @tbid!=''
        Begin
          select @ErrorCode='${item.errorCode}',@retmsg='${_value.join(', ')} 已存在'
          goto aaa
        end
        `
      })
    } else if (verify.uniques && verify.uniques.length > 0 && btn.Ot === 'requiredOnce' && setting.dataresource) {
      let datasource = setting.dataresource
      if (/\s/.test(datasource)) { // 拼接别名
        if (!/tb$/.test(datasource)) {
          datasource = '(' + datasource + ') tb'
        }
      } else {
        datasource = datasource + ' tb'
      }
      if (setting.customScript) {
        _sql += `
        /* 数据源自定义脚本,请注意变量定义是否重复 */
        ${setting.customScript}
        `
      }
      verify.uniques.forEach(item => {
        _sql += `
        /* 同类数据验证 */
        Set @tbid=''
        Select top 1 @tbid='X' from (select distinct ${item.field},1 as n from ${datasource} inner join (select ID from  dbo.SplitComma(@ID@)) sp on tb.${primaryKey}=sp.ID ) a having sum(n)>1
        If @tbid!=''
        Begin
          Set @ErrorCode='E' Set @retmsg='${item.fieldlabel} 值不唯一'
          goto aaa
        end
        `
      })
    }
    let hasvoucher = false
    // 凭证-显示列中选取,必须选行
    if (verify.voucher && verify.voucher.enabled && btn.Ot !== 'requiredOnce') {
      let _voucher = verify.voucher
      hasvoucher = true
      _sql += `
        /* 创建凭证 */
        exec s_BVoucher_Create
          @Bill ='0',
          @BVoucherType ='${_voucher.BVoucherType}',
          @VoucherTypeOne ='${_voucher.VoucherTypeOne}',
          @VoucherTypeTwo ='${_voucher.VoucherTypeTwo}',
          @Type =${_voucher.Type},
          @UserID=@UserID@,
          @Username=@Username,
          @FullName=@FullName,
          @BVoucher =@BVoucher OUTPUT ,
          @FIBVoucherDate =@FIBVoucherDate OUTPUT ,
          @FiYear =@FiYear OUTPUT ,
          @ErrorCode =@ErrorCode OUTPUT,
          @retmsg=@retmsg OUTPUT
        if @ErrorCode!=''
          GOTO aaa
        `
    }
    let _insertsql = ''
    if (_actionType === 'insert' || _actionType === 'insertOrUpdate') { // 添加语句
      let keys = []
      let values = []
      formdata.forEach(item => {
        if (item.writein === false) return
        let _key = item.key.toLowerCase()
        keys.push(_key)
        values.push('@mk_' + _key + '_mk@')
      })
      if (!keys.includes(primaryKey.toLowerCase())) {
        keys.push(primaryKey.toLowerCase())
        values.push(primaryId)
      }
      if (!keys.includes('createuserid')) {
        keys.push('createuserid')
        values.push('@userid@')
      }
      if (!keys.includes('createuser')) {
        keys.push('createuser')
        values.push('@username')
      }
      if (!keys.includes('createstaff')) {
        keys.push('createstaff')
        values.push('@fullname')
      }
      if (!keys.includes('bid')) {
        keys.push('bid')
        values.push('@BID@')
      }
      if (!keys.includes('typename')) {
        keys.push('typename')
        values.push('@typename@')
      }
      keys = keys.join(',')
      values = values.join(',')
      _insertsql = `insert into ${btn.sql} (${keys}) select ${values};`
    }
    let _updatesql = ''
    if (_actionType === 'update' || _actionType === 'audit' || _actionType === 'insertOrUpdate') { // 修改语句
      let _form = []
      let _arr = []
      formdata.forEach(item => {
        if (item.writein === false) return
        let _key = item.key.toLowerCase()
        _arr.push(_key)
        _form.push(_key + '=@mk_' + _key + '_mk@')
      })
      if (_actionType === 'audit') {
        if (!_arr.includes('submitdate')) {
          _form.push('submitdate=getdate()')
        }
        if (!_arr.includes('submituser')) {
          _form.push('submituser=@username')
        }
        if (!_arr.includes('submitstaff')) {
          _form.push('submitstaff=@fullname')
        }
        if (!_arr.includes('submituserid')) {
          _form.push('submituserid=@userid@')
        }
      } else {
        if (!_arr.includes('modifydate')) {
          _form.push('modifydate=getdate()')
        }
        if (!_arr.includes('modifyuser')) {
          _form.push('modifyuser=@username')
        }
        if (!_arr.includes('modifystaff')) {
          _form.push('modifystaff=@fullname')
        }
        if (!_arr.includes('modifyuserid')) {
          _form.push('modifyuserid=@userid@')
        }
      }
      if (hasvoucher) {
        if (!_arr.includes('bvoucher')) {
          _form.push('BVoucher=@BVoucher')
        }
        if (!_arr.includes('fibvoucherdate')) {
          _form.push('FIBVoucherDate=@FIBVoucherDate')
        }
        if (!_arr.includes('fiyear')) {
          _form.push('FiYear=@FiYear')
        }
      }
      if (!_arr.includes('typename')) {
        _form.push('typename=@typename@')
      }
      _form = _form.join(',')
      let _ID = '=@ID@'
      if (btn.Ot === 'requiredOnce') {
        _ID = ' in (select ID from  dbo.SplitComma(@ID@))'
      }
      _updatesql = `update ${btn.sql} set ${_form} where ${primaryKey}${_ID};`
    }
    if (_prevCustomScript) {
      _sql += _prevCustomScript
    }
    // 添加、修改、逻辑删除、物理删除
    if (_actionType === 'insert') {
      _sql += `
        /* 默认sql */
        ${_insertsql}`
    } else if (_actionType === 'update' || _actionType === 'audit') {
      _sql += `
        /* 默认sql */
        ${_updatesql}`
    } else if (_actionType === 'LogicDelete') { // 逻辑删除
      let _ID = '=@ID@'
      if (btn.Ot === 'requiredOnce') {
        _ID = ' in (select ID from  dbo.SplitComma(@ID@))'
      }
      _sql += `
        /* 默认sql */
        update ${btn.sql} set deleted=@mk_deleted,modifydate=getdate(),modifyuser=@username,modifystaff=@fullname,modifyuserid=@userid@ where ${primaryKey}${_ID};`
    } else if (_actionType === 'delete') {      // 物理删除
      let _msg = ''
      if (columns && columns.length > 0 && btn.Ot !== 'notRequired') {
        let _index = 0
        columns.forEach(col => {
          if (_index >= 4 || col.field === primaryKey) return
          colreps.push(col.field)
          _msg += col.label + `=@mk_${col.field}_mk@,`
          _index++
        })
      }
      let _ID = '=@ID@'
      if (btn.Ot === 'requiredOnce') {
        _ID = ' in (select ID from  dbo.SplitComma(@ID@))'
      }
      _sql += `
        /* 默认sql */
        insert into snote (remark,createuserid,CreateUser,CreateStaff,typename) select left('删除表:${btn.sql} 数据: ${_msg}${primaryKey}='+@ID@,200),@userid@,@username,@fullname,@typename@
        delete ${btn.sql} where ${primaryKey}${_ID};`
    } else if (_actionType === 'insertOrUpdate') {
      _sql += `
        /* 默认sql */
        select @tbid=''
        select @tbid='X' from ${btn.sql} where ${primaryKey}=@ID@
        if @tbid=''
          begin
          ${_billcodesSql}
          ${_insertsql}
          end
        else
          begin
          ${_updatesql}
          end
      `
    }
    if (verify.workFlow === 'true' && verify.flowSql === 'true' && process) {
      if (verify.flowType === 'start') {
        _sql += `
          /* 工作流异常sql */
          if @works_flow_error@ != ''
          select @ErrorCode='E',@retmsg=@works_flow_error@ goto aaa
          /* 工作流默认sql */
          insert into s_my_works_flow (works_flow_id,works_flow_code,works_flow_name,works_flow_param,status,statusname,work_group,works_flow_detail_id,work_grade,bid,createuserid,CreateUser,CreateStaff,upid)
          select @ID@,@works_flow_code@,@works_flow_name@,@works_flow_param@,@status@,@statusname@,@work_group@,@works_flow_detail_id@,@work_grade@,@bid@,@UserID@,@UserName,@FullName,@time_id@
          insert into s_my_works_flow_log (works_flow_id,works_flow_code,works_flow_name,works_flow_param,status,statusname,works_flow_detail_id,work_group,work_grade,bid,createuserid,CreateUser,CreateStaff,upid)
          select @ID@,@works_flow_code@,@works_flow_name@ ,@works_flow_param@,@status@,@statusname@,@works_flow_detail_id@,@work_group@,@work_grade@,@bid@,@UserID@,@UserName,@FullName,@time_id@
          insert into s_my_works_flow_notice (works_flow_id,works_flow_code,works_flow_detail_id,userid,notice_type,createuserid,CreateUser,CreateStaff,upid)
          select @ID@,@works_flow_code@,@works_flow_detail_id@,@userid@,@start_type@,@userid@,@UserName,@FullName,@time_id@
          insert into s_my_works_flow_role (works_flow_id,works_flow_code,userid,works_flow_detail_id,createuserid,CreateUser,CreateStaff,upid,typecharone)
          select @ID@,@works_flow_code@,@userid@,@works_flow_detail_id@,@userid@,@UserName,@FullName,@time_id@,'begin'
        `
      } else {
        let field = '@works_flow_sign_field@'
        let label = '@works_flow_sign_label@'
        _sql += `
          /* 工作流异常sql */
          if @works_flow_error@ != ''
          select @ErrorCode='E',@retmsg=@works_flow_error@ goto aaa
          if @works_flow_countersign@ = 'Y'
          begin
              /* 工作流默认sql(会签) */
              declare @works_flow_statuscharone nvarchar(50),@works_flow_statuschartwo nvarchar(50),@works_flow_statuscharthree nvarchar(50),@works_flow_statuscharfour nvarchar(50),@works_flow_statuscharfive nvarchar(50),@works_flow_key_id nvarchar(50),@works_flow_key_status nvarchar(20),@s_my_works_flow_log_param  nvarchar(max),@s_my_works_flow_log_status int,@s_my_works_flow_log_statusname nvarchar(50),@s_my_works_flow_log_detail_id  nvarchar(50)
              select @works_flow_statuscharone='',@works_flow_statuschartwo='',@works_flow_statuscharthree='',@works_flow_statuscharfour='',@works_flow_statuscharfive='',@works_flow_key_id='',@works_flow_key_status ='',@s_my_works_flow_log_param='',@s_my_works_flow_log_status=0,@s_my_works_flow_log_statusname='',@s_my_works_flow_log_detail_id=''
              select @works_flow_statuscharone=statuscharone,@works_flow_statuschartwo=statuschartwo,@works_flow_statuscharthree=statuscharthree,@works_flow_statuscharfour=statuscharfour,@works_flow_statuscharfive=statuscharfive,@works_flow_key_id=id,@s_my_works_flow_log_param=works_flow_param,@s_my_works_flow_log_status=status,@s_my_works_flow_log_statusname=statusname,@s_my_works_flow_log_detail_id=works_flow_detail_id
              from s_my_works_flow where works_flow_id=@ID@ and works_flow_code=@works_flow_code@ and deleted=0
              if @works_flow_statuscharone!='' and @works_flow_statuschartwo!='' and @works_flow_statuscharthree!='' and @works_flow_statuscharfour!='' and @works_flow_statuscharfive!=''
              begin
                  set @works_flow_key_status='Y'
              end
              if @works_flow_key_status='Y'
              begin
                  update s_my_works_flow set ${field}=${label},status=@status@,statusname=@statusname@,works_flow_param=@works_flow_param@,works_flow_detail_id=@works_flow_detail_id@,modifydate=getdate(),upid=@time_id@,modifyuserid=@userid@,modifyuser=@username,modifystaff=@fullname${verify.flowRemark ? ',remark=@' + verify.flowRemark : ''}
                  where id=@works_flow_key_id
                  insert into s_my_works_flow_log (works_flow_id,works_flow_code,works_flow_name,works_flow_param,status,statusname,works_flow_detail_id,work_group,work_grade,bid,createuserid,CreateUser,CreateStaff,upid${verify.flowRemark ? ',remark' : ''},${field})
                  select @ID@,@works_flow_code@,@works_flow_name@ ,@works_flow_param@,@status@,@statusname@,@works_flow_detail_id@,@work_group@,@work_grade@,@bid@,@UserID@,@UserName,@FullName,@time_id@${verify.flowRemark ? ',@' + verify.flowRemark : ''},${label}
                  update s_my_works_flow_role set deleted=10,modifydate=getdate(),upid=@time_id@,modifyuserid=@userid@,modifyuser=@username,modifystaff=@fullname
                  where works_flow_id=@ID@ and works_flow_code=@works_flow_code@ and deleted=0
                  if @check_userids@ != ''
                  begin
                      insert into s_my_works_flow_role (works_flow_id,works_flow_code,userid,works_flow_detail_id,createuserid,CreateUser,CreateStaff,upid)
                      select @ID@,@works_flow_code@,ID,@works_flow_detail_id@,@userid@,@UserName,@FullName,@time_id@ from dbo.SplitComma(@check_userids@)
                      insert into s_my_works_flow_notice (works_flow_id,works_flow_code,works_flow_detail_id,userid,notice_type,createuserid,CreateUser,CreateStaff,upid)
                      select @ID@,@works_flow_code@,@works_flow_detail_id@,ID,@check_type@,@userid@,@UserName,@FullName,@time_id@ from dbo.SplitComma(@check_userids@)
                  end
                  if @notice_userids@ != ''
                  begin
                      update n
                      set deleted=10,modifydate=getdate(),upid=@time_id@,modifyuserid=@userid@,modifyuser=@username,modifystaff=@fullname
                      from (select * from s_my_works_flow_notice where works_flow_id=@ID@ and works_flow_code=@works_flow_code@ and deleted=0) n
                      inner join (select ID from dbo.SplitComma(@notice_userids@)) s
                      on n.userid = s.id
                      insert into s_my_works_flow_notice (works_flow_id,works_flow_code,works_flow_detail_id,userid,notice_type,createuserid,CreateUser,CreateStaff,upid)
                      select @ID@,@works_flow_code@,@works_flow_detail_id@,ID,@notice_type@,@userid@,@UserName,@FullName,@time_id@ from dbo.SplitComma(@notice_userids@)
                  end
              end
              else
              begin
                  update s_my_works_flow set ${field}=${label},modifydate=getdate(),upid=@time_id@,modifyuserid=@userid@,modifyuser=@username,modifystaff=@fullname${verify.flowRemark ? ',remark=@' + verify.flowRemark : ''}
                  where id =@works_flow_key_id
                  insert into s_my_works_flow_log (works_flow_id,works_flow_code,works_flow_name,works_flow_param,status,statusname,works_flow_detail_id,work_group,work_grade,bid,createuserid,CreateUser,CreateStaff,upid${verify.flowRemark ? ',remark' : ''},${field})
                  select @ID@,@works_flow_code@,@works_flow_name@ ,@s_my_works_flow_log_param,@s_my_works_flow_log_status,@s_my_works_flow_log_statusname,@s_my_works_flow_log_detail_id,@work_group@,@work_grade@,@bid@,@UserID@,@UserName,@FullName,@time_id@${verify.flowRemark ? ',@' + verify.flowRemark : ''},${label}
                  update s_my_works_flow_role set deleted=10,modifydate=getdate(),upid=@time_id@,modifyuserid=@userid@,modifyuser=@username,modifystaff=@fullname
                  where works_flow_id=@ID@ and works_flow_code=@works_flow_code@ and deleted=0 and userid =@userid@
              end
          end
          else
          begin
              /* 工作流默认sql(或签) */
              set @retmsg =''
              select @retmsg='X' from s_my_works_flow_role where works_flow_id=@ID@ and works_flow_code=@works_flow_code@ and deleted=0 and userid =@userid@
              if @retmsg =''
              begin
                  select @retmsg='X' from s_my_works_flow_role where works_flow_id=@ID@ and works_flow_code=@works_flow_code@ and userid=@userid@
                  if @retmsg !=''
                  begin
                      select @ErrorCode='E', @retmsg='当前单据已审核,请刷新后重试'
                      goto aaa
                  end
                  if @dataM@ !=''
                  begin
                      set @retmsg =''
                      select @retmsg='X' from s_my_works_flow_role where works_flow_id=@ID@ and works_flow_code=@works_flow_code@ and deleted=0
                      if @retmsg != ''
                      begin
                          goto goto_mk
                      end
                  end
                  select @retmsg='页面数据已更新,或没有当前单据的审批权限'
                  goto aaa
              end
              goto_mk:
              set @retmsg=''
              update s_my_works_flow set status=@status@,statusname=@statusname@,works_flow_param=@works_flow_param@,works_flow_detail_id=@works_flow_detail_id@,modifydate=getdate(),upid=@time_id@,modifyuserid=@userid@,modifyuser=@username,modifystaff=@fullname${verify.flowRemark ? ',remark=@' + verify.flowRemark : ''}
              where works_flow_id=@ID@ and works_flow_code=@works_flow_code@ and deleted=0
              insert into s_my_works_flow_log (works_flow_id,works_flow_code,works_flow_name,works_flow_param,status,statusname,works_flow_detail_id,work_group,work_grade,bid,createuserid,CreateUser,CreateStaff,upid${verify.flowRemark ? ',remark' : ''})
              select @ID@,@works_flow_code@,@works_flow_name@ ,@works_flow_param@,@status@,@statusname@,@works_flow_detail_id@,@work_group@,@work_grade@,@bid@,@UserID@,@UserName,@FullName,@time_id@${verify.flowRemark ? ',@' + verify.flowRemark : ''}
              if @works_begin_branch@ = 'Y'
              begin
                  update s_my_works_flow_role set deleted=0,modifydate=getdate(),upid=@time_id@,modifyuserid=@userid@,modifyuser=@username,modifystaff=@fullname
                  where works_flow_id=@ID@ and works_flow_code=@works_flow_code@ and typecharone='begin'
              end
              else
              begin
                  update s_my_works_flow_role set deleted=10,modifydate=getdate(),upid=@time_id@,modifyuserid=@userid@,modifyuser=@username,modifystaff=@fullname
                  where works_flow_id=@ID@ and works_flow_code=@works_flow_code@ and deleted=0
              end
              if @check_userids@ != ''
              begin
                  insert into s_my_works_flow_role (works_flow_id,works_flow_code,userid,works_flow_detail_id,createuserid,CreateUser,CreateStaff,upid)
                  select @ID@,@works_flow_code@,ID,@works_flow_detail_id@,@userid@,@UserName,@FullName,@time_id@ from dbo.SplitComma(@check_userids@)
                  insert into s_my_works_flow_notice (works_flow_id,works_flow_code,works_flow_detail_id,userid,notice_type,createuserid,CreateUser,CreateStaff,upid)
                  select @ID@,@works_flow_code@,@works_flow_detail_id@,ID,@check_type@,@userid@,@UserName,@FullName,@time_id@ from dbo.SplitComma(@check_userids@)
              end
              if @notice_userids@ != ''
              begin
                  update n
                  set deleted=10,modifydate=getdate(),upid=@time_id@,modifyuserid=@userid@,modifyuser=@username,modifystaff=@fullname
                  from (select * from s_my_works_flow_notice where works_flow_id=@ID@ and works_flow_code=@works_flow_code@ and deleted=0) n
                  inner join (select ID from dbo.SplitComma(@notice_userids@)) s
                  on n.userid = s.id
                  insert into s_my_works_flow_notice (works_flow_id,works_flow_code,works_flow_detail_id,userid,notice_type,createuserid,CreateUser,CreateStaff,upid)
                  select @ID@,@works_flow_code@,@works_flow_detail_id@,ID,@notice_type@,@userid@,@UserName,@FullName,@time_id@ from dbo.SplitComma(@notice_userids@)
              end
          end
        `
      }
      if (_backCustomScript) {
        _sql += _backCustomScript
      }
    } else if (_backCustomScript) {
      _sql += _backCustomScript
    }
    if (verify.workFlow === 'true' && process) {
      // works_flow_error       流程错误
      // works_flow_countersign 会签/或签 标记
      // works_begin_branch     驳回至开始分支(line.mknode === 'startEdge')
      // works_flow_sign_field  会签 标记字段 statuscharone/statuschartwo/statuscharthree/statuscharfour/statuscharfive
      // works_flow_sign_label  会签 标记值   ***/***/已审核
      let worksReFields = ['works_flow_error', 'works_flow_countersign', 'works_begin_branch', 'works_flow_sign_label', 'start_type', 'check_type', 'notice_type', 'check_userids', 'notice_userids', 'works_flow_sign', 'works_flow_code', 'works_flow_name', 'works_flow_param', 'works_flow_detail_id', 'status', 'statusname', 'work_group', 'work_grade']
      worksReFields.forEach(n => {
        _sql = _sql.replace(new RegExp('@' + n + '@', 'ig'), `'@${n}@'`)
      })
    }
    if (btn.procMode === 'system') {
      _sql += `
        aaa: if @ErrorCode!=''
        insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,@UserID@`
    } else if (btn.output) {
      _sql += `
        aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg,${btn.output} as mk_b_id`
    } else {
      _sql += `
        aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg`
    }
    let syses = ['UserName', 'FullName', 'RoleID', 'mk_departmentcode', 'mk_organization', 'mk_user_type', 'mk_nation', 'mk_province', 'mk_city', 'mk_district', 'mk_address']
    // 添加数据中字段,表单值优先(按钮不选行或多行拼接时跳过)
    if (btn.Ot !== 'notRequired' && columns.length > 0) {
      let _initColfields = []
      columns.forEach(col => {
        let _key = col.field.toLowerCase()
        if (formkeys.includes(_key) || !new RegExp('@' + _key + '[^0-9a-z_]', 'ig').test(_sql)) return
        if (_key === 'id' && !/@id[^0-9a-z_@]/ig.test(_sql)) return
        colreps.push(col.field)
        if (col.type === 'number') {
          _initColfields.push(`@${_key}=@mk_${_key}_mk@`)
        } else {
          _initColfields.push(`@${_key}='@mk_${_key}_mk@'`)
        }
        if (!_vars.includes(_key)) {
          _declares.push(`@${_key} ${col.datatype || 'nvarchar(50)'}`)
        }
      })
      // 显示列变量赋值
      if (_initColfields.length > 0) {
        _sql = _sql.replace('@mk_cols_values@', `
          /* 显示列变量赋值 */
          select ${_initColfields.join(',')}
        `)
      } else {
        _sql = _sql.replace('@mk_cols_values@', '')
      }
    }
    let reps = []
    let decSql = [`@tbid nvarchar(50),@ErrorCode nvarchar(50),@retmsg nvarchar(4000),@BillCode nvarchar(50),@BVoucher nvarchar(50),@FIBVoucherDate nvarchar(50), @FiYear nvarchar(50),@ModularDetailCode nvarchar(50),@mk_deleted int,@bid nvarchar(50)`]
    let secSql = [`@ErrorCode='',@retmsg='', @BillCode='',@BVoucher='',@FIBVoucherDate='',@FiYear='',@ModularDetailCode='', @mk_deleted=1, @bid=@BID@`]
    syses.forEach(s => {
      if (new RegExp('@' + s + '[^0-9a-z_]', 'ig').test(_sql)) {
        if (['RoleID', 'mk_departmentcode', 'mk_organization'].includes(s)) {
          decSql.push(`@${s} nvarchar(512)`)
        } else if (['mk_address'].includes(s)) {
          decSql.push(`@mk_address nvarchar(100)`)
        } else {
          decSql.push(`@${s} nvarchar(50)`)
        }
        secSql.push(`@${s}=@${s}@`)
        reps.push(s)
      }
    })
    decSql = [...decSql, ..._declares]
    let regs = ['ID', 'BID', 'time_id', 'datam', 'LoginUID', 'SessionUid', 'UserID', 'Appkey', 'lang', 'typename']
    regs.forEach(s => {
      if (new RegExp('@' + s + '@', 'ig').test(_sql)) {
        reps.push(s)
      }
    })
    _sql = `Declare ${decSql.join(',')}
        /* 凭证及用户信息初始化赋值 */
        select ${secSql.join(',')}
        ${_sql}
    `
    _sql = _sql.replace(/\n\s{8,10}/g, '\n')
    reps.forEach(n => {
      _sql = _sql.replace(new RegExp('@' + n + '@', 'ig'), `'@${n}@'`)
    })
    if (/\$@/ig.test(_sql)) {
      _sql = _sql.replace(/\$@/ig, '@datam_begin@').replace(/@\$/ig, '@datam_end@')
      reps.push('datam_begin', 'datam_end')
    }
    if (/\$check@|@check\$/ig.test(_sql)) {
      _sql = _sql.replace(/\$check@/ig, '@mk_check_begin@').replace(/@check\$/ig, '@mk_check_end@')
      reps.push('mk_check_begin', 'mk_check_end')
    }
    reps = Array.from(new Set([...reps, ...colreps]))
    return { LText: _sql, reps }
  }
  let getDataSource = (item, mainSearch = []) => {
    if (!item.setting || item.setting.interType !== 'system') return
    item.setting.primaryKey = item.setting.primaryKey || 'ID'
    let searches = item.search || []
    if (item.setting.useMSearch === 'true' && mainSearch.length > 0) {
      searches = [...searches, ...mainSearch]
    }
    item.$searches = fromJS(searches).toJS()
    let { sFields, query } = getSearches(searches)
    let _columns = []
    if (item.subtype === 'dualdatacard') {
      _columns = [...item.columns, ...item.subColumns]
    } else if (item.columns) {
      _columns = [...item.columns]
    }
    let arr_field = _columns.map(col => col.field).join(',')
    let _customScript = ''
    let _tailScript = ''
    let _dataresource = ''
    item.scripts && item.scripts.forEach(script => {
      if (script.status === 'false') return
      if (script.position !== 'back') {
        _customScript += `
        ${script.sql}
        `
      } else {
        _tailScript += `
        ${script.sql}
        `
      }
    })
    if (item.setting.execute !== 'false') {
      _dataresource = item.setting.dataresource || ''
    }
    if (/\s/.test(_dataresource)) {
      _dataresource = '(' + _dataresource + ') tb'
    }
    item.setting.dataresource = _dataresource
    item.setting.customScript = _customScript
    let _search = '@search@'
    if (item.setting.queryType === 'statistics' || !query) {
      _search = ''
    }
    let testSql = _dataresource + _customScript + _tailScript
    let decSql = [`@ErrorCode nvarchar(50),@retmsg nvarchar(4000)`]
    let secSql = [`@ErrorCode='',@retmsg =''`]
    let reps = []
    if (_customScript || _tailScript) {
      reps.push('UserID', 'time_id')
    }
    let syses = ['UserName', 'FullName', 'RoleID', 'mk_departmentcode', 'mk_organization', 'mk_user_type', 'mk_nation', 'mk_province', 'mk_city', 'mk_district', 'mk_address']
    syses.forEach(s => {
      if (new RegExp('@' + s + '[^0-9a-z_]', 'ig').test(testSql)) {
        if (['RoleID', 'mk_departmentcode', 'mk_organization'].includes(s)) {
          decSql.push(`@${s} nvarchar(512)`)
        } else if (['mk_address'].includes(s)) {
          decSql.push(`@mk_address nvarchar(100)`)
        } else {
          decSql.push(`@${s} nvarchar(50)`)
        }
        secSql.push(`@${s}=@${s}@`)
        reps.push(s)
      }
    })
    decSql = `declare ${decSql.join(',')}
      select ${secSql.join(',')}`
    // 不需要单引号:orderBy、pageSize、pageIndex、db
    let regs = [...sFields, 'orderBy', 'pageSize', 'pageIndex', 'typename', 'datam', 'ID', 'BID', 'LoginUID', 'SessionUid', 'UserID', 'Appkey', 'lang', 'typename']
    if (item.hasExtend) {
      regs.push('mk_time')
    }
    if (item.type === 'calendar') {
      regs.push('mk_year')
    }
    if (window.GLOB.getLocation) {
      regs.push('mk_longitude', 'mk_latitude')
    }
    if (window.GLOB.externalDatabase !== null) {
      regs.push('db')
    }
    if (urlFields) {
      regs.push(...urlFields)
    }
    if (process) {
      regs.push('works_flow_code')
    }
    regs.forEach(s => {
      if (new RegExp('@' + s + '@', 'ig').test(testSql)) {
        reps.push(s)
      }
    })
    let LText = ''
    let DateCount = ''
    if (_dataresource) {
      if (/@pageSize@|@orderBy@|@mk_total/i.test(testSql)) {
        LText = `/*system_query*/select ${arr_field} from ${_dataresource} ${_search} `
      } else if (item.setting.laypage === 'true' && item.setting.order) {
        LText = `/*system_query*/select top @pageSize@ ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by @orderBy@) as rows from ${_dataresource} ${_search}) tmptable where rows > @mk_rows_begin@ order by tmptable.rows `
        reps.push('pageSize', 'orderBy', 'mk_rows_begin')
        if (item.subtype === 'dualdatacard') {
          DateCount = `/*system_query*/select count(1) as total from (select distinct ${item.setting.primaryKey} from ${_dataresource} ${_search})a`
        } else {
          DateCount = `/*system_query*/select count(1) as total from ${_dataresource} ${_search}`
        }
      } else if (item.setting.$top) {
        if (item.setting.order) {
          LText = `/*system_query*/select top 1 ${arr_field} from ${_dataresource} ${_search} order by @orderBy@ `
          reps.push('orderBy')
        } else {
          LText = `/*system_query*/select top 1 ${arr_field} from ${_dataresource} ${_search}  `
        }
      } else if (item.setting.order) {
        LText = `/*system_query*/select ${arr_field} from ${_dataresource} ${_search} order by @orderBy@ `
        reps.push('orderBy')
      } else {
        LText = `/*system_query*/select ${arr_field} from ${_dataresource} ${_search}  `
      }
    }
    if (_customScript) {
      _customScript = `${decSql}
        ${_customScript}
      `
      if (DateCount) {
        DateCount = `${DateCount}
        ${_tailScript}
        aaa:
        if @ErrorCode!=''
          insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode,@retmsg,@UserID@
        `
      } else if (LText) {
        LText = `${LText}
        ${_tailScript}
        aaa:
        if @ErrorCode!=''
          insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode,@retmsg,@UserID@
        `
      } else {
        _customScript = `${_customScript}
        ${_tailScript}
        aaa:
        if @ErrorCode!=''
          insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,@UserID@
        `
      }
    } else if (_tailScript && DateCount) {
      LText = `${decSql}
        ${LText}
      `
      DateCount = `${DateCount}
        ${_tailScript}
        aaa:
        if @ErrorCode!=''
          insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,@UserID@
      `
    } else if (_tailScript) {
      LText = `${decSql}
        ${LText}
        ${_tailScript}
        aaa:
        if @ErrorCode!=''
          insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,@UserID@
      `
    } else {
      LText = `${decSql}
        ${LText}
      `
    }
    reps = Array.from(new Set(reps))
    LText = LText.replace(/\n\s{6,8}/g, '\n')
    DateCount = DateCount.replace(/\n\s{6,8}/g, '\n')
    _customScript = _customScript.replace(/\n\s{6,8}/g, '\n')
    reps.forEach(n => {
      if (['orderBy', 'pageSize', 'pageIndex', 'mk_rows_begin'].includes(n)) return
      LText = LText.replace(new RegExp('@' + n + '@', 'ig'), `'@${n}@'`)
      DateCount = DateCount.replace(new RegExp('@' + n + '@', 'ig'), `'@${n}@'`)
      _customScript = _customScript.replace(new RegExp('@' + n + '@', 'ig'), `'@${n}@'`)
    })
    if (/\$@/ig.test(testSql)) {
      LText = LText.replace(/\$@/ig, '@datam_begin@').replace(/@\$/ig, '@datam_end@')
      DateCount = DateCount.replace(/\$@/ig, '@datam_begin@').replace(/@\$/ig, '@datam_end@')
      _customScript = _customScript.replace(/\$@/ig, '@datam_begin@').replace(/@\$/ig, '@datam_end@')
      reps.push('datam_begin', 'datam_end')
    }
    return {LText, DateCount, customScript: _customScript, reps}
  }
  let _mainSearch = []
  if (appType === 'mob') {
    let search = []
    let ms = null
    config.components.forEach(item => {
      if (item.type === 'topbar' && item.wrap.type !== 'navbar' && item.search) {
        ms = item.search
      } else if (item.type === 'search' && item.wrap.field) {
        search.push({
          type: 'text',
          field: item.wrap.field,
        })
      }
    })
    if (ms) {
      if (ms.setting.type === 'search') {
        search.push({
          type: 'text',
          field: ms.setting.field,
        })
      }
      search.push(...ms.fields)
      ms.groups.forEach(group => {
        if (group.setting.type === 'search') {
          search.push({
            type: 'text',
            field: group.setting.field,
          })
        }
        search.push(...group.fields)
      })
    }
    if (search.length > 0) {
      _mainSearch = search
    }
  } else {
    config.components.forEach(component => {
      if (component.type !== 'search') return
      _mainSearch = component.search || []
    })
  }
  if (config.interfaces && config.interfaces.length > 0) {
    config.interfaces.forEach(m => {
      if (m.status !== 'true' || m.setting.interType !== 'system') return false
      m.setting.laypage = 'false'
      m.setting.$top = true
      let msg = getDataSource(m, _mainSearch)
      sqls.push({uuid: m.uuid, ...msg})
    })
  }
  filterComponent(config.components, _mainSearch)
  return sqls
}