设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 软件追踪 查看内容

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

2014-7-8 17:07| 发布者: joejoe0332| 查看: 1911| 评论: 0|原作者: oschina|来自: oschina

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

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)

酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部