package com.aps.core.service.impl.ApsPlate; import java.math.BigDecimal; import java.time.*; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import cn.hutool.core.util.IdUtil; import com.aps.common.core.utils.uuid.IdUtils; import com.aps.common.security.utils.SecurityUtils; import com.aps.core.domain.ApsPlate.ApsPlateStandardRequireBomOrderDetail; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.aps.core.mapper.ApsPlateProcessStatMapper; import com.aps.core.domain.ApsPlate.ApsPlateProcessStat; import com.aps.core.service.ApsPlate.IApsPlateProcessStatService; import org.springframework.transaction.annotation.Transactional; import static java.util.stream.Collectors.groupingBy; /** * 钣金统计Service业务层处理 * * @author zhl * @date 2025-04-15 */ @Service public class ApsPlateProcessStatServiceImpl implements IApsPlateProcessStatService { @Autowired private ApsPlateProcessStatMapper apsPlateProcessStatMapper; /** * 查询钣金统计 * * @param id 钣金统计主键 * @return 钣金统计 */ @Override public ApsPlateProcessStat selectApsPlateProcessStatById(String id) { return apsPlateProcessStatMapper.selectApsPlateProcessStatById(id); } /** * 查询钣金统计列表 * * @param apsPlateProcessStat 钣金统计 * @return 钣金统计 */ @Override public List selectApsPlateProcessStatList(ApsPlateProcessStat apsPlateProcessStat) { return apsPlateProcessStatMapper.selectApsPlateProcessStatList(apsPlateProcessStat); } /** * 新增钣金统计 * * @param apsPlateProcessStat 钣金统计 * @return 结果 */ @Override public int insertApsPlateProcessStat(ApsPlateProcessStat apsPlateProcessStat) { return apsPlateProcessStatMapper.insertApsPlateProcessStat(apsPlateProcessStat); } /** * 修改钣金统计 * * @param apsPlateProcessStat 钣金统计 * @return 结果 */ @Override public int updateApsPlateProcessStat(ApsPlateProcessStat apsPlateProcessStat) { return apsPlateProcessStatMapper.updateApsPlateProcessStat(apsPlateProcessStat); } /** * 批量删除钣金统计 * * @param ids 需要删除的钣金统计主键 * @return 结果 */ @Override public int deleteApsPlateProcessStatByIds(String[] ids) { return apsPlateProcessStatMapper.deleteApsPlateProcessStatByIds(ids); } /** * 删除钣金统计信息 * * @param id 钣金统计主键 * @return 结果 */ @Override public int deleteApsPlateProcessStatById(String id) { return apsPlateProcessStatMapper.deleteApsPlateProcessStatById(id); } /** * 保存钣金统计数据 */ @Override public List computePlateProcessStat() { String batchNum = IdUtils.fastSimpleUUID(); List tempList = apsPlateProcessStatMapper.queryTempStat(); Map> groupByOrderNo = tempList.stream().collect(groupingBy(ApsPlateProcessStat::getWorkOrderNo)); Boolean hasBefore = false; LocalDateTime now = LocalDateTime.now(); List totalList=new ArrayList<>(); for (Map.Entry> entry : groupByOrderNo.entrySet()) { List statPerOrder = entry.getValue(); /*num 为根据完工时间排序出的序号,按此排序,可保证是按完工时间倒叙排列*/ statPerOrder.sort((a, b)->a.getNum().compareTo(b.getNum())); ApsPlateProcessStat last=null; for (int i = 0; i = 工单当前工序 代表是未来工序,才进行计划开工日 和计划完工日的计算 * 当工艺工序号 < 工单当前工序 过去工序,不进行计算 * */ if( stat.getRouteProcessNumber().compareTo(stat.getCurrentProcessNumber())>=0){ /*倒排时 下一道工序存在 比当前时间小的计划时间,则当前计划开始和结束时间都是当前时间*/ if(hasBefore){ stat.setWarning(true); stat.setProcessPlanEndDay(transDate(now)); stat.setProcessPlanStartDay(transDate(now)); }else{ /*下一道工序计划时间都正常时,*/ if (last != null) { /*当前工序结束时间=下一道工序的开始时间*/ stat.setProcessPlanEndDay(last.getProcessPlanStartDay()); /*开始时间=结束时间-总工时*/ long seconds = stat.getProcessTotalTime().multiply(new BigDecimal(60)).multiply(new BigDecimal(60)).longValue(); LocalDateTime crtStartDt = transLocalDateTime(last.getProcessPlanStartDay()).minusSeconds(seconds); /*如果开始时间小于当前时间*/ if(crtStartDt.isBefore(now)){ hasBefore=true; stat.setWarning(true); stat.setProcessPlanStartDay(transDate(now)); }else { stat.setProcessPlanStartDay(transDate(crtStartDt)); } } } } last = stat; totalList.add(stat); //apsPlateProcessStatMapper.insertApsPlateProcessStat(stat); } hasBefore=false; } return totalList; } private Date transDate(LocalDateTime localDateTime){ return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); } private LocalDateTime transLocalDateTime(Date date){ return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()); } }