HDD样例

1.样例说明

EAS820尚无法从框架层面直接支持HDD结构,但是可以使用框架自主实现。此处以某电商仓储为例,制作了HDD的web端实现。

2.样例配置

实体结构

HDD实体

注意此处的明细分录实体首字母要改为小写,否则会出现明细分录的值查不出来的问题。</br>

页面结构

HDD页面

HDD页面

这里需要注意的是,① 明细分录的实体对象不能选择任何对象,要保留为空;分录属性名称,不能与该页面上其他的主分录重名。② 明细分录中自定义列,注意是自定义列的元素ID与实体中该字段匹配。

逻辑概述

1. 当点击选中分录中的任意一行,均需要将分录明细的值带出,并放到分录明细的表格中显示。

beforeSelectRow:function(rowid,e){
	//选中一条数据之前,需要首先将上一条的数据保存,然后再初始化当新选中数据
	_private.saveDetail();
	_private.initDetail(rowid);
}

2. 每新增一条主分录,都需要把明细分录上的值先进行保存

appendEntryRowAfter:function(e){
	var overlayId = e.currentTarget.id || $(e.target).closest(".rowoverlay").attr("id"),
		ay = overlayId.split("_"),
		gridId = ay[ay.length-1];
	//清空表格数据,只有主表上新增行时才需要
	if(gridId=="entrys"){
		_private.saveDetail();
		_private.initDetail();
	}
}

3. 每删除主分录,都需要依据情况处理明细分录上的值

deleteEntryRowAfter:function(e){
	//只有选中列即为删除列时,才要清空明细
	var deleteRowId = waf(e.target).attr("rowid")
	var selectedRowId = waf("#entrys").wafGrid("getSelectedRow");
	if(deleteRowId==selectedRowId){
		_private.initDetail();
	}
}

4. 提交或者保存之前,需要先把明细分录的值保存到对应的主分录中,否则会出错

beforeSubmit:function(e){
	//提交或者保存之前需要先将分录明细保存到分录,否则会报错
	_private.saveDetail();
}
,
saveBefore:function(e){
	//提交或者保存之前需要先将分录明细保存到分录,否则会报错
	_private.saveDetail();
}

5. 页面加载,默认显示第一条数据

loadComplete:function(data){
	//默认展示分录第一条数据的
	var rowid = $("#entrys").wafGrid("getRowId",1);
	_private.initDetail(rowid);
}

6. 很多地方都需要初始化明细分录,保存明细分录,所以单独提出一个方法

//初始化明细分录
initDetail(rowid){
	if(rowid){
		var rowdata = waf('#entrys').wafGrid('getRowRealData', rowid);
		var dEntrys = rowdata.dEntrys;
		waf("#editGrid0").wafGrid("setGridData",dEntrys,true);
	}else{//清空明细分录表格
		waf("#editGrid0").wafGrid('clearGridData',true)
	}
}
,
//保存明细分录
saveDetail:function(rowid){
	if(!rowid){
		rowid = waf("#entrys").wafGrid("getSelectedRow");
	}
	var data = waf("#editGrid0").wafGrid("getGridData");
	$("#entrys").wafGrid("setCell",rowid,"dEntrys",data)
}

7. 明细分录字段,默认是不查的,因此我们还需要自己配一个ModelFieldSelectorEvent,把这些额外的字段也查出来。

HDD实体

public class ModelFieldSelectorHandler extends AbstractWebEventHandler implements IModelFieldSelectorEventHandler {
	public void onFieldSelect(ModelFieldSelectorEvent event) {
		SelectorItemCollection sic = event.getSelectorItemCollection();
		sic.add(new SelectorItemInfo("entrys.dEntrys.unit"));
		sic.add(new SelectorItemInfo("entrys.dEntrys.qty"));
		sic.add(new SelectorItemInfo("entrys.dEntrys.area"));
		sic.add(new SelectorItemInfo("entrys.dEntrys.unit.name"));
		sic.add(new SelectorItemInfo("entrys.dEntrys.unit.number"));
	}
}

ModelFieldSelectorEvent是框架内置的一个Event,其目的就是用于查询额外字段,该事件不需要我们自行触发,框架自动触发。

3.样例演示

1.配置页面

2.预览页面

相关样例