培训day07(新增回写和新增保存校验)

培训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());

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

和安韩Pro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值