在公司demo项目实习中,我有一个功能是展示所有支出明细后,在下面添加一行合计,计算所有支出明细之和。
首先我想到的是用easyui里datagrid有一个属性showFooter,就是添加尾行,无论在页面添加多少条数据,合计行都会位于所有记录的最下方,而且比较美观。于是我在我的代码中添加了showFooter:true的属性,如下:
',idField:'uuid',columns:[[
{ field: 'ck', checkbox: true },
{ title: 'uuid', field: 'uuid', width: 100,hidden:true},
{ title: '员工名称', field: 'empName', width: 100},
{ title: '支出金额', field: 'payMoney', width: 150 },
{ title: '支出时间', field: 'payDate', width: 150,formatter:function(value,row,index){
return myFunction(row.payDate);
}},
{ title: '创建时间', field: 'createTime', width: 300},
{ title: '修改时间', field: 'editTime', width: 300},
{ title: '创建者', field: 'creater', width: 300}
]],showFooter:true,footer:[{'empName':'合计','payMoney':600.0}] }">
这是模仿easyui官网的demo写的。官网demo的数据来源和我的不太相似,如果有兴趣,大家可以了解一下官网的。 easyui官网footer-demo
官网的demo中,引入了footer,如下:
Item ID
Product ID
List Price
Unit Cost
Attribute
Status
引入的json中,有三个属性:total,rows,footer。我理解的是,total是返回前台的记录数,rows是返回的数据,footer是你要添加的尾行。如下:
{"total":28,"rows":[
{"productid":"FI-SW-01","unitcost":10.00,"status":"P","listprice":36.50,"attr1":"Large","itemid":"EST-1"},
{"productid":"K9-DL-01","unitcost":12.00,"status":"P","listprice":18.50,"attr1":"Spotted Adult Female","itemid":"EST-10"},
{"productid":"RP-SN-01","unitcost":12.00,"status":"P","listprice":28.50,"attr1":"Venomless","itemid":"EST-11"},
{"productid":"RP-SN-01","unitcost":12.00,"status":"P","listprice":26.50,"attr1":"Rattleless","itemid":"EST-12"},
{"productid":"RP-LI-02","unitcost":12.00,"status":"P","listprice":35.50,"attr1":"Green Adult","itemid":"EST-13"},
{"productid":"FL-DSH-01","unitcost":12.00,"status":"P","listprice":158.50,"attr1":"Tailless","itemid":"EST-14"},
{"productid":"FL-DSH-01","unitcost":12.00,"status":"P","listprice":83.50,"attr1":"With tail","itemid":"EST-15"},
{"productid":"FL-DLH-02","unitcost":12.00,"status":"P","listprice":63.50,"attr1":"Adult Female","itemid":"EST-16"},
{"productid":"FL-DLH-02","unitcost":12.00,"status":"P","listprice":89.50,"attr1":"Adult Male","itemid":"EST-17"},
{"productid":"AV-CB-01","unitcost":92.00,"status":"P","listprice":63.50,"attr1":"Adult Male","itemid":"EST-18"}
],"footer":[
{"unitcost":19.80,"listprice":60.40,"productid":"Average:"},
{"unitcost":198.00,"listprice":604.00,"productid":"Total:"}
]}。
所以在设置后台返回前台的json格式的时候就要在json中添加footer属性,并设置自己的尾行栏。如下:
public static String listArrayToJson(List list) {
Map resultMap = new HashMap();
resultMap.put("total", list==null?0:list.size());
resultMap.put("rows", list==null?new ArrayList():list);
return JSONObject.fromObject(resultMap).toString();
}
需要在以上代码中加入footer属性。
然而后来发现,这样并不美观。同事说所谓尾行,是无论多少条记录,尾行都处于最下端。与我一开始想的效果并不相同。在经理的指点下,我换了个思路。
我在后台往前台json前,在service中,数据查询后,就插入一行记录,即一个特殊的对象,只有合计和金额两项。
如下:
DataReader qc=new DataReader("select a.uuid from WjPayDetail a "+getWhere(model)+orderBy);
if(StringHelper.isEmpty(page.getCountField())){
page.setCountField("uuid");
}
setWhere(model,qc);
page=qc.page(page);
List details=DataReader.idToObj(WjPayDetail.class,page.getResults());
double paySum=0;
for(WjPayDetail one:details){
paySum=paySum+one.getPayMoney();
}
WjPayDetail detail=new WjPayDetail();
detail.setPayMoney(paySum);
detail.setEmpName("合计金额");
details.add(detail);
page.setResults(details);
res=ModeFactory.getModeFactory().buildNewServiceResult(
IServiceResult.RESULT_OK,Messages.getString("systemMsg.success"),page);
红色的部分是我添加的,这样的话,添加的一行,不会存到数据库里,不会影响功能,也不会造成每查询一次,都在上次查询的基础上再添加一行的情况。
前台页面上显示的是,合计行貌似作为一条正常记录展示,貌似可以像其他记录一样修改删除。这种情况,只需要你在后台或者前台做一下判断,再提示用户不可修改或者删除就好了。
总之,我思考了两天的问题,终于在经理的指导下,算是解决了。