package com.mes.damage.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.mes.damage.entity.Damage; import com.mes.damage.mapper.DamageMapper; import com.mes.damage.service.DamageService; import com.mes.glassinfo.entity.GlassInfo; import com.mes.glassinfo.mapper.GlassInfoMapper; import com.mes.pp.entity.ReportingWork; import com.mes.work_assignment.entity.WorkAssignment; import com.mes.work_assignment.mapper.WorkAssignmentMapper; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.sql.Timestamp; import java.time.LocalDateTime; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; /** *

* 服务实现类 *

* * @author wu * @since 2024-06-13 */ @Service public class DamageServiceImpl extends ServiceImpl implements DamageService { @Resource GlassInfoMapper glassInfoMapper; @Resource WorkAssignmentMapper workAssignmentMapper; /** * 查询报工信息 */ @Override public List selectDamage(String startTime, String endTime, int type, int status, String workingProcedure) { LambdaQueryWrapper damageSelectWrapper = new LambdaQueryWrapper<>(); damageSelectWrapper.between(Damage::getDamageTime, startTime, endTime); if (type != 0) { damageSelectWrapper.eq(Damage::getType, type); } if (status != 0) { damageSelectWrapper.eq(Damage::getStatus, status); } if (!"0".equals(workingProcedure)) { damageSelectWrapper.eq(Damage::getWorkingProcedure, workingProcedure); } List damageList = baseMapper.selectList(damageSelectWrapper); for (Damage damage : damageList) { damage.setStatus(2); } return baseMapper.selectList(damageSelectWrapper); } /** * 提交报工 */ @Override public void submitDamage(List damageList) { Map>>>> resultMap = damageList.stream() .collect(Collectors.groupingBy( Damage::getProcessId, Collectors.groupingBy( Damage::getWorkingProcedure, Collectors.groupingBy( Damage::getDeviceName, Collectors.groupingBy(Damage::getTeamsGroupsName) ) ) )); // 遍历 resultMap for (Map.Entry>>>> processEntry : resultMap.entrySet()) { String processId = processEntry.getKey(); System.out.println("ProcessId: " + processId); // 获取第二层的 Map,按 workingProcedure 分组的结果 Map>>> workingProcedureMap = processEntry.getValue(); // 遍历 workingProcedureMap for (Map.Entry>>> workingProcedureEntry : workingProcedureMap.entrySet()) { String workingProcedure = workingProcedureEntry.getKey(); System.out.println(" WorkingProcedure: " + workingProcedure); // 获取第三层的 Map,按 deviceName 分组的结果 Map>> deviceNameMap = workingProcedureEntry.getValue(); // 遍历 deviceNameMap for (Map.Entry>> deviceNameEntry : deviceNameMap.entrySet()) { String deviceName = deviceNameEntry.getKey(); System.out.println(" DeviceName: " + deviceName); // 获取第四层的 Map,按 teamsGroupsName 分组的结果 Map> teamsGroupsNameMap = deviceNameEntry.getValue(); // 遍历 teamsGroupsNameMap for (Map.Entry> teamsGroupsNameEntry : teamsGroupsNameMap.entrySet()) { String teamsGroupsName = teamsGroupsNameEntry.getKey(); System.out.println(" TeamsGroupsName: " + teamsGroupsName); // 获取 Damage 列表 List damageListForTeamsGroupsName = teamsGroupsNameEntry.getValue(); //报工主表数据 ReportingWork reportingWork = new ReportingWork(); reportingWork.setProcessId(processId); reportingWork.setThisProcess(workingProcedure); reportingWork.setDeviceName(deviceName); reportingWork.setTeamsGroupsName(teamsGroupsName); Map>>> groupedByOrderTechBreakage = damageListForTeamsGroupsName.stream() .map(damage -> Optional.ofNullable(damage)) // 使用Optional处理可能为null的元素 .filter(Optional::isPresent) // 过滤掉空的Optional .map(Optional::get) // 获取非空的Damage对象 .collect(Collectors.groupingBy( damage -> Optional.ofNullable(damage.getOrderNumber()).orElse(0), // 使用orElse设置默认值,以处理null值 Collectors.groupingBy( damage -> Optional.ofNullable(damage.getTechnologyNumber()).orElse(0), // 同样处理technologyNumber可能为null的情况 Collectors.groupingBy( damage -> Optional.ofNullable(damage.getBreakageType()).orElse("Unknown"), // 处理breakageType可能为null的情况 Collectors.toList() ) ) )); // 遍历 groupedByOrderTechBreakage for (Map.Entry>>> orderEntry : groupedByOrderTechBreakage.entrySet()) { Integer orderNumber = orderEntry.getKey(); System.out.println(" OrderNumber: " + orderNumber); // 获取第二层的 Map,按 technologyNumber 分组的结果 Map>> technologyNumberMap = orderEntry.getValue(); // 遍历 technologyNumberMap for (Map.Entry>> technologyEntry : technologyNumberMap.entrySet()) { Integer technologyNumber = technologyEntry.getKey(); System.out.println(" TechnologyNumber: " + technologyNumber); // 获取第三层的 Map,按 breakageType 分组的结果 Map> breakageTypeMap = technologyEntry.getValue(); // 遍历 breakageTypeMap for (Map.Entry> breakageTypeEntry : breakageTypeMap.entrySet()) { String breakageType = breakageTypeEntry.getKey(); System.out.println(" BreakageType: " + breakageType); // 获取 Damage 列表 List damageListForBreakageType = breakageTypeEntry.getValue(); int completedQuantity = 0; int breakageQuantity = 0; // 遍历 Damage 列表 for (Damage damage : damageListForBreakageType) { // 打印或处理每个 Damage 对象 System.out.println(" Damage: " + damage.toString()); if (damage.getType() == 1) { completedQuantity += 1; } else if (damage.getType() == 2) { breakageQuantity += 1; } } } } } } } } } } /** * 添加报工信息 */ @Override public void insertDamage(Damage damage) { LambdaQueryWrapper glassInfoSelectWrapper = new LambdaQueryWrapper<>(); glassInfoSelectWrapper.eq(GlassInfo::getGlassId, damage.getGlassId()); GlassInfo glassInfo = glassInfoMapper.selectOne(glassInfoSelectWrapper); BeanUtils.copyProperties(glassInfo, damage); LambdaQueryWrapper workAssignmentSelectWrapper = new LambdaQueryWrapper<>(); workAssignmentSelectWrapper .eq(WorkAssignment::getLine, damage.getLine()) .eq(WorkAssignment::getWorkProcesses, damage.getWorkingProcedure()); WorkAssignment workAssignment = workAssignmentMapper.selectOne(workAssignmentSelectWrapper); if (workAssignment != null) { damage.setTeamsGroupsName(workAssignment.getTeamsGroupsName()); damage.setDeviceName(workAssignment.getDeviceName()); } damage.setProcessId(glassInfo.getFlowCardId()); damage.setOrderNumber(glassInfo.getGlassType()); damage.setTechnologyNumber(glassInfo.getLayer()); damage.setDamageTime(Timestamp.valueOf(LocalDateTime.now())); damage.setType(2); baseMapper.insert(damage); } }