diff --git a/src/main/java/com/dev/swms/server/service/shipping/pojo/DefaultNewWaveManager.java b/src/main/java/com/dev/swms/server/service/shipping/pojo/DefaultNewWaveManager.java index 62bea58..27d5360 100644 --- a/src/main/java/com/dev/swms/server/service/shipping/pojo/DefaultNewWaveManager.java +++ b/src/main/java/com/dev/swms/server/service/shipping/pojo/DefaultNewWaveManager.java @@ -12,6 +12,7 @@ import java.util.Map; import java.util.Set; import net.sf.json.JSONObject; +import net.sf.json.util.JSONUtils; import org.hibernate.Query; import org.hibernate.Session; @@ -23,8 +24,11 @@ import com.dev.swms.server.model.inventory.Task; import com.dev.swms.server.model.receiving.LibraryTaskType.classification; import com.dev.swms.server.model.shipping.NewWaveFlag; import com.dev.swms.server.model.shipping.WaveDoc; +import com.dev.swms.server.service.interfaceLog.JsonUtil; import com.dev.swms.server.service.shipping.NewWaveManager; import com.dev.swms.server.utils.interfaceUtil; +import com.itextpdf.text.pdf.PdfStructTreeController.returnType; +import com.sun.org.apache.bcel.internal.classfile.Code; import org.apache.log4j.Logger; @@ -36,8 +40,8 @@ public class DefaultNewWaveManager extends DefaultBaseManager implements public void allocateGZZ(List ids) { for (Long id : ids) { WaveDoc waveDoc = commonDao.get(WaveDoc.class, id); - ShiXiao lx_sx = kqShiXiao(NewWaveFlag.LKQ); - ShiXiao hj_sx = kqShiXiao(NewWaveFlag.LKQ); + ShiXiao lx_sx = kqShiXiao(NewWaveFlag.LXQ); + ShiXiao hj_sx = kqShiXiao(NewWaveFlag.HJQ); ShiXiao lk_sx = kqShiXiao(NewWaveFlag.LKQ); // 得到工作站剩余任务行数 List lx_codes = getGzzCodes(NewWaveFlag.LXQ);// 自动创波工作站 @@ -59,7 +63,7 @@ public class DefaultNewWaveManager extends DefaultBaseManager implements lkCount +=maps.get(code)==null?0:maps.get(code); } - allocateGZZ(waveDoc.getCode(), NewWaveFlag.LKQ, lx_codes, + allocateGZZ(waveDoc.getCode(), NewWaveFlag.LXQ, lx_codes, (int) lx_sx.getTaskD(), (int) lx_sx.getNumber(), lxCount, maps); allocateGZZ(waveDoc.getCode(), NewWaveFlag.HJQ, hj_codes, @@ -121,7 +125,7 @@ public class DefaultNewWaveManager extends DefaultBaseManager implements logger.info(sql); Query query = session.createSQLQuery(sql); List list = (List) query.list(); - int dataSize = list.size(); + int GongDan_wuLiaoMingXiCout = list.size(); List list_fenpei = new ArrayList(); List list_fenpei_wgzz = new ArrayList();// 无需分配工作站数据 @@ -171,44 +175,75 @@ public class DefaultNewWaveManager extends DefaultBaseManager implements // 1100382814A X8001315 A0101 A 3#料箱区 kanban 512-00004567-F04A // 1100382814A X8001315 A0102 A 3#料箱区 kanban 512-00004567-F04A - // 计算同一工单总行数。 - Map> gdCount = new HashMap<>(); + // 根据(工单号+物料类型)分组 + Map> GongDan_WuLiao_Map = new HashMap<>(); - for (FenPei fenPei : list_fenpei) { - String key_gd_wl = fenPei.gdh + fenPei.wllx; - if (((java.util.Map) gdCount).containsKey(key_gd_wl)) { - List list_count = gdCount.get(key_gd_wl); + Listlist_fen=Paixu(list_fenpei); + + for (FenPei fenPei : list_fen) { + + String GongDan_WuLiao = fenPei.gdh + fenPei.wllx+fenPei.chf_fz; + if (((java.util.Map) GongDan_WuLiao_Map).containsKey(GongDan_WuLiao)) { + List list_count = GongDan_WuLiao_Map.get(GongDan_WuLiao); list_count.add(fenPei); - gdCount.put(key_gd_wl, list_count); + GongDan_WuLiao_Map.put(GongDan_WuLiao, list_count); } else { List list_count = new ArrayList(); list_count.add(fenPei); - gdCount.put(key_gd_wl, list_count); + GongDan_WuLiao_Map.put(GongDan_WuLiao, list_count); } } - int sumCout = 0; + + + //打印第一次分组,根据大小件拆分工单 + //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ + logger.info("--------------------------Map> GongDan_WuLiao_Map = new HashMap<>();-----------------------------------------------"); + logger.info("-------------------------↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓-----------------------------------------------"); + + for (String key : GongDan_WuLiao_Map.keySet()) { + logger.info("GongDan_WuLiao:" +key); + List list_ff =GongDan_WuLiao_Map.get(key); + for (FenPei fenPei : list_ff) { + logger.info(":" +fenPei.gdh+"--"+fenPei.wllx+"---"+fenPei.twl+"---"+fenPei.rqh+"---"+fenPei.chf_fz+"---"+fenPei.chf); + } + } + //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ + //打印第一次分组,根据大小件拆分工单 + // 记录每个工单 的数目 - List gd_paixuList = new ArrayList(); - for (String key : gdCount.keySet()) { + List GongDan_List = new ArrayList(); + for (String key : GongDan_WuLiao_Map.keySet()) { // logger.info("gdh: "+key+" count:"+gdCount.get(key).size()); - sumCout = sumCout + gdCount.get(key).size(); - List list_ll1 = gdCount.get(key); + + List list_ll1 = GongDan_WuLiao_Map.get(key); Collections.sort(list_ll1); - GdPaiXu gdPaiXu = new GdPaiXu(key, list_ll1); - gd_paixuList.add(gdPaiXu); + GongDanMingXi gdPaiXu = new GongDanMingXi(key, list_ll1); + GongDan_List.add(gdPaiXu); } - Collections.sort(gd_paixuList); - logger.info("sumCout" + sumCout + "___dataSize:" + dataSize); + Collections.sort(GongDan_List); + + + //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ + logger.info("---------------------List GongDan_List = new ArrayList();-------------------------------------------"); + logger.info("---------------------↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓-------------------------------------------"); + for (GongDanMingXi gdPaiXu : GongDan_List) { + logger.info("GongDan_WuLiao:" +gdPaiXu.gdh); + List list_FenPei =gdPaiXu.list; + for (FenPei fenPei : list_FenPei) { + logger.info(":" +fenPei.gdh+"--"+fenPei.wllx+"---"+fenPei.twl+"---"+fenPei.rqh); + } + } + //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ // 先根据头物料分组 如果头物料相同 且工单总行数 差异小于4的工单分到一个组里面 (尽量分配到同一工作站) - Map> touwuliao_map = new HashMap<>(); + Map> touwuliao_map = new HashMap<>(); - for (GdPaiXu gdPaiXu : gd_paixuList) { + for (GongDanMingXi gdPaiXu : GongDan_List) { // 获取当前头物料 - String fenzu = gdPaiXu.twl + gdPaiXu.list.get(0).wllx; + String fenzu = gdPaiXu.list.get(0).twl_fz+"_"+gdPaiXu.list.get(0).chf_fz; String gdh = gdPaiXu.gdh; @@ -218,13 +253,12 @@ public class DefaultNewWaveManager extends DefaultBaseManager implements // 在touwuliao_map中进行匹配 boolean isFind = false; for (String twlKey : touwuliao_map.keySet()) { - String twl_in = touwuliao_map.get(twlKey).get(0).twl + "_" - + touwuliao_map.get(twlKey).get(0).list.get(0).wllx; + String twl_in = touwuliao_map.get(twlKey).get(0).list.get(0).twl_fz + "_"+ touwuliao_map.get(twlKey).get(0).list.get(0).chf_fz; int currCount_in = touwuliao_map.get(twlKey).get(0).hangshu; if (twl_in.equals(fenzu) && Math.abs(currCount - currCount_in) <= 4) { // 在分配好的数据中找到了相同的头物料 且 数量差小于4 - List old = touwuliao_map.get(twlKey); + List old = touwuliao_map.get(twlKey); old.add(gdPaiXu); touwuliao_map.put(twlKey, old); isFind = true; @@ -233,10 +267,9 @@ public class DefaultNewWaveManager extends DefaultBaseManager implements } if (!isFind) { // 未匹配到数据,自己单独一组 - List llist = new ArrayList(); + List llist = new ArrayList(); llist.add(gdPaiXu); - touwuliao_map.put(fenzu + "_" + gdh, llist); - + touwuliao_map.put(fenzu, llist); } } @@ -245,8 +278,8 @@ public class DefaultNewWaveManager extends DefaultBaseManager implements logger.info("---------------------------打印计算结果--------------------------------------------"); int twl_count = 0; for (String twlKey : touwuliao_map.keySet()) { - List list_show = touwuliao_map.get(twlKey); - for (GdPaiXu fenPei2 : list_show) { + List list_show = touwuliao_map.get(twlKey); + for (GongDanMingXi fenPei2 : list_show) { logger.info("twl" + fenPei2.twl + " GDH:" + fenPei2.gdh + " twlKey:" + twlKey + " GDHCount:" + fenPei2.hangshu); @@ -260,18 +293,18 @@ public class DefaultNewWaveManager extends DefaultBaseManager implements logger.info("-----------------------------------------------------------------------"); } - logger.info("twl_count" + twl_count + "___dataSize:" + dataSize); + // 计算没个容器号出现得次数(在每个头物料得分组里面) logger.info("-------------------------------------------------------------------------------打印工单容器号----------------------------------------------------------------------------------------------------------------------------"); for (String twlKey : touwuliao_map.keySet()) { - List list_show = touwuliao_map.get(twlKey); + List list_show = touwuliao_map.get(twlKey); Map rq_showTime = new HashMap<>(); - for (GdPaiXu fenPei2 : list_show) { + for (GongDanMingXi fenPei2 : list_show) { Set set_rqh = new HashSet<>(); StringBuffer rqm_str = new StringBuffer(); for (FenPei fff : fenPei2.list) { @@ -294,8 +327,8 @@ public class DefaultNewWaveManager extends DefaultBaseManager implements } // 给touwuliao_map的 中 按照容器出现次数进行排序 - List list_show_new = new ArrayList<>(); - for (GdPaiXu fenPei2 : list_show) { + List list_show_new = new ArrayList<>(); + for (GongDanMingXi fenPei2 : list_show) { List list_new = new ArrayList<>(); for (FenPei f1 : fenPei2.list) { f1.show_time = rq_showTime.get(f1.rqh); @@ -309,46 +342,28 @@ public class DefaultNewWaveManager extends DefaultBaseManager implements touwuliao_map.put(twlKey, list_show_new); } - - logger.info("-----------------------------------------------------------------------"); - logger.info("-----------------------------------------------------------------------"); - logger.info("---------------------------打印计算结果-------------------------------------------"); - - // 计算拆分号 (为了15个为一组的工单) 拆分号等于 工单总行数 /15(可配置) 根据容器号。物料 - - for (String twlKey : touwuliao_map.keySet()) { - List list_show = touwuliao_map.get(twlKey); - for (GdPaiXu fenPei2 : list_show) { - logger.info("twl" + fenPei2.twl + " GDH:" + fenPei2.gdh - + " twlKey:" + twlKey + " GDHCount:" - + fenPei2.hangshu); - StringBuffer rqm = new StringBuffer(); - for (FenPei fff : fenPei2.list) { - rqm.append(fff.rqh + "(" + fff.show_time + ") "); - } - logger.info(rqm.toString()); - } - logger.info("--------------------------------------------------------------------------------------------------------------------------------------------------"); - logger.info("--------------------------------------------------------------------------------------------------------------------------------------------------"); - - } + + //按照 拆分头物料工单总行数进行排序 List paixu = new ArrayList<>(); for (String twlKey : touwuliao_map.keySet()) { - List list_show = touwuliao_map.get(twlKey); + List list_show = touwuliao_map.get(twlKey); TwlFenZu twlFenZu = new TwlFenZu(list_show); paixu.add(twlFenZu); } Collections.sort(paixu); - + logger.info("---------------------------------------------------最后结果-----------------------------------------------------------------------------------------------"); + logger.info("-------------------------------------------------最后结果-------------------------------------------------------------------------------------------------"); + int wlcountString=0; for (TwlFenZu twlFenZu : paixu) { - List list_show = twlFenZu.gdPaiXus; - for (GdPaiXu fenPei2 : list_show) { + List list_show = twlFenZu.gdPaiXus; + for (GongDanMingXi fenPei2 : list_show) { logger.info("twl" + fenPei2.twl + " GDH:" + fenPei2.gdh - + " GDHCount:" + fenPei2.hangshu); + + " GDHCount:" + fenPei2.hangshu+" FenZu:"+fenPei2.list.get(0).chf_fz); StringBuffer rqm = new StringBuffer(); for (FenPei fff : fenPei2.list) { - rqm.append(fff.rqh + "(" + fff.show_time + ") "); + rqm.append(fff.rqh + "(" + fff.show_time + "/"+fff.chf+") "); + wlcountString=wlcountString+1; } logger.info(rqm.toString()); } @@ -356,18 +371,99 @@ public class DefaultNewWaveManager extends DefaultBaseManager implements logger.info("--------------------------------------------------------------------------------------------------------------------------------------------------"); } - + logger.info("---------------------------------------------最后结果-----------------------------------------------------------------------------------------------------"); + logger.info("----------------------------------------------最后结果--------------------------------------------------------------------------------------------------"); + + logger.info("GongDan_wuLiaoMingXiCout:"+GongDan_wuLiaoMingXiCout+"wlcountString:"+wlcountString); + + Map gzzMap = new HashMap<>(); int count_all = syhs + list_fenpei.size();// 所有未处理的数据 int gzz_nx_avg = count_all / gzz_codes.size();// 得到工作站的平均能效, if (gzz_nx_avg < jhxl) {// 小于默认值则取默认 gzz_nx_avg = jhxl; + int fenpeiALl=0; + for (String code : gzz_codes) { + int notFinished=(gzz_maps.get(code)==null?0:gzz_maps.get(code)); + int fenpeicount=gzz_nx_avg-notFinished; + if(fenpeiALl-count_all<=0){ + + fenpeiALl=fenpeiALl+fenpeicount; + GongZuoZhan gzz=new GongZuoZhan(code, notFinished, gzz_nx_avg, true); + gzzMap.put(code,gzz); + }else{ + //fenpeiALl=fenpeiALl+fenpeicount; + GongZuoZhan gzz=new GongZuoZhan(code, notFinished, gzz_nx_avg, false); + gzzMap.put(code,gzz); + } + + + } + + }else{ + // 分配工作站,每个工作站剩余可分配订单数 + for (String code : gzz_codes) { + int notFinished=(gzz_maps.get(code)==null?0:gzz_maps.get(code)); + //int gzz_nx = gzz_nx_avg - notFinished; + GongZuoZhan gzz=new GongZuoZhan(code, notFinished, gzz_nx_avg, true); + gzzMap.put(code,gzz); + } } - // 分配工作站,每个工作站剩余可分配订单数 - for (String code : gzz_codes) { - int gzz_nx = gzz_nx_avg - (gzz_maps.get(code)==null?0:gzz_maps.get(code)); - + + for (String key : gzzMap.keySet()) { + GongZuoZhan gongZuoZhan=gzzMap.get(key); + logger.info("Code:"+gongZuoZhan.code+" notFinished:"+gongZuoZhan.notFinished+" maxRenWu:"+gongZuoZhan.maxRenWu+" isEnble:"+gongZuoZhan.isEnble); } + + for (TwlFenZu twlFenZu : paixu) { + List list_show = twlFenZu.gdPaiXus; //当前头无聊所有的工单组合,以及每个工单的物料明细 + int this_fenzuCount=twlFenZu.wl_count; //当前分组总物料行数 + ListlistGzz= FaiXuGzz(gzzMap); //工作站根据可分配数量进行排序 + int gzz_index=0; //当前分配工作站的排序下标 + GongZuoZhan curr_gzz=listGzz.get(0); + for (int index=0;index list_wList=gongDanMingXi.list; + if(list_wList.size()+curr_gzz.notFinished+curr_gzz.renWuList.size()<=curr_gzz.maxRenWu){ + //如果当前待分配+此工作站未完成+已分配任务数 小于最大任务数 //将当前任务分配到此工作站 + for (FenPei fenPei : list_wList) { + curr_gzz.renWuList.add(fenPei); + } + if(index==list_show.size()-1){ + //最后一个工单 + gzzMap.put(curr_gzz.code, curr_gzz); + } + }else{ + gzzMap.put(curr_gzz.code, curr_gzz); + //如果当前待分配+此工作站未完成+已分配任务数 大于最大任务数 //将当前任务分配到下个工作站 + gzz_index=gzz_index+1; + curr_gzz=listGzz.get(gzz_index); + for (FenPei fenPei : list_wList) { + curr_gzz.renWuList.add(fenPei); + } + if(index==list_show.size()-1){ + //最后一个工单 + gzzMap.put(curr_gzz.code, curr_gzz); + } + } + + } + } + int fenPeiCount=0; + for (String key : gzzMap.keySet()) { + GongZuoZhan gongZuoZhan=gzzMap.get(key); + logger.info("----------------------------------------------------开始分配----------------------------------------------------------------------"); + logger.info("--------------------------------------------------------------------------------------------------------------------------"); + logger.info("Code:"+gongZuoZhan.code+" notFinished:"+gongZuoZhan.notFinished+" maxRenWu:"+gongZuoZhan.maxRenWu+" isEnble:"+gongZuoZhan.isEnble); + logger.info("--------------------------------------------------------------------------------------------------------------------------"); + for (FenPei fenPei : gongZuoZhan.renWuList) { + fenPeiCount=fenPeiCount+1; + logger.info(""+fenPei.twl_fz+"---"+fenPei.chf_fz+"---"+fenPei.chf+"---"+fenPei.gdh+"---"+fenPei.rqh); + } + logger.info("--------------------------------------------------------------------------------------------------------------------------"); + } + logger.info("GongDan_wuLiaoMingXiCout:"+GongDan_wuLiaoMingXiCout+"wlcountString:"+wlcountString+" fenPeiCount:"+fenPeiCount); // 写入数据库 /* @@ -375,7 +471,228 @@ public class DefaultNewWaveManager extends DefaultBaseManager implements * }finally { session.close(); } */ session.close(); + } + + + public List FaiXuGzz(Map gzzMap){ + List list =new ArrayList(); + for (String key: gzzMap.keySet()) { + if(gzzMap.get(key).isEnble){ + list.add(gzzMap.get(key)); + } + } + Collections.sort(list); + return list; + } + + + class GongZuoZhan implements Comparable{ + public GongZuoZhan(String code,int notFinished,int maxRenWu,boolean isEnble){ + this.code=code; + this.notFinished=notFinished; + this.maxRenWu=maxRenWu; + this.isEnble=isEnble; + } + public String code=""; + public boolean isEnble; + public int maxRenWu; + public int notFinished =0; + public List renWuList=new ArrayList(); + @Override + public int compareTo(GongZuoZhan other) { + // TODO Auto-generated method stub + return this.notFinished+renWuList.size()-other.notFinished-other.renWuList.size(); + } + } + + + + public List Paixu(Listlist_fenpei ){ + Map> GongDan_WuLiao_Map = new HashMap<>(); + for (FenPei fenPei : list_fenpei) { + + String GongDan_WuLiao = fenPei.gdh + fenPei.wllx; + if (((java.util.Map) GongDan_WuLiao_Map).containsKey(GongDan_WuLiao)) { + List list_count = GongDan_WuLiao_Map.get(GongDan_WuLiao); + list_count.add(fenPei); + GongDan_WuLiao_Map.put(GongDan_WuLiao, list_count); + } else { + List list_count = new ArrayList(); + list_count.add(fenPei); + GongDan_WuLiao_Map.put(GongDan_WuLiao, list_count); + } + } + int sumCout = 0; + + //打印第一次分组,根据大小件拆分工单 + //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ + //logger.info("--------------------------Map> GongDan_WuLiao_Map = new HashMap<>();-----------------------------------------------"); + //logger.info("--------------------------Map> GongDan_WuLiao_Map = new HashMap<>();-----------------------------------------------"); + + for (String key : GongDan_WuLiao_Map.keySet()) { + //logger.info("GongDan_WuLiao:" +key); + List list_FenPei =GongDan_WuLiao_Map.get(key); + for (FenPei fenPei : list_FenPei) { + //logger.info(":" +fenPei.gdh+"--"+fenPei.wllx+"---"+fenPei.twl+"---"+fenPei.rqh); + } + } + //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ + //打印第一次分组,根据大小件拆分工单 + + // 记录每个工单 的数目 + + List GongDan_List = new ArrayList(); + for (String key : GongDan_WuLiao_Map.keySet()) { + // logger.info("gdh: "+key+" count:"+gdCount.get(key).size()); + sumCout = sumCout + GongDan_WuLiao_Map.get(key).size(); + List list_ll1 = GongDan_WuLiao_Map.get(key); + Collections.sort(list_ll1); + GongDanMingXi gdPaiXu = new GongDanMingXi(key, list_ll1); + GongDan_List.add(gdPaiXu); + } + Collections.sort(GongDan_List); + + + //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ + //logger.info("---------------------List GongDan_List = new ArrayList();-------------------------------------------"); + //logger.info("---------------------List GongDan_List = new ArrayList();-------------------------------------------"); + for (GongDanMingXi gdPaiXu : GongDan_List) { + //logger.info("GongDan_WuLiao:" +gdPaiXu.gdh); + List list_FenPei =gdPaiXu.list; + for (FenPei fenPei : list_FenPei) { + //logger.info(":" +fenPei.gdh+"--"+fenPei.wllx+"---"+fenPei.twl+"---"+fenPei.rqh); + } + } + //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ + + // 先根据头物料分组 如果头物料相同 且工单总行数 差异小于4的工单分到一个组里面 (尽量分配到同一工作站) + + Map> touwuliao_map = new HashMap<>(); + + for (GongDanMingXi gdPaiXu : GongDan_List) { + + // 获取当前头物料 + String fenzu = gdPaiXu.twl +"_"+ gdPaiXu.list.get(0).wllx; + + String gdh = gdPaiXu.gdh; + + // 获取当前工单的数量 + int currCount = gdPaiXu.hangshu; + // logger.info("---gdh:"+gdh+" currCount:"+currCount); + // 在touwuliao_map中进行匹配 + boolean isFind = false; + for (String twlKey : touwuliao_map.keySet()) { + String twl_in = touwuliao_map.get(twlKey).get(0).twl + "_"+ touwuliao_map.get(twlKey).get(0).list.get(0).wllx; + int currCount_in = touwuliao_map.get(twlKey).get(0).hangshu; + if (twl_in.equals(fenzu) + && Math.abs(currCount - currCount_in) <= 4) { + // 在分配好的数据中找到了相同的头物料 且 数量差小于4 + List old = touwuliao_map.get(twlKey); + old.add(gdPaiXu); + touwuliao_map.put(twlKey, old); + isFind = true; + break; + } + } + if (!isFind) { + // 未匹配到数据,自己单独一组 + List llist = new ArrayList(); + llist.add(gdPaiXu); + touwuliao_map.put(fenzu+"_"+gdh, llist); + } + + } + //logger.info("-----------------------------------------------------------------------"); + //logger.info("-----------------------------------------------------------------------"); + //logger.info("---------------------------打印计算结果--------------------------------------------"); + int twl_count = 0; + for (String twlKey : touwuliao_map.keySet()) { + List list_show = touwuliao_map.get(twlKey); + for (GongDanMingXi fenPei2 : list_show) { + //logger.info("twl" + fenPei2.twl + " GDH:" + fenPei2.gdh+ " twlKey:" + twlKey + " GDHCount:"+ fenPei2.hangshu); + twl_count++; + StringBuffer rqm = new StringBuffer(); + for (FenPei fff : fenPei2.list) { + rqm.append(fff.rqh + ","); + } + + } + //logger.info("-----------------------------------------------------------------------"); + + } + + + // 计算没个容器号出现得次数(在每个头物料得分组里面) + + //logger.info("-------------------------------------------------------------------------------打印工单容器号----------------------------------------------------------------------------------------------------------------------------"); + + for (String twlKey : touwuliao_map.keySet()) { + List list_show = touwuliao_map.get(twlKey); + + Map rq_showTime = new HashMap<>(); + + for (GongDanMingXi fenPei2 : list_show) { + Set set_rqh = new HashSet<>(); + StringBuffer rqm_str = new StringBuffer(); + for (FenPei fff : fenPei2.list) { + // 通过set记录容器号 + set_rqh.add(fff.rqh); + } + + for (String rqh : set_rqh) { + if (rq_showTime.containsKey(rqh)) { + int stt = rq_showTime.get(rqh); + rq_showTime.put(rqh, stt + 1); + rqm_str.append(rqh + " __" + stt + "(" + + rq_showTime.get(rqh) + ")" + ","); + } else { + rq_showTime.put(rqh, 1); + rqm_str.append(rqh + " __" + 0 + "(" + + rq_showTime.get(rqh) + ")" + ","); + } + } + + } + // 给touwuliao_map的 中 按照容器出现次数进行排序 + List list_show_new = new ArrayList<>(); + for (GongDanMingXi fenPei2 : list_show) { + List list_new = new ArrayList<>(); + for (FenPei f1 : fenPei2.list) { + f1.show_time = rq_showTime.get(f1.rqh); + f1.paixu_type = 1; + list_new.add(f1); + } + Collections.sort(list_new); + fenPei2.list = list_new; + list_show_new.add(fenPei2); + } + touwuliao_map.put(twlKey, list_show_new); + + } + + // 对touwuliao_map 的单个工单大于15的进行拆分 + Map> touwuliao_new_Map = new HashMap<>(); + List list_new =new ArrayList<>(); + for (String twlKey : touwuliao_map.keySet()) { + List list_show = touwuliao_map.get(twlKey); + for (GongDanMingXi gdPaiXu : list_show) { + List list_fen=gdPaiXu.list; + + for (int i = 0; i < list_fen.size(); i++) { + FenPei fenPei=list_fen.get(i); + fenPei.chf_fz=(i)/15+1; + fenPei.chf=(i+1)+""; + fenPei.twl_fz=twlKey; + list_new.add(fenPei); + + } + } + } + + + + return list_new; } public void writeToDb(List list_fenpei) { @@ -398,13 +715,13 @@ public class DefaultNewWaveManager extends DefaultBaseManager implements } class TwlFenZu implements Comparable { - List gdPaiXus; + List gdPaiXus; public int wl_count = 0; - public TwlFenZu(List gdPaiXus) { + public TwlFenZu(List gdPaiXus) { this.gdPaiXus = gdPaiXus; int count = 0; - for (GdPaiXu gdPaiXu : gdPaiXus) { + for (GongDanMingXi gdPaiXu : gdPaiXus) { count = count + gdPaiXu.list.size(); } this.wl_count = count; @@ -417,13 +734,13 @@ public class DefaultNewWaveManager extends DefaultBaseManager implements } - class GdPaiXu implements Comparable { + class GongDanMingXi implements Comparable { public String gdh; // 工单号 public int hangshu;// 工单行数 public String twl;// 头物料 public List list; - public GdPaiXu(String gdh, List list) { + public GongDanMingXi(String gdh, List list) { this.gdh = gdh; this.hangshu = list.size(); this.twl = list.get(0).twl; @@ -432,7 +749,7 @@ public class DefaultNewWaveManager extends DefaultBaseManager implements } @Override - public int compareTo(GdPaiXu other) { + public int compareTo(GongDanMingXi other) { // TODO Auto-generated method stub return Integer.compare(this.hangshu, other.hangshu); } @@ -495,6 +812,15 @@ public class DefaultNewWaveManager extends DefaultBaseManager implements * 拆分号 */ public String chf; + + /** + * 拆分号分组 + */ + public int chf_fz; + /** + * 拆分号分组 + */ + public String twl_fz; public int paixu_type = 0;