import {validatenull} from "@/util/validate"; import Vue from 'vue'; import {handlerAction} from '../handlers'; /** * 按钮的基础服务 */ /** * action通用入口 */ export const doAction = (button,options,callback) => { options.paramVOS = paramLow(options.paramVOS) options.paramVOS['title'] = replaceFreeMarker(options.paramVOS.title, options.dataStore, options.sourceData); let isShow = true; if (options.paramVOS['initvalue'] && typeof (options.paramVOS.initvalue) == 'string') { let values = options.paramVOS['initvalue'].split(';'); let initValues = {} values.forEach((item, i) => { if (isShow) { item = item.replace(':', '='); if (item.indexOf('${') > -1) { if (item.split('=')[1].indexOf('.') > -1) { //initvaluenull=true允许初始值为空 if ((options.sourceData.length < 1 || !options.sourceData.oid) && options.paramVOS['needselect'] != false && options.paramVOS['needselect'] != "false") { isShow = false; Vue.prototype.$message.error("请先选择一条来源数据") return false; } let name = item.split('=')[1].split('.')[1].replace('${', '').replace('}', ''); if (options.sourceData) { initValues[item.split('=')[0]] = options.sourceData[name] } else { initValues[item.split('=')[0]] = "" } } else { if (options.dataStore.length < 1 && options.paramVOS['needselect'] != false && options.paramVOS['needselect'] != "false") { isShow = false; Vue.prototype.$message.error("请先选择一条数据"); return false; } let name = item.split('=')[1].replace('${', '').replace('}', ''); if (options.dataStore[0]) { initValues[item.split('=')[0]] = options.dataStore[0][name]; } else { initValues[item.split('=')[0]] = ""; } } } } }) if (isShow) { options.paramVOS['initvalue'] = initValues } } if (!isShow) { return; } if (validatenull(options.paramVOS.context)) { options.paramVOS.context = options.paramVOS.content; } if (button.url && button.url != 'null') { //有配置action路径,使用路径对应的js import(`../${button.url}`).then(module => { module.doAction(options, callback); }) } else { //执行通用action handlerAction(button.actionVO.id.toLowerCase(),options, callback) } }; /** * 替换文本中的${xxx} * @param text 文本 * @param dataStore 选择的数据 * @param sourceData 来源数据 * @returns 替换后的值,字符串 */ export const replaceFreeMarker = (text,dataStore,sourceData) => { //替换表达式 if (!sourceData) { sourceData = {}; } if (!dataStore) { dataStore = []; } let replaceData = dataStore.length > 0 ? dataStore[0] : {}; if (text && text.indexOf("${") > -1 && text.indexOf("}")) { //js只能使用${xxx}这种的方式 let reg = "root.${"; while (text.indexOf(reg) > -1) { let temp = text.substring(0, text.indexOf(reg)); let field = text.substring(text.indexOf(reg) + reg.length, text.indexOf("}")); let end = text.substring(text.indexOf("}") + 1); field = sourceData[field] || ''; text = temp + field + end; } reg = "sourceData.${"; while (text.indexOf(reg) > -1) { let temp = text.substring(0, text.indexOf(reg)); let field = text.substring(text.indexOf(reg) + reg.length, text.indexOf("}")); let end = text.substring(text.indexOf("}") + 1); field = sourceData[field] || ''; text = temp + field + end; } reg = "${"; while (text.indexOf(reg) > -1) { let temp = text.substring(0, text.indexOf(reg)); let field = text.substring(text.indexOf(reg) + reg.length, text.indexOf("}")); let end = text.substring(text.indexOf("}") + 1); field = replaceData[field] || ''; text = temp + field + end; } } return text; }; /** * 参数转换为小写 * @param paramsVOs 参数 * @returns 小写后的参数对象 */ export const paramLow = (paramsVOs) => { // if (!paramsVOs) { paramsVOs = {}; } var params = {}; for (var key in paramsVOs) { params[key.toLowerCase()] = paramsVOs[key]; } return params; }; /** * 执行前置事件 * @param options 按钮的配置信息,前置事件里配置的参数会替换这个里的参数的信息 * @param fnTarget 执行方法 * @param callback 回调,如果存在前置事件,会在执行完成后执行回调,否则直接回调 * @param preEventName 前置事件名称,默认beforeevent */ export const callPreEvent = (options,fnTarget,callback,preEventName) => { let beforeEvent = options.paramVOS[preEventName || 'prepvent']; if(beforeEvent) { let buttonParse = parseEventByUrl(beforeEvent,options,true); if(validatenull(buttonParse.jsPath)){ fnTarget(buttonParse,callback); }else{ try { import(`../${buttonParse.jsPath}.js`).then(module => { module[buttonParse.methodName](options,callback); }) } catch (error) { Vue.prototype.$message.error('未找到前置事件执行js'); } } }else{ if(callback){ callback(options); } } }; /** * 执行后置事件 * @param options 按钮的配置信息,后置事件里配置的参数会替换这个里的参数的信息 * @param fnTarget 执行方法 * @param callback 回调,如果存在后置事件,会在执行完成后执行回调,否则直接回调 * @param preEventName 后置事件名称,默认 afterevent */ export const callPostEvent = (options,fnTarget,callback,actionType,postEventName)=>{ let afterEvent = options.paramVOS[postEventName || 'afterevent']; if(afterEvent) { let buttonParse = parseEventByUrl(afterEvent,options,false); if(validatenull(buttonParse.jsPath)){ fnTarget(buttonParse,callback,actionType); }else{ try { import(`../${buttonParse.jsPath}.js`).then(module => { module[buttonParse.methodName](options,callback,actionType); }) } catch (error) { Vue.prototype.$message.error('未找到后置事件执行js'); } } }else{ if(callback){ callback(actionType); } } }; /** * 使用url获取事件的信息 * @param url 路径,格式如jsPath#methodName?param=aaa¶m1=bbb * @param options 按钮的配置信息,会自动覆盖相同属性的参数 * @param isBefore 是否为前置事件,否则为后置 * @returns {{jsPath: js的路径, options: 按钮的配置信息, methodName: (string)方法的名字}} */ export const parseEventByUrl = (url,options,isBefore,defalutmethodName) => { //根据配置格式化事件 let jsPath = url; let methodName = defalutmethodName || (isBefore?"doBefore":"doAfter"); let params = {}; if (url.indexOf("?")) { let temp = url.substring(0, url.indexOf("?")); if (temp.indexOf("#") > -1) { let array = temp.split("#"); if(array.length == 1){ jsPath = array[0]; }else{ jsPath = array[0]; methodName = array[1]; } }else{ jsPath = temp; } let paramArray = url.substring(url.indexOf("?") + 1).split("&"); paramArray.forEach(_item=>{ if (_item.indexOf("=") < 0) { Vue.prototype.$message.error(isBefore?"前置事件":"后置事件" + "的参数配置错误,需要要xxx=yyy&zzz=a的方式"); return true; } params[_item.split("=")[0]] = _item.split("=")[1]; }) }else{ if (url.indexOf("#") > -1) { let array = url.split("#"); if(array.length == 1){ jsPath = array[0]; }else{ jsPath = array[0]; methodName = array[1]; } }else{ jsPath = url; } } if(!options){ options={ paramVOS:{} } }else if(!options.paramVOS){ options.paramVOS={} } for (var key in params) { options.paramVOS[key.toLowerCase()] = params[key]; } return { jsPath:jsPath, methodName:methodName, options:options, params:params }; };