//公式:最高库存 = 前一天最高库存 - 前一天出库量 + 当天入库量。
/**
*
* all查询
*
* 求解最高期初库存,最高期末库存
* 并且报记录更新到数据库中
*
*/
public List getHighStore() {
List list0 = this.getAllList();//完整有序的数据源
List dataList = new ArrayList<Afulldata>();//计算后的list
String combine="";//第一次对象的条件
String combine1="";//当次操作的条件
String combine2="";//下一次操作的条件
Afulldata obj1 = new Afulldata();//当次操作的某对象
Afulldata obj0 = new Afulldata();//前一次操作的某对象
Afulldata obj2 = new Afulldata();//下一次操作的某对象
double thisBeforeMax =0;//计算中间值:当次最高期初
double thisAfterMax =0;//计算中间值:当次最高期末
double exBeforeMax =0;//计算中间值:前一次最高期初
double exAfterMax =0;//计算中间值:前一次最高期末
for(int i=0;i<list0.size()-1;i++){
obj1 = (Afulldata)list0.get(i);//当次操作的某对象i
//当次的条件
combine1 = obj1.getCompanyname()+obj1.getHousename()+obj1.getProductName()+obj1.getProductBrand()+obj1.getProductType()+obj1.getProductPackage();
//下标i-1,i,i+1
//如果相等,则表示obj0,obj和obj1是同一对象的操作
if(combine.equals(combine1)){
thisBeforeMax=exAfterMax;//当次最高期初=前一次最高期末
obj0=(Afulldata)list0.get(i-1);//前一次对象
//当天的最高期初+当天的入库量=当天的最高期末库存
thisAfterMax=thisBeforeMax+Double.valueOf(this.obtain(obj1, "in"))-Double.valueOf(this.obtain(obj0, "out"));
//前一次操作的日期 != 当次操作的日期,那么,当次的最高期初=前一次的最高期末
if(!(obj0.getInhousedate().equals(obj1.getInhousedate()))){
//同一对象不同一天的操作产生的最高期初库存:最高期初库存=前一次操作的最高期末库存
obj1.setBeforestoremax2(String.valueOf(CalculateUtil.round(thisBeforeMax,4)));
}
//前一次操作的日期 = 当次操作的日期,那么,当次的最高期初=0.0
if(obj0.getInhousedate().equals(obj1.getInhousedate())){
//同一对象同一天第n(n>1)次操作产生的最高期初库存:0.0
obj1.setBeforestoremax2("0.0");
}
obj2=(Afulldata)list0.get(i+1);//下一次对象
//下一次条件
combine2=obj2.getCompanyname()+obj2.getHousename()+obj2.getProductName()+obj2.getProductBrand()+obj2.getProductType()+obj2.getProductPackage();
//不同一天的操作
if(!(obj2.getInhousedate().equals(obj1.getInhousedate()))){
obj1.setStoreamount2(String.valueOf(CalculateUtil.round(thisAfterMax,4)));
}else{//同一天的操作
obj1.setStoreamount2("0.0");
}
dataList.add(obj1);//保存当次的操作对象
//传递记录
exBeforeMax=thisBeforeMax;
exAfterMax=thisAfterMax;
//如果i+1是lis0的最大下标,重点对这个最后一次进行计算:obj2
if(i+1==list0.size()-1){
//如果是同一对象
if(combine2.equals(combine1)){
//如果是同一天
if(obj2.getInhousedate().equals(obj1.getInhousedate())){
//最高期初为0
obj2.setBeforestoremax2("0.0");
thisBeforeMax=exAfterMax;//当次最高期初=前一次最高期末
thisAfterMax=thisBeforeMax+Double.valueOf(this.obtain(obj2, "in"))-Double.valueOf(this.obtain(obj1, "out"));
//最高期末库存:
obj2.setStoreamount2(String.valueOf(CalculateUtil.round(thisAfterMax,4)));
}else{//不同一天
//最高期初
thisBeforeMax=exAfterMax;//当次最高期初=前一次最高期末
obj2.setBeforestoremax2(String.valueOf(thisBeforeMax));
thisAfterMax=thisBeforeMax+Double.valueOf(this.obtain(obj2, "in"))-Double.valueOf(this.obtain(obj1, "out"));
//最高期末库存:
obj2.setStoreamount2(String.valueOf(CalculateUtil.round(thisAfterMax,4)));
}
}
//如果不同对象
if(!(combine2.equals(combine1))){
//最高期初
thisBeforeMax=exAfterMax;//当次最高期初=前一次最高期末
obj2.setBeforestoremax2(String.valueOf(thisBeforeMax));
//最高期末
thisAfterMax=thisBeforeMax+Double.valueOf(this.obtain(obj2, "in"));
obj2.setStoreamount2(String.valueOf(CalculateUtil.round(thisAfterMax,4)));
}
dataList.add(obj2);//保存下一次的操作对象
break;
}
}
//下标:i,i+1
//如果不等,则表示obj和obj1是不同对象
if(!(combine.equals(combine1))){
//第一次对象第一天第一次操作产生的最高期初库存:最高期初库存=实际期末库存-入库量+出库量
obj1.setBeforestoremax2(obj1.getBeforestore());
thisBeforeMax=Double.valueOf(obj1.getBeforestore());//记录当次最高期初
//下一次的操作对象
obj2=((Afulldata)list0.get(i+1));
//下一次条件
combine2=obj2.getCompanyname()+obj2.getHousename()+obj2.getProductName()+obj2.getProductBrand()+obj2.getProductType()+obj2.getProductPackage();
//最后一次操作定义:当次同一对象操作的日期和下一次同一对象操作的日期不同就表示最后一次了,还有一种就是下一次操作不是同一对象。
//如果是最后一次操作
if((!(obj1.getInhousedate().equals(obj2.getInhousedate())) && combine1.equals(combine2)) || !(combine1.equals(combine2))){
//最高期末库存:最高期末=最高期初+入库量
obj1.setStoreamount2(String.valueOf(CalculateUtil.round(Double.valueOf(obj1.getBeforestoremax2())+Double.valueOf(this.obtain(obj1, "in")),4)));
thisAfterMax=Double.valueOf(obj1.getStoreamount2());//记录当次最高期末
}else{
//如果不是最后一次操作,那么默认最高期末库存为0
obj1.setStoreamount2("0.0");
thisAfterMax=thisBeforeMax+Double.valueOf(this.obtain(obj1, "in"));//记录当次最高期末
}
dataList.add(obj1);
//传递记录
exBeforeMax=thisBeforeMax;
exAfterMax=thisAfterMax;
//如果i+1是lis0的最大下标,重点对这个最后一次进行计算:obj2
if(i+1==list0.size()-1){
//如果是同一对象
if(combine2.equals(combine1)){
//如果是同一天
if(obj2.getInhousedate().equals(obj1.getInhousedate())){
//最高期初为0
obj2.setBeforestoremax2("0.0");
thisBeforeMax=exAfterMax;//当次最高期初=前一次最高期末
thisAfterMax=thisBeforeMax+Double.valueOf(this.obtain(obj2, "in"))-Double.valueOf(this.obtain(obj1, "out"));
//最高期末库存:
obj2.setStoreamount2(String.valueOf(CalculateUtil.round(thisAfterMax,4)));
}else{//不同一天
//最高期初
thisBeforeMax=exAfterMax;//当次最高期初=前一次最高期末
obj2.setBeforestoremax2(String.valueOf(thisBeforeMax));
thisAfterMax=thisBeforeMax+Double.valueOf(this.obtain(obj2, "in"))-Double.valueOf(this.obtain(obj1, "out"));
//最高期末库存:
obj2.setStoreamount2(String.valueOf(CalculateUtil.round(thisAfterMax,4)));
}
}
//如果不同对象
if(!(combine2.equals(combine1))){
//最高期初
thisBeforeMax=exAfterMax;//当次最高期初=前一次最高期末
obj2.setBeforestoremax2(String.valueOf(thisBeforeMax));
//最高期末
thisAfterMax=thisBeforeMax+Double.valueOf(this.obtain(obj2, "in"));
obj2.setStoreamount2(String.valueOf(CalculateUtil.round(thisAfterMax,4)));
}
dataList.add(obj2);//保存下一次的操作对象
break;
}
combine=combine1;//把新的条件传递给第一次
}
}
this.getCommonDAO().batchuUpdate(dataList);//批量更新数据
return dataList;
}
/**
* hql
* 查询list
*/
public List getAllList() {
//基础语句
String hql0 = "select o from Afulldata o where 1=1 ";
hql0 += " order by o.companyname asc,o.housename asc,o.productName,o.productBrand asc,o.productType asc,o.productPackage asc," +
"o.inhousedate asc,o.id,o.inhouseno asc,o.outhouseno asc,o.companyhome";
//查询出数据字段
List list0 = this.getCommonDAO().list(hql0);
return list0;
}