SmartERP是一套企业信息化管理系统,首先需要理解企业管理所涉及到的角色:
- 机构(模块编号1, organization, 缩写o):是相对独立的数据容器,是云平台数据隔离的基本单位。
- 用户(模块编号3, user, 缩写u):系统操作和管理的主体;用户按照行政归属到部门(模块编号2),按权限归属到权限组。
- 客户(模块编号6, customer, 缩写c):是企业的服务对象。
- 产品(模块编号8, product, 缩写p):是企业提供的有型产品或者服务手段。
- 订单(模块编号9, order, 缩写od):产品和客户之间形成订单关系。
- 供应商(模块编号7, supplier, 缩写s):提供外部资源的企业。
- 采购(模块编号10, po,缩写po):产品和供应商之间形成采购关系。
- 进销存:采购的入库和订单的发货形成进销存。
各角色模块编号见表 e_system_module;表的描述和缩写(别名)见表 e_system_table,或者在SmartERP、系统、查询表格。
系统的基本架构:
- 根据角色形成不同的模块。每个模块涉及到以下几个元素:a. 实体 (包:com.etsoo.SmartERP.Entities),属性载体,包含模块名称和编号,比如说客户(Customer);b. 服务(包:com.etsoo.SmartERP.Services),基本上和实体一一对应,定义了实体支持的操作,比如客户服务(CustomerService);
- 如果一个角色需要在不同的模块下使用,比如说Logo(图标)和联系人(Contact),都可以在用户、客户和供应商下使用。
- 模块的名称和操作,自动计算要调用的存储过程名称,比如文章添加为 ep_article_add,对于通用模块,会附加模块编号,比如客户的联系人添加为 ep_contact_add6
- 在Flex项目下,基本上一个模块一个文件夹。
- Flex调用接口采用了FluorineFx,定义在 com.etsoo.WebSmartERP.Classes.FluorineFxAddon,在代码中 [RemotingService] 标明代码支持远程调用,文章服务程序为 FxArticleApp。
存储过程结构:
- 参数:@user_application_id - 当前登录运行的用户编号;@user_validation_cached - 当前操作之前,是否已经进行了在线验证,在线验证验证用户是否登陆并且状态可用;@application_role - 程序当前运行方式,比如客户网站下值为6,和模块编号一致;@application_target - 当前运行方式下的对象编号,比如客户网站下表示当前登录的客户编号;@application_access_token - 访问令牌;@user_permission_cached - 当前调用是否已经进行了权限验证;@changed_fields_table - 修改了的字段名称表格,通过检索这个表格,可以减少更新操作,而且方便判断非空值是否需要更新;
- 查询:@fields - 读取的字段,在执行前调用函数 dbo.ef_clear_injection 清除可能存在的注水攻击字符串,如果遇到连接字符串的情况,建议通过CHAR函数解决;@e_order_by - 排序字段,也会进行注水攻击探测;@e_sc - 模糊查询内容;@language_id - 查询的语言编号;@limit_to_self - 限制数据范围到当前访问机构;@etsoo_log_detail - 日志信息;@e_current_page - 当前页码;@e_max_per_page - 每页读取的记录数;@e_total_records - 读取的总记录数;@e_total_records_nocount - 是否返回总记录数;通过对查询条件的判断,构造出查询语句的条件部分,然后调用存储过程ep_search_get_page 或者 ep_search_get_page_extend 生成完整查询语句,执行返回。
- 可见性验证:比如在添加客户是,需要对客户所属机构进行可见性验证,防止打破数据隔离。
- 权限控制:ef_has_one_permission - 单个权限验证,不区分机构特征;ef_has_permission - 依赖所属机构的权限验证,涉及到几个权限项目:cross_view(跨机构浏览), cross_edit(跨机构编辑);ef_has_user_permission - 依赖特定用户的权限验证,比如客户经理才能修改期客户。
- 追踪日志:如果操作成功,会向系统写入一条日志记录,通过SmartERP、系统、系统日志,可以查看细节。