树型多级编号的实现效果如下:
tree

在.w放grid组件,关联设置为树型的data,
data树型定义如下:
treeData
grid中主要设置如下:
treegrid

需要注意grid中的flevel字段是维护级别的,平台默认没有维护需要在新增数据的时候自己维护,在新增根设置编码的时候需要用到
具体的实现代码如下
1.Model的构造函数中定义如下4个变量

	var Model = function() {
		this.callParent();
		this.selectedid, this.selectedParentID, this.selectedCode, this.selectedLevel = "";
	};

2.data的新增前事件中获取当前选中行的父ID(fParentID)、编号(fCode)、级别(flevel)f给变量赋值

	Model.prototype.treeDataBeforeNew = function(event) {
		this.selectedid = event.source.getRowID();
		this.selectedParentID = event.source.getValue("fParentID");
		this.selectedCode = event.source.getValue("fCode");
		this.selectedLevel = event.source.getValue("flevel");
	};

3.data的新增后事件中维护级别和编号的值

	Model.prototype.treeDataAfterNew = function(event) {
		var data = event.source;
		var parent = data.getValue("fParentID");// 获取父ID的值
		if (parent) { // 如果父ID有值,可以通过父ID获取父的层级的值
			var parentRow = data.getRowByID(parent);
			data.setValue("flevel", parseInt(data.getValue("flevel", parentRow)) + 1);// 父的层级加1为当前记录的层级值

		} else { // 如果父ID没有值,就直接给rowid设置层级设置为1(为根目录)
			data.setValue("flevel", 1);
		}
		var maxCode = "";
		var newLevel = data.getValue("flevel");
		if (newLevel == 1) {// 新建(新建根)
			maxCode = this.getNodeMaxCode("");
		} else if (newLevel == this.selectedLevel) {// 新建兄弟
			maxCode = this.getNodeMaxCode(this.selectedParentID);
		} else if (newLevel > this.selectedLevel) {// 新建子
			maxCode = this.getNodeMaxCode(this.selectedid);
		}
		data.setValue("fCode", maxCode);
	};

getNodeMaxCode函数的定义如下:

	Model.prototype.getNodeMaxCode = function(parnetID) {
		var maxCode = "";
		var data = this.comp("treeData");
		var rows = [];
		if (parnetID) {
			var row = data.getRowByID(parnetID);
			// 前提要注意判断子和获取子要求子数据已经加载,如果没有加载是获取不到的;
			// data上delayLoad默认是延迟加载的,展开的时候才会加载子数据,如果没有展开数据,可以设置data不延迟加载数据或者自己在获取的时候调用grid上的API展开数据
			// 如果数据量比较大 必须是延迟加载 那就需要通过发送action请求去biz层查询数据
			if (row.hasChildren()) {// 判断是否有子数据
				rows = row.children();// 获取这个父节点下的同级子节点
			}
		} else {
			rows = data.find([ 'flevel' ], [ "1" ]);
		}
		if (rows) {
			if (rows.length == 1) {
				maxCode = this.selectedCode + "001";
			} else {
				for ( var row in rows) {
					if (maxCode < data.getValue("fCode", rows[row])) {
						maxCode = data.getValue("fCode", rows[row]);
					}
				}
				var len = maxCode.length;
				var maxCodeLeft = maxCode.substr(0, len - 3);
				var maxCodeRight = maxCode.substr(len - 3, 3);
				maxCodeRight = justep.String.zeros(justep.String.toInt(maxCodeRight, 0) + 1, 3);
				maxCode = maxCodeLeft + maxCodeRight;
			}
		}
		return maxCode;
	}