S2JH 2.1.1 发布,基于SSH的企业Web应用开发框架

来源:投稿
作者: EntDIY
2014年07月07日

S2JH:基于SSH的企业Web应用开发框架。集结最新主流时尚开源技术的面向企业级Web应用的基础开发框架,提供一个J2EE相关主流开源技术架构整合及一些企业应用基础通用功能和组件的设计实现的最佳实践和原型参考。

在线演示地址:http://115.29.107.110/s2jh 特别说明:此演示应用部署在CPU单核512M内存1M带宽低配云服务器,并且第一次访问会初始化加载大量JS/CSS等静态资源文件,响应会比较慢需要耐心等待。有兴趣的朋友可参考 http://git.oschina.net/xautlx/s2jh/wikis/ExecutableWAR 在本机一键部署运行。目前部署应用没有做任何特殊演示控制,请各位访问手下留情不要做菜单/配置/权限等相关数据变更操作,以免影响他人正常访问系统。

主要变更如下:

项目详情请移步:http://www.oschina.net/p/s2jh

---------------------------------华丽的分隔线--------------------------

除了基本的增删改查数据访问,对于企业应用系统还有一种很常见的分组聚合统计,例如需要把明细库存信息按照库存地/商品,销售单明细按照商品毛利/订单毛利/销售员利润等不同维度进行分组汇总统计显示。

一般情况此类非常规CURD数据访问,首先会想到采用JQL/HQL或Native SQL形式编写自由而复杂连表风组聚合统计,但是一个此种方式一个比较繁琐的问题就是不便于以简单统一的方式处理动态参数的组装,还有排序分页之类的特性支持,以及返回集合数据的组装。

为了简化此类需求的开发,框架做了一个基于JPA Criteria的进一步封装,开发层面只需Web层简单传入需要分组和聚合规则(典型的加减乘除以及case when和as语法支持等)的属性列表,即可返回与之对应便于用于JSON序列化的Map结构数据,最方便的是即便是聚合属性也能像常规的对象属性查询一 样支持动态参数/分页/排序等特性。

库存分组聚合统计

query-sum

  • Controller代码示例:

     @MetaData(value = "按库存地汇总库存量") public HttpHeaders findByGroupStorageLocation() { setModel(findByGroupAggregate("commodity.id", "commodity.sku", "commodity.barcode", "commodity.title", "storageLocation.id", "sum(curStockQuantity)", "sum(salingTotalQuantity)", "sum(purchasingTotalQuantity)", "sum(stockThresholdQuantity)", "sum(availableQuantity) as sumAvailableQuantity")); return buildDefaultHttpHeaders(); } @MetaData(value = "按商品汇总库存量") public HttpHeaders findByGroupCommodity() { setModel(findByGroupAggregate("commodity.id", "commodity.sku", "commodity.barcode", "commodity.title", "sum(curStockQuantity)", "sum(salingTotalQuantity)", "sum(purchasingTotalQuantity)", "sum(stockThresholdQuantity)", "sum(availableQuantity)")); return buildDefaultHttpHeaders(); } 
  • JSP/JS(部分)代码示例:

        url : WEB_ROOT + '/biz/stock/commodity-stock!findByGroupStorageLocation', colModel : [ { label : '商品主键', name : 'commodity.id', hidden : true, hidedlg : true, editable : true }, { label : '商品编码', name : 'commodity.sku', width : 80, align : 'center' }, { label : '商品名称', name : 'commodity.title', width : 200, align : 'left' }, { label : '库存地', name : 'storageLocation.id', width : 150, stype : 'select', editoptions : { updatable : false, value : Biz.getStockDatas() } }, { label : '当前库存量', name : 'sum(curStockQuantity)', width : 60, editable : true, formatter : 'number' }, { label : '销售锁定库存', name : 'sum(salingTotalQuantity)', width : 60, editable : true, formatter : 'number' } 

销售分组聚合统计

query-sum

  • Controller代码示例:

    @MetaData(value = "销售商品毛利统计", comments = "由于可能出现完全赠品类型的0销售额订单,需要引入case when判断处理否则会出现除零错误") public HttpHeaders findByGroupCommodity() { setModel(findByGroupAggregate("commodity.id", "commodity.sku", "commodity.title", "max(case(equal(amount,0),-1,quot(diff(amount,costAmount),amount))) as maxProfitRate", "min(case(equal(amount,0),-1,quot(diff(amount,costAmount),amount))) as minProfitRate", "sum(diff(amount,costAmount)) as sumProfitAmount", "sum(amount)", "sum(quantity)", "case(equal(sum(amount),0),-1,quot(sum(diff(amount,costAmount)),sum(amount))) as avgProfitRate")); return buildDefaultHttpHeaders(); } 
  • JSP/JS(部分)代码示例:

    url : WEB_ROOT + "/biz/sale/sale-delivery-detail!findByGroupCommodity", colModel : [ { name : 'commodity.id', hidden : true, hidedlg : true }, { label : '商品编码', name : 'commodity.sku', width : 50, align : 'center' }, { label : '商品名称', name : 'commodity.title', width : 200, align : 'left' }, { label : '最低毛利率', name : 'minProfitRate', width : 40, formatter : 'percentage' }, { label : '最高毛利率', name : 'maxProfitRate', width : 40, formatter : 'percentage' }, { label : '平均毛利率', name : 'avgProfitRate', width : 50, formatter : 'percentage' }, { label : '总计销售数量', name : 'sum(quantity)', width : 50, formatter : 'number' }, { label : '总计销售金额', name : 'sum(amount)', width : 50, formatter : 'currency' }, { label : '总计毛利金额', name : 'sumProfitAmount', width : 50, formatter : 'currency' } ] 

主要接口实现定义

     /**
    * 分组聚合统计,常用于类似按账期时间段统计商品销售利润,按会计科目总帐统计等
    *
    * @param groupFilter 过滤参数对象
    * @param pageable 分页排序参数对象,TODO:目前有个限制未实现总记录数处理,直接返回一个固定大数字
    * @param properties 属性集合,判断规则:属性名称包含"("则标识为聚合属性,其余为分组属性
    * 属性语法规则:sum = + , diff = - , prod = * , quot = / , case(condition,when,else)
    * 示例:
    *     sum(amount)
    *     sum(diff(amount,costAmount))
    *     min(case(equal(amount,0),-1,quot(diff(amount,costAmount),amount)))
    *     case(equal(sum(amount),0),-1,quot(sum(diff(amount,costAmount)),sum(amount)))
    * @return Map结构的集合分页对象
    */ public Page<Map<String, Object>> findByGroupAggregate(GroupPropertyFilter groupFilter, Pageable pageable, String... properties)


展开阅读全文
48 收藏
分享
加载中
最新评论 (17)

引用来自“xl890727”的评论

lz,演示的站点是取消了么?
是啊,想看看都打不开
2015-04-01 10:51
0
回复
举报
lz,演示的站点是取消了么?
2015-03-17 17:50
0
回复
举报

引用来自“weir2008”的评论

我一直不知带怎么跑起来这个项目?

引用来自“S2JH”的评论

demo?开发?
http://git.oschina.net/xautlx/s2jh/wikis/ExecutableWAR
http://git.oschina.net/xautlx/s2jh/wikis/DevCfg

引用来自“weir2008”的评论

有时间 看看
这工程也太分散了
2014-07-24 17:59
0
回复
举报

引用来自“sunday12345”的评论

谁能告诉我什么是「企业开发」 ~~~

大家伙儿都是独立开发者,独立做项目?
当然不是独立的,企业项目肯定需要一个规模不小的团队。只是当你做了一个产品或项目的技术负责人的职责时,就需要类似这样一套框架来确保按质量和按进度推进项目。
2014-07-08 09:23
0
回复
举报

引用来自“weir2008”的评论

我一直不知带怎么跑起来这个项目?

引用来自“S2JH”的评论

demo?开发?
http://git.oschina.net/xautlx/s2jh/wikis/ExecutableWAR
http://git.oschina.net/xautlx/s2jh/wikis/DevCfg
有时间 看看
2014-07-07 23:28
0
回复
举报
谁能告诉我什么是「企业开发」 ~~~

大家伙儿都是独立开发者,独立做项目?
2014-07-07 21:01
0
回复
举报

引用来自“weir2008”的评论

我一直不知带怎么跑起来这个项目?
demo?开发?
http://git.oschina.net/xautlx/s2jh/wikis/ExecutableWAR
http://git.oschina.net/xautlx/s2jh/wikis/DevCfg
2014-07-07 17:05
0
回复
举报

引用来自“LiangXC”的评论

只对火狐做了兼容?阿姨和谷歌显示有些不大正常

引用来自“S2JH”的评论

主要在firefox下开发,其他浏览器的最新版本基本能显示,不过没有全面测试过。不过对于企业应用,对于浏览器的兼容不做太多奢求。
啊~~倒是没啥问题,出于习惯……我们一般会做火狐和IE 9以上~~
2014-07-07 15:48
0
回复
举报
更多评论
17 评论
48 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部