package com.mes.pp.service.impl; import cn.smallbun.screw.core.util.CollectionUtils; import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.github.yulichang.base.MPJBaseServiceImpl; import com.mes.engineerScheduling.entity.EngineerScheduling; import com.mes.engineerScheduling.service.EngineerSchedulingService; import com.mes.engineering.entity.Engineering; import com.mes.engineering.service.EngineeringService; import com.mes.pp.entity.OptimizeProject; import com.mes.pp.entity.dto.ProgressDTO; import com.mes.pp.entity.request.OptimizeRequest; import com.mes.pp.mapper.OptimizeProjectMapper; import com.mes.pp.service.OptimizeProjectService; import com.mes.uppattenusage.entity.UpPattenUsage; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** *

* 服务实现类 *

* * @author zhoush * @since 2024-04-16 */ @Service @DS("pp") @Slf4j public class OptimizeProjectServiceImpl extends MPJBaseServiceImpl implements OptimizeProjectService { @Autowired private EngineeringService engineeringService; @Autowired private EngineerSchedulingService engineerSchedulingService; @Override public List listByState(OptimizeRequest optimizeRequest) { //PP表未开始的工程号 // 计算二个月前的时间 LocalDateTime twoMonthAgo = LocalDateTime.now().minusMonths(2); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.select(OptimizeProject::getProjectNo, OptimizeProject::getProjectName) .eq(OptimizeProject::getState, optimizeRequest.getState()) .ge(OptimizeProject::getCreateTime, twoMonthAgo); List glass = this.list(wrapper); //暂停的工程号 List engineerings = engineeringService.selectTask(); for (int i = 0; i < engineerings.size(); i++) { Engineering engineering = engineerings.get(i); OptimizeProject newProject = new OptimizeProject(); newProject.setProjectNo(engineering.getEngineerId()); newProject.setProjectName(engineering.getEngineerName()); // 将新创建的 OptimizeProject 对象添加到 glass 列表中 glass.add(newProject); } //返回工程信息 return glass; } @Override public void changeTask(String engineeringId, int state) { UpdateWrapper wrapper = new UpdateWrapper<>(); wrapper.eq("project_no", engineeringId) .set("state", state); boolean updateSuccess = this.update(wrapper); log.info("工程表更新状态{}", updateSuccess); } @Override public boolean overTask(UpPattenUsage sequence, int state) { if (sequence.getState() == 100) { UpdateWrapper wrapper = new UpdateWrapper<>(); wrapper.eq("project_no", sequence.getEngineeringId()) .set("state", state); boolean updateSuccess = this.update(wrapper); log.info("工程完成更新状态{}", updateSuccess); } return false; } @Override public List getDoingTask() { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.select("project_no,project_name") .eq("state", 200); return this.list(wrapper); } @Override public List queryEngineer() { return this.baseMapper.queryEngineer(); } @Override public List engineerScheduling(OptimizeProject optimizeProject) { return this.baseMapper.engineerScheduling(optimizeProject); } @Override @Transactional(rollbackFor = Exception.class) public List updateEngineerScheduling(Integer type, List projectList) { // 1. 删除对应类型的数据 baseMapper.deleteByType(type); // 2. 设置值 projectList.forEach(project -> { project.setType(type); project.setState(100); project.setId(null); // 清除ID }); if (CollectionUtils.isNotEmpty(projectList)) { // 3. 批量插入新数据 baseMapper.batchInsert(projectList); } return projectList; } @Override @Transactional(rollbackFor = Exception.class) @DS("north_glass_mes") public List updateCuttingLayout(Integer type, List projectList) { //获取当前钢化排版信息 List engineerScheduling = engineerSchedulingService.queryByType(3); List cutting = new ArrayList<>(); if(type==1){ cutting = engineerSchedulingService.queryByType(2); }else { cutting = engineerSchedulingService.queryByType(1); } //保存新增钢化排版信息 List newSchedulingList = new ArrayList<>(); Set existingProjectNoSet = engineerScheduling.stream() .map(EngineerScheduling::getProjectNo) .collect(Collectors.toSet()); // 获取当前排版新增工程 for (OptimizeProject project : projectList) { String projectNo = project.getProjectNo(); // 工程号非空,且不在已有钢化排产数据中 if (projectNo != null && !existingProjectNoSet.contains(projectNo)) { EngineerScheduling newEs = new EngineerScheduling(); newEs.setProjectNo(projectNo); newEs.setProjectName(project.getProjectName()); newEs.setType(3); newEs.setState(100); newSchedulingList.add(newEs); } } //获取当前排版取消工程 Set cuttingProjectNos = new HashSet<>(); for (EngineerScheduling es : cutting) { if (es.getProjectNo() != null) { // 避免空指针 cuttingProjectNos.add(es.getProjectNo()); } } engineerScheduling = engineerScheduling.stream() .filter(es -> es.getProjectNo() == null || !cuttingProjectNos.contains(es.getProjectNo())) .collect(Collectors.toList()); //1号线钢化数据对比1号线切割数据 Set projectNoSet2 = new HashSet<>(); for (OptimizeProject project : projectList) { String projectNo = project.getProjectNo(); if (projectNo != null) { // 避免空指针 projectNoSet2.add(projectNo); } } // 2. 筛选并收集符合条件的工程号(String类型)到 List List missingProjectNos = engineerScheduling.stream() .map(EngineerScheduling::getProjectNo) // 提取 engineerScheduling 中的工程号 .filter(esProjectNo -> esProjectNo != null // 排除空工程号 && !projectNoSet2.contains(esProjectNo)) // 排除 projectList 中存在的工程号 .collect(Collectors.toList()); // 收集结果到 List for (OptimizeProject project : projectList) { project.setType(type); project.setState(100); } //新增钢化排版数据 engineerSchedulingService.saveBatch(newSchedulingList); //更新已取消的钢化排版状态 if(CollectionUtils.isNotEmpty(missingProjectNos)){ engineerSchedulingService.updateState(missingProjectNos); } //取消当前类型的工程排产信息 engineerSchedulingService.updateByType(type); //保存当前新切割排版数据 baseMapper.batchInsert(projectList); return projectList; } @Override public void deleteengineerSchedulingByid(String engineerId, List types) { baseMapper.deleteByScheduling(engineerId, types); } @Override public List selectProgress(String engineerId) { return baseMapper.selectProgress(engineerId); } }