医药采购系统平台第7天02:创建采购单的基本信息&使用Oracle序列动态的生成采购单编号&采购单基本信息的修改和提交实现

发布于:2025-04-15 ⋅ 阅读:(36) ⋅ 点赞:(0)

如果想要获取相关的源码,笔记,和相关工具,对项目需求的二次开发,可以关注我并私信!!!


四 创建采购单的基本信息

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页面的定义,如下: