评审编号跳号问题

在做项目过程中遇到一个奇怪的需求,相关的申报成果在初审通过后还有复审,复审通过后给相关成果按组编号,编号不能跳号,要按照顺序来。按道理来说,复审通过后其编号就定了,需求方竟然说复审通过后还有可能退回,那么这个成果的编号是否保留就成了一个问题了。如果说退回的成果编号不保留,那么就存在跳号问题;如果退回的成果编号保留,那么需求方又不能保证这个成果一定能通过复审,也存在跳号问题。

     先不谈需求方业务方面的问题,这个跳号问题本来就可以人为的避免,只要在复审时认真一点就完全可以避免。那么为了满足需求方解决这个跳号问题,我在编号时采取遍历所有编号,然后找出第一个缺号的,那么这个号码就是可用编号。如果没有缺号的就直接在最大号码上加一。

对于每一复审的成果,如果该成果通过复审,那么就直接寻找可用编号;如果通过复审的成果再次复审为不通过,那么将该复审成果编号丢弃置为null;如果同一成果多次复审为通过,那么沿用原来的编号。

    寻找可用编号的方法是:首先在数据库中根据该成果找出其对应的组别和申报年份,然后根据申报年份和组别找出该组的所有编号,把这些编号映射为数组并把相应的位的元素置1,那么找到第一个为0的位置其下标就是可用编号

@Transactional
	public String generateAuditNumber1(String entityId) {
		
		int size =3;//编码为三位数
		
		int avaliableNumber  =0;//可用编号
		
		List<String> numbers =null;
		try {
			String hql1 = "select pd.groupName,pd.applyYear from Product pd where pd.id=:id ";//找出该成果所属的组别和申报年份
			
			String hql2 = "select p.reviewNumber from Product p where p.groupName =:groupName and p.applyYear=:applyYear and p.reviewNumber is not null order by  p.reviewNumber";
			Map map = new HashMap();
			map.put("id", entityId);
			List list = dao.query(hql1,map);
			Object[] item = null;
			for(Object data :list){
				
				item = (Object[]) data;
			}
			
			
			map.clear();
			map.put("groupName", item[0].toString());
			map.put("applyYear", item[1].toString());
			numbers = dao.query(hql2,map);//找出该成果所属的组别和申报年份中已经有复审编号的
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
		if(numbers==null||numbers.size()==0){
			avaliableNumber =1;
		}else{
			
			avaliableNumber = avaliableNumber(numbers);//找出可用编号
			
		}
		
		
		int len = Integer.toString(avaliableNumber).length();
		StringBuffer s = new StringBuffer();
		for(int i=0;i<size-len;i++){
			s.append(0);
		}
		s.append(avaliableNumber);
		
		return s.toString();
	}


/**
	 * 采用hsahMap的映射思想,将序号映射为数组下标,找到第一个为0 的元素即为可用元素(除首位)
	 * @param numbers
	 * @return
	 */
	private int avaliableNumber(List<String> numbers){
		
		
		String last = numbers.get(numbers.size()-1);
		int length = Integer.parseInt(last);
		int [] array = new int[length+2];//此处多分配两个位置,首位和末尾为0.第一个为0的下标为可用序列
		int index=0;
		
		//将成果编号映射到数组中
		for(String num : numbers){
			index = Integer.parseInt(num);
			array[index]=1;
		}
		
		//找出第一个元素为0的下标,即为可用编号
		for(int i=1;i<length+2;i++){
			if(array[i]==0){
				index=i;
				break;
			}
		}
		
		return index;
		
	}


 if(account.getType()==2 || account.getType() ==1){//社科联审核
			//能够走到这个流程表明,高校审核通过或为非高校申报成果
			if(result.equals("1")){
				product.setHsasApplyAuditResult(1);
				product.setHsasApplyAuditOpinion("省社科联初审未通过!"+opinion);
				product.setStatus(3);
				
				if(number!=null){
					product.setReviewNumber(null);
				}
			} else if(result.equals("2")){
				product.setHsasApplyAuditResult(2);
				product.setHsasApplyAuditOpinion("省社科联初审通过!"+opinion);
				//product.setReviewNumber(generateAuditNumber(productId));
				product.setStatus(4);
				if(number==null){
					product.setReviewNumber(generateAuditNumber1(productId));
				}
			}else if(result.equals("3")){
				product.setHsasApplyAuditOpinion("退回!"+opinion);
				product.setHsasApplyAuditResult(3);
				product.setSubmitStatus(3);
				product.setStatus(3);
				
				if(number!=null){
					product.setReviewNumber(null);
				}
				
				sendMail(product, 3,opinion);
			}
			else {
				product.setHsasApplyAuditResult(0);
			}

这样就完美的解决了跳号问题,无论是复审通过后审退回,或是多次复审,或是多次复审不通过。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值