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<TraceFlowRecordMapper, TraceFlowRecord> 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<TraceFlowRecordVO> getTraceFlowRecord(String partNo, String workstationId) {
|
Map<String, TraceFlowSettings> settingsMap = this.flowSettingsService.list().stream().collect(Collectors.toMap((v0) -> {
|
return v0.getCode();
|
}, Function.identity()));
|
List<TraceFlowRecord> list = list(Wrappers.<TraceFlowRecord>lambdaQuery().eq(TraceFlowRecord::getPartNo, partNo)
|
.eq(Func.isNotBlank(workstationId), TraceFlowRecord::getWorkstationId, workstationId));
|
/*
|
List<TraceFlowRecord> 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<TraceFlowRecordVO> 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.<TraceCatalog>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.<TraceCatalog>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.<TraceFlowSettings>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.<TraceFlowSettings>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<TraceCatalogFlowRecordExportVO> 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<TraceCatalogFlowRecordExportVO> exportData = ((TraceFlowRecordMapper) this.baseMapper).getExportData(traceCatalogSearchVO);
|
if (Func.isNotEmpty(exportData)) {
|
List<TraceCatalogFlowRecordExportVO> exportData2 = exportData.stream()
|
.sorted(Comparator.comparing(TraceCatalogFlowRecordExportVO::getOnlineTime, Comparator.reverseOrder())
|
.thenComparing(TraceCatalogFlowRecordExportVO::getFlowSeq, Comparator.nullsLast(Long::compareTo)))
|
.collect(Collectors.toList());
|
/*
|
List<TraceCatalogFlowRecordExportVO> 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<WorkpieceTraceVO> workpieceTracePage(WorkpieceTraceSearchVO vo, Query query) {
|
IPage<WorkpieceTraceVO> relatedTracePages = ((TraceFlowRecordMapper) this.baseMapper).getNgTraceFlowRecord(Condition.getPage(query), vo);
|
if (Func.isNotEmpty(relatedTracePages.getRecords())) {
|
List<Long> 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<WorkpieceTraceDTO> dto = ((TraceFlowRecordMapper) this.baseMapper).exportNgTraceRecord(vo);
|
List<WorkpieceTraceDTO> resultList = new ArrayList<>(1000);
|
(dto.parallelStream().collect(Collectors.groupingBy(a -> {
|
return a.getPartNo() + "_" + a.getWorkstationCode() + "_" + a.getWorkbenchName();
|
}, Collectors.toList()))).forEach((key, transfer) -> {
|
Optional<WorkpieceTraceDTO> 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<Integer> sort = new AtomicReference<>(1);
|
List<WorkpieceTraceExport> collect = resultList.stream().map(c -> convert(c, sort)).sorted(Comparator.comparing(WorkpieceTraceExport::getOnlineTime).reversed()).collect(Collectors.toList());
|
/*
|
List<WorkpieceTraceExport> collect = (List) resultList.stream().map(c -> {
|
return convert(c, sort);
|
}).sorted(Comparator.comparing((v0) -> {
|
return v0.getOnlineTime();
|
}).reversed()).collect(Collectors.toList());
|
*/
|
Map<String, Object> 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<Integer> 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<WorkpieceTraceSearchVO> getWrapper(WorkpieceTraceSearchVO vo, String startTime, String endTime) {
|
boolean isOracle = CommonConstant.ORACLE.equals(this.configVO.getType());
|
|
return Wrappers.<WorkpieceTraceSearchVO>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);
|
}
|
}
|