package com.aps.core.service.impl; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.*; 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; 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); } /** * 查询零件工序并更新计划开工日期 * */ public void updatePartRoutPlanDate() { List tempList = apsPartRouteStatMapper.selectPartRoutStat(); /*对tempList 按照 workOrderNo 进行分组*/ Map> groupByWorkOrderNo = tempList.stream().collect(groupingBy(ApsPartRouteStat::getWorkOrderNo)); /*本次计算批次号*/ String batchNum = IdUtils.fastSimpleUUID(); apsPartRouteStatMapper.deleteLastBatch(batchNum); 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 0) { if (last != null) { stat.setProcessPlanStartDay(last.getProcessPlanStartDay().plusHours(last.getProcessTotalTime())); } } /*保存上一步计算的 开工日*/ last = stat; stat.setId(IdUtils.fastUUID().toString()); stat.setBatchNumber(batchNum); apsPartRouteStatMapper.insertApsPartRouteStat(stat); } } apsPartRouteStatMapper.deleteLastBatch(batchNum); } /** 查询资源日历表 */ @Override public AjaxResult selectResourceDateStat() { /*查出所有统计的数据*/ List list = apsPartRouteStatMapper.selectResourceDateStat(); /*求出计划的最大时间,没有 设置为当前时间+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 .isBefore( maxPlanDay)){ planDays.add(startDay.format(formatter)); startDay=startDay.plus(1,ChronoUnit.DAYS); } /*根据日期表头的顺序,组织出每个日期下的统计项目*/ List targetList = new ArrayList<>(); for (String planDay : planDays) { ApsResourceDateStat apsResourceDateStat1 = list.stream() .filter(item -> item.getPlanDay().equals(LocalDate.parse(planDay, formatter))) .findFirst().orElse(null); if(apsResourceDateStat1!=null){ targetList.add(apsResourceDateStat1); }else{ ApsResourceDateStat apsResourceDateStat2 = new ApsResourceDateStat(); apsResourceDateStat2.setPlanDay( LocalDate.parse(planDay, formatter)); targetList.add(apsResourceDateStat2); } } AjaxResult result=new AjaxResult(200,"生成成功") .put("planTitle",planDays) .put("planTable",targetList); return result; } }