培训day07(新增回写和新增保存校验)
1.新增放款单的数量字段回写合同的累计放款单数量字段(InsertSaveWriteBackRule.java)
public class InsertSaveWriteBackRule implements IRule<AggYhlypxhtfkdVO>{
@Override
public void process(AggYhlypxhtfkdVO[] aggvos) {
// TODO 自动生成的方法存根
for (int i = 0; i < aggvos.length; i++) {
try {
//放款单新增保存回写合同累计数量
insertSaveWrite(aggvos[i]);
} catch (BusinessException e) {
// TODO 自动生成的 catch 块
ExceptionUtils.wrappBusinessException("保存回写出错:"+ e.getMessage());
}
}
}
//放款单新增保存回写合同累计数量
private void insertSaveWrite(AggYhlypxhtfkdVO aggvo) throws BusinessException{
//通过合同号获取主表主键
String pk_dkht = NullValueUtils.getNullStringValue(aggvo.getParentVO().getHth());
//判断合同主表主键是否为空
if(!pk_dkht.equals("")){
//获取放款单表体
YhlypxhtfkBVO[] bvos = (YhlypxhtfkBVO[])aggvo.getChildren(YhlypxhtfkBVO.class);
//如果放款单表体有数据
if(bvos != null && bvos.length > 0){
//获取合同主表主键
//创建HashMap集合对象并指定泛型为String
Map<String, UFDouble> map = new HashMap<String, UFDouble>();
//循环遍历放款单子表
for (int i = 0; i < bvos.length; i++) {
//key存来源单据子表主键 ,value存数量
map.put(bvos[i].getCsrcbid(), bvos[i].getNnum());
}
//创建billQuery查询合同对象
BillQuery<AggYhlypxdkhtVO> billQuery = new BillQuery<AggYhlypxdkhtVO> (AggYhlypxdkhtVO.class);
//根据合同主表主键查询合同Aggvo
AggYhlypxdkhtVO[] aggvos = billQuery.query(new String[] { pk_dkht });
//克隆aggvo
AggYhlypxdkhtVO clonevo = (AggYhlypxdkhtVO) aggvos[0].clone();
//获取合同子表
YhlypxdkhtBVO[] itemvos = (YhlypxdkhtBVO[]) clonevo.getChildren(YhlypxdkhtBVO .class);
//循环遍历合同子表
for (int i = 0; i < itemvos.length; i++) {
//判断Map集合对象中是否包含指定的键名
if(map.containsKey(itemvos[i].getPk_dkht_b())){
//给合同子表所有行的合同累计数量字段赋值 itemvos[i].getDef1():获取合同累计放款单数量的值 map.get(itemvos[i].getPk_dkht_b()):获取合同子表主键所映射的值
itemvos[i].setDef1(NullValueUtils.getNullStringValue(NullValueUtils.getNullUFdoubleValue(itemvos[i].getDef1()).add(map.get(itemvos[i].getPk_dkht_b()))));
//将合同子表所有行的VOStatus的状态赋值为更新态
itemvos[i].setStatus(VOStatus.UPDATED);
}
}
//调用合同修改接口
getService().update(new AggYhlypxdkhtVO[]{clonevo}, aggvos);
}
}
}
//要修改哪个单子调哪个单子的接口
private IYhlypxdkhtMaintain service;
private IYhlypxdkhtMaintain getService(){
if (service == null) {
service = NCLocator.getInstance().lookup(IYhlypxdkhtMaintain.class);
}
return service;
}
}
2.保存校验输入数量字段的值是否合法(InsertBeforeRule.java)
public class InsertBeforeRule implements IRule<AggYhlypxhtfkdVO>{
@Override
public void process(AggYhlypxhtfkdVO[] aggvos) {
for (int i = 0; i < aggvos.length; i++) {
try {
//表体数量汇总表头
saveSum(aggvos[i]);
//保存校验累计放款单数量不能超过合同表体数量
saveCheck(aggvos[i]);
} catch (BusinessException e) {
//
ExceptionUtils.wrappBusinessException(e.getMessage());
}
}
}
/**
* @desc:表体数量汇总表头
* @author: hh
* @date : 2023-03-08
*/
private void saveSum(AggYhlypxhtfkdVO aggvo) throws BusinessException{
//通过aggvo获取表体
YhlypxhtfkBVO[] bvos = (YhlypxhtfkBVO[]) aggvo.getChildren(YhlypxhtfkBVO.class);
//[]这种情况不为空,但是不能进入循环,所以还要加上bvos.length > 0这个条件
if(bvos != null && bvos.length > 0){
//定义一个求和变量,初始化为0
UFDouble sum = UFDouble.ZERO_DBL;
//遍历表体
for (int i = 0; i < bvos.length; i++) {
//累加数量
sum = sum.add(bvos[i].getNnum());
}
//把累加数量赋值给表头的放款金额本币字段
aggvo.getParentVO().setSumnum(sum);
}
}
/**
* @desc:累计放款单数量不能超过合同表体数量
* @author: hh
* @date : 2023-03-08
*/
private void saveCheck(AggYhlypxhtfkdVO aggvo) throws BusinessException{
//获取放款单子表
YhlypxhtfkBVO[] bvos = (YhlypxhtfkBVO[]) aggvo.getChildren(YhlypxhtfkBVO.class);
//如果放款单子表有数据
if(bvos != null && bvos.length > 0){ //bvos != null是为了防止哪种情况发生???
//创建ArrayList集合对象并指定泛型为String,存储放款单子表来源单据子表主键
List<String> csrcbidList =new ArrayList<String>(); //最前面为什么用List<String>,而不是用ArrayList<String>???
//遍历放款单表体
for (int i = 0; i < bvos.length; i++) {
//放款单子表的来源单据子表主键存到csrcbidList
csrcbidList.add(bvos[i].getCsrcbid());
}
//SqlBuilder():sql语句构造器,方便拼写sql,减少不比要的错误
SqlBuilder sql = new SqlBuilder();
sql.append(" select num, def1, pk_dkht_b ");
sql.append(" from yhly_yhlypxdkht_b ");
sql.append(" where nvl(dr, 0) = 0 ");
sql.append(" and pk_dkht_b ",csrcbidList.toArray(new String[0])); //list.toArray(new String[0]):返回集合中所有元素的一个数组表示形式
//把数据库查到的合同子表的多行多列数据按行赋值给list集合
List<Object[]> list = (List<Object[]>) new BaseDAO().executeQuery(sql.toString(), new ArrayListProcessor());//怎么分析这句???
//如果数据库查到数据
if(list.size() > 0 && list !=null){
//创建ArrayList集合对象crownoList并指定泛型为String,存储放款单子表来源单据行号
List<String> crownoList = new ArrayList<String>();
//foreach循环list的每行数据
for(Object[] objects:list){ //for(容器中元素类型 临时变量 : 容器变量)
//遍历放款单子表
for(int i = 0; i < bvos.length; i++){
//放款单子表数量
UFDouble num = NullValueUtils.getNullUFdoubleValue(objects[0]);
//累计放款单数量
UFDouble def1 = NullValueUtils.getNullUFdoubleValue(objects[1]);
//合同子表主键
String pk_dkht_b = NullValueUtils.getNullStringValue(objects[2]);
//放款单子表行号
String rowno = bvos[i].getRowno();
//如果放款单来源单据子表主键等于合同子表主键:实现对应行相加
if(bvos[i].getCsrcbid().equals(pk_dkht_b)){
//合同累计放款单数量 = 合同子表累计放款单数量 + 放款单数量
UFDouble sumdef1 = def1.add(bvos[i].getNnum());//这里是bvos[i].getNnum(),而不是num
//如果合同累计放款单数量大于放款单子表数量
if(sumdef1.compareTo(num) > 0){
//crownoList存储合同累计放款单数量大于放款单数量的行的行号
crownoList.add(rowno);
}
}
}
}
//crownoList存储了合同累计放款单数量大于放款单数量的行的行号
if(crownoList.size() > 0){
//抛出保存失败,并提示哪行有问题 StringUtils.join(任意类型数组或集合,拼接符):将集合或数组以某拼接符拼接到一起形成新的字符串 list.toArray(new String[0]):返回集合中所有元素的一个数组表示形式
throw new BusinessException("保存失败,累计放款单数量大于贷款合同表体数量,行号为"+ StringUtils.join(crownoList.toArray(new String[0]), ","));
}
}
}
}
//获取数据库查询出来的数据要用到的方法
private BaseDAO dao;
private BaseDAO getDao() {
if(dao == null) {
dao = new BaseDAO();
}
return dao;
}
}
注意:一定是先写1,后写2,因为2要在1回写的基础上才能检验。
3.修改新增引用规则(AceYhlypxfkdInsertBP.java)
在新增 前规则中加上processer.addBeforeRule(new InsertSaveWriteBackRule());