import { Environment } from '@/environments/environment'; import { UIActionTool,Util } from '@/utils'; import UIService from '../ui-service'; import { Subject } from 'rxjs'; import ProductService from '@/service/product/product-service'; import ProductAuthService from '@/authservice/product/product-auth-service'; /** * 产品UI服务对象基类 * * @export * @class ProductUIServiceBase */ export default class ProductUIServiceBase extends UIService { /** * 是否支持工作流 * * @memberof ProductUIServiceBase */ public isEnableWorkflow:boolean = false; /** * 当前UI服务对应的数据服务对象 * * @memberof ProductUIServiceBase */ public dataService:ProductService = new ProductService(); /** * 所有关联视图 * * @memberof ProductUIServiceBase */ public allViewMap: Map<string, Object> = new Map(); /** * 状态值 * * @memberof ProductUIServiceBase */ public stateValue: number = 0; /** * 状态属性 * * @memberof ProductUIServiceBase */ public stateField: string = ""; /** * 主状态属性集合 * * @memberof ProductUIServiceBase */ public mainStateFields:Array<any> = []; /** * 主状态集合Map * * @memberof ProductUIServiceBase */ public allDeMainStateMap:Map<string,string> = new Map(); /** * 主状态操作标识Map * * @memberof ProductUIServiceBase */ public allDeMainStateOPPrivsMap:Map<string,any> = new Map(); /** * Creates an instance of ProductUIServiceBase. * * @param {*} [opts={}] * @memberof ProductUIServiceBase */ constructor(opts: any = {}) { super(opts); this.authService = new ProductAuthService(opts); this.initViewMap(); this.initDeMainStateMap(); this.initDeMainStateOPPrivsMap(); } /** * 初始化视图Map * * @memberof ProductUIServiceBase */ public initViewMap(){ this.allViewMap.set(':',{viewname:'edit_datapanelview',srfappde:'products'}); this.allViewMap.set(':',{viewname:'infoview',srfappde:'products'}); this.allViewMap.set(':',{viewname:'effectivegridview',srfappde:'products'}); this.allViewMap.set(':',{viewname:'info_proinfo',srfappde:'products'}); this.allViewMap.set('EDITVIEW:',{viewname:'editview',srfappde:'products'}); this.allViewMap.set(':',{viewname:'summaryview',srfappde:'products'}); this.allViewMap.set(':',{viewname:'revisegridview',srfappde:'products'}); this.allViewMap.set(':',{viewname:'stopgridview',srfappde:'products'}); this.allViewMap.set(':',{viewname:'pickupgridview',srfappde:'products'}); this.allViewMap.set(':',{viewname:'quickcreateview',srfappde:'products'}); this.allViewMap.set('MDATAVIEW:',{viewname:'gridview',srfappde:'products'}); this.allViewMap.set('PICKUPVIEW:',{viewname:'pickupview',srfappde:'products'}); this.allViewMap.set(':',{viewname:'statetabview',srfappde:'products'}); } /** * 初始化主状态集合 * * @memberof ProductUIServiceBase */ public initDeMainStateMap(){ } /** * 初始化主状态操作标识 * * @memberof ProductUIServiceBase */ public initDeMainStateOPPrivsMap(){ } /** * 修订 * * @param {any[]} args 当前数据 * @param {any} context 行为附加上下文 * @param {*} [params] 附加参数 * @param {*} [$event] 事件源 * @param {*} [xData] 执行行为所需当前部件 * @param {*} [actionContext] 执行行为上下文 * @param {*} [srfParentDeName] 父实体名称 * @returns {Promise<any>} */ public async Product_Revise(args: any[],context:any = {}, params:any = {}, $event?: any, xData?: any,actionContext?: any,srfParentDeName?:string){ let data: any = {}; let parentContext:any = {}; let parentViewParam:any = {}; const _this: any = actionContext; const _args: any[] = Util.deepCopy(args); const actionTarget: string | null = 'SINGLEKEY'; Object.assign(context, { product: '%product%' }); Object.assign(params, { productid: '%product%' }); Object.assign(params, { productname: '%productname%' }); if(_this.context){ parentContext = _this.context; } if(_this.viewparams){ parentViewParam = _this.viewparams; } context = UIActionTool.handleContextParam(actionTarget,_args,parentContext,parentViewParam,context); data = UIActionTool.handleActionParam(actionTarget,_args,parentContext,parentViewParam,params); context = Object.assign({},actionContext.context,context); let parentObj:any = {srfparentdename:srfParentDeName?srfParentDeName:null,srfparentkey:srfParentDeName?context[srfParentDeName.toLowerCase()]:null}; Object.assign(data,parentObj); Object.assign(context,parentObj); // 直接调实体服务需要转换的数据 if(context && context.srfsessionid){ context.srfsessionkey = context.srfsessionid; delete context.srfsessionid; } actionContext.closeView(null); const backend = () => { const curService:ProductService = new ProductService(); curService.Revise(context,data, true).then((response: any) => { if (!response || response.status !== 200) { actionContext.$Notice.error({ title: '错误', desc: response.message }); return; } actionContext.$Notice.success({ title: '成功', desc: '修订成功!' }); const _this: any = actionContext; if (xData && xData.refresh && xData.refresh instanceof Function) { xData.refresh(args); } return response; }).catch((response: any) => { if (!response || !response.status || !response.data) { actionContext.$Notice.error({ title: '错误', desc: '系统异常!' }); return; } if (response.status === 401) { return; } return response; }); }; backend(); } /** * 发布 * * @param {any[]} args 当前数据 * @param {any} context 行为附加上下文 * @param {*} [params] 附加参数 * @param {*} [$event] 事件源 * @param {*} [xData] 执行行为所需当前部件 * @param {*} [actionContext] 执行行为上下文 * @param {*} [srfParentDeName] 父实体名称 * @returns {Promise<any>} */ public async Product_Publish(args: any[],context:any = {}, params:any = {}, $event?: any, xData?: any,actionContext?: any,srfParentDeName?:string){ let data: any = {}; let parentContext:any = {}; let parentViewParam:any = {}; const _this: any = actionContext; const _args: any[] = Util.deepCopy(args); const actionTarget: string | null = 'SINGLEKEY'; Object.assign(context, { product: '%product%' }); Object.assign(params, { productid: '%product%' }); Object.assign(params, { productname: '%productname%' }); if(_this.context){ parentContext = _this.context; } if(_this.viewparams){ parentViewParam = _this.viewparams; } context = UIActionTool.handleContextParam(actionTarget,_args,parentContext,parentViewParam,context); data = UIActionTool.handleActionParam(actionTarget,_args,parentContext,parentViewParam,params); context = Object.assign({},actionContext.context,context); let parentObj:any = {srfparentdename:srfParentDeName?srfParentDeName:null,srfparentkey:srfParentDeName?context[srfParentDeName.toLowerCase()]:null}; Object.assign(data,parentObj); Object.assign(context,parentObj); // 直接调实体服务需要转换的数据 if(context && context.srfsessionid){ context.srfsessionkey = context.srfsessionid; delete context.srfsessionid; } actionContext.closeView(null); const backend = () => { const curService:ProductService = new ProductService(); curService.Publish(context,data, true).then((response: any) => { if (!response || response.status !== 200) { actionContext.$Notice.error({ title: '错误', desc: response.message }); return; } actionContext.$Notice.success({ title: '成功', desc: '发布成功!' }); const _this: any = actionContext; if (xData && xData.refresh && xData.refresh instanceof Function) { xData.refresh(args); } return response; }).catch((response: any) => { if (!response || !response.status || !response.data) { actionContext.$Notice.error({ title: '错误', desc: '系统异常!' }); return; } if (response.status === 401) { return; } return response; }); }; backend(); } /** * 头信息编辑 * * @param {any[]} args 当前数据 * @param {any} context 行为附加上下文 * @param {*} [params] 附加参数 * @param {*} [$event] 事件源 * @param {*} [xData] 执行行为所需当前部件 * @param {*} [actionContext] 执行行为上下文 * @param {*} [srfParentDeName] 父实体名称 * @returns {Promise<any>} */ public async Product_OpenEdit_DataPanelView(args: any[], context:any = {} ,params: any={}, $event?: any, xData?: any,actionContext?:any,srfParentDeName?:string) { let data: any = {}; let parentContext:any = {}; let parentViewParam:any = {}; const _this: any = actionContext; const _args: any[] = Util.deepCopy(args); const actionTarget: string | null = 'SINGLEKEY'; Object.assign(context, { product: '%product%' }); Object.assign(params, { productid: '%product%' }); Object.assign(params, { productname: '%productname%' }); if(_this.context){ parentContext = _this.context; } if(_this.viewparams){ parentViewParam = _this.viewparams; } context = UIActionTool.handleContextParam(actionTarget,_args,parentContext,parentViewParam,context); data = UIActionTool.handleActionParam(actionTarget,_args,parentContext,parentViewParam,params); context = Object.assign({},actionContext.context,context); let parentObj:any = {srfparentdename:srfParentDeName?srfParentDeName:null,srfparentkey:srfParentDeName?context[srfParentDeName.toLowerCase()]:null}; Object.assign(data,parentObj); Object.assign(context,parentObj); let deResParameters: any[] = []; const parameters: any[] = [ { pathName: 'products', parameterName: 'product' }, ]; const openPopOver = (view: any, data: any) => { let container: Subject<any> = actionContext.$apppopover.openPop($event, view, context,data); container.subscribe((result: any) => { if (!result || !Object.is(result.ret, 'OK')) { return; } const _this: any = actionContext; if(window.opener){ window.opener.postMessage({status:'OK',identification:'WF'},Environment.uniteAddress); window.close(); } return result.datas; }); } const view: any = { viewname: 'product-edit-data-panel-view', height: 300, width: 300, title: actionContext.$t('entities.product.views.edit_datapanelview.title'), placement: 'POPOVER', }; openPopOver(view, data); } /** * 新建 * * @param {any[]} args 当前数据 * @param {any} context 行为附加上下文 * @param {*} [params] 附加参数 * @param {*} [$event] 事件源 * @param {*} [xData] 执行行为所需当前部件 * @param {*} [actionContext] 执行行为上下文 * @param {*} [srfParentDeName] 父实体名称 * @returns {Promise<any>} */ public async Product_QuickCreate(args: any[], context:any = {} ,params: any={}, $event?: any, xData?: any,actionContext?:any,srfParentDeName?:string) { let data: any = {}; let parentContext:any = {}; let parentViewParam:any = {}; const _this: any = actionContext; const _args: any[] = Util.deepCopy(args); const actionTarget: string | null = 'NONE'; if(_this.context){ parentContext = _this.context; } if(_this.viewparams){ parentViewParam = _this.viewparams; } context = UIActionTool.handleContextParam(actionTarget,_args,parentContext,parentViewParam,context); data = UIActionTool.handleActionParam(actionTarget,_args,parentContext,parentViewParam,params); context = Object.assign({},actionContext.context,context); let parentObj:any = {srfparentdename:srfParentDeName?srfParentDeName:null,srfparentkey:srfParentDeName?context[srfParentDeName.toLowerCase()]:null}; Object.assign(data,parentObj); Object.assign(context,parentObj); let deResParameters: any[] = []; const parameters: any[] = [ { pathName: 'products', parameterName: 'product' }, ]; actionContext.closeView(null); const openDrawer = (view: any, data: any) => { let container: Subject<any> = actionContext.$appdrawer.openDrawer(view, context,data); container.subscribe((result: any) => { if (!result || !Object.is(result.ret, 'OK')) { return; } const _this: any = actionContext; if (xData && xData.refresh && xData.refresh instanceof Function) { xData.refresh(args); } if (this.Product_OpenInfoVIew && this.Product_OpenInfoVIew instanceof Function) { this.Product_OpenInfoVIew(result.datas,context,params, $event, xData,actionContext); } if(window.opener){ window.opener.postMessage({status:'OK',identification:'WF'},Environment.uniteAddress); window.close(); } return result.datas; }); } const view: any = { viewname: 'product-quick-create-view', height: 0, width: 0, title: actionContext.$t('entities.product.views.quickcreateview.title'), placement: 'DRAWER_RIGHT', }; openDrawer(view, data); } /** * 打开主信息界面 * * @param {any[]} args 当前数据 * @param {any} context 行为附加上下文 * @param {*} [params] 附加参数 * @param {*} [$event] 事件源 * @param {*} [xData] 执行行为所需当前部件 * @param {*} [actionContext] 执行行为上下文 * @param {*} [srfParentDeName] 父实体名称 * @returns {Promise<any>} */ public async Product_OpenInfoVIew(args: any[], context:any = {} ,params: any={}, $event?: any, xData?: any,actionContext?:any,srfParentDeName?:string) { let data: any = {}; let parentContext:any = {}; let parentViewParam:any = {}; const _this: any = actionContext; const _args: any[] = Util.deepCopy(args); const actionTarget: string | null = 'SINGLEKEY'; Object.assign(context, { product: '%product%' }); Object.assign(params, { productid: '%product%' }); Object.assign(params, { productname: '%productname%' }); if(_this.context){ parentContext = _this.context; } if(_this.viewparams){ parentViewParam = _this.viewparams; } context = UIActionTool.handleContextParam(actionTarget,_args,parentContext,parentViewParam,context); data = UIActionTool.handleActionParam(actionTarget,_args,parentContext,parentViewParam,params); context = Object.assign({},actionContext.context,context); let parentObj:any = {srfparentdename:srfParentDeName?srfParentDeName:null,srfparentkey:srfParentDeName?context[srfParentDeName.toLowerCase()]:null}; Object.assign(data,parentObj); Object.assign(context,parentObj); let deResParameters: any[] = []; const parameters: any[] = [ { pathName: 'products', parameterName: 'product' }, { pathName: 'infoview', parameterName: 'infoview' }, ]; const openIndexViewTab = (data: any) => { const routePath = actionContext.$viewTool.buildUpRoutePath(actionContext.$route, context, deResParameters, parameters, _args, data); actionContext.$router.push(routePath); return null; } openIndexViewTab(data); } /** * 停用 * * @param {any[]} args 当前数据 * @param {any} context 行为附加上下文 * @param {*} [params] 附加参数 * @param {*} [$event] 事件源 * @param {*} [xData] 执行行为所需当前部件 * @param {*} [actionContext] 执行行为上下文 * @param {*} [srfParentDeName] 父实体名称 * @returns {Promise<any>} */ public async Product_Stop(args: any[],context:any = {}, params:any = {}, $event?: any, xData?: any,actionContext?: any,srfParentDeName?:string){ let data: any = {}; let parentContext:any = {}; let parentViewParam:any = {}; const _this: any = actionContext; const _args: any[] = Util.deepCopy(args); const actionTarget: string | null = 'SINGLEKEY'; Object.assign(context, { product: '%product%' }); Object.assign(params, { productid: '%product%' }); Object.assign(params, { productname: '%productname%' }); if(_this.context){ parentContext = _this.context; } if(_this.viewparams){ parentViewParam = _this.viewparams; } context = UIActionTool.handleContextParam(actionTarget,_args,parentContext,parentViewParam,context); data = UIActionTool.handleActionParam(actionTarget,_args,parentContext,parentViewParam,params); context = Object.assign({},actionContext.context,context); let parentObj:any = {srfparentdename:srfParentDeName?srfParentDeName:null,srfparentkey:srfParentDeName?context[srfParentDeName.toLowerCase()]:null}; Object.assign(data,parentObj); Object.assign(context,parentObj); // 直接调实体服务需要转换的数据 if(context && context.srfsessionid){ context.srfsessionkey = context.srfsessionid; delete context.srfsessionid; } actionContext.closeView(null); const backend = () => { const curService:ProductService = new ProductService(); curService.Stop(context,data, true).then((response: any) => { if (!response || response.status !== 200) { actionContext.$Notice.error({ title: '错误', desc: response.message }); return; } actionContext.$Notice.success({ title: '成功', desc: '停用成功!' }); const _this: any = actionContext; if (xData && xData.refresh && xData.refresh instanceof Function) { xData.refresh(args); } return response; }).catch((response: any) => { if (!response || !response.status || !response.data) { actionContext.$Notice.error({ title: '错误', desc: '系统异常!' }); return; } if (response.status === 401) { return; } return response; }); }; backend(); } /** * 获取指定数据的重定向页面 * * @param srfkey 数据主键 * @param isEnableWorkflow 重定向视图是否需要处理流程中的数据 * @memberof ProductUIServiceBase */ public async getRDAppView(srfkey:string,isEnableWorkflow:boolean){ this.isEnableWorkflow = isEnableWorkflow; // 进行数据查询 let result:any = await this.dataService.Get({product:srfkey}); const curData:any = result.data; //判断当前数据模式,默认为true,todo const iRealDEModel:boolean = true; let bDataInWF:boolean = false; let bWFMode:any = false; // 计算数据模式 if (this.isEnableWorkflow) { bDataInWF = await this.dataService.testDataInWF({stateValue:this.stateValue,stateField:this.stateField},curData); if (bDataInWF) { bDataInWF = true; bWFMode = await this.dataService.testUserExistWorklist(null,curData); } } let strPDTViewParam:string = await this.getDESDDEViewPDTParam(curData, bDataInWF, bWFMode); //若不是当前数据模式,处理strPDTViewParam,todo //查找视图 //返回视图 return this.allViewMap.get(strPDTViewParam); } /** * 获取实际的数据类型 * * @memberof ProductUIServiceBase */ public getRealDEType(entity:any){ } /** * 获取实体单数据实体视图预定义参数 * * @param curData 当前数据 * @param bDataInWF 是否有数据在工作流中 * @param bWFMode 是否工作流模式 * @memberof ProductUIServiceBase */ public async getDESDDEViewPDTParam(curData:any, bDataInWF:boolean, bWFMode:boolean){ let strPDTParam:string = ''; if (bDataInWF) { // 判断数据是否在流程中 } //多表单,todo const isEnableMultiForm:boolean = false; const multiFormDEField:string|null =null; if (isEnableMultiForm && multiFormDEField) { const objFormValue:string = curData[multiFormDEField]; if(!Environment.isAppMode){ return 'MOBEDITVIEW'+objFormValue; } return 'EDITVIEW'+objFormValue; } if(!Environment.isAppMode){ if(this.getDEMainStateTag(curData)){ return `MOBEDITVIEW:MSTAG:${ this.getDEMainStateTag(curData)}`; } return 'MOBEDITVIEW:'; } if(this.getDEMainStateTag(curData)){ return `EDITVIEW:MSTAG:${ this.getDEMainStateTag(curData)}`; } return 'EDITVIEW:'; } /** * 获取数据对象的主状态标识 * * @param curData 当前数据 * @memberof ProductUIServiceBase */ public getDEMainStateTag(curData:any){ if(this.mainStateFields.length === 0) return null; this.mainStateFields.forEach((singleMainField:any) =>{ if(!(singleMainField in curData)){ console.error(`当前数据对象不包含属性singleMainField,可能会发生错误`); } }) for (let i = 0; i <= 1; i++) { let strTag:string = (curData[this.mainStateFields[0]])?(i == 0) ? curData[this.mainStateFields[0]] : "":""; if (this.mainStateFields.length >= 2) { for (let j = 0; j <= 1; j++) { let strTag2:string = (curData[this.mainStateFields[1]])?`${strTag}__${(j == 0) ? curData[this.mainStateFields[1]] : ""}`:strTag; if (this.mainStateFields.length >= 3) { for (let k = 0; k <= 1; k++) { let strTag3:string = (curData[this.mainStateFields[2]])?`${strTag2}__${(k == 0) ? curData[this.mainStateFields[2]] : ""}`:strTag2; // 判断是否存在 return this.allDeMainStateMap.get(strTag3); } }else{ return this.allDeMainStateMap.get(strTag2); } } }else{ return this.allDeMainStateMap.get(strTag); } } return null; } /** * 获取数据对象当前操作标识 * * @param data 当前数据 * @memberof ProductUIServiceBase */ public getDEMainStateOPPrivs(data:any){ if(this.getDEMainStateTag(data)){ return this.allDeMainStateOPPrivsMap.get((this.getDEMainStateTag(data) as string)); }else{ return null; } } /** * 获取数据对象所有的操作标识 * * @param data 当前数据 * @memberof ProductUIServiceBase */ public getAllOPPrivs(data:any){ return this.authService.getOPPrivs(this.getDEMainStateOPPrivs(data)); } }