no message

main
768863620@qq.com 2025-01-13 10:37:13 +08:00
parent 3229aa367c
commit 311cc6d9c6
1 changed files with 403 additions and 77 deletions

View File

@ -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<Long> 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<String> 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<Object[]> list = (List<Object[]>) query.list();
int dataSize = list.size();
int GongDan_wuLiaoMingXiCout = list.size();
List<FenPei> list_fenpei = new ArrayList<FenPei>();
List<FenPei> list_fenpei_wgzz = new ArrayList<FenPei>();// 无需分配工作站数据
@ -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<String, List<FenPei>> gdCount = new HashMap<>();
// 根据(工单号+物料类型)分组
Map<String, List<FenPei>> 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<FenPei> list_count = gdCount.get(key_gd_wl);
List<FenPei>list_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<FenPei> 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<FenPei> list_count = new ArrayList<FenPei>();
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<String, List<FenPei>> GongDan_WuLiao_Map = new HashMap<>();-----------------------------------------------");
logger.info("-------------------------↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓-----------------------------------------------");
for (String key : GongDan_WuLiao_Map.keySet()) {
logger.info("GongDan_WuLiao:" +key);
List<FenPei> 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<GdPaiXu> gd_paixuList = new ArrayList<GdPaiXu>();
for (String key : gdCount.keySet()) {
List<GongDanMingXi> GongDan_List = new ArrayList<GongDanMingXi>();
for (String key : GongDan_WuLiao_Map.keySet()) {
// logger.info("gdh: "+key+" count"+gdCount.get(key).size());
sumCout = sumCout + gdCount.get(key).size();
List<FenPei> list_ll1 = gdCount.get(key);
List<FenPei> 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<GdPaiXu> GongDan_List = new ArrayList<GdPaiXu>();-------------------------------------------");
logger.info("---------------------↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓-------------------------------------------");
for (GongDanMingXi gdPaiXu : GongDan_List) {
logger.info("GongDan_WuLiao:" +gdPaiXu.gdh);
List<FenPei> list_FenPei =gdPaiXu.list;
for (FenPei fenPei : list_FenPei) {
logger.info(":" +fenPei.gdh+"--"+fenPei.wllx+"---"+fenPei.twl+"---"+fenPei.rqh);
}
}
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
// 先根据头物料分组 如果头物料相同 且工单总行数 差异小于4的工单分到一个组里面 (尽量分配到同一工作站)
Map<String, List<GdPaiXu>> touwuliao_map = new HashMap<>();
Map<String, List<GongDanMingXi>> 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<GdPaiXu> old = touwuliao_map.get(twlKey);
List<GongDanMingXi> 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<GdPaiXu> llist = new ArrayList<GdPaiXu>();
List<GongDanMingXi> llist = new ArrayList<GongDanMingXi>();
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<GdPaiXu> list_show = touwuliao_map.get(twlKey);
for (GdPaiXu fenPei2 : list_show) {
List<GongDanMingXi> 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<GdPaiXu> list_show = touwuliao_map.get(twlKey);
List<GongDanMingXi> list_show = touwuliao_map.get(twlKey);
Map<String, Integer> rq_showTime = new HashMap<>();
for (GdPaiXu fenPei2 : list_show) {
for (GongDanMingXi fenPei2 : list_show) {
Set<String> 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<GdPaiXu> list_show_new = new ArrayList<>();
for (GdPaiXu fenPei2 : list_show) {
List<GongDanMingXi> list_show_new = new ArrayList<>();
for (GongDanMingXi fenPei2 : list_show) {
List<FenPei> list_new = new ArrayList<>();
for (FenPei f1 : fenPei2.list) {
f1.show_time = rq_showTime.get(f1.rqh);
@ -310,45 +343,27 @@ public class DefaultNewWaveManager extends DefaultBaseManager implements
}
logger.info("-----------------------------------------------------------------------");
logger.info("-----------------------------------------------------------------------");
logger.info("---------------------------打印计算结果-------------------------------------------");
// 计算拆分号 为了15个为一组的工单 拆分号等于 工单总行数 /15可配置 根据容器号。物料
for (String twlKey : touwuliao_map.keySet()) {
List<GdPaiXu> 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<TwlFenZu> paixu = new ArrayList<>();
for (String twlKey : touwuliao_map.keySet()) {
List<GdPaiXu> list_show = touwuliao_map.get(twlKey);
List<GongDanMingXi> 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<GdPaiXu> list_show = twlFenZu.gdPaiXus;
for (GdPaiXu fenPei2 : list_show) {
List<GongDanMingXi> 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<String, GongZuoZhan> 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 gzz_nx = gzz_nx_avg - (gzz_maps.get(code)==null?0:gzz_maps.get(code));
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 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<GongDanMingXi> list_show = twlFenZu.gdPaiXus; //当前头无聊所有的工单组合,以及每个工单的物料明细
int this_fenzuCount=twlFenZu.wl_count; //当前分组总物料行数
List<GongZuoZhan>listGzz= FaiXuGzz(gzzMap); //工作站根据可分配数量进行排序
int gzz_index=0; //当前分配工作站的排序下标
GongZuoZhan curr_gzz=listGzz.get(0);
for (int index=0;index<list_show.size();index++) {
GongDanMingXi gongDanMingXi=list_show.get(index);
//当前工单的物料
List<FenPei> 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<GongZuoZhan> FaiXuGzz(Map<String, GongZuoZhan> gzzMap){
List<GongZuoZhan> list =new ArrayList<DefaultNewWaveManager.GongZuoZhan>();
for (String key: gzzMap.keySet()) {
if(gzzMap.get(key).isEnble){
list.add(gzzMap.get(key));
}
}
Collections.sort(list);
return list;
}
class GongZuoZhan implements Comparable<GongZuoZhan>{
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<FenPei> renWuList=new ArrayList<DefaultNewWaveManager.FenPei>();
@Override
public int compareTo(GongZuoZhan other) {
// TODO Auto-generated method stub
return this.notFinished+renWuList.size()-other.notFinished-other.renWuList.size();
}
}
public List<FenPei> Paixu(List<FenPei>list_fenpei ){
Map<String, List<FenPei>> 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<FenPei> list_count = GongDan_WuLiao_Map.get(GongDan_WuLiao);
list_count.add(fenPei);
GongDan_WuLiao_Map.put(GongDan_WuLiao, list_count);
} else {
List<FenPei> list_count = new ArrayList<FenPei>();
list_count.add(fenPei);
GongDan_WuLiao_Map.put(GongDan_WuLiao, list_count);
}
}
int sumCout = 0;
//打印第一次分组,根据大小件拆分工单
//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
//logger.info("--------------------------Map<String, List<FenPei>> GongDan_WuLiao_Map = new HashMap<>();-----------------------------------------------");
//logger.info("--------------------------Map<String, List<FenPei>> GongDan_WuLiao_Map = new HashMap<>();-----------------------------------------------");
for (String key : GongDan_WuLiao_Map.keySet()) {
//logger.info("GongDan_WuLiao:" +key);
List<FenPei> list_FenPei =GongDan_WuLiao_Map.get(key);
for (FenPei fenPei : list_FenPei) {
//logger.info(":" +fenPei.gdh+"--"+fenPei.wllx+"---"+fenPei.twl+"---"+fenPei.rqh);
}
}
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
//打印第一次分组,根据大小件拆分工单
// 记录每个工单 的数目
List<GongDanMingXi> GongDan_List = new ArrayList<GongDanMingXi>();
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<FenPei> 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<GdPaiXu> GongDan_List = new ArrayList<GdPaiXu>();-------------------------------------------");
//logger.info("---------------------List<GdPaiXu> GongDan_List = new ArrayList<GdPaiXu>();-------------------------------------------");
for (GongDanMingXi gdPaiXu : GongDan_List) {
//logger.info("GongDan_WuLiao:" +gdPaiXu.gdh);
List<FenPei> list_FenPei =gdPaiXu.list;
for (FenPei fenPei : list_FenPei) {
//logger.info(":" +fenPei.gdh+"--"+fenPei.wllx+"---"+fenPei.twl+"---"+fenPei.rqh);
}
}
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
// 先根据头物料分组 如果头物料相同 且工单总行数 差异小于4的工单分到一个组里面 (尽量分配到同一工作站)
Map<String, List<GongDanMingXi>> 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<GongDanMingXi> old = touwuliao_map.get(twlKey);
old.add(gdPaiXu);
touwuliao_map.put(twlKey, old);
isFind = true;
break;
}
}
if (!isFind) {
// 未匹配到数据,自己单独一组
List<GongDanMingXi> llist = new ArrayList<GongDanMingXi>();
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<GongDanMingXi> 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<GongDanMingXi> list_show = touwuliao_map.get(twlKey);
Map<String, Integer> rq_showTime = new HashMap<>();
for (GongDanMingXi fenPei2 : list_show) {
Set<String> 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<GongDanMingXi> list_show_new = new ArrayList<>();
for (GongDanMingXi fenPei2 : list_show) {
List<FenPei> 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<String, List<GongDanMingXi>> touwuliao_new_Map = new HashMap<>();
List<FenPei> list_new =new ArrayList<>();
for (String twlKey : touwuliao_map.keySet()) {
List<GongDanMingXi> list_show = touwuliao_map.get(twlKey);
for (GongDanMingXi gdPaiXu : list_show) {
List<FenPei> 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<FenPei> list_fenpei) {
@ -398,13 +715,13 @@ public class DefaultNewWaveManager extends DefaultBaseManager implements
}
class TwlFenZu implements Comparable<TwlFenZu> {
List<GdPaiXu> gdPaiXus;
List<GongDanMingXi> gdPaiXus;
public int wl_count = 0;
public TwlFenZu(List<GdPaiXu> gdPaiXus) {
public TwlFenZu(List<GongDanMingXi> 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<GdPaiXu> {
class GongDanMingXi implements Comparable<GongDanMingXi> {
public String gdh; // 工单号
public int hangshu;// 工单行数
public String twl;// 头物料
public List<FenPei> list;
public GdPaiXu(String gdh, List<FenPei> list) {
public GongDanMingXi(String gdh, List<FenPei> 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);
}
@ -496,6 +813,15 @@ public class DefaultNewWaveManager extends DefaultBaseManager implements
*/
public String chf;
/**
*
*/
public int chf_fz;
/**
*
*/
public String twl_fz;
public int paixu_type = 0;
public int show_time = 0;