import {
IParam,
IUIEngineInputParam,
IUIEngineModel,
IUIEngineResult,
} from '@/core/interface';
import { calcCellStyle, calcHeaderCellStyle, calcHeaderRowStyle, calcRowStyle } from './util';
import { isFunction } from '@vue/shared';
/**
* 界面引擎
*
* @export
* @class UIEngine
*/
export class UIEngine {
/**
* 原始数据
*
* @protected
* @type {(IUIEngineModel)}
* @memberof UIEngine
*/
protected rowData: IUIEngineModel;
/**
* Creates an instance of UIEngine.
* @param {IUIEngineModel} model
* @memberof UIEngine
*/
public constructor(model: IUIEngineModel) {
this.rowData = model;
}
/**
* 异步执行
*
* @param {IUIEngineInputParam} args
* @return {*} {Promise}
* @memberof UIEngine
*/
public async asyncExcute(
args: IUIEngineInputParam
): Promise {
const { logicType } = this.rowData;
if (!logicType) {
return { ok: false, data: null };
}
switch (logicType) {
case 'DEUILOGIC':
return await this.asyncExecuteDEUILogic(args);
case 'SYSVIEWLOGIC':
return await this.asyncExecuteSysViewLogic(args);
case 'APPVIEWUIACTION':
return await this.asyncExecuteAppViewUIAction(args);
case 'PFPLUGIN':
return await this.asyncExecutePluginLogic(args);
case 'SCRIPT':
return await this.asyncExecuteScriptLogic(args);
default:
console.warn(`${logicType}暂未实现`);
break;
}
return { ok: false, data: null };
}
/**
* 执行实体界面逻辑
*
* @param {IUIEngineInputParam} args
* @return {*} {Promise}
* @memberof UIEngine
*/
public async asyncExecuteDEUILogic(
args: IUIEngineInputParam
): Promise {
const { entityCodeName, logicName } = this.rowData;
if (!entityCodeName || !logicName) {
return { ok: false, data: [] };
}
const UIService = await App.getUIService(entityCodeName);
if (!UIService) {
return { ok: false, data: [] };
}
const { navContext, navParam, data, ability } = args;
const result: IParam = await UIService.executeUILogic(logicName, navContext, navParam, [data], null, ability);
// 需要考虑逻辑返回的是数组参数情况
let ok = !(result.srfret === 'false' || result.srfref === false);
if (result && result?.hasOwnProperty('srfret')) {
delete result.srfret;
}
return { ok, data: [result] };
}
/**
* 执行系统预置界面逻辑
*
* @param {IUIEngineInputParam} args
* @return {*} {Promise}
* @memberof UIEngine
*/
public async asyncExecuteSysViewLogic(
args: IUIEngineInputParam
): Promise {
throw new Error('Method not implemented.');
}
/**
* 执行应用界面行为
*
* @param {IUIEngineInputParam} args
* @return {*} {Promise}
* @memberof UIEngine
*/
public async asyncExecuteAppViewUIAction(
args: IUIEngineInputParam
): Promise {
const { entityCodeName, uIActionTag } = this.rowData;
if (!entityCodeName || !uIActionTag) {
return { ok: false, data: [] };
}
const UIService = await App.getUIService(entityCodeName);
if (!UIService || !isFunction(UIService[uIActionTag])) {
return { ok: false, data: [] };
}
const { navContext, navParam, data, ability } = args;
return await UIService[uIActionTag](navContext, navParam, [data], null, ability);
}
/**
* 执行界面插件逻辑
*
* @param {IUIEngineInputParam} args
* @return {*} {Promise}
* @memberof UIEngine
*/
public async asyncExecutePluginLogic(
args: IUIEngineInputParam
): Promise {
throw new Error('Method not implemented.');
}
/**
* 执行脚本代码逻辑
*
* @param {IUIEngineInputParam} args
* @return {*} {Promise}
* @memberof UIEngine
*/
public async asyncExecuteScriptLogic(
args: IUIEngineInputParam
): Promise {
const { scriptCode } = this.rowData;
if (!scriptCode) {
return { ok: false, data: null };
}
try {
const { data } = args;
eval(scriptCode);
return { ok: true, data: data ? [data] : [] };
} catch (error) {
console.warn(`执行脚本界面逻辑异常,脚本代码为:${scriptCode}`);
}
return { ok: false, data: null };
}
/**
* 同步执行
*
* @param {IUIEngineInputParam} args
* @memberof UIEngine
*/
public syncExcute(args: any): any {
const { logicType, scriptCode, name } = this.rowData;
if (!logicType || !scriptCode ) {
return { ok: false, data: null };
}
// 暂只支持脚本
switch (logicType) {
case 'SCRIPT':
return this.dispenseUILogic(name, scriptCode, args);
default:
console.warn(`${logicType}暂未实现`);
break;
}
}
/**
* 分发UI逻辑参数
*
* @param {string} name
* @param {string} scriptCode
* @param {*} opts
* @return {*}
* @memberof UIEngine
*/
public dispenseUILogic(name: string, scriptCode: string, opts: any) {
try {
if (name) {
switch (name.toLowerCase()) {
case 'calcrowstyle':
return calcRowStyle(opts, scriptCode);
case 'calccellstyle':
return calcCellStyle(opts, scriptCode);
case 'calcheaderrowstyle':
return calcHeaderRowStyle(opts, scriptCode);
case 'calcheadercellstyle':
return calcHeaderCellStyle(opts, scriptCode);
}
}
} catch (error) {
console.error(`执行脚本界面逻辑异常,脚本代码为:${scriptCode}`);
}
}
}