// 基于 @CONTROL/树视图/SERVICE.ts.ftl 生成 import { Http,Util,Errorlog } from '@/utils'; import ControlService from '@/widgets/control-service'; import IBIZSample0003Service from '@/service/ibizsample0003/ibizsample0003-service'; import Tree03Model from './tree03-treeview-model'; import CodeListService from "@/codelist/codelist-service"; import i18n from '@/locale'; /** * Tree03 部件服务对象 * * @export * @class Tree03Service */ export default class Tree03Service extends ControlService { /** * 示例实体03服务对象 * * @type {IBIZSample0003Service} * @memberof Tree03Service */ public appEntityService: IBIZSample0003Service = new IBIZSample0003Service(); /** * 设置从数据模式 * * @type {boolean} * @memberof Tree03Service */ public setTempMode(){ this.isTempMode = false; } /** * Creates an instance of Tree03Service. * * @param {*} [opts={}] * @memberof Tree03Service */ constructor(opts: any = {}) { super(opts); this.model = new Tree03Model(); } /** * 代码表服务对象 * * @type {CodeListService} * @memberof Tree03Service */ public codeListService:CodeListService = new CodeListService(); /** * 节点分隔符号 * * @public * @type {string} * @memberof Tree03Service */ public TREENODE_SEPARATOR: string = ';'; /** * root节点分隔符号 * * @public * @type {string} * @memberof Tree03Service */ public TREENODE_ROOT: string = 'root'; /** * 下级节点节点分隔符号 * * @public * @type {string} * @memberof Tree03Service */ public TREENODE_CURDATA: string = 'curdata'; /** * 顶级节点节点分隔符号 * * @public * @type {string} * @memberof Tree03Service */ public TREENODE_TOPDATA: string = 'topdata'; /** * 获取节点数据 * * @param {string} action * @param {*} [data={}] * @param {boolean} [isloading] * @returns {Promise<any>} * @memberof Tree03Service */ @Errorlog public async getNodes(context:any = {},data: any = {}, isloading?: boolean): Promise<any> { let { srfparentkey, srfcat, srfnodeid, srfnodefilter, query }: { srfparentkey: string, srfcat: string, srfnodeid: string, srfnodefilter: string, query:string } = data; srfnodefilter = query ? query : srfnodefilter; let list: any[] = []; let filter: any = {}; if (!srfnodeid || Object.is(srfnodeid, '#')) { srfnodeid = this.TREENODE_ROOT; } let strTreeNodeId: string = srfnodeid; let strRealNodeId: string = ''; let bRootSelect: boolean = false; let strNodeType: string | null = null; let strRootSelectNode: string = ''; if (Object.is(strTreeNodeId, this.TREENODE_ROOT)) { strNodeType = this.TREENODE_ROOT; if (srfparentkey) { strRealNodeId = srfparentkey; } } else { let nPos = strTreeNodeId.indexOf(this.TREENODE_SEPARATOR); if (nPos === -1) { return Promise.reject({ status: 500, data: { title: '失败', message: `树节点${strTreeNodeId}标识无效` } }); } strNodeType = strTreeNodeId.substring(0, nPos); strRealNodeId = strTreeNodeId.substring(nPos + 1); } Object.assign(filter, { srfparentkey: srfparentkey, srfcat: srfcat, srfnodefilter: srfnodefilter, strRealNodeId: strRealNodeId, srfnodeid: srfnodeid, strNodeType: strNodeType, viewparams: JSON.parse(JSON.stringify(data)).viewparams } ); // 分解节点标识 let nodeid: string[] = strRealNodeId.split(this.TREENODE_SEPARATOR); for (let i = 0; i < nodeid.length; i++) { switch (i) { case 0: Object.assign(filter, { nodeid: nodeid[0] }); break; case 1: Object.assign(filter, { nodeid2: nodeid[1] }); break; case 2: Object.assign(filter, { nodeid3: nodeid[2] }); break; case 3: Object.assign(filter, { nodeid4: nodeid[3] }); break; default: break; } } if (Object.is(strNodeType, this.TREENODE_ROOT)) { await this.fillRootNodeChilds(context,filter, list); return Promise.resolve({ status: 200, data: list }); } if (Object.is(strNodeType, this.TREENODE_CURDATA)) { await this.fillCurdataNodeChilds(context,filter, list); return Promise.resolve({ status: 200, data: list }); } if (Object.is(strNodeType, this.TREENODE_TOPDATA)) { await this.fillTopdataNodeChilds(context,filter, list); return Promise.resolve({ status: 200, data: list }); } return Promise.resolve({ status: 500, data: { title: '失败', message: `树节点${strTreeNodeId}标识无效` } }); } /** * 填充 树视图节点[root] * * @public * @param {any{}} context * @param {*} filter * @param {any[]} list * @param {*} rsNavContext * @param {*} rsNavParams * @param {*} rsParams * @returns {Promise<any>} * @memberof Tree03Service */ @Errorlog public fillRootNodes(context:any={},filter: any, list: any[],rsNavContext?:any,rsNavParams?:any,rsParams?:any): Promise<any> { context = this.handleResNavContext(context,filter,rsNavContext); filter = this.handleResNavParams(context,filter,rsNavParams,rsParams); return new Promise((resolve:any,reject:any) =>{ let treeNode: any = {}; Object.assign(treeNode, { text: i18n.t('entities.ibizsample0003.tree03_treeview.nodes.root') }); Object.assign(treeNode, { isUseLangRes: true }); Object.assign(treeNode,{srfappctx:context}); Object.assign(treeNode, { srfmajortext: treeNode.text }); let strNodeId: string = 'root'; Object.assign(treeNode, { srfkey: 'root' }); strNodeId += this.TREENODE_SEPARATOR; strNodeId += 'root'; Object.assign(treeNode, { id: strNodeId }); Object.assign(treeNode, { expanded: filter.isAutoexpand }); Object.assign(treeNode, { leaf: false }); Object.assign(treeNode, { nodeid: treeNode.srfkey }); Object.assign(treeNode, { nodeid2: filter.strRealNodeId }); Object.assign(treeNode, { nodeType: "STATIC" }); list.push(treeNode); resolve(list); }); } /** * 填充 树视图节点[root]子节点 * * @public * @param {any{}} context * @param {*} filter * @param {any[]} list * @returns {Promise<any>} * @memberof Tree03Service */ @Errorlog public async fillRootNodeChilds(context:any={}, filter: any, list: any[]): Promise<any> { if (filter.srfnodefilter && !Object.is(filter.srfnodefilter,"")) { // 填充顶级节点 let TopdataRsNavContext:any = {}; let TopdataRsNavParams:any = {}; let TopdataRsParams:any = {}; await this.fillTopdataNodes(context, filter, list ,TopdataRsNavContext,TopdataRsNavParams,TopdataRsParams); } else { // 填充顶级节点 let TopdataRsNavContext:any = {}; let TopdataRsNavParams:any = {}; let TopdataRsParams:any = {}; await this.fillTopdataNodes(context, filter, list ,TopdataRsNavContext,TopdataRsNavParams,TopdataRsParams); } } /** * 填充 树视图节点[下级节点] * * @public * @param {any{}} context * @param {*} filter * @param {any[]} list * @param {*} rsNavContext * @param {*} rsNavParams * @param {*} rsParams * @returns {Promise<any>} * @memberof Tree03Service */ @Errorlog public fillCurdataNodes(context:any={},filter: any, list: any[],rsNavContext?:any,rsNavParams?:any,rsParams?:any): Promise<any> { context = this.handleResNavContext(context,filter,rsNavContext); filter = this.handleResNavParams(context,filter,rsNavParams,rsParams); return new Promise((resolve:any,reject:any) =>{ let searchFilter: any = {}; Object.assign(searchFilter, { total: false }); let bFirst: boolean = true; let records: any[] = []; try { this.searchCurdata(context, searchFilter, filter).then((records:any) =>{ if(records && records.length >0){ records.forEach((entity: any) => { let treeNode: any = {}; // 整理context let strId: string = entity.ibizsample0003id; let strText: string = entity.ibizsample0003name; Object.assign(treeNode,{srfparentdename:'IBIZSample0003',srfparentkey:entity.ibizsample0003id}); let tempContext:any = JSON.parse(JSON.stringify(context)); Object.assign(tempContext,{srfparentdename:'IBIZSample0003',srfparentkey:entity.ibizsample0003id,ibizsample0003:strId}) Object.assign(treeNode,{srfappctx:tempContext}); Object.assign(treeNode,{'ibizsample0003':strId}); Object.assign(treeNode, { srfkey: strId }); Object.assign(treeNode, { text: strText, srfmajortext: strText }); let strNodeId: string = 'curdata'; strNodeId += this.TREENODE_SEPARATOR; strNodeId += strId; Object.assign(treeNode, { id: strNodeId }); Object.assign(treeNode, { expanded: filter.isautoexpand }); Object.assign(treeNode, { leaf: false }); Object.assign(treeNode, { curData: entity }); Object.assign(treeNode, {navigateParams: {srfparenttype:"DER1N",srfder1nid:"DER1N_IBIZSAMPLE0003_IBIZSAMPLE0003_PIBIZSAMPLE0003ID",n_pibizsample0003id_eq:"%NODEID%",srfparentkey:"%NODEID%"} }); Object.assign(treeNode, { nodeid: treeNode.srfkey }); Object.assign(treeNode, { nodeid2: filter.strRealNodeId }); Object.assign(treeNode, { nodeType: "DE",appEntityName:"ibizsample0003" }); list.push(treeNode); resolve(list); bFirst = false; }); }else{ resolve(list); } }); } catch (error) { console.error(error); } }); } /** * 获取查询集合 * * @public * @param {any{}} context * @param {*} searchFilter * @param {*} filter * @returns {any[]} * @memberof TestEnetityDatasService */ @Errorlog public searchCurdata(context:any={}, searchFilter: any, filter: any): Promise<any> { return new Promise((resolve:any,reject:any) =>{ if(filter.viewparams){ Object.assign(searchFilter,filter.viewparams); } if(!searchFilter.page){ Object.assign(searchFilter,{page:0}); } if(!searchFilter.size){ Object.assign(searchFilter,{size:1000}); } if(context && context.srfparentdename){ Object.assign(searchFilter,{srfparentdename:JSON.parse(JSON.stringify(context)).srfparentdename}); } if(context && context.srfparentkey){ Object.assign(searchFilter,{srfparentkey:JSON.parse(JSON.stringify(context)).srfparentkey}); } const _appEntityService: any = this.appEntityService; let list: any[] = []; if (_appEntityService['FetchCurData'] && _appEntityService['FetchCurData'] instanceof Function) { const response: Promise<any> = _appEntityService['FetchCurData'](context, searchFilter, false); response.then((response: any) => { if (!response.status || response.status !== 200) { resolve([]); console.log(JSON.stringify(context)); console.error('查询FetchCurData数据集异常!'); } const data: any = response.data; if (Object.keys(data).length > 0) { list = JSON.parse(JSON.stringify(data)); resolve(list); } else { resolve([]); } }).catch((response: any) => { resolve([]); console.log(JSON.stringify(context)); console.error('查询FetchCurData数据集异常!'); }); } }) } /** * 填充 树视图节点[下级节点]子节点 * * @public * @param {any{}} context * @param {*} filter * @param {any[]} list * @returns {Promise<any>} * @memberof Tree03Service */ @Errorlog public async fillCurdataNodeChilds(context:any={}, filter: any, list: any[]): Promise<any> { if (filter.srfnodefilter && !Object.is(filter.srfnodefilter,"")) { // 填充下级节点 let CurdataRsNavContext:any = {}; let CurdataRsNavParams:any = {}; let CurdataRsParams:any = {}; await this.fillCurdataNodes(context, filter, list ,CurdataRsNavContext,CurdataRsNavParams,CurdataRsParams); } else { // 填充下级节点 let CurdataRsNavContext:any = {}; let CurdataRsNavParams:any = {}; let CurdataRsParams:any = {}; await this.fillCurdataNodes(context, filter, list ,CurdataRsNavContext,CurdataRsNavParams,CurdataRsParams); } } /** * 填充 树视图节点[顶级节点] * * @public * @param {any{}} context * @param {*} filter * @param {any[]} list * @param {*} rsNavContext * @param {*} rsNavParams * @param {*} rsParams * @returns {Promise<any>} * @memberof Tree03Service */ @Errorlog public fillTopdataNodes(context:any={},filter: any, list: any[],rsNavContext?:any,rsNavParams?:any,rsParams?:any): Promise<any> { context = this.handleResNavContext(context,filter,rsNavContext); filter = this.handleResNavParams(context,filter,rsNavParams,rsParams); return new Promise((resolve:any,reject:any) =>{ let searchFilter: any = {}; Object.assign(searchFilter, { total: false }); let bFirst: boolean = true; let records: any[] = []; try { this.searchTopdata(context, searchFilter, filter).then((records:any) =>{ if(records && records.length >0){ records.forEach((entity: any) => { let treeNode: any = {}; // 整理context let strId: string = entity.ibizsample0003id; let strText: string = entity.ibizsample0003name; Object.assign(treeNode,{srfparentdename:'IBIZSample0003',srfparentkey:entity.ibizsample0003id}); let tempContext:any = JSON.parse(JSON.stringify(context)); Object.assign(tempContext,{srfparentdename:'IBIZSample0003',srfparentkey:entity.ibizsample0003id,ibizsample0003:strId}) Object.assign(treeNode,{srfappctx:tempContext}); Object.assign(treeNode,{'ibizsample0003':strId}); Object.assign(treeNode, { srfkey: strId }); Object.assign(treeNode, { text: strText, srfmajortext: strText }); let strNodeId: string = 'topdata'; strNodeId += this.TREENODE_SEPARATOR; strNodeId += strId; Object.assign(treeNode, { id: strNodeId }); Object.assign(treeNode, { iconcls: 'fa fa-list-ul' }); Object.assign(treeNode, { expanded: filter.isautoexpand }); Object.assign(treeNode, { leaf: false }); Object.assign(treeNode, { curData: entity }); Object.assign(treeNode, {navigateParams: {srfparenttype:"DER1N",srfder1nid:"DER1N_IBIZSAMPLE0003_IBIZSAMPLE0003_PIBIZSAMPLE0003ID",n_pibizsample0003id_eq:"%NODEID%",srfparentkey:"%NODEID%"} }); Object.assign(treeNode, { nodeid: treeNode.srfkey }); Object.assign(treeNode, { nodeid2: filter.strRealNodeId }); Object.assign(treeNode, { nodeType: "DE",appEntityName:"ibizsample0003" }); list.push(treeNode); resolve(list); bFirst = false; }); }else{ resolve(list); } }); } catch (error) { console.error(error); } }); } /** * 获取查询集合 * * @public * @param {any{}} context * @param {*} searchFilter * @param {*} filter * @returns {any[]} * @memberof TestEnetityDatasService */ @Errorlog public searchTopdata(context:any={}, searchFilter: any, filter: any): Promise<any> { return new Promise((resolve:any,reject:any) =>{ if(filter.viewparams){ Object.assign(searchFilter,filter.viewparams); } if(!searchFilter.page){ Object.assign(searchFilter,{page:0}); } if(!searchFilter.size){ Object.assign(searchFilter,{size:1000}); } if(context && context.srfparentdename){ Object.assign(searchFilter,{srfparentdename:JSON.parse(JSON.stringify(context)).srfparentdename}); } if(context && context.srfparentkey){ Object.assign(searchFilter,{srfparentkey:JSON.parse(JSON.stringify(context)).srfparentkey}); } const _appEntityService: any = this.appEntityService; let list: any[] = []; if (_appEntityService['FetchTopData'] && _appEntityService['FetchTopData'] instanceof Function) { const response: Promise<any> = _appEntityService['FetchTopData'](context, searchFilter, false); response.then((response: any) => { if (!response.status || response.status !== 200) { resolve([]); console.log(JSON.stringify(context)); console.error('查询FetchTopData数据集异常!'); } const data: any = response.data; if (Object.keys(data).length > 0) { list = JSON.parse(JSON.stringify(data)); resolve(list); } else { resolve([]); } }).catch((response: any) => { resolve([]); console.log(JSON.stringify(context)); console.error('查询FetchTopData数据集异常!'); }); } }) } /** * 填充 树视图节点[顶级节点]子节点 * * @public * @param {any{}} context * @param {*} filter * @param {any[]} list * @returns {Promise<any>} * @memberof Tree03Service */ @Errorlog public async fillTopdataNodeChilds(context:any={}, filter: any, list: any[]): Promise<any> { if (filter.srfnodefilter && !Object.is(filter.srfnodefilter,"")) { // 填充下级节点 let CurdataRsNavContext:any = {}; let CurdataRsNavParams:any = {}; let CurdataRsParams:any = {}; await this.fillCurdataNodes(context, filter, list ,CurdataRsNavContext,CurdataRsNavParams,CurdataRsParams); } else { // 填充下级节点 let CurdataRsNavContext:any = {}; let CurdataRsNavParams:any = {}; let CurdataRsParams:any = {}; await this.fillCurdataNodes(context, filter, list ,CurdataRsNavContext,CurdataRsNavParams,CurdataRsParams); } } /** * 处理代码表返回数据(树状结构) * * @param result 返回数组 * @param context 应用上下文 * @param callBack 回调 * @memberof Tree03Service */ public handleDataSet(result:Array<any>,context:any,callBack:any){ let list:Array<any> = []; if(result.length === 0){ return list; } result.forEach((codeItem:any) =>{ if(!codeItem.pvalue){ let valueField:string = codeItem.value; this.setChildCodeItems(valueField,result,codeItem); list.push(codeItem); } }) this.setNodeData(list,context,callBack); return list; } /** * 处理非根节点数据 * * @param result 返回数组 * @param context 应用上下文 * @param callBack 回调 * @memberof Tree03Service */ public setChildCodeItems(pValue:string,result:Array<any>,codeItem:any){ result.forEach((item:any) =>{ if(item.pvalue == pValue){ let valueField:string = item.value; this.setChildCodeItems(valueField,result,item); if(!codeItem.children){ codeItem.children = []; } codeItem.children.push(item); } }) } /** * 设置节点UI数据 * * @param result 返回数组 * @param context 应用上下文 * @param callBack 回调 * @memberof Tree03Service */ public setNodeData(result:Array<any>,context:any,callBack:any){ result.forEach((item:any) =>{ if(item.children){ item.leaf = false; this.setNodeData(item.children,context,callBack); }else{ item.leaf = true; } callBack(context,item); }) } /** * 处理节点关系导航上下文 * * @param context 应用上下文 * @param filter 参数 * @param resNavContext 节点关系导航上下文 * * @memberof Tree03Service */ public handleResNavContext(context:any,filter:any,resNavContext:any){ if(resNavContext && Object.keys(resNavContext).length > 0){ let tempContextData:any = JSON.parse(JSON.stringify(context)); let tempViewParams:any = {}; if(filter && filter.viewparams){ tempViewParams = filter.viewparams; } Object.keys(resNavContext).forEach((item:any) =>{ let curDataObj:any = resNavContext[item]; this.handleCustomDataLogic(context,tempViewParams,curDataObj,tempContextData,item); }) return tempContextData; }else{ return context; } } /** * 处理关系导航参数 * * @param context 应用上下文 * @param filter 参数 * @param resNavParams 节点关系导航参数 * @param resParams 节点关系参数 * * @memberof Tree03Service */ public handleResNavParams(context:any,filter:any,resNavParams:any,resParams:any){ if((resNavParams && Object.keys(resNavParams).length >0) || (resParams && Object.keys(resParams).length >0)){ let tempViewParamData:any = {}; let tempViewParams:any = {}; if(filter && filter.viewparams){ tempViewParams = filter.viewparams; tempViewParamData = JSON.parse(JSON.stringify(filter.viewparams)); } if( Object.keys(resNavParams).length > 0){ Object.keys(resNavParams).forEach((item:any) =>{ let curDataObj:any = resNavParams[item]; this.handleCustomDataLogic(context,tempViewParams,curDataObj,tempViewParamData,item); }) } if( Object.keys(resParams).length > 0){ Object.keys(resParams).forEach((item:any) =>{ let curDataObj:any = resParams[item]; tempViewParamData[item.toLowerCase()] = curDataObj.value; }) } Object.assign(filter,{viewparams:tempViewParamData}); return filter; }else{ return filter; } } /** * 处理自定义节点关系导航数据 * * @param context 应用上下文 * @param viewparams 参数 * @param curNavData 节点关系导航参数对象 * @param tempData 返回数据 * @param item 节点关系导航参数键值 * * @memberof Tree03Service */ public handleCustomDataLogic(context:any,viewparams:any,curNavData:any,tempData:any,item:string){ // 直接值直接赋值 if(curNavData.isRawValue){ if(Object.is(curNavData.value,"null") || Object.is(curNavData.value,"")){ Object.defineProperty(tempData, item.toLowerCase(), { value: null, writable : true, enumerable : true, configurable : true }); }else{ Object.defineProperty(tempData, item.toLowerCase(), { value: curNavData.value, writable : true, enumerable : true, configurable : true }); } }else{ // 先从导航上下文取数,没有再从导航参数(URL)取数,如果导航上下文和导航参数都没有则为null if(context[(curNavData.value).toLowerCase()] != null){ Object.defineProperty(tempData, item.toLowerCase(), { value: context[(curNavData.value).toLowerCase()], writable : true, enumerable : true, configurable : true }); }else{ if(viewparams[(curNavData.value).toLowerCase()] != null){ Object.defineProperty(tempData, item.toLowerCase(), { value: viewparams[(curNavData.value).toLowerCase()], writable : true, enumerable : true, configurable : true }); }else{ Object.defineProperty(tempData, item.toLowerCase(), { value: null, writable : true, enumerable : true, configurable : true }); } } } } }