表头和表体页面包括两种,单子表和多子表,即1对1和1对多。这里先介绍单表体页面。这也是单据业务中经常遇到的一种页面。如图所示:
省略前面的开发步骤。
7、Service开发
/**
* 产品,表头和表体(单表体)
*
* @author xuqc
* @date 2013-10-17 下午02:44:40
*/
@Service
public class T210Service extends AbsBillServiceImpl {
public String getBillType() {
return "PROD";
}
private AggregatedValueObject billInfo;
public AggregatedValueObject getBillInfo() {
if(billInfo == null) {
billInfo = new ExAggProductVO();
VOTableVO vo = new VOTableVO();
// 由于是档案型,所以这里手工创建billInfo
vo.setAttributeValue(VOTableVO.BILLVO, ExAggProductVO.class.getName());
vo.setAttributeValue(VOTableVO.HEADITEMVO, ProductVO.class.getName());
vo.setAttributeValue(VOTableVO.PKFIELD, ProductVO.PK_PRODUCT);
billInfo.setParentVO(vo);
VOTableVO childVO = new VOTableVO();
childVO.setAttributeValue(VOTableVO.BILLVO, ExAggProductVO.class.getName());
childVO.setAttributeValue(VOTableVO.HEADITEMVO, ProductDetailVO.class.getName());
childVO.setAttributeValue(VOTableVO.PKFIELD, ProductVO.PK_PRODUCT);
childVO.setAttributeValue(VOTableVO.ITEMCODE, "demo_product_detail");
childVO.setAttributeValue(VOTableVO.VOTABLE, "demo_product_detail");
CircularlyAccessibleValueObject[] childrenVO = { childVO };
billInfo.setChildrenVO(childrenVO);
}
return billInfo;
}
}
8、Controller开发
/**
* 主子表,单子表
*
* @author xuqc
* @date 2013-10-17 下午02:55:09
*/
@Controller
@RequestMapping(value = "/busi/scene/t210")
public class T210Controller extends AbsBillController {
@Autowired
private T210Service t210Service;
@Override
public T210Service getService() {
return t210Service;
}
}
9、jsp文件
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ page language="java" pageEncoding="UTF-8"
contentType="text/html; charset=UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<%@ include file="/common/header.jsp"%>
<script>
function yellowRenderer(value,meta,record){
meta.style+='background-color: #FFF000;';
}
function redRenderer(value,meta,record){
meta.style+='background-color: #EE0000;';
}
</script>
</head>
<body>
<!-- 加入这个注释避免当body没有html内容时,在ie下出现空白行 -->
<nw:Bill templetVO="${templetVO}" headerGridImmediatelyLoad="true" isBuildHeaderGrid="true"
bodyGridsPagination="true,false" bodyGridsBufferView="true,false" headerGridCheckboxSelectionModel="true" headerGridSingleSelect="false" />
</body>
<script type="text/javascript">
//包括左树、表头、表体的档案
var itemTree = new uft.extend.tree.Tree({
id : 'itemTree',
treeRootNodeText:'产品分类', //默认根节点名称
rootVisible : true,//是否显示根节点
dataUrl : 'getItemTree.json', //默认数据来源
isTreeFilter:true//是否在树的工具栏加上过滤框
});
${moduleName}.appUiConfig.leftTree=itemTree;
${moduleName}.appUiConfig.treePkField='pk_category';
//扩展表头的工具栏,如果是单据页面,那么这里继承uft.jf.BillToolbar
MyToolbar = Ext.extend(uft.jf.ToftToolbar, {
getBtnArray : function(){
var btns = new Array();
btns.push(this.btn_query);
btns.push(this.btn_add);
btns.push(this.btn_copy);
btns.push(this.btn_edit);
btns.push(this.btn_save);
btns.push(this.btn_can);
btns.push(this.btn_del);
btns.push(this.btn_ref);
btns.push(this.btn_list);
btns.push(this.btn_card);
btns.push(this.btn_prev);
btns.push(this.btn_next);
btns.push(this.btn_filemanage);
btns.push(this.btn_filemanage_pic);
btns.push(this.btn_print);
btns.push(this.btn_export);
return btns;
}
});
//扩展表体的工具栏
MyBodyAssistToolbar = Ext.extend(uft.jf.BodyAssistToolbar,{
btn_row_add_handler : function(){
MyBodyAssistToolbar.superclass.btn_row_add_handler.call(this);
//点击增行时,默认增加100行
var grid = this.getActiveBodyGrid(),datas = [];
for(var i=0;i<100;i++){
var rowDefaultValues = this.getRowDefaultValues(grid.id);
datas.push(rowDefaultValues);
}
grid.addRow(datas);
grid.getStore().totalLength=grid.getStore().getTotalCount()+100;
grid.updateInfo();
}
});
${moduleName}.appUiConfig.bodyAssistToolbar=new MyBodyAssistToolbar();
${moduleName}.appUiConfig.toolbar = new MyToolbar();
//如果是单据页面,那么这里是
// var app = new uft.jf.BillPanel(${moduleName}.appUiConfig);
var app = new uft.jf.ToftPanel(${moduleName}.appUiConfig);
/**
* 表头编辑后事件
*
*@param field 编辑的组件对象
*@param value 编辑后的值
*@param oriValue 编辑前的值
*/
function afterEditHead(field,value,oriValue){
if(field.id = 'vbillno'){
//uft.Utils.setColumnHidden('demo_product_detail',{'productprice':true});
}
}
/**
*表体编辑后事件
*@param e 事件对象,通过这个参数可以得到以下值:
*var record=e.record; 当前编辑的行对象
var row = e.row; 当前编辑的行号
var grid = e.grid; 当前编辑的表格
var column = grid.originalColumns[e.column];//当前编辑的列对象
var fieldName=e.field; 当前编辑的列的名称
var value=e.value; 当前编辑的单元格编辑后的值
var originalValue=e.originalValue; 当前编辑的单元格编辑前的值
*/
function afterEditBody(e){
if(e.field == 'categoryname'){
//uft.Utils.setColumnHidden('demo_product_detail',{'productprice':true});
}else if(e.field =='productprice'){
var grid = Ext.getCmp('demo_product_detail');
var editor = uft.Utils.getColumnEditor(grid,'vmemo');//vmemo列是一个下拉组件
editor.addExtendParams({p:1});
}
}
/**
*表体编辑前事件
*@param e 事件对象,通过这个参数可以得到以下值:
*var record=e.record; 当前编辑的行对象
var row = e.row; 当前编辑的行号
var grid = e.grid; 当前编辑的表格
var column = grid.originalColumns[e.column];//当前编辑的列对象
var fieldName=e.field; 当前编辑的列的名称
var value=e.value; 当前编辑的单元格编辑后的值
var originalValue=e.originalValue; 当前编辑的单元格编辑前的值
*/
function beforeEditBody(e){
//有时候要根据权限去确定用户能不能编辑该单元格,如果不让用户编辑,那么这个方法要返回false
}
</script>
<%@ include file="/common/footer.jsp"%>
</html>
具体的示例可以参考:http://xuqc.fangwei.name:9080/demo-webapp administrator/143305