package com.qianwen.smartman.modules.fms.service.impl; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.function.Function; import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.collect.Lists; import com.qianwen.core.log.exception.ServiceException; import com.qianwen.core.mp.base.BaseServiceImpl; import com.qianwen.core.mp.support.Condition; import com.qianwen.core.mp.support.Query; import com.qianwen.core.tool.utils.DateUtil; import com.qianwen.core.tool.utils.Func; import com.qianwen.smartman.common.constant.DateConstant; import com.qianwen.smartman.common.constant.FmsConstant; import com.qianwen.smartman.common.utils.Lambda; import com.qianwen.smartman.common.utils.ListUtils; import com.qianwen.smartman.common.utils.MessageUtils; import com.qianwen.smartman.modules.cps.convert.CraftRoutingConvert; import com.qianwen.smartman.modules.cps.dto.CraftVersionDTO; import com.qianwen.smartman.modules.cps.entity.CommonGroup; import com.qianwen.smartman.modules.cps.entity.CraftVersionLine; import com.qianwen.smartman.modules.cps.entity.ProductionCraftProcess; import com.qianwen.smartman.modules.cps.entity.ProductionCraftProcessRelatedTool; import com.qianwen.smartman.modules.cps.entity.Tray; import com.qianwen.smartman.modules.cps.entity.TrayFixture; import com.qianwen.smartman.modules.cps.enums.ProductionCraftStatusEnum; import com.qianwen.smartman.modules.cps.service.ICommonGroupService; import com.qianwen.smartman.modules.cps.service.ICraftRoutingService; import com.qianwen.smartman.modules.cps.service.ICraftVersionLineService; import com.qianwen.smartman.modules.cps.service.IProductionCraftProcessRelatedFixtureService; import com.qianwen.smartman.modules.cps.service.IProductionCraftProcessRelatedToolService; import com.qianwen.smartman.modules.cps.service.IProductionCraftProcessService; import com.qianwen.smartman.modules.cps.service.ITrayFixtureService; import com.qianwen.smartman.modules.cps.service.ITrayService; import com.qianwen.smartman.modules.cps.vo.CraftRoutingDetailVO; import com.qianwen.smartman.modules.cps.vo.CraftRoutingVO; import com.qianwen.smartman.modules.cps.vo.IdsVO; import com.qianwen.smartman.modules.fms.convert.FmsOrderConvert; import com.qianwen.smartman.modules.fms.convert.FmsOrderProcessConvert; import com.qianwen.smartman.modules.fms.convert.FmsOrderProcessFixtureConvert; import com.qianwen.smartman.modules.fms.convert.FmsOrderProcessToolConvert; import com.qianwen.smartman.modules.fms.entity.FmsInstructionRecord; import com.qianwen.smartman.modules.fms.entity.FmsOrder; import com.qianwen.smartman.modules.fms.entity.FmsOrderProcess; import com.qianwen.smartman.modules.fms.entity.FmsOrderProcessFixture; import com.qianwen.smartman.modules.fms.entity.FmsOrderProcessTool; import com.qianwen.smartman.modules.fms.enums.FmsOrderEnum; import com.qianwen.smartman.modules.fms.enums.OrderStatusEnum; import com.qianwen.smartman.modules.fms.mapper.FmsOrderMapper; import com.qianwen.smartman.modules.fms.service.IFmsInstructionRecordService; import com.qianwen.smartman.modules.fms.service.IFmsOrderProcessFixtureService; import com.qianwen.smartman.modules.fms.service.IFmsOrderProcessService; import com.qianwen.smartman.modules.fms.service.IFmsOrderProcessToolService; import com.qianwen.smartman.modules.fms.service.IFmsOrderService; import com.qianwen.smartman.modules.fms.vo.FmsOrderDetailVO; import com.qianwen.smartman.modules.fms.vo.FmsOrderProductionStatVO; import com.qianwen.smartman.modules.fms.vo.FmsOrderQueryVO; import com.qianwen.smartman.modules.fms.vo.FmsOrderStatusStatVO; import com.qianwen.smartman.modules.fms.vo.FmsOrderVO; import com.qianwen.smartman.modules.system.entity.Dict; import com.qianwen.smartman.modules.system.service.ICodeGeneratorService; import com.qianwen.smartman.modules.system.service.IDictService; import com.qianwen.smartman.modules.system.service.IParamService; import com.qianwen.smartman.modules.tpm.enums.MetaTypeEnum; import cn.hutool.core.bean.BeanUtil; @Service /* loaded from: blade-api.jar:BOOT-INF/classes/org/springblade/modules/fms/service/impl/FmsOrderServiceImpl.class */ public class FmsOrderServiceImpl extends BaseServiceImpl implements IFmsOrderService { private static final Logger log = LoggerFactory.getLogger(FmsOrderServiceImpl.class); private final IDictService dictService; private final ICraftRoutingService craftRoutingService; private final IFmsOrderProcessService fmsOrderProcessService; private final IProductionCraftProcessService productionCraftProcessService; private final IProductionCraftProcessRelatedFixtureService productionCraftProcessRelatedFixtureService; private final IProductionCraftProcessRelatedToolService productionCraftProcessRelatedToolService; private final IFmsOrderProcessFixtureService fmsOrderProcessFixtureService; private final IFmsOrderProcessToolService fmsOrderProcessToolService; private final ICodeGeneratorService codeGeneratorService; private final ITrayFixtureService trayFixtureService; private final ITrayService trayService; private final ICraftVersionLineService craftVersionLineService; private final ICommonGroupService commonGroupService; private final String[] emptyRange = {"", ""}; private final IFmsInstructionRecordService fmsInstructionRecordService; private final IParamService paramService; public FmsOrderServiceImpl(final IDictService dictService, final ICraftRoutingService craftRoutingService, final IFmsOrderProcessService fmsOrderProcessService, final IProductionCraftProcessService productionCraftProcessService, final IProductionCraftProcessRelatedFixtureService productionCraftProcessRelatedFixtureService, final IProductionCraftProcessRelatedToolService productionCraftProcessRelatedToolService, final IFmsOrderProcessFixtureService fmsOrderProcessFixtureService, final IFmsOrderProcessToolService fmsOrderProcessToolService, final ICodeGeneratorService codeGeneratorService, final ITrayFixtureService trayFixtureService, final ITrayService trayService, final ICraftVersionLineService craftVersionLineService, final ICommonGroupService commonGroupService, final IFmsInstructionRecordService fmsInstructionRecordService, final IParamService paramService) { this.dictService = dictService; this.craftRoutingService = craftRoutingService; this.fmsOrderProcessService = fmsOrderProcessService; this.productionCraftProcessService = productionCraftProcessService; this.productionCraftProcessRelatedFixtureService = productionCraftProcessRelatedFixtureService; this.productionCraftProcessRelatedToolService = productionCraftProcessRelatedToolService; this.fmsOrderProcessFixtureService = fmsOrderProcessFixtureService; this.fmsOrderProcessToolService = fmsOrderProcessToolService; this.codeGeneratorService = codeGeneratorService; this.trayFixtureService = trayFixtureService; this.trayService = trayService; this.craftVersionLineService = craftVersionLineService; this.commonGroupService = commonGroupService; this.fmsInstructionRecordService = fmsInstructionRecordService; this.paramService = paramService; } @Override // org.springblade.modules.fms.service.IFmsOrderService public IPage getPageOrder(FmsOrderQueryVO fmsOrderQueryVO, Query query) { String[] startTimeRange = (String[]) Optional.ofNullable(fmsOrderQueryVO.getPlanStartTime()).map(item -> { return Func.split(item, ","); }).orElse(this.emptyRange); String[] endTimeRange = (String[]) Optional.ofNullable(fmsOrderQueryVO.getPlanEndTime()).map(item2 -> { return Func.split(item2, ","); }).orElse(this.emptyRange); Date startTimeDateBegin = null; Date startTimeDateFinish = null; Date endTimeDateBegin = null; Date endTimeDateFinish = null; if (Func.isNotEmpty(startTimeRange[0])) { startTimeDateBegin = DateUtil.parse(startTimeRange[0], DateConstant.PATTERN_DATE_TIME); startTimeDateFinish = DateUtil.parse(startTimeRange[1], DateConstant.PATTERN_DATE_TIME); } if (Func.isNotEmpty(endTimeRange[0])) { endTimeDateBegin = DateUtil.parse(endTimeRange[0], DateConstant.PATTERN_DATE_TIME); endTimeDateFinish = DateUtil.parse(endTimeRange[1], DateConstant.PATTERN_DATE_TIME); } LambdaQueryWrapper fmsOrderLambdaQueryWrapper =Wrappers.lambdaQuery() .eq(Func.isNotEmpty(fmsOrderQueryVO.getOrderType()), FmsOrder::getOrderType, fmsOrderQueryVO.getOrderType()) .between(Func.isNotEmpty(fmsOrderQueryVO.getPlanStartTime()), FmsOrder::getPlanStartTime, startTimeDateBegin, startTimeDateFinish) .between(Func.isNotEmpty(fmsOrderQueryVO.getPlanEndTime()), FmsOrder::getPlanEndTime, endTimeDateBegin, endTimeDateFinish) .likeRight(Func.isNotEmpty(fmsOrderQueryVO.getCode()), FmsOrder::getCode, fmsOrderQueryVO.getCode()) .in(Func.isNotEmpty(fmsOrderQueryVO.getOrderStatus()), FmsOrder::getOrderStatus, Lists.newArrayList((Object[])Func.split(fmsOrderQueryVO.getOrderStatus(), ","))); /* LambdaQueryWrapper fmsOrderLambdaQueryWrapper = Wrappers.lambdaQuery().eq(Func.isNotEmpty(fmsOrderQueryVO.getOrderType()), (v0) -> { return v0.getOrderType(); }, fmsOrderQueryVO.getOrderType()).between(Func.isNotEmpty(fmsOrderQueryVO.getPlanStartTime()), (v0) -> { return v0.getPlanStartTime(); }, startTimeDateBegin, startTimeDateFinish).between(Func.isNotEmpty(fmsOrderQueryVO.getPlanEndTime()), (v0) -> { return v0.getPlanEndTime(); }, endTimeDateBegin, endTimeDateFinish).likeRight(Func.isNotEmpty(fmsOrderQueryVO.getCode()), (v0) -> { return v0.getCode(); }, fmsOrderQueryVO.getCode()).in(Func.isNotEmpty(fmsOrderQueryVO.getOrderStatus()), (v0) -> { return v0.getOrderStatus(); }, Lists.newArrayList(Func.split(fmsOrderQueryVO.getOrderStatus(), ",")));*/ IPage fmsOrderIPage = page(Condition.getPage(query), fmsOrderLambdaQueryWrapper); List fmsOrderVOList = wrapper(fmsOrderIPage.getRecords()); Page page = new Page<>(fmsOrderIPage.getCurrent(), fmsOrderIPage.getSize(), fmsOrderIPage.getTotal()); page.setRecords(fmsOrderVOList); return page; } public List wrapper(List orders) { List fmsOrderVOList = FmsOrderConvert.INSTANCE.convert(orders); Map fmsOrderTypeMap = this.dictService.getList(FmsOrderEnum.FMS_ORDER_TYPE.getCode()).stream().collect(Collectors.toMap((v0) -> { return v0.getDictKey(); }, v -> { return v; })); Map fmsOrderStatusMap = this.dictService.getList(FmsOrderEnum.FMS_ORDER_STATUS.getCode()).stream().collect(Collectors.toMap((v0) -> { return v0.getDictKey(); }, v2 -> { return v2; })); fmsOrderVOList.forEach(fmsOrderVO -> { fmsOrderVO.setOrderStatusLabel((String) Optional.ofNullable(fmsOrderStatusMap.get(fmsOrderVO.getOrderStatus())).map((v0) -> { return v0.getDictValue(); }).orElse("")); fmsOrderVO.setOrderTypeLabel((String) Optional.ofNullable(fmsOrderTypeMap.get(fmsOrderVO.getOrderType())).map((v0) -> { return v0.getDictValue(); }).orElse("")); }); return fmsOrderVOList; } public FmsOrderVO wrapper(FmsOrder order) { List fmsOrderVOS = wrapper(Collections.singletonList(order)); return fmsOrderVOS.get(0); } @Override // org.springblade.modules.fms.service.IFmsOrderService public List listCraft() { List craftRoutingDetailVOS = new ArrayList<>(); List craftRoutingVOS = CraftRoutingConvert.INSTANCE.convert(this.craftRoutingService.list()); craftRoutingVOS.forEach(craftRoutingVO -> { CraftRoutingDetailVO craftRoutingDetailVO = this.craftRoutingService.detailCraft(craftRoutingVO.getId()); craftRoutingDetailVOS.addAll(filterCraft(craftRoutingDetailVO)); }); return craftRoutingDetailVOS; } @Override // org.springblade.modules.fms.service.IFmsOrderService public List listProductionCraft(String productionId) { List craftRoutingDetailVOS = new ArrayList<>(); CraftRoutingDetailVO craftRoutingDetailVO = this.craftRoutingService.getCraftByProduction(Long.valueOf(productionId)); if (Func.isEmpty(craftRoutingDetailVO)) { return craftRoutingDetailVOS; } List craftRoutingDetailVOS2 = filterCraft(craftRoutingDetailVO); return craftRoutingDetailVOS2; } public List filterCraft(CraftRoutingDetailVO craftRoutingDetailVO) { List craftRoutingDetailVOS = new ArrayList<>(); List versionList = craftRoutingDetailVO.getDtos(); List versionDTOS = versionList.stream().filter(versionDTO -> { List versionLines = this.craftVersionLineService.list(Lambda.eq(CraftVersionLine::getVersionId, versionDTO.getId())); List groupIds = versionLines.stream().map(CraftVersionLine::getGroupId).collect(Collectors.toList()); /* List versionLines = this.craftVersionLineService.list(Lambda.eq((v0) -> { return v0.getVersionId(); }, versionDTO.getId())); List groupIds = (List) versionLines.stream().map((v0) -> { return v0.getGroupId(); }).collect(Collectors.toList()); */ /* if (Func.isNotEmpty(groupIds)) { return this.commonGroupService.list((Wrapper) Wrappers.query().lambda().in((v0) -> { return v0.getId(); }, groupIds)).stream().anyMatch(commonGroup -> { return Objects.equals(commonGroup.getGroupTag(), FmsOrderEnum.FMS_BELTLINE.getCode()); }); } return false;*/ return Func.isNotEmpty(groupIds) ? this.commonGroupService.list(Wrappers.query().lambda().in(CommonGroup::getId, groupIds)).stream().anyMatch(commonGroup -> { return Objects.equals(commonGroup.getGroupTag(), FmsOrderEnum.FMS_BELTLINE.getCode()); }) : false; }).collect(Collectors.toList()); craftRoutingDetailVO.setDtos(versionDTOS.stream().filter(versionDTO2 -> { return versionDTO2.getEditionStatus().equals(ProductionCraftStatusEnum.FINALIZED.getStatus()); }).collect(Collectors.toList())); craftRoutingDetailVOS.add(craftRoutingDetailVO); return craftRoutingDetailVOS; } @Override // org.springblade.modules.fms.service.IFmsOrderService @Transactional public FmsOrderDetailVO save(FmsOrderVO fmsOrderVO) { FmsOrder fmsOrder = FmsOrderConvert.INSTANCE.convert(fmsOrderVO); if (Func.isBlank(fmsOrderVO.getCode())) { String code = this.codeGeneratorService.getGeneratorCode(fmsOrder, MetaTypeEnum.FMS_ORDER.getCode()); log.info("工单编码规则生成的code:{}", code + "," + code.length()); fmsOrder.setCode(code); } if (Func.isEmpty(fmsOrderVO.getId())) { fmsOrder.setOrderStatus(Integer.valueOf(OrderStatusEnum.WAIT_PUBLISH.getValue())); ((FmsOrderMapper) this.baseMapper).insert(fmsOrder); FmsOrderVO orderVO = wrapper(fmsOrder); FmsOrderDetailVO fmsOrderDetailVO = FmsOrderConvert.INSTANCE.convertToDetail(fmsOrder); fmsOrderDetailVO.setOrderStatusLabel(orderVO.getOrderStatusLabel()); fmsOrderDetailVO.setOrderTypeLabel(orderVO.getOrderTypeLabel()); return saveProcess(fmsOrder, fmsOrderDetailVO, fmsOrderVO); } FmsOrder fmsOrderOld = (FmsOrder) ((FmsOrderMapper) this.baseMapper).selectOne(Lambda.eq((v0) -> { return v0.getId(); }, fmsOrder.getId())); ((FmsOrderMapper) this.baseMapper).updateById(fmsOrder); List fmsOrderProcessList = this.fmsOrderProcessService.list(Wrappers.query().lambda().eq(FmsOrderProcess::getOrderId, fmsOrderVO.getId())); /* List fmsOrderProcessList = this.fmsOrderProcessService.list((Wrapper) Wrappers.query().lambda().eq((v0) -> { return v0.getOrderId(); }, fmsOrderVO.getId()));*/ FmsOrderVO orderVO2 = wrapper(fmsOrder); FmsOrderDetailVO fmsOrderDetailVO2 = FmsOrderConvert.INSTANCE.convertToDetail(fmsOrder); fmsOrderDetailVO2.setOrderStatusLabel(orderVO2.getOrderStatusLabel()); fmsOrderDetailVO2.setOrderTypeLabel(orderVO2.getOrderTypeLabel()); if (fmsOrder.getCraftVersionId().equals(fmsOrderOld.getCraftVersionId())) { fmsOrderDetailVO2.setProcessList(fmsOrderProcessList); return fmsOrderDetailVO2; } this.fmsOrderProcessService.remove(Lambda.eq((v0) -> { return v0.getOrderId(); }, fmsOrderVO.getId())); this.fmsOrderProcessFixtureService.remove(Lambda.in((v0) -> { return v0.getOrderProcessId(); }, fmsOrderProcessList.stream().map((v0) -> { return v0.getId(); }).collect(Collectors.toList()))); this.fmsOrderProcessToolService.remove(Lambda.in((v0) -> { return v0.getOrderProcessId(); }, fmsOrderProcessList.stream().map((v0) -> { return v0.getId(); }).collect(Collectors.toList()))); return saveProcess(fmsOrder, fmsOrderDetailVO2, fmsOrderVO); } @Transactional public FmsOrderDetailVO saveProcess(FmsOrder fmsOrder, FmsOrderDetailVO fmsOrderDetailVO, FmsOrderVO fmsOrderVO) { List productionCraftProcesses = this.productionCraftProcessService.listProcessByVersion(fmsOrderVO.getCraftVersionId()); List fmsOrderProcesses = new ArrayList<>(); productionCraftProcesses.forEach(productionCraftProcess -> { FmsOrderProcess fmsOrderProcess = FmsOrderProcessConvert.INSTANCE.processToConvert(productionCraftProcess); fmsOrderProcess.setOrderId(fmsOrder.getId()); this.fmsOrderProcessService.save(fmsOrderProcess); fmsOrderProcesses.add(fmsOrderProcess); List fmsOrderProcessFixtureList = FmsOrderProcessFixtureConvert.INSTANCE.fixtureToConvert(this.productionCraftProcessRelatedFixtureService.getProductionCraftProcessRelatedFixtureListByProcessId(productionCraftProcess.getId())); fmsOrderProcessFixtureList.forEach(fmsOrderProcessFixture -> { fmsOrderProcessFixture.setOrderId(fmsOrder.getId()); fmsOrderProcessFixture.setOrderProcessId(fmsOrderProcess.getId()); TrayFixture trayFixture = this.trayFixtureService.getOne(Wrappers.query().lambda().eq(TrayFixture::getFixId, fmsOrderProcessFixture.getFixtureId())); Tray tray = this.trayService.getOne( Wrappers.query().lambda().eq(Tray::getId, trayFixture.getTrayId())); fmsOrderProcessFixture.setTrayId(tray.getId()); fmsOrderProcessFixture.setTrayCode(tray.getCode()); }); this.fmsOrderProcessFixtureService.saveBatch(fmsOrderProcessFixtureList); List fmsOrderProcessToolList = Lists.newArrayList(); List productionCraftProcessRelatedToolList = this.productionCraftProcessRelatedToolService.list(Wrappers.lambdaQuery().eq(ProductionCraftProcessRelatedTool::getVersionProcessId, productionCraftProcess.getId())); productionCraftProcessRelatedToolList.forEach(x -> { FmsOrderProcessTool fmsOrderProcessTool = FmsOrderProcessToolConvert.INSTANCE.toolToConvert(x); fmsOrderProcessTool.setOrderProcessId(fmsOrderProcess.getId()); fmsOrderProcessToolList.add(fmsOrderProcessTool); }); this.fmsOrderProcessToolService.saveBatch(fmsOrderProcessToolList); }); fmsOrderDetailVO.setProcessList(fmsOrderProcesses); return fmsOrderDetailVO; } @Override // org.springblade.modules.fms.service.IFmsOrderService @Transactional public void saveWorkstation(FmsOrderDetailVO fmsOrderDetailVO) { List processList = fmsOrderDetailVO.getProcessList(); processList.forEach(fmsOrderProcess -> { this.fmsOrderProcessService.update(Wrappers.update().lambda() .eq(FmsOrderProcess::getId, fmsOrderProcess.getId()) .set(FmsOrderProcess::getWorkStationId, fmsOrderProcess.getWorkStationId()) .set(FmsOrderProcess::getWorkStationName, fmsOrderProcess.getWorkStationName())); /* this.fmsOrderProcessService.update((Wrapper) ((LambdaUpdateWrapper) ((LambdaUpdateWrapper) Wrappers.update().lambda().eq((v0) -> { return v0.getId(); }, fmsOrderProcess.getId())).set((v0) -> { return v0.getWorkStationId(); }, fmsOrderProcess.getWorkStationId())).set((v0) -> { return v0.getWorkStationName(); }, fmsOrderProcess.getWorkStationName()));*/ }); } @Override // org.springblade.modules.fms.service.IFmsOrderService public FmsOrderStatusStatVO orderStatistics() { List> statusList = listMaps(new QueryWrapper() .select(new String[] { Lambda.getName(FmsOrder::getOrderStatus), "count(1) as \"count\"" }).lambda() .groupBy(FmsOrder::getOrderStatus)); /* List> statusList = listMaps((Wrapper) new QueryWrapper().select(new String[]{Lambda.getName((v0) -> { return v0.getOrderStatus(); }), "count(1) as \"count\""}).lambda().groupBy((v0) -> { return v0.getOrderStatus(); }));*/ long count = count(Lambda.eq(FmsOrder::getOrderStatus, Integer.valueOf(OrderStatusEnum.FINISHED.getValue())).isNotNull(FmsOrder::getOrderStatus) .between(FmsOrder::getEndTime, LocalDate.now(), LocalDateTime.now())); /* long count = count((Wrapper) ((ExtraLambdaQueryWrapper) Lambda.eq((v0) -> { return v0.getOrderStatus(); }, Integer.valueOf(OrderStatusEnum.FINISHED.getValue())).isNotNull((v0) -> { return v0.getOrderStatus(); })).between((v0) -> { return v0.getEndTime(); }, LocalDate.now(), LocalDateTime.now()));*/ FmsOrderStatusStatVO fmsOrderStatusStat = new FmsOrderStatusStatVO(); fmsOrderStatusStat.setWaitPublish(getOrderStatData(statusList, OrderStatusEnum.WAIT_PUBLISH)); fmsOrderStatusStat.setWaitMachine(getOrderStatData(statusList, OrderStatusEnum.WAIT_MACHINE)); fmsOrderStatusStat.setMachineIng(getOrderStatData(statusList, OrderStatusEnum.MACH_ING)); fmsOrderStatusStat.setPauseIng(getOrderStatData(statusList, OrderStatusEnum.PAUSE_ING)); fmsOrderStatusStat.setPause(getOrderStatData(statusList, OrderStatusEnum.PAUSE)); fmsOrderStatusStat.setTodayFinished(count); return fmsOrderStatusStat; } private long getOrderStatData(List> statusList, OrderStatusEnum orderStatusEnum) { return Long.parseLong(String.valueOf(statusList.stream().filter(item -> { return String.valueOf(item.get(FmsOrder.ORDER_STATUS)).equals(String.valueOf(orderStatusEnum.getValue())); }).findFirst().map(item2 -> { return item2.get("count"); }).orElse(0L))); } @Override // org.springblade.modules.fms.service.IFmsOrderService public List productionStatistics(final String orderId) { List> data = ((FmsOrderMapper) this.baseMapper).productionStatistics(orderId); return data.stream().map(item -> { return (FmsOrderProductionStatVO) BeanUtil.mapToBean(item, FmsOrderProductionStatVO.class, true); }).collect(Collectors.toList()); } @Override // org.springblade.modules.fms.service.IFmsOrderService @Transactional(rollbackFor = {Exception.class}) public FmsOrderVO pause(final String orderId) { FmsOrder fmsOrder = (FmsOrder) getById(orderId); if (OrderStatusEnum.MACH_ING.getValue() == fmsOrder.getOrderStatus().intValue()) { int online = fmsOrder.getOnlineNumber() == null ? 0 : fmsOrder.getOnlineNumber().intValue(); int offline = fmsOrder.getOfflineNumber() == null ? 0 : fmsOrder.getOfflineNumber().intValue(); fmsOrder.setOrderStatus(Integer.valueOf(online == offline ? OrderStatusEnum.PAUSE.getValue() : OrderStatusEnum.PAUSE_ING.getValue())); updateById(fmsOrder); return wrapper(fmsOrder); } throw new ServiceException(MessageUtils.message("fms.order.not.need.pause", new Object[0])); } @Override // org.springblade.modules.fms.service.IFmsOrderService @Transactional(rollbackFor = {Exception.class}) public List pauseBatch(List orderIds) { List list = new ArrayList<>(); orderIds.forEach(id -> { FmsOrderVO pause = pause(id); list.add(pause); }); return list; } @Override // org.springblade.modules.fms.service.IFmsOrderService @Transactional public FmsOrderVO start(final String orderId) { FmsOrderVO wrapper; synchronized (this) { FmsOrder fmsOrder = (FmsOrder) getById(orderId); int status = fmsOrder.getOrderStatus() == null ? OrderStatusEnum.WAIT_PUBLISH.getValue() : fmsOrder.getOrderStatus().intValue(); if (status == OrderStatusEnum.WAIT_PUBLISH.getValue()) { throw new ServiceException(MessageUtils.message("fms.order.not.publish", new Object[0])); } if (status == OrderStatusEnum.MACH_ING.getValue()) { throw new ServiceException(MessageUtils.message("fms.order.has.in.mach", new Object[0])); } if (status == OrderStatusEnum.FINISHED.getValue()) { throw new ServiceException(MessageUtils.message("fms.order.has.finish", new Object[0])); } List fixtures = this.fmsOrderProcessFixtureService.getListByOrderId(fmsOrder.getId()); List trayCodeList = fixtures.stream().map((v0) -> { return v0.getTrayCode(); }).collect(Collectors.toList()); List usingOrderList = getUsingOrderByTray(trayCodeList); String orderCodes = (String) usingOrderList.stream().map((v0) -> { return v0.getCode(); }).collect(Collectors.joining()); if (Func.isEmpty(usingOrderList)) { fmsOrder.setOrderStatus(Integer.valueOf(OrderStatusEnum.MACH_ING.getValue())); } else if (0 == fmsOrder.getPriority().intValue()) { boolean hasUsing = usingOrderList.stream().anyMatch(item -> { return !item.getOnlineNumber().equals(item.getOfflineNumber()); }); if (hasUsing) { throw new ServiceException(String.format(MessageUtils.message("fms.order.start.tray.using", new Object[0]), orderCodes)); } usingOrderList.forEach(order -> { order.setOrderStatus(Integer.valueOf(OrderStatusEnum.PAUSE.getValue())); }); fmsOrder.setOrderStatus(Integer.valueOf(OrderStatusEnum.MACH_ING.getValue())); updateBatchById(usingOrderList); } else { throw new ServiceException(String.format(MessageUtils.message("fms.order.start.tray.using", new Object[0]), orderCodes)); } updateById(fmsOrder); wrapper = wrapper(fmsOrder); } return wrapper; } @Override // org.springblade.modules.fms.service.IFmsOrderService @Transactional(rollbackFor = {Exception.class}) public List startOrders(List orderIds) { List result = Lists.newArrayList(); List toBeStartList = list(Wrappers.lambdaQuery().in(FmsOrder::getId, orderIds)); /* List toBeStartList = list((Wrapper) Wrappers.lambdaQuery().in((v0) -> { return v0.getId(); }, orderIds));*/ List statusEnumList = Arrays.asList(Integer.valueOf(OrderStatusEnum.WAIT_MACHINE.getValue()), Integer.valueOf(OrderStatusEnum.PAUSE.getValue()), Integer.valueOf(OrderStatusEnum.PAUSE_ING.getValue())); if (Func.isEmpty(toBeStartList)) { return FmsOrderConvert.INSTANCE.convert(toBeStartList); } log.info("初始工单:{}", orderIds); toBeStartList = toBeStartList.stream().filter(s -> statusEnumList.contains(s.getOrderStatus())).collect(Collectors.toList()); /* List toBeStartList2 = (List) toBeStartList.stream().filter(s -> { return statusEnumList.contains(s.getOrderStatus()); }).collect(Collectors.toList());*/ FmsOrder highestToBeOrder = null; List highList = toBeStartList.stream().filter(c -> { return FmsConstant.MAX_PRIORITY.equals(c.getPriority()); }).collect(Collectors.toList()); if (Func.isNotEmpty(highList)) { if (highList.size() > 1) { throw new ServiceException(MessageUtils.message("cps.fms.start.order.fail.has.no.zero.priority", new Object[0])); } highestToBeOrder = highList.get(0); } List machStatus = Arrays.asList(Integer.valueOf(OrderStatusEnum.MACH_ING.getValue()), Integer.valueOf(OrderStatusEnum.PAUSE_ING.getValue())); List toBeStartedOrderIds = toBeStartList.stream().map(s2 -> { return String.valueOf(s2.getId()); }).collect(Collectors.toList()); Map> toBeStartedFixtureList = this.fmsOrderProcessFixtureService.getFmsOrderProcessFixtureList(Func.toLongList(toBeStartedOrderIds)); List machOrders = list(Wrappers.lambdaQuery().in(FmsOrder::getOrderStatus, machStatus)); /* List machOrders = list((Wrapper) Wrappers.lambdaQuery().in((v0) -> { return v0.getOrderStatus(); }, machStatus));*/ dealToBeStart(orderIds, toBeStartList, toBeStartedFixtureList); if (Func.isEmpty(machOrders)) { update(Wrappers.lambdaUpdate().in(Func.isNotEmpty(orderIds), FmsOrder::getId, Func.toLongList(orderIds)) .set(FmsOrder::getOrderStatus, Integer.valueOf(OrderStatusEnum.MACH_ING.getValue())) .set(FmsOrder::getStartUpTime, LocalDateTime.now())); /* update((Wrapper) ((LambdaUpdateWrapper) Wrappers.lambdaUpdate().in(Func.isNotEmpty(orderIds), (v0) -> { return v0.getId(); }, Func.toLongList(orderIds)).set((v0) -> { return v0.getOrderStatus(); }, Integer.valueOf(OrderStatusEnum.MACH_ING.getValue()))).set((v0) -> { return v0.getStartUpTime(); }, LocalDateTime.now()));*/ toBeStartList.forEach(x -> { FmsOrderVO fmsOrderVO = FmsOrderConvert.INSTANCE.convert(x); fmsOrderVO.setOrderStatus(OrderStatusEnum.MACH_ING.getValue() + ""); result.add(fmsOrderVO); }); return result; } log.info("过滤工单:{}", orderIds); FmsOrder highestExecutionOrder = null; List highestExecutionOrderList = machOrders.stream().filter(c2 -> { return FmsConstant.MAX_PRIORITY.equals(c2.getPriority()); }).collect(Collectors.toList()); if (Func.isNotEmpty(highestExecutionOrderList)) { highestExecutionOrder = highestExecutionOrderList.get(0); } if (highestToBeOrder != null) { if (highestExecutionOrder != null && !highestToBeOrder.getId().equals(highestExecutionOrder.getId())) { throw new ServiceException(MessageUtils.message("cps.fms.start.order.fail.has.zero.priority.to.do", new Object[0])); } dealInHasExecution(toBeStartedOrderIds, highestToBeOrder, toBeStartList, machOrders, toBeStartedFixtureList); } else { dealOrder(orderIds, machOrders, toBeStartList); } toBeStartList.forEach(x2 -> { FmsOrderVO fmsOrderVO = FmsOrderConvert.INSTANCE.convert(x2); fmsOrderVO.setOrderStatus(OrderStatusEnum.MACH_ING.getValue() + ""); result.add(fmsOrderVO); }); return result; } public void dealInHasExecution(List orderIds, FmsOrder highestOrder, List tobeStartList, List machOrders, Map> toBeStartedFixtureMap) { List removeIds = new ArrayList<>(); List processFixtureList = toBeStartedFixtureMap.get(highestOrder.getId()); if (Func.isNotEmpty(processFixtureList)) { List trayCodes = processFixtureList.stream().map((v0) -> { return v0.getTrayCode(); }).distinct().collect(Collectors.toList()); List usingOrderList = getUsingOrderByTray(trayCodes); if (Func.isNotEmpty(usingOrderList)) { usingOrderList.forEach(s -> { if (OrderStatusEnum.MACH_ING.getValue() == s.getOrderStatus().intValue()) { pause(String.valueOf(s.getId())); } removeIds.add(String.valueOf(s.getId())); }); } } if (Func.isNotEmpty(removeIds)) { orderIds = orderIds.stream().filter(s2 -> { return !removeIds.contains(s2); }).collect(Collectors.toList()); } dealOrder(orderIds, machOrders, tobeStartList); } public void dealOrder(List orderIds, List machOrders, List tobeStartList) { List removeOrderIds = new ArrayList<>(); if (Func.isNotEmpty(orderIds)) { List machOrderIds = machOrders.stream().map((v0) -> { return v0.getId(); }).collect(Collectors.toList()); List fmsOrderProcessFixtures = this.fmsOrderProcessFixtureService.getFmsOrderProcessFixtures(Func.toLongList(orderIds)); List toBeStartTrays = fmsOrderProcessFixtures.stream().map((v0) -> { return v0.getTrayCode(); }).distinct().collect(Collectors.toList()); List fmsOrderProcessFixtures1 = this.fmsOrderProcessFixtureService.getFmsOrderProcessFixtures(machOrderIds); List inExecutionTrays = fmsOrderProcessFixtures1.stream().map((v0) -> { return v0.getTrayCode(); }).distinct().collect(Collectors.toList()); List sameTrayCodes = toBeStartTrays.stream().filter(inExecutionTrays::contains).collect(Collectors.toList()); /* Stream stream = toBeStartTrays.stream(); inExecutionTrays.getClass(); List sameTrayCodes = stream.filter((v1) -> { return r1.contains(v1); }).collect(Collectors.toList()); */ if (Func.isNotEmpty(sameTrayCodes)) { List toBeSameTrays = fmsOrderProcessFixtures.stream().filter(c -> { return sameTrayCodes.contains(c.getTrayCode()); }).collect(Collectors.toList()); List inExecutionSameTrays = fmsOrderProcessFixtures1.stream().filter(c2 -> { return sameTrayCodes.contains(c2.getTrayCode()); }).collect(Collectors.toList()); Map> toBeSameTraysMap = toBeSameTrays.stream().collect(Collectors.groupingBy((v0) -> { return v0.getTrayCode(); })); Map> inExecutionSameTraysMap = inExecutionSameTrays.stream().collect(Collectors.groupingBy((v0) -> { return v0.getTrayCode(); })); List toBeSameTrayOrderIds = toBeSameTrays.stream().map((v0) -> { return v0.getOrderId(); }).distinct().collect(Collectors.toList()); List inExecutionSameTrayOrderIds = inExecutionSameTrays.stream().map((v0) -> { return v0.getOrderId(); }).distinct().collect(Collectors.toList()); List tobeStartSameTrayList = tobeStartList.stream().filter(s -> { return toBeSameTrayOrderIds.contains(s.getId()); }).collect(Collectors.toList()); Map toMap = tobeStartSameTrayList.stream().collect(Collectors.toMap((v0) -> { return v0.getId(); }, Function.identity())); List inExecutionSameTrayOrderList = machOrders.stream().filter(s2 -> { return inExecutionSameTrayOrderIds.contains(s2.getId()); }).collect(Collectors.toList()); Map inMap = inExecutionSameTrayOrderList.stream().collect(Collectors.toMap((v0) -> { return v0.getId(); }, Function.identity())); sameTrayCodes.forEach(trayCode -> { List toStartOrderList = toBeSameTraysMap.get(trayCode); List inExecutionOrderList = inExecutionSameTraysMap.get(trayCode); List toBeIds = toStartOrderList.stream().map((v0) -> { return v0.getOrderId(); }).distinct().collect(Collectors.toList()); List inExecutionIds = inExecutionOrderList.stream().map((v0) -> { return v0.getOrderId(); }).distinct().collect(Collectors.toList()); for (Long toId : toBeIds) { FmsOrder fmsOrder = (FmsOrder) toMap.get(toId); for (Long inId : inExecutionIds) { FmsOrder inOrder = (FmsOrder) inMap.get(inId); if (!toId.equals(inId) && fmsOrder.getPriority().intValue() != 0 && fmsOrder.getPriority().intValue() <= inOrder.getPriority().intValue()) { removeOrderIds.add(String.valueOf(toId)); } } } }); } if (Func.isNotEmpty(removeOrderIds)) { List removeIds = removeOrderIds.stream().distinct().collect(Collectors.toList()); orderIds = orderIds.stream().filter(c3 -> { return !removeIds.contains(c3); }).collect(Collectors.toList()); } if (Func.isNotEmpty(orderIds)) { update(Wrappers.lambdaUpdate().in(FmsOrder::getId, Func.toLongList(orderIds)) .set(FmsOrder::getOrderStatus, Integer.valueOf(OrderStatusEnum.MACH_ING.getValue())) .set(FmsOrder::getStartUpTime, LocalDateTime.now())); /* update((Wrapper) ((LambdaUpdateWrapper) ((LambdaUpdateWrapper) Wrappers.lambdaUpdate().in((v0) -> { return v0.getId(); }, Func.toLongList(orderIds))).set((v0) -> { return v0.getOrderStatus(); }, Integer.valueOf(OrderStatusEnum.MACH_ING.getValue()))).set((v0) -> { return v0.getStartUpTime(); }, LocalDateTime.now())); */ } } } public void dealToBeStart(List orderIds, List list, Map> toBeStartedFixtureMap) { if (orderIds.size() > 1) { Map> priorityMap = list.stream().collect(Collectors.groupingBy((v0) -> { return v0.getPriority(); })); priorityMap.forEach((k, v) -> { v.sort((o1, o2) -> { Long id = o1.getId(); Long id2 = o2.getId(); List processFixtureList = toBeStartedFixtureMap.get(id); List processFixtureList1 = toBeStartedFixtureMap.get(id2); if (Func.isNotEmpty(processFixtureList) && Func.isNotEmpty(processFixtureList1)) { List collect = processFixtureList.stream().map((v0) -> { return v0.getTrayCode(); }).distinct().collect(Collectors.toList()); List collect1 = processFixtureList1.stream().map((v0) -> { return v0.getTrayCode(); }).distinct().collect(Collectors.toList()); //排序而已,不太重要,此处需要再仔细考虑 List collect2 = collect.stream().filter((v1) -> { return collect1.contains(v1); }).collect(Collectors.toList()); if (collect2.size() > 0) { orderIds.remove(String.valueOf(o1.getId())); return 0; } return 0; } return 0; }); }); } } private List getUsingOrderByTray(final List trayCodeList) { List fixtures = this.fmsOrderProcessFixtureService.list(Lambda.in((v0) -> { return v0.getTrayCode(); }, trayCodeList)); List processIds = fixtures.stream().map((v0) -> { return v0.getOrderProcessId(); }).collect(Collectors.toList()); List processList = null; if (Func.isNotEmpty(processIds)) { processList = this.fmsOrderProcessService.list(Lambda.in((v0) -> { return v0.getId(); }, processIds)); } if (Func.isNotEmpty(processList)) { List orderList = list(Lambda.in((v0) -> { return v0.getId(); }, processList.stream().map((v0) -> { return v0.getOrderId(); }).collect(Collectors.toList()))); List usingOrders = orderList.stream().filter(item -> { return item.getOrderStatus().equals(Integer.valueOf(OrderStatusEnum.MACH_ING.getValue())) || item.getOrderStatus().equals(Integer.valueOf(OrderStatusEnum.PAUSE_ING.getValue())); }).collect(Collectors.toList()); return usingOrders; } return Collections.emptyList(); } private List getToBeStartOrderByTray(List trayCodeList, List orderIds) { List fixtures = this.fmsOrderProcessFixtureService.list(Wrappers.lambdaQuery() .in(FmsOrderProcessFixture::getOrderId, orderIds) .in(FmsOrderProcessFixture::getTrayCode, trayCodeList)); /* List fixtures = this.fmsOrderProcessFixtureService.list((Wrapper) ((LambdaQueryWrapper) Wrappers.lambdaQuery().in((v0) -> { return v0.getOrderId(); }, orderIds)).in((v0) -> { return v0.getTrayCode(); }, trayCodeList));*/ if (Func.isNotEmpty(fixtures)) { List orderList = fixtures.stream().map((v0) -> { return v0.getOrderId(); }).distinct().collect(Collectors.toList()); if (Func.isNotEmpty(orderList)) { return orderList; } } return new ArrayList<>(); } @Override // org.springblade.modules.fms.service.IFmsOrderService @Transactional(rollbackFor = {Exception.class}) public FmsOrderVO publish(final String orderId) { FmsOrder fmsOrder = (FmsOrder) getById(orderId); int status = fmsOrder.getOrderStatus() == null ? OrderStatusEnum.WAIT_PUBLISH.getValue() : fmsOrder.getOrderStatus().intValue(); if (status != OrderStatusEnum.WAIT_PUBLISH.getValue()) { throw new ServiceException(MessageUtils.message("fms.order.has.publish", new Object[0])); } List fmsOrderProcessList = this.fmsOrderProcessService.list(Lambda.eq(FmsOrderProcess::getOrderId, orderId).orderByAsc(FmsOrderProcess::getSort)); /* List fmsOrderProcessList = this.fmsOrderProcessService.list((Wrapper) Lambda.eq((v0) -> { return v0.getOrderId(); }, orderId).orderByAsc((v0) -> { return v0.getSort(); }));*/ boolean existEmptyWorkstation = fmsOrderProcessList.stream().anyMatch(item -> { return Func.isEmpty(item.getWorkStationId()); }); if (existEmptyWorkstation) { throw new ServiceException(MessageUtils.message("fms.order.workstation.isnull", new Object[0])); } FmsOrderProcess fmsOrderProcess = ((FmsOrderProcess) ListUtils.getFirst(fmsOrderProcessList)).setInputNum(fmsOrder.getAssignNum()).setDistributedNum(fmsOrder.getAssignNum()); this.fmsOrderProcessService.updateById(fmsOrderProcess); fmsOrder.setOrderStatus(Integer.valueOf(OrderStatusEnum.WAIT_MACHINE.getValue())); updateById(fmsOrder); return wrapper(fmsOrder); } @Override // org.springblade.modules.fms.service.IFmsOrderService public Boolean stopDownOrder() { FmsInstructionRecord lastRecord = this.fmsInstructionRecordService.getLastRecord(); if (lastRecord == null) { return Boolean.FALSE; } if (FmsConstant.GENERATED.equals(lastRecord.getState()) || FmsConstant.EXECUTING.equals(lastRecord.getState())) { lastRecord.setChangeModel(1); return Boolean.valueOf(this.fmsInstructionRecordService.updateById(lastRecord)); } this.paramService.startSwitching(); return Boolean.TRUE; } @Override // org.springblade.modules.fms.service.IFmsOrderService @Transactional(rollbackFor = {Exception.class}) public Boolean removeOrder(IdsVO ids) { List orderIds = Func.toLongList(ids.getIds()); List fmsOrders = listByIds(orderIds); boolean match = fmsOrders.stream().allMatch(fo -> { return fo.getOrderStatus().equals(Integer.valueOf(OrderStatusEnum.WAIT_PUBLISH.getValue())) || fo.getOrderStatus().equals(Integer.valueOf(OrderStatusEnum.WAIT_MACHINE.getValue())); }); if (!match) { throw new ServiceException(MessageUtils.message("cps.fms.order.delete.wait.publish.machine", new Object[0])); } return Boolean.valueOf(removeBatchByIds(orderIds)); } @Override // org.springblade.modules.fms.service.IFmsOrderService public List listWorkstationByTrayCode(String trayCode) { return ((FmsOrderMapper) this.baseMapper).listWorkstationByTrayCode(trayCode); } }