package com.mes.base.engineering.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.mes.base.engineering.entity.request.EngineerImportRequest; import com.mes.base.engineering.entity.request.EngineerRequest; import com.mes.base.engineering.service.AbstractEngineeringService; import com.mes.base.glassinfo.service.GlassInfoService; import com.mes.base.rawqueue.service.EngineeringRawQueueService; import com.mes.engineering.Engineering; import com.mes.flowcard.FlowCardInfo; import com.mes.glassinfo.GlassInfo; import com.mes.glassinfo.request.GlassInfoImportRequest; import com.mes.hollow.formula.HollowFormulaDetails; import com.mes.rawqueue.EngineeringRawQueue; import com.mes.rawqueue.request.EngineeringRawQueueImportRequest; import com.mes.sysconst.Const; import com.mes.tempering.param.TemperingParameter; import com.mes.tools.EntityTool; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; import java.util.stream.Collectors; /** * (Engineering)表服务实现类 * * @author makejava * @since 2025-06-02 17:48:38 */ @Service @Slf4j @ConditionalOnProperty(name = "engineering.mode", havingValue = "lm", matchIfMissing = true) public class LmEngineeringServiceImpl extends AbstractEngineeringService { @Resource GlassInfoService glassInfoService; @Resource EngineeringRawQueueService engineeringRawQueueService; /** * mes主动调用导入工程 * * @param request * @return */ @Override public EngineerImportRequest mesImportEngineer(EngineerRequest request) { EngineerImportRequest importRequest = new EngineerImportRequest(); Engineering engineering = baseMapper.queryEngineeringByErp(request.getEngineerId()); List glassInfoList = baseMapper.queryGlassListByErp(request.getEngineerId()); List rawQueueList = baseMapper.queryRawListByErp(request.getEngineerId()); BeanUtil.copyProperties(engineering, importRequest); importRequest.setGlassInfolList(glassInfoList); importRequest.setEngineeringRawQueueList(rawQueueList); return importRequest; } @Override @Transactional(rollbackFor = Exception.class) public Boolean importEngineerList(EngineerImportRequest request) { Engineering engineering = EntityTool.convertSingle(request, Engineering.class); engineering.setState(Const.TASK_STATE_NEW); List glassInfoList = EntityTool.batchConvert(request.getGlassInfolList(), GlassInfo.class); List engineeringRawQueueList = EntityTool.batchConvert(request.getEngineeringRawQueueList(), EngineeringRawQueue.class); engineeringRawQueueList.stream().forEach(e -> e.setState(Const.TASK_STATE_NEW)); List flowCardInfoList = EntityTool.batchConvert(request.getFlowCardInfoList(), FlowCardInfo.class); List hollowFormulaDetails = EntityTool.batchConvert(request.getHollowFormulaDetailsList(), HollowFormulaDetails.class); List temperingParameter = EntityTool.batchConvert(request.getTemperingParameterList(), TemperingParameter.class); //起码保证玻璃小片数据不为null if (CollectionUtil.isNotEmpty(glassInfoList)) { this.save(engineering); glassInfoService.saveBatch(glassInfoList); engineeringRawQueueService.saveBatch(engineeringRawQueueList); return true; } else { return false; } } @Override @Transactional(rollbackFor = Exception.class) public List queryEngineerIdList(EngineerRequest request) { // 获取可执行的工程信息 List engineeringList = this.list(new LambdaQueryWrapper().in(Engineering::getState, Const.TASK_STATE_NEW, Const.TASK_STATE_PAUSE)); return engineeringList.stream().map(Engineering::getEngineerId).collect(Collectors.toList()); } @Override public List queryNotFinishEngineerIdList() { return this.listObjs(new LambdaQueryWrapper() .select(Engineering::getEngineerId) .ne(Engineering::getState, Const.TASK_STATE_SUCCESS)).stream() .map(Object::toString) .collect(Collectors.toList()); } /** * 领取的工程任务并返回原片队列 * * @param request * @return */ @Override public List queryEngineeringRawQueueList(EngineerRequest request) { //向前端返回mes原片对列表 return engineeringRawQueueService.list(new LambdaQueryWrapper() .eq(EngineeringRawQueue::getEngineeringId, request.getEngineerId()) .orderByAsc(EngineeringRawQueue::getRawSequence)); } @Override @Transactional(rollbackFor = Exception.class) public Boolean startTask(EngineerRequest request) { //避免任务重复发生 boolean checkFlag = checkEngineering(request); if (!checkFlag) { return Boolean.FALSE; } //将工程状态更新 return this.update(new LambdaUpdateWrapper().set(Engineering::getState, Const.TASK_STATE_START) .set(Engineering::getWorkLine, request.getWorkLine()) .eq(Engineering::getEngineerId, request.getEngineerId()).in(Engineering::getState, Const.TASK_STATE_NEW, Const.TASK_STATE_PAUSE)); } @Override public Boolean pauseTask(EngineerRequest request) { return this.update(new LambdaUpdateWrapper() .set(Engineering::getState, Const.TASK_STATE_PAUSE) .eq(Engineering::getEngineerId, request.getEngineerId()) .eq(Engineering::getWorkLine, request.getWorkLine()) ); } @Override public Boolean finishTask(EngineerRequest request) { return this.update(new LambdaUpdateWrapper() .set(Engineering::getState, Const.TASK_STATE_SUCCESS) .eq(Engineering::getEngineerId, request.getEngineerId()) .eq(Engineering::getWorkLine, request.getWorkLine()) ); } @Override public boolean checkEngineering(EngineerRequest request) { //避免任务重复发生 int runningCount = this.count(new LambdaQueryWrapper() .eq(Engineering::getState, Const.TASK_STATE_START) .eq(Engineering::getWorkLine, request.getWorkLine())); if (runningCount > 0) { log.info("有正在执行的工程,请确保无正在执行的任务后进行操作"); return Boolean.FALSE; } int anotherLineCount = this.count(new LambdaQueryWrapper() .eq(Engineering::getEngineerId, request.getEngineerId()) .ne(Engineering::getWorkLine, request.getWorkLine())); if (anotherLineCount > 0) { log.info("其他线路已领取有正在执行的工程,无法领取该工程"); return Boolean.FALSE; } return Boolean.TRUE; } }