如果想要获取相关的源码,笔记,和相关工具,对项目需求的二次开发,可以关注我并私信!!!
1 请描述一下这个系统?
从3个方面来回答
系统概述: 系统背景、系统概述
本系统包括模块:
- 用户管理模块
- 药品目录模块
- 药品目录控制模块
- 采购单模块
- 退货单模块
- 结算单模块
- 统计分析模块
- 系统管理模块(参考权限管理的功能实现)。
2 说说系统的架构?
该问题更详细的讲解可以参考自己总结的文档----->“YYCG医药采购系统需求文档.doc”!
本系统架构采用maven构建。 如何构建?
将系统分成4个子工程:
l 技术架构模块:springmybtais . 包括:spirng3.1.4(包括springmvc)、mybaits3.2.3及依赖的jar包。
l 工具类模块(yycgutil) :包括系统所用到所有工具类。
l 主工程模块 :包括系统基础模块(base)、系统业务模块(business).
l 聚合模块(父工程模块) :maven会自动识别各个子模块之间的依赖关系,自动进行聚合.
扩展问题:
为什么要聚合?
由maven自动识别各各子模块之间的依赖关系,最终打成一个war包,将war包考到到集成测试环境中。方便测试人员进行系统集成测试。
在公司是如何使用maven仓库的?
在公司局域网中单独有一台服务器,作为maven私服,maven私服里边有从互联网上下载的jar包,还有自己上传的 jar(参考maven文档中的“私服应用”)。
对于互联网上下载不到的jar,要将本地的jar导入到仓库中
3 本系统如何用maven开发?
1)技术架构模块:springmybtais
包括:spirng3.1.4(包括springmvc)、mybaits3.2.3及依赖的jar包。
2)主工程模块
系统基础模块(base):包括系统管理相关的功能,用户管理、数据字典配置、系统参数配置等。。
系统业务模块(business):包括药品目录 模块、采购单模块、统计分析等
3)工具类模块(yycgutil)
包括系统所用到所有工具类。
4) 聚合模块(父工程模块)
对各各子模块进行聚合
5)仓库: 在公司局域网中单独有一台服务器,作为maven私服(里边有从互联网上下载的jar包,还有自己上传的jar)。
6)使用开发工具:
Maven3.2.1版本
Eclipse-kepler(自带maven插件)
4 这个系统异常处理是怎么做的?(重点)
1)自定义异常类:
通常做法:对每一个异常信息单独创建一个类,继承Exception,定义异常类比较多,繁琐。
本系统就定义一个自定义异常类ExceptionResultInfo,继承Exception,ExceptionResultInfo中有一个resultInfo属性, resultInfo中定义异常信息、异常代码,这样此类就可以存储任何异常信息。
2) 编写异常信息配置文件:
在messages.properties文件定义了所有异常信息,以异常代码=异常信息方式进行定义,使用国际化的工具类读取该 配置文 件的内容,将读取到内容使用resultInfo类存储。
3) 异常处理:
系统定义一个全局异常处理器,统一解析处理action所抛出的异常。
统一异常处理器采用springmvc框架提供的机制进行异常处理,springmvc的前端 控制器在调用Action时,所发生的 异常全 局交给异常处理器进行异常处理。
异常处理流程(掌握):
这里写图片描述
5 本系统实现国际化了吗?是怎么做
本系统没有实现国际化,但是本系统使用国际化资源文件将系统所有提示信息配置起来,使用国际化的方法读取配置信息。
Java操作国际化方法:
Java国际化主要通过如下3个类完成
java.util.ResourceBundle:用于加载一个资源(配置文件)
java.util.Locale:对应一个特定的国家/区域、语言环境。
java.text.MessageFormat:用于将消息格式化
在messages.properties文件定义了所有异常信息,以异常代码=异常信息方式进行定义,使用国际化的工具类读取该配置文件的内容,将读取到内容使用resultInfo类存储。
6 这个系统mybatis是怎么用的?或这个系统持久层如何实现的?
1)本系统使用mybatis提供的动态代理方法开发mapper。
针对单表的增、删、改、查、使用mybatis提供的逆向工程生成mapper文件,不用程序员针对单表写sql及mapper 文件,提高了开发效率。
针对多表的查询,需要自定义mapper。
2) 扩展问题: mybatis提供的动态代理方法是怎么用的?
开发mapper地遵循一些规则:
Mapper接口地址和mapper.xml映射文件中namespace致。
Mapper接口的名称和mapper.xml映射文件中的statement的id一致。
Mapper接口的输入参数类型和mapper.xml映射文件中的statement的parametertype一致
Mapper接口的输出结果类型和mapper.xml映射文件中的statement的resulttype一致
3)如何生成mapper代理对象?
使用mybatis和spring的整合包中的mapper扫描器自动生成 mapper代理对象,生成的mapper代理对象会自动注册
到spring容器。
7 这个系统springmvc是怎么用的
使用springmvc注解开发。
针对需要返回页面,统一action方法返回string(逻辑视图名)。
针对提交的操作,统一返回json结果,使用@responseBody注解将系统统一的结果类型submitResultInfo转为json在客户端输出。
提交类的操作,统一采用ajax+json方式。
针对查询列表,统一返回json结果,因为查询列表在页面使用jquery easyui的datagrid展示,使用@responseBody注解将系统统一的结果类型DatagridResultInfo 转为json在客户端输出datagrid.
8 本系统ajax+json具体是怎么做的?action的方法返回的json是如何实现的
Ajax+json:
请求内容:
普通表单数据key/value(注意:请求的不是json)
采用jquery提供的ajax的form请求组件,进行提交。提交的是普通表单数据key/value
响应内容:
在action使用@responseBody响应json数据。
9 这个系统都用到jquery easy ui的哪些组件
页面布局: layout
菜单 :accordion
窗口标签:tabs
数据列表:datagrid
弹出窗口:window
提示消息。。。。。。。。
10 这个系统的用户认证是怎么实现的
使用用户名和密码方式进行认证。
用户认证流程:
这里写图片描述
什么是公开权限:就是用户不用登录就可以访问的公开地址,参考“shiro相关文档”
11 本系统用户授权是怎么实现的?
1) 概述
权限管理功能不是我们开发的,是使用的是第三方的SSO单点登录系统。我们要做的是如果把SSO系统接入到医药管理系统中,然后,根据SSO系统提供的功能进行授权!
简单说,原系统是走的第三方SSO单点登录系统进行的认证和授权的功能!
而作为教学,我们只是实现了认证,而对于授权---->我们会把SSO系统接入到医药管理系统中,从而进行功能的授权!
强调一遍:权限管理指的是用户授权,而拦截器不属于权限管理的范畴
当然,对于一个成熟的企业,一般的用户授权系统都已经开发完成了,不需要我们开发!
2) 第三方的SSO系统与药品采购系统的集成
第三方的SSO单点登录web授权管理系统为了安全性,也需要通过用户认证的方式来防止别的系统进入!
即:通过session接入接口的方式来登录第三方的系统!
Session接入接口的规范的定义,该规范是由第三方的SSO系统提供,包括如下内容:
1. 接口名称
2. session接口的作用
3. 接口的调用方向
4. 接口的功能
5. 接口的协议
6. 接口的地址
7. 接口的数据描述
3) 如何授权(了解)
再强调一下:授权不是我们开发的,而是使用的第三方SSO单点登录系统。下面的步骤是演示登录第三方SSO系统后如何进行授权的!
当然,授权的前提是第三方的SSO系统已经成功的与药品采购系统进行了集成!
授权的过程可以参考day04_2.doc稳重的“在原型系统中使用第三方系统进行权限分配的演示”的一节中的内容!并不难的...........
注意:是给每个角色授权(一共5个角色),而不是给每个用户授权!
4) 本系统的权限管理模型
通用的数据模型只有5张表!如下图:
通用的数据模型只有5张表!
本系统对一张权限表拆分为4张权限表,相应的,角色和权限关系表也拆分为4张关系表。
因此,包括角色表和权限表,一共为9张表!
5) 权限管理(用户授权)的应用:根据用户的角色显示不同用户的权限菜单
本节中所要实现的功能是:验证用户的权限菜单!就是使用不同的用户登录系统,并根据用户的角色获取他的权限菜单,并在左侧页面中的导航栏中显示!
即:根据不同用户的登录来显示不同用户的菜单!而对于没有权限的菜单,用户登录后该菜单就不会显示
举例来说:使用卫生局和卫生室两个角色分别登录系统,在导航栏中的权限菜单的显示也是不同的
如何实现呢?
用户登录成功后,根据用户所属的角色来从数据库中查出用户的菜单权限,然后将菜单权限存储至session中,从而实现不同的用户登录,显示出不同的菜单!
6) 权限管理(用户授权)的应用:权限拦截
1)授权完成后,就采用URL拦截方式进行权限拦截。 具体的步骤是:
用户登录成功后,根据用户找到用户对应的所有操作权限(URL操作链接),并将操作权限存储在session中。
然后在拦截器中获取此用户的操作权限,在拦截器中进行判断--->当用户请求的URL不在自己的操作权限范围之内,则提示用户:无此操作权限!
2)权限拦截的流程图如下: 使用过虑器、 springmvc的拦截器!
这里写图片描述
什么是公共权限:用户身份认证通过后不需要授权的地址就是公共权限!或者说,每个登录的用户都有的操作权限,这时,
就不用给每一个用户授权此类权限。只需要在单独的配置文件中将公共权限配置起来,在拦截器获取到,如果用户请求的是公共权限就放行。
比如:管理信息系统的首页,用户中心页面。
最后,在springmvc.xml中配置权限拦截器(重点)
如下红框内是配置的内容:
补充知识:
该系统针对的是角色的授权(因为该系统分为5大角色),但是有些系统可能需要针对用户授权,对每个用户进行授权。
实现方法:
可以采用角色和用户关系 ,给每个用户定义一个角色,还是针对角色授权。
不需要定义角色,创建一张表用户权限表,由业务用户操作而不是系统管理员。
12 系统使用数据字典了吗?怎么用的?
数据字典:将具体相同类型的配置项统一在数据字典表中进行配置,如果要修改配置项只需要修改数据字典而不需要代码,增强代码可维护性。
配置项:分成两种,
一是业务代码,业务代码系统中固定的代码,不受用户需求控制的。比如:用户状态(正常、暂停)、药品交易状态(正常、暂停)、用户类型(1,2,3,4,0),业务代码可能要在系统中硬编码。
二是普通配置项,普通配置项变化灵活,受用户需求控制,比如药品类型、医院级别。
数据字典表:
分为两张表,一张表是数据字典类型表,dicttype,一张表是数据字典明细表,dictinfo(外键typecode)
业务代码、普通配置项,类型都需要在dicttype配置,且配置方法一样。
业务代码、普通配置项,明细在dictinfo配置,方法不一样。
业务代码在dictinfo数据字典明细表配置,将业务代码写到dictinfo表中的dictcode字段,如果查询一个业务代码对应的名称?根据typecode+dictcode查询dictinfo表,只能查询出一条记录。
普通配置项在dictinfo数据字典明细表配置,不需要在dictcode字段配置内容,因为普通配置项没有业务代码。只需要在info字段配置项目名称即可。
如果关联查询出普通配置项的名称?
在业务表(范范的概念,业务功能相关表统称为业务表)中将普通配置项的id(dictinfo的主键)存放在业务表字段中,根据id(dictinfo的主键)关联查询dictinfo 表的记录。
上边业务代码、普通配置项,如果查询该类型下的项目,查询方式是一致的,根据typecode查询dictinfo表的记录。
比如查询用户类型下的项目,select id,info,dictcode from dictinfo where typecode=’s01’
13 系统中有导入、导出功能吗?怎么实现的?
系统有导入导出功能,对药品目录实现导入和导出,还有一些用户常用的查询实现了导出,还有每一个统计分析实现导出。
药品目录导入:使用Apache POI组件完成导入,采用HSSF事件驱动模式进行excel文件导入。系统中对HSSF事件驱动模式进行封装。
封装的思路:封装类包括一个抽象类,工具类(继承抽象类)、数据导入接口。
抽象类是一个底层类不是面向用户的,完成了对excel数据的解析,解析完一条记录调用一个抽象方法,此抽象方法在工具类中有具体的实现.
工具类是面向用户的,工具对抽象方法具体实现,内容是调用数据导入接口执行导入操作,统计导入的结果(导入成功数量、失败数量、导入失败原因、导入失败的记录)。
具体使用时需要根据业务需求开发不同的数据导入接口,将此接口注入工具类中,程序员只要调用工具的导入方法即可完成数据的导入。
药品目录导入开发,就是使用此封装类,开发了一个药品目录的导入接口。
药品目录导出:使用apache POI组件完成导出,采用XSSF完成数据导出,XSSF可以完成大数据导出,XSSF实现一边向内存创建对象,一边向磁盘写临时文件,一边对内存对象进行清理,最终对生成临时文件进行合并输出最终导出文件。
本系统对XSSF完成大数据导出封装使用,封装类原理:使用时需要定义导出数据列表的title,还要定义导出数据列表每一列对应的pojo的属性,从数据查询出要导出的数据List,封装通过java反射自动取出pojo中的属性值,使用XSSF向内存创建对象,完成数据导出。
14 系统中都包括哪些系统配置方式?
系统配置包括哪些?
对于系统运行参数配置在系统参数配置表(basicinfo)
维护方式:由管理员登陆系统后台进行维护。
这里写图片描述
将具体相同的类型的配置项配置在数据字典表。
维护方式:
由管理员登陆系统后台维护所有配置项(业务代码、普通配置项)主要维护的是业务代码。
建议将普通配置项的维护权限交给业务用户进行维护。
系统配置文件:
1、 对系统所有提示信息(成功、异常)统一配置在message.properties文件中。
2、 对数据的连接参数配置在db.properties中
3、 日志参数配置在log4j.properties(配置日志策略,主要是日志级别、日志文件路径、日志分割策略)
4、 系统公开访问地址(无需要登录即可访问)配置在anonymousActions.properties
5、 系统公共访问地址(需要登录,但无需要授权)配置在commonActions.properties
15 请描述药品目录模块?
模块的功能描述本模块包括哪些功能:
1)药品目录的维护:卫生局通过批量导入将市平台所用的药品目录信息导入系统,对药品信息进行修改、删除操作。
2) 供货商药品目录的维护:供货商对自己供应的药品进行维护,供货商向供货商药品目录添加要供应的药品,删除不再供应的药品。
3)供货商药品目录的控制:监督单位对供货商的药品目录进行控制,允许供货商供货或暂停供货商供货。
模块的业务流程:
1、 卫生局建立本系统的药品总目录。
2、 供货商从系统药品总目录中挑选药品加入自己的供货商药品目录中表示供货商要供应药品。
3、 供货商将药品从自己的供货商药品目录中删除掉表示不再供应删除的药品。
4、 监督单位查询供货商供应的药品信息,对其的供货状态进行控制,允许供货商供货或暂停供货商供货。
16 请描述采购单模块
模块的功能描述:医院首先创建采购单、监督单位审核采购单、供货商受理采购单、医院进行药品的入库等部分功能。
模块的业务流程:
医院创建采购单 :
填写采购单基本信息(采购单的基本信息,下单人的联系方式,采购单编号,下单日期等)
维护采购药品明细信息(指定采购单采购哪些药品)
2、 医院提交采购单 .
3、 监督单位审核采购单.
4、 供货商受理采购单 .
5、 医院执行入库操作.
17 你在开发中有没有遇到什么问题,是如何解决的?分表存储怎么做的?
1)系统中对采购单信息进行分表存储的问题:
为什么进行分表存储?因为对于一个省会城市每一年的采购单信息达到千万级,时间长了对采购单信息查询、统计速度就会降低,
单纯从数据库级别进行优化治标不治本,彻底的解决办法对数据进行分表存储。
2)如何进行分表存储?
采购单包括两张表采购单基本信息表和采购药品明细表,其中采购药品明细表数量很大,如果单纯对采购药品明细表进行分表,
开发中对采购单业务处理思路不统一,所以要对采购单两张表及表相关的对象全部进行分表!
采用按年分表,表名命名规则:
Yycgd+4位年份
Yycgdmx+4位年份
….等表相关对象也采用固定名称+4位年份。
3)分表操作方法:
采用系统定时任务定时执行存储过程进行动态表创建。定时任务采用是操作系统的定时任务,因为操作系统的定时任 务稳定且和软件是分开的,操作系统定时任务不仅仅是动态分表,还有系统备份、临时文件清理。。
存储过程里边就是动态分表的逻辑,对采购单、统计分析、退货单数据库对象进行创建。
18 动态表如何创建?
通过操作系统的定时任务来调用存储过程,再由存储过程来创建动态表及相关的数据库对象。
定时任务:采用操作系统的定时任务。通常java程序在linux运行,需要在/etc/crontab配置定时任务。
而Windows系统中要在系统与安全中新建计划任务选择程序然后引入脚本文件并执行
在windows系统中创建的是bat批处理脚本,而Linux系统中需要编写shell脚本!两个系统中的脚本执行的功能都是相同的------>连接数据库,调用存储过程。
例如:在windows系统中的任意目录中创建一个oracle.bat,内容如下:
sqlplus yycg/yycg@yycg_127.0.0.1 @c:\test.sql |
表示使用sqlplus登录数据库yycg,然后执行test.sql文件!其中test.sql文件的目录在C盘根目录,该文件内容如下:
call create_tableJob(); --该行代码表示:调用存储过程 |
打开plsql,看到如下:
如果有的存储过程出现了红叉,表示需要重新编辑,也就是重新执行一下即可,点击左上角的“执行”按钮即可执行编译!
因为存储过程是存储在oracle数据库的缓存中,如果该存储过程长期不使用,缓存就会清空!因此,必须要保证所有的存储过程都能正确的编译!
打开其中的一个CREATE_TABLEJOB(就是在test.sql文件中编写的存储过程名)存储过程,内容如图:
其中,create_businesstable语句:表示创建create_businesstable存储过程,在该存储过程中创建各个动态表及相关的对象(包括:索引、触发器、序列........)。
也就是说,在create_businesstable存储过程中又创建了一个新的存储过程CREATE_BUSINESSTABLE!
打开CREATE_BUSINESSTABLE存储过程,内容如图:
图中表示会创建很多的存储过程!
例如,打开其中的一个create_businesscgd存储过程,看其源码,可知,创建表及相关对象的方法是:
将创建表及相关对象的sql,在存储过程中使用字符串拼接起来,通过execute immediate执行这个sql,完成创建!!!
图中的8个存储过程的创建都使用相同的方法!
注意:在测试之前要把所有跟该存储过程所创建的相关的表、触发器、序列等相关对象删除掉.........
可以针对8个存储过程中的任意一个存储过程去测试,而不用执行create_tablejob这个存储过程来一次测试或执行全部8个存储过程!
建议:针对当前的老师所讲的项目中只涉及到yycgcgd和yycgcgdmx这两张动态分表,那么,只需要分表执行这两张动态分表的存储过程,如下:
create_businesscgd(year);
create_businesscgdmx(year);
而其他的存储过程的调用在自己完善老师的功能之上分表实现即可,也就是说,其他的动态分表的创建老师没有涉及到,需要自己手动调用存储过程!
而不需要全部把这些存储过程执行一遍,因为一次执行create_tablejob这个存储过程会死机!!!
然后就是执行或调试存储过程:
方式1:可以通过打开oracle.bat文件中的内容执行:Call 调用存储过程。
方式2:也可以通过pl/sql工具调试来执行或者调试存储过程,这样很方便,因为可以加断点,可以跟踪变量的值..............
下面,就以pl/sql工具来测试存储过程为例!!
测试流程(这里的测试也是执行的意思)如下:点击“测试”,如下图:
注意:当只是测试或者执行8个存储过程中的一个存储过程时,需要手动的输入当前年份的值,按照提示输入即可!
19 供货商如何进行采购单受理?或说说供货商受理采购单的流程?
供货商受理采购单功能描述:
医院创建完采购单,由监督单位审核通过后,由供货商进行受理,供货商根据医院采购药品数量等信息进行发货操作。发货操作有两种方式:
选择确认发货:
针对发货量少的药品可以采用选择确认发货方式,供货商登录系统查询待受理的发货清单,选择要发货的药品进行确认发货。
批量发货:
针对发货量大的药品,供货商将要发货的药品整理成excel文件,通过系统提供的导入发货清单,清单中存在药品明细系统自动执行发货操作。
20 说说药品入库、退货和结算流程?
1)药品入库功能描述:
供货商对采购的药品发货后,医院就可以执行入库操作,药品入库后表示医院收到所采购的药品了。
操作流程:
医院登录系统查询待入库的药品明细信息
选择要入库药品,填写入库信息(入库量、发票号、药品批号 。。)
确认入库提交
2)退货流程:
1、 医院创建退货单 ,填写退货单的基本信息
向退货单中加入要退货的药品,所加入的退货的药品是以前采购的药品
2、 提交退货单
3、 供货商受理退货单
3) 结算流程:
1、 医院创建结算单 ,填写结算单的基本信息
向结算单中加入要结算的药品,所加入的结算的药品是以前的采购的药品
2、 提交结算单
3、 供货商受理结算
21 统计分析模块是如何实现的(如何实现数据聚合)?
1) 统计分析实现的功能是:无论是供货商、医院、监督单位,其实都可以通过交易明细的查询功能来查看以往的交易记录!
医院、供货商、监管单位通过交易明细查询功能,查询出指定时间段内的历史交易清单。
监管单位查询交易明细的目的:是为了监督。
医院、供货商查询交易明细的目的:查询与自己相关的交易信息。
2) 为什么要数据聚合?
采购明细表:一年有上千万。
入库信息表:一年有上千万。
退货信息表: 少。因为数据量小,所以可以忽略不计。
结算信息表:一年有上千万。
4张大数据量的表关联查询,如果用作统计,肯定是在4张表关联的基础上实现,速度很慢,虽然oracle查询几千万的数据没有问题的,但是我们还是需要优化的。
设想:如果将4张表的数据全部放在一张表中,那么,单表查询速度提高很大--->因为不需要关联查询了。这就是接下来要讲的“数据聚合的意义了”!!
3)如何实现数据聚合?
使用触发器进行数据同步
在向原始表中插入记录的同时,向目标表中插入记录.
在原始表中修改记录的同时,也向目标表中修改记录.
在原始表中删除记录的同时,也向目标表中删除记录.
注意:如果创建触发器的目的仅仅是为了数据的同步,那么就建议使用触发器,因为比较简单;
但是,如果创建的触发器内容中包含有业务逻辑,不建议使用触发器,因为会导致触发器滥用了,不易进行维护!
具体的操作是:
创建一张交易明细动态表YYBUSINESS,该表中的字段包括需要同步的所有表中的字段!具体的实现逻辑是:
修改采购单审核的service()业务层中的方法中添加代码:如果审核通过,将采购单明细表中的记录全部插入到交易明细动态表YYBUSINESS中!
简单说,就是通过修改service层中的代码实现数据同步!
而入库、退货和结算的数据同步都是通过触发器来实现的!因为触发器中不涉及任何的业务逻辑代码!
22 系统中有打印功能吗?怎么实现的?
系统中有打印功能。 例如:导出的列表要打印,怎么实现? 采购单基本信息的打印,怎么实现?
b/s系统下打印功能的3种实现方式:
1)使用浏览器的打印功能
用户在浏览器中浏览的网页,通过浏览器提供的打印功能,点击“打印”菜单即可将当前网页打印。
浏览器打印出效果就是页面浏览的效果,通常使用使用浏览器打印,需要单独作一个打印的页面,这个打印的页面将超级链接、按钮等不需要打印的内容全部去掉,
打印页面中只留下需要打印出来的东西。
浏览器打印出来内容默认在打印页面最下边显示当前url地址,通过设置浏览器打印选项可以去掉这个url。
总结:使用浏览器打印非常方便。
2)间接打印
比如:需要打印供货商的药品目录,要求用户将列表导出成excel,由用户自行打印。
3)套打(企业中常用)
什么是套打:所打印出来效果(布局),是提前印刷好的打印模版,打印模版中是没有数据的,需要有数据的地方空白了,系统按照设计模版要求将所需要数据及数据位置对应模版打印出来。
比如;
要准备的数据和定义数据的位置可以搜索互联网------>“免费的b/s系统下套打插件”!
进行套打:
1、 连接打印驱动程序
需要在浏览器上安装打印插件(.exe文件)
2、 使用js访问打印插件的方法,执行打印
使用js方法访问打印插件,通常将上边的数据和数据位置的规则定义在一个js文件中,数据及数据位置通过js变量(数组,json)记录。
网上可以搜索“免费的b/s系统的打印插件”。
比较好用的lodop???
23 你在开发中有没有遇到什么问题?或统计分析是如何设计开发
系统统计分析功能,有交易明细查询,有按药品、按医院等分类统计功能,有按药品、按医院等分类统计是在交易明细查询基础上进行分类统计,问题是交易明细查询需要三张大数据量的表关联查询,为了提高查询及统计的性能,单独创建了一个交易明细表来进行数据的聚合。
将采购药品信息、入库信息、退货信息、结算信息都聚合到交易明细表。
交易明细查询、分类统计都是从一个表(单表)进行统计查询。提交查询统计的性能。
24 你是如何和测试人员配合工作的?(重点)
24.1系统的测试过程:
开发人员将系统开发完成,首先进行系统集成测试。
集成测试完成后开发人员需要提供两个文档:“系统集成测试报告.doc”和“系统部署配置说明.doc”!
同时开发人员会将系统提交给测试人员, 测试人员从svn上下载系统的所有代码及系统相关文档!
测试人员根据这两个文档:“系统集成测试报告”和“系统部署配置说明”,再次进行系统集成测试。
测试人员对系统集成测试通过后,会进行详细的系统功能测试(这一步在day09文档中由开发人员自己实现的)。
开发人员在测试人员进行详细的功能测试时,开发人员需要长时间的(和开发时间相等甚至多于开发时间)和测试人员进行缺陷修改,两者需要协调工作!
24.2缺陷修改的过程:
第1步:测试人员进行功能测试 ,测试出来的bug会提交到专门的项目管理平台(其实就是提交到测试管理管理平台,测试管理平台属于项目管理平台的一部分。
项目管理平台包括很多:比如,需求,设计,编码,维护........等等,而测试管理平台只是项目管理平台一部分)!测试人员提交的bug信息包括:测试环境
(在哪个服务器上安装的什么软件)、测试数据、测试步骤(可以参考“day09中的集成测试部分”)!
测试人员提交bug时并没有指定要修改bug的程序员(因为测试人员并不知道bug由谁来修改),只是指定给了项目经理!
第2步:项目经理登陆测试管理平台,将提交的 bug指派给开发人员! 第3步:开发人员就要每天定时登陆测试管理平台,可看自己名下的bug,根据测试人员提交的bug信息(测试环境、测试数据、测试步骤)进行修改bug。
如果开发人员修改bug完成,提交bug到测试管理平台(这时的bug状态是未修改)
第4步:测试人员会每天定时登陆测试管理平台,可看自己名下的bug,对开发人员已提交的bug进行回归测试。回归测试就是测试人员最开始提交的bug信息中的内容:测试环境、测试数据、测试步骤!
如果测试通过,将bug关闭,
如果测试 不通过,将bug驳回。
第5步:如果开发人员发现bug驳回,就执行第3步。同时,再次详细查看测试场景、测试数据、测试步骤,根据这些进行测试,通过几次测试后发现bug重现不了,找到测试人员进行沟通。
第6步:测试人员将功能测试完成后,会进行系统的性能测试(就是压力测试:查看并发数)。
测试完成后,测试人员编写文档:系统测试报告。
第7步:项目经理、产品经理根据测试报告,讨论该系统是否可以上线。
25 你参与过系统维护吗?系统维护的流程是?
讨论问题是否严重!
产品化人员就是专门做产品的安装包和升级包的!
红色字体表示开发人员参与系统维护时所做的工作!这里的系统升级就是指系统的维护!
开发人员、测试人员、产品化人员、维护人员!
26 该系统的3大权限
身份认证权限:参考d04文档中的身份认证模块的开发!
操作权限: 可以参考“权限模块”。
数据范围权限: 在各个模块的sql语句中的数据范围的约束条件!