1.1 供货商药品目录添加提交
批量添加实现
页面提交数据至action
页面提交数据:
药品信息id(多个)
Action接收批量提交的数据
Action使用List<pojo>接收页面提交的批量数据
供货商药品目录添加service
insertGysypml(Stringusergysid,String ypxxid)
service方法实现:
添加供货商药品目录表
添加供货商供货控制表
思考:
此添加为批量添加,为什么不在向该方法传递一个列表?
为了方便的进行批量添加统计成功数量、失败数量及失败原因等信息,通常定义serivce方法只对一条记录进行操作,由action分别对每一条业务数据调用service接口去处理,如果service方法对多个业务数据执行批量处理,当有一个业务数据处理失败时,在不作特殊处理的情况下整个事务就回滚了从而导致所有业务数据执行失败。
action实现
批量提交方法步骤:
1、 页面设置indexs变量,记录列表中选中的记录序号
2、 页面设置需要提交的业务参数,比如:ypxxid(药品信息id)
3、 通过List<对象>接收页面提交的业务参数
4、 循环处理每个提交的对象
5、 统计提交成功及失败数量
6、 记录失败原因
7、 通过ResultUtil.createSubmitResult方法构造返回页面的提示信息,其中将失败原因列表传回页面。
1.1.1 需求
用户在供货商药品目录添加查询页面,选择多个药品,确认添加。
前置条件(约束条件):
只允许添加供货商药品目录中没有的药品
药品的交易状态为暂停不允许添加
后置条件(数据库操作):
向供货商药品目录表gysypml插入一条记录
同时向供货商药品目录控制表gysypml_control插入一条记录
页面操作:
用户需要选择多个药品,进行批量添加。
批量添加技术测试
Service接口:完成添加操作
接收多条记录还是单条记录??
如果接收多条记录,处理多条记录,如果不在service接口进行异常处理,导致一条记录添加失败其它记录回滚。
批量添加失败,需要给用户提示失败原因(多个失败原因),给用户提示应该在action 实现。
采用方案:
Service接口只处理一条记录,在action方法内通过循环调用service批量处理,action就可以灵活组织给用户提示信息,在service接口开发,遇到异常只管抛出。
问题在于:
Action接收多条数据?
需要采用springmvc让页面向action传递批量数据,action方法采用list接收。
在包装对象中添加list属性。
public class GysypmlQueryVo {
// 用于药品目录的批量添加
private List<YpxxCustom> ypxxCustoms;
页面定义:
l 业务数据的定义:
List属性名[序号从0开始].属性(list中pojo的属性名)
本系统采用action方法使用list接收页面提交批量数据,list中是自定义的pojo
页面提交业务数据如下:
l 页面选中行的序号定义
详细代码:
//定义一个数组,准备存放选中行的序号
var indexs=[];
//获取数据列表中所有选中的行(数组),要求datagrid属性idField设置正确
var rows =dataGrid_obj.datagrid('getSelections');
//便利所有选中的行
for(vari=0;i<rows.length;i++){
//alert(dataGrid_obj.datagrid('getRowIndex',rows[i]));
//将返回的选中行的序号加到indexs数组中
var index =dataGrid_obj.datagrid('getRowIndex',rows[i]);//选中行的下标
//将选中行的序号设置到数组indexs中
indexs.push(index);
//alert(dataGrid_obj.datagrid('getRowIndex',rows[i]));
}
//判断如果存在选中的行,indexs数组里边有选中行的序号
if(rows.length>0){//如果存在选中的行则将indexs数组中的序号格式化为逗号分隔的并赋给indexs控件
$("#indexs").val(indexs.join(","));//将indexs数组的元素在中间加逗号拼接成一个字符串
//提交form,提交数据包括药品信息id(每条记录都有),indexs(hidden)
jquerySubByFId('gysypmladdqueryForm',gysypmladd_callback,null);
}else{
//如果没有选中行则提示
alert_warn("请选择要添加的药品");
}
1.1.2 实现
1.1.2.1 Dao:
使用逆向工程生成的代码完成记录插入。
1.1.2.2 service:
处理单条记录。
接口功能:向供货商药品目录添加一个药品
接口参数:供货商id、药品id
方法代码如下
// 供货商添加一条药品
public void insertGysypml(Stringusergysid, String ypxxid) throws Exception {
// 只允许添加供货商药品目录中没有的药品(其实提供的药品添加目录中都已经取消了自身供应的药品)
// 校验方法:先根据供货商id和药品id查询供货商药品目录记录,如果查询到说明已存在
Gysypmlgysypml = this.findGysypmlByUsergysidAndYpxxid(usergysid,
ypxxid);
if (gysypml != null) {
// 说明已存在
ResultUtil.throwExcepion(ResultUtil.createFail(Config.MESSAGE, 401,
null));
}
// 根据药品id查询药品信息
Ypxxypxx = ypxxMapper.selectByPrimaryKey(ypxxid);
if (ypxx == null) {// 药品信息错误
ResultUtil.throwExcepion(ResultUtil.createFail(Config.MESSAGE, 401,
null));
}
// 药品的交易状态为暂停不允许添加
Stringypjyzt = ypxx.getJyzt();
if (ypjyzt.equals("2")) {
ResultUtil.throwExcepion(ResultUtil.createFail(Config.MESSAGE, 403,
new Object[] {ypxx.getBm(), ypxx.getMc() }));
}
Gysypmlgysypml2 = newGysypml();
gysypml2.setId(UUIDBuild.getUUID());
gysypml2.setUsergysid(usergysid);
gysypml2.setYpxxid(ypxxid);
// 添加一个药品到供应商药品目录
gysypmlMapper.insert(gysypml2);
// 同时向供货商药品目录控制表gysypml_control插入一条记录
// 如果控制表已存在供货商药品不用插入
// 根据供货商id和药品id查询
GysypmlControlgysypmlControl=this.findGysypmlControlByUsergysidAndYpxxid(usergysid,ypxxid);
if(gysypmlControl==null)
{
//从系统参数配置表获取控制状态的默认值
Stringcontrol =systemConfigService.findBasicinfoById("00101").getValue();
GysypmlControlgysypmlControl2=newGysypmlControl();
gysypmlControl2.setId(UUIDBuild.getUUID());
gysypmlControl2.setUsergysid(usergysid);
gysypmlControl2.setYpxxid(ypxxid);
gysypmlControl2.setControl(control);//控制状态,采用默认值,默认值从系统参数配置表中获取
gysypmlControlMapper.insert(gysypmlControl2);
}
}
// 抽取方法通过usergysid和ypxxid来查询gysypml是否存在 (添加一条药品用到)
public GysypmlfindGysypmlByUsergysidAndYpxxid(String usergysid,
Stringypxxid) throwsException {
GysypmlExamplegysypmlExample = newGysypmlExample();
GysypmlExample.Criteriacriteria = gysypmlExample.createCriteria();
criteria.andUsergysidEqualTo(usergysid);
criteria.andYpxxidEqualTo(ypxxid);
List<Gysypml>list = gysypmlMapper.selectByExample(gysypmlExample);
if (list != null && list.size()== 1) {
return list.get(0);
}
return null;
}
// 抽取方法通过usergysid和ypxxid来查询gysypml是否存在 (添加一条药品用到)
public GysypmlControlfindGysypmlControlByUsergysidAndYpxxid(
Stringusergysid, String ypxxid) throws Exception {
GysypmlControlExamplegysypmlControlExample = new GysypmlControlExample();
GysypmlControlExample.Criteriacriteria = gysypmlControlExample
.createCriteria();
criteria.andUsergysidEqualTo(usergysid);
criteria.andYpxxidEqualTo(ypxxid);
List<GysypmlControl>list = gysypmlControlMapper
.selectByExample(gysypmlControlExample);
if (list != null && list.size()== 1) {
return list.get(0);
}
return null;
}
1.1.2.3 action
批量提交参数:
Usergysid:供货商id、(单个,从session中取)
Ypxxid:药品id(多个参数),提交到list中。 要注意异常信息的捕获。还有是否是自定义信息的判断
// 供应商药品信息批量添加
@RequestMapping("/addgysypmlsubmit")
public @ResponseBody
SubmitResultInfoaddgysypmlsubmit(HttpSession session, int[] indexs,
GysypmlQueryVogysypmlQueryVo) throwsException {
// 获取供应商id
ActiveUseractiveUser = (ActiveUser) session
.getAttribute(Config.ACTIVEUSER_KEY);
// 当前用户所属单位即供货商的id
Stringusergysid = activeUser.getSysid();
// 获取药品id
// 页面提交的业务数据(多个),要处理的业务数据,页面中传入的参数
List<YpxxCustom>list = gysypmlQueryVo.getYpxxCustoms();
// 处理数据的总数
int count = indexs.length;
// 处理成功的数量
int count_success = 0;
// 处理失败的数量
int count_error = 0;
// 处理失败的原因
List<ResultInfo>msgs_error = newArrayList<ResultInfo>();
for (int i = 0; i < count;i++) {
// 定义异常信息
ResultInforesultInfo = null;
// 根据选中行的序号获取要处理的业务数据(单个)
YpxxCustomypxxCustom = list.get(indexs[i]);
Stringypxxid = ypxxCustom.getId();// 页面中传入的参数
try {
ypmlService.insertGysypml(usergysid,ypxxid);
}catch(Exception e) {
e.printStackTrace();
// 进行异常解析
if (e instanceofExceptionResultInfo) {// 自定义异常
resultInfo= ((ExceptionResultInfo) e).getResultInfo();
}else{
resultInfo= ResultUtil.createFail(Config.MESSAGE, 900,
null);
}
}
if (resultInfo == null) {// 执行成功
count_success++;
}else{
count_error++;
// 记录失败的原因
msgs_error.add(resultInfo);
}
}
// 提示用户成功数量、失败数量、失败原因
return ResultUtil.createSubmitResult(// 并返回详细信息
ResultUtil.createSuccess(Config.MESSAGE, 907, new Object[] {
count_success,count_error++ }), msgs_error);
}
1.1.2.4 页面
用户点击“确认添加”,
1 调用datagrid的getSelections获得所有选中的行,将选中行的序号解析出来,以逗号拼接存入indexs的input中。
供货商药品目录添加调试
1.1.3.1 失败原因展示问题:
将提交回调方法中message_alert(data);改为:_alert(data)方法
注意:在service抛出异常信息时,尽量详细!!!
1.1.3.2 只允许提交当前页的数据
如果在上一页选中记录,再翻页,再选中,提交出现-1: