<template> <div class='items multieditviewpanel'> <div v-for="(item,index) in items" class='item' :key="index"> <ibizbookinter-func-edit-view class="viewcontainer2" :viewdata="toString(item.viewdata)" :viewparam="toString(item.viewparam)" :viewDefaultUsage="false" :panelState="panelState" @viewdataschange="viewDataChange" @viewload="viewload" @viewdirty="viewdirty(item,$event)"> </ibizbookinter-func-edit-view> <divider /> </div> <div> <i-button type="primary" @click="handleAdd" style="float: right;"> {{ $t('app.local.add')}} </i-button> </div> </div> </template> <script lang='tsx'> import { Vue, Component, Prop, Provide, Emit, Watch, Model,Inject } from 'vue-property-decorator'; import { CreateElement } from 'vue'; import { Subject, Subscription } from 'rxjs'; import { ControlInterface } from '@/interface/control'; import { UIActionTool,Util,ViewTool } from '@/utils'; import NavDataService from '@/service/app/navdata-service'; import AppCenterService from "@service/app/app-center-service"; import IBIZBOOKEntityService from '@/service/ibizbook/ibizbook-service'; import MainService from './main-multieditviewpanel-service'; import IBIZBOOKUIService from '@/uiservice/ibizbook/ibizbook-ui-service'; @Component({ components: { } }) export default class MainBase extends Vue implements ControlInterface { /** * 名称 * * @type {string} * @memberof MainBase */ @Prop() public name?: string; /** * 视图通讯对象 * * @type {Subject<ViewState>} * @memberof MainBase */ @Prop() public viewState!: Subject<ViewState>; /** * 应用上下文 * * @type {*} * @memberof MainBase */ @Prop() public context!: any; /** * 视图参数 * * @type {*} * @memberof MainBase */ @Prop() public viewparams!: any; /** * 视图状态事件 * * @public * @type {(Subscription | undefined)} * @memberof MainBase */ public viewStateEvent: Subscription | undefined; /** * 获取部件类型 * * @returns {string} * @memberof MainBase */ public getControlType(): string { return 'MULTIEDITVIEWPANEL' } /** * 计数器服务对象集合 * * @type {Array<*>} * @memberof MainBase */ public counterServiceArray:Array<any> = []; /** * 建构部件服务对象 * * @type {MainService} * @memberof MainBase */ public service: MainService = new MainService({ $store: this.$store }); /** * 实体服务对象 * * @type {IBIZBOOKService} * @memberof MainBase */ public appEntityService: IBIZBOOKEntityService = new IBIZBOOKEntityService({ $store: this.$store }); /** * 转化数据 * * @param {any} args * @memberof MainBase */ public transformData(args: any) { let _this: any = this; if(_this.service && _this.service.handleRequestData instanceof Function && _this.service.handleRequestData('transform',_this.context,args)){ return _this.service.handleRequestData('transform',_this.context,args)['data']; } } /** * 关闭视图 * * @param {any} args * @memberof MainBase */ public closeView(args: any): void { let _this: any = this; _this.$emit('closeview', [args]); } /** * 计数器刷新 * * @memberof MainBase */ public counterRefresh(){ const _this:any =this; if(_this.counterServiceArray && _this.counterServiceArray.length >0){ _this.counterServiceArray.forEach((item:any) =>{ if(item.refreshData && item.refreshData instanceof Function){ item.refreshData(); } }) } } /** * 获取多项数据 * * @returns {any[]} * @memberof MainBase */ public getDatas(): any[] { return []; } /** * 获取单项树 * * @returns {*} * @memberof MainBase */ public getData(): any { return null; } /** * 显示处理提示 * * @type {boolean} * @memberof MainBase */ @Prop({ default: true }) public showBusyIndicator?: boolean; /** * 部件行为--update * * @type {string} * @memberof MainBase */ @Prop() public updateAction!: string; /** * 部件行为--fetch * * @type {string} * @memberof MainBase */ @Prop() public fetchAction!: string; /** * 部件行为--remove * * @type {string} * @memberof MainBase */ @Prop() public removeAction!: string; /** * 部件行为--load * * @type {string} * @memberof MainBase */ @Prop() public loadAction!: string; /** * 部件行为--loaddraft * * @type {string} * @memberof MainBase */ @Prop() public loaddraftAction!: string; /** * 部件行为--create * * @type {string} * @memberof MainBase */ @Prop() public createAction!: string; /** * 刷新数据 * * @type {number} * @memberof MainBase */ @Prop() public saveRefView?: number; /** * 刷新数据 * * @param {*} newVal * @param {*} oldVal * @memberof MainBase */ @Watch('saveRefView') onSaveRefView(newVal: any, oldVal: any) { console.log('保存多项数据!'); if (newVal > 0) { this.$emit('drdatasaved', false); } } /** * 对象转字符串 * * @type {*} * @memberof MainBase */ public toString(item:any): string{ return JSON.stringify(item); } /** * 面板状态订阅对象 * * @public * @type {Subject<{action: string, data: any}>} * @memberof Meditviewpanel */ public panelState: Subject<ViewState> = new Subject(); /** * 视图名称 * * @type {string} * @memberof MainBase */ public viewname: string = 'ibizbookinter-func-edit-view'; /** * 获取数据对象 * * @type {any[]} * @memberof MainBase */ public items: any[] = []; /** * 计数器 * * @type number * @memberof MainBase */ public count: number = 0; /** * 关系实体参数对象 * * @public * @type {any[]} * @memberof MainBase */ public deResParameters: any[] = [ ]; /** * 当前应用视图参数对象 * * @public * @type {any[]} * @memberof MainBase */ public parameters: any[] = [ { pathName: 'ibizbooks', parameterName: 'ibizbook' }, ]; /** * vue 声明周期 * * @memberof MainBase */ public created() { this.afterCreated(); } /** * 执行created后的逻辑 * * @memberof MainBase */ public afterCreated(){ if (this.viewState) { this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => { if (!Object.is(tag, this.name)) { return; } if (Object.is(action, 'load')) { this.load(data); } if (Object.is(action, 'save')) { this.saveData(data); } }); } } /** * vue 生命周期 * * @memberof MainBase */ public destroyed() { this.afterDestroy(); } /** * 执行destroyed后的逻辑 * * @memberof MainBase */ public afterDestroy() { if (this.viewStateEvent) { this.viewStateEvent.unsubscribe(); } } /** * 保存数据 * * @memberof Meditviewpanel */ public saveData(data?: any) { this.count = 0; if(this.items.length >0){ Object.assign(data,{showResultInfo:false}); this.panelState.next({ tag: 'meditviewpanel', action: 'save', data: data }); }else{ this.$emit("drdatasaved",{action:'drdatasaved'}); } } /** * 处理数据 * * @public * @param {any[]} datas * @memberof MainBase */ public doItems(datas: any[]): void { const [{ pathName, parameterName }] = this.parameters; datas.forEach((arg: any) => { let id: string = arg[parameterName] ? arg[parameterName] : this.$util.createUUID(); let item: any = { id: id, viewdata: {}, viewparam: {} }; Object.assign(item.viewdata, this.$viewTool.getIndexViewParam()); Object.assign(item.viewdata, this.context); // 关系应用实体参数 this.deResParameters.forEach(({ pathName, parameterName }: { pathName: string, parameterName: string }) => { if (this.context[parameterName] && !Object.is(this.context[parameterName], '')) { Object.assign(item.viewdata, { [parameterName]: this.context[parameterName] }); } else if (arg[parameterName] && !Object.is(arg[parameterName], '')) { Object.assign(item.viewdata, { [parameterName]: arg[parameterName] }); } }); // 当前视图参数(应用实体视图) this.parameters.forEach(({ pathName, parameterName }: { pathName: string, parameterName: string }) => { if (arg[parameterName] && !Object.is(arg[parameterName], '')) { Object.assign(item.viewdata, { [parameterName]: arg[parameterName] }); } }); //合并视图参数 Object.assign(item.viewparam, this.viewparams); this.items.push(item); }); } /** * 数据加载 * * @public * @param {*} data * @memberof MainBase */ public load(data: any): void { if(!this.fetchAction){ this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKMEditView9' + (this.$t('app.multiEditView.notConfig.fetchAction') as string) }); return; } let arg: any = {}; Object.assign(arg, data,{viewparams:this.viewparams}); this.items = []; const promice: Promise<any> = this.service.get(this.fetchAction,JSON.parse(JSON.stringify(this.context)),arg, this.showBusyIndicator); promice.then((response: any) => { if (!response.status || response.status !== 200) { if (response.data && response.data.message) { this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: response.data.message }); } return; } const data: any = response.data; if (data.length > 0) { const items = JSON.parse(JSON.stringify(data)); this.doItems(items); } this.$emit('load', this.items); }).catch((response: any) => { if (response && response.status === 401) { return; } this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: response.data && response.data.message ? response.data.message : "" }); }); } /** * 增加数据 * * @memberof MainBase */ public handleAdd(){ if(!this.loaddraftAction){ this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: 'IBIZBOOKMEditView9' + (this.$t('app.multiEditView.notConfig.loaddraftAction') as string) }); return; } const promice: Promise<any> = this.service.loadDraft(this.loaddraftAction,JSON.parse(JSON.stringify(this.context)),{viewparams:this.viewparams}, this.showBusyIndicator); promice.then((response: any) => { if (!response.status || response.status !== 200) { if (response.data && response.data.message) { this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: response.data.message }); } return; } const data: any = response.data; this.doItems([data]); }).catch((response: any) => { if (response && response.status === 401) { return; } this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: response.data && response.data.message ? response.data.message : "" }); }); } /** * 设置视图脏值变化 * * @param {*} item * @param {boolean} $event * @memberof MainBase */ public setViewDirty(item: any, $event: boolean) { let index: number = this.items.findIndex((_item: any) => Object.is(_item.id, item.id)); if (index === -1) { return; } Object.assign(this.items[index], { viewdirty: $event }); let state: boolean = this.items.some((item: any) => { if (item.viewdirty) { return true; } return false; }); this.$emit('viewdatadirty', state); } /** * 部件抛出事件 * @memberof MainBase */ public viewDataChange($event:any){ if($event){ try{ $event = JSON.parse($event); }catch(error){ return; } if(Object.is($event.action,'load')){ console.log('加载----'); } if(Object.is($event.action,'save')){ this.count++; if (this.items.length === this.count) { this.$emit('drdatasaved',{action:'save'}); } } if(Object.is($event.action,'remove')){ if ($event.data) { let resultIndex = this.items.findIndex((value:any, index:any, arr:any) => { return value['viewdata']['orderdetailtestid'] === $event.data['orderdetailtestid']; }); if (resultIndex !== -1) { this.items.splice(resultIndex, 1); } } } } } /** * 视图加载完成 * * @returns * @memberof MainBase */ public viewload($event:any){ console.log('视图加载完成'); } /** * editview9 视图数据变化 * * @returns * @memberof MainBase */ public viewdirty(item:any,$event:any){ // editview9 视图数据变化; this.setViewDirty(item, $event); } } </script> <style lang='less'> @import './main-multieditviewpanel.less'; </style>