package com.hikvision.mes.report.service.service.impl;
import cn.evun.ime.platform.core.utils.PaginationHelp;
import cn.evun.ime.platform.core.utils.StringUtils;
import cn.evun.sweet.framework.core.mvc.model.QueryResult;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.hikvision.mes.report.sdk.constant.MaStatusConfig;
import com.hikvision.mes.report.sdk.dto.*;
import com.hikvision.mes.report.service.configuration.ExecutorsPoolConfiguration;
import com.hikvision.mes.report.service.dao.BulletinBoardBasicInfoDao;
import com.hikvision.mes.report.service.dao.WorkInProcessDao;
import com.hikvision.mes.report.service.service.AndonDataAnalyseKanbanService;
import com.hikvision.mes.report.service.service.WorkInProcessService;
import com.hikvision.mes.report.service.utils.ReflectionNameUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.LazyLoader;
import org.springframework.stereotype.Service;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.*;
import java.util.stream.Collectors;
import static java.util.stream.Collectors.groupingBy;
@Service
public class WorkInProcessServiceImpl implements WorkInProcessService {
@Autowired
private WorkInProcessDao workInProcessDao;
@Autowired
private AndonDataAnalyseKanbanService andonDataAnalyseKanbanService;
@Autowired
private BulletinBoardBasicInfoDao bulletinBoardBasicInfoDao;
@Override
public List selectWorkInProcessListChart(WorkInProcessDto req) {
WorkInProcessDto resq = new WorkInProcessDto();
resq.setbaseCode("8001");
List factoryCodes = new ArrayList<>();
factoryCodes.add("W911");
resq.setFactoryCodes(factoryCodes);
resq.setByType("BY_HOUR");
req = resq;
List orderNos = StringUtils.isEmpty(req.getOrderNum()) ? null : Arrays.asList(req.getOrderNum().split("n"));
req.setOrderNos(orderNos);
//查询电装订单数目
List total = workInProcessDao.selectElectricTotalNumber(req);
//查询数目
List resultList = new ArrayList<>();
//获取v1 list
List list = workInProcessDao.getbaseSearchList(req);
this.list = list;
//获取基础集合
List baseList = workInProcessDao.getbaseList(list);
this.baseList = baseList;
//下面这些接口可以并行执行
ExecutorService threadPool = Executors.newFixedThreadPool(5);
Future> smtFuture = threadPool.submit(new Task(this, "method1", null));
Future> patchFuture = threadPool.submit(new Task(this, "method2", null));
try {
List s1 = smtFuture.get();
List s2 = patchFuture.get();
System.out.println(s2.toString());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
// List baseResult2 = futureGetProxy(smtFuture, WorkInProcessV4Dto.class);
//获取smtWitList
List smtWitList = workInProcessDao.getSmtWitList(baseList);
//获取DZ01,DZ02,待贴片集合
List patchList = workInProcessDao.getPatchList(list,baseList);
//获取待插件,待测试,待维修数据 wait_plug,wait_test,wait_repair
List waitPlugList = workInProcessDao.getWaitPlugList(list,baseList);
//获取wait_in_storage集合 待入库集合
List inStorageList = workInProcessDao.getInStorageList(list);
//根据工单号进行分组
Map> smtWitMap = smtWitList.stream().collect(groupingBy(WorkInProcessV4Dto::getAufnr));
Map> patchMap = patchList.stream().collect(groupingBy(WorkInProcessV5Dto::getAufnr));
Map> waitMap = waitPlugList.stream().collect(groupingBy(WorkInProcessV6Dto::getAufnr));
Map> inStorageMap = inStorageList.stream().collect(groupingBy(WorkInProcessV8Dto::getAufnr));
Double smtWip = 0.0;
Double dz01num = 0.0;
Double dz02num = 0.0;
Double plug = 0.0;
Double test = 0.0;
Double repair = 0.0;
Double inStorage = 0.0;
//baseList根据产线进行分组
Map> plineMap = baseList.stream().collect(groupingBy(WorkInProcessV3Dto::getPline));
if("BY_HOUR".equals(req.getByType())){
//获取dz01_time,dz02_time,dz03_time,dz04_time配置时间
List wipTimeList = workInProcessDao.getWipTimeList(list);
//根据工单号进行分组
Map> wiMap = wipTimeList.stream().collect(groupingBy(WorkInProcessV9Dto::getAufnr));
for (Map.Entry> ent : plineMap.entrySet()) {
WorkInProcessResultDto work = new WorkInProcessResultDto();
String pline = ent.getKey();
work.setPline(pline);
work.setCategory(pline);
List v3Dtos = ent.getValue();
for (WorkInProcessV3Dto dto:v3Dtos){
//根据订单号获取DZ01-4 的配置时间
GetDzTime dzTime = new GetDzTime(wiMap, dto).invoke();
Double dz01_time = dzTime.getDz01_time();
Double dz02_time = dzTime.getDz02_time();
Double dz03_time = dzTime.getDz03_time();
Double dz04_time = dzTime.getDz04_time();
//根据订单获取各个指标
GetNumber target = new GetNumber(smtWitMap, patchMap, waitMap, inStorageMap, dto).invoke();
Double d1 = target.getD1();
Double d2 = target.getD2();
Double pl = target.getPl();
Double te = target.getTe();
Double re = target.getRe();
Double in = target.getIn();
Double inNum = target.getInNum();
//当选择是swip工时的时候
try {
Double num1 = inNum * dz03_time;
smtWip = smtWip + num1;
} catch (Exception e) {
System.out.println("inNum="+inNum+"dz03_time="+dz03_time+"当前订单=="+dto.getAufnr());
}
try {
Double num2 = d1 * dz01_time;
dz01num = dz01num + num2;
} catch (Exception e) {
System.out.println("d1="+d1+"dz01_time="+dz01_time+"当前订单=="+dto.getAufnr());
}
Double num3 = d2 * dz02_time;
dz02num = dz02num + num3;
Double num4 = pl * dz03_time;
plug = plug + num4;
Double num5 = te * dz04_time;
test = test + num5;
Double num6 = re * dz04_time;
repair = repair + num6;
Double num7 = in * (dz04_time+dz04_time);
inStorage = inStorage + num7;
}
work.setSmtWip(new BigDecimal(smtWip * 1.00 / (3600 * 1)).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
work.setDzOne(new BigDecimal(dz01num * 1.00 / (3600 * 1)).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
work.setDzTwo(new BigDecimal(dz02num * 1.00 / (3600 * 1)).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
work.setPlug(new BigDecimal(plug * 1.00 / (3600 * 1)).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
work.setTest(new BigDecimal(test * 1.00 / (3600 * 1)).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
work.setRepair(new BigDecimal(repair * 1.00 / (3600 * 1)).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
work.setInStorage(new BigDecimal(inStorage * 1.00 / (3600 * 1)).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
resultList.add(work);
}
}else {
for (Map.Entry> ent : plineMap.entrySet()) {
WorkInProcessResultDto work = new WorkInProcessResultDto();
String pline = ent.getKey();
work.setPline(pline);
work.setCategory(pline);
List v3Dtos = ent.getValue();
for (WorkInProcessV3Dto dto:v3Dtos){
//根据订单获取各个指标
GetNumber target = new GetNumber(smtWitMap, patchMap, waitMap, inStorageMap, dto).invoke();
Double d1 = target.getD1();
Double d2 = target.getD2();
Double pl = target.getPl();
Double te = target.getTe();
Double re = target.getRe();
Double in = target.getIn();
Double inNum = target.getInNum();
smtWip = smtWip + inNum;
inStorage = inStorage + in;
repair = repair + re;
dz01num = dz01num + d1;
dz02num = dz02num + d2;
plug = plug + pl;
test = test + te;
}
work.setSmtWip(smtWip);
work.setDzOne(dz01num);
work.setDzTwo(dz02num);
work.setPlug(plug);
work.setTest(test);
work.setRepair(repair);
work.setInStorage(inStorage);
resultList.add(work);
}
}
if (resultList != null && resultList.size() > 0) {
Map> map = total.stream().collect(groupingBy(WorkInProcessResultDto::getDimCode));
for (WorkInProcessResultDto wd : resultList) {
wd.setOrdNum(map.get(wd.getPline()).get(0).getTotalnum());
}
}
WorkInProcessResultDto wpd = new WorkInProcessResultDto();
wpd.setPatch(resultList.stream().mapToDouble(WorkInProcessResultDto::getPatch).sum());
wpd.setSmtWip(resultList.stream().mapToDouble(WorkInProcessResultDto::getSmtWip).sum());
wpd.setPlug(resultList.stream().mapToDouble(WorkInProcessResultDto::getPlug).sum());
wpd.setTest(resultList.stream().mapToDouble(WorkInProcessResultDto::getTest).sum());
wpd.setRepair(resultList.stream().mapToDouble(WorkInProcessResultDto::getRepair).sum());
wpd.setInStorage(resultList.stream().mapToDouble(WorkInProcessResultDto::getInStorage).sum());
wpd.setOrdNum(resultList.stream().mapToInt(WorkInProcessResultDto::getOrdNum).sum());
if ("BY_HOUR".equals(req.getByType())) {
wpd.setPatch(new BigDecimal((double) wpd.getPatch()).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
wpd.setSmtWip(new BigDecimal((double) wpd.getSmtWip()).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
wpd.setPlug(new BigDecimal((double) wpd.getPlug()).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
wpd.setTest(new BigDecimal((double) wpd.getTest()).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
wpd.setRepair(new BigDecimal((double) wpd.getRepair()).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
wpd.setInStorage(new BigDecimal((double) wpd.getInStorage()).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
}
wpd.setCategory("汇总");
resultList.add(0, wpd);
return resultList;
}
@Override
public List selectAllbaseCode() {
List resultList = workInProcessDao.selectAllbaseCode();
//如果是杭州环境则过滤基地
String baseCode =bulletinBoardBasicInfoDao.selectEnvironmentalByShiftTime();
if("8001".equals(baseCode)){
if(resultList !=null && resultList.size()>0){
resultList = resultList.stream().filter(e-> MaStatusConfig.baseSet.contains(e.getbaseCode())).collect(Collectors.toList());
}
}
return resultList;
}
@Override
public List selectElectricFactory(WorkInProcessDto req) {
List resultList = workInProcessDao.selectElectricFactory(req);
return resultList;
}
@Override
public List selectAssembleFactory(WorkInProcessDto req) {
List resultList = workInProcessDao.selectAssembleFactory(req);
return resultList;
}
@Override
public List selectAssembleFloor(WorkInProcessDto req) {
List resultList = workInProcessDao.selectAssembleFloor(req);
return resultList;
}
@Override
public List selectAssembleWorkLine(WorkInProcessDto req) {
List resultList = workInProcessDao.selectAssembleWorkLine(req);
return resultList;
}
@Override
public List selectElectricWorkLine(WorkInProcessDto req) {
List resultList = workInProcessDao.selectElectricWorkLine(req);
return resultList;
}
@Override
public List selectElectricFloor(WorkInProcessDto req) {
List resultList = workInProcessDao.selectElectricFloor(req);
return resultList;
}
@Override
public QueryResult selectCategoryRunIn(WorkInProcessDto req) {
List orderNos = StringUtils.isEmpty(req.getOrderNum()) ? null : Arrays.asList(req.getOrderNum().split("n"));
req.setOrderNos(orderNos);
PageHelper.startPage(req.getPageNum(), req.getNumPerPage());
// List resultList = workInProcessDao.selectCategoryRunIn(req);
Page page = workInProcessDao.selectCategoryRunIn(req);
page.stream().forEach(e -> e.setOrderNo(e.getAufnr()));
WorkInProcessResultDto total = workInProcessDao.selectCategoryRunInTotal(req);
//订单号为了和别的区别开来
total.setOrderNo("汇总");
total.setAufnr("汇总");
page.add(0, total);
// WorkInProcessResultDto wpd = new WorkInProcessResultDto();
// resultList.stream().forEach(e->e.setOrderNo(e.getAufnr()));
// wpd.setPatch(resultList.stream().mapToDouble(WorkInProcessResultDto::getPatch).sum());
// wpd.setSmtWip(resultList.stream().mapToDouble(WorkInProcessResultDto::getSmtWip).sum());
// wpd.setPlug(resultList.stream().mapToDouble(WorkInProcessResultDto::getPlug).sum());
// wpd.setTest(resultList.stream().mapToDouble(WorkInProcessResultDto::getTest).sum());
// wpd.setRepair(resultList.stream().mapToDouble(WorkInProcessResultDto::getRepair).sum());
// wpd.setInStorage(resultList.stream().mapToDouble(WorkInProcessResultDto::getInStorage).sum());
wpd.setOrdNum(resultList.stream().mapToInt(WorkInProcessResultDto::getOrdNum).sum());
// if("BY_HOUR".equals(req.getByType())){
// wpd.setPatch(new BigDecimal((double)wpd.getPatch()).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
// wpd.setSmtWip(new BigDecimal((double)wpd.getSmtWip()).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
// wpd.setPlug(new BigDecimal((double)wpd.getPlug()).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
// wpd.setTest(new BigDecimal((double)wpd.getTest()).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
// wpd.setRepair(new BigDecimal((double)wpd.getRepair()).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
// wpd.setInStorage(new BigDecimal((double)wpd.getInStorage()).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
// }
// wpd.setOrderNo("汇总");
// wpd.setAufnr("汇总");
// resultList.add(0,wpd);
return PaginationHelp.parseDTOPage(page);
}
@Override
public List selectCategoryRunInAll(WorkInProcessDto req) {
List orderNos = StringUtils.isEmpty(req.getOrderNum()) ? null : Arrays.asList(req.getOrderNum().split("n"));
req.setOrderNos(orderNos);
List resultList = workInProcessDao.selectCategoryRunIn(req);
WorkInProcessResultDto wpd = new WorkInProcessResultDto();
resultList.stream().forEach(e->e.setOrderNo(e.getAufnr()));
wpd.setPatch(resultList.stream().mapToDouble(WorkInProcessResultDto::getPatch).sum());
wpd.setSmtWip(resultList.stream().mapToDouble(WorkInProcessResultDto::getSmtWip).sum());
wpd.setPlug(resultList.stream().mapToDouble(WorkInProcessResultDto::getPlug).sum());
wpd.setTest(resultList.stream().mapToDouble(WorkInProcessResultDto::getTest).sum());
wpd.setRepair(resultList.stream().mapToDouble(WorkInProcessResultDto::getRepair).sum());
wpd.setInStorage(resultList.stream().mapToDouble(WorkInProcessResultDto::getInStorage).sum());
if("BY_HOUR".equals(req.getByType())){
wpd.setPatch(new BigDecimal((double)wpd.getPatch()).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
wpd.setSmtWip(new BigDecimal((double)wpd.getSmtWip()).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
wpd.setPlug(new BigDecimal((double)wpd.getPlug()).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
wpd.setTest(new BigDecimal((double)wpd.getTest()).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
wpd.setRepair(new BigDecimal((double)wpd.getRepair()).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
wpd.setInStorage(new BigDecimal((double)wpd.getInStorage()).setScale(1, BigDecimal.ROUND_HALF_UP).doublevalue());
}
wpd.setOrderNo("汇总");
wpd.setAufnr("汇总");
resultList.add(0,wpd);
return resultList;
}
@Override
public QueryResult selectPatchRunIn(WorkInProcessDto req) {
List orderNos = StringUtils.isEmpty(req.getOrderNum()) ? null : Arrays.asList(req.getOrderNum().split("n"));
req.setOrderNos(orderNos);
PageHelper.startPage(req.getPageNum(), req.getNumPerPage());
Page resultList = workInProcessDao.selectPatchRunIn(req);
if ("smtWip".equals(req.getFlagType()) || "inStorage".equals(req.getFlagType())) {
resultList.stream().forEach(e -> e.setStVal(e.getWaitValue()));
}
WorkInProcessResultDto total = workInProcessDao.selectPatchRunInTotal(req);
if ("smtWip".equals(req.getFlagType()) || "inStorage".equals(req.getFlagType())) {
total.setStVal(total.getWaitValue());
}
total.setAufnr("汇总");
resultList.add(0, total);
return PaginationHelp.parseDTOPage(resultList);
}
@Override
public List selectPatchRunInAll(WorkInProcessDto req) {
List orderNos = StringUtils.isEmpty(req.getOrderNum()) ? null : Arrays.asList(req.getOrderNum().split("n"));
req.setOrderNos(orderNos);
List resultList = workInProcessDao.selectPatchRunIn(req);
WorkInProcessResultDto wd = new WorkInProcessResultDto();
wd.setWaitValue(resultList.stream().mapToDouble(WorkInProcessResultDto::getWaitValue).sum());
wd.setAufnr("汇总");
resultList.add(0, wd);
if ("smtWip".equals(req.getFlagType()) || "inStorage".equals(req.getFlagType())) {
resultList.stream().forEach(e -> e.setStVal(e.getWaitValue()));
}
return resultList;
}
@Override
public List selectSmtWipRunIn(WorkInProcessDto req) {
List resultList = workInProcessDao.selectSmtWipRunIn(req);
return resultList;
}
@Override
public List selectPlugRunIn(WorkInProcessDto req) {
List resultList = workInProcessDao.selectPlugRunIn(req);
return resultList;
}
@Override
public List selectTestRunIn(WorkInProcessDto req) {
List resultList = workInProcessDao.selectTestRunIn(req);
return resultList;
}
@Override
public List selectRepairRunIn(WorkInProcessDto req) {
List resultList = workInProcessDao.selectRepairRunIn(req);
return resultList;
}
@Override
public List selectInStorageRunIn(WorkInProcessDto req) {
List resultList = workInProcessDao.selectInStorageRunIn(req);
return resultList;
}
@Override
public QueryResult selectThirdRunIn(WorkInProcessDto req) {
List orderNos = StringUtils.isEmpty(req.getOrderNum()) ? null : Arrays.asList(req.getOrderNum().split("n"));
req.setOrderNos(orderNos);
PageHelper.startPage(req.getTpageNum(), req.getTnumPerPage());
Page resultList = workInProcessDao.selectThirdRunIn(req);
resultList.stream().forEach(e -> e.setScanTime(e.getScanTime().substring(0, 19)));
return PaginationHelp.parseDTOPage(resultList);
}
@Override
public QueryResult selectRepairThird(WorkInProcessDto req) {
List orderNos = StringUtils.isEmpty(req.getOrderNum()) ? null : Arrays.asList(req.getOrderNum().split("n"));
req.setOrderNos(orderNos);
PageHelper.startPage(req.getTpageNum(), req.getTnumPerPage());
Page resultList = workInProcessDao.selectRepairThird(req);
resultList.stream().forEach(e -> e.setScanTime(e.getScanTime().substring(0, 19)));
return PaginationHelp.parseDTOPage(resultList);
}
@Override
public QueryResult selectElectricThird(WorkInProcessDto req) {
List orderNos = StringUtils.isEmpty(req.getOrderNum()) ? null : Arrays.asList(req.getOrderNum().split("n"));
req.setOrderNos(orderNos);
PageHelper.startPage(req.getTpageNum(), req.getTnumPerPage());
Page resultList = workInProcessDao.selectElectricThird(req);
resultList.stream().forEach(e -> e.setScanTime(e.getScanTime().substring(0, 19)));
return PaginationHelp.parseDTOPage(resultList);
}
@Override
public QueryResult selectPatchThird(WorkInProcessDto req) {
List orderNos = StringUtils.isEmpty(req.getOrderNum()) ? null : Arrays.asList(req.getOrderNum().split("n"));
req.setOrderNos(orderNos);
PageHelper.startPage(req.getTpageNum(), req.getTnumPerPage());
Page resultList = workInProcessDao.selectPatchThird(req);
resultList.stream().forEach(e -> e.setScanTime(e.getScanTime().substring(0, 19)));
return PaginationHelp.parseDTOPage(resultList);
}
@Override
public QueryResult selectPlugThird(WorkInProcessDto req) {
List orderNos = StringUtils.isEmpty(req.getOrderNum()) ? null : Arrays.asList(req.getOrderNum().split("n"));
req.setOrderNos(orderNos);
PageHelper.startPage(req.getTpageNum(), req.getTnumPerPage());
Page resultList = workInProcessDao.selectPlugThird(req);
resultList.stream().forEach(e -> e.setScanTime(e.getScanTime().substring(0, 19)));
return PaginationHelp.parseDTOPage(resultList);
}
@Override
public QueryResult selectTestThird(WorkInProcessDto req) {
List orderNos = StringUtils.isEmpty(req.getOrderNum()) ? null : Arrays.asList(req.getOrderNum().split("n"));
req.setOrderNos(orderNos);
PageHelper.startPage(req.getTpageNum(), req.getTnumPerPage());
Page resultList = workInProcessDao.selectTestThird(req);
resultList.stream().forEach(e -> e.setScanTime(e.getScanTime().substring(0, 19)));
return PaginationHelp.parseDTOPage(resultList);
}
@Override
public List selectThirdRunInAll(WorkInProcessDto req) {
List orderNos = StringUtils.isEmpty(req.getOrderNum()) ? null : Arrays.asList(req.getOrderNum().split("n"));
req.setOrderNos(orderNos);
List resultList = workInProcessDao.selectThirdRunIn(req);
resultList.stream().forEach(e -> e.setScanTime(e.getScanTime().substring(0, 19)));
return resultList;
}
@Override
public Integer selectThirdRunInAllCount(WorkInProcessDto req) {
List orderNos = StringUtils.isEmpty(req.getOrderNum()) ? null : Arrays.asList(req.getOrderNum().split("n"));
req.setOrderNos(orderNos);
Integer resultList = workInProcessDao.selectThirdRunInAllCount(req);
return resultList;
}
public Integer selectAssembleSecondOrderNum(WorkInProcessDto req) {
List orderNos = StringUtils.isEmpty(req.getOrderNum()) ? null : Arrays.asList(req.getOrderNum().split("n"));
req.setOrderNos(orderNos);
Map resultMap = new HashMap<>();
Map titleMap = new HashMap<>();
List result = new ArrayList<>();
List titleDtos = new ArrayList<>();
List titleDtoSort = new ArrayList<>();
Integer sum = 0;
req.setProcessname("");
// if ("分类".equals(req.getProcessname())) {
// req.setProcessname("");
// }
List resultList = workInProcessDao.selectAssembleSecondList(req);
if (resultList != null && resultList.size() > 0) {
Set processNameList = new linkedHashSet<>();
for (WorkInProcessResultDto ls :resultList){
processNameList.add(ls.getProcessname());
}
List lists = getStringList();
//按照工厂或者线体分组
Map> codeMap = resultList.stream().collect(groupingBy(WorkInProcessResultDto::getAufnr));
//按照工序分组
Map> map = resultList.stream().collect(groupingBy(WorkInProcessResultDto::getProcess));
//先循环工厂或者线体
for (Map.Entry> entry : codeMap.entrySet()) {
String key = entry.getKey();
AssembleWorkInProcessDto processDto = new AssembleWorkInProcessDto();
processDto.setOrderNumber(key);
// processDto.setTname(entry.getValue().get(0).getTname());
int x = 0;
//再循环工序
for (Map.Entry> ent : map.entrySet()) {
List list = ent.getValue();
String field = lists.get(x);
AssembleTitleDto titleDto = new AssembleTitleDto();
titleDto.setElement(field);
titleDto.setElementName(list.get(0).getProcessname());
titleMap.put(field, titleDto);
for (int i = 0; i < list.size(); i++) {
WorkInProcessResultDto ls = list.get(i);
if (key.equals(ls.getAufnr())) {
try {
processDto.setProcess(ls.getProcess());
ReflectionNameUtil.setValue(processDto, processDto.getClass(), field, AssembleWorkInProcessDto.class.getDeclaredField(field).getType(), ls.getTotalnum());
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
} else {
try {
processDto.setProcess(ls.getProcess());
Object ob = ReflectionNameUtil.getGetMethod(processDto, field);
if (ob == null) {
ReflectionNameUtil.setValue(processDto, processDto.getClass(), field, AssembleWorkInProcessDto.class.getDeclaredField(field).getType(), 0);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
x = x + 1;
}
result.add(processDto);
}
//获取菜单列
if (titleMap.size() > 0) {
for (Map.Entry entry : titleMap.entrySet()) {
titleDtos.add(entry.getValue());
}
}
//按照工序名称分组
Map> map2 = resultList.stream().collect(groupingBy(WorkInProcessResultDto::getProcessname));
AssembleWorkInProcessDto wp = new AssembleWorkInProcessDto();
for (AssembleWorkInProcessDto aw : result) {
req.setAufnr(aw.getOrderNumber());
//查询订单数字段
Integer tn = workInProcessDao.selectTotalNumberByOrderNumber(req);
if (tn == null) {
tn = 0;
}
aw.setTotalnum(tn);
Integer num = 0;
for (AssembleTitleDto at : titleDtos) {
String name = at.getElementName();
String element = at.getElement();
try {
Integer ob = (Integer) ReflectionNameUtil.getGetMethod(aw, element);
if ("GR交货数".equals(name) || "报工待入库".equals(name)) {
} else {
num = num + ob;
}
//再循环工序名称
for (Map.Entry> et : map2.entrySet()) {
if (name.equals(et.getKey())) {
Integer number = et.getValue().stream().mapToInt(WorkInProcessResultDto::getTotalnum).sum();
ReflectionNameUtil.setValue(wp, wp.getClass(), element, AssembleWorkInProcessDto.class.getDeclaredField(element).getType(), number);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
aw.setWaitNumber(tn - num);
}
for (String pl:processNameList){
for (AssembleTitleDto tl:titleDtos){
if(pl.equals(tl.getElementName())){
titleDtoSort.add(tl);
}
}
}
result.sort(Comparator.comparing(AssembleWorkInProcessDto::getOrderNumber));
wp.setWaitNumber(result.stream().mapToInt(AssembleWorkInProcessDto::getWaitNumber).sum());
wp.setTotalnum(result.stream().mapToInt(AssembleWorkInProcessDto::getTotalnum).sum());
wp.setOrderNumber("汇总");
sum = wp.getTotalnum();
}
AssembleTitleDto cateDto = new AssembleTitleDto();
cateDto.setElementName("订单号");
cateDto.setElement("orderNumber");
titleDtoSort.add(0, cateDto);
AssembleTitleDto titleDto2 = new AssembleTitleDto();
titleDto2.setElementName("工序编码");
titleDto2.setElement("process");
titleDtoSort.add(titleDto2);
resultMap.put("resultList", result);
resultMap.put("titleList", titleDtoSort);
return sum;
}
@Override
public Map selectAssembleList(WorkInProcessDto req) {
List orderNos = StringUtils.isEmpty(req.getOrderNum()) ? null : Arrays.asList(req.getOrderNum().split("n"));
req.setOrderNos(orderNos);
Map resultMap = new HashMap<>();
Map titleMap = new HashMap<>();
List result = new ArrayList<>();
List titleDtos = new ArrayList<>();
List titleDtoSort = new ArrayList<>();
List resultList = workInProcessDao.selectAssembleList(req);
if (resultList != null && resultList.size() > 0) {
Set processNameList = new linkedHashSet<>();
for (WorkInProcessResultDto ls :resultList){
processNameList.add(ls.getProcessname());
}
List lists = getStringList();
//按照工厂或者线体分组
Map> codeMap = resultList.stream().collect(groupingBy(WorkInProcessResultDto::getDimCode));
//按照工序分组
Map> map = resultList.stream().collect(groupingBy(WorkInProcessResultDto::getProcess));
//先循环工厂或者线体
for (Map.Entry> entry : codeMap.entrySet()) {
String key = entry.getKey();
AssembleWorkInProcessDto processDto = new AssembleWorkInProcessDto();
processDto.setDimCode(key);
processDto.setTname(entry.getValue().get(0).getTname());
int x = 0;
//再循环工序
for (Map.Entry> ent : map.entrySet()) {
List list = ent.getValue();
String field = lists.get(x);
AssembleTitleDto titleDto = new AssembleTitleDto();
titleDto.setElement(field);
titleDto.setElementName(list.get(0).getProcessname());
titleMap.put(field, titleDto);
for (int i = 0; i < list.size(); i++) {
WorkInProcessResultDto ls = list.get(i);
if (key.equals(ls.getDimCode())) {
try {
processDto.setProcess(ls.getProcess());
ReflectionNameUtil.setValue(processDto, processDto.getClass(), field, AssembleWorkInProcessDto.class.getDeclaredField(field).getType(), ls.getTotalnum());
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
} else {
try {
processDto.setProcess(ls.getProcess());
Object ob = ReflectionNameUtil.getGetMethod(processDto, field);
if (ob == null) {
ReflectionNameUtil.setValue(processDto, processDto.getClass(), field, AssembleWorkInProcessDto.class.getDeclaredField(field).getType(), 0);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
x = x + 1;
}
result.add(processDto);
}
//获取菜单列
if (titleMap.size() > 0) {
for (Map.Entry entry : titleMap.entrySet()) {
titleDtos.add(entry.getValue());
}
}
//查询订单数字段
List totalNumbers = workInProcessDao.selectTotalNumber(req);
//按照工序名称分组
Map> map2 = resultList.stream().collect(groupingBy(WorkInProcessResultDto::getProcessname));
if (totalNumbers != null && totalNumbers.size() > 0) {
Map> totalMap = totalNumbers.stream().collect(groupingBy(WorkInProcessResultDto::getDimCode));
AssembleWorkInProcessDto wp = new AssembleWorkInProcessDto();
for (AssembleWorkInProcessDto aw : result) {
// int tn = totalMap.get(aw.getDimCode()).get(0).getTotalnum();
req.setPline(aw.getDimCode());
int tn = selectAssembleSecondOrderNum(req);
aw.setTotalnum(tn);
Integer num = 0;
for (AssembleTitleDto at : titleDtos) {
String name = at.getElementName();
String element = at.getElement();
try {
Integer ob = (Integer) ReflectionNameUtil.getGetMethod(aw, element);
if ("GR交货数".equals(name) || "报工待入库".equals(name)) {
} else {
num = num + ob;
}
//再循环工序名称
for (Map.Entry> et : map2.entrySet()) {
if (name.equals(et.getKey())) {
Integer number = et.getValue().stream().mapToInt(WorkInProcessResultDto::getTotalnum).sum();
ReflectionNameUtil.setValue(wp, wp.getClass(), element, AssembleWorkInProcessDto.class.getDeclaredField(element).getType(), number);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
aw.setWaitNumber(tn - num);
}
for (String pl:processNameList){
for (AssembleTitleDto tl:titleDtos){
if(pl.equals(tl.getElementName())){
titleDtoSort.add(tl);
}
}
}
result.sort(Comparator.comparing(AssembleWorkInProcessDto ::getDimCode));
wp.setWaitNumber(result.stream().mapToInt(AssembleWorkInProcessDto::getWaitNumber).sum());
wp.setTotalnum(result.stream().mapToInt(AssembleWorkInProcessDto::getTotalnum).sum());
wp.setTname("汇总");
result.add(0, wp);
AssembleTitleDto cateDtoa = new AssembleTitleDto();
cateDtoa.setElementName("待投数(有WIP的订单)");
cateDtoa.setElement("waitNumber");
titleDtoSort.add(cateDtoa);
AssembleTitleDto cateDtob = new AssembleTitleDto();
cateDtob.setElementName("订单数量(有WIP的订单)");
cateDtob.setElement("totalnum");
titleDtoSort.add(cateDtob);
}
}
AssembleTitleDto cateDto = new AssembleTitleDto();
cateDto.setElementName("分类");
cateDto.setElement("tname");
titleDtoSort.add(0, cateDto);
AssembleTitleDto titleDto1 = new AssembleTitleDto();
titleDto1.setElementName("分类编码");
titleDto1.setElement("dimCode");
AssembleTitleDto titleDto2 = new AssembleTitleDto();
titleDto2.setElementName("工序编码");
titleDto2.setElement("process");
titleDtoSort.add(titleDto1);
titleDtoSort.add(titleDto2);
resultMap.put("resultList", result);
resultMap.put("titleList", titleDtoSort);
Map resp = new HashMap<>(16);
resp.put("DataList", titleDtoSort);
resp.put("restList", result);
String key = UUID.randomUUID().toString();
Map map = new linkedHashMap<>();
map.put("cumulativeDate", "日期");
andonDataAnalyseKanbanService.saveAndGetValueByRedis(key, JSONObject.toJSonString(map) + "&" + JSONArray.toJSonString(resp));
resultMap.put("keyOne", key);
return resultMap;
}
public List getStringList() {
List list = new linkedList<>();
list.add("oneNum");
list.add("twoNum");
list.add("threeNum");
list.add("fourNum");
list.add("fiveNum");
list.add("sixNum");
list.add("sevenNum");
list.add("eightNum");
list.add("nineNum");
list.add("tenNum");
list.add("elevenNum");
list.add("twelveNum");
list.add("thirteenNum");
list.add("fourteenNum");
list.add("fifteenNum");
list.add("sixteenNum");
list.add("seventeenNum");
list.add("eighteenNum");
list.add("nineteenNum");
list.add("twentyNum");
list.add("twentyOneNum");
list.add("twentyTwoNum");
list.add("twentyThree");
list.add("twentyFour");
list.add("twentyFIve");
list.add("twentySix");
list.add("twentySeven");
list.add("twentyEight");
list.add("twentyNine");
list.add("twentyTen");
list.add("ThirtyOne");
list.add("ThirtyTwo");
list.add("ThirtyThree");
list.add("ThirtyFour");
list.add("ThirtyFive");
return list;
}
@Override
public Map selectAssembleSecondList(WorkInProcessDto req) {
List orderNos = StringUtils.isEmpty(req.getOrderNum()) ? null : Arrays.asList(req.getOrderNum().split("n"));
req.setOrderNos(orderNos);
Map resultMap = new HashMap<>();
Map titleMap = new HashMap<>();
List result = new ArrayList<>();
List titleDtos = new ArrayList<>();
List titleDtoSort = new ArrayList<>();
if ("分类".equals(req.getProcessname())) {
req.setProcessname("");
}
List resultList = workInProcessDao.selectAssembleSecondList(req);
if (resultList != null && resultList.size() > 0) {
Set processNameList = new linkedHashSet<>();
for (WorkInProcessResultDto ls :resultList){
processNameList.add(ls.getProcessname());
}
List lists = getStringList();
//按照工厂或者线体分组
Map> codeMap = resultList.stream().collect(groupingBy(WorkInProcessResultDto::getAufnr));
//按照工序分组
Map> map = resultList.stream().collect(groupingBy(WorkInProcessResultDto::getProcess));
//先循环工厂或者线体
for (Map.Entry> entry : codeMap.entrySet()) {
String key = entry.getKey();
List valueList = entry.getValue();
AssembleWorkInProcessDto processDto = new AssembleWorkInProcessDto();
processDto.setOrderNumber(key);
processDto.setPsStartTime(valueList.get(0).getPsStartTime());
processDto.setWorkLine(valueList.get(0).getPline());
int x = 0;
//再循环工序
for (Map.Entry> ent : map.entrySet()) {
List list = ent.getValue();
String field = lists.get(x);
AssembleTitleDto titleDto = new AssembleTitleDto();
titleDto.setElement(field);
titleDto.setElementName(list.get(0).getProcessname());
titleMap.put(field, titleDto);
for (int i = 0; i < list.size(); i++) {
WorkInProcessResultDto ls = list.get(i);
if (key.equals(ls.getAufnr())) {
try {
processDto.setProcess(ls.getProcess());
ReflectionNameUtil.setValue(processDto, processDto.getClass(), field, AssembleWorkInProcessDto.class.getDeclaredField(field).getType(), ls.getTotalnum());
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
} else {
try {
processDto.setProcess(ls.getProcess());
Object ob = ReflectionNameUtil.getGetMethod(processDto, field);
if (ob == null) {
ReflectionNameUtil.setValue(processDto, processDto.getClass(), field, AssembleWorkInProcessDto.class.getDeclaredField(field).getType(), 0);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
x = x + 1;
}
result.add(processDto);
}
//获取菜单列
if (titleMap.size() > 0) {
for (Map.Entry entry : titleMap.entrySet()) {
titleDtos.add(entry.getValue());
}
}
//按照工序名称分组
Map> map2 = resultList.stream().collect(groupingBy(WorkInProcessResultDto::getProcessname));
AssembleWorkInProcessDto wp = new AssembleWorkInProcessDto();
for (AssembleWorkInProcessDto aw : result) {
req.setAufnr(aw.getOrderNumber());
//查询订单数字段
Integer tn = workInProcessDao.selectTotalNumberByOrderNumber(req);
if (tn == null) {
tn = 0;
}
aw.setTotalnum(tn);
Integer num = 0;
for (AssembleTitleDto at : titleDtos) {
String name = at.getElementName();
String element = at.getElement();
try {
Integer ob = (Integer) ReflectionNameUtil.getGetMethod(aw, element);
if ("GR交货数".equals(name) || "报工待入库".equals(name)) {
} else {
num = num + ob;
}
//再循环工序名称
for (Map.Entry> et : map2.entrySet()) {
if (name.equals(et.getKey())) {
Integer number = et.getValue().stream().mapToInt(WorkInProcessResultDto::getTotalnum).sum();
ReflectionNameUtil.setValue(wp, wp.getClass(), element, AssembleWorkInProcessDto.class.getDeclaredField(element).getType(), number);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
aw.setWaitNumber(tn - num);
}
for (String pl:processNameList){
for (AssembleTitleDto tl:titleDtos){
if(pl.equals(tl.getElementName())){
titleDtoSort.add(tl);
}
}
}
result.sort(Comparator.comparing(AssembleWorkInProcessDto::getOrderNumber));
wp.setWaitNumber(result.stream().mapToInt(AssembleWorkInProcessDto::getWaitNumber).sum());
wp.setTotalnum(result.stream().mapToInt(AssembleWorkInProcessDto::getTotalnum).sum());
wp.setOrderNumber("汇总");
result.add(0, wp);
AssembleTitleDto cateDtoa = new AssembleTitleDto();
cateDtoa.setElementName("待投数(有WIP的订单)");
cateDtoa.setElement("waitNumber");
titleDtoSort.add(cateDtoa);
AssembleTitleDto cateDtob = new AssembleTitleDto();
cateDtob.setElementName("订单数量(有WIP的订单)");
cateDtob.setElement("totalnum");
titleDtoSort.add(cateDtob);
}
AssembleTitleDto cateDto01 = new AssembleTitleDto();
cateDto01.setElementName("产线");
cateDto01.setElement("workLine");
titleDtoSort.add(0, cateDto01);
AssembleTitleDto cateDto02 = new AssembleTitleDto();
cateDto02.setElementName("排程开始时间");
cateDto02.setElement("psStartTime");
titleDtoSort.add(0, cateDto02);
AssembleTitleDto cateDto = new AssembleTitleDto();
cateDto.setElementName("订单号");
cateDto.setElement("orderNumber");
titleDtoSort.add(0, cateDto);
AssembleTitleDto titleDto2 = new AssembleTitleDto();
titleDto2.setElementName("工序编码");
titleDto2.setElement("process");
titleDtoSort.add(titleDto2);
resultMap.put("resultList", result);
resultMap.put("titleList", titleDtoSort);
Map resp = new HashMap<>(16);
resp.put("DataList", titleDtoSort);
resp.put("restList", result);
String key = UUID.randomUUID().toString();
Map map = new linkedHashMap<>();
map.put("cumulativeDate", "日期");
andonDataAnalyseKanbanService.saveAndGetValueByRedis(key, JSONObject.toJSonString(map) + "&" + JSONArray.toJSonString(resp));
resultMap.put("keyTwo", key);
return resultMap;
}
@Override
public QueryResult selectAssembleThirdList(WorkInProcessDto req) {
List orderNos = StringUtils.isEmpty(req.getOrderNum()) ? null : Arrays.asList(req.getOrderNum().split("n"));
req.setOrderNos(orderNos);
if ("订单号".equals(req.getProcessname())) {
if("gx".equals(req.getTwoname())){
req.setProcessname("");
}else {
req.setProcessname(req.getTwoname());
}
}
PageHelper.startPage(req.getTpageNum(), req.getTnumPerPage());
Page resultList = workInProcessDao.selectAssembleThirdList(req);
return PaginationHelp.parseDTOPage(resultList);
}
@Override
public List selectAssembleThirdListAll(WorkInProcessDto req) {
List orderNos = StringUtils.isEmpty(req.getOrderNum()) ? null : Arrays.asList(req.getOrderNum().split("n"));
req.setOrderNos(orderNos);
if ("订单号".equals(req.getProcessname())) {
req.setProcessname("");
}
List resultList = workInProcessDao.selectAssembleThirdList(req);
return resultList;
}
private List getV4(List baseList ){
return workInProcessDao.getSmtWitList(baseList);
}
class Task implements Callable {
private Object object;
private Object[] args;
private String methodName;
public Task(Object object, String methodName, Object[] args) {
this.object = object;
this.args = args;
this.methodName = methodName;
}
@Override
public T call() throws Exception {
Method method = object.getClass().getMethod(methodName);
return (T) method.invoke(object, args);
}
}
public List method1() {
List smtWitList = null;
try {
smtWitList = workInProcessDao.getSmtWitList(this.baseList);
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
return smtWitList;
}
public List method2() {
List patchList = null;
try {
patchList = workInProcessDao.getPatchList(this.list,this.baseList);
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
return patchList;
}
private T futureGetProxy(Future future, Class clazz) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(clazz);
return (T) enhancer.create(clazz, new FutureLazyLoader(future));
}
class FutureLazyLoader implements LazyLoader {
private Future future;
public FutureLazyLoader(Future future) {
this.future = future;
}
@Override
public Object loadObject() throws Exception {
return future.get();
}
}
private List baseList;
private List list;
private class GetNumber {
private Map> smtWitMap;
private Map> patchMap;
private Map> waitMap;
private Map> inStorageMap;
private WorkInProcessV3Dto dto;
private Double d1;
private Double d2;
private Double pl;
private Double te;
private Double re;
private Double in;
private Double inNum;
public GetNumber(Map> smtWitMap, Map> patchMap, Map> waitMap, Map> inStorageMap, WorkInProcessV3Dto dto) {
this.smtWitMap = smtWitMap;
this.patchMap = patchMap;
this.waitMap = waitMap;
this.inStorageMap = inStorageMap;
this.dto = dto;
}
public Double getD1() {
return d1;
}
public Double getD2() {
return d2;
}
public Double getPl() {
return pl;
}
public Double getTe() {
return te;
}
public Double getRe() {
return re;
}
public Double getIn() {
return in;
}
public Double getInNum() {
return inNum;
}
public GetNumber invoke() {
try {
d1 = patchMap.get(dto.getAufnr()).stream().mapToDouble(WorkInProcessV5Dto::getDz01num).sum();
} catch (Exception e) {
d1 = 0.0;
}
try {
d2 = patchMap.get(dto.getAufnr()).stream().mapToDouble(WorkInProcessV5Dto::getDz02num).sum();
} catch (Exception e) {
d2 = 0.0;
}
try {
pl = waitMap.get(dto.getAufnr()).stream().mapToDouble(WorkInProcessV6Dto::getWait_plug).sum();
} catch (Exception e) {
pl = 0.0;
}
try {
te = waitMap.get(dto.getAufnr()).stream().mapToDouble(WorkInProcessV6Dto::getWait_test).sum();
} catch (Exception e) {
te = 0.0;
}
try {
re = waitMap.get(dto.getAufnr()).stream().mapToDouble(WorkInProcessV6Dto::getWait_repair).sum();
} catch (Exception e) {
re = 0.0;
}
try {
in = inStorageMap.get(dto.getAufnr()).stream().mapToDouble(WorkInProcessV8Dto::getWait_in_storage).sum();
} catch (Exception e) {
in = 0.0;
}
try {
inNum = smtWitMap.get(dto.getAufnr()).stream().mapToDouble(WorkInProcessV4Dto::getIn_num).sum();
} catch (Exception e) {
inNum = 0.0;
}
return this;
}
}
private class GetDzTime {
private Map> wiMap;
private WorkInProcessV3Dto dto;
private Double dz01_time;
private Double dz02_time;
private Double dz03_time;
private Double dz04_time;
public GetDzTime(Map> wiMap, WorkInProcessV3Dto dto) {
this.wiMap = wiMap;
this.dto = dto;
}
public Double getDz01_time() {
return dz01_time;
}
public Double getDz02_time() {
return dz02_time;
}
public Double getDz03_time() {
return dz03_time;
}
public Double getDz04_time() {
return dz04_time;
}
public GetDzTime invoke() {
try {
dz01_time = wiMap.get(dto.getAufnr()).get(0).getDz01_time();
if(dz01_time == null){
dz01_time = 0.0;
}
} catch (Exception e) {
dz01_time = 0.0;
}
try {
dz02_time = wiMap.get(dto.getAufnr()).get(0).getDz02_time();
if(dz02_time == null){
dz02_time = 0.0;
}
} catch (Exception e) {
dz02_time = 0.0;
}
try {
dz03_time = wiMap.get(dto.getAufnr()).get(0).getDz03_time();
if(dz03_time == null){
dz03_time = 0.0;
}
} catch (Exception e) {
dz03_time = 0.0;
}
try {
dz04_time = wiMap.get(dto.getAufnr()).get(0).getDz04_time();
if(dz04_time == null){
dz04_time = 0.0;
}
} catch (Exception e) {
dz04_time = 0.0;
}
return this;
}
}
}