在做项目过程中遇到一个奇怪的需求,相关的申报成果在初审通过后还有复审,复审通过后给相关成果按组编号,编号不能跳号,要按照顺序来。按道理来说,复审通过后其编号就定了,需求方竟然说复审通过后还有可能退回,那么这个成果的编号是否保留就成了一个问题了。如果说退回的成果编号不保留,那么就存在跳号问题;如果退回的成果编号保留,那么需求方又不能保证这个成果一定能通过复审,也存在跳号问题。
先不谈需求方业务方面的问题,这个跳号问题本来就可以人为的避免,只要在复审时认真一点就完全可以避免。那么为了满足需求方解决这个跳号问题,我在编号时采取遍历所有编号,然后找出第一个缺号的,那么这个号码就是可用编号。如果没有缺号的就直接在最大号码上加一。
对于每一复审的成果,如果该成果通过复审,那么就直接寻找可用编号;如果通过复审的成果再次复审为不通过,那么将该复审成果编号丢弃置为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);
}
这样就完美的解决了跳号问题,无论是复审通过后审退回,或是多次复审,或是多次复审不通过。