package com.qianwen.smartman.modules.trace.service.impl; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.util.ArrayList; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Function; import java.util.stream.Collectors; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import com.alibaba.excel.write.merge.AbstractMergeStrategy; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.qianwen.core.excel.util.ExcelUtil; 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.oss.model.BladeFile; import com.qianwen.core.tool.utils.DateUtil; import com.qianwen.core.tool.utils.Func; import com.qianwen.smartman.common.constant.CommonConstant; import com.qianwen.smartman.common.constant.DateConstant; import com.qianwen.smartman.common.constant.ExcelConstant; import com.qianwen.smartman.common.constant.TraceConstant; import com.qianwen.smartman.common.utils.MessageUtils; import com.qianwen.smartman.modules.smis.enums.WorkTypeEnum; import com.qianwen.smartman.modules.smis.vo.ConfigVO; import com.qianwen.smartman.modules.mdc.enums.ProcessParamEnum; import com.qianwen.smartman.modules.mdc.service.IProcessParameterService; import com.qianwen.smartman.modules.mdc.vo.ProParamSheetVO; import com.qianwen.smartman.modules.mdc.vo.ProcessParameterSearchVO; import com.qianwen.smartman.modules.resource.builder.oss.OssBuilder; import com.qianwen.smartman.modules.trace.convert.TraceFlowRecordConvert; import com.qianwen.smartman.modules.trace.dto.WorkpieceTraceDTO; import com.qianwen.smartman.modules.trace.entity.TraceCatalog; import com.qianwen.smartman.modules.trace.entity.TraceFlowRecord; import com.qianwen.smartman.modules.trace.entity.TraceFlowSettings; import com.qianwen.smartman.modules.trace.enums.FlowStateEnum; import com.qianwen.smartman.modules.trace.enums.FlowTagEnum; import com.qianwen.smartman.modules.trace.enums.TraceIsReworkEnum; import com.qianwen.smartman.modules.trace.enums.TraceQualifiedEnum; import com.qianwen.smartman.modules.trace.enums.TraceStatusEnum; import com.qianwen.smartman.modules.trace.excel.WorkpieceTraceExport; import com.qianwen.smartman.modules.trace.mapper.TraceCatalogMapper; import com.qianwen.smartman.modules.trace.mapper.TraceFlowRecordMapper; import com.qianwen.smartman.modules.trace.service.ITraceCatalogService; import com.qianwen.smartman.modules.trace.service.ITraceFlowRecordService; import com.qianwen.smartman.modules.trace.service.ITraceFlowSettingsService; import com.qianwen.smartman.modules.trace.vo.OtherWorkstationVO; import com.qianwen.smartman.modules.trace.vo.TraceCatalogAndFlowRecordVO; import com.qianwen.smartman.modules.trace.vo.TraceCatalogFlowRecordExportVO; import com.qianwen.smartman.modules.trace.vo.TraceCatalogSearchVO; import com.qianwen.smartman.modules.trace.vo.TraceFlowRecordVO; import com.qianwen.smartman.modules.trace.vo.WorkpieceTraceSearchVO; import com.qianwen.smartman.modules.trace.vo.WorkpieceTraceVO; import cn.hutool.core.date.DateTime; @Service public class TraceFlowRecordServiceImpl extends BaseServiceImpl implements ITraceFlowRecordService { private final ITraceFlowSettingsService flowSettingsService; private final IProcessParameterService processParameterService; private final ITraceCatalogService traceCatalogService; private final TraceCatalogMapper traceCatalogMapper; private final OssBuilder ossBuilder; private final ConfigVO configVO; public TraceFlowRecordServiceImpl(final ITraceFlowSettingsService flowSettingsService, final IProcessParameterService processParameterService, final ITraceCatalogService traceCatalogService, final TraceCatalogMapper traceCatalogMapper, final OssBuilder ossBuilder, final ConfigVO configVO) { this.flowSettingsService = flowSettingsService; this.processParameterService = processParameterService; this.traceCatalogService = traceCatalogService; this.traceCatalogMapper = traceCatalogMapper; this.ossBuilder = ossBuilder; this.configVO = configVO; } public List getTraceFlowRecord(String partNo, String workstationId) { Map settingsMap = this.flowSettingsService.list().stream().collect(Collectors.toMap((v0) -> { return v0.getCode(); }, Function.identity())); List list = list(Wrappers.lambdaQuery().eq(TraceFlowRecord::getPartNo, partNo) .eq(Func.isNotBlank(workstationId), TraceFlowRecord::getWorkstationId, workstationId)); /* List list = list(((LambdaQueryWrapper) Wrappers.lambdaQuery().eq((v0) -> { return v0.getPartNo(); }, partNo)).eq(Func.isNotBlank(workstationId), (v0) -> { return v0.getWorkstationId(); }, workstationId));*/ if (Func.isNotEmpty(list)) { List convert = TraceFlowRecordConvert.INSTANCE.convert(list); convert.forEach(s -> { TraceFlowSettings traceFlowSettings = (TraceFlowSettings) settingsMap.get(s.getFlowCode()); if (traceFlowSettings != null) { Integer stationType = traceFlowSettings.getStationType(); if (WorkTypeEnum.PROCESS.getCode().equals(stationType)) { s.setMachiningOrOther(CommonConstant.DATA_SCOPE_CATEGORY); } else { s.setMachiningOrOther(CommonConstant.API_SCOPE_CATEGORY); } } }); return convert.stream().sorted(Comparator.comparing((v0) -> { return v0.getEntryTime(); })).collect(Collectors.toList()); } return new ArrayList(); } public TraceCatalogAndFlowRecordVO getTraceCatalogAndFlowRecord(String partNo, String workstationId) { TraceCatalogAndFlowRecordVO traceCatalogAndFlowRecordVO = null; TraceCatalog one = this.traceCatalogService.getOne(Wrappers.lambdaQuery().eq(TraceCatalog::getPartNo, partNo)); /* TraceCatalog one = (TraceCatalog) this.traceCatalogService.getOne((Wrapper) Wrappers.lambdaQuery().eq((v0) -> { return v0.getPartNo(); }, partNo));*/ if (one != null) { traceCatalogAndFlowRecordVO = new TraceCatalogAndFlowRecordVO(); traceCatalogAndFlowRecordVO.setPartNo(partNo).setIsReworkPart(one.getIsReworkPart()).setQualified(one.getQualified()).setBatchNumber(one.getBatchNumber()).setOnlineTime(one.getOnlineTime()).setOfflineTime(one.getOfflineTime()).setShiftIndex(one.getShiftIndex()).setShiftIndexName(one.getShiftIndexName()).setFlowRecordVOS(getTraceFlowRecord(partNo, null)); } return traceCatalogAndFlowRecordVO; } public OtherWorkstationVO getOtherProcessParameter(String partNo, String id) { TraceFlowSettings traceFlowSettings; OtherWorkstationVO otherWorkstationVO = null; TraceCatalog traceCatalog = this.traceCatalogService.getOne(Wrappers.lambdaQuery().eq(TraceCatalog::getPartNo, partNo)); /* TraceCatalog traceCatalog = (TraceCatalog) this.traceCatalogService.getOne((Wrapper) Wrappers.lambdaQuery().eq((v0) -> { return v0.getPartNo(); }, partNo));*/ TraceFlowRecord traceFlowRecord = (TraceFlowRecord) getById(id); traceFlowSettings = this.flowSettingsService.getOne(Wrappers.lambdaQuery().eq(TraceFlowSettings::getCode, traceFlowRecord.getFlowCode())); if (traceCatalog != null && traceFlowRecord != null && traceFlowSettings != null) { otherWorkstationVO = new OtherWorkstationVO(); otherWorkstationVO.setFlowTag(traceFlowRecord.getFlowTag()).setEntryTime(traceFlowRecord.getEntryTime()).setLeftTime(traceFlowRecord.getLeftTime()).setBatchNumber(traceCatalog.getBatchNumber()).setStationType(traceFlowSettings.getStationType()); } return otherWorkstationVO; } /* public ProParamSheetVO getProcessParameter(String id, Integer shiftIndex) { TraceFlowRecord traceFlowRecord = (TraceFlowRecord) getById(id); if (traceFlowRecord != null) { TraceFlowSettings traceFlowSettings = this.flowSettingsService.getOne(Wrappers.lambdaQuery() .eq(TraceFlowSettings::getCode, traceFlowRecord.getFlowCode())); if (traceFlowSettings != null) { ProcessParameterSearchVO processParameterSearchVO = new ProcessParameterSearchVO(); processParameterSearchVO.setMethodEnum(ProcessParamEnum.HOUR); processParameterSearchVO.setStartTime(traceFlowRecord.getEntryTime()); if (traceFlowRecord.getLeftTime() == null) { processParameterSearchVO.setEndTime(DateTime.now()); } else { processParameterSearchVO.setEndTime(traceFlowRecord.getLeftTime()); } processParameterSearchVO.setShift(shiftIndex); processParameterSearchVO.setWorkstationId(String.valueOf(traceFlowRecord.getWorkstationId())); return this.processParameterService.queryProcessParameterSheet(processParameterSearchVO, Boolean.TRUE); } return null; } return null; }*/ public List getExportData(TraceCatalogSearchVO traceCatalogSearchVO) { Long countRelatedCatalogs = this.traceCatalogMapper.countRelatedCatalog(traceCatalogSearchVO); if (countRelatedCatalogs.longValue() > TraceConstant.TRACE_EXPORT_DATA_COUNT.longValue()) { throw new ServiceException(MessageUtils.message("cps.traceCataLog.maxExportCount", TraceConstant.TRACE_EXPORT_DATA_COUNT)); } List exportData = ((TraceFlowRecordMapper) this.baseMapper).getExportData(traceCatalogSearchVO); if (Func.isNotEmpty(exportData)) { List exportData2 = exportData.stream() .sorted(Comparator.comparing(TraceCatalogFlowRecordExportVO::getOnlineTime, Comparator.reverseOrder()) .thenComparing(TraceCatalogFlowRecordExportVO::getFlowSeq, Comparator.nullsLast(Long::compareTo))) .collect(Collectors.toList()); /* List exportData2 = (List) exportData.stream().sorted(Comparator.comparing((v0) -> { return v0.getOnlineTime(); }, Comparator.reverseOrder()).thenComparing((v0) -> { return v0.getFlowSeq(); }, Comparator.nullsLast((v0, v1) -> { return v0.compareTo(v1); }))).collect(Collectors.toList());*/ exportData2.forEach(s -> { s.setQualifiedDesc(TraceQualifiedEnum.findDescByValue(s.getQualified())); s.setIsReworkPartDesc(TraceIsReworkEnum.findDescByValue(s.getIsReworkPart())); s.setFlowStateDesc(FlowStateEnum.findDescByValue(s.getFlowState())); s.setFlowTagDesc(FlowTagEnum.findDescByValue(s.getFlowTag())); }); return exportData2; } return new ArrayList<>(); } public IPage workpieceTracePage(WorkpieceTraceSearchVO vo, Query query) { IPage relatedTracePages = ((TraceFlowRecordMapper) this.baseMapper).getNgTraceFlowRecord(Condition.getPage(query), vo); if (Func.isNotEmpty(relatedTracePages.getRecords())) { List relatedRecordIds = relatedTracePages.getRecords().stream().map((v0) -> { return v0.getRecordId(); }).collect(Collectors.toList()); relatedTracePages.setRecords(((TraceFlowRecordMapper) this.baseMapper).getNgFullTraceFlowRecord(relatedRecordIds)); } return relatedTracePages; } public BladeFile exportWorkpieceTrace(WorkpieceTraceSearchVO vo) { Long countRelatedCatalogs = ((TraceFlowRecordMapper) this.baseMapper).countNgTraceRecord(vo); if (countRelatedCatalogs.longValue() > TraceConstant.TRACE_EXPORT_DATA_COUNT.longValue()) { throw new ServiceException(MessageUtils.message("cps.traceCataLog.maxExportCount", TraceConstant.TRACE_EXPORT_DATA_COUNT)); } Object startTime = getStartTime(vo.getStartTime()); Object endTime = getEndTime(vo.getEndTime()); List dto = ((TraceFlowRecordMapper) this.baseMapper).exportNgTraceRecord(vo); List resultList = new ArrayList<>(1000); (dto.parallelStream().collect(Collectors.groupingBy(a -> { return a.getPartNo() + "_" + a.getWorkstationCode() + "_" + a.getWorkbenchName(); }, Collectors.toList()))).forEach((key, transfer) -> { Optional reduce = transfer.stream().reduce((a2, b) -> { return new WorkpieceTraceDTO(a2.getBatchNumber(), a2.getPartNo(), a2.getOnlineTime(), a2.getOfflineTime(), a2.getWorkstationCode(), a2.getWorkstationName(), a2.getWorkbenchName(), a2.getShiftIndexName(), a2.getTraceStatus(), a2.getReasonCode() + "," + b.getReasonCode()); }); //resultList.getClass(); reduce.ifPresent((v1) -> { resultList.add(v1); //r1.add(v1); }); }//end of foreach ); AtomicReference sort = new AtomicReference<>(1); List collect = resultList.stream().map(c -> convert(c, sort)).sorted(Comparator.comparing(WorkpieceTraceExport::getOnlineTime).reversed()).collect(Collectors.toList()); /* List collect = (List) resultList.stream().map(c -> { return convert(c, sort); }).sorted(Comparator.comparing((v0) -> { return v0.getOnlineTime(); }).reversed()).collect(Collectors.toList()); */ Map timeMap = new HashMap<>(2); timeMap.put("startTime", startTime); timeMap.put("endTime", endTime); String filePath = ExcelConstant.DIRECTORY + "workpieceTraceTemplate" + ExcelConstant.SUFFIX; String fileName = String.format("%s-%s.xlsx", ExcelConstant.NG_REASON, DateUtil.time()); MultipartFile multipartFile = ExcelUtil.exportFillTemplateToMultipartFile(filePath, fileName, ExcelConstant.SHEET, collect, timeMap, (AbstractMergeStrategy) null); return this.ossBuilder.tempTemplate().putFile(multipartFile.getOriginalFilename(), multipartFile); } private WorkpieceTraceExport convert(WorkpieceTraceDTO dto, AtomicReference sort) { WorkpieceTraceExport traceExport = WorkpieceTraceExport.builder().sort(String.valueOf(sort.get())).batchNumber(dto.getBatchNumber()).partNo(dto.getPartNo()).onlineTime(Func.isNotEmpty(dto.getOnlineTime()) ? DateUtil.formatDateTime(dto.getOnlineTime()) : null).offlineTime(Func.isNotEmpty(dto.getOfflineTime()) ? DateUtil.formatDateTime(dto.getOfflineTime()) : null).workstationCode(dto.getWorkstationCode()).workstationName(dto.getWorkstationName()).workbenchName(dto.getWorkbenchName()).shiftIndexName(dto.getShiftIndexName()).traceStatus(TraceStatusEnum.of(dto.getTraceStatus()).getName()).reasonCode(dto.getReasonCode()).build(); sort.getAndSet(Integer.valueOf(sort.get().intValue() + 1)); return traceExport; } private Wrapper getWrapper(WorkpieceTraceSearchVO vo, String startTime, String endTime) { boolean isOracle = CommonConstant.ORACLE.equals(this.configVO.getType()); return Wrappers.query().in(Func.isNotEmpty(vo.getGroupIds()), "btc.workstation_group_id", vo.getGroupIds()).eq(Func.isNotEmpty(vo.getWorkstationId()), "btfr.workstation_id", vo.getWorkstationId()).nested(i -> { i.ge("btc.online_time", isOracle ? DateUtil.parse(startTime, DateConstant.PATTERN_DATE_TIME) : startTime).le("btc.online_time", isOracle ? DateUtil.parse(endTime, DateConstant.PATTERN_DATE_TIME) : endTime); }).nested(i2 -> { i2.ge("btc.offline_time", isOracle ? DateUtil.parse(startTime, DateConstant.PATTERN_DATE_TIME) : startTime).le("btc.offline_time", isOracle ? DateUtil.parse(endTime, DateConstant.PATTERN_DATE_TIME) : endTime); }).and(Func.isNotEmpty(vo.getKeyword()), i3 -> { i3.likeRight("btfr.part_no", vo.getKeyword()).or().likeRight("btc.batch_number", vo.getKeyword()).or().likeRight("btfr.workstation_code", vo.getKeyword()).or().likeRight("btfr.workstation_name", vo.getKeyword()).or().likeRight("btfr.workbench_name", vo.getKeyword()); }); /* return ((QueryWrapper) ((QueryWrapper) Wrappers.query().in(Func.isNotEmpty(vo.getGroupIds()), "btc.workstation_group_id", vo.getGroupIds()).eq(Func.isNotEmpty(vo.getWorkstationId()), "btfr.workstation_id", vo.getWorkstationId()).nested(i -> { QueryWrapper queryWrapper = (QueryWrapper) ((QueryWrapper) i.ge("btc.online_time", isOracle ? DateUtil.parse(startTime, DateConstant.PATTERN_DATE_TIME) : startTime)).le("btc.online_time", isOracle ? DateUtil.parse(endTime, DateConstant.PATTERN_DATE_TIME) : endTime); })).nested(i2 -> { QueryWrapper queryWrapper = (QueryWrapper) ((QueryWrapper) i2.ge("btc.offline_time", isOracle ? DateUtil.parse(startTime, DateConstant.PATTERN_DATE_TIME) : startTime)).le("btc.offline_time", isOracle ? DateUtil.parse(endTime, DateConstant.PATTERN_DATE_TIME) : endTime); })).and(Func.isNotEmpty(vo.getKeyword()), i3 -> { QueryWrapper queryWrapper = (QueryWrapper) ((QueryWrapper) ((QueryWrapper) ((QueryWrapper) ((QueryWrapper) ((QueryWrapper) ((QueryWrapper) ((QueryWrapper) ((QueryWrapper) i3.likeRight("btfr.part_no", vo.getKeyword())).or()).likeRight("btc.batch_number", vo.getKeyword())).or()).likeRight("btfr.workstation_code", vo.getKeyword())).or()).likeRight("btfr.workstation_name", vo.getKeyword())).or()).likeRight("btfr.workbench_name", vo.getKeyword()); });*/ } private String getStartTime(Date startTime) { if (Func.isEmpty(startTime)) { return DateUtil.formatDateTime(LocalDateTime.of(LocalDate.now(), LocalTime.MIN)); } return DateUtil.formatDateTime(startTime); } private String getEndTime(Date endTime) { if (Func.isEmpty(endTime)) { return DateUtil.formatDateTime(LocalDateTime.of(LocalDate.now(), LocalTime.MAX)); } return DateUtil.formatDateTime(endTime); } }