系统结构如图:
功能要求:
1.统计单位面积用电量
2.统计人均用电量
建筑表结构(region)
RegionId | Name | ParentId |
电表结构(device)
DeviceId | Name | ParentId | RegionId |
关于建筑的面积和人数的设定问题:
开始时候想如果建筑节点没有子节点则提示用户录入面积和人数,如果有子节点则不允许录入面积和人数,该节点的面积和人数通过其子节点的数据汇总。这样存在一个问题是用户在添加一个节点的时候需要指定该节点是否有子节点,这一点很不方便,同时如果子节点修改一个数据则其所有上级节点都要Update,还有就是父节点的面积和人数数据无法修改。
于是做成每个节点都要求用户录入面积和人数数据。数据的准确性未作校验(可能会出现父节点的面积比子节点的面积总和小的情况,这个需要用户在录入数据的时候注意)。
页面前端采用easyui的combotree设计。提示用户勾选需要统计的区域。
例如勾选了2楼和401房间,则统计的区域和电表应该如下
之前在combotree中勾选后是直接将所有勾选的区域节点传到后台处理
应该这样处理:
1.获取区域面积和人数
从前台传入勾选的最上级区域节点,如果combotree不提供相应方法则遍历取到的节点,如果其parent节点没有被选中则将其放到传入后台的节点队列
2.获取电表读数
a.先获取传入区域下所有电表
select * from Device where RegionId in (@Regions)--@Regions是处理过的前台传入的区域队列
b.选择那些ParentId不在集合里的电表
select * from 集合 where ParentId not in 集合
结合两点可以这样写
width td as ( select DeviceId from Device where RegionId in (@Regions) ) select * from td where ParentId not in td
然后与数据表关联查询出用电量,再做后续处理。
原文:http://www.cnblogs.com/ecosu/p/4371899.html