如果想要获取相关的源码,笔记,和相关工具,对项目需求的二次开发,可以关注我并私信!!!
四 创建采购单的基本信息
1 需求
参考“采购单模块的操作流程”一节中的需求!
医院创建采购单时,需要先填写采购单基本信息,基本信息填写完成后,再填写采购单明细信息。
页面的内容如下:
采购单基本信息包括:采购年份、采购单名称、建单时间、提交时间、联系人、联系电话、备注、采购单状态。
2 dao
使用逆向工程向采购单基本信息动态表中(表名例如:YYCGD2018)插入一条记录。(在上面的“分表存储”一节中已经指定了动态表的生成规则!)
注意:在采购单基本信息动态表中有一个采购单编号bm字段:该字段的生成使用的是oracle的序列来动态的生成其采购单编号bm字段的!
下面的2.1、2.2中的内容,都是针对动态生成序列的采购单编号类这一问题来开展的!!
2.1 使用Oracle序列动态的生成采购单编号bm
既然采购单基本信息表和采购单详细信息表都是使用oracle动态生成的,那么采购单编号bm字段的生成也应该是由oracle动态的来生成!原因是为了在对采购单进行维护操作时方便获得所在的年份信息!(为何方便还是慢慢往下看吧)
我们规定:本系统中的采购单编号bm字段和采购单id字段都采用相同的命名规则:按年划分,4位年份+6位流水号,这点与动态表的命名规则相同(见上)。
其中,6位的流水号的生成是使用oracle的序列来生成的。
而采购单id字段之所以也采用该命名规则的理由可以参考“采购单基本信息的修改”一节中的内容!
当然,,下面的序列都是已经提前生成好了,创建序列的sql语句是由生成动态表的存储过程自动创建的。
在“本系统的分表规则”一节中有提到过该存储过程,而存储过程的创建和调用参考:“医药采购系统问题总汇”中的“动态表如何创建”一节中的内容!
oracle中提前生成的序列如图
其中,YYCGDBM序列对应模板表YYCGD,而YYCGDBM2014序列对应于动态表YYCGD2014!!当然,动态表的后4位年份是不断变化的。
定义序列的sql语句可以通过sql/plus中的“显示SQL”按钮来显示其sql语句:
start with 100040表示开始,maxvalue表最大是999999,都是6位的数字!
2.2 创建采购单编号bm的自定义mapper接口和mapper映射文件
我们要做的只是创建一个自定义的生成采购单编号的mpper.xml映射文件,及其自定义的生成采购单编号的mapper接口:
YycgdMapperCustom.xml中的自定义的生成采购单编号的映射文件所在目录如下:
最终,映射文件中的内容如下:
上面的sql语句中必须使用${value},其中变量value表示年份,而且必须使用value来表示,因为aprameterType输入参数传入的是简单类型。
至于文件中为什么要使用$符号以及value可以参考“Mybatis相关文档中的#和$符号的区别”!
然后,可以通过下面定义的YycgdMapperCustom.java接口中定义的year参数来接收!!!
YycgdMapperCustom.java接口中自定义的生成采购单编号的代码如下:
2.3 创建扩展类和包装类
扩展类源码
包装类源码:
3 service
接口功能:向采购单基本信息动态表yycgd中表插入一条。
接口参数:至于传入什么参数,要以yycgd表中的非空字段来作为参考!如下参数:
(1)useryyid:表示医院id.
(2)year:表示4位年份.
(3)yycgdCustom:表示采购单信息。
(4)建单时间CJTIME字段,使用系统默认的时间!
(5)设置采购单状态zt字段默认为1:“未提交”.
接口的实现类:向采购单基本信息动态表yycgd中表插入一条.
4 action
CgdAction类中需要创建3个方法
第一个方法:创建采购单基本信息页面的方法
因此,页面中需要准备的数据:
1.药品的采购年份,例如:2014,表示当前年份.
2.采购单的名称,名称的默认显示的是:医院名称+当前时间+“采购单”。
内容如下
/** * 创建采购单基本信息页面 * */ @RequestMapping("/addcgd") public String addcgd(HttpSession session, Model model) throws Exception { // 第1步:获取当前登录的医院信息 ActiveUser activeUser = (ActiveUser) session.getAttribute(Config.ACTIVEUSER_KEY); // 第2步:获取用户所属单位名称(获取医院名称,因为登录的用户就是医院 ) String sysmc = activeUser.getSysmc(); // 第3步:获取采购单名称:医院名称+当前时间+“采购单” String yycgdmc = sysmc + MyUtil.getDate() + "采购单"; //存入 model.addAttribute("yycgdmc", yycgdmc); // 第4步:获取当前的采购年份 String year = MyUtil.get_YYYY(MyUtil.getDate()); // 存入 model.addAttribute("year", year); return "/business/cgd/addcgd"; } |
第二个方法:创建采购单基本信息的保存(或者是提交)方法
创建采购单基本信息成功后,需要重定向到采购单修改页面,在修改页面中可以填写采购单的明细信息
注意:该方法还需要修改的。因为还没有做重定向的操作,参考下节:“采购单基本信息的修改”一节!
第三个方法:编写重定向到采购单修改页面的方法,是为了调试创建采购单基本信息保存方法.
注意:该方法只是先搭个框架,随之功能的深入,该方法还需要修改的,参考下节:“采购单基本信息的修改和提交 ”一节
5 addcgd.jsp页面
在addcgd.jsp页面中注意红框内的地方:
第一个${year}接收后台CgdAction中的addcgd()方法传递过来的year的值,
第二个${year}的值是用来把第一个year的值传递到后台的CgdAction中的addcgdsubmit()方法中的参数为year的变量,然后使用该year变量来接收!
6 测试
再次强调一点:
在运行测试之前,必须要保证动态表已经创建成功,而动态表创建成功的前提是存储过程被正确的调用!
否则,测试无法正常的执行!
7 采购单基本信息创建成功后如何跳转到采购单修改页面editcgd.jsp
7.1 addcgd.jsp页面执行流程
该小节解决的问题是:当采购单页面中的基本信息填写完成后,点击“保存”按钮后,如何实现从addcgd.jsp页面跳转到采购单修改页面editcgd.jsp的问题?
注意:采购单修改页面cgdedit.jsp就是采购单明细信息的页面!这是根据操作流程来决定的!!!
查看addcgd.jsp页面可知:如果采购单的基本信息创建成功后,在addcgd.jsp页面中就会执行回调方法yycgdsave_callback(),如下:
红框内的部分就是保存addcgd.jsp页面中填写的基本信息后后要跳转到的修改页面editcgd.jsp的url路径!
注意:sysdata参数和yycgdid参数。其中,yycgdid(采购单id)参数,是要接收从后台CgdAction中的采购单基本
信息保存(提交)的方法addcgdsubmit()中的resultInfo结果后,再通过addcgd.jsp页面中yycgdid参数来接
收。
查看ResultInfo类中定义的map结构的sysdata属性,该属性是专门用于后台的action中向前台页面传递业务数据的参 数,定义如下:
因此,sysdata中需要传入yycgdid。因为在addcgd.jsp页面中需要这个sysid参数(上图中已经说明了)!
当然,前台的cgdadd.jsp页面中的内容是复制过来的,页面中所需要的参数都已经准备好了!
7.2 修改service层代码
后台的解决方案步骤如下;
第1步:需要修改CgdServie接口中的insert()中插入采购单基本信息的方法,将采购单基本信息动态表的id返回,之所以要将Id进行返回,原因在于addcgd.jsp页面中需要这个yycgdid参数!(看上面),修改如下:
修改为id的返回值为String!!!
第2步:修改CgdServie接口的实现类CgdServiceImpl中的insertYycgd()方法的实现,
字体颜色加深加粗部分是修改的内容,如图:
/** 创建采购单基本信息,返回采购单id */ @Override public String insertYycgd(String useryyid, String year, YycgdCustom yycgdCustom) throws Exception { // 设置采购单号 String bm = yycgdMapperCustom.getYycgdBm(year); // 设置采购单主键id。把采购单id主键和bm设置为一致,目的是为了方便操作采购单.这里之所以把采购单的id设置与采购单编号bm的值相同,原因参考下节的“采购单基本信息的修改”一节中的内容! yycgdCustom.setId(bm); // 设置采购单号bm,即流水号。把采购单号bm和采购单id保持一致,目的是为了方便操作采购单 yycgdCustom.setBm(bm); // 创建采购单医院 yycgdCustom.setUseryyid(useryyid); // 创建时间 yycgdCustom.setCjtime(new Date()); // 设置采购单默认状态 ,1表示为未提交 yycgdCustom.setZt("1"); // 设置年份,是为了操作动态表! yycgdCustom.setBusinessyear(year); //向采购单基本信息动态表中插入数据 yycgdMapper.insert(yycgdCustom); // 返回采购单id,采购单id和采购单流水号相同! return bm; } |
7.3 修改action层
修改CgdAction中的采购单基本信息的提交方法addcgdsubmit()
红框内是添加的内容!
这样,yycgdid参数作为采购单基本信息动态表的id就可以返回到addcgd.jsp页面中。该页面中的回调方法就可以获取 到了该id值了,如何获取的?参考addcgd.jsp页面中的如下定义:
因为添加成功后跳转到editcgd.jsp页面后,在editcgd.jsp页面中的数据需要回显,需求如下图所示:
红框内都是需要回显的内容:
因此,还需要在扩展类YycgdCustom中添加采购单状态属性,修改如下
五 采购单基本信息的修改和提交实现
1 需求
该节功能包含两部分:
第一个是对于采购单基本信息的展示功能。
第二个是修改后的提交功能。
注意:采购单修改页面cgdedit.jsp就是采购单明细信息的页面!!!!!这是根据操作流程来决定的!!!
采购单基本信息创建成功后,接下来就是“业务流程分析”中的“操作流程”中的“医院创建采购单”中的第3步所
展示的页面内容!
即需要对于刚刚创建的采购单基本信息保存后跳转在editcgd.jsp修改页面中,从而在修改页面中进行修改!(其实就是
一个跳转的实现!如何跳转的?在上节的“采购单创建成功后如何跳转到修改页面”内容中已经实现了)
如图:
可以修改的内容:联系人,联系电脑..................等等!
填写完要修改的信息后,点击“保存”或“提交”按钮后,会显示如下:
2 dao
Dao完成两个功能:
1.根据采购单的id来查询采购单基本信息动态表yycgd。
2.将采购单信息保存到采购单基本信息动态表中yycgd。
这两个功能使用之前生成的逆向工程即可实现!!
3 service
3.1 采购单基本信息的显示
接口功能:根据采购单的id来查询采购单基本信息动态表yycgd.
接口参数:采购单基本信息动态表的id.
CgdService接口的实现类CgdServiceImpl的源码如下:
字体颜色加深加粗是添加的内容。
/** * 根据采购单基本信息的id查询采购单的详细信息. 返回值是YycgdCustom对象,是为了方便在该对象中扩展属性! */ @Override public YycgdCustom findYycgdById(String id) throws Exception { /* * yycgdMapper.selectByPrimaryKey(id); * 该方法不能使用,因为传入的Id参数没有businessyears年份这个变量 */ /* 第一步:从采购单基本信息表的id中来截取4位年份.因为这里接收的采购单基本信息的id * 中包含了年份信息! */ String year = id.substring(0, 4); // 第二步:通过yycgdExample传入businessyears年份变量 YycgdExample yycgdExample = new YycgdExample(); YycgdExample.Criteria criteria = yycgdExample.createCriteria(); criteria.andIdEqualTo(id); yycgdExample.setBusinessyear(year); // 第三步:根据条件(条件中拼接了businessyears年份变量的id主键)来查询采购单基本信息动态表 List<Yycgd> list = yycgdMapper.selectByExample(yycgdExample); // 第四步:获取yycgdCustom对象中属性的内容 Yycgd yycgd = null; YycgdCustom yycgdCustom = new YycgdCustom(); // 如果找到一条记录 if (list != null && list.size() == 1) { yycgd = list.get(0); // 将yycgd对象中的属性值 拷贝到yycgdCustom对象中 BeanUtils.copyProperties(yycgd, yycgdCustom); } else { // 抛出异常.异常信息为:采购单在系统中不存在 ResultUtil.throwExcepion(ResultUtil.createFail(Config.MESSAGE, 501, null)); } // 第五步:获取采购单的状态的值 String zt = yycgd.getZt(); // 根据采购单的状态的代码查询该状态对应的名称 String yycgdztmc = systemConfigService.findDictinfoByDictcode("010", zt).getInfo(); // 设置状态名称 yycgdCustom.setYycgdztmc(yycgdztmc); // 返回yycgdCustom对象 return yycgdCustom; } |
3.2 采购单基本信息的提交
/** * 更新采购单基本信息 */ @Override public void updateYycgd(String id, YycgdCustom yycgdCustom) throws Exception { // 从采购单id中获取年份 String year = id.substring(0, 4); // 从数据库查询采购单信息 YycgdCustom yycgdCustom_old = this.findYycgdById(id); //要修改的4个值,参考如下页面: // 向对象设置修改的值 yycgdCustom_old.setLxr(yycgdCustom.getLxr());//设置联系人 yycgdCustom_old.setLxdh(yycgdCustom.getLxdh());//设置联系电话 yycgdCustom_old.setMc(yycgdCustom.getMc());//设置名称 yycgdCustom_old.setBz(yycgdCustom.getBz());// 设置备注信息 // 设置年份 yycgdCustom_old.setBusinessyear(year); /*注意:必须要使用updateByPrimaryKey()方法中来接收对象的参数来实现更新操作 *这点在"mapper接口中的方法调用"一节中已经说的很清楚了! */ yycgdMapper.updateByPrimaryKey(yycgdCustom_old); } |
4 action
采购单修改页面方法:
采购单修改后的提交方法:
5 editcgd.jsp页面
editcgd.jsp页面中的采购单保存js方法:
同时,还需要保hidden的name值为id,此id要与后台的editcgdsubmit(String id ,YycgdQueryVo yycgcgdQueryVo)中的id值保持一致,如下:
6 测试
访问URL:http://localhost:8080/project
使用卫生室身份登录,用户名:cmzcmc 密码:111111
然后,手动在URL中输入地址:localhost:8080/yycgproject/cgd/editcgd.action?id=采购单基本信息表中的一个id号,然后在页面中输入相关的信息后点击保存,如下:
查看数据库中的TTCGD动态表中的某个采购单id中的数据是否正确的输入了进去,如下:
7 采购单修改页面editcgd.jsp的布局和编写
7.1 采购单基本信息部分
表单部分:
editcgd.jsp页面的显示,如下
editcgd.jsp页面的定义,如下:
提交按钮:(js事件 yycgdsubmit()).
保存按钮:(js事件 yycgdsave() ).
7.2购单明细部分
editcg.jsp页面的显示,如下:
包括采购单明细查询条件、采购单明细查询列表,
还包括查询按钮(js事件, yycgdmxquery() ),如下图:
editcg.jsp页面的定义,如下: