基于SSM框架的通用权限框架设计

 1. 总体解决方案概述 html

   1.1 权限总体解决方案概述 java

    权限设计主要有一下几大部分组成:
     PassPort

   
针对如今系统的分析,系统之间有部分信息是共享的,这部分信息将由中心话的Passport来统一维护
mysql

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

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

 

  1.2 权限设计的原则 spring

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

2. 资源权限解决方案 sql

  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脚本,更新数据库中的岗码,而且定时重置内存中的数据缓存。这里建议采用增量式更新,不然对数据库压力过大。这里所使用的SQL脚本可参考下面第2点实时更新策略所使用的脚本。
  
实时更新策略
 
对于更新相对较频繁的表(如人员表、岗位表),首先在该表上设立触发器,基于表作的全部修改将记录到历史表中,系统定时扫描历史表,发现改动则执行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

操做类型:增:一、删:二、改: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. 1、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. 1、门店销售经理(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. 1、 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. }