1. 整体解决方案概述

   1.1 权限整体解决方案概述

    权限设计主要有一下几大部分组成:
     PassPort:
    针对现在系统的分析,系统之间有部分信息是共享的,这部分信息将由中心话的Passport来统一维护

  • 用于中心存放用户,组织架构,渠道,品牌和产品相关的信息。
  • 有关员工信息,可以从现有HR系统或者MDM中取得。
  • 有关外部人员活动目录,可以专门在本PassPort系统中维护。

   权限订阅模块:
   负责订阅接受Passport发出的相关实体修改的信息。
   资源权限绑定:
   有效的将资源-角色-组-成员在
数据库中简历绑定。
   数据权限高速内存数据缓存:
   将数据权限相关的数据缓存在内存,提供高性能访问能力。
   Struts页面权限过滤和绑定:
   使用Struts的tag动态根据资源权限的设置,决定页面中资源(按钮,菜单,URL,页面元素)的访问能力。
   数据权限过滤:
    根据数据过滤权限的特定,定义的数据权限过滤的通用数据结构
    根据业务集成和整合的需要,和优先级别的需要,权限部分的开发设计将逐步推进,初期会以各应用系统为单元进行资源权限和数据权限的改造,随后将根据重要业务系统的需要,逐步建立中心话的passport。

 

  1.2 权限设计的原则

  • 通用的数据管理;
  • 通用Service;
  • 数据权限系统同构;
  • UI风格一致;
  • 安全的访问控制;
  • 可复用的API;
  • 统一的资源权限控制;
  • 统一和中心话的数据字典维护。

2. 资源权限解决方案

  2.1 概览

 (1)功能级授权采用通常的权限分组,角色绑定资源的通用设计思路来完成。基本设计思路如下图:

  

                                       资源权限绑定概览

    资源:
    菜单,按钮,URL,页面中的任何元素。
    角色:
    根据业务定义的各种角色,比如订单生成角色,结算角色等。
    组:
    用于联系角色和用户。
    用户:
    系统中登录的用户。

 

(2)资源权限在开发,测试,项目上线后维护中的不同作用:

   项目开发和测试阶段:

  • 项目开发人员和业务人员共同确定什么资源需要权限管理并在系统中定义资源。
  • 在页面当中定义控制资源访问的tag。
  • 根据业务模块的不同定义相应的增删改查的角色。
  • 绑定角色和资源。

   在项目上线之后和运维阶段:

  • 在需要的时候可以继续建立更多的角色,并绑定角色和已有的资源。
  • 建立用户组。
  • 绑定用户组和已有的角色。
  • 为用户组指定管理员,并授予管理员管理用户组的权限,用户组的管理员一般是业务人员的领导。
  • 用户组管理员根据本部门的需要和调整,来动态的增减用户组的成员。
  • 被加入用户组的成员立刻获得系统相应访问资源的访问和使用权限,无需修改代码。

 2.2 管理类型和普通类型

  分组和角色分别都有两种类型,一种是管理类型,一种是普通类型,以下做详细说明:

  • 分组管理类型,针对业务人员,拥有管理类型的分组则可以把其他人加入到该组里。
  • 分组普通类型,针对业务人员,拥有普通类型的分组只能自己使用分组里的角色和资源,不能授权给其他人。
  • 角色管理类型,针对管理人员,拥有管理类型的角色可以修改角色与资源的对应关系。
  • 角色普通类型,针对所有人,拥有普通类型的角色只能访问角色对应的资源而不能修改其关联关系。

   分组表设计(Group)

类型

说明

Id

Number(10)

Not null

PK

Name

Varchar2(128)

Not null

组名称

Admin

Boolean

Not null

是否为管理类型

3. 功能级授权基本设计

  功能级授权的意义在于对页面可见元素的操作性,单纯从页面的可见性可简单划分成如下几个部分:

  • 菜单,包括一级菜单和多级菜单,在系统中可分为顶部菜单,左侧菜单,左侧菜单子菜单。
  • 按钮(通常"取消"或"返回"之类的按钮不会纳入权限管理)。
  • 页面可见元素,比如表格、DIV标签等等,凡是页面可见的内容。

   以上三点其实都可以归结为第三点,即:任何页面可见的元素均可纳入功能级权限管理。
实现方法:采用自写JSP标签完成,执行该标签时需要从后台或缓存中查找当前用户是否有使用当前资源的权限,如果有则正常显示,如果没有则将标签内所有内容从服务端剔除后再响应客户端。如下图:

   

                                  资源权限流程

  3.1 标签实现的代码

[java] view plain copy

 print?

  1. publicclassAuthTagextendsStrutsBodyTagSupport{   
  2. private Set<String>authCodeSet;   
  3. publicvoidsetCode(String code) {   
  4. String[] codes = code.split(",");   
  5. authCodeSet = newHashSet<String>(Arrays.asList(codes));   
  6. }   
  7. publicintdoStartTag() throwsJspException {   
  8. HttpSessionhttpSession = pageContext.getSession();   
  9. Authentication authentication = (Authentication)httpSession.getAttribute(SessionSecurityConstants.KEY_AUTHENTICATION);   
  10. if(authentication == null){   
  11. returnSKIP_BODY;   
  12. }   
  13. if(hasAuth(authentication)){   
  14. returnEVAL_BODY_INCLUDE;   
  15. }   
  16. returnSKIP_BODY;   
  17. }   
  18. privatebooleanhasAuth(Authentication authentication){   
  19. for(String auth: authCodeSet){   
  20. if(authentication.getComponentResources().contains(auth)){   
  21. returntrue;   
  22. }   
  23. }   
  24. returnfalse;   
  25. }   
  26. }  

4.安全性设计

    页面元素的可见性并不能控制URL的可访问性,在系统设计中,使用Struts2的拦截器机制来过滤URL,防止用户不通过页面直接通过URL访问系统。
    系统资源的抽取设计。
    系统资源包含了以上提到的两个部分页面元素和URL,两种资源在某些时候是可组合的,比如按钮点击后提交URL,则该按钮与该URL可组成一个资源。
    页面元素可独立成为一个资源,而URL不能脱离页面元素独立成为资源。每个资源都有唯一的标标识。
    资源与资源之间也存在层级关系,比如下图:

            

 4.1 资源表设计

列名类型(长度) 可否空

说明

Key varchar2(256) not null

标识资源的唯一的代码

Name varchar2(256) not null

资源名称

Url varchar2(256) null

对应的URL

Parent_key varchar2(256) null

父资源代码

Desc varchar2(256) null

                       描述或备注信息

    Key值的设定建议采用会意的字符串,比如新增按钮资源属于第三级资源则它的代码应该为"sysres_duty_add".

 4.2 授权树状插件

     对资源的授权采用ZTree插件实现,效果见下图:
       

                                   对资源进行管理的树状插件

  4.3 插件使用方式:

   如何在struts中使用资源权限tag:

[html] view plain copy

 print?

  1. <%@ taglib prefix="hop" uri="/restree" %>   
  2. <res:treeurlres:treeurl="resTree.action"   
  3. expandUrl="expandResTree.action"   
  4. async="true"   
  5. chkType="check"   
  6. id="demoTree"/>  

5.数据权限方案

  5.1 业务关键字定义:

   

                  数据权限业务关键字定义

  
 

  5.2 设计思路和原则

  • 把与岗位关联的所有内容翻译位岗码.
  • 将岗码存储与人员及客户等表中.
  • 将所有关联表放入系统缓存.
  • 通过查询岗码在内存中完成对数据的操作.

    5.3 什么是岗码?

  

                         岗码大体结构

  
 

  5.4 岗码定义和阅读规则

  • 用表的主键做唯一标识码,用下划线"_"连接,岗码与岗码之间用分号分";"分隔.
  • 每个小段落的岗码第一位都设置为功能位,默认值位D.
  • 空位N.
  • 当功能为值位A的时候表示全部,详见下图:

    

                                        岗码的格式规则

     岗码格式如下:

     岗位ID_岗位类型(管理/业务)_岗位职位_工贸ID_渠道ID_经营体ID_产品线code_BUCode_品牌_型号经营体.
     注意:根据业务需要,岗码会不断的扩充,以存储更多用于分析查询的信息.

  5.5 岗码生成和岗码从数据库刷新至业务服务器

  

          岗码生成和岗码从数据库刷新至业务服务器

  
 

点实时更新策略所使用的脚本。
  实时更新策略
  对于更新相对较频繁的表(如人员表、岗位表),首先在该表上设立触发器,基于表做的所有修改将记录到历史表中,系统定时扫描历史表,发现改动则执行SQL脚本更新岗码,并更新缓存。这里的更新指单条记录的更新,非批量更新。

  • 下图中红色部分活动图表示任何系统对基础表改动时需要执行的内容。
  • 蓝色部分活动图可以采用两种方式实现
    • 从数据库层面执行定时任务,扫描历史表变动.
    • 从应用服务器发起定时任务,扫描历史表.
  • 橙色的部分活动图表示应用服务器执行过程。

  当蓝色部分使用应用服务的时候可以直接更新缓存,从而略过橙色部分活动图。
  历史表ecc_oms.sys.his

列名类型(长度) 可否空

说明

Id Number(12) not null PK

PK

Table_name varchar2(128) not null

表名

PK_Valuevarchar(512) not null

主键值如:123, 张三

PK_namevarchar(128) not null

主键字段如:empId, empName

Oper_type number(2) not null

操作类型:增:1、删:2、改:3

Create_time Date not null

创建时间

flag varchar2(1) not null

完成标记位: 0:未完成,1完成

  
 

 5.6 如何存储岗码:

 (1) 新增用户-岗位关系表和岗位-用户岗码关系表:ecc_oms.sys_emp_code
  Emp_id :用户ID
  Code_id:岗码ID-对应ecc_oms.ecc_oms.sys_code表主键
 (2) 岗位-客户岗码关系表:ecc_oms.ecc_oms.sys_cust_code
  Cust_code:客户code
  Code_id:岗码ID

 5.7 如何从数据库刷新岗码到应用服务器

  系统启动时,将所有岗码涉及到的表全部读取成JavaBean(不是持久化对象),放在缓存中。
   /**********资源相关**********/
   人员信息:  ecc_oms.sys_employee
   组织(部门信息)信息:  ecc_oms.sys_org
   职位信息:  ecc_oms.duty_title
   区域(工贸)基本信息-ecc_oms.sys_area_info
   所属产品线,产品系统的产品(型号)信息:ecc_fnd.product_v
   产品线信息:ecc_fnd.product_line_v
   大小渠道基本信息-ecc_fst.sales_channel_properties
   岗位基本信息:ecc_fst.station_config
   客户关系信息 -ecc_customer.customer_info_v
   BU信息表 -ecc_oms.sys_bu_info
   BU与产品线对应关系表 -ecc_fnd.bu_product_group_pl

   /*********授权相关*********/
   --组织经营体:  ecc_oms.SYS_ORG_SALECHANN
   --组织产品线:  ecc_oms.sys_org_prod
   --组织职位:  ecc_oms.org_duty_title
   岗码表:  ecc_oms.sys_station_config
   用户岗码表:  ecc_oms.sys_emp_code
   客户岗码表:  ecc_oms.sys_cust_code
   经营体与小渠道关系信息(按产品线): ecc_fst.sales_channel_manager_relation
   客户信息表-二级区域与客户关系表

   主要类列表和简单描述:

类/接口名

简介

核心接口描述

CacheServiceFacade

暴露给客户端远程调用的接口

1.根据用户id和岗位查询该用户的客户列表,返回结果集自动关联客户对应的产品线信息 
public Set<CustomerInfoC>findCustomerByEmpId(long empId,String station);

DefaultCacheServiceFacade

CacheServiceFacade的默认实现类,根据请求的岗位类型自动判断查找客户信息

  

CacheService

从缓存中读取数据的顶层接口,定义内存中数据的读取接口

1.根据用户id查找用户信息 
public Set<CustomerInfoC>findCustomerByEmpId(long id,String station);

AbstractCacheService

CacheService的抽象实现,读取客户数据的公共方法抽取在里面

  

CacheServiceA

AbstractCacheService的子类实现,为MD_XSJL下单 门店销售经理查找客户逻辑

  

CacheServiceB

AbstractCacheService的子类实现,BU代表下单

  

CacheService

AbstractCacheService的子类实现,查询权限信息实现

  

CacheLoader

缓存加载器

1.将指定表的数据加载到内存中 
public void initCache(Class<?>clazz,RowMapper<?>mapper,String[] properties); 
2.缓存加载完毕后获取缓存后的所有对象 
public TableCachegetTableCache();

DefaultCacheLoader

CacheLoader接口的实现类

  

TableOperation

对单表进行的操作接口,用户往操作历史里插入记录时单条更新/删除缓存操作

1.根据操作记录对缓存进行操作 
public void execute(OperationContextoperationContext);

AbstractTableOperation

TableOperation的抽象实现,定义公共操作方法

  

BasGCustomerInfoTableOperation 
StationConfigTableOperation 
StationCustomerRelationTableOperation 
StationCustomerRelationTableOperation 
StationEmployeeRelationTableOperation

AbstractTableOperation类的子类,表示 
对指定的表进行增/删/改动作时的响应操作

  

ReloadTableCacheJob

定时任务,重新载入主数据表到缓存,每小时执行一次

  

UpdateCacheJob

根据操作历史记录,对缓存中的数据进行单条更新,每15分钟执行一次

  

UpdateCodeJob

定时任务,定期扫描岗码历史表ecc_oms.sys_his,调用存储过程,触发更新岗码操作,每10分钟执行一次

  

 
 

5.8 如何使用数据权限接口,调用简单示例

    在客户端调用的应用中定义一个springbean,如下:

[html] view plain copy

 print?

  1. <beanidbeanid="cacheServiceFacade"class="org.springframework.remoting.caucho.HessianProxyFactoryBean">  
  2. <propertynamepropertyname="serviceUrl"value="http://127.0.0.1:8011/authentication/remoting/cacheServiceFacade"/><!--这个是服务器端暴露的远程访问地址-->  
  3. <propertynamepropertyname="serviceInterface"value="com.ouc.oms.authentication.cache.manager.CacheServiceFacade"/><!--这个是远程调用接口声明 -->  
  4. </bean>  

  Java代码调用:

[html] view plain copy

 print?

  1. CacheServiceFacadecacheServiceFacade =applicationContext.getBean("cacheServiceFacade",CacheServiceFacade.class);  
  2. Set<CustomerInfoC>customerInfos =cacheServiceFacade.findCustomerByEmpId(11712L,"PR");  
  3. //something else  

5.9 如何添加新数据权限接口

    将需要客户端调用的接口方法添加在CacheServiceFacade类中,并编写实现类。

5.10 部分数据权限接口的含义:

    客户端调用根据实际情况可进行调整,以下给出样例

[html] view plain copy

 print?

  1. publicinterfaceCacheService {   
  2.   
     
  3. /**   
  4. * 根据人员ID查找客户   
  5. */   
  6. public List<Integer>findCustomerByEmpId(int id);   
  7. 一、PR下单   
  8. 1.根据人员ID查找岗位ID   
  9. select ser.fst_submit_station_id – 岗ID   
  10. From ecc_fst.station_employee_relationser – 岗人关系表   
  11. where ser.employee_id = 46 – 登陆人员ID   
  12. and ser.enable_flag = 'T' – 有效标识   
  13. and ser.delete_flag = 'F' – 删除标识   
  14.   
     
  15. 2.根据岗ID查到PR岗   
  16. selectsc.fst_submit_station_id, -- 岗位ID   
  17. sc.fst_submit_station_code, -- 岗位编码   
  18. sc.fst_submit_station_name, -- 岗位名称   
  19. sc.product_line_id, -- 产品线ID   
  20. sc.product_series_code-- 产品组(与产品线ID互斥,两个列只有一个值有效,若产品组有效要根据该编码转换成产品线ecc_fnd.bu_product_group_pl)   
  21. Fromecc_fst.station_configsc-- 岗位信息表   
  22. wheresc.fst_submit_station_idin (92172, 91239, 91241) -- 岗位ID   
  23. andsc.fst_role_lookup_code = 'PR'-- 业务类型   
  24. andsc.enable_flag = 'T'-- 有效标识   
  25. andsc.delete_flag = 'F'-- 删除标识   
  26.   
     
  27. 3.根据岗ID查找每个岗所属的客户   
  28. select scr.fst_submit_station_id, – 岗ID   
  29. scr.customer_id – 客户ID(Number列,有科学计数法的主键)   
  30. From ecc_fst.station_customer_relationscr   
  31. where scr.fst_submit_station_id in (92172, 91239, 91241) – 岗位ID   
  32. and scr.enable_flag = 'T' – 有效标识   
  33. and scr.delete_flag = 'F' – 删除标识   
  34.   
     
  35. 4.根据客户ID查找客户属性   
  36. selectciv.customer_code, -- 客户编码   
  37. civ.customer_name, -- 客户名称   
  38. civ.customer_flag, -- 客户类型 SX:伞下 HS:海伞 NULL:正常客户   
  39. civ.first_region_code,-- 市场经营体编码   
  40. civ.dqd_code, -- 大渠道编码   
  41. civ.xqd_code-- 小渠道编码   
  42. fromecc_customer.customer_info_vciv-- 客户信息表   
  43. whereciv.customer_idin (20090507033457) -- 客户ID   
  44.   
     
  45.   
     
  46. 一、门店销售经理(MD_XSJL)下单   
  47. 1.根据人员ID查找岗位ID   
  48. select ser.fst_submit_station_id – 岗ID   
  49. From ecc_fst.station_employee_relationser – 岗人关系表   
  50. where ser.employee_id = 6946 – 登陆人员ID   
  51. and ser.enable_flag = 'T' – 有效标识   
  52. and ser.delete_flag = 'F' – 删除标识   
  53.   
     
  54. 2.根据岗ID查到PR岗   
  55. selectsc.fst_submit_station_id, -- 岗位ID   
  56. sc.fst_submit_station_code, -- 岗位编码   
  57. sc.fst_submit_station_name, -- 岗位名称   
  58. sc.product_line_id, - 产品线ID-   
  59. sc.product_series_code-- 产品组   
  60. Fromecc_fst.station_configsc-- 岗位信息表   
  61. wheresc.fst_submit_station_idin (92172, 91239, 91241) -- 岗位ID   
  62. andsc.fst_role_lookup_code = 'MD_XSJL'-- 业务类型   
  63. andsc.enable_flag = 'T'-- 有效标识   
  64. andsc.delete_flag = 'F'-- 删除标识   
  65.   
     
  66. 3.根据岗ID查找每个岗所属的客户   
  67. select scr.fst_submit_station_id, – 岗ID   
  68. scr.customer_id – 客户ID(Number列,有科学计数法的主键)   
  69. From ecc_fst.station_customer_relationscr   
  70. where scr.fst_submit_station_id in (92172, 91239, 91241) – 岗位ID   
  71. and scr.enable_flag = 'T' – 有效标识   
  72. and scr.delete_flag = 'F' – 删除标识   
  73.   
     
  74. 4.根据客户ID查找客户属性   
  75. selectciv.customer_code, -- 客户编码   
  76. civ.customer_name, -- 客户名称   
  77. civ.customer_flag, -- 客户类型 SX:伞下 HS:海伞 NULL:正常客户   
  78. civ.first_region_code,-- 市场经营体编码   
  79. civ.dqd_code, -- 大渠道编码   
  80. civ.xqd_code-- 小渠道编码   
  81. fromecc_customer.customer_info_vciv-- 客户信息表   
  82. whereciv.customer_idin (20090507033457) -- 客户ID   
  83.   
     
  84.   
     
  85. 一、 BU代表下单(BU_WGG_1,BU_WGG_2,BU_ACG,BU_DPG,BU_LE,BU_LF)下单   
  86. 1.根据人员ID查找岗位ID   
  87. select ser.fst_submit_station_id – 岗ID   
  88. From ecc_fst.station_employee_relationser – 岗人关系表   
  89. where ser.employee_id = 6946 – 登陆人员ID   
  90. and ser.enable_flag = 'T' – 有效标识   
  91. and ser.delete_flag = 'F' – 删除标识   
  92.   
     
  93. 2.根据岗ID查到PR岗   
  94. selectsc.fst_submit_station_id, -- 岗位ID   
  95. sc.fst_submit_station_code, -- 岗位编码   
  96. sc.fst_submit_station_name, -- 岗位名称   
  97. sc.product_line_id, - 产品线ID-   
  98. sc.product_series_code – 产品组   
  99. Fromecc_fst.station_configsc-- 岗位信息表   
  100. wheresc.fst_submit_station_idin (92172, 91239, 91241) -- 岗位ID   
  101. andsc.fst_role_lookup_codein (BU_WGG_1,BU_WGG_2,BU_ACG,BU_DPG,BU_LE,BU_LF)-- 业务类型   
  102. andsc.product_line_id = 777   
  103. andsc.enable_flag = 'T'-- 有效标识   
  104. andsc.delete_flag = 'F'-- 删除标识   
  105.   
     
  106. 3.根据岗ID查找每个岗所属的品牌   
  107. selectscp.pro_value, -- 品牌标识   
  108. scp.pro_remark-- 品牌名称   
  109. fromecc_fst.station_config_propertyscp   
  110. wherescp.fst_submit_station_id = 92349   
  111. andscp.delete_flag = '0'   
  112.   
     
  113. 4.根据岗位ID查找二级区域(网格)   
  114. selectst.sale_area_code, -- 区域编码   
  115. st.sale_area_name-- 区域名称   
  116. Fromecc_fnd.sale_area_station_infost-- 岗区关系表   
  117. wherest.station_config_id = 92349-- 岗位ID   
  118. andst.product_line_id = 777-- 产品线ID 1169用777代表   
  119. andst.enable_flag = 'T'   
  120. andst.delete_flag = 'F'   
  121. 5.根据区域编码查找区域信息   
  122. selectmkt.area_code, -- 区域编码   
  123. mkt.area_name, -- 区域名称   
  124. mkt.mkt_lookup_type-- 市场级别 S:社区店 T:专卖店   
  125. Fromecc_fnd.mkt_area_infomkt-- 区域信息表   
  126. wheremkt.area_code = 'CMI35899'-- 区域编码   
  127. andmkt.enable_flag = 'T'   
  128. andmkt.product_line_id = 777-- 产品线ID   
  129.   
     
  130.   
     
  131. 下接...   
  132.   
     
  133.   
     
  134. 6.根据区域编码查颗粒度   
  135. selectsur.small_unit_id, -- 颗粒度ID   
  136. sur.small_unit_code-- 颗粒度编码   
  137. Fromecc_fnd.sale_area_unit_relationsur-- 区域与颗粒度关系表   
  138. wheresur.area_code = 'CMI00069'-- 区域编码   
  139. andsur.product_line_id = 777-- 产品线ID 1169用777代表   
  140. andsur.enable_flag = 'T'   
  141. andsur.delete_flag = 'F'   
  142.   
     
  143. 7.根据颗粒度查客户   
  144. selectciv.customer_code, -- 客户编码   
  145. civ.customer_name, -- 客户名称   
  146. civ.customer_flag, -- 客户类型 SX:伞下 HS:海伞 NULL:正常客户   
  147. civ.first_region_code,-- 市场经营体编码   
  148. civ.dqd_code, -- 大渠道编码   
  149. civ.xqd_code-- 小渠道编码   
  150. fromecc_customer.customer_info_vciv-- 客户信息表   
  151. whereciv.area_code = 'KLD2009000326'   
  152.   
     
  153.   
     
  154. /**   
  155. * 根据人员ID查找产品线   
  156. */   
  157. public List<ProdC>findProdByEmpId(int id);   
  158. 1.根据人员ID查找岗位ID   
  159. select ser.fst_submit_station_id – 岗ID   
  160. From ecc_fst.station_employee_relationser – 岗人关系表   
  161. where ser.employee_id = 6946 – 登陆人员ID   
  162. and ser.enable_flag = 'T' – 有效标识   
  163. and ser.delete_flag = 'F' – 删除标识   
  164.   
     
  165. 2.根据岗ID查到PR岗   
  166. selectsc.fst_submit_station_id, -- 岗位ID   
  167. sc.fst_submit_station_code, -- 岗位编码   
  168. sc.fst_submit_station_name, -- 岗位名称   
  169. sc.product_line_id, -- 产品线ID   
  170. sc.product_series_code-- 产品组(与产品线ID互斥,两个列只有一个值有效,若产品组有效要根据该编码转换成产品线ecc_fnd.bu_product_group_pl)   
  171. Fromecc_fst.station_configsc-- 岗位信息表   
  172. wheresc.fst_submit_station_idin (92172, 91239, 91241) -- 岗位ID   
  173. andsc.fst_role_lookup_code = 'PR'-- 业务类型   
  174. andsc.enable_flag = 'T'-- 有效标识   
  175. andsc.delete_flag = 'F'-- 删除标识   
  176.   
     
  177. 若产品组有效要根据该编码转换成产品线   
  178. selectp.product_code, -- 产品线编码   
  179. p.product_id, -- 产品线ID   
  180. p.product_name, -- 产品线名称   
  181. p.group_code-- BU编码   
  182. Fromecc_fnd.bu_product_group_plp-- 产品BU对照表   
  183. wherep.group_code = 'WGG01'-- BU编码   
  184. 2.2.若产品线不为空   
  185. selectplv.PRODUCT_ID, -- 产品ID   
  186. plv.PRODUCT_CODE, -- 产品编码   
  187. plv.PRODUCT_LINE_NAME-- 产品名称   
  188. Fromecc_fnd.product_line_vplv-- 产品线表   
  189. whereplv.PRODUCT_ID = 100000-- 产品线ID   
  190. 2.3.BU代表下单的场合BU_WGG_1,BU_WGG_2,BU_ACG,BU_DPG,BU_LE,BU_LF   
  191. selectb.product_id, -- 产品线ID   
  192. b.product_code, -- 产品线编码   
  193. b.product_name-- 产品线名称   
  194. Fromecc_fnd.bu_product_groupb-- BU与产品线关系表   
  195. whereb.group_code = 'BU_WGG_1'-- BU编码   

[html] view plain copy

 print?

  1. /**   
  2. * 根据人员ID查找经营体   
  3. */   
  4. public List<SalechannC>findScalByEmpId(int id);   
  5. 1.根据人员ID查经营体ID   
  6. selectom.sale_manager_id, -- 经营体ID   
  7. om.sale_manager_code-- 经营体编码   
  8. FromECC_OMS.SYS_EMP_SALECHANNOM-- 人员经营体关系表   
  9. whereom.emp_id = 49485-- 人员ID   
  10. andom.enable_flag = 'T'   
  11. andom.delete_flag = 'F'   
  12. 2.根据经营体ID或编码查经营体名称   
  13. select cm.sales_chan_manager_code, – 经营体编码   
  14. cm.sales_chan_manager_name – 经营体名称   
  15. from ECC_FST.SALES_CHANNEL_MANAGER CM – 经营体信息表   
  16. where(cm.sales_chann_manager_id = 1 – 经营体ID   
  17. or cm.sales_chan_manager_code = '1001')-- 经营体编码   
  18. andcm.enable_flag = 'T'   
  19. andcm.delete_flag = 'F';   
  20. /**   
  21. * 根据人员ID查找渠道   
  22. */   
  23. public List<ChannelC>findChannelByEmpId(int id);   
  24.   
     
  25. /**   
  26. * 根据人员ID查找工贸   
  27. */   
  28. public List<AreaC>findAreaByEmpId(int id);   
  29. 1.根据人员ID查工贸ID或编码   
  30. selectam.area_id, -- 工贸ID   
  31. am.area_code-- 工贸编码   
  32. FromECC_OMS.SYS_EMP_AREAAM-- 人区关系表   
  33. wheream.emp_id = 3549-- 人员ID   
  34. andam.enable_flag = 'T'   
  35. andam.delete_flag = 'F'   
  36.   
     
  37. 2.根据工贸ID或编码查名称(有两个表)   
  38. selecta.area_code, -- 工贸编码   
  39. a.area_name-- 工贸名称   
  40. fromECC_OMS.SYS_AREA_INFOa-- 工贸信息表   
  41. where (a.area_id = 519-- 工贸ID   
  42. ora.area_code = '12C01') -- 工贸编码   
  43. anda.enable_flag = 'T'   
  44. anda.delete_flag = 'F'   
  45.   
     
  46.   
     
  47. selectmkt.area_code, -- 工贸编码   
  48. mkt.area_name-- 工贸名称   
  49. fromecc_fnd.mkt_area_infomkt-- 区域信息表   
  50. wheremkt.area_code = '12C01'-- 工贸编码   
  51. andmkt.enable_flag = 'T'   
  52. /**   
  53. * 根据人员ID查找产品线   
  54. */   
  55. public List<CustomerC>findCustByEmpId(int id);   
  56. 1.根据人员查产品线ID和编码   
  57. select sep.prod_id, – 产品线ID   
  58. sep.prod_code – 产品线编码   
  59. from ecc_oms.sys_emp_prodsep – 人员产品线关系表   
  60. where sep.emp_id = 11433 – 人员ID   
  61. andsep.enable_flag = 'T'   
  62. andsep.delete_flag = 'F'   
  63. 2.根据产品线ID或产品线编码查名称   
  64. selectplv.PRODUCT_CODE, -- 产品线编码   
  65. plv.PRODUCT_LINE_NAME-- 产品线名称   
  66. Fromecc_fnd.product_line_vplv-- 产品线信息表   
  67. where (plv.PRODUCT_ID = 100000-- 产品线ID   
  68. orplv.PRODUCT_CODE = 'AA') -- 产品线编码   
  69. /**   
  70. * 根据客户ID查找人员   
  71. */   
  72. public List<Integer>findEmpByCustId(int id);   
  73. 根据findCustomerByEmpId反向查   
  74.   
     
  75. }  

基于SSM框架的通用权限框架设计的更多相关文章

  1. 看过《大湿教我写.net通用权限框架(1)之菜单导航篇》之后发生的事(续)——主界面

    引言 在UML系列学习中的小插曲:看过<大湿教我写.net通用权限框架(1)之菜单导航篇>之后发生的事 在上篇中只拿登录界面练练手,不把主界面抠出来,实在难受,严重的强迫症啊.之前一直在总 ...

  2. .net通用权限框架B/S(一)

    一直做软件实施,用过一些二次开发平台,最近看了一些大神写的框架,于是参考写了一个B/S通用权限框架,项目使用MVC4+EF5+EASYUI(.net framework4),开发环境vs2010+sq ...

  3. .net通用权限框架C/S概览

    通用权限框架cs部分 先概述一下,cs使用vs2010+sql2008 和bs公用同一个数据库 为使界面好看使用了第三方控件 donetbar和devexpress,正版是要收费的,但是你们都明白的可 ...

  4. .net通用权限框架B/S (五)--WEB(3)组织机构

    .net通用权限框架B/S 首先我们看导航菜单中,对组织机构的设置 我们设置了组织机构名称,链接(对应的mvc控制器名/orga),图标是个小钥匙,菜单的操作权限设置的是"添加,编辑,删除& ...

  5. .net通用权限框架B/S (五)--WEB(2)登录

    .net通用权限框架 登录成功将 1.登录用户id保存到session 2.保存权限到Dictionary<int,string>,然后将该对象保存到session中,以便后续页面使用 D ...

  6. .net通用权限框架B/S (五)--WEB(1)首页

    通用权限框架--web 首页 1.首页截图 2.首页views 布局分为三部分top,left,main 引入easyui和jquery的js以及相关的css 使用easyui进行布局,分区代码bod ...

  7. 基于WebForm和Bootstrap的权限框架解决方案 一.PQGRID的使用

    天天打游戏也不是个事,就写一套权限框架吧,我的要求是即漂亮美观大方上档次,又要实用易用接地气. 按理来说应该先设计数据库在来秀的,但是人生就是这么随意,先搭个框子吧, 这一篇的重点是pqgrid的介绍 ...

  8. Winfrom devexpress 通用权限框架

    毕业到现在也快两年了,手上的项目也有好几个,但总感觉不是狠理想,近来把手上杂七杂八的项目整理了一下,结合各个项目的优点,重新开发了一套winfrom+devexpress 通用权限(CS)框架(BS版 ...

  9. 基于SSM + Redis的Shiro权限管理项目

    概述 本教程结合SSM(SpringMVC + Mybatis)框架讲解Shiro,讲解的内容有自定义shiro拦截器,Shiro Freemarker标签,Shiro JSP标签,权限控制讲解. 详 ...

随机推荐

  1. [转帖]使用TOAD优化复杂SQL

    独家秘笈!看下如何一键优化Oracle数据库复杂sql,DBA必备 https://www.toutiao.com/i6741208493644055053/ 原来toad 还有这种功能 感觉类似于 ...

  2. NoSQL数据库一MongoDB基本使用

    如今的网站对数据存储要求越来越灵活,在这种需求下 NoSQL 也就是非关系数据库越来越流行.所谓非关系数据库,是指不使用 SQL 语言进行数据操作的数据库的统称.这类数据库存储数据时没有固定的模式,不 ...

  3. LC 33. Search in Rotated Sorted Array

    问题描述 Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. ...

  4. MySQL之mysqldump数据备份还原

    一 mysqldump指令实现数据备份.mysql指令实现数据还原 经常有朋友问我,DBA到底是做什么的,百科上说:数据库管理员(Database Administrator,简称DBA),是从事管理 ...

  5. 让Sublime Text3支持新建.vue高亮显示模板

    首先要使用Package Control,安装要好 Vue Syntax Highlight和sublimetmpl插件. 1, 在Packages\SublimeTmpl\templates目录下新 ...

  6. nodejs 入门学习

    Node.js学习笔记——Node.js开发Web后台服务   目录 一.简介 二.搭建Node.js开发环境 2.1.安装Node.js 2.2.安装IDE开发Node.js插件 三.第一个Node ...

  7. CMake入门-01-从HelloWorld开始

    工作环境 系统:macOS Mojave 10.14.6 CMake: Version 3.15.0-rc4 从 Hello,World! 开始 (1) 新建 hello 目录,创建文件 CMakeL ...

  8. docker网络相关

    1.网卡有namespace的概念,不同的俩个namesp之间的网卡不能直接通信 为了俩个namespace的网卡相互通信,可以通过veth pair(一对)来实现.不同容器之间,便是通过veth p ...

  9. (十二)Hibernate中的多表操作(2):单向多对一

    由“多”方可知“一”方的信息,比如多个员工使用同一栋公寓,员工可以知道公寓的信息,而公寓无法知道员工的信息. 案例一:使用xml配置 pojo类 Group.java package bean; // ...

  10. Spring Boot 多个域名指向同一IP

    一.需求:直接通过域名访问首页(同一应用下,多个首页,包括PC端.手机端首页) 方法:采用多个域名绑定同一IP下同一应用,不同域名对应不同产品(PC.手机端)的方法,在后台通过拦截器判断 reques ...