import React, {Component} from 'react'
|
import PropTypes from 'prop-types'
|
import moment from 'moment'
|
import qs from 'qs'
|
import { is, fromJS } from 'immutable'
|
import { Button, Modal, notification, message, Popover, Drawer, Switch, Checkbox, Progress } from 'antd'
|
import md5 from 'md5'
|
|
import Api from '@/api'
|
import Utils, { getSysDefaultSql } from '@/utils/utils.js'
|
import asyncSpinComponent from '@/utils/asyncSpinComponent'
|
import { updateForm } from '@/utils/utils-update.js'
|
import MKEmitter from '@/utils/events.js'
|
import MkIcon from '@/components/mk-icon'
|
import MkCounter from './mkcounter'
|
// import './index.scss'
|
|
const MutilForm = asyncSpinComponent(() => import('@/tabviews/zshare/mutilform'))
|
const { confirm } = Modal
|
|
class NormalButton extends Component {
|
static propTpyes = {
|
BID: PropTypes.string, // 主表ID
|
BData: PropTypes.any, // 主表数据
|
style: PropTypes.any, // 按钮样式
|
selectedData: PropTypes.any, // 子表中选择数据
|
btn: PropTypes.object, // 按钮
|
columns: PropTypes.any, // 字段列
|
setting: PropTypes.any, // 页面通用设置
|
disabled: PropTypes.any, // 行按钮禁用
|
name: PropTypes.any
|
}
|
|
state = {
|
visible: false,
|
formdata: null,
|
selines: null,
|
confirmLoading: false,
|
btnconfig: null,
|
loading: false,
|
loadingNumber: '',
|
loadingTotal: '',
|
disabled: false,
|
hidden: false,
|
autoMatic: false,
|
check: false,
|
count: 0,
|
dict: window.GLOB.dict
|
}
|
|
preCallback = null
|
|
UNSAFE_componentWillMount () {
|
const { btn, selectedData, BData, disabled } = this.props
|
|
if (btn.controlField) {
|
this.setStatus(btn, selectedData || [], BData, disabled)
|
} else if (disabled) {
|
this.setState({disabled: true})
|
}
|
|
if (btn.OpenType === 'form') {
|
let data = selectedData && selectedData[0] ? selectedData[0] : null
|
if (btn.formType === 'counter' || btn.formType === 'count_line') {
|
let count = 0
|
if (data && data[btn.field]) {
|
count = +data[btn.field]
|
if (isNaN(count)) {
|
count = 0
|
}
|
}
|
this.setState({count: count })
|
} else {
|
this.setState({check: data && data[btn.field] === btn.openVal})
|
}
|
} else if (btn.OpenType === 'formSubmit') {
|
this.setState({
|
selines: selectedData || []
|
})
|
}
|
}
|
|
shouldComponentUpdate (nextProps, nextState) {
|
return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
|
}
|
|
componentDidMount () {
|
const { btn } = this.props
|
|
MKEmitter.addListener('triggerBtnId', this.actionTrigger)
|
if (btn.OpenType === 'formSubmit') {
|
MKEmitter.addListener('triggerFormSubmit', this.actionSubmit)
|
}
|
|
if (btn.autoMatic) {
|
MKEmitter.addListener('triggerBtnPopSubmit', this.triggerBtnPopSubmit)
|
}
|
}
|
|
UNSAFE_componentWillReceiveProps (nextProps) {
|
const { btn } = this.props
|
|
if (btn.controlField) {
|
this.setStatus(btn, nextProps.selectedData || [], nextProps.BData, nextProps.disabled)
|
} else {
|
this.setState({disabled: nextProps.disabled === true})
|
}
|
|
if (btn.OpenType === 'form') {
|
let data = nextProps.selectedData && nextProps.selectedData[0] ? nextProps.selectedData[0] : null
|
if (btn.formType === 'counter' || btn.formType === 'count_line') {
|
let count = 0
|
if (data && data[btn.field]) {
|
count = +data[btn.field]
|
if (isNaN(count)) {
|
count = 0
|
}
|
}
|
this.setState({count: count })
|
} else {
|
this.setState({check: data && data[btn.field] === btn.openVal})
|
}
|
} else if (btn.OpenType === 'formSubmit') {
|
this.setState({
|
selines: nextProps.selectedData || []
|
})
|
}
|
}
|
|
componentWillUnmount () {
|
this.setState = () => {
|
return
|
}
|
MKEmitter.removeListener('triggerBtnId', this.actionTrigger)
|
MKEmitter.removeListener('triggerFormSubmit', this.actionSubmit)
|
MKEmitter.removeListener('triggerBtnPopSubmit', this.triggerBtnPopSubmit)
|
}
|
|
setStatus = (btn, data, BData, disprop) => {
|
let disabled = false
|
let hidden = false
|
|
if (btn.control !== 'parent') {
|
if (data.length > 0) {
|
data.forEach(item => {
|
let s = item[btn.controlField] !== undefined ? item[btn.controlField] + '' : ''
|
if (btn.controlVals.includes(s) || item.$lock) {
|
disabled = true
|
}
|
})
|
} else if (btn.controlVals.includes('')) {
|
disabled = true
|
}
|
} else {
|
if (!BData || !BData.hasOwnProperty(btn.controlField)) {
|
hidden = true
|
} else {
|
let s = BData[btn.controlField] + ''
|
if (btn.controlVals.includes(s)) {
|
hidden = true
|
}
|
}
|
}
|
|
if (disabled && btn.control === 'hidden') {
|
hidden = true
|
}
|
|
if (disprop) {
|
disabled = true
|
}
|
|
this.setState({hidden, disabled})
|
}
|
|
triggerBtnPopSubmit = (id) => {
|
const { btn } = this.props
|
|
if (btn.uuid !== id) return
|
|
this.handleOk()
|
}
|
|
actionSubmit = (res) => {
|
const { btn } = this.props
|
const { selines } = this.state
|
|
if (btn.uuid !== res.menuId) return
|
|
let data = selines || []
|
|
let valid = this.checkBtnData(data)
|
|
if (!valid) {
|
this.preCallback && this.preCallback()
|
return
|
}
|
|
this.setState({ loading: true })
|
|
this.execSubmit(data, () => {}, res.form)
|
}
|
|
/**
|
* @description 触发按钮操作
|
*/
|
actionTrigger = (triggerId, record, type, lid, callback) => {
|
const { btn, selectedData, LID } = this.props
|
const { loading, disabled, dict } = this.state
|
|
if (type === 'preButton') {
|
if (btn.uuid !== triggerId) return
|
|
this.preTrigger(callback)
|
return
|
} else {
|
this.preCallback = null
|
}
|
|
if (loading || disabled) return
|
if (triggerId && btn.uuid !== triggerId) return
|
if (type === 'linkbtn' && !btn.$toolbtn && LID !== lid) return
|
if (btn.OpenType === 'form' && btn.formType === 'count_line') return
|
|
this.setState({autoMatic: type === 'autoMatic'})
|
|
let that = this
|
let data = record || selectedData || []
|
|
let valid = this.checkBtnData(data)
|
|
if (!valid) return
|
|
this.setState({
|
selines: data
|
})
|
|
if (btn.OpenType === 'formSubmit') {
|
this.setState({}, () => {
|
MKEmitter.emit('mkFormSubmit', btn.uuid)
|
})
|
} else if (btn.OpenType === 'prompt') {
|
this.setState({loading: true})
|
confirm({
|
title: btn.tipTitle || dict['exec_sure'] || '确定要执行吗?',
|
okText: dict['ok'] || '确定',
|
cancelText: dict['cancel'] || '取消',
|
onOk() {
|
return new Promise(resolve => {
|
that.execSubmit(data, resolve)
|
})
|
},
|
onCancel() {
|
that.setState({loading: false})
|
}
|
})
|
} else if (btn.OpenType === 'exec') {
|
this.setState({loading: true})
|
this.execSubmit(data, () => { this.setState({loading: false})})
|
} else if (btn.OpenType === 'pop') {
|
let modal = this.state.btnconfig
|
if (!modal && btn.modal) {
|
modal = this.handleModelConfig(btn.modal)
|
}
|
|
this.setState({
|
loading: true,
|
btnconfig: modal
|
}, () => {
|
this.improveAction()
|
})
|
} else if (btn.OpenType === 'form') {
|
if (btn.formType === 'counter') {
|
let item = {
|
type: 'number',
|
readin: true,
|
writein: true,
|
fieldlen: btn.decimal || 0,
|
key: btn.field,
|
value: this.state.count
|
}
|
this.execSubmit(data, () => {}, [item])
|
} else {
|
this.setState({
|
loading: true,
|
check: !this.state.check
|
}, () => {
|
let type = 'text'
|
let fieldlen = 50
|
let value = this.state.check ? btn.openVal : btn.closeVal
|
|
if (typeof(value) === 'number') {
|
type = 'number'
|
fieldlen = 0
|
}
|
|
let item = {
|
type: type,
|
readin: true,
|
writein: true,
|
fieldlen: fieldlen,
|
key: btn.field,
|
value: value
|
}
|
this.execSubmit(data, () => { this.setState({loading: false})}, [item])
|
})
|
}
|
}
|
|
// if (window.GLOB.systemType === 'production') {
|
// let _change = {
|
// prompt: '提示框',
|
// exec: '直接执行',
|
// pop: '弹窗(表单)',
|
// formSubmit: '表单',
|
// form: '表单',
|
// }
|
// MKEmitter.emit('queryTrigger', {menuId: btn.uuid, name: _change[btn.OpenType]})
|
// }
|
}
|
|
preTrigger = (callback) => {
|
const { btn, selectedData } = this.props
|
const { loading, disabled, dict } = this.state
|
|
if (loading || disabled) {
|
callback()
|
return
|
} else if (btn.OpenType === 'form') {
|
callback()
|
return
|
}
|
|
let that = this
|
let data = selectedData || []
|
|
let valid = this.checkBtnData(data)
|
|
if (!valid) {
|
callback()
|
return
|
}
|
|
this.preCallback = callback
|
|
this.setState({
|
selines: data
|
})
|
|
if (btn.OpenType === 'formSubmit') {
|
this.setState({}, () => {
|
MKEmitter.emit('mkFormSubmit', btn.uuid, callback)
|
})
|
} else if (btn.OpenType === 'prompt') {
|
this.setState({loading: true})
|
confirm({
|
title: btn.tipTitle || dict['exec_sure'] || '确定要执行吗?',
|
okText: dict['ok'] || '确定',
|
cancelText: dict['cancel'] || '取消',
|
onOk() {
|
return new Promise(resolve => {
|
that.execSubmit(data, resolve)
|
})
|
},
|
onCancel() {
|
callback()
|
that.setState({loading: false})
|
}
|
})
|
} else if (btn.OpenType === 'exec') {
|
this.setState({loading: true})
|
this.execSubmit(data, () => { this.setState({loading: false})})
|
} else if (btn.OpenType === 'pop') {
|
let modal = this.state.btnconfig
|
if (!modal && btn.modal) {
|
modal = this.handleModelConfig(btn.modal)
|
}
|
|
this.setState({
|
loading: true,
|
btnconfig: modal
|
})
|
|
if (modal) {
|
if (modal.setting.display === 'prompt' || modal.setting.display === 'exec') {
|
this.modelconfirm()
|
} else {
|
this.setState({
|
visible: true
|
})
|
}
|
}
|
}
|
}
|
|
/**
|
* @description 按钮状态改变
|
*/
|
updateStatus = () => {
|
this.setState({
|
loading: false,
|
visible: false,
|
confirmLoading: false
|
})
|
}
|
|
checkBtnData = (data) => {
|
const { BID, btn, setting } = this.props
|
const { dict } = this.state
|
|
if (setting.supModule && !BID) {
|
notification.warning({
|
top: 92,
|
message: dict['sup_key_req'] || '需要上级主键值!',
|
duration: 5
|
})
|
return false
|
} else if (btn.Ot !== 'notRequired' && data.length === 0) {
|
// 需要选择行时,校验数据
|
notification.warning({
|
top: 92,
|
message: dict['select_row'] || '请选择行!',
|
duration: 5
|
})
|
return false
|
} else if (btn.Ot === 'requiredSgl' && data.length !== 1) {
|
// 需要选择单行时,校验数据
|
notification.warning({
|
top: 92,
|
message: dict['select_single_row'] || '请选择单行数据!',
|
duration: 5
|
})
|
return false
|
} else if (btn.intertype === 'custom' && window.GLOB.systemType === 'production' && !btn.proInterface) {
|
notification.warning({
|
top: 92,
|
message: dict['no_prod_link'] || '尚未设置正式系统接口地址!',
|
duration: 5
|
})
|
return false
|
}
|
|
return true
|
}
|
|
getSystemParam = (data, formdata, retmsg) => {
|
const { setting, columns, btn } = this.props
|
let _params = []
|
|
if ( btn.Ot === 'notRequired' || btn.Ot === 'requiredSgl' || btn.Ot === 'requiredOnce' ) {
|
let param = { // 系统存储过程
|
func: 'sPC_TableData_InUpDe'
|
}
|
|
if (this.props.BID) {
|
param.BID = this.props.BID
|
}
|
|
let primaryId = ''
|
|
if (btn.Ot === 'requiredSgl' || btn.Ot === 'requiredOnce') {
|
let ids = data.map(d => d.$$uuid)
|
ids = ids.filter(Boolean)
|
primaryId = ids.join(',')
|
}
|
|
if (btn.OpenType === 'prompt' || btn.OpenType === 'exec') { // 是否弹框或直接执行
|
param.ID = primaryId
|
|
if (retmsg) {
|
const { sql, callbacksql } = getSysDefaultSql(btn, setting, '', param, data[0], columns, retmsg) // 数据源
|
param.LText = sql
|
param.$callbacksql = callbacksql
|
} else {
|
param.LText = getSysDefaultSql(btn, setting, '', param, data[0], columns, false) // 数据源
|
if (btn.output) {
|
param.key_back_type = 'Y'
|
}
|
}
|
|
param.exec_type = window.GLOB.execType || 'y' // 后台解码
|
param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
param.secretkey = Utils.encrypt('', param.timestamp)
|
|
if (/\$check@|@check\$/ig.test(param.LText)) {
|
if (btn.intertype === 'system') {
|
param.$unCheckParam = fromJS(param).toJS()
|
}
|
param.LText = param.LText.replace(/\$check@|@check\$/ig, '')
|
}
|
|
param.LText = Utils.formatOptions(param.LText, param.exec_type)
|
} else if (btn.OpenType === 'pop' || btn.OpenType === 'formSubmit' || btn.OpenType === 'form') { // 表单
|
if (btn.sqlType === 'insert') { // 系统函数添加时,生成uuid
|
param.ID = Utils.getguid()
|
|
if (retmsg) {
|
const { sql, callbacksql } = getSysDefaultSql(btn, setting, formdata, param, data[0], columns, retmsg) // 数据源
|
param.LText = sql
|
param.$callbacksql = callbacksql
|
} else {
|
param.LText = getSysDefaultSql(btn, setting, formdata, param, data[0], columns, false) // 数据源
|
if (btn.output) {
|
param.key_back_type = 'Y'
|
}
|
}
|
|
param.exec_type = window.GLOB.execType || 'y' // 后台解码
|
param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
param.secretkey = Utils.encrypt('', param.timestamp)
|
|
if (/\$check@|@check\$/ig.test(param.LText)) {
|
if (btn.intertype === 'system') {
|
param.$unCheckParam = fromJS(param).toJS()
|
}
|
param.LText = param.LText.replace(/\$check@|@check\$/ig, '')
|
}
|
|
param.LText = Utils.formatOptions(param.LText, param.exec_type)
|
} else {
|
param.ID = primaryId
|
|
if (retmsg) {
|
const { sql, callbacksql } = getSysDefaultSql(btn, setting, formdata, param, data[0], columns, retmsg) // 数据源
|
param.LText = sql
|
param.$callbacksql = callbacksql
|
} else {
|
param.LText = getSysDefaultSql(btn, setting, formdata, param, data[0], columns, false) // 数据源
|
if (btn.output) {
|
param.key_back_type = 'Y'
|
}
|
}
|
|
param.exec_type = window.GLOB.execType || 'y' // 后台解码
|
param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
param.secretkey = Utils.encrypt('', param.timestamp)
|
|
if (/\$check@|@check\$/ig.test(param.LText)) {
|
if (btn.intertype === 'system') {
|
param.$unCheckParam = fromJS(param).toJS()
|
}
|
param.LText = param.LText.replace(/\$check@|@check\$/ig, '')
|
}
|
|
param.LText = Utils.formatOptions(param.LText, param.exec_type)
|
}
|
}
|
|
if (window.GLOB.mkHS) { // 函数 sPC_TableData_InUpDe 云端验证
|
param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
|
}
|
|
param.menuname = btn.logLabel
|
|
if (window.GLOB.probation) {
|
param.s_debug_type = 'Y'
|
}
|
|
if (window.GLOB.breakpoint) {
|
param.func = 'sPC_TableData_InUpDe_debug'
|
}
|
|
if (param.$unCheckParam) {
|
param.$unCheckParam.LText = param.$unCheckParam.LText.replace(/\$check@/ig, '/*').replace(/@check\$/ig, '*/')
|
param.$unCheckParam.LText = Utils.formatOptions(param.$unCheckParam.LText, param.exec_type)
|
param.$unCheckParam.menuname = btn.logLabel
|
|
if (window.GLOB.probation) {
|
param.$unCheckParam.s_debug_type = 'Y'
|
}
|
}
|
|
_params.push(param)
|
} else if (btn.Ot === 'required') {
|
_params = data.map((cell, index) => {
|
let param = {
|
func: 'sPC_TableData_InUpDe'
|
}
|
|
if (this.props.BID) {
|
param.BID = this.props.BID
|
}
|
|
let primaryId = setting.primaryKey ? cell[setting.primaryKey] || '' : ''
|
|
if (btn.OpenType === 'prompt' || btn.OpenType === 'exec') { // 是否弹框或直接执行
|
param.ID = primaryId
|
|
if (retmsg) {
|
const { sql, callbacksql } = getSysDefaultSql(btn, setting, '', param, cell, columns, retmsg) // 数据源
|
param.LText = sql
|
param.$callbacksql = callbacksql
|
} else {
|
param.LText = getSysDefaultSql(btn, setting, '', param, cell, columns, false) // 数据源
|
if (btn.output) {
|
param.key_back_type = 'Y'
|
}
|
}
|
|
param.exec_type = window.GLOB.execType || 'y' // 后台解码
|
param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
param.secretkey = Utils.encrypt('', param.timestamp)
|
|
if (/\$check@|@check\$/ig.test(param.LText)) {
|
if (btn.intertype === 'system') {
|
param.$unCheckParam = fromJS(param).toJS()
|
}
|
param.LText = param.LText.replace(/\$check@|@check\$/ig, '')
|
}
|
|
param.LText = Utils.formatOptions(param.LText, param.exec_type)
|
} else if (btn.OpenType === 'pop') { // 表单
|
if (index !== 0) {
|
let _cell = {}
|
Object.keys(cell).forEach(key => {
|
_cell[key.toLowerCase()] = cell[key]
|
})
|
formdata = formdata.map(_data => {
|
if (_data.readin && _cell.hasOwnProperty(_data.key.toLowerCase())) {
|
_data.value = _cell[_data.key.toLowerCase()]
|
}
|
return _data
|
})
|
}
|
|
if (btn.sqlType === 'insert') { // 系统函数添加时,生成uuid
|
param.ID = Utils.getguid()
|
|
if (retmsg) {
|
const { sql, callbacksql } = getSysDefaultSql(btn, setting, formdata, param, cell, columns, retmsg) // 数据源
|
param.LText = sql
|
param.$callbacksql = callbacksql
|
} else {
|
param.LText = getSysDefaultSql(btn, setting, formdata, param, cell, columns, false) // 数据源
|
if (btn.output) {
|
param.key_back_type = 'Y'
|
}
|
}
|
|
param.exec_type = window.GLOB.execType || 'y' // 后台解码
|
param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
param.secretkey = Utils.encrypt('', param.timestamp)
|
|
if (/\$check@|@check\$/ig.test(param.LText)) {
|
if (btn.intertype === 'system') {
|
param.$unCheckParam = fromJS(param).toJS()
|
}
|
param.LText = param.LText.replace(/\$check@|@check\$/ig, '')
|
}
|
|
param.LText = Utils.formatOptions(param.LText, param.exec_type)
|
} else {
|
param.ID = primaryId
|
|
if (retmsg) {
|
const { sql, callbacksql } = getSysDefaultSql(btn, setting, formdata, param, cell, columns, retmsg) // 数据源
|
param.LText = sql
|
param.$callbacksql = callbacksql
|
} else {
|
param.LText = getSysDefaultSql(btn, setting, formdata, param, cell, columns, false) // 数据源
|
if (btn.output) {
|
param.key_back_type = 'Y'
|
}
|
}
|
|
param.exec_type = window.GLOB.execType || 'y' // 后台解码
|
param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
param.secretkey = Utils.encrypt('', param.timestamp)
|
|
if (/\$check@|@check\$/ig.test(param.LText)) {
|
if (btn.intertype === 'system') {
|
param.$unCheckParam = fromJS(param).toJS()
|
}
|
param.LText = param.LText.replace(/\$check@|@check\$/ig, '')
|
}
|
|
param.LText = Utils.formatOptions(param.LText, param.exec_type)
|
}
|
}
|
|
if (window.GLOB.mkHS) { // 函数 sPC_TableData_InUpDe 云端验证
|
param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
|
}
|
|
param.menuname = btn.logLabel
|
if (window.GLOB.probation) {
|
param.s_debug_type = 'Y'
|
}
|
|
if (window.GLOB.breakpoint) {
|
param.func = 'sPC_TableData_InUpDe_debug'
|
}
|
|
if (param.$unCheckParam) {
|
param.$unCheckParam.LText = param.$unCheckParam.LText.replace(/\$check@/ig, '/*').replace(/@check\$/ig, '*/')
|
param.$unCheckParam.LText = Utils.formatOptions(param.$unCheckParam.LText, param.exec_type)
|
param.$unCheckParam.menuname = btn.logLabel
|
|
if (window.GLOB.probation) {
|
param.$unCheckParam.s_debug_type = 'Y'
|
}
|
}
|
|
return param
|
})
|
}
|
|
return _params
|
}
|
|
getBackSystemParam = (data, formdata) => {
|
const { btn } = this.props
|
|
let ex = window.GLOB.CacheData.get('sql_' + btn.uuid)
|
let _params = []
|
|
if (btn.Ot === 'notRequired' || btn.Ot === 'requiredSgl' || btn.Ot === 'requiredOnce') {
|
let primaryId = ''
|
let cell = null
|
|
if (btn.Ot === 'requiredSgl' || btn.Ot === 'requiredOnce') {
|
primaryId = data.map(d => d.$$uuid).filter(Boolean).join(',')
|
cell = data[0]
|
}
|
|
if (btn.OpenType === 'pop' || btn.OpenType === 'formSubmit' || btn.OpenType === 'form') { // 表单
|
if (btn.sqlType === 'insert') { // 系统函数添加时,生成uuid
|
primaryId = Utils.getguid()
|
}
|
}
|
|
let exp = this.getExps(ex, formdata, cell, primaryId, btn.$process)
|
|
if (ex.reps.includes('mk_check_begin')) {
|
exp.$unCheckParam = fromJS(exp).toJS()
|
|
exp.data[0].exps.push({
|
key: 'mk_check_begin',
|
value: ''
|
}, {
|
key: 'mk_check_end',
|
value: ''
|
})
|
exp.$unCheckParam.data[0].exps.push({
|
key: 'mk_check_begin',
|
value: 'Y'
|
}, {
|
key: 'mk_check_end',
|
value: 'Y'
|
})
|
} else if (btn.procMode === 'system' && btn.callbackType === 'script') {
|
let _backex = window.GLOB.CacheData.get('sql_back_' + btn.uuid)
|
exp.$backParam = this.getExps(_backex, formdata, cell, primaryId)
|
}
|
|
_params.push(exp)
|
} else if (btn.Ot === 'required') {
|
_params = data.map((cell, index) => {
|
let primaryId = cell.$$uuid || ''
|
|
if (btn.OpenType === 'pop') { // 表单
|
if (index !== 0) {
|
let _cell = {}
|
Object.keys(cell).forEach(key => {
|
_cell[key.toLowerCase()] = cell[key]
|
})
|
formdata = formdata.map(_data => {
|
if (_data.readin && _cell.hasOwnProperty(_data.key.toLowerCase())) {
|
_data.value = _cell[_data.key.toLowerCase()]
|
}
|
return _data
|
})
|
}
|
|
if (btn.sqlType === 'insert') { // 系统函数添加时,生成uuid
|
primaryId = Utils.getguid()
|
}
|
}
|
let exp = this.getExps(ex, formdata, cell, primaryId, btn.$process)
|
if (ex.reps.includes('mk_check_begin')) {
|
exp.$unCheckParam = fromJS(exp).toJS()
|
|
exp.data[0].exps.push({
|
key: 'mk_check_begin',
|
value: ''
|
}, {
|
key: 'mk_check_end',
|
value: ''
|
})
|
exp.$unCheckParam.data[0].exps.push({
|
key: 'mk_check_begin',
|
value: 'Y'
|
}, {
|
key: 'mk_check_end',
|
value: 'Y'
|
})
|
} else if (btn.procMode === 'system' && btn.callbackType === 'script') {
|
let _backex = window.GLOB.CacheData.get('sql_back_' + btn.uuid)
|
exp.$backParam = this.getExps(_backex, formdata, cell, primaryId)
|
}
|
|
return exp
|
})
|
}
|
|
return _params
|
}
|
|
getExps = (ex, formdata, cell, id, process) => {
|
const { columns, BID, btn } = this.props
|
let exps = []
|
let values = {
|
time_id: Utils.getguid(),
|
roleid: sessionStorage.getItem('role_id') || '',
|
mk_departmentcode: sessionStorage.getItem('departmentcode') || '',
|
mk_organization: sessionStorage.getItem('organization') || '',
|
mk_user_type: sessionStorage.getItem('mk_user_type') || '',
|
mk_nation: sessionStorage.getItem('nation') || '',
|
mk_province: sessionStorage.getItem('province') || '',
|
mk_city: sessionStorage.getItem('city') || '',
|
mk_district: sessionStorage.getItem('district') || '',
|
mk_address: sessionStorage.getItem('address') || '',
|
id: id || '',
|
bid: BID || '',
|
typename: 'admin',
|
datam: sessionStorage.getItem('dataM') === 'true' ? 'Y' : '',
|
datam_begin: sessionStorage.getItem('dataM') === 'true' ? 'Y' : '',
|
datam_end: sessionStorage.getItem('dataM') === 'true' ? 'Y' : '',
|
// mk_check_begin: '',
|
// mk_check_end: ''
|
}
|
|
if (window.GLOB.externalDatabase !== null) {
|
values.db = window.GLOB.externalDatabase
|
}
|
|
let formkeys = []
|
formdata && formdata.forEach(form => {
|
// if (!ex.reps.includes(form.key)) return
|
|
formkeys.push(form.key)
|
|
let val = form.value
|
if (form.type === 'number' || form.type === 'rate') {
|
if (isNaN(val)) {
|
val = 0
|
}
|
} else if (['date', 'datemonth'].includes(form.type)) {
|
val = val || '1949-10-01'
|
}
|
|
exps.push({
|
key: 'mk_' + form.key + '_mk',
|
value: val
|
})
|
})
|
|
if (cell && columns && columns.length > 0) {
|
let datavars = {}
|
|
Object.keys(cell).forEach(key => {
|
datavars[key.toLowerCase()] = cell[key]
|
})
|
|
columns.forEach(col => {
|
if (!ex.reps.includes(col.field) || formkeys.includes(col.field)) return
|
if (!col.datatype) return
|
|
let _key = col.field.toLowerCase()
|
let _val = datavars.hasOwnProperty(_key) ? datavars[_key] : ''
|
|
if (/^date/ig.test(col.datatype) && !_val) {
|
_val = '1949-10-01'
|
}
|
|
exps.push({
|
key: 'mk_' + col.field + '_mk',
|
value: _val
|
})
|
})
|
}
|
|
ex.reps.forEach(n => {
|
let key = n.toLowerCase()
|
if (values.hasOwnProperty(key)) {
|
exps.push({
|
key: n,
|
value: values[key]
|
})
|
}
|
})
|
|
if (process && btn.verify.workFlow === 'true') {
|
let flow = window.GLOB.UserCacheMap.get(btn.$flowId)
|
let node = null
|
let line = null
|
let target = null
|
let status = 0
|
let statusName = ''
|
let detailId = ''
|
let sign = ''
|
let error = ''
|
let userid = sessionStorage.getItem('UserID') || ''
|
let checkIds = []
|
let checkUsers = []
|
let noticeIds = []
|
let work_grade = sessionStorage.getItem('work_grade') || 0
|
let departmentcode = sessionStorage.getItem('departmentcode') || ''
|
let _data = cell || {}
|
let msg = ''
|
|
if (btn.verify.flowType === 'start') {
|
target = flow ? flow.cells.filter(cell => cell.mknode === 'start')[0] : ''
|
|
if (target) {
|
detailId = target.id
|
status = target.mkdata.status
|
statusName = target.mkdata.statusName
|
} else {
|
error = '工作流无开始节点'
|
}
|
} else if (_data.works_flow_param) {
|
try {
|
node = JSON.parse(window.decodeURIComponent(window.atob(_data.works_flow_param)))
|
} catch (e) {
|
node = null
|
}
|
|
if (node) {
|
let lines = flow ? flow.cells.filter(cell => cell.shape === 'edge' && cell.source.cell === node.id) : []
|
if (btn.verify.flowType === 'reject') {
|
line = lines.filter(cell => cell.mkdata.flowType === 'reject' || cell.mknode === 'startEdge')[0]
|
} else {
|
lines = lines.filter(cell => cell.mkdata.flowType !== 'reject' && cell.mknode !== 'startEdge')
|
|
if (lines.length === 0) {
|
error = '无可执行的流程分支'
|
} else {
|
let branchKey = btn.verify.flowBranch ? btn.verify.flowBranch.toLowerCase() : ''
|
|
formdata && formdata.forEach(form => {
|
let _key = form.key.toLowerCase()
|
_data[_key] = form.value
|
})
|
|
if (!branchKey) {
|
lines.forEach(line => {
|
if (line.mkdata.execCondition === 'open') {
|
error = '按钮未设置流程控制字段。'
|
}
|
})
|
if (!error) {
|
lines = lines.filter(cell => {
|
if (cell.mkdata.seniorCondition === 'open' && !line) {
|
cell.mkdata.seniorbers && cell.mkdata.seniorbers.forEach(per => {
|
if (per.worker_id === userid) {
|
line = cell
|
}
|
})
|
return false
|
}
|
return true
|
})
|
|
if (!line) {
|
line = lines[0]
|
}
|
}
|
} else if (!_data.hasOwnProperty(branchKey)) {
|
error = '信息中无流程控制字段。'
|
} else {
|
let _def_lines = []
|
let _equ_lines = []
|
let _unequ_lines = []
|
let _or_lines = []
|
let branchVal = _data[branchKey]
|
|
if (branchVal && typeof(branchVal) === 'string' && !isNaN(branchVal)) {
|
branchVal = +branchVal
|
}
|
|
lines.forEach(item => {
|
if (item.mkdata.execCondition !== 'open') {
|
_def_lines.push(item)
|
} else {
|
if (item.mkdata.match === '=') {
|
if (item.mkdata.matchVal === branchVal + '') {
|
_equ_lines.push(item)
|
}
|
} else if (item.mkdata.match === '!=') {
|
if (item.mkdata.matchVal !== branchVal + '') {
|
_unequ_lines.push(item)
|
}
|
} else {
|
if (item.mkdata.match === '<') {
|
if (item.mkdata.matchVal < branchVal) {
|
_or_lines.push({...item, dist: Math.abs(item.mkdata.matchVal - branchVal)})
|
}
|
} else if (item.mkdata.match === '>') {
|
if (item.mkdata.matchVal > branchVal) {
|
_or_lines.push({...item, dist: Math.abs(item.mkdata.matchVal - branchVal)})
|
}
|
} else if (item.mkdata.match === '<=') {
|
if (item.mkdata.matchVal <= branchVal) {
|
_or_lines.push({...item, dist: Math.abs(item.mkdata.matchVal - branchVal)})
|
}
|
} else if (item.mkdata.match === '>=') {
|
if (item.mkdata.matchVal >= branchVal) {
|
_or_lines.push({...item, dist: Math.abs(item.mkdata.matchVal - branchVal)})
|
}
|
}
|
}
|
}
|
})
|
|
_or_lines.sort((a, b) => a.dist - b.dist)
|
|
let _lines = [..._equ_lines, ..._or_lines, ..._unequ_lines, ..._def_lines]
|
|
_lines = _lines.filter(cell => {
|
if (cell.mkdata.seniorCondition === 'open' && !line) {
|
cell.mkdata.seniorbers && cell.mkdata.seniorbers.forEach(per => {
|
if (per.worker_id === userid) {
|
line = cell
|
}
|
})
|
return false
|
}
|
return true
|
})
|
|
if (!line) {
|
line = _lines[0]
|
}
|
}
|
}
|
}
|
} else {
|
error = '行信息中工作流参数无法解析'
|
}
|
|
if (line) {
|
detailId = line.id
|
status = line.mkdata.status
|
statusName = line.mkdata.statusName
|
sign = line.mkdata.seniorSign || ''
|
target = flow.cells.filter(cell => cell.id === line.target.cell)[0]
|
|
line.mkdata.members && line.mkdata.members.forEach(item => {
|
if (line.mkdata.approver === 'departmentManager') {
|
if (item.job_type === 'manage' && departmentcode === item.parentIds[1]) {
|
checkIds.push(item.worker_id)
|
checkUsers.push(item)
|
}
|
} else if (line.mkdata.approver === 'directManager') {
|
if (departmentcode === item.parentIds[1] && item.work_grade > work_grade) {
|
checkIds.push(item.worker_id)
|
checkUsers.push(item)
|
}
|
} else {
|
checkIds.push(item.worker_id)
|
checkUsers.push(item)
|
}
|
})
|
line.mkdata.copys && line.mkdata.copys.forEach(item => {
|
noticeIds.push(item.worker_id)
|
})
|
|
if (!target) {
|
error = '未查询到工作流目标节点'
|
} else if (checkIds.length === 0 && !['startEdge', 'endEdge', 'throughEdge'].includes(line.mknode)) {
|
error = '未获取到下一步审批人'
|
} else if (line.approvalMethod === 'countersign' && (!node.checkIds || !node.checkIds.includes(userid))) {
|
error = '当前用户不在审批人列表中'
|
}
|
} else if (!error) {
|
error = '工作流中无对应流程'
|
}
|
} else {
|
error = '行信息中无工作流参数'
|
}
|
|
if (error) {
|
status = 0
|
statusName = '异常'
|
} else if (target) {
|
let label = target.attrs && target.attrs.text && target.attrs.text.text ? target.attrs.text.text : ''
|
msg = {...target.mkdata, label: label, id: target.id, checkIds: [], checkUsers: []}
|
msg = window.btoa(window.encodeURIComponent(JSON.stringify(msg)))
|
}
|
|
if (btn.verify.flowType === 'start') {
|
exps.push(
|
{ key: 'works_flow_error', value: error },
|
{ key: 'works_flow_code', value: flow ? flow.flow_code : '' },
|
{ key: 'works_flow_name', value: flow ? flow.flow_name : '' },
|
{ key: 'works_flow_param', value: msg },
|
{ key: 'works_flow_detail_id', value: detailId },
|
{ key: 'status', value: status },
|
{ key: 'statusname', value: statusName },
|
{ key: 'work_group', value: sessionStorage.getItem('work_group') || '' },
|
{ key: 'work_grade', value: sessionStorage.getItem('work_grade') || 0 },
|
// { key: 'start_type', value: '开始' },
|
)
|
} else {
|
let works_flow_countersign = ''
|
let works_flow_sign_values = ''
|
let works_flow_sign_field = ''
|
let works_flow_sign_label = ''
|
let works_begin_branch = ''
|
if (line.approvalMethod === 'countersign' && node.checkIds.length > 1) {
|
works_flow_countersign = 'Y'
|
let mark = line.mark || '已审核'
|
let fields = ['statuscharone', 'statuschartwo', 'statuscharthree', 'statuscharfour', 'statuscharfive']
|
node.checkUsers.forEach((user, index) => {
|
if (user.worker_id === userid) {
|
works_flow_sign_field = fields[index]
|
works_flow_sign_label = `${user.parentNames[2] || ''}${user.workername || ''}${mark}`
|
} else {
|
works_flow_sign_values += `${user.parentNames[2] || ''}${user.workername || ''}${mark}`
|
}
|
})
|
} else {
|
works_begin_branch = line.mknode === 'startEdge' ? 'Y' : ''
|
}
|
|
exps.push(
|
{ key: 'works_flow_error', value: error },
|
{ key: 'works_flow_countersign', value: works_flow_countersign },
|
{ key: 'works_flow_sign_values', value: works_flow_sign_values },
|
{ key: 'works_begin_branch', value: works_begin_branch },
|
{ key: 'works_flow_sign_field', value: works_flow_sign_field },
|
{ key: 'works_flow_sign_label', value: works_flow_sign_label },
|
{ key: 'works_flow_code', value: flow ? flow.flow_code : '' },
|
{ key: 'works_flow_name', value: flow ? flow.flow_name : '' },
|
{ key: 'works_flow_param', value: msg },
|
{ key: 'works_flow_detail_id', value: detailId },
|
{ key: 'status', value: status },
|
{ key: 'statusname', value: statusName },
|
{ key: 'work_group', value: sessionStorage.getItem('work_group') || '' },
|
{ key: 'work_grade', value: sessionStorage.getItem('work_grade') || 0 },
|
// { key: 'check_type', value: btn.verify.flowType === 'reject' ? '驳回' : '审核' },
|
// { key: 'notice_type', value: '抄送' },
|
{ key: 'check_userids', value: checkIds.join(',') },
|
{ key: 'notice_userids', value: noticeIds.join(',') },
|
{ key: 'works_flow_sign', value: sign },
|
)
|
}
|
}
|
|
let md5_id = ''
|
if (window.GLOB.probation) {
|
md5_id = md5(ex.id + JSON.stringify(exps) + Math.floor(new Date().getTime() / 600000))
|
md5_id = moment().format('YYYYMMDDHHmmss') + md5_id.slice(-18)
|
}
|
|
return {
|
$backend: true,
|
$type: 's_TableData_InUpDe',
|
data: [{
|
id: ex.id,
|
menuname: btn.logLabel || '',
|
exps: exps,
|
md5_id: md5_id
|
}]
|
}
|
}
|
|
getInnerParam = (data, formdata, retmsg) => {
|
const { setting, btn, columns } = this.props
|
let _params = []
|
|
if ( btn.Ot === 'notRequired' || btn.Ot === 'requiredSgl' || btn.Ot === 'requiredOnce' ) {
|
let param = {}
|
|
if (btn.innerFunc) {
|
param.func = btn.innerFunc
|
}
|
|
if (this.props.BID) {
|
param.BID = this.props.BID
|
}
|
|
if (btn.recordUser === 'true') {
|
param.username = sessionStorage.getItem('User_Name') || ''
|
param.fullname = sessionStorage.getItem('Full_Name') || ''
|
}
|
if (btn.dataM === 'true') {
|
param.dataM = sessionStorage.getItem('dataM') === 'true' ? 'Y' : ''
|
}
|
|
let primaryId = ''
|
|
if ((btn.Ot === 'requiredSgl' || btn.Ot === 'requiredOnce') && setting.primaryKey) {
|
let ids = data.map(d => d.$$uuid)
|
ids = ids.filter(Boolean)
|
primaryId = ids.join(',')
|
|
param[setting.primaryKey] = primaryId // 设置主键参数
|
}
|
|
if (btn.OpenType === 'pop' || btn.OpenType === 'formSubmit' || btn.OpenType === 'form') { // 表单
|
formdata.forEach(_data => {
|
param[_data.key] = _data.value
|
})
|
}
|
|
if (window.GLOB.mkHS && param.func === 's_sDataDictb_TBBack' && param.LTextOut) { // special 函数 s_sDataDictb_TBBack 云端验证
|
param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
param.secretkey = Utils.encrypt(param.LTextOut, param.timestamp)
|
param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
|
}
|
|
if (btn.callbackType === 'script' && window.backend && window.GLOB.CacheData.has('sql_back_' + btn.uuid)) {
|
let _backex = window.GLOB.CacheData.get('sql_back_' + btn.uuid)
|
param.$backParam = this.getExps(_backex, formdata, data[0], primaryId)
|
} else if (retmsg) {
|
param.$callbacksql = this.getSysDeclareSql(btn, formdata, data[0], columns, this.props.BID)
|
}
|
|
_params.push(param)
|
} else if (btn.Ot === 'required') {
|
_params = data.map((cell, index) => {
|
let param = {
|
func: btn.innerFunc
|
}
|
|
if (this.props.BID) {
|
param.BID = this.props.BID
|
}
|
|
if (btn.recordUser === 'true') {
|
param.username = sessionStorage.getItem('User_Name') || ''
|
param.fullname = sessionStorage.getItem('Full_Name') || ''
|
}
|
if (btn.dataM === 'true') {
|
param.dataM = sessionStorage.getItem('dataM') === 'true' ? 'Y' : ''
|
}
|
|
let primaryId = cell.$$uuid || ''
|
|
if (btn.OpenType === 'pop') { // 表单
|
if (index !== 0) {
|
let _cell = {}
|
Object.keys(cell).forEach(key => {
|
_cell[key.toLowerCase()] = cell[key]
|
})
|
formdata = formdata.map(_data => {
|
if (_data.readin && _cell.hasOwnProperty(_data.key.toLowerCase())) {
|
_data.value = _cell[_data.key.toLowerCase()]
|
}
|
return _data
|
})
|
}
|
|
formdata.forEach(_data => {
|
param[_data.key] = _data.value
|
})
|
}
|
if (setting.primaryKey) {
|
param[setting.primaryKey] = primaryId
|
}
|
|
if (window.GLOB.mkHS && param.func === 's_sDataDictb_TBBack' && param.LTextOut) { // special 函数 s_sDataDictb_TBBack 云端验证
|
param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
param.secretkey = Utils.encrypt(param.LTextOut, param.timestamp)
|
param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
|
}
|
|
if (btn.callbackType === 'script' && window.backend && window.GLOB.CacheData.has('sql_back_' + btn.uuid)) {
|
let _backex = window.GLOB.CacheData.get('sql_back_' + btn.uuid)
|
param.$backParam = this.getExps(_backex, formdata, cell, primaryId)
|
} else if (retmsg) {
|
param.$callbacksql = this.getSysDeclareSql(btn, formdata, cell, columns, this.props.BID)
|
}
|
|
return param
|
})
|
}
|
|
return _params
|
}
|
|
/**
|
* @description 获取回调脚本的字段定义
|
*/
|
getSysDeclareSql = (btn, formdata, data, columns, BID = '') => {
|
let datavars = {} // 声明的变量,表单及显示列
|
// 需要声明的变量集
|
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']
|
|
// sql语句
|
let _sql = ''
|
|
let _initvars = [] // 已赋值字段集
|
let _initFormfields = []
|
let _initColfields = []
|
let _declarefields = []
|
|
// 获取字段键值对
|
formdata && formdata.forEach(form => {
|
let _key = form.key.toLowerCase()
|
datavars[_key] = form.value
|
|
if (!_initvars.includes(_key)) {
|
_initvars.push(_key)
|
let val = form.value
|
|
if (form.type === 'number' || form.type === 'rate') {
|
if (isNaN(val)) {
|
val = 0
|
}
|
_initFormfields.push(`@${_key}=${val}`)
|
} else if (['date', 'datemonth'].includes(form.type)) {
|
_initFormfields.push(`@${_key}='${val || '1949-10-01'}'`)
|
} else {
|
if (/'/.test(val)) {
|
val = val.replace(/'/ig, '"')
|
}
|
if (form.isconst) {
|
_initFormfields.push(`@${_key}=N'${val}'`)
|
} else {
|
_initFormfields.push(`@${_key}='${val}'`)
|
}
|
}
|
}
|
|
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)`
|
}
|
|
_declarefields.push(`@${_key} ${_type}`)
|
}
|
})
|
|
let _data = {}
|
if (data) {
|
Object.keys(data).forEach(key => {
|
_data[key.toLowerCase()] = data[key]
|
})
|
}
|
|
// 添加数据中字段,表单值优先(按钮不选行或多行拼接时跳过)
|
if (data && btn.Ot !== 'notRequired' && columns && columns.length > 0) {
|
datavars = {..._data, ...datavars}
|
|
const setField = (col) => {
|
if (!col.field) return
|
let _key = col.field.toLowerCase()
|
|
if (!_initvars.includes(_key)) {
|
let _val = datavars.hasOwnProperty(_key) ? datavars[_key] : ''
|
|
if (col.datatype && /^date/ig.test(col.datatype) && !_val) {
|
_val = '1949-10-01'
|
}
|
|
if (/'/.test(_val)) {
|
_val = _val.replace(/'/ig, '"')
|
}
|
|
_initvars.push(_key)
|
_initColfields.push(`@${_key}='${_val}'`)
|
}
|
|
if (!_vars.includes(_key)) {
|
_vars.push(_key)
|
|
if (col.datatype) {
|
_declarefields.push(`@${_key} ${col.datatype}`)
|
} else {
|
if (col.fieldlength && col.fieldlength > 4000) {
|
col.fieldlength = 'max'
|
}
|
|
let _type = `nvarchar(${col.fieldlength || 50})`
|
|
if (col.type === 'number') {
|
let _length = col.decimal ? col.decimal : 0
|
_type = `decimal(18,${_length})`
|
} else if (col.type === 'picture' || col.type === 'textarea') {
|
_type = `nvarchar(${col.fieldlength || 512})`
|
}
|
|
_declarefields.push(`@${_key} ${_type}`)
|
}
|
}
|
}
|
|
columns.forEach(col => {
|
if (col.type === 'colspan' || col.type === 'old_colspan') {
|
col.subcols.forEach(cell => {
|
setField(cell)
|
})
|
} else {
|
setField(col)
|
}
|
})
|
}
|
|
// 变量声明
|
_declarefields = _declarefields.join(',')
|
if (_declarefields) {
|
_declarefields = ',' + _declarefields
|
}
|
_sql = `/* 系统生成 */
|
Declare @tbid nvarchar(50),@ErrorCode nvarchar(50),@retmsg nvarchar(4000),@BillCode nvarchar(50),@BVoucher nvarchar(50),@FIBVoucherDate nvarchar(50), @FiYear nvarchar(50),@ModularDetailCode nvarchar(50), @UserName nvarchar(50),@FullName nvarchar(50),@RoleID nvarchar(512),@mk_departmentcode nvarchar(512),@mk_organization nvarchar(512),@mk_user_type nvarchar(20),@mk_nation nvarchar(50),@mk_province nvarchar(50),@mk_city nvarchar(50),@mk_district nvarchar(50),@mk_address nvarchar(100),@mk_deleted int,@bid nvarchar(50)${_declarefields}
|
`
|
|
let userName = sessionStorage.getItem('User_Name') || ''
|
let fullName = sessionStorage.getItem('Full_Name') || ''
|
let RoleID = sessionStorage.getItem('role_id') || ''
|
let departmentcode = sessionStorage.getItem('departmentcode') || ''
|
let organization = sessionStorage.getItem('organization') || ''
|
let mk_user_type = sessionStorage.getItem('mk_user_type') || ''
|
let nation = sessionStorage.getItem('nation') || ''
|
let province = sessionStorage.getItem('province') || ''
|
let city = sessionStorage.getItem('city') || ''
|
let district = sessionStorage.getItem('district') || ''
|
let address = sessionStorage.getItem('address') || ''
|
|
// 初始化凭证及用户信息字段
|
_sql += `
|
/* 凭证及用户信息初始化赋值 */
|
select @BVoucher='',@FIBVoucherDate='',@FiYear='',@ErrorCode='',@retmsg='',@UserName='${userName}', @FullName='${fullName}', @RoleID='${RoleID}', @mk_departmentcode='${departmentcode}', @mk_organization='${organization}', @mk_user_type='${mk_user_type}', @mk_nation='${nation}', @mk_province='${province}', @mk_city='${city}', @mk_district='${district}', @mk_address='${address}', @mk_deleted=1, @bid='${BID}', @BillCode='', @ModularDetailCode=''
|
`
|
|
// 表单变量赋值
|
if (_initFormfields.length > 0) {
|
_sql += `
|
/* 表单变量赋值 */
|
select ${_initFormfields.join(',')}
|
`
|
}
|
// 显示列变量赋值
|
if (_initColfields.length > 0) {
|
_sql += `
|
/* 显示列变量赋值 */
|
select ${_initColfields.join(',')}
|
`
|
}
|
|
return _sql
|
}
|
|
/**
|
* @description 按钮提交执行
|
*/
|
execSubmit = (data, _resolve, formdata, force) => {
|
const { btn } = this.props
|
|
if (btn.preButton && !force) {
|
this.trigger(btn.preButton, data, _resolve, formdata, 0)
|
} else {
|
this.execRealSubmit(data, _resolve, formdata)
|
}
|
}
|
|
trigger = (btnId, data, resolve, formdata, times) => {
|
if (times > 50) {
|
notification.warning({
|
top: 92,
|
message: window.GLOB.dict['pre_btn_failed'] || '前置按钮加载失败!',
|
duration: 5
|
})
|
this.setState({loading: false})
|
resolve()
|
return
|
}
|
times++
|
|
let node = document.getElementById('button' + btnId)
|
|
if (node) {
|
MKEmitter.emit('triggerBtnId', btnId, null, 'preButton', null, (res) => {
|
if (!res) {
|
this.setState({loading: false})
|
resolve()
|
return
|
}
|
|
if (res.status) {
|
this.execSubmit(data, resolve, formdata, true)
|
} else {
|
this.execError(res)
|
}
|
})
|
} else {
|
setTimeout(() => {
|
this.trigger(btnId, data, resolve, formdata, times)
|
}, 100)
|
}
|
}
|
|
execRealSubmit = (data, _resolve, formdata) => {
|
const { setting, btn, BID } = this.props
|
|
if (setting.supModule && !BID) {
|
notification.warning({
|
top: 92,
|
message: window.GLOB.dict['sup_key_req'] || '需要上级主键值!',
|
duration: 5
|
})
|
_resolve()
|
return
|
}
|
|
if (btn.intertype === 'system' || btn.intertype === 'inner') { // 系统接口
|
let params = []
|
|
if (btn.intertype === 'system' && window.backend && window.GLOB.CacheData.has('sql_' + btn.uuid)) {
|
params = this.getBackSystemParam(data, formdata)
|
} else if (btn.intertype === 'system') {
|
params = this.getSystemParam(data, formdata)
|
if (btn.returnValue === 'true') {
|
params = params.map(item => {
|
item.script_type = 'Y'
|
return item
|
})
|
}
|
if (btn.database === 'sso' && window.GLOB.mainSystemApi) {
|
params = params.map(item => {
|
item.rduri = window.GLOB.mainSystemApi
|
return item
|
})
|
}
|
} else {
|
params = this.getInnerParam(data, formdata)
|
}
|
|
if (params[0].$unCheckParam) {
|
this.checkLoopRequest(params, _resolve)
|
} else if (btn.preFunc && params.length === 1) {
|
let param = params[0]
|
let _param = fromJS(param).toJS()
|
_param.func = btn.preFunc
|
|
Api.genericInterface(_param).then(res => {
|
if (res.status) {
|
if (res.ErrCode !== '-1') {
|
param = {...param, ...res}
|
|
delete param.status
|
delete param.ErrCode
|
delete param.ErrMesg
|
delete param.message
|
|
setTimeout(() => {
|
Api.genericInterface(param).then(result => {
|
if (!result.status) {
|
notification.warning({
|
top: 92,
|
message: result.message,
|
duration: 5
|
})
|
}
|
})
|
}, 600)
|
}
|
|
this.triggerNote(res, _param.ID) // 消息
|
this.execSuccess(res)
|
} else {
|
this.execError(res)
|
}
|
_resolve()
|
}, (error) => {
|
if (error && error.ErrCode === 'LoginError') return
|
this.updateStatus()
|
_resolve()
|
})
|
} else if (params.length <= 20 && btn.execType !== 'single') {
|
if (window.backend && params[0].$backend && (!btn.verify || (btn.verify.printEnable !== 'true' && !btn.output))) {
|
params = [{
|
$backend: true,
|
$type: 's_TableData_InUpDe',
|
data: params.map(item => item.data[0])
|
}]
|
}
|
|
let deffers = params.map((param, i) => {
|
return new Promise(resolve => {
|
setTimeout(() => {
|
Api.genericInterface(param).then(res => {
|
if (res.status) {
|
this.triggerNote(res, param.ID) // 消息
|
}
|
resolve(res)
|
}, (error) => {
|
if (error && error.ErrCode === 'LoginError') return
|
this.updateStatus()
|
_resolve()
|
})
|
}, 100 * i)
|
})
|
})
|
Promise.all(deffers).then(result => {
|
let iserror = false
|
let errorMsg = ''
|
result.forEach(res => {
|
if (iserror) return
|
if (res.status) {
|
errorMsg = res
|
} else {
|
iserror = true
|
errorMsg = res
|
}
|
})
|
if (!iserror) {
|
this.execSuccess(errorMsg)
|
} else {
|
this.execError(errorMsg)
|
}
|
_resolve()
|
})
|
} else { // 超出20个请求时循环执行
|
if (btn.progress === 'progressbar' && params.length > 1) {
|
this.setState({
|
loadingTotal: params.length
|
})
|
}
|
this.innerLoopRequest(params, btn, _resolve)
|
}
|
} else if (btn.intertype === 'outer') {
|
/** *********************调用外部接口************************* */
|
let _params = [] // 请求参数数组
|
|
if (btn.procMode === 'system' && window.backend && window.GLOB.CacheData.has('sql_' + btn.uuid)) {
|
_params = this.getBackSystemParam(data, formdata)
|
} else if (btn.procMode === 'system') {
|
_params = this.getSystemParam(data, formdata, true)
|
_params = _params.map(item => {
|
item.script_type = 'Y'
|
return item
|
})
|
} else {
|
_params = this.getInnerParam(data, formdata, btn.callbackType === 'script')
|
}
|
|
if (_params.length > 1 && btn.progress === 'progressbar') {
|
this.setState({
|
loadingTotal: _params.length
|
})
|
}
|
|
// 循环调用外部接口(包括内部及回调函数)
|
this.outerLoopRequest(_params, _resolve)
|
} else if (btn.intertype === 'custom') { // 系统接口
|
let params = []
|
|
if (btn.procMode === 'system' && window.backend && window.GLOB.CacheData.has('sql_' + btn.uuid)) {
|
params = this.getBackSystemParam(data, formdata)
|
} else if (btn.procMode === 'system') {
|
params = this.getSystemParam(data, formdata, true)
|
params = params.map(item => {
|
item.script_type = 'Y'
|
return item
|
})
|
} else {
|
params = this.getInnerParam(data, formdata, btn.callbackType === 'script')
|
}
|
|
if (params.length > 1 && btn.progress === 'progressbar') {
|
this.setState({
|
loadingTotal: params.length
|
})
|
}
|
|
this.customLoopRequest(params, _resolve)
|
}
|
}
|
|
/**
|
* @description 自定义请求循环执行
|
*/
|
customLoopRequest = (params, _resolve) => {
|
const { setting, btn } = this.props
|
|
let param = params.shift()
|
|
this.setState({
|
loadingNumber: params.length
|
})
|
|
let record = {
|
BID: param.BID || '',
|
ID: param.ID || '',
|
callbacksql: param.$callbacksql || '',
|
mk_api_key: '',
|
backParam: param.$backParam || ''
|
}
|
|
if (!record.ID && btn.Ot !== 'notRequired' && param[setting.primaryKey]) {
|
record.ID = param[setting.primaryKey]
|
}
|
|
delete param.$backParam
|
delete param.$callbacksql
|
|
if (param.$pice) {
|
record = param.$record
|
|
delete param.$record
|
|
this.customOuterRequest(params, param, record, _resolve)
|
return
|
} else if (!param.func && !param.$backend) {
|
this.customOuterRequest(params, param, record, _resolve)
|
return
|
}
|
|
Api.genericInterface(param, btn.$innerScript, 'inner').then(res => {
|
record.mk_api_key = res.mk_api_key || ''
|
|
if (res.status) {
|
if (res.mk_ex_invoke + '' === 'false' && params.length === 0) {
|
this.execSuccess(res)
|
_resolve()
|
} else if (res.mk_ex_invoke + '' === 'false' && params.length > 0) {
|
this.customLoopRequest(params, _resolve)
|
} else {
|
if (res.mk_ex_data) { // 数据分批执行
|
if (Array.isArray(res.mk_ex_data) && res.mk_ex_data.length > 0) {
|
let pices = res.mk_ex_data.map(item => {
|
item.$pice = true
|
item.$record = {...record}
|
|
if (item.hasOwnProperty('mk_api_key')) {
|
item.$record.mk_api_key = item.mk_api_key || record.mk_api_key || ''
|
|
delete item.mk_api_key
|
}
|
return item
|
})
|
params = [...pices, ...params]
|
this.customLoopRequest(params, _resolve)
|
} else if (params.length === 0) {
|
this.execSuccess(res)
|
_resolve()
|
} else {
|
this.customLoopRequest(params, _resolve)
|
}
|
} else {
|
this.customOuterRequest(params, res, record, _resolve)
|
}
|
}
|
} else {
|
this.execError(res)
|
_resolve()
|
}
|
}, (error) => {
|
if (error && error.ErrCode === 'LoginError') return
|
this.updateStatus()
|
_resolve()
|
})
|
}
|
// xml调用方式
|
// Api.directRequest('http://localhost:3001/test.xml', 'get', null, 'true').then(res => {
|
// let $x2js = new x2js()
|
// let jsonObj = $x2js.xml2js(res);
|
// window.mkInfo(jsonObj)
|
// })
|
|
/**
|
* @description 自定义请求循环执行
|
*/
|
customOuterRequest = (params, result, record, _resolve) => {
|
const { btn } = this.props
|
|
let url = ''
|
if (window.GLOB.systemType === 'production') {
|
url = btn.proInterface
|
} else {
|
url = btn.interface
|
}
|
|
|
let param = {}
|
|
if (result.$pice) {
|
delete result.$pice
|
|
param = {...result}
|
} else {
|
delete result.mk_ex_invoke
|
delete result.status
|
delete result.message
|
delete result.ErrCode
|
delete result.ErrMesg
|
delete result.mk_api_key
|
|
Object.keys(result).forEach(key => {
|
key = key.replace(/^mk_/ig, '')
|
param[key] = result[key]
|
})
|
}
|
|
let _params = {
|
url: url,
|
method: btn.method || 'post'
|
}
|
|
if (btn.ContentType) {
|
_params.headers = {
|
'Content-Type': btn.ContentType
|
}
|
}
|
|
if (btn.$outerScript) {
|
if (JSON.stringify(param) !== '{}') {
|
if (btn.stringify === 'qs') {
|
_params.data = qs.stringify(param)
|
} else {
|
_params.data = param
|
}
|
}
|
} else if (btn.cross === 'true') {
|
if (JSON.stringify(param) !== '{}') {
|
if (btn.stringify === 'qs') {
|
_params.data = qs.stringify(param)
|
} else if (btn.stringify === 'JSON') {
|
_params.data = param
|
} else {
|
_params.data = JSON.stringify(param)
|
}
|
}
|
} else {
|
let _url = url
|
if (JSON.stringify(param) !== '{}') {
|
if (_params.method === 'get') {
|
let keys = Object.keys(param).map(key => `${key}=${param[key]}`)
|
_url = _url + '?' + keys.join('&')
|
} else if (_params.method === 'post') {
|
if (btn.stringify === 'qs') {
|
_params.data = qs.stringify(param)
|
} else if (btn.stringify === 'JSON') {
|
_params.data = param
|
} else {
|
_params.data = JSON.stringify(param)
|
}
|
}
|
}
|
|
_url = _url.replace(/&/ig, '%26')
|
|
_params.url = '/trans/redirect?rd=' + _url + '&method=' + _params.method
|
|
_params.method = 'post'
|
}
|
|
Api.directRequest(_params, btn.$outerScript, 'outer').then(res => {
|
if (typeof(res) !== 'object') {
|
let error = '未知的返回结果!'
|
|
if (typeof(res) === 'string') {
|
error = res.replace(/'/ig, '"')
|
}
|
|
let result = {
|
mk_api_key: record.mk_api_key,
|
$ErrCode: 'E',
|
$ErrMesg: error
|
}
|
|
this.customCallbackRequest(params, result, record, _resolve)
|
} else {
|
if (Array.isArray(res)) {
|
res = { data: res }
|
}
|
|
if (btn.outerBlacklist) {
|
let list = btn.outerBlacklist.split(',').map(m => m.toLowerCase())
|
Object.keys(res).forEach(key => {
|
if (list.includes(key.toLowerCase())) {
|
delete res[key]
|
}
|
})
|
}
|
|
res.mk_api_key = record.mk_api_key
|
this.customCallbackRequest(params, res, record, _resolve)
|
}
|
}, (e) => {
|
let result = {
|
mk_api_key: record.mk_api_key,
|
$ErrCode: 'E',
|
$ErrMesg: e && e.statusText ? e.statusText : ''
|
}
|
|
this.customCallbackRequest([], result, record, _resolve)
|
})
|
}
|
|
/**
|
* @description 回调请求循环执行
|
*/
|
customCallbackRequest = (params, result, record, _resolve) => {
|
const { btn } = this.props
|
|
let param = null
|
let callback = result.mk_ex_invoke
|
|
delete result.mk_ex_invoke
|
|
if (callback === 'false' || callback === false) {
|
if (result.status) {
|
if (params.length === 0) {
|
this.execSuccess(result)
|
_resolve()
|
} else {
|
this.customLoopRequest(params, _resolve)
|
}
|
} else {
|
this.execError(result)
|
_resolve()
|
}
|
return
|
} else if (btn.callbackType === 'script' && record.backParam) {
|
param = this.getCallBackendParam(result, record)
|
} else if (btn.callbackType === 'script' || btn.callbackType === 'default') {
|
param = this.getCallBackSql(result, record)
|
} else if (btn.callbackType === 'func') {
|
param = {
|
...result,
|
func: btn.callbackFunc
|
}
|
if (result.$ErrCode === 'E') {
|
delete param.$ErrCode
|
delete param.$ErrMesg
|
|
param.ErrCode = 'E'
|
}
|
} else {
|
if (result.$ErrCode === 'E') {
|
result.status = false
|
result.message = result.$ErrMesg
|
result.ErrCode = 'E'
|
} else {
|
result.status = result.status !== false
|
result.ErrCode = result.ErrCode || '-1'
|
}
|
|
if (result.status) {
|
if (params.length === 0) {
|
this.execSuccess(result)
|
_resolve()
|
} else {
|
this.customLoopRequest(params, _resolve)
|
}
|
} else {
|
this.execError(result)
|
_resolve()
|
}
|
|
return
|
}
|
|
if (param.menuname) {
|
param.menuname = param.menuname + '(回调)'
|
}
|
|
Api.genericInterface(param, btn.$callbackScript, 'callback').then(res => {
|
if (res.status) {
|
this.triggerNote(res, param.ID) // 消息
|
|
if (params.length === 0) {
|
this.execSuccess(res)
|
_resolve()
|
} else {
|
this.customLoopRequest(params, _resolve)
|
}
|
} else {
|
this.execError(res)
|
_resolve()
|
}
|
}, (error) => {
|
if (error && error.ErrCode === 'LoginError') return
|
this.updateStatus()
|
_resolve()
|
})
|
}
|
|
getCallBackendParam = (result, record) => {
|
const { btn } = this.props
|
let lines = []
|
let tables = []
|
let param = fromJS(record.backParam).toJS()
|
|
btn.verify.cbScripts.forEach(script => {
|
if (script.status === 'false') return
|
|
if (/\s#[a-z0-9_]+(\s|\()/ig.test(script.sql)) {
|
tables.push(...script.sql.match(/\s#[a-z0-9_]+(\s|\()/ig))
|
}
|
})
|
|
tables = tables.map(tb => tb.replace(/\s|\(/g, ''))
|
|
if (result.$ErrCode) {
|
delete result.$ErrCode
|
delete result.$ErrMesg
|
}
|
|
let getDefaultSql = (obj, tb, bid, level) => {
|
let vals = {}
|
let subObjs = []
|
let id = Utils.getuuid()
|
|
delete obj.$$key
|
|
Object.keys(obj).forEach(key => {
|
let val = obj[key]
|
if (val === null || val === undefined) return
|
if (typeof(val) === 'object') {
|
if (Array.isArray(val)) {
|
val.forEach(item => {
|
if (typeof(item) !== 'object' || Array.isArray(item)) return
|
if (Object.keys(item).length === 0) return
|
|
Object.keys(item).forEach(k => {
|
if (item[k] === null) {
|
item[k] = ''
|
}
|
})
|
item.$$key = tb + '_' + key
|
subObjs.push(item)
|
})
|
} else if (Object.keys(val).length > 0) {
|
val.$$key = tb + '_' + key
|
subObjs.push(val)
|
}
|
} else {
|
if (typeof(val) === 'string') {
|
val = val.replace(/'/ig, '"')
|
} else {
|
val = val + ''
|
}
|
vals[key] = val
|
}
|
})
|
|
vals.mk_level = level
|
vals.mk_id = id
|
vals.mk_bid = bid
|
|
let isnew = true
|
lines.forEach(line => {
|
if (line.tb === tb) {
|
line.values.push(vals)
|
isnew = false
|
}
|
})
|
if (isnew) {
|
lines.push({
|
tb: tb,
|
type: tables.includes('#' + tb) ? '01' : '02',
|
values: [vals]
|
})
|
}
|
|
subObjs.forEach(item => {
|
getDefaultSql(item, item.$$key, id, level + 1)
|
})
|
}
|
|
getDefaultSql(result, btn.cbTable, '', 1)
|
|
param.data[0].exps.push({
|
key: 'mk_outer_params', // 回调脚本的数据替换
|
value: lines
|
})
|
|
let md5_id = ''
|
if (window.GLOB.probation) {
|
md5_id = md5('back_' + btn.uuid + JSON.stringify(param.data[0].exps) + Math.floor(new Date().getTime() / 600000))
|
md5_id = moment().format('YYYYMMDDHHmmss') + md5_id.slice(-18)
|
}
|
|
param.data[0].md5_id = md5_id
|
param.data[0].menuname = btn.logLabel + '(回调)'
|
|
return param
|
}
|
|
getCallBackSql = (result, record) => {
|
const { btn } = this.props
|
let lines = []
|
let pre = ''
|
let tables = []
|
|
if (btn.callbackType === 'script') { // 使用自定义脚本
|
pre = '@'
|
|
btn.verify.cbScripts.forEach(script => {
|
if (script.status === 'false') return
|
|
if (/\s#[a-z0-9_]+(\s|\()/ig.test(script.sql)) {
|
tables.push(...script.sql.match(/\s#[a-z0-9_]+(\s|\()/ig))
|
}
|
})
|
|
tables = tables.map(tb => tb.replace(/\s|\(/g, ''))
|
}
|
|
let errSql = ''
|
if (result.$ErrCode === 'E') {
|
errSql = `
|
set @ErrorCode='E'
|
set @retmsg='${result.$ErrMesg}'
|
`
|
delete result.$ErrCode
|
delete result.$ErrMesg
|
}
|
|
let getDefaultSql = (obj, tb, bid, level) => {
|
let keys = []
|
let vals = []
|
let subObjs = []
|
let id = Utils.getuuid()
|
let tbName = pre + tb
|
|
if (tables.includes('#' + tb)) {
|
tbName = '#' + tb
|
}
|
|
delete obj.$$key
|
|
Object.keys(obj).forEach(key => {
|
let val = obj[key]
|
if (val === null || val === undefined) return
|
if (typeof(val) === 'object') {
|
if (Array.isArray(val)) {
|
val.forEach(item => {
|
if (typeof(item) !== 'object' || Array.isArray(item)) return
|
if (Object.keys(item).length === 0) return
|
|
Object.keys(item).forEach(k => {
|
if (item[k] === null) {
|
item[k] = ''
|
}
|
})
|
item.$$key = tb + '_' + key
|
subObjs.push(item)
|
})
|
} else if (Object.keys(val).length > 0) {
|
val.$$key = tb + '_' + key
|
subObjs.push(val)
|
}
|
} else {
|
if (typeof(val) === 'string') {
|
val = val.replace(/'/ig, '"')
|
}
|
keys.push('[' + key + ']')
|
vals.push(`'${val}'`)
|
}
|
})
|
|
keys = keys.join(',')
|
vals = vals.join(',')
|
|
lines.push({
|
table: md5(tb + keys),
|
insert: `Insert into ${tbName} (${keys ? keys + ',' : ''}[mk_level],[mk_id],[mk_bid])`,
|
select: `Select ${keys ? vals + ',' : ''}'${level}','${id}','${bid}'`
|
})
|
|
subObjs.forEach(item => {
|
getDefaultSql(item, item.$$key, id, level + 1)
|
})
|
}
|
|
getDefaultSql(result, btn.cbTable, '', 1)
|
|
let lineMap = new Map()
|
lines.forEach(line => {
|
if (lineMap.has(line.table)) {
|
let _line = lineMap.get(line.table)
|
_line.selects.push(line.select)
|
lineMap.set(line.table, _line)
|
} else {
|
lineMap.set(line.table, {
|
table: line.table,
|
insert: line.insert,
|
selects: [line.select]
|
})
|
}
|
})
|
|
let param = {}
|
|
if (btn.callbackType === 'script') { // 使用自定义脚本
|
param.func = 'sPC_TableData_InUpDe'
|
|
if (record.BID) {
|
param.BID = record.BID
|
}
|
if (record.ID) {
|
param.ID = record.ID
|
}
|
|
let _prevCustomScript = `${record.callbacksql}
|
${errSql}
|
`
|
let _backCustomScript = ''
|
|
btn.verify.cbScripts.forEach(script => {
|
if (script.status === 'false') return
|
|
if (script.position === 'front') {
|
_prevCustomScript += `
|
/* 自定义脚本 */
|
${script.sql}
|
`
|
} else {
|
_backCustomScript += `
|
/* 自定义脚本 */
|
${script.sql}
|
`
|
}
|
})
|
|
if (btn.output) {
|
_backCustomScript += `
|
aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg,${btn.output} as mk_b_id`
|
|
param.key_back_type = 'Y'
|
} else {
|
_backCustomScript += `
|
aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg`
|
}
|
|
let sql = [...lineMap.values()].map(item => (`
|
${item.insert}
|
${item.selects.join(` union all
|
`)}
|
`))
|
sql = sql.join('')
|
sql = _prevCustomScript + sql
|
sql = sql + _backCustomScript
|
|
sql = sql.replace(/@ID@/ig, `'${record.ID || ''}'`)
|
sql = sql.replace(/@BID@/ig, `'${record.BID || ''}'`)
|
sql = sql.replace(/@LoginUID@/ig, `'${sessionStorage.getItem('LoginUID') || ''}'`)
|
sql = sql.replace(/@SessionUid@/ig, `'${localStorage.getItem('SessionUid') || ''}'`)
|
sql = sql.replace(/@UserID@/ig, `'${sessionStorage.getItem('UserID') || ''}'`)
|
sql = sql.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
|
sql = sql.replace(/@lang@/ig, `'${sessionStorage.getItem('lang')}'`)
|
sql = sql.replace(/@typename@/ig, `'admin'`)
|
|
if (sessionStorage.getItem('dataM') === 'true') { // 数据权限
|
sql = sql.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, `'Y'`)
|
} else {
|
sql = sql.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, `''`)
|
}
|
|
if (window.GLOB.debugger === true) {
|
window.mkInfo('%c' + btn.logLabel + '(回调)', 'color: blue')
|
window.mkInfo(sql.replace(/\n\s{8}/ig, '\n'))
|
}
|
|
param.LText = sql
|
param.exec_type = window.GLOB.execType || 'y' // 后台解码
|
param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
param.secretkey = Utils.encrypt('', param.timestamp)
|
param.LText = Utils.formatOptions(param.LText, param.exec_type)
|
param.menuname = btn.logLabel
|
|
if (window.GLOB.probation) {
|
param.s_debug_type = 'Y'
|
}
|
|
if (window.GLOB.mkHS) { // 函数 sPC_TableData_InUpDe 云端验证
|
param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
|
}
|
} else {
|
param.func = 's_ex_result_back'
|
param.s_ex_result = [...lineMap.values()].map((item, index) => ({
|
MenuID: btn.uuid,
|
MenuName: btn.logLabel,
|
TableName: item.table,
|
LongText: window.btoa(window.encodeURIComponent(`${item.insert} ${item.selects.join(` union all `)}`)),
|
Sort: index + 1
|
}))
|
|
if (window.GLOB.debugger === true) {
|
let sql = [...lineMap.values()].map(item => (`
|
${item.insert}
|
${item.selects.join(` union all
|
`)}
|
`))
|
sql = sql.join('')
|
window.mkInfo(sql.replace(/\n\s{10}/ig, '\n'))
|
}
|
}
|
|
return param
|
}
|
|
/**
|
* @description 内部请求循环执行
|
*/
|
innerLoopRequest = (params, btn, _resolve) => {
|
let param = params.shift()
|
|
this.setState({
|
loadingNumber: params.length
|
})
|
|
Api.genericInterface(param).then(res => {
|
if (res.status) {
|
this.triggerNote(res, param.ID) // 消息
|
|
if (params.length === 0) {
|
this.execSuccess(res)
|
_resolve()
|
} else {
|
this.innerLoopRequest(params, btn, _resolve)
|
}
|
} else {
|
this.execError(res)
|
_resolve()
|
}
|
}, (error) => {
|
if (error && error.ErrCode === 'LoginError') return
|
this.updateStatus()
|
_resolve()
|
})
|
}
|
|
/**
|
* @description 数据检验循环执行
|
*/
|
checkLoopRequest = (params, _resolve) => {
|
let param = params.shift()
|
let unCheckParam = param.$unCheckParam
|
|
delete param.$unCheckParam
|
|
this.setState({
|
loadingNumber: params.length
|
})
|
|
Api.genericInterface(param).then(res => {
|
if (res.status) {
|
this.triggerNote(res, param.ID) // 消息
|
|
if (params.length === 0) {
|
this.execSuccess(res)
|
_resolve()
|
} else {
|
this.checkLoopRequest(params, _resolve)
|
}
|
} else if (res.ErrCode === 'C') {
|
let msg = res.message || ''
|
if (/\n|\r/.test(msg)) {
|
msg = msg.replace(/\n|\r/ig, '<br/>')
|
msg = <span dangerouslySetInnerHTML={{__html: msg}}></span>
|
}
|
const that = this
|
confirm({
|
title: window.GLOB.dict['exec_sure'] || '请确认',
|
content: msg,
|
okText: window.GLOB.dict['ok'] || '确定',
|
cancelText: window.GLOB.dict['cancel'] || '取消',
|
onOk() {
|
return new Promise(resolve => {
|
Api.genericInterface(unCheckParam).then(result => {
|
if (result.status) {
|
that.triggerNote(result, param.ID) // 消息
|
|
if (params.length === 0) {
|
that.execSuccess(result)
|
_resolve()
|
} else {
|
that.checkLoopRequest(params, _resolve)
|
}
|
} else {
|
that.execError(result)
|
_resolve()
|
}
|
resolve()
|
})
|
})
|
},
|
onCancel() {
|
that.execError(res)
|
_resolve()
|
}
|
})
|
} else {
|
this.execError(res)
|
_resolve()
|
}
|
}, (error) => {
|
if (error && error.ErrCode === 'LoginError') return
|
this.updateStatus()
|
_resolve()
|
})
|
}
|
|
/**
|
* @description 外部请求循环执行
|
*/
|
outerLoopRequest = (params, _resolve) => {
|
const { setting, btn } = this.props
|
|
let param = params.shift()
|
|
this.setState({
|
loadingNumber: params.length
|
})
|
|
let record = {
|
BID: param.BID || '',
|
ID: param.ID || '',
|
callbacksql: param.$callbacksql || '',
|
backParam: param.$backParam || ''
|
}
|
|
if (!record.ID && btn.Ot !== 'notRequired' && param[setting.primaryKey]) {
|
record.ID = param[setting.primaryKey]
|
}
|
|
delete param.$backParam
|
delete param.$callbacksql
|
|
if (!param.func && !param.$backend) {
|
this.outerOuterRequest(params, param, record, _resolve)
|
return
|
}
|
|
Api.genericInterface(param, btn.$innerScript, 'inner').then(res => {
|
if (res.status) {
|
if ((res.mk_ex_invoke === 'false' || res.mk_ex_invoke === false) && params.length === 0) {
|
this.execSuccess(res)
|
_resolve()
|
} else if ((res.mk_ex_invoke === 'false' || res.mk_ex_invoke === false) && params.length > 0) {
|
this.outerLoopRequest(params, _resolve)
|
} else {
|
delete res.mk_ex_invoke
|
delete res.ErrCode
|
delete res.ErrMesg
|
delete res.message
|
delete res.status
|
|
// 使用处理后的数据调用外部接口
|
let keys = Object.keys(res) // 提交外部接口前,添加BID
|
if (this.props.BID && keys.filter(key => key.toLowerCase() === 'bid').length === 0) {
|
res.BID = this.props.BID
|
}
|
|
if (res.mk_api_key) {
|
record.mk_api_key = res.mk_api_key
|
}
|
delete res.mk_api_key
|
|
this.outerOuterRequest(params, res, record, _resolve)
|
}
|
} else {
|
this.execError(res)
|
_resolve()
|
}
|
}, (error) => {
|
if (error && error.ErrCode === 'LoginError') return
|
this.updateStatus()
|
_resolve()
|
})
|
}
|
|
outerOuterRequest = (params, result, record, _resolve) => {
|
const { btn } = this.props
|
let outParam = JSON.parse(JSON.stringify(result))
|
let ver_token = false
|
|
if (btn.outerFunc) {
|
result.func = btn.outerFunc
|
}
|
|
if (btn.sysInterface === 'true') {
|
if (window.GLOB.mainSystemApi) {
|
result.rduri = window.GLOB.mainSystemApi
|
}
|
} else if (btn.sysInterface === 'external') {
|
if (window.GLOB.systemType === 'production') {
|
result.$token = btn.exProInterface || ''
|
} else {
|
result.$token = btn.exInterface || ''
|
}
|
ver_token = true
|
} else {
|
if (window.GLOB.systemType === 'production' && btn.proInterface) {
|
result.rduri = btn.proInterface
|
} else {
|
result.rduri = btn.interface
|
}
|
|
if (/function:/i.test(result.rduri)) {
|
let rduri = result.rduri
|
try {
|
rduri = rduri.replace(/function:/i, '')
|
// eslint-disable-next-line
|
let func = new Function(rduri)
|
result.rduri = func()
|
} catch (e) {
|
console.warn(e)
|
}
|
}
|
|
let host = window.GLOB.baseurl.replace(/http(s):\/\//, '')
|
if (result.rduri.indexOf(host) === -1 && /\/dostars/.test(result.rduri)) {
|
result.$login = true
|
}
|
}
|
|
if (window.GLOB.mkHS) {
|
if (result.func === 's_app_version_upt') { // special 更新版本号时访问sso
|
delete result.rduri
|
if (window.GLOB.localSystemApi) {
|
result.rduri = window.GLOB.localSystemApi
|
}
|
result.userid = sessionStorage.getItem('LocalUserID') || ''
|
result.LoginUID = sessionStorage.getItem('LocalLoginUID') || ''
|
} else if (result.func === 's_sDataDictb_TBBack' && result.LTextOut) { // special 函数 s_sDataDictb_TBBack 云端验证
|
result.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
result.secretkey = Utils.encrypt(result.LTextOut, result.timestamp)
|
result.open_key = Utils.encryptOpenKey(result.secretkey, result.timestamp)
|
}
|
}
|
|
Api.genericInterface(result, btn.$outerScript, 'outer').then(res => {
|
if (!res) return // LoginError时中断请求
|
if (ver_token && res.ErrCode === 'token_error') {
|
res.ErrCode = 'E'
|
this.execError(res)
|
return
|
}
|
this.outerCallbackRequest(params, res, record, outParam, _resolve)
|
}, (error) => {
|
if (error && error.ErrCode === 'LoginError') return
|
this.outerCallbackRequest(params, {status: false, message: 500, ErrCode: 'E', ErrMesg: 500}, record, outParam, _resolve)
|
})
|
}
|
|
/**
|
* @description 回调请求循环执行
|
*/
|
outerCallbackRequest = (params, result, record, outParam, _resolve) => {
|
const { btn } = this.props
|
|
let param = null
|
|
if (record.mk_api_key) {
|
result.mk_api_key = record.mk_api_key
|
}
|
|
let callback = result.mk_ex_invoke
|
|
delete result.mk_ex_invoke
|
|
if (callback === 'false' || callback === false) {
|
if (result.status) {
|
if (params.length === 0) {
|
this.execSuccess(result)
|
_resolve()
|
} else {
|
this.outerLoopRequest(params, _resolve)
|
}
|
} else {
|
this.execError(result)
|
_resolve()
|
}
|
return
|
} else if (window.GLOB.mkHS && btn.outerFunc === 's_get_sVersionDetail_Ltext' && btn.callbackFunc) { // special 版本升级回调处理
|
if (result.status) {
|
this.verupRequest(params, result, outParam, _resolve)
|
} else {
|
this.execError(result)
|
_resolve()
|
}
|
return
|
} else if (btn.callbackType === 'script' && record.backParam) {
|
param = this.getCallBackendParam(result, record)
|
} else if (btn.callbackType === 'script' || btn.callbackType === 'default') {
|
param = this.getCallBackSql(result, record)
|
} else if (btn.callbackType === 'func' || btn.callbackFunc) {
|
delete result.message
|
delete result.status
|
|
param = {
|
...outParam,
|
...result,
|
func: btn.callbackFunc
|
}
|
|
if (window.GLOB.mkHS) {
|
if (btn.callbackFunc === 's_sVersion_Local_add' && window.GLOB.forcedUpdate) { // special 传输号添加回调处理
|
param.local_userid = sessionStorage.getItem('LocalUserID') || ''
|
} else if (btn.callbackFunc === 's_sDataDictb_TBBack' && param.LTextOut) { // special 函数 s_sDataDictb_TBBack 云端验证
|
param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
param.secretkey = Utils.encrypt(param.LTextOut, param.timestamp)
|
param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
|
}
|
}
|
} else {
|
if (result.status) {
|
if (params.length === 0) {
|
this.execSuccess(result)
|
_resolve()
|
} else {
|
this.outerLoopRequest(params, _resolve)
|
}
|
} else {
|
this.execError(result)
|
_resolve()
|
}
|
|
return
|
}
|
|
if (param.menuname) {
|
param.menuname = param.menuname + '(回调)'
|
}
|
|
Api.genericInterface(param, btn.$callbackScript, 'callback').then(res => {
|
if (res.status) {
|
this.triggerNote(res, param.ID) // 消息
|
|
// 一次请求成功,进行下一项请求
|
if (params.length === 0) {
|
this.execSuccess(res)
|
_resolve()
|
} else {
|
this.outerLoopRequest(params, _resolve)
|
}
|
} else {
|
this.execError(res)
|
_resolve()
|
}
|
})
|
}
|
|
verupRequest = (params, result, outParam, _resolve) => {
|
const { btn } = this.props
|
|
delete result.message
|
delete result.status
|
|
let ssoParam = null
|
let sinParam = null
|
let callParam = {...outParam, ...result}
|
|
callParam.func = btn.callbackFunc
|
callParam.userid = sessionStorage.getItem('LocalUserID') || ''
|
callParam.LoginUID = sessionStorage.getItem('LocalLoginUID') || ''
|
|
if (result.LTextOut) {
|
callParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
callParam.secretkey = Utils.encrypt(callParam.LTextOut, callParam.timestamp)
|
callParam.open_key = Utils.encryptOpenKey(callParam.secretkey, callParam.timestamp)
|
} else {
|
callParam = {...outParam}
|
callParam.func = btn.callbackFunc
|
callParam.MenuNO = 'sVersionDetail_LocalM'
|
callParam.UpType = 'SSO'
|
callParam.LTextOut = 'minke'
|
callParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
callParam.secretkey = Utils.encrypt(callParam.LTextOut, callParam.timestamp)
|
callParam.open_key = Utils.encryptOpenKey(callParam.secretkey, callParam.timestamp)
|
callParam.userid = sessionStorage.getItem('LocalUserID') || ''
|
callParam.LoginUID = sessionStorage.getItem('LocalLoginUID') || ''
|
|
delete result.ErrCode
|
delete result.ErrMesg
|
|
sinParam = {...result}
|
sinParam.func = 'sPC_TrdMenu_AddUpt_sso'
|
|
if (window.GLOB.sysType === 'local') {
|
if (!window.GLOB.systemType && window.GLOB.cloudServiceApi) {
|
sinParam.rduri = window.GLOB.cloudServiceApi
|
} else if (window.GLOB.localSystemApi) {
|
sinParam.rduri = window.GLOB.localSystemApi
|
sinParam.userid = sessionStorage.getItem('LocalUserID') || ''
|
sinParam.LoginUID = sessionStorage.getItem('LocalLoginUID') || ''
|
}
|
}
|
}
|
|
if (result.UpType === 'SSO' && window.GLOB.localSystemApi) {
|
ssoParam = fromJS(callParam).toJS()
|
ssoParam.rduri = window.GLOB.localSystemApi
|
|
delete ssoParam.UpType
|
}
|
|
if (sinParam) {
|
Api.genericInterface(sinParam).then(res => {
|
if (!res.status) {
|
this.execError(res)
|
_resolve()
|
} else {
|
Api.genericInterface(callParam).then(re => {
|
if (!re.status) {
|
this.execError(re)
|
_resolve()
|
} else {
|
if (params.length === 0) {
|
this.clearBackCache()
|
this.execSuccess(res)
|
_resolve()
|
} else {
|
this.outerLoopRequest(params, _resolve)
|
}
|
}
|
})
|
}
|
})
|
} else if (ssoParam) {
|
Api.genericInterface(ssoParam).then(res => {
|
if (!res.status) {
|
this.execError(res)
|
_resolve()
|
} else {
|
Api.genericInterface(callParam).then(re => {
|
if (!re.status) {
|
this.execError(re)
|
_resolve()
|
} else {
|
if (params.length === 0) {
|
this.clearBackCache()
|
this.execSuccess(res)
|
_resolve()
|
} else {
|
this.outerLoopRequest(params, _resolve)
|
}
|
}
|
})
|
}
|
})
|
} else {
|
Api.genericInterface(callParam).then(re => {
|
if (!re.status) {
|
this.execError(re)
|
_resolve()
|
} else {
|
if (params.length === 0) {
|
this.clearBackCache()
|
this.execSuccess(re)
|
_resolve()
|
} else {
|
this.outerLoopRequest(params, _resolve)
|
}
|
}
|
})
|
}
|
}
|
|
clearBackCache = () => {
|
if (!window.GLOB.backend) return
|
|
Api.cacheInterface({}).then(res => {
|
if (!res.status) {
|
notification.warning({
|
top: 92,
|
message: res.message || '缓存清空失败!',
|
duration: 5
|
})
|
} else if (window.GLOB.localSystemApi) {
|
Api.cacheInterface({rduri: window.GLOB.localSystemApi.replace('dostars', 'excache')}).then(result => {
|
if (!result.status) {
|
notification.warning({
|
top: 92,
|
message: result.message || '缓存清空失败!',
|
duration: 5
|
})
|
}
|
})
|
}
|
})
|
}
|
|
/**
|
* @description 操作成功后处理
|
* 1、excel导出,成功后取消导出按钮加载中状态
|
* 2、状态码为 S 时,显示成功信息后系统默认信息
|
* 3、状态码为 -1 时,不显示任何信息
|
* 4、模态框执行成功后是否关闭
|
* 5、通知主列表刷新
|
*/
|
execSuccess = (res = {}) => {
|
const { btn } = this.props
|
const { autoMatic, dict } = this.state
|
|
if (btn.resetForms) {
|
let data = {}
|
|
Object.keys(res).forEach(key => {
|
data[key.toLowerCase()] = res[key]
|
})
|
|
delete data.errcode
|
delete data.errmesg
|
delete data.message
|
delete data.status
|
|
MKEmitter.emit('resetForms', btn.uuid, data)
|
MKEmitter.emit('refreshByButtonResult', btn.$menuId, 'resetData', btn, null, null, data)
|
}
|
|
if (this.preCallback) {
|
this.setState({
|
loading: false,
|
visible: false
|
})
|
this.preCallback(res)
|
return
|
} else if (autoMatic) {
|
this.setState({
|
loading: false,
|
visible: false
|
})
|
MKEmitter.emit('autoExecOver', btn.uuid, 'success')
|
return
|
}
|
|
let sign = ''
|
let focusField = ''
|
|
if (/@focus:[a-z0-9_]+@/i.test(res.message)) {
|
let val = res.message.match(/@focus:[a-z0-9_]+@/i)
|
res.message = res.message.replace(/@focus:[a-z0-9_]+@/i, '')
|
focusField = val ? val[0].replace(/@focus:|@/ig, '') : ''
|
|
if (!res.message) {
|
res.ErrCode = '-1'
|
}
|
}
|
if (/^@speak@/i.test(res.message)) {
|
res.message = res.message.replace(/^@speak@/i, '')
|
let val = res.message.match(/<<.*>>/)
|
res.message = res.message.replace(/\s*<<.*>>\s*/g, '')
|
val = val ? val[0].replace(/<<|>>/g, '') : ''
|
|
if (/^http/.test(val)) {
|
let audio = document.createElement('audio')
|
audio.src = val
|
audio.play()
|
}
|
|
if (!res.message) {
|
res.ErrCode = '-1'
|
}
|
}
|
if (/@close_tab@|@close_popup@|@goback@|@no_target_menu@/i.test(res.message)) {
|
sign = res.message.match(/@close_tab@|@close_popup@|@goback@|@no_target_menu@/i)[0].toLowerCase()
|
res.message = res.message.replace(/@close_tab@|@close_popup@|@goback@|@no_target_menu@/i, '')
|
}
|
|
let id = ''
|
if (btn.output) {
|
id = res.mk_b_id || res[btn.output] || ''
|
}
|
|
if (res.mk_icon) {
|
sessionStorage.setItem('avatar', res.mk_icon)
|
}
|
|
res.ErrCode = res.ErrCode || 'S'
|
|
if (res.ErrCode === 'S') { // 执行成功
|
if (btn.formType !== 'counter' || res.message) {
|
notification.success({
|
top: 92,
|
message: res.message || dict['exc_success'] || '执行成功!',
|
duration: btn.verify && btn.verify.stime ? btn.verify.stime : 2
|
})
|
}
|
} else if (res.ErrCode === 'Y') { // 执行成功
|
let msg = res.message || dict['exc_success'] || '执行成功!'
|
if (/\n|\r/.test(msg)) {
|
msg = msg.replace(/\n|\r/ig, '<br/>')
|
msg = <span dangerouslySetInnerHTML={{__html: msg}}></span>
|
}
|
Modal.success({
|
title: msg,
|
okText: dict['got_it'] || '知道了',
|
onOk: () => {
|
this.successContinue(sign, id, res, focusField)
|
}
|
})
|
return
|
} else if (res.ErrCode === '-1') { // 完成后不提示
|
|
}
|
|
this.successContinue(sign, id, res, focusField)
|
}
|
|
successContinue = (sign, id, res, focusField) => {
|
const { btn } = this.props
|
const { btnconfig } = this.state
|
|
if (focusField) {
|
MKEmitter.emit('resetFocus', btn.uuid, focusField)
|
}
|
|
this.setState({
|
loadingNumber: '',
|
loadingTotal: '',
|
})
|
|
if (btn.OpenType !== 'pop' || !btnconfig || btnconfig.setting.finish !== 'unclose') {
|
this.setState({
|
loading: false,
|
visible: false
|
})
|
}
|
|
let tabId = ''
|
if (btn.refreshTab && btn.refreshTab.length > 0) {
|
tabId = btn.refreshTab[btn.refreshTab.length - 1]
|
}
|
|
if (tabId && btn.$MenuID === tabId) { // 刷新当前菜单时,停止其他操作
|
MKEmitter.emit('reloadMenuView', tabId)
|
return
|
}
|
|
if (btn.execSuccess === 'closetab' || sign === '@close_tab@') {
|
MKEmitter.emit('closeTabView', btn.$MenuID)
|
} else if (btn.execSuccess === 'closepoptab' || sign === '@close_popup@') {
|
MKEmitter.emit('popclose')
|
} else if (btn.execSuccess !== 'never') {
|
MKEmitter.emit('refreshByButtonResult', btn.$menuId, btn.execSuccess, btn, id, this.state.selines)
|
}
|
|
if (window.GLOB.breakpoint) {
|
MKEmitter.emit('refreshDebugTable')
|
}
|
|
if (btn.syncComponentId) {
|
if (btn.syncComponentId === 'multiComponent') {
|
btn.syncComponentIds.forEach((id, i) => {
|
setTimeout(() => {
|
if (/\$focus/.test(id)) {
|
MKEmitter.emit('reloadData', id.split('$')[0], id.split('$')[1])
|
} else {
|
MKEmitter.emit('reloadData', id)
|
}
|
}, 20 * i)
|
})
|
} else if (/\$focus/.test(btn.syncComponentId)) {
|
MKEmitter.emit('reloadData', btn.syncComponentId.split('$')[0], btn.syncComponentId.split('$')[1])
|
} else {
|
if (btn.syncDelay) {
|
this.delayTimer && clearTimeout(this.delayTimer)
|
this.delayTimer = setTimeout(() => {
|
MKEmitter.emit('reloadData', btn.syncComponentId)
|
}, btn.syncDelay)
|
} else {
|
MKEmitter.emit('reloadData', btn.syncComponentId)
|
}
|
}
|
}
|
|
if (tabId) {
|
MKEmitter.emit('reloadMenuView', tabId)
|
}
|
|
if (btn.switchTab && btn.switchTab.length > 0) {
|
let id = btn.switchTab[btn.switchTab.length - 1]
|
let node = document.getElementById('tab' + id)
|
node && node.click()
|
}
|
if (btn.anchors && btn.anchors.length > 0) {
|
let id = btn.anchors[btn.anchors.length - 1]
|
let node = document.getElementById('anchor' + id)
|
node && node.scrollIntoView({behavior: 'smooth', block: 'center', inline: 'nearest'})
|
}
|
|
if (btn.openmenu && Array.isArray(btn.openmenu) && btn.openmenu.length > 0 && sign !== '@no_target_menu@') {
|
let menuId = btn.openmenu.slice(-1)[0]
|
let menu = null
|
|
if (window.GLOB.mkThdMenus.has(menuId)) {
|
menu = {...window.GLOB.mkThdMenus.get(menuId), param: { $BID: id }}
|
} else if (btn.MenuID) {
|
menu = {
|
MenuID: btn.MenuID,
|
MenuName: btn.MenuName,
|
type: btn.tabType,
|
param: { $BID: id }
|
}
|
}
|
|
if (menu) {
|
MKEmitter.emit('modifyTabs', menu, true)
|
}
|
}
|
|
if (btn.execSuccess === 'popclose' && btn.$tabId) { // 标签关闭刷新
|
MKEmitter.emit('refreshPopButton', btn.$tabId)
|
}
|
|
if (btn.verify && btn.verify.linkEnable === 'true') {
|
let url = ''
|
if (window.GLOB.systemType === 'production') {
|
url = btn.verify.linkProUrl
|
if (!url) {
|
notification.warning({
|
top: 92,
|
message: window.GLOB.dict['no_prod_link'] || '尚未设置正式系统链接地址!',
|
duration: 5
|
})
|
return
|
}
|
} else {
|
url = btn.verify.linkUrl
|
}
|
|
if (/@/.test(url)) {
|
Object.keys(res).forEach(key => {
|
url = url.replace(new RegExp('@' + key + '@', 'ig'), res[key])
|
})
|
}
|
if (!/^http/.test(url)) {
|
url = window.location.origin + url
|
}
|
|
window.open(url)
|
}
|
}
|
|
triggerNote = (res, ID) => {
|
const { btn } = this.props
|
|
if (!btn.verify) return
|
if (btn.verify.noteEnable !== 'true' && btn.verify.wxNote !== 'true' && btn.verify.printEnable !== 'true' && btn.verify.emailEnable !== 'true') return
|
|
let id = ''
|
if (btn.output) {
|
id = res.mk_b_id || res[btn.output] || ''
|
}
|
|
if (btn.verify.printEnable === 'true') {
|
this.billPrint(id || ID)
|
}
|
|
if (!id) return
|
|
if (btn.verify.noteEnable === 'true') {
|
this.sendMessage(btn.verify, id)
|
}
|
if (btn.verify.emailEnable === 'true') {
|
this.sendEmail(btn.verify, id)
|
}
|
if (btn.verify.wxNote === 'true') {
|
if (btn.verify.wxTemplateId === 'mk_category_temp') {
|
let verify = fromJS(btn.verify).toJS()
|
verify.wxTemplateId = verify.wxCustomTempId
|
|
verify.wxNoteKeys = verify.wxNoteKeys.filter(item => item.key)
|
|
if (!verify.wxTemplateId || verify.wxNoteKeys.length === 0) return
|
|
this.sendWxMessage(verify, id)
|
} else {
|
this.sendWxMessage(btn.verify, id)
|
}
|
}
|
}
|
|
billPrint = (id) => {
|
const { btn } = this.props
|
|
if (!id) return
|
|
if (btn.verify.preHandle === 'true' && btn.verify.pre_func && /#position-print/.test(btn.verify.pre_func)) {
|
MKEmitter.emit('queryModuleParam', btn.$menuId, (res) => {
|
let searches = {}
|
res.search && res.search.forEach(item => {
|
searches[item.key] = item.value
|
})
|
let _param = { id: id || '', tempId: btn.verify.printTempId, pageId: btn.$MenuID || '', dataM: sessionStorage.getItem('dataM')}
|
|
try {
|
// eslint-disable-next-line
|
let func = new Function('btn', 'searches', 'param', 'systemType', btn.verify.pre_func)
|
_param = func(btn, searches, _param, window.GLOB.systemType)
|
} catch (e) {
|
console.warn(e)
|
}
|
|
if (!_param || _param.error) {
|
notification.warning({
|
top: 92,
|
message: _param ? _param.error : '未获取到打印参数,自定义脚本错误!',
|
duration: 5
|
})
|
return
|
}
|
|
window.open('#/billprint/' + window.btoa(window.encodeURIComponent(JSON.stringify(_param))))
|
})
|
} else {
|
setTimeout(() => {
|
window.open('#/billprint/' + window.btoa(window.encodeURIComponent(JSON.stringify({ id: id, tempId: btn.verify.printTempId, pageId: btn.$MenuID || '', dataM: sessionStorage.getItem('dataM') }))))
|
}, 200)
|
}
|
}
|
|
sendWxMessage = (verify, id) => {
|
let domain = window.GLOB.baseurl
|
let appId = window.GLOB.WXAppID || ''
|
|
if (verify.wxAppId && verify.wxAppId !== appId) {
|
appId = verify.wxAppId
|
if (!window.GLOB.WXApps || window.GLOB.WXApps.findIndex(item => item.appId === verify.wxAppId) === -1) {
|
notification.warning({
|
top: 92,
|
message: '按钮关联公众号不在可用列表中,请重新保存按钮配置!',
|
duration: 5
|
})
|
return
|
}
|
}
|
|
if (['8IFltwzyKcu15iA8fqSyb6m-pMa88a3ZTu0No3vDHgo', 'LOB-bbt9jVncGh7IOAUdESh1Sgzcbt62UwOqSqcK9ok'].includes(verify.wxTemplateId) && window.GLOB.sysType !== 'cloud') {
|
domain = 'https://cloud.mk9h.cn/'
|
appId = 'wx4d8a34c8d4494872'
|
}
|
|
if (!appId) {
|
notification.warning({
|
top: 92,
|
message: '尚未添加公众号ID,不可发送模板消息。',
|
duration: 5
|
})
|
return
|
}
|
|
let param = {
|
func: 's_get_sms_weixin_local',
|
upid: id
|
}
|
|
param.LText = Utils.getuuid()
|
param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
param.secretkey = Utils.encrypt(param.LText, param.timestamp)
|
|
Api.genericInterface(param).then(res => {
|
// res.send_data = [{openid: 'o2E7gvoSFvQRG7I8_gZxf4y3ONkQ', send_id: Utils.getuuid(), p1: '010000000001', p2: '明科', p3: 'dddd', p4: '顺风', p5: '成功'}]
|
if (!res.status) {
|
notification.warning({
|
top: 92,
|
message: res.message,
|
duration: 5
|
})
|
return
|
}
|
|
let sends = res.send_data || []
|
sends = sends.filter(item => !!item.openid)
|
|
if (sends.length === 0) {
|
return
|
}
|
|
let _param = {
|
touser: '',
|
template_id: verify.wxTemplateId,
|
data: {}
|
}
|
|
if (verify.wxNoteLink === 'url' && verify.wxNoteLinkUrl) {
|
_param.url = verify.wxNoteLinkUrl
|
} else if (verify.wxNoteLink === 'miniProgram' && (window.GLOB.WXminiAppID || verify.wxNoteMiniId)) {
|
_param.miniprogram = {
|
appid: verify.wxNoteMiniId || window.GLOB.WXminiAppID,
|
pagepath: '/pages/index/index'
|
}
|
|
if (verify.wxNoteLinkMenuId) {
|
_param.miniprogram.pagepath = `/pages/index/index?MenuId=${verify.wxNoteLinkMenuId}`
|
}
|
}
|
|
verify.wxNoteKeys.forEach(item => {
|
_param.data[item.key] = {value: ''}
|
})
|
|
let params = sends.map(item => {
|
let m = fromJS(_param).toJS()
|
|
m.touser = item.openid
|
if (item.bid && m.miniprogram && m.miniprogram.pagepath.indexOf('MenuId') > -1) {
|
m.miniprogram.pagepath = m.miniprogram.pagepath + `&BID=${item.bid}`
|
}
|
|
if (item.send_id) { // 防重入id
|
m.client_msg_id = item.send_id
|
}
|
|
verify.wxNoteKeys.forEach(note => {
|
if (item[note.value] !== undefined) {
|
m.data[note.key].value = item[note.value]
|
}
|
})
|
|
return m
|
})
|
|
// cgi-bin/message/template/send
|
params.forEach(n => {
|
Api.directRequest({
|
url: domain + 'wechat/send?appid=' + appId,
|
method: 'post',
|
data: JSON.stringify(n)
|
}).then(re => {
|
if (verify.wxNoteCallback === 'true') {
|
let msg = re.errmsg || ''
|
|
if (msg.length > 50) {
|
msg = msg.substr(0, 50)
|
}
|
|
let _p = {
|
func: 's_get_sms_weixin_local_suc_err',
|
upid: id,
|
send_id: n.client_msg_id || '',
|
status_result: re.errcode === 0 ? 'S' : 'E',
|
errcode: re.errcode,
|
msg_result: msg
|
}
|
|
_p.LText = Utils.getuuid()
|
_p.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
_p.secretkey = Utils.encrypt(_p.LText, _p.timestamp)
|
|
Api.genericInterface(_p).then(result => {
|
if (!result.status) {
|
notification.warning({
|
top: 92,
|
message: result.message,
|
duration: 5
|
})
|
}
|
})
|
} else if (re.errcode !== 0 && re.errmsg) {
|
let msgs = [
|
{errcode: -1, errmsg: '系统繁忙,请稍候再试'},
|
{errcode: 40001, errmsg: 'access_token 无效'},
|
{errcode: 40003, errmsg: '不合法的 OpenID'},
|
{errcode: 40014, errmsg: '不合法的 access_token'},
|
{errcode: 40033, errmsg: '不合法的请求字符'},
|
{errcode: 43004, errmsg: '需要接收者关注'},
|
{errcode: 43019, errmsg: '需要将接收者从黑名单中移除'},
|
{errcode: 50005, errmsg: '用户未关注公众号'}
|
]
|
|
let msg = msgs.filter(m => m.errcode === re.errcode)[0]
|
msg = msg || re
|
|
notification.warning({
|
top: 92,
|
message: msg.errmsg,
|
duration: 5
|
})
|
}
|
})
|
})
|
})
|
}
|
|
sendMessage = (verify, id) => {
|
let param = {
|
func: 's_get_sms_local',
|
TypeCharOne: verify.noteTemp || 'Y', // N不同内容,Y相同内容
|
TypeCharTwo: verify.noteType || 'N', // N定时,Y实时
|
upid: id
|
}
|
|
param.LText = Utils.getuuid()
|
param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
param.secretkey = Utils.encrypt(param.LText, param.timestamp)
|
|
Api.genericInterface(param).then(res => {
|
if (!res.status) {
|
notification.warning({
|
top: 92,
|
message: res.message,
|
duration: 5
|
})
|
return
|
}
|
|
let _param = {
|
templatecode: verify.noteCode, // 模板编码
|
TypeCharOne: verify.noteTemp || 'Y', // N不同内容,Y相同内容
|
ID: verify.noteId || '' // 模板Id,暂时未使用
|
}
|
|
_param.submitdate = res.submitdate
|
|
let limit = 5 // 实时最大为5条,定时最大为100条
|
let mobMap = new Map()
|
|
if (verify.noteType === 'Y') {
|
_param.func = 's_get_sms_sso_realtime'
|
} else {
|
_param.func = 's_get_sms_sso_timer'
|
limit = 100
|
}
|
|
let Ltext = []
|
let error = false
|
|
if (verify.noteTemp !== 'N') {
|
_param.p1 = res.p1 || ''
|
_param.p2 = res.p2 || ''
|
_param.p3 = res.p3 || ''
|
_param.p4 = res.p4 || ''
|
_param.p5 = res.p5 || ''
|
|
let _p = _param.p1 + _param.p2 + _param.p3 + _param.p4 + _param.p5
|
|
if (/\/|.*共.*产|.*习.*近|面试|邀请|下载|红包|招聘|好评|评价|政务通知|缴费|保险|股票|金融|房地产|教育|游戏|微信/.test(_p)) {
|
error = true
|
}
|
}
|
|
res.send_data && res.send_data.forEach(item => {
|
if (item.mob && !mobMap.has(item.mob) && Ltext.length < limit) {
|
if (verify.noteTemp !== 'N') {
|
Ltext.push(`'${item.mob}'`)
|
} else {
|
let _p = `'${item.p1 || ''}','${item.p2 || ''}','${item.p3 || ''}','${item.p4 || ''}','${item.p5 || ''}','${item.mob}'`
|
|
if (/\/|.*共.*产|.*习.*近|面试|邀请|下载|红包|招聘|好评|评价|政务通知|缴费|保险|股票|金融|房地产|教育|游戏|微信/.test(_p)) {
|
error = true
|
}
|
|
Ltext.push(_p)
|
}
|
mobMap.set(item.mob, true)
|
}
|
})
|
|
if (error) {
|
notification.warning({
|
top: 92,
|
message: '消息中含有非法字符',
|
duration: 5
|
})
|
return
|
}
|
|
if (Ltext.length === 0) return
|
|
Ltext = Ltext.join(';')
|
|
_param.LText = window.btoa(window.encodeURIComponent(Ltext))
|
_param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
_param.secretkey = Utils.encrypt(_param.LText, _param.timestamp)
|
|
_param.rduri = 'https://sso.mk9h.cn/webapi/dostars'
|
|
_param.userid = 'bh0bapabtd45epsgra79segbch6c1ibk'
|
_param.LoginUID = 'bh0bapabtd45epsgra79segbch6c1ibk'
|
|
Api.genericInterface(_param).then(result => {
|
if (!result.status) {
|
notification.warning({
|
top: 92,
|
message: result.message,
|
duration: 5
|
})
|
}
|
}, (error) => {
|
if (error && error.ErrCode === 'LoginError') {
|
let param = {
|
func: 's_visitor_login',
|
timestamp: moment().format('YYYY-MM-DD HH:mm:ss'),
|
SessionUid: 'bh0bapabtd45epsgra79segbch6c1ibk',
|
TypeCharOne: 'pc',
|
appkey: '202004041613277377A6A2456D34A4948AE84'
|
}
|
|
param.LText = md5(window.btoa('bh0bapabtd45epsgra79segbch6c1ibk' + param.timestamp))
|
param.secretkey = md5(param.LText + 'mingke' + param.timestamp)
|
|
let params = {
|
url: 'https://sso.mk9h.cn/webapi/dologon',
|
method: 'post',
|
data: JSON.stringify(param)
|
}
|
|
Api.directRequest(params)
|
|
return
|
}
|
})
|
})
|
}
|
|
sendEmail = (verify, id) => {
|
let param = {
|
func: 's_get_email_local',
|
TypeCharOne: verify.emailTemp || 'Y', // N不同内容,Y相同内容
|
TypeCharTwo: verify.emailType || 'N', // N定时,Y实时
|
upid: id
|
}
|
|
param.LText = Utils.getuuid()
|
param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
param.secretkey = Utils.encrypt(param.LText, param.timestamp)
|
|
Api.genericInterface(param).then(res => {
|
if (!res.status) {
|
notification.warning({
|
top: 92,
|
message: res.message,
|
duration: 5
|
})
|
return
|
}
|
|
let _param = {
|
msn_email_temp_no: verify.emailCode, // 模板编码
|
TypeCharOne: verify.emailTemp || 'Y', // N不同内容,Y相同内容
|
ID: verify.emailId || '' // 模板Id,暂时未使用
|
}
|
|
_param.submitdate = res.submitdate
|
|
let limit = 5 // 实时最大为5条,定时最大为100条
|
let mobMap = new Map()
|
|
if (verify.emailType === 'Y') {
|
_param.func = 's_get_email_sso_realtime'
|
} else {
|
_param.func = 's_get_email_sso_timer'
|
limit = 100
|
}
|
|
let Ltext = []
|
let error = false
|
|
if (verify.emailTemp !== 'N') {
|
_param.p1 = res.p1 || ''
|
_param.p2 = res.p2 || ''
|
_param.p3 = res.p3 || ''
|
_param.p4 = res.p4 || ''
|
_param.p5 = res.p5 || ''
|
|
let _p = _param.p1 + _param.p2 + _param.p3 + _param.p4 + _param.p5
|
|
if (/\/|.*共.*产|.*习.*近|面试|邀请|下载|红包|招聘|好评|评价|政务通知|缴费|保险|股票|金融|房地产|教育|游戏|微信/.test(_p)) {
|
error = true
|
}
|
}
|
|
res.send_data && res.send_data.forEach(item => {
|
if (item.email && !mobMap.has(item.email) && Ltext.length < limit) {
|
if (verify.emailTemp !== 'N') {
|
Ltext.push(`'${item.email}'`)
|
} else {
|
let _p = `'${item.p1 || ''}','${item.p2 || ''}','${item.p3 || ''}','${item.p4 || ''}','${item.p5 || ''}','${item.email}'`
|
|
if (/\/|.*共.*产|.*习.*近|面试|邀请|下载|红包|招聘|好评|评价|政务通知|缴费|保险|股票|金融|房地产|教育|游戏|微信/.test(_p)) {
|
error = true
|
}
|
|
Ltext.push(_p)
|
}
|
mobMap.set(item.email, true)
|
}
|
})
|
|
if (error) {
|
notification.warning({
|
top: 92,
|
message: '消息中含有非法字符',
|
duration: 5
|
})
|
return
|
}
|
|
if (Ltext.length === 0) return
|
|
Ltext = Ltext.join(';')
|
|
_param.LText = window.btoa(window.encodeURIComponent(Ltext))
|
_param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
_param.secretkey = Utils.encrypt(_param.LText, _param.timestamp)
|
|
_param.rduri = 'https://sso.mk9h.cn/webapi/dostars'
|
|
_param.userid = 'bh0bapabtd45epsgra79segbch6c1ibk'
|
_param.LoginUID = 'bh0bapabtd45epsgra79segbch6c1ibk'
|
|
Api.genericInterface(_param).then(result => {
|
if (!result.status) {
|
notification.warning({
|
top: 92,
|
message: result.message,
|
duration: 5
|
})
|
}
|
}, (error) => {
|
if (error && error.ErrCode === 'LoginError') {
|
let param = {
|
func: 's_visitor_login',
|
timestamp: moment().format('YYYY-MM-DD HH:mm:ss'),
|
SessionUid: 'bh0bapabtd45epsgra79segbch6c1ibk',
|
TypeCharOne: 'pc',
|
appkey: '202004041613277377A6A2456D34A4948AE84'
|
}
|
|
param.LText = md5(window.btoa('bh0bapabtd45epsgra79segbch6c1ibk' + param.timestamp))
|
param.secretkey = md5(param.LText + 'mingke' + param.timestamp)
|
|
let params = {
|
url: 'https://sso.mk9h.cn/webapi/dologon',
|
method: 'post',
|
data: JSON.stringify(param)
|
}
|
|
Api.directRequest(params)
|
|
return
|
}
|
})
|
})
|
}
|
|
/**
|
* @description 操作失败后处理
|
* 1、状态码为 E、N、F、NM 时,显示相应提示信息
|
* 2、excel导出,失败后取消导出按钮加载中状态
|
* 3、通知主列表刷新
|
*/
|
execError = (res = {}) => {
|
const { btn } = this.props
|
const { autoMatic, dict } = this.state
|
|
if (this.preCallback) {
|
this.setState({
|
loading: false,
|
visible: false
|
})
|
this.preCallback(res)
|
return
|
} else if (autoMatic) {
|
notification.error({
|
top: 92,
|
message: res.message || dict['exc_fail'] || '执行失败!',
|
duration: 10
|
})
|
|
this.setState({
|
loading: false,
|
loadingNumber: '',
|
loadingTotal: '',
|
visible: false
|
})
|
MKEmitter.emit('autoExecOver', btn.uuid, 'error')
|
return
|
}
|
|
if (!['LoginError', 'C', '-2', 'E', 'N', 'F', 'NM'].includes(res.ErrCode)) {
|
res.ErrCode = 'E'
|
}
|
|
let sign = ''
|
if (/^@speak@/i.test(res.message)) {
|
res.message = res.message.replace(/^@speak@/i, '')
|
let val = res.message.match(/<<.*>>/)
|
res.message = res.message.replace(/\s*<<.*>>\s*/g, '')
|
val = val ? val[0].replace(/<<|>>/g, '') : ''
|
|
if (/^http/.test(val)) {
|
let audio = document.createElement('audio')
|
audio.src = val
|
audio.play()
|
}
|
|
if (!res.message) {
|
res.ErrCode = '-1'
|
}
|
} else if (/@close_tab@|@close_popup@|@goback@/i.test(res.message)) {
|
sign = res.message.match(/@close_tab@|@close_popup@|@goback@/i)[0].toLowerCase()
|
res.message = res.message.replace(/@close_tab@|@close_popup@|@goback@/i, '')
|
}
|
|
if (res.ErrCode === 'E') {
|
let msg = res.message || dict['exc_fail'] || '执行失败!'
|
if (/\n|\r/.test(msg)) {
|
msg = msg.replace(/\n|\r/ig, '<br/>')
|
msg = <span dangerouslySetInnerHTML={{__html: msg}}></span>
|
}
|
Modal.error({
|
title: msg,
|
okText: dict['got_it'] || '知道了',
|
onOk: () => {
|
this.errorContinue(sign)
|
}
|
})
|
return
|
} else if (res.ErrCode === 'N') {
|
notification.error({
|
top: 92,
|
message: res.message || dict['exc_fail'] || '执行失败!',
|
duration: btn.verify && btn.verify.ntime ? btn.verify.ntime : 10
|
})
|
} else if (res.ErrCode === 'F') {
|
notification.error({
|
className: 'notification-custom-error',
|
top: 92,
|
message: res.message || dict['exc_fail'] || '执行失败!',
|
duration: btn.verify && btn.verify.ftime ? btn.verify.ftime : 10
|
})
|
} else if (res.ErrCode === 'NM') {
|
message.error(res.message || dict['exc_fail'] || '执行失败!')
|
} else if (res.ErrCode === '-2') {
|
this.setState({
|
loadingNumber: '',
|
loadingTotal: '',
|
loading: false
|
})
|
return
|
}
|
|
this.errorContinue(sign)
|
}
|
|
errorContinue = (sign) => {
|
const { btn } = this.props
|
const { btnconfig } = this.state
|
|
if (btn.OpenType !== 'pop' || !btnconfig || btnconfig.setting.finish !== 'unclose') {
|
this.setState({
|
loading: false
|
})
|
}
|
|
this.setState({
|
loadingNumber: '',
|
loadingTotal: '',
|
})
|
|
if (btnconfig && btnconfig.setting && btnconfig.setting.errFocus) {
|
MKEmitter.emit('mkFC', 'focus', btnconfig.setting.errFocus)
|
}
|
|
if (sign === '@close_tab@') {
|
MKEmitter.emit('closeTabView', btn.$MenuID)
|
} else if (btn.execError === 'closepoptab' || sign === '@close_popup@') {
|
MKEmitter.emit('popclose')
|
} else if (btn.execError !== 'never') {
|
let tabId = ''
|
if (btn.refreshTab && btn.refreshTab.length > 0) {
|
tabId = btn.refreshTab[btn.refreshTab.length - 1]
|
}
|
if (tabId && btn.$MenuID === tabId) { // 刷新当前菜单时,停止其他操作
|
MKEmitter.emit('reloadMenuView', tabId)
|
return
|
}
|
|
MKEmitter.emit('refreshByButtonResult', btn.$menuId, btn.execError, btn, '', this.state.selines)
|
|
if (btn.syncComponentId) {
|
if (btn.syncComponentId === 'multiComponent') {
|
btn.syncComponentIds.forEach((id, i) => {
|
setTimeout(() => {
|
if (/\$focus/.test(id)) {
|
MKEmitter.emit('reloadData', id.split('$')[0], id.split('$')[1])
|
} else {
|
MKEmitter.emit('reloadData', id)
|
}
|
}, 20 * i)
|
})
|
} else if (/\$focus/.test(btn.syncComponentId)) {
|
MKEmitter.emit('reloadData', btn.syncComponentId.split('$')[0], btn.syncComponentId.split('$')[1])
|
} else {
|
if (btn.syncDelay) {
|
this.delayTimer && clearTimeout(this.delayTimer)
|
this.delayTimer = setTimeout(() => {
|
MKEmitter.emit('reloadData', btn.syncComponentId)
|
}, btn.syncDelay)
|
} else {
|
MKEmitter.emit('reloadData', btn.syncComponentId)
|
}
|
}
|
}
|
|
if (tabId) {
|
MKEmitter.emit('reloadMenuView', tabId)
|
}
|
}
|
|
if (btn.OpenType === 'form') {
|
let data = this.props.selectedData && this.props.selectedData[0] ? this.props.selectedData[0] : null
|
|
if (btn.formType === 'counter') {
|
let count = 0
|
if (data && data[btn.field]) {
|
count = +data[btn.field]
|
if (isNaN(count)) {
|
count = 0
|
}
|
}
|
|
this.setState({count: count })
|
} else {
|
this.setState({check: data && data[btn.field] === btn.openVal})
|
}
|
}
|
|
if (window.GLOB.breakpoint) {
|
MKEmitter.emit('refreshDebugTable')
|
}
|
|
if (btn.execError === 'popclose' && btn.$tabId) { // 标签关闭刷新
|
MKEmitter.emit('refreshPopButton', btn.$tabId)
|
}
|
}
|
|
handleModelConfig = (config) => {
|
let roleId = sessionStorage.getItem('role_id') || '' // 角色ID
|
config.fields = config.fields.map(cell => {
|
// 数据源sql语句,预处理,权限黑名单字段设置为隐藏表单
|
if (['select', 'link', 'multiselect', 'radio', 'checkbox', 'checkcard'].includes(cell.type) && cell.resourceType === '1') {
|
let _option = Utils.getSelectQueryOptions(cell)
|
|
cell.base_sql = _option.sql
|
cell.arr_field = _option.field
|
}
|
|
// 字段权限黑名单
|
if (!cell.blacklist || cell.blacklist.length === 0) return cell
|
if (cell.blacklist.filter(v => roleId.indexOf(v) > -1).length > 0) {
|
cell.hidden = 'true'
|
}
|
|
return cell
|
})
|
return config
|
}
|
|
/**
|
* @description 获取按钮配置信息
|
*/
|
improveAction = () => {
|
const { btn } = this.props
|
const { btnconfig } = this.state
|
|
if (btnconfig) {
|
if (btnconfig.setting.display === 'prompt' || btnconfig.setting.display === 'exec') { // 如果表单以是否框展示
|
this.modelconfirm()
|
} else {
|
this.setState({
|
visible: true
|
})
|
|
if (btnconfig.setting.display === 'modal' && btnconfig.setting.moveable === 'true') {
|
setTimeout(() => {
|
this.setMove()
|
}, 100)
|
}
|
}
|
} else if (!btn.$old) {
|
notification.warning({
|
top: 92,
|
message: '未获取到按钮配置信息!',
|
duration: 5
|
})
|
this.setState({ loading: false })
|
} else {
|
Api.getCacheConfig({
|
func: 'sPC_Get_LongParam',
|
MenuID: btn.uuid
|
}).then(res => {
|
let _LongParam = ''
|
|
if (res.status && res.LongParam) {
|
try {
|
_LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
|
} catch (e) {
|
console.warn('Parse Failure')
|
_LongParam = ''
|
}
|
}
|
|
if (!res.status) {
|
notification.warning({
|
top: 92,
|
message: res.message,
|
duration: 5
|
})
|
this.setState({ loading: false })
|
} else if (!_LongParam || (btn.OpenType === 'pop' && _LongParam.type !== 'Modal')) {
|
notification.warning({
|
top: 92,
|
message: '未获取到按钮配置信息!',
|
duration: 5
|
})
|
this.setState({ loading: false })
|
} else {
|
_LongParam = updateForm(_LongParam)
|
_LongParam = this.handleModelConfig(_LongParam)
|
|
this.setState({
|
btnconfig: _LongParam
|
}, () => {
|
if (_LongParam.setting.display === 'prompt' || _LongParam.setting.display === 'exec') { // 如果表单以是否框展示
|
this.modelconfirm()
|
} else {
|
this.setState({
|
visible: true
|
})
|
}
|
})
|
}
|
})
|
}
|
}
|
|
/**
|
* @description 模态框(表单),确认
|
*/
|
handleOk = () => {
|
if (!this.formRef) return
|
|
this.formRef.handleConfirm().then(res => {
|
this.setState({ confirmLoading: true })
|
|
this.execSubmit(this.state.selines, () => { this.setState({ confirmLoading: false }) }, res)
|
})
|
}
|
|
/**
|
* @description 模态框(表单),取消
|
*/
|
handleCancel = () => {
|
this.setState({
|
loading: false,
|
visible: false,
|
confirmLoading: false
|
})
|
|
this.preCallback && this.preCallback()
|
}
|
|
modelconfirm = () => {
|
const { BID } = this.props
|
const { btnconfig, selines, dict } = this.state
|
let that = this
|
|
let result = []
|
let _data = {}
|
let BData = {}
|
|
if (selines[0]) {
|
Object.keys(selines[0]).forEach(key => {
|
_data[key.toLowerCase()] = selines[0][key]
|
})
|
}
|
if (this.props.BData) {
|
Object.keys(this.props.BData).forEach(key => {
|
BData[key.toLowerCase()] = this.props.BData[key]
|
})
|
}
|
|
btnconfig.fields.forEach(item => {
|
if (!item.field) return
|
|
let _item = {
|
key: item.field,
|
readin: item.readin !== 'false' && item.readin !== 'top',
|
fieldlen: item.fieldlength || 50,
|
writein: item.writein !== 'false',
|
type: item.type,
|
value: item.initval,
|
isconst: item.constant === 'true'
|
}
|
|
let key = item.field.toLowerCase()
|
let _readin = item.readin !== 'false'
|
|
if (_item.type === 'date') { // 时间兼容
|
_item.precision = item.precision || 'day'
|
} else if (_item.type === 'datetime') {
|
_item.type = 'date'
|
_item.precision = 'second'
|
} else if (['funcvar', 'linkMain'].includes(_item.type)) {
|
_readin = false
|
_item.readin = false
|
} else if (['select', 'link', 'radio'].includes(_item.type)) { // 选中第一项
|
if (/^\s*\$first\s*$/.test(_item.value)) {
|
_item.value = ''
|
|
if (item.resourceType === '0' && item.options[0] && item.options[0].Value) {
|
_item.value = item.options[0].Value
|
}
|
}
|
}
|
|
if (_item.type === 'funcvar') {
|
_item.value = ''
|
} else if (_item.type === 'linkMain' && BData.hasOwnProperty(key)) {
|
_item.value = BData[key]
|
} else if (_readin && _data.hasOwnProperty(key)) {
|
_item.value = _data[key]
|
} else if (_item.type === 'date' && _item.value) {
|
_item.value = moment().subtract(_item.value, 'days').format(_item.precision === 'day' ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm:ss')
|
} else if (_item.type === 'datemonth' && _item.value) {
|
_item.value = moment().subtract(_item.value, 'month').format('YYYY-MM')
|
}
|
|
_item.value = _item.value === undefined ? '' : _item.value
|
|
if (_item.type === 'number' || item.declare === 'decimal') {
|
_item.type = 'number'
|
_item.fieldlen = item.decimal || 0
|
} else if (['text', 'textarea', 'linkMain'].includes(_item.type)) {
|
_item.value = _item.value + ''
|
_item.value = _item.value.replace(/\t+|\v+/g, '') // 去除制表符
|
|
if (item.interception !== 'false') { // 去除首尾空格
|
if (item.interception === 'func') {
|
try {
|
// eslint-disable-next-line
|
let func = new Function('value', 'data', item.func)
|
_item.value = func(_item.value, _data)
|
_item.value = _item.value !== undefined ? _item.value : ''
|
} catch (e) {
|
console.warn(e)
|
_item.value = ''
|
}
|
} else if (item.interception === 'charTure') {
|
let str = _item.value.replace(/(^\s*|\s*$)/g, '')
|
let result = ''
|
for (let i = 0 ; i < str.length; i++) {
|
let code = str.charCodeAt(i)
|
if (code >= 65281 && code <= 65373) {
|
result += String.fromCharCode(str.charCodeAt(i) - 65248)
|
} else if (code === 12288) {
|
result += String.fromCharCode(str.charCodeAt(i) - 12288 + 32)
|
} else {
|
result += str.charAt(i)
|
}
|
}
|
_item.value = result
|
} else {
|
_item.value = _item.value.replace(/(^\s*|\s*$)/g, '')
|
}
|
}
|
if (_item.type === 'text' && /@appkey@|@SessionUid@|@bid@/ig.test(_item.value)) { // 特殊字段替换
|
_item.value = _item.value.replace(/^(\s*)@appkey@(\s*)$/ig, window.GLOB.appkey).replace(/^(\s*)@SessionUid@(\s*)$/ig, (localStorage.getItem('SessionUid') || '')).replace(/^(\s*)@bid@(\s*)$/ig, (BID || ''))
|
}
|
if (_item.type === 'text' && item.lenControl && item.lenControl !== 'limit') {
|
if (item.lenControl === 'left') {
|
_item.value = _item.value.substr(0, item.fieldlength)
|
} else {
|
_item.value = _item.value.slice(-item.fieldlength)
|
}
|
}
|
} else if (_item.type === 'datemonth') {
|
_item.type = 'text'
|
} else if (_item.type === 'date') {
|
_item.type = item.declareType === 'nvarchar(50)' ? 'text' : 'date'
|
} else if (_item.type === 'switch' || _item.type === 'check') {
|
if (_readin) {
|
_item.value = _item.value === item.openVal ? item.openVal : item.closeVal
|
} else {
|
if (item.initval === true) {
|
_item.value = item.openVal
|
} else {
|
_item.value = item.closeVal
|
}
|
}
|
} else if (_item.type === 'rate') {
|
let count = item.rateCount || 5
|
_item.value = parseInt(_item.value)
|
|
if (isNaN(_item.value) || _item.value < 0) {
|
_item.value = 0
|
} else if (_item.value > count) {
|
_item.value = count
|
}
|
}
|
|
result.push(_item)
|
})
|
|
if (btnconfig.setting.display === 'exec') {
|
this.execSubmit(selines, () => {}, result)
|
} else {
|
confirm({
|
title: btnconfig.setting.tipTitle || dict['exec_sure'] || '确定要执行吗?',
|
okText: dict['ok'] || '确定',
|
cancelText: dict['cancel'] || '取消',
|
onOk() {
|
return new Promise(resolve => {
|
that.execSubmit(selines, resolve, result)
|
})
|
},
|
onCancel() {
|
that.preCallback && that.preCallback()
|
that.setState({ loading: false })
|
}
|
})
|
}
|
}
|
|
/**
|
* @description 显示模态框
|
*/
|
getModels = () => {
|
const { BID, btn, BData } = this.props
|
const { btnconfig, visible, dict } = this.state
|
|
if (!btnconfig || !btnconfig.setting) return null
|
|
let title = btn.label
|
let width = btnconfig.setting.width > 100 ? btnconfig.setting.width : btnconfig.setting.width + 'vw'
|
let clickouter = btnconfig.setting.clickouter === 'close'
|
|
if (btnconfig.setting.display === 'drawer') {
|
let height = '100vh'
|
if (btnconfig.setting.placement === 'top' || btnconfig.setting.placement === 'bottom') {
|
width = '100vw'
|
height = btnconfig.setting.width > 100 ? btnconfig.setting.width : btnconfig.setting.width + 'vh'
|
}
|
return (
|
<Drawer
|
title={title}
|
width={width}
|
height={height}
|
maskClosable={clickouter}
|
onClose={this.handleCancel}
|
visible={visible}
|
placement={btnconfig.setting.placement || 'right'}
|
bodyStyle={{ paddingBottom: 80 }}
|
destroyOnClose
|
>
|
<MutilForm
|
BID={BID}
|
action={btnconfig}
|
inputSubmit={this.handleOk}
|
data={this.state.selines[0]}
|
BData={BData}
|
wrappedComponentRef={(inst) => this.formRef = inst}
|
/>
|
<div className="ant-drawer-footer" style={{ position: 'absolute', zIndex: 1, right: 0, bottom: 0, width: '100%', borderTop: '1px solid #e9e9e9', padding: '10px 16px', background: '#fff', textAlign: 'right'}}>
|
<Button onClick={this.handleCancel} style={{ marginRight: 8 }}>
|
{btnconfig.setting.formType !== 'check' ? dict['cancel'] || '取消' : dict['close'] || '关闭'}
|
</Button>
|
{btnconfig.setting.formType !== 'check' ? <Button onClick={this.handleOk} loading={this.state.confirmLoading} type="primary">
|
{dict['ok'] || '确定'}
|
</Button> : null}
|
</div>
|
</Drawer>
|
)
|
} else {
|
let container = document.body
|
|
if (btnconfig.setting.container === 'tab' && btn.ContainerId) {
|
width = btnconfig.setting.width > 100 ? btnconfig.setting.width : btnconfig.setting.width + '%'
|
container = () => document.getElementById(btn.ContainerId)
|
}
|
|
if (btnconfig.setting.icon) {
|
title = <>
|
<span className={'mk-modal-icon-' + btnconfig.setting.iconType} style={{background: btnconfig.setting.iconColor || 'unset', color: btnconfig.setting.iconColor || 'inherit'}}><MkIcon type={btnconfig.setting.icon}/></span>
|
{title}
|
</>
|
}
|
|
return (
|
<Modal
|
title={title}
|
maskClosable={clickouter}
|
getContainer={container}
|
wrapClassName={'action-modal' + (btnconfig.setting.moveable === 'true' ? ' moveable-modal modal-' + btn.uuid : '')}
|
visible={visible}
|
width={width}
|
okText={dict['ok'] || '确定'}
|
cancelText={dict['cancel'] || '取消'}
|
onOk={this.handleOk}
|
maskStyle={btnconfig.setting.moveable === 'true' ? {backgroundColor: 'rgba(0, 0, 0, 0.15)'} : null}
|
confirmLoading={this.state.confirmLoading}
|
onCancel={this.handleCancel}
|
destroyOnClose
|
>
|
<MutilForm
|
BID={BID}
|
action={btnconfig}
|
inputSubmit={this.handleOk}
|
data={this.state.selines[0]}
|
BData={BData}
|
wrappedComponentRef={(inst) => this.formRef = inst}
|
/>
|
</Modal>
|
)
|
}
|
}
|
|
setMove = () => {
|
const { btn } = this.props
|
let wrap = document.getElementsByClassName('modal-' + btn.uuid)[0]
|
|
if (!wrap) return
|
|
let node = wrap.getElementsByClassName('ant-modal-header')[0]
|
|
if (!node) return
|
|
node.onmousedown = function(e) {
|
let orileft = 0
|
let oritop = 0
|
let oleft = e.clientX
|
let otop = e.clientY
|
|
if (node.parentNode.style.left) {
|
orileft = parseFloat(node.parentNode.style.left)
|
}
|
if (node.parentNode.style.top) {
|
oritop = parseFloat(node.parentNode.style.top)
|
}
|
|
document.onmousemove = function(e) {
|
let left = e.clientX - oleft
|
let top = e.clientY - otop
|
|
node.parentNode.style.left = (orileft + left) + 'px'
|
node.parentNode.style.top = (oritop + top) + 'px'
|
}
|
}
|
|
document.onmouseup = function() {
|
document.onmousemove = null
|
}
|
}
|
|
changeCount = (count) => {
|
this.setState({count}, () => {
|
this.actionTrigger()
|
})
|
}
|
|
changeLineCount = (count) => {
|
const { btn, selectedData } = this.props
|
const { disabled, dict } = this.state
|
|
if (disabled) return
|
|
let data = selectedData || []
|
|
if (data.length === 0) {
|
// 需要选择行时,校验数据
|
notification.warning({
|
top: 92,
|
message: dict['select_row'] || '请选择行!',
|
duration: 5
|
})
|
return
|
} else if (data.length !== 1) {
|
// 需要选择单行时,校验数据
|
notification.warning({
|
top: 92,
|
message: dict['select_single_row'] || '请选择单行数据!',
|
duration: 5
|
})
|
return
|
}
|
|
this.setState({count}, () => {
|
MKEmitter.emit('refreshLineData', btn.$menuId, btn, data[0].$$uuid, count)
|
})
|
}
|
|
render() {
|
const { btn, name } = this.props
|
const { loadingNumber, loadingTotal, loading, disabled, hidden, check, count } = this.state
|
|
if (hidden) return null
|
if (btn.OpenType === 'form') {
|
if (btn.formType === 'switch') {
|
return <Switch loading={loading} checked={check} disabled={disabled || loading} title={disabled ? (btn.reason || '') : ''} onChange={(val,e) => {e.stopPropagation();this.actionTrigger()}} style={btn.style} className={btn.size === 'large' ? 'ant-switch-large' : ''} size={btn.size} checkedChildren={btn.openText || ''} unCheckedChildren={btn.closeText || ''}/>
|
} else if (btn.formType === 'counter') {
|
return <MkCounter count={count} disabled={disabled} btn={btn} onChange={this.changeCount}/>
|
} else if (btn.formType === 'count_line') {
|
return <MkCounter count={count} disabled={disabled} btn={btn} onChange={this.changeLineCount}/>
|
} else if (btn.formType === 'radio') {
|
return <Checkbox className={btn.checkType || ''} disabled={disabled || loading} title={disabled ? (btn.reason || '') : ''} checked={check} onChange={(e) => {e.stopPropagation();this.actionTrigger()}} style={btn.style}></Checkbox>
|
} else {
|
return <Button type="link" icon="scan" disabled={true} style={btn.style} onClick={(e) => {e.stopPropagation()}}></Button>
|
}
|
}
|
|
let label = ''
|
|
if (btn.show === 'link') {
|
label = <span>{name || btn.label}{btn.icon ? <MkIcon style={{marginLeft: '8px'}} type={btn.icon} /> : ''}</span>
|
} else if (btn.show === 'icon') {
|
label = !loading ? <MkIcon type={btn.icon} /> : null
|
} else if (btn.$toolbtn) {
|
label = <span>{!loading && btn.icon ? <MkIcon style={{marginRight: '8px'}} type={btn.icon} /> : ''}{loadingNumber && !loadingTotal ? `(${loadingNumber})` : ''}{btn.label}</span>
|
} else {
|
label = <span>{!loading && btn.icon ? <MkIcon style={{marginRight: '8px'}} type={btn.icon} /> : ''}{name || btn.label}</span>
|
}
|
|
let BTN = <Button
|
type="link"
|
id={'button' + btn.uuid}
|
title={disabled ? (btn.reason || '') : (btn.show === 'icon' ? btn.label : '')}
|
loading={loading}
|
disabled={disabled}
|
style={btn.style}
|
className={btn.hover || ''}
|
onClick={(e) => {e.stopPropagation(); this.actionTrigger()}}
|
>{label}</Button>
|
|
if (btn.hoverTitle) {
|
BTN = <Popover mouseLeaveDelay={0.3} mouseEnterDelay={0.3} content={btn.hoverTitle} trigger="hover">
|
{BTN}
|
</Popover>
|
}
|
|
return <>
|
{BTN}
|
<span onClick={(e) => {e.stopPropagation()}}>{this.getModels()}</span>
|
{loadingTotal ? <Progress className="mk-button-progress" percent={(loadingTotal - loadingNumber) / loadingTotal * 100} size="small" showInfo={false} /> : null}
|
</>
|
}
|
}
|
|
export default NormalButton
|