package com.qianwen.smartman.modules.fms.service.impl;
|
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.sql.Timestamp;
|
import java.time.LocalDateTime;
|
import java.time.temporal.ChronoUnit;
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.HashMap;
|
import java.util.HashSet;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.Objects;
|
import java.util.Set;
|
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.metadata.IPage;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
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.cache.cps.WorkstationCache;
|
import com.qianwen.smartman.common.constant.CommonConstant;
|
import com.qianwen.smartman.common.constant.CommonGroupConstant;
|
import com.qianwen.smartman.common.constant.DateConstant;
|
import com.qianwen.smartman.common.enums.WcsDataTypeEnums;
|
import com.qianwen.smartman.common.utils.LocalDateTimeUtils;
|
import com.qianwen.smartman.modules.cps.dto.TrayWarehouseAreaDTO;
|
import com.qianwen.smartman.modules.cps.dto.WorkstationWcsDmpDTO;
|
import com.qianwen.smartman.modules.cps.entity.Workstation;
|
import com.qianwen.smartman.modules.cps.entity.WorkstationWorkbench;
|
import com.qianwen.smartman.modules.cps.enums.TrayEnum;
|
import com.qianwen.smartman.modules.cps.enums.WorkTypeEnum;
|
import com.qianwen.smartman.modules.cps.mapper.TrayMapper;
|
import com.qianwen.smartman.modules.cps.message.dto.TelemetryDataResponseDTO;
|
import com.qianwen.smartman.modules.cps.service.IWorkstationService;
|
import com.qianwen.smartman.modules.cps.service.IWorkstationWorkbenchService;
|
import com.qianwen.smartman.modules.fms.dto.FmsOrderProcessDTO;
|
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.entity.FmsRealTimeTray;
|
import com.qianwen.smartman.modules.fms.entity.FmsWorkStationRecord;
|
import com.qianwen.smartman.modules.fms.enums.OrderStatusEnum;
|
import com.qianwen.smartman.modules.fms.mapper.FmsOrderProcessMapper;
|
import com.qianwen.smartman.modules.fms.mapper.FmsRealTimeTrayMapper;
|
import com.qianwen.smartman.modules.fms.service.IFmsDeviceAnalysisService;
|
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.service.IFmsWorkStationRecordService;
|
import com.qianwen.smartman.modules.fms.vo.FMSWorkbenchInfoItemVo;
|
import com.qianwen.smartman.modules.fms.vo.FMSWorkbenchInfoVO;
|
import com.qianwen.smartman.modules.fms.vo.FmsAlarmVO;
|
import com.qianwen.smartman.modules.fms.vo.FmsWarehouseAreaTrayVO;
|
import com.qianwen.smartman.modules.mdc.entity.SuperAlarm;
|
import com.qianwen.smartman.modules.mdc.mapper.SuperAlarmMapper;
|
|
@Service
|
/* loaded from: blade-api.jar:BOOT-INF/classes/org/springblade/modules/fms/service/impl/FmsDeviceAnalysisServiceImpl.class */
|
public class FmsDeviceAnalysisServiceImpl implements IFmsDeviceAnalysisService {
|
private static final Logger log = LoggerFactory.getLogger(FmsDeviceAnalysisServiceImpl.class);
|
private final TrayMapper trayMapper;
|
private final FmsOrderProcessMapper fmsOrderProcessMapper;
|
private final FmsRealTimeTrayMapper fmsRealTimeTrayMapper;
|
private final SuperAlarmMapper superAlarmMapper;
|
private final IFmsOrderService fmsOrderService;
|
private final IFmsOrderProcessService fmsOrderProcessService;
|
private final IFmsOrderProcessFixtureService fmsOrderProcessFixtureService;
|
private final IFmsOrderProcessToolService fmsOrderProcessToolService;
|
private final IFmsWorkStationRecordService fmsWorkStationRecordService;
|
private final IWorkstationService workstationService;
|
private final IFmsInstructionRecordService fmsInstructionRecordService;
|
private final IWorkstationWorkbenchService workbenchService;
|
|
|
public FmsDeviceAnalysisServiceImpl(final TrayMapper trayMapper, final FmsOrderProcessMapper fmsOrderProcessMapper, final FmsRealTimeTrayMapper fmsRealTimeTrayMapper, final SuperAlarmMapper superAlarmMapper, final IFmsOrderService fmsOrderService, final IFmsOrderProcessService fmsOrderProcessService, final IFmsOrderProcessFixtureService fmsOrderProcessFixtureService, final IFmsOrderProcessToolService fmsOrderProcessToolService, final IFmsWorkStationRecordService fmsWorkStationRecordService, final IWorkstationService workstationService, final IFmsInstructionRecordService fmsInstructionRecordService, final IWorkstationWorkbenchService workbenchService) {
|
this.trayMapper = trayMapper;
|
this.fmsOrderProcessMapper = fmsOrderProcessMapper;
|
this.fmsRealTimeTrayMapper = fmsRealTimeTrayMapper;
|
this.superAlarmMapper = superAlarmMapper;
|
this.fmsOrderService = fmsOrderService;
|
this.fmsOrderProcessService = fmsOrderProcessService;
|
this.fmsOrderProcessFixtureService = fmsOrderProcessFixtureService;
|
this.fmsOrderProcessToolService = fmsOrderProcessToolService;
|
this.fmsWorkStationRecordService = fmsWorkStationRecordService;
|
this.workstationService = workstationService;
|
this.fmsInstructionRecordService = fmsInstructionRecordService;
|
this.workbenchService = workbenchService;
|
}
|
|
@Override // org.springblade.modules.fms.service.IFmsDeviceAnalysisService
|
public FMSWorkbenchInfoVO listFMSWorkbenchInfo(Long workstationId) {
|
Workstation workstation = (Workstation) this.workstationService.getById(workstationId);
|
String avatar = workstation.getAvatar();
|
FMSWorkbenchInfoVO fmsWorkbenchInfoVO = new FMSWorkbenchInfoVO();
|
fmsWorkbenchInfoVO.setWorkstationName(workstation.getName());
|
fmsWorkbenchInfoVO.setAvatar(avatar);
|
Integer deviceType = workstation.getDeviceType();
|
String code = workstation.getCode();
|
List<WorkstationWorkbench> list = this.workbenchService.list(Wrappers.<WorkstationWorkbench>lambdaQuery()
|
.eq(WorkstationWorkbench::getWorkstationId, workstationId)
|
.eq(WorkstationWorkbench::getStatus, CommonConstant.ENABLE).orderByAsc(WorkstationWorkbench::getSort));
|
/*
|
List<WorkstationWorkbench> list = this.workbenchService.list((Wrapper) ((LambdaQueryWrapper) ((LambdaQueryWrapper) Wrappers.lambdaQuery().eq((v0) -> {
|
return v0.getWorkstationId();
|
}, workstationId)).eq((v0) -> {
|
return v0.getStatus();
|
}, CommonConstant.ENABLE)).orderByAsc((v0) -> {
|
return v0.getSort();
|
}));*/
|
if (list == null || list.size() == 0) {
|
return fmsWorkbenchInfoVO;
|
}
|
WorkstationWcsDmpDTO workstationProgram = this.workstationService.queryDateTypeState(WcsDataTypeEnums.WcsDataType.PROGRAM.getCode(), String.valueOf(workstationId));
|
String program = null;
|
if (workstationProgram != null) {
|
String name = workstationProgram.getName();
|
program = getValue(name, String.valueOf(workstationId));
|
}
|
String finalProgram = program;
|
List<FMSWorkbenchInfoItemVo> data = list.stream().map(item -> {
|
FMSWorkbenchInfoItemVo infoItemVo = new FMSWorkbenchInfoItemVo();
|
infoItemVo.setCurrentStation(String.valueOf(item.getSort()));
|
infoItemVo.setWorkbenchName(item.getName());
|
infoItemVo.setProgramNo(finalProgram);
|
return infoItemVo;
|
}).collect(Collectors.toList());
|
fmsWorkbenchInfoVO.setWorkbenchInfoList(data);
|
List<FmsRealTimeTray> fmsRealTimeTrays = this.fmsRealTimeTrayMapper.selectList(Wrappers.<FmsRealTimeTray>lambdaQuery().eq(FmsRealTimeTray::getCurrentPosition, code));
|
/*
|
List<FmsRealTimeTray> fmsRealTimeTrays = this.fmsRealTimeTrayMapper.selectList((Wrapper) Wrappers.lambdaQuery().eq((v0) -> {
|
return v0.getCurrentPosition();
|
}, code));*/
|
if (fmsRealTimeTrays == null || fmsRealTimeTrays.size() == 0) {
|
return fmsWorkbenchInfoVO;
|
}
|
Map<String, FmsRealTimeTray> fmsRealTimeTrayMap = new HashMap<>();
|
fmsRealTimeTrays.forEach(item2 -> {
|
if ((Func.isNotEmpty(item2.getWillOrderId()) || Func.isNotEmpty(item2.getOrderId()) || Func.isNotEmpty(item2.getTargetStation())) && Objects.equals(deviceType, WorkTypeEnum.HANDLE.getCode())) {
|
if (Func.isBlank(item2.getCurrentStation())) {
|
item2.setCurrentStation("1");
|
}
|
if (Func.isEmpty(item2.getOrderId())) {
|
item2.setOrderId(item2.getWillOrderId());
|
}
|
}
|
if (Func.isNotBlank(item2.getCurrentStation())) {
|
fmsRealTimeTrayMap.put(item2.getCurrentStation(), item2);
|
}
|
});
|
List<Long> orderIds = new ArrayList<>();
|
List<Long> orderProcessIds = new ArrayList<>();
|
for (FmsRealTimeTray fmsRealTimeTray : fmsRealTimeTrays) {
|
Long orderId = fmsRealTimeTray.getOrderId();
|
if (orderId != null) {
|
orderIds.add(orderId);
|
}
|
Long orderProcessId = fmsRealTimeTray.getOrderProcessId();
|
if (orderProcessId != null) {
|
orderProcessIds.add(orderProcessId);
|
}
|
}
|
Map<Long, FmsOrder> orderMap = new HashMap<>();
|
if (orderIds.size() > 0) {
|
List<FmsOrder> fmsOrders = this.fmsOrderService.list(Wrappers.<FmsOrder>lambdaQuery().in(FmsOrder::getId, orderIds));
|
/*
|
List<FmsOrder> fmsOrders = this.fmsOrderService.list((Wrapper) Wrappers.lambdaQuery().in((v0) -> {
|
return v0.getId();
|
}, orderIds));*/
|
fmsOrders.forEach(item3 -> {
|
FmsOrder fmsOrder = (FmsOrder) orderMap.put(item3.getId(), item3);
|
});
|
}
|
Map<Long, FmsOrderProcess> orderProcessMap = new HashMap<>();
|
if (orderProcessIds.size() > 0) {
|
List<FmsOrderProcess> orderProcesses = this.fmsOrderProcessService.list(Wrappers.<FmsOrderProcess>lambdaQuery().in(FmsOrderProcess::getId, orderProcessIds));
|
/*
|
List<FmsOrderProcess> orderProcesses = this.fmsOrderProcessService.list((Wrapper) Wrappers.lambdaQuery().in((v0) -> {
|
return v0.getId();
|
}, orderProcessIds));*/
|
orderProcesses.forEach(item4 -> {
|
FmsOrderProcess fmsOrderProcess = (FmsOrderProcess) orderProcessMap.put(item4.getId(), item4);
|
});
|
}
|
if (workstationProgram != null) {
|
String name2 = workstationProgram.getName();
|
program = getValue(name2, String.valueOf(workstationId));
|
}
|
for (FMSWorkbenchInfoItemVo info : data) {
|
info.setProgramNo(program);
|
String currentStation = info.getCurrentStation();
|
FmsRealTimeTray fmsRealTimeTray2 = fmsRealTimeTrayMap.get(currentStation);
|
if (Func.isNotEmpty(fmsRealTimeTray2)) {
|
info.setCurrentPosition(fmsRealTimeTray2.getCurrentPosition());
|
info.setTargetPosition(fmsRealTimeTray2.getTargetPosition());
|
info.setTrayCode(fmsRealTimeTray2.getTrayCode());
|
info.setPartType(String.valueOf(fmsRealTimeTray2.getPartType()));
|
Long orderId2 = fmsRealTimeTray2.getOrderId();
|
Long orderProcessId2 = fmsRealTimeTray2.getOrderProcessId();
|
FmsOrder fmsOrder = orderMap.get(orderId2);
|
FmsOrderProcess fmsOrderProcess = orderProcessMap.get(orderProcessId2);
|
if (Func.isNotEmpty(fmsOrder)) {
|
info.setProcessStatus(fmsOrder.getOrderStatus());
|
info.setProductCode(fmsOrder.getProductCode());
|
info.setProductName(fmsOrder.getProductName());
|
info.setOrderCode(fmsOrder.getCode());
|
}
|
if (Func.isNotEmpty(fmsOrderProcess)) {
|
info.setProcessCode(fmsOrderProcess.getProcessCode());
|
info.setStandardTime(fmsOrderProcess.getStandardTime());
|
info.setStartTime(fmsOrderProcess.getStartTime());
|
info.setEndTime(fmsOrderProcess.getEndTime());
|
}
|
}
|
if (Objects.equals(deviceType, WorkTypeEnum.PROCESS.getCode())) {
|
Integer orderStatus = info.getProcessStatus();
|
Integer standardTime = info.getStandardTime();
|
Date startTime = info.getStartTime();
|
Date endTime = info.getEndTime();
|
if (Func.isNotEmpty(standardTime) && Func.isNotEmpty(startTime) && !Func.equals(Integer.valueOf(OrderStatusEnum.WAIT_MACHINE.getValue()), orderStatus) && !Func.equals(Integer.valueOf(OrderStatusEnum.WAIT_PUBLISH.getValue()), orderStatus)) {
|
LocalDateTime startLocalDateTime = LocalDateTimeUtils.DateToLocalDateTime(startTime);
|
if (!Func.equals(Integer.valueOf(OrderStatusEnum.FINISHED.getValue()), orderStatus) && standardTime.intValue() != 0 && endTime == null) {
|
long seconds = LocalDateTimeUtils.betweenTwoTime(startLocalDateTime, LocalDateTime.now(), ChronoUnit.SECONDS);
|
info.setProcessingProgress(Integer.valueOf(BigDecimal.valueOf(seconds).multiply(BigDecimal.valueOf(100L)).divide(BigDecimal.valueOf(standardTime.intValue()), RoundingMode.HALF_UP).intValue()));
|
} else {
|
info.setProcessingProgress(100);
|
}
|
}
|
}
|
}
|
return fmsWorkbenchInfoVO;
|
}
|
|
@Override // org.springblade.modules.fms.service.IFmsDeviceAnalysisService
|
public IPage<FmsAlarmVO> pageFmsAlarm(Long workstationId, Query query) {
|
IPage<FmsAlarmVO> page = Condition.getPage(query);
|
if (Func.isEmpty(workstationId)) {
|
return page;
|
}
|
Integer total = this.superAlarmMapper.countAlarmByWorkstationId(workstationId);
|
if (Func.isNull(total)) {
|
return page;
|
}
|
page.setTotal(total.intValue());
|
List<SuperAlarm> superAlarms = this.superAlarmMapper.pageAlarm(query.getCurrent(), query.getSize(), workstationId);
|
List<FmsAlarmVO> fmsAlarmVOS = new ArrayList<>();
|
for (SuperAlarm alarm : superAlarms) {
|
Timestamp ts = alarm.getTs();
|
FmsAlarmVO fmsAlarmVO = new FmsAlarmVO();
|
fmsAlarmVO.setDate(DateUtil.format(new Date(ts.getTime()), DateConstant.PATTERN_DATE_TIME));
|
fmsAlarmVO.setCode(alarm.getCode());
|
fmsAlarmVO.setMessage(alarm.getMessage());
|
fmsAlarmVOS.add(fmsAlarmVO);
|
}
|
page.setRecords(fmsAlarmVOS);
|
return page;
|
}
|
|
@Override // org.springblade.modules.fms.service.IFmsDeviceAnalysisService
|
public IPage<FmsWarehouseAreaTrayVO> pageTrayInfoList(Long areaId, Query query) {
|
if (CommonGroupConstant.WARE_ROOT.equals(areaId)) {
|
areaId = null;
|
}
|
IPage<FmsWarehouseAreaTrayVO> result = this.trayMapper.getWarehouseAreaTrayList(areaId, Condition.getPage(query));
|
List<FmsWarehouseAreaTrayVO> list = result.getRecords().parallelStream().peek(o -> {
|
if (Func.isNotEmpty(o.getAvailability())) {
|
o.setAvailability(TrayEnum.StatusEnum.of(Integer.valueOf(o.getAvailability())).getDesc());
|
}
|
}).collect(Collectors.toList());
|
result.setRecords(list);
|
return result;
|
}
|
|
@Override // org.springblade.modules.fms.service.IFmsDeviceAnalysisService
|
@Transactional
|
public Boolean reduction(Long areaId, String areaCode) {
|
List<TrayWarehouseAreaDTO> result = this.trayMapper.getWarehouseAreaTray();
|
if (Func.isNotEmpty(result)) {
|
Map<String, List<String>> areaMap = result.stream().collect(Collectors.groupingBy((v0) -> {
|
return v0.getAreaCode();
|
}, Collectors.mapping((v0) -> {
|
return v0.getTrayCode();
|
}, Collectors.toList())));
|
for (Map.Entry<String, List<String>> stringListEntry : areaMap.entrySet()) {
|
this.fmsRealTimeTrayMapper.updateReduction(stringListEntry.getValue(), stringListEntry.getKey());
|
}
|
}
|
List<FmsOrderProcessDTO> orderAndProcessIds = this.fmsOrderProcessMapper.getOrderAndProcessIds();
|
if (Func.isNotEmpty(orderAndProcessIds)) {
|
Set<Long> filterOrderIds = new HashSet<>();
|
Set<String> filterOrderCodes = new HashSet<>();
|
List<Long> processIds = new ArrayList<>();
|
for (FmsOrderProcessDTO orderAndProcessId : orderAndProcessIds) {
|
filterOrderIds.add(orderAndProcessId.getOrderId());
|
filterOrderCodes.add(orderAndProcessId.getOrderCode());
|
processIds.add(orderAndProcessId.getId());
|
}
|
|
this.fmsOrderService.remove(Wrappers.<FmsOrder>lambdaQuery().in(FmsOrder::getId, filterOrderIds));
|
this.fmsOrderProcessService.remove(Wrappers.<FmsOrderProcess>lambdaQuery().in(FmsOrderProcess::getId, processIds));
|
this.fmsOrderProcessToolService.remove(Wrappers.<FmsOrderProcessTool>lambdaQuery().in(FmsOrderProcessTool::getOrderProcessId, processIds));
|
this.fmsOrderProcessFixtureService.remove(Wrappers.<FmsOrderProcessFixture>lambdaQuery().in(FmsOrderProcessFixture::getOrderProcessId, processIds));
|
this.fmsWorkStationRecordService.remove(Wrappers.<FmsWorkStationRecord>lambdaQuery().in(FmsWorkStationRecord::getOrderId, filterOrderIds));
|
this.fmsInstructionRecordService.remove(Wrappers.<FmsInstructionRecord>lambdaQuery().in(FmsInstructionRecord::getOrderCode, filterOrderCodes));
|
/*
|
this.fmsOrderService.remove((Wrapper) Wrappers.lambdaQuery().in((v0) -> {
|
return v0.getId();
|
}, filterOrderIds));
|
this.fmsOrderProcessService.remove((Wrapper) Wrappers.lambdaQuery().in((v0) -> {
|
return v0.getId();
|
}, processIds));
|
this.fmsOrderProcessToolService.remove((Wrapper) Wrappers.lambdaQuery().in((v0) -> {
|
return v0.getOrderProcessId();
|
}, processIds));
|
this.fmsOrderProcessFixtureService.remove((Wrapper) Wrappers.lambdaQuery().in((v0) -> {
|
return v0.getOrderProcessId();
|
}, processIds));
|
this.fmsWorkStationRecordService.remove((Wrapper) Wrappers.lambdaQuery().in((v0) -> {
|
return v0.getOrderId();
|
}, filterOrderIds));
|
this.fmsInstructionRecordService.remove((Wrapper) Wrappers.lambdaQuery().in((v0) -> {
|
return v0.getOrderCode();
|
}, filterOrderCodes));*/
|
}
|
return true;
|
}
|
|
private String getValue(String name, String workstationId) {
|
TelemetryDataResponseDTO dataResponseDTO;
|
Map<String, Object> workstationAllCollect = WorkstationCache.getWorkstationRealTime(workstationId);
|
if (!workstationAllCollect.isEmpty() && (dataResponseDTO = (TelemetryDataResponseDTO) workstationAllCollect.get(name)) != null) {
|
return dataResponseDTO.getV();
|
}
|
return "";
|
}
|
}
|