package com.aps.core.service.impl; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.*; import java.util.stream.Collectors; import com.aps.common.core.utils.uuid.IdUtils; import com.aps.common.core.web.domain.AjaxResult; import com.aps.core.domain.ApsResourceDateStat; import com.aps.core.mapper.ApsResourceGroupMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.aps.core.mapper.ApsPartRouteStatMapper; import com.aps.core.domain.ApsPartRouteStat; import com.aps.core.service.IApsPartRouteStatService; import static java.util.stream.Collectors.groupingBy; /** * 零件统计表Service业务层处理 * * @author zhl * @date 2025-04-11 */ @Service public class ApsPartRouteStatServiceImpl implements IApsPartRouteStatService { @Autowired private ApsPartRouteStatMapper apsPartRouteStatMapper; @Autowired private ApsResourceGroupMapper resourceGroupMapper; /** * 查询零件统计表 * * @param id 零件统计表主键 * @return 零件统计表 */ @Override public ApsPartRouteStat selectApsPartRouteStatById(String id) { return apsPartRouteStatMapper.selectApsPartRouteStatById(id); } /** * 查询零件统计表列表 * * @param apsPartRouteStat 零件统计表 * @return 零件统计表 */ @Override public List selectApsPartRouteStatList(ApsPartRouteStat apsPartRouteStat) { return apsPartRouteStatMapper.selectApsPartRouteStatList(apsPartRouteStat); } /** * 新增零件统计表 * * @param apsPartRouteStat 零件统计表 * @return 结果 */ @Override public int insertApsPartRouteStat(ApsPartRouteStat apsPartRouteStat) { return apsPartRouteStatMapper.insertApsPartRouteStat(apsPartRouteStat); } /** * 修改零件统计表 * * @param apsPartRouteStat 零件统计表 * @return 结果 */ @Override public int updateApsPartRouteStat(ApsPartRouteStat apsPartRouteStat) { return apsPartRouteStatMapper.updateApsPartRouteStat(apsPartRouteStat); } /** * 批量删除零件统计表 * * @param ids 需要删除的零件统计表主键 * @return 结果 */ @Override public int deleteApsPartRouteStatByIds(String[] ids) { return apsPartRouteStatMapper.deleteApsPartRouteStatByIds(ids); } /** * 删除零件统计表信息 * * @param id 零件统计表主键 * @return 结果 */ @Override public int deleteApsPartRouteStatById(String id) { return apsPartRouteStatMapper.deleteApsPartRouteStatById(id); } /** * 查询零件工序并更新计划开工日期 * */ @Override public void updatePartRoutPlanDate() { List tempList = apsPartRouteStatMapper.selectPartRoutStat(); /*对tempList 按照 workOrderNo 进行分组*/ Map> groupByWorkOrderNo = tempList.stream().collect(groupingBy(ApsPartRouteStat::getWorkOrderNo)); /*本次计算批次号*/ String batchNum = IdUtils.fastSimpleUUID(); for (Map.Entry> entry : groupByWorkOrderNo.entrySet()) { /*取出每个零件工单的工艺路线信息*/ List apsPartRouteStatList = entry.getValue(); /*按照工序号进行排序*/ apsPartRouteStatList.sort((a, b)->a.getRoadProcessNumber().compareTo(b.getRoadProcessNumber())); /*临时保存 上一道工序的工序总工时*/ ApsPartRouteStat last=null; for (int i = 0; i list = apsPartRouteStatMapper.selectResourceDateStat(); if (!list.isEmpty()) { /*求出计划的最大时间,没有 设置为当前时间+15天*/ ApsResourceDateStat apsResourceDateStat = list.stream().max(Comparator.comparing(ApsResourceDateStat::getPlanDay)).orElse(null); LocalDate maxPlanDay = LocalDate.now().plus(15, ChronoUnit.DAYS); if (apsResourceDateStat != null) { maxPlanDay = apsResourceDateStat.getPlanDay(); } /*组织出日期表头*/ List planDays = new ArrayList<>(); LocalDate startDay = LocalDate.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); while (!startDay.isAfter(maxPlanDay)) { planDays.add(startDay.format(formatter)); startDay = startDay.plus(1, ChronoUnit.DAYS); } /*组织出列头数据*/ List resourceNames =list.stream().map(ApsResourceDateStat::getResourceName).distinct().toList(); /*准备资源组信息*/ List>> targetList = new ArrayList<>(); resourceNames.forEach(resourceName -> { /*根据日期表头的顺序,组织出每个日期下的统计项目*/ Map> maps = new HashMap<>(Map.of()); List currentDaysResouces=new ArrayList<>(); for (String planDay : planDays) { /*查找当前计划日期下的所有资源组的数据*/ Optional first = list.stream() .filter(item -> item.getPlanDay().equals(LocalDate.parse(planDay, formatter)) && item.getResourceGroupName().equals(resourceName) ).collect(Collectors.toList()).stream().findFirst(); if(first.isPresent()){ currentDaysResouces.add(first.get()); } else { ApsResourceDateStat empty = new ApsResourceDateStat(); empty.setPlanDay(LocalDate.parse(planDay, formatter)); empty.setDesignTimes(0); empty.setRequireTimes(0); empty.setResourceName(resourceName); empty.setResourceGroupName(resourceName); empty.setCapacityLoad(BigDecimal.ZERO); currentDaysResouces.add(empty); } }; maps.put(resourceName, currentDaysResouces); targetList.add(maps); }); result.put("planTitle", planDays); result.put("planTable", targetList); } return result; } }