<template> <div class='grid' style="height:100%;"> <#if ctrl.render?? || ctrl.getRender()??> ${ctrl.render.code} <#else> <data-reveal-type :datas="JSON.stringify(items)" @click="rowDBLClick"> <el-table v-if="isDisplay === true" <#-- BEGIN:是否支持排序 --> <#if !ctrl.isNoSort()> :default-sort="{ prop: minorSortPSDEF, order: Object.is(minorSortDir, 'ASC') ? 'ascending' : Object.is(minorSortDir, 'DESC') ? 'descending' : '' }" @sort-change="onSortChange($event)" </#if> <#-- END:是否支持排序 --> :border="isDragendCol" <#-- 表格聚合start --> <#if ctrl.getAggMode() != "NONE"> :show-summary="true && items.length > 0" :summary-method="getSummaries" </#if> <#-- 表格聚合end --> stripe :height="isEnablePagingBar && items.length > 0 ? 'calc(100% - 36px)' : '100%'" @row-click="rowClick($event)" @select-all="selectAll($event)" @select="select($event)" @row-class-name="onRowClassName($event)" @row-dblclick="rowDBLClick($event)" ref='multipleTable' :data="items" :show-header="!isHideHeader"> <template v-if="!isSingleSelect"> <el-table-column align="center" type='selection' :width="checkboxColWidth"></el-table-column> </template> <#assign adaptationColu = true/> <#list ctrl.getPSDEGridColumns() as column> <@ibizindent blank=12> ${P.getPartCode(column,'COLUMN').code}<#t> </@ibizindent> </#list> </el-table> <#if ctrl.isEnablePagingBar()> <row class='grid-pagination' v-show="items.length > 0"> <page class='pull-right' @on-change="pageOnChange($event)" @on-page-size-change="onPageSizeChange($event)" :transfer="true" :total="totalrow" show-sizer :current="curPage" :page-size="limit" :page-size-opts="[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]" show-elevator show-total> <span> <span class="page-column"> <poptip transfer placement="top-start"> <i-button icon="md-menu">{{$t('app.gridpage.choicecolumns')}}</i-button> <div slot="content"> <template v-for="col in allColumns"> <div :key="col.name"><el-checkbox v-model="col.show" @change="onColChange()">{{$t(col.langtag)}}</el-checkbox></div> </template> </div> </poptip> </span> <span class="page-button"><i-button icon="md-refresh" :title="$t('app.gridpage.refresh')" @click="pageRefresh()"></i-button></span> <span> {{$t('app.gridpage.show')}} <span> <template v-if="items.length === 1"> 1 </template> <template v-else> <span>{{(curPage - 1) * limit + 1}} - {{totalrow > curPage * limit ? curPage * limit : totalrow}}</span> </template> </span> {{$t('app.gridpage.records')}},{{$t('app.gridpage.totle')}} {{totalrow}} {{$t('app.gridpage.records')}} </span> </span> </page> </row> </#if> </#if> </data-reveal-type> </div> </template> <#assign import_block> import CodeListService from "@service/app/codelist-service"; </#assign> <#ibizinclude> ../@MACRO/CONTROL/CONTROL_HEADER-BASE.vue.ftl </#ibizinclude> /** * 代码表服务对象 * * @type {CodeListService} * @memberof ${srfclassname('${ctrl.codeName}')} */ public codeListService:CodeListService = new CodeListService({ $store: this.$store }); /** * 获取多项数据 * * @returns {any[]} * @memberof ${srfclassname('${ctrl.codeName}')} */ public getDatas(): any[] { return this.selections; } /** * 获取单项树 * * @returns {*} * @memberof ${srfclassname('${ctrl.codeName}')} */ public getData(): any { return this.selections[0]; } <#if view.getPSAppViewLogics?? && view.getPSAppViewLogics()??> <#list view.getPSAppViewLogics() as logic> <#if logic.getPFLogicCodeType() == 'APP_NEWDATA'> /** * 打开新建数据视图 * * @type {any} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Prop() protected newdata: any; </#if> <#if logic.getPFLogicCodeType() == 'APP_OPENDATA'> /** * 打开编辑数据视图 * * @type {any} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Prop() protected opendata: any; </#if> </#list> </#if> /** * 界面行为模型 * * @type {*} * @memberof ${srfclassname('${ctrl.codeName}')}Base */ public ActionModel:any ={ <#if ctrl.getPSUIActions()??> <#list ctrl.getPSUIActions() as item> ${item.getUIActionTag()}: { name: '${item.getUIActionTag()}',disabled: false, visabled: true,noprivdisplaymode:<#if item.getNoPrivDisplayMode(view)??>${item.getNoPrivDisplayMode(view)}</#if>,dataaccaction: '<#if item.getDataAccessAction()??>${item.getDataAccessAction()}</#if>', target: '${item.getActionTarget()}'}<#if item_has_next>,</#if> </#list> </#if> }; /** * 显示处理提示 * * @type {boolean} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Prop({ default: true }) protected showBusyIndicator?: boolean; /** * 部件行为--update * * @type {string} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Prop() protected updateAction!: string; /** * 部件行为--fetch * * @type {string} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Prop() protected fetchAction!: string; /** * 部件行为--remove * * @type {string} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Prop() protected removeAction!: string; /** * 部件行为--load * * @type {string} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Prop() protected loadAction!: string; /** * 部件行为--loaddraft * * @type {string} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Prop() protected loaddraftAction!: string; /** * 部件行为--create * * @type {string} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Prop() protected createAction!: string; /** * 当前页 * * @type {number} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected curPage: number = 1; /** * 数据 * * @type {any[]} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected items: any[] = []; /** * 是否支持分页 * * @type {boolean} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected isEnablePagingBar: boolean = ${ctrl.isEnablePagingBar()?c}; /** * 是否禁用排序 * * @type {boolean} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected isNoSort: boolean = ${ctrl.isNoSort()?c}; /** * 排序方向 * * @type {string} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected minorSortDir: string = '<#if ctrl.getMinorSortDir()??>${ctrl.getMinorSortDir()}</#if>'; /** * 排序字段 * * @type {string} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected minorSortPSDEF: string = '<#if ctrl.getMinorSortPSDEF()??>${ctrl.getMinorSortPSDEF().getCodeName()?lower_case}</#if>'; /** * 分页条数 * * @type {number} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected limit: number = ${ctrl.getPagingSize()?c}; /** * 是否显示标题 * * @type {boolean} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected isHideHeader: boolean = ${ctrl.isHideHeader()?c}; /** * 是否默认选中第一条数据 * * @type {boolean} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Prop({ default: false }) protected isSelectFirstDefault!: boolean; /** * 是否单选 * * @type {boolean} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Prop() protected isSingleSelect?: boolean; /** * 选中数据字符串 * * @type {string} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Prop() protected selectedData?: string; /** * 选中值变化 * * @param {*} newVal * @param {*} oldVal * @memberof MainTree */ @Watch('selectedData') public onValueChange(newVal: any, oldVal: any) { this.selections = []; if(this.selectedData){ const refs: any = this.$refs; if (refs.multipleTable) { refs.multipleTable.clearSelection(); JSON.parse(this.selectedData).forEach((selection:any)=>{ let selectedItem = this.items.find((item:any)=>{ return Object.is(item.srfkey, selection.srfkey); }); if(selectedItem){ this.rowClick(selectedItem); } }); } } } /** * 表格行数据默认激活模式 * 0 不激活 * 1 单击激活 * 2 双击激活 * * @type {(number | 0 | 1 | 2)} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Prop({default: 2}) protected gridRowActiveMode!: number; /** * 是否开启行编辑 * * @type {boolean} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Prop({default: false}) protected isOpenEdit!: boolean; /** * 实际是否开启行编辑 * * @type {boolean} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected actualIsOpenEdit: boolean = this.isOpenEdit; /** * 总条数 * * @type {number} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected totalrow: number = 0; /** * 选中行数据 * * @type {any[]} * @memberof Main */ protected selections: any[] = []; /** * 拦截行选中 * * @type {boolean} * @memberof Main */ protected stopRowClick: boolean = false; <#if ctrl.getAggMode() == "ALL"> /** * 表格聚合行为 * * @type {string} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected aggAction:string ='<#if ctrl.getAggPSDEAction()??>${ctrl.getAggPSDEAction().getCodeName()}</#if>'; /** * 远程数据 * * @type {any} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected remoteData:any = {}; </#if> /** * 表格是否显示 * * @type {boolean} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected isDisplay:boolean = <#if ctrl.getAggMode() == "ALL">false<#else>true</#if>; /** * 部件刷新 * * @param {any[]} args * @memberof ${srfclassname('${ctrl.codeName}')} */ protected refresh(args: any[]): void { this.load(); } /** * 选项框列宽 * * @type {number} * @memberof AppIndex */ public checkboxColWidth: number = <#if app.getPSApplicationUI()??>${app.getPSApplicationUI().getPFStyleParam('EL-TABLE.CHECKCOLWIDTH',34)}<#else>34</#if>; /** * 是否允许拖动列宽 * * @type {boolean} * @memberof AppEmbedPicker */ protected isDragendCol: boolean = <#if app.getPSApplicationUI()??>${app.getPSApplicationUI().getPFStyleParam('EL-TABLE.ISDRAGENDCOL',false)?c}<#else>false</#if>; /** * 所有列成员 * * @type {any[]} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected allColumns: any[] = [ <#if ctrl.getAllPSDEGridColumns()??> <#list ctrl.getAllPSDEGridColumns() as column> { name: '${column.getName()?lower_case}', label: '${column.getCaption()}', langtag: '<#if langbase??>${langbase}.columns.${column.getName()?lower_case}</#if>', show: <#if column.isHideDefault()>false<#else>true</#if>, util: '${column.getWidthUnit()}' }, </#list> </#if> ] /** * 属性值规则 * * @type {*} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected rules: any = { <#list ctrl.getPSDEGridEditItems() as edititem> ${edititem.getName()}: [ { required: <#if edititem.isAllowEmpty()>false<#else>true</#if>, validator: (rule:any, value:any, callback:any) => { return (rule.required && (value === null || value === undefined || value === "")) ? false : true;}, message: <#if edititem.getCaption?? && edititem.getCaption()??>'${edititem.getCaption()} 值不能为空'<#else>'值不能为空'</#if>, trigger: 'change' }, { required: <#if edititem.isAllowEmpty()>false<#else>true</#if>, validator: (rule:any, value:any, callback:any) => { return (rule.required && (value === null || value === undefined || value === "")) ? false : true;}, message: <#if edititem.getCaption?? && edititem.getCaption()??>'${edititem.getCaption()} 值不能为空'<#else>'值不能为空'</#if>, trigger: 'blur' }, <#if ctrl.getPSGEIDEFValueRules?? && ctrl.getPSGEIDEFValueRules()??> <#list ctrl.getPSGEIDEFValueRules() as fideValueRule> <#if fideValueRule.getPSSysValueRule()??> <#assign valueRule = fideValueRule.getPSSysValueRule()/> <#if valueRule.getRuleType?? && valueRule.getRuleType()??> <#if valueRule.getRuleType() == "REG"> { <#if valueRule.getRegExCode?? && valueRule.getRegExCode()??>pattern: /^${valueRule.getRegExCode()}$/</#if><#if valueRule.getRuleInfo?? && valueRule.getRuleInfo()??>, message: '${valueRule.getRuleInfo()}'</#if>, trigger: 'change' }, <#elseif valueRule.getRuleType() == "SCRIPT"> { <#if valueRule.getScriptCode?? && valueRule.getScriptCode()??>validator: (rule:any, value:any, callback:any) => { ${valueRule.getScriptCode()} }</#if><#if valueRule.getRuleInfo?? && valueRule.getRuleInfo()??>, message: '${valueRule.getRuleInfo()}'</#if>, trigger: 'change' }, </#if> </#if> </#if> </#list> </#if> ], </#list> } /** * 表格数据加载 * * @param {*} [arg={}] * @memberof ${srfclassname('${ctrl.codeName}')}Base */ public load(opt: any = {}, pageReset: boolean = false): void { if(!this.fetchAction){ this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: '${view.getName()}'+(this.$t('app.gridpage.notConfig.fetchAction') as string) }); return; } if(pageReset){ this.curPage = 1; } const arg: any = {...opt}; const page: any = {}; if (this.isEnablePagingBar) { Object.assign(page, { page: this.curPage-1, size: this.limit }); } // 设置排序 if (!this.isNoSort && !Object.is(this.minorSortDir, '') && !Object.is(this.minorSortPSDEF, '')) { const sort: string = this.minorSortPSDEF+","+this.minorSortDir; Object.assign(page, { sort: sort }); } Object.assign(arg, page); const parentdata: any = {}; this.$emit('beforeload', parentdata); Object.assign(arg, parentdata); let tempViewParams:any = parentdata.viewparams?parentdata.viewparams:{}; Object.assign(tempViewParams,JSON.parse(JSON.stringify(this.viewparams))); Object.assign(arg,{viewparams:tempViewParams}); const post: Promise<any> = this.service.search(this.fetchAction,JSON.parse(JSON.stringify(this.context)), arg, this.showBusyIndicator); post.then((response: any) => { if (!response.status || response.status !== 200) { if (response.errorMessage) { this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: response.errorMessage }); } return; } const data: any = response.data; this.totalrow = response.total; this.items = JSON.parse(JSON.stringify(data)); // 清空selections,gridItemsModel this.selections = []; this.gridItemsModel = []; this.items.forEach(()=>{this.gridItemsModel.push(this.getGridRowModel())}); this.items.forEach((item:any)=>{ Object.assign(item,this.getActionState(item)); }); this.$emit('load', this.items); // 设置默认选中 let _this = this; setTimeout(() => { if(_this.isSelectFirstDefault){ _this.rowClick(_this.items[0]); } if(_this.selectedData){ const refs: any = _this.$refs; if (refs.multipleTable) { refs.multipleTable.clearSelection(); JSON.parse(_this.selectedData).forEach((selection:any)=>{ let selectedItem = _this.items.find((item:any)=>{ return Object.is(item.srfkey, selection.srfkey); }); if(selectedItem){ _this.rowClick(selectedItem); } }); } } }, 300); <#if ctrl.getAggMode() == "ALL"> this.getAggData(); </#if> }).catch((response: any) => { if (response && response.status === 401) { return; } this.$Notice.error({ title: (this.$t('app.commonWords.wrong') as string), desc: response.errorMessage }); }); } /** * 表格模型集合 * * @type {*} * @memberof ${srfclassname('${ctrl.codeName}')}Base */ public gridItemsModel: any[] = []; /** * 获取界面行为权限状态 * * @memberof ${srfclassname('${ctrl.codeName}')}Base */ public getActionState(data:any){ let targetData:any = this.transformData(data); let tempActionModel:any = JSON.parse(JSON.stringify(this.ActionModel)); ViewTool.calcActionItemAuthState(targetData,tempActionModel,this.appUIService); return tempActionModel; } /** * 删除 * * @param {any[]} datas * @returns {Promise<any>} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected async remove(datas: any[]): Promise<any> { if(!this.removeAction){ this.$Notice.error({ title: '错误', desc: '${view.getName()}视图表格removeAction参数未配置' }); return; } let _datas:any[] = []; datas.forEach((record: any, index: number) => { if (!record.srfkey) { this.items.some((val: any, num: number) =>{ if(JSON.stringify(val) == JSON.stringify(record)){ this.items.splice(num,1); return true; } }); }else{ _datas.push(datas[index]); } }); if (_datas.length === 0) { return; } let dataInfo = ''; _datas.forEach((record: any, index: number) => { let srfmajortext = record.${ctrl.getPSAppDataEntity().getMajorPSAppDEField().getCodeName()?lower_case}; if (index < 5) { if (!Object.is(dataInfo, '')) { dataInfo += '、'; } dataInfo += srfmajortext; } else { return false; } }); if (_datas.length < 5) { dataInfo = dataInfo + ' 共' + _datas.length + '条数据'; } else { dataInfo = dataInfo + '...' + ' 共' + _datas.length + '条数据'; } const removeData = () => { let keys: any[] = []; _datas.forEach((data: any) => { keys.push(data.srfkey); }); let _removeAction = keys.length > 1 ? 'removeBatch' : this.removeAction ; let _keys = keys.length > 1 ? keys : keys[0] ; const context:any = JSON.parse(JSON.stringify(this.context)); const post: Promise<any> = this.service.delete(_removeAction,Object.assign(context,{ ${ctrl.getPSAppDataEntity().codeName?lower_case}: _keys }),Object.assign({ ${ctrl.getPSAppDataEntity().codeName?lower_case}: _keys },{viewparams:this.viewparams}), this.showBusyIndicator); return new Promise((resolve: any, reject: any) => { post.then((response: any) => { if (!response || response.status !== 200) { this.$Notice.error({ title: '', desc: '删除数据失败,' + response.info }); return; } else { this.$Notice.success({ title: '', desc: '删除成功!' }); } //删除items中已删除的项 console.log(this.items); _datas.forEach((data: any) => { this.items.some((item:any,index:number)=>{ if(Object.is(item.srfkey,data.srfkey)){ this.items.splice(index,1); return true; } }); }); this.totalrow -= _datas.length; this.$emit('remove', null); this.selections = []; resolve(response); }).catch((response: any) => { if (response && response.status === 401) { return; } if (!response || !response.status || !response.data) { this.$Notice.error({ title: '错误', desc: '系统异常' }); reject(response); return; } reject(response); }); }); } dataInfo = dataInfo.replace(/[null]/g, '').replace(/[undefined]/g, ''); this.$Modal.confirm({ title: '警告', content: '确认要删除 ' + dataInfo + ',删除操作将不可恢复?', onOk: () => { removeData(); }, onCancel: () => { } }); return removeData; } /** * 批量添加 * * @param {*} [arg={}] * @memberof ${srfclassname('${ctrl.codeName}')} */ protected addBatch(arg: any = {}): void { if(!this.fetchAction){ this.$Notice.error({ title: '错误', desc: '${view.getName()}视图表格fetchAction参数未配置' }); return; } if(!arg){ arg = {}; } console.error("批量添加未实现"); <#-- const post: Promise<any> = this.$http.post(this.fetchAction, arg, this.showBusyIndicator); post.then((response: any) => { if (response.ret !== 200) { this.$Notice.error({ title: '', desc: '批量添加失败,' + response.info }); return; } this.load({}); this.$emit('addbatch', null); }).catch((response: any) => { if (response && response.status === 401) { return; } this.$Notice.error({ title: '', desc: '批量添加失败' }); }); --> } /** * 数据导入 * * @param {*} data * @memberof ${srfclassname('${ctrl.codeName}')} */ public importExcel(data:any ={}):void{ //导入excel const importDataModel:any ={ <#if ctrl.getPSDEDataImport?? && ctrl.getPSDEDataImport()??> <#assign dataImport = ctrl.getPSDEDataImport() /> importId:'${dataImport.getCodeName()}', serviceName:'${dataImport.getPSAppDataEntity().getCodeName()?lower_case}', appDeLogicName:'${dataImport.getPSAppDataEntity().getLogicName()}', importData:{ <#if dataImport.getPSDEDataImportItems()??> <#list dataImport.getPSDEDataImportItems() as dataImportItem> "${dataImportItem.getName()}":{<#if dataImportItem.getPSCodeList()??><#assign codelist = dataImportItem.getPSCodeList()/>"codelist":{"type":"${codelist.getCodeListType()}","tag":"${codelist.getCodeName()}","isnumber":${codelist.isCodeItemValueNumber()?c}},</#if>"headername":"${dataImportItem.getCaption()}","isuniqueitem":${dataImportItem.isUniqueItem()?c},<#if dataImportItem.getPSAppDEField()??><#assign appDeField = dataImportItem.getPSDEField()/>"name":"${appDeField.getCodeName()?lower_case}","order":<#if appDeField.getImportOrder()??>${appDeField.getImportOrder()?c}</#if></#if>}<#if dataImportItem_has_next>,</#if> </#list> </#if> } </#if> } if(Object.keys(importDataModel).length == 0){ this.$Notice.warning({ title: '警告', desc: '请配置数据导入项' }); return; } const view:any ={ viewname: 'app-data-upload', title: '导入数据', width: 900, height: 700 } let container: Subject<any> = this.$appmodal.openModal(view, JSON.parse(JSON.stringify(this.context)), importDataModel); container.subscribe((result: any) => { if(Object.is(result.ret,'OK')){ this.refresh(result.datas); } }); } <#assign hasDEExport = false /> <#if ctrl.getPSDEDataExport?? && ctrl.getPSDEDataExport()??> <#assign hasDEExport = true /> /** * 所有导出列成员 * * @type {any[]} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected allExportColumns: any[] = [ <#if ctrl.getPSDEDataExport().getPSDEDataExportItems()??> <#list ctrl.getPSDEDataExport().getPSDEDataExportItems() as column> { name: '${column.getName()?lower_case}', label: '${column.getCaption()}', langtag: '<#if langbase??>${langbase}.exportColumns.${column.getName()?lower_case}</#if>', show: true, }, </#list> </#if> ] </#if> /** * 数据导出 * * @param {*} data * @memberof ${srfclassname('${ctrl.codeName}')} */ protected exportExcel(data: any = {}): void { // 导出Excel const doExport = async (_data:any) => { const tHeader: Array<any> = []; const filterVal: Array<any> = []; <#if hasDEExport> this.allExportColumns.forEach((item: any) => { <#else> this.allColumns.forEach((item: any) => { </#if> item.show && item.label ? tHeader.push(this.$t(item.langtag)) : ""; item.show && item.name ? filterVal.push(item.name) : ""; }); const data = await this.formatExcelData(filterVal, _data); this.$export.exportExcel().then((excel:any)=>{ excel.export_json_to_excel({ header: tHeader, //表头 必填 data, //具体数据 必填 filename: "${ctrl.getPSAppDataEntity().getLogicName()}表", //非必填 autoWidth: true, //非必填 bookType: "xlsx" //非必填 }); }); }; const page: any = {}; // 设置page,size if (Object.is(data.type, 'maxRowCount')) { Object.assign(page, { page: 0, size: data.maxRowCount }); } else if (Object.is(data.type, 'activatedPage')) { <#if hasDEExport> Object.assign(page, { page: this.curPage-1, size: this.limit }); <#else> try { doExport(JSON.parse(JSON.stringify(this.items))); } catch (error) { console.error(error); } return; </#if> } // 设置排序 if (!this.isNoSort && !Object.is(this.minorSortDir, '') && !Object.is(this.minorSortPSDEF, '')) { const sort: string = this.minorSortPSDEF+","+this.minorSortDir; Object.assign(page, { sort: sort }); } const arg: any = {}; Object.assign(arg, page); // 获取query,搜索表单,viewparams等父数据 const parentdata: any = {}; this.$emit('beforeload', parentdata); Object.assign(arg, parentdata); <#if hasDEExport> const post: Promise<any> = this.service.searchDEExportData(this.fetchAction,JSON.parse(JSON.stringify(this.context)), arg, this.showBusyIndicator); <#else> const post: Promise<any> = this.service.search(this.fetchAction,JSON.parse(JSON.stringify(this.context)), arg, this.showBusyIndicator); </#if> post.then((response: any) => { if (!response || response.status !== 200) { this.$Notice.error({ title: '', desc: '数据导出失败,' + response.info }); return; } try { doExport(JSON.parse(JSON.stringify(response.data))); } catch (error) { console.error(error); } }).catch((response: any) => { if (response && response.status === 401) { return; } this.$Notice.error({ title: '', desc: '数据导出失败' }); }); } /** * 导出数据格式化 * * @param {*} filterVal * @param {*} jsonData * @returns {[]} * @memberof ${srfclassname('${ctrl.codeName}')} */ public async formatExcelData(filterVal:any, jsonData:any) { let codelistColumns:Array<any> = [ <#if hasDEExport> <#assign exportItems = ctrl.getPSDEDataExport().getPSDEDataExportItems() /> <#else> <#assign exportItems = ctrl.getAllPSDEGridColumns() /> </#if> <#if exportItems??> <#list exportItems as column> <#if (hasDEExport || (!column.isHideDefault() && column.getName() != '')) && column.getCodeList?? && column.getCodeList()?? && column.getCLConvertMode() == 'FRONT'> <#assign codelist = column.getPSCodeList()> <#if codelist.getCodeListType() == 'STATIC' || codelist.getCodeListType() == 'DYNAMIC'> { name: '${column.getName()?lower_case}', srfkey: '${codelist.codeName}', codelistType : '${codelist.getCodeListType()}', <#if codelist.getOrMode() == 'STR'> textSeparator: '${codelist.textSeparator}', renderMode: 'string', valueSeparator: "${codelist.valueSeparator}", <#elseif codelist.getOrMode() == 'NUM'> renderMode: 'number', textSeparator: '${codelist.textSeparator}', valueSeparator: ';', <#else> renderMode: 'other', textSeparator: '、', valueSeparator: ';', </#if> }, </#if> </#if> </#list> </#if> ]; let _this = this; for (const codelist of codelistColumns) { // 动态代码表处理 if (Object.is(codelist.codelistType, "DYNAMIC")) { let items = await _this.codeListService.getItems(codelist.srfkey); jsonData.forEach((row:any)=>{ row[codelist.name] = _this.getCodelistValue(items, row[codelist.name], codelist); }); // 静态处理 } else if(Object.is(codelist.codelistType, "STATIC")){ let items = await _this.$store.getters.getCodeListItems(codelist.srfkey); jsonData.forEach((row:any)=>{ row[codelist.name] = _this.getCodelistValue(items, row[codelist.name], codelist); }); } } return jsonData.map((v:any) => filterVal.map((j:any) => v[j])) } /** * 解析代码表和vlaue,设置items * * @private * @param {any[]} items 代码表数据 * @param {*} value * @returns {*} * @memberof ${srfclassname('${ctrl.codeName}')} */ private getCodelistValue(items: any[], value: any, codelist: any,){ if(!value){ return this.$t('codelist.'+codelist.srfkey+'.empty'); } if (items) { let result:any = []; if(Object.is(codelist.renderMode,"number")){ items.map((_item: any, index: number)=>{ const nValue = parseInt((value as any), 10); const codevalue = _item.value; if((parseInt(codevalue, 10) & nValue) > 0){ result.push(_item); } }); } else if(Object.is(codelist.renderMode,"string")){ const arrayValue: Array<any> = (value as any).split(codelist.valueSeparator); arrayValue.map((value: any, index: number) => { result.push([]); let values: any[] = Object.is(this.$util.typeOf(value), 'number') ? [value] : [...(value as any).split(codelist.valueSeparator)]; values.map((val:any ,num: number)=>{ const item = this.getItem(items, val, codelist); if(item){ result[index].push(item); } }); }); } else { let values: any[] = Object.is(this.$util.typeOf(value), 'number') ? [value] : [...(value as any).split(codelist.valueSeparator)]; values.map((value:any ,index: number)=>{ const item = this.getItem(items, value, codelist); if(item){ result.push(item); } }); } // 设置items if(result.length != 0){ return result.join(codelist.valueSeparator); }else{ return value; } } } /** * 获取代码项 * * @private * @param {any[]} items * @param {*} value * @returns {*} * @memberof ${srfclassname('${ctrl.codeName}')} */ private getItem(items: any[], value: any, codelist: any): any { const arr: Array<any> = items.filter(item => {return item.value == value}); if (arr.length !== 1) { return undefined; } if(Object.is(codelist.codelistType,'STATIC')){ return this.$t('codelist.'+codelist.srfkey+'.'+arr[0].value); }else{ return arr[0].text; } } /** * 生命周期 * * @memberof ${srfclassname('${ctrl.codeName}')} */ protected created(): void { this.afterCreated(); } /** * 执行created后的逻辑 * * @memberof ${srfclassname('${ctrl.codeName}')} */ protected afterCreated(){ this.setColState(); if (this.viewState) { this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => { if (!Object.is(tag, this.name)) { return; } if (Object.is('load', action)) { this.load(data); } if (Object.is('remove', action)) { this.remove(data); } if (Object.is('save', action)) { this.save(data); } }); } } /** * vue 生命周期 * * @memberof ${srfclassname('${ctrl.codeName}')} */ protected destroyed() { this.afterDestroy(); } /** * 执行destroyed后的逻辑 * * @memberof ${srfclassname('${ctrl.codeName}')} */ protected afterDestroy() { if (this.viewStateEvent) { this.viewStateEvent.unsubscribe(); } <#if destroyed_block??> ${destroyed_block} </#if> } /** * 获取选中行胡数据 * * @returns {any[]} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected getSelection(): any[] { return this.selections; } /** * 行双击事件 * * @param {*} $event * @returns {void} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected rowDBLClick($event: any): void { if (!$event || this.actualIsOpenEdit || Object.is(this.gridRowActiveMode,0)) { return; } this.selections = []; this.selections.push(JSON.parse(JSON.stringify($event))); const refs: any = this.$refs; if (refs.multipleTable) { refs.multipleTable.clearSelection(); refs.multipleTable.toggleRowSelection($event); } this.$emit('rowdblclick', this.selections); this.$emit('selectionchange', this.selections); } /** * 复选框数据选中 * * @param {*} $event * @returns {void} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected select($event: any): void { if (!$event) { return; } this.selections = []; this.selections = [...JSON.parse(JSON.stringify($event))]; this.$emit('selectionchange', this.selections); } /** * 复选框数据全部选中 * * @param {*} $event * @memberof ${srfclassname('${ctrl.codeName}')} */ protected selectAll($event: any): void { if (!$event) { return; } this.selections = []; this.selections = [...JSON.parse(JSON.stringify($event))]; this.$emit('selectionchange', this.selections); } /** * 行单击选中 * * @param {*} $event * @returns {void} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected rowClick($event: any, ifAlways: boolean = false): void { if (!ifAlways && (!$event || this.actualIsOpenEdit)) { return; } if(this.stopRowClick) { this.stopRowClick = false; return; } if(this.isSingleSelect){ this.selections = []; } // 已选中则删除,没选中则添加 let selectIndex = this.selections.findIndex((item:any)=>{ return Object.is(item.${ctrl.getPSDataEntity().getName()?lower_case},$event.${ctrl.getPSDataEntity().getName()?lower_case}); }); if (Object.is(selectIndex,-1)){ this.selections.push(JSON.parse(JSON.stringify($event))); } else { this.selections.splice(selectIndex,1); } const refs: any = this.$refs; if (refs.multipleTable) { if(this.isSingleSelect){ refs.multipleTable.clearSelection(); refs.multipleTable.setCurrentRow($event); }else{ refs.multipleTable.toggleRowSelection($event); } } this.$emit('selectionchange', this.selections); } /** * 页面变化 * * @param {*} $event * @returns {void} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected pageOnChange($event: any): void { if (!$event) { return; } if ($event === this.curPage) { return; } this.curPage = $event; this.load({}); } /** * 分页条数变化 * * @param {*} $event * @returns {void} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected onPageSizeChange($event: any): void { if (!$event) { return; } if ($event === this.limit) { return; } this.limit = $event; if (this.curPage === 1) { this.load({}); } } /** * 分页刷新 * * @memberof ${srfclassname('${ctrl.codeName}')} */ protected pageRefresh(): void { this.load({}); } /** * 排序变化 * * @param {{ column: any, prop: any, order: any }} { column, prop, order } * @memberof ${srfclassname('${ctrl.codeName}')} */ protected onSortChange({ column, prop, order }: { column: any, prop: any, order: any }): void { const dir = Object.is(order, 'ascending') ? 'asc' : Object.is(order, 'descending') ? 'desc' : ''; if (Object.is(dir, this.minorSortDir) && Object.is(this.minorSortPSDEF, prop)) { return; } this.minorSortDir = dir; this.minorSortPSDEF = prop ? prop : ''; this.load({}); } /** * 表格行选中样式 * * @param {{ row: any, rowIndex: any }} { row, rowIndex } * @returns {string} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected onRowClassName({ row, rowIndex }: { row: any, rowIndex: any }): string { const index = this.selections.findIndex((select: any) => Object.is(select.srfkey, row.srfkey)); return index !== -1 ? 'grid-row-select' : ''; } <#if ctrl.getAggMode() != "NONE"> /** * 合计行绘制 * * @param {any} param * @memberof ${srfclassname('${ctrl.codeName}')} */ protected getSummaries(param:any){ <#if ctrl.getAggMode() == "PAGE"> const { columns, data } = param; const sums:Array<any> = []; columns.forEach((column:any, index:number) => { if (index === 0) { sums[index] = '合计'; return; } if(index === (columns.length - 1)){ sums[index] = ''; return; } const values = data.map((item:any) => Number(item[column.property])); if (!values.every((value:any) => isNaN(value))) { <#if ctrl.getPSDEGridColumns()??> <#list ctrl.getPSDEGridColumns() as singleColumn> <#if singleColumn.getAggMode() == "SUM"> if(Object.is(column.property,'${singleColumn.getCodeName()?lower_case}')){ let tempData = values.reduce((prev:any, curr:any) => { const value = Number(curr); if (!isNaN(value)) { return prev + curr; } else { return prev; } }, 0); sums[index] = tempData; } <#elseif singleColumn.getAggMode() == "AVG"> if(Object.is(column.property,'${singleColumn.getCodeName()?lower_case}')){ let tempData = values.reduce((prev:any, curr:any) => { const value = Number(curr); if (!isNaN(value)) { return prev + curr; } else { return prev; } }, 0); sums[index] = tempData/data.length; } <#elseif singleColumn.getAggMode() == "MAX"> if(Object.is(column.property,'${singleColumn.getCodeName()?lower_case}')){ let tempData:any; values.forEach((item:any) =>{ const value = Number(item); if (!isNaN(value)) { if(!tempData){ tempData = value; } if(value > tempData){ tempData = value; } } }); sums[index] = tempData; } <#elseif singleColumn.getAggMode() == "MIN"> if(Object.is(column.property,'${singleColumn.getCodeName()?lower_case}')){ let tempData:any; values.forEach((item:any) =>{ const value = Number(item); if (!isNaN(value)) { if(!tempData){ tempData = value; } if(value < tempData){ tempData = value; } } }); sums[index] = tempData; } </#if> </#list> </#if> } else { sums[index] = 'N/A'; } }); return sums; <#elseif ctrl.getAggMode() == "ALL"> const { columns } = param; const sums:Array<any> = []; columns.forEach((column:any, index:number) => { if (index === 0) { sums[index] = '合计'; return; }else if(index === (columns.length - 1)){ sums[index] = ''; return; }else{ <#if ctrl.getPSDEGridColumns()??> sums[index] = 'N/A'; <#list ctrl.getPSDEGridColumns() as singleColumn> <#if singleColumn.getAggMode() != "NONE"> if(Object.is(column.property,'${singleColumn.getCodeName()?lower_case}')){ const value = Number(this.remoteData.${singleColumn.getCodeName()?lower_case}); if (!isNaN(value)) { <#if singleColumn.getAggMode() == "SUM"> sums[index] = value; <#elseif singleColumn.getAggMode() == "AVG"> sums[index] = value; <#elseif singleColumn.getAggMode() == "MAX"> sums[index] = value; <#elseif singleColumn.getAggMode() == "MIN"> sums[index] = value; </#if> } } </#if> </#list> </#if> } }); return sums; </#if> } </#if> <#if ctrl.getAggMode() == "ALL"> /** * 远程获取合计行数据 * * @memberof ${srfclassname('${ctrl.codeName}')} */ protected getAggData(){ this.service.getAggData(this.aggAction,JSON.parse(JSON.stringify(this.context)),this.showBusyIndicator).then((response:any) =>{ if (!response.status || response.status !== 200) { if (response.errorMessage) { this.$Notice.error({ title: '错误', desc: response.errorMessage }); } return; } this.remoteData = response.data; this.isDisplay = true; }).catch((response:any) =>{ if (response && response.status === 401) { return; } this.remoteData = {}; this.isDisplay = true; this.$Notice.error({ title: '错误', desc: response.errorMessage }); }) } </#if> /** * 界面行为 * * @param {*} row * @param {*} tag * @param {*} $event * @memberof ${srfclassname('${ctrl.codeName}')} */ public uiAction(row: any, tag: any, $event: any) { // this.rowClick(row, true); <#if ctrl.getPSAppViewLogics()??> <#list ctrl.getPSAppViewLogics() as logic> <#if logic.getPSAppViewUIAction().getPSUIAction()??> <#assign action = logic.getPSAppViewUIAction().getPSUIAction()> if(Object.is('${action.getUIActionTag()}', tag)) { this.${logic.getName()}(row, tag, $event); } </#if> </#list> </#if> } /** * 设置列状态 * * @memberof ${srfclassname('${ctrl.codeName}')} */ protected setColState() { const _data: any = localStorage.getItem('${ctrl.getPSDataEntity().getName()?lower_case}_${ctrl.getCodeName()?lower_case}_${ctrl.name}'); if (_data) { let columns = JSON.parse(_data); columns.forEach((col: any) => { let column = this.allColumns.find((item) => Object.is(col.name, item.name)); if (column) { Object.assign(column, col); } }); } } /** * 列变化 * * @memberof ${srfclassname('${ctrl.codeName}')} */ protected onColChange() { localStorage.setItem('${ctrl.getPSDataEntity().getName()?lower_case}_${ctrl.getCodeName()?lower_case}_${ctrl.name}', JSON.stringify(this.allColumns)); } /** * 获取列状态 * * @param {string} name * @returns {boolean} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected getColumnState(name: string): boolean { let column = this.allColumns.find((col: any) => Object.is(name, col.name) ); return column.show ? true : false; } /** * 保存 * * @param {*} $event * @returns {void} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected async save(args: any[], params?: any, $event?: any, xData?: any) { let _this = this; let promises:any = []; _this.items.forEach((item:any)=>{ if(!item.rowDataState){ return; } else if(Object.is(item.rowDataState, 'create')){ if(!this.createAction){ this.$Notice.error({ title: '错误', desc: '${view.getName()}视图表格createAction参数未配置' }); return; } Object.assign(item,{viewparams:this.viewparams}); promises.push(this.service.add(this.createAction, JSON.parse(JSON.stringify(this.context)),item, this.showBusyIndicator)); }else if(Object.is(item.rowDataState, 'update')){ if(!this.updateAction){ this.$Notice.error({ title: '错误', desc: '${view.getName()}视图表格updateAction参数未配置' }); return; } Object.assign(item,{viewparams:this.viewparams}); <#if de??> if(item.${appde.getCodeName()?lower_case}){ Object.assign(this.context,{${appde.getCodeName()?lower_case}:item.${appde.getCodeName()?lower_case}}) } </#if> promises.push(this.service.add(this.updateAction,JSON.parse(JSON.stringify(this.context)),item, this.showBusyIndicator)); } }); Promise.all(promises).then((response: any) => { this.$emit('save', response); }).catch((response: any) => { this.$Notice.error({ title: '错误', desc: '系统异常' }); }); } <#if ctrl.isEnableRowEdit()> /** * 新建行 * * @param {*} $event * @returns {void} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected newRow(args: any[], params?: any, $event?: any, xData?: any): void { if(!this.loaddraftAction){ this.$Notice.error({ title: '错误', desc: '${view.getName()}视图表格loaddraftAction参数未配置' }); return; } let _this = this; Object.assign(args[0],{viewparams:this.viewparams}); let post: Promise<any> = this.service.loadDraft(this.loaddraftAction, JSON.parse(JSON.stringify(this.context)), args[0], this.showBusyIndicator); post.then((response: any) => { if (!response.status || response.status !== 200) { if (response.errorMessage) { this.$Notice.error({ title: '错误', desc: response.errorMessage }); } return; } const data = response.data; data.rowDataState = "create"; _this.items.push(data); }).catch((response: any) => { if (response && response.status === 401) { return; } if (!response || !response.status || !response.data) { this.$Notice.error({ title: '错误', desc: '系统异常' }); return; } }); } /** * 表格编辑项值变更 * * @param row 行数据 * @param {{ name: string, value: any }} $event * @returns {void} * @memberof ${srfclassname('${ctrl.codeName}')} */ public onGridItemValueChange(row: any,$event: { name: string, value: any },rowIndex: number): void { if (!$event) { return; } if (!$event.name || Object.is($event.name, '') || !row.hasOwnProperty($event.name)) { return; } row[$event.name] = $event.value; this.gridEditItemChange(row, $event.name, $event.value, rowIndex); } /** * 表格编辑项值变化 * * @private * @param row 行数据 * @param property 列编辑项名 * @param row 列编辑项值 * @returns {void} * @memberof ${srfclassname('${ctrl.codeName}')} */ public gridEditItemChange(row: any, property: string, value: any, rowIndex: number){ row.rowDataState = row.rowDataState ? row.rowDataState : "update" ; <#if ctrl.getPSDEGridEditItems()??> <#list ctrl.getPSDEGridEditItems() as editItem> <#if editItem.getPSDEGridEditItemUpdate()??> <#assign itemUpdate=editItem.getPSDEGridEditItemUpdate()/> if(Object.is(property, '${editItem.name}')){ const details: string[] = [<#list itemUpdate.getPSDEGEIUpdateDetails() as detail><#if detail_index gt 0>, </#if>'${detail.getPSDEGridColumnName()?lower_case}'</#list>]; this.updateGridEditItem('${itemUpdate.codeName}', row, details, ${itemUpdate.isShowBusyIndicator()?c}); } </#if> </#list> </#if> } /** * 表格编辑项更新 * * @param {string} mode 界面行为名称 * @param {*} [data={}] 请求数据 * @param {string[]} updateDetails 更新项 * @param {boolean} [showloading] 是否显示加载状态 * @returns {void} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected updateGridEditItem(mode: string, data: any = {}, updateDetails: string[], showloading?: boolean): void { if (!mode || (mode && Object.is(mode, ''))) { return; } const arg: any = JSON.parse(JSON.stringify(data)); Object.assign(arg,{viewparams:this.viewparams}); const post: Promise<any> = this.service.frontLogic(mode,JSON.parse(JSON.stringify(this.context)),arg, showloading); post.then((response: any) => { if (!response || response.status !== 200) { this.$Notice.error({ title: '错误', desc: '表单项更新失败' }); return; } const _data: any = response.data; if(!_data){ return; } updateDetails.forEach((name: string) => { if (!_data.hasOwnProperty(name)) { return; } data[name] = _data[name]; }); }).catch((response: any) => { if (response && response.status === 401) { return; } if (!response || !response.status || !response.data) { this.$Notice.error({ title: '错误', desc: '系统异常' }); return; } }); } </#if> /** * 获取对应行class * * @param {*} $args row 行数据,rowIndex 行索引 * @returns {void} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected getRowClassName(args:{row: any,rowIndex: number}){ let isSelected = this.selections.some((item:any)=>{ return Object.is(item.${appde.getCodeName()?lower_case},args.row.${appde.getCodeName()?lower_case}); }); return isSelected ? "grid-selected-row" : ""; } <#ibizinclude> ../@MACRO/CONTROL/CONTROL_BOTTOM-BASE.vue.ftl </#ibizinclude> <#ibizinclude> ../@MACRO/CONTROL/CONTROL-BASE.style.ftl </#ibizinclude>