今天来了个客户需求,为方便打印最多10列数据,因为是手持端操作不知道数量,所以在修改或者添加时,数据如果超过10列,客户要求自动再分出一个单子来进行方便打印或者查看追溯数据!![客户打印图片](https://img-blog.csdnimg.cn/3190fc079a3943e39874f4d38369684c.jpeg#pic_center)
Map<Integer, List<EpStorePoutMd>> map = new HashMap<>();
if (mdList!=null && mdList.size()>0){
//通过机台分组码单
Map<String, List<EpStorePoutMd>> collect = mdList.stream().collect(Collectors.groupingBy(EpStorePoutMd::getLoomName));
int index = 0;
int coll = 0;
Set<String> keySet = collect.keySet();
for (String key : keySet) {
List<EpStorePoutMd> epStorePoutMds = collect.get(key);
int total = epStorePoutMds.size();
//码单条数/10向上取整获得列数
int keyTotal = total / 10 + (total % 10 == 0 ? 0 : 1);
//epStorePoutMds1:map内已存在码单集合
List<EpStorePoutMd> epStorePoutMds1 = map.get(index);
if (keyTotal+coll<=10){
//如果已循环列数+当前列数小于等于10列 直接添加
coll += keyTotal;
if (epStorePoutMds1==null){
epStorePoutMds1 = epStorePoutMds;
}else {
epStorePoutMds1.addAll(epStorePoutMds);
}
map.put(index,epStorePoutMds1);
}else {
//计算欠缺多少列,进行补全,多余则分单到下一单据
int qq = 10-coll;
//epStorePoutMds3:补全map内码单列数所需码单集合
List<EpStorePoutMd> epStorePoutMds3 = epStorePoutMds.subList(0, qq * 10);
epStorePoutMds1.addAll(epStorePoutMds3);
map.put(index,epStorePoutMds1);
//下一单据
//epStorePoutMds2:补全map内码单列数后剩余码单集合
List<EpStorePoutMd> epStorePoutMds2 = epStorePoutMds.subList(qq * 10, epStorePoutMds.size());
for (int i = 0; i <= epStorePoutMds2.size()/100; i++) {
index+=1;
if(i==epStorePoutMds2.size()/100){
//如果剩余码单小于10列 重新计算列数 并将剩余码单添加到新的单据中
//epStorePoutMds4:剩余不足10列最后码单集合
List<EpStorePoutMd> epStorePoutMds4 = epStorePoutMds2.subList(i * 100, epStorePoutMds2.size());
coll=epStorePoutMds4.size()/10+ (epStorePoutMds4.size() % 10 == 0 ? 0 : 1);
map.put(index,epStorePoutMds2.subList(i * 100, epStorePoutMds2.size()));
}else {
//如果剩余码单超过10列 将100条码单 添加到新的单据中
map.put(index,epStorePoutMds2.subList(i * 100, (i+1)*100));
}
}
}
}
Set<Integer> keySet1 = map.keySet();
int flag = 0;
for (Integer key : keySet1) {
EpStorePoutVo epStorePoutVo = new EpStorePoutVo();
BeanUtils.copyProperties(storePoutVo,epStorePoutVo);
epStorePoutVo.setMdList(map.get(key));
if (flag!=0){
epStorePoutVo.setId("");
}
addOrEdit(epStorePoutVo);
flag++;
}
}else {
addOrEdit(storePoutVo);
}
首先 通过机台进行分组 进行循环 如果满10列就新开辟一个单据,如果当前码单不满一列 更换机台时,也要另起一列,然后进行添加/编辑