package com.aps.core.service.impl;
|
|
import java.time.*;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Map;
|
|
import com.aps.common.core.utils.uuid.IdUtils;
|
import com.aps.common.security.utils.SecurityUtils;
|
import org.apache.commons.lang3.SystemUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import com.aps.core.mapper.ApsPlateProcessStatMapper;
|
import com.aps.core.domain.ApsPlateProcessStat;
|
import com.aps.core.service.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<ApsPlateProcessStat> 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);
|
}
|
|
/**
|
* 保存钣金统计数据
|
*/
|
@Transactional
|
@Override
|
public void savePlateProcessStat() {
|
String batchNum = IdUtils.fastSimpleUUID();
|
List<ApsPlateProcessStat> tempList = apsPlateProcessStatMapper.queryTempStat();
|
Map<String, List<ApsPlateProcessStat>> groupByOrderNo = tempList.stream().collect(groupingBy(ApsPlateProcessStat::getWorkOrderNo));
|
for (Map.Entry<String, List<ApsPlateProcessStat>> entry : groupByOrderNo.entrySet()) {
|
List<ApsPlateProcessStat> statPerOrder = entry.getValue();
|
/*num 为根据完工时间排序出的序号,按此排序,可保证是按完工时间倒叙排列*/
|
statPerOrder.sort((a, b)->a.getNum().compareTo(b.getNum()));
|
ApsPlateProcessStat last=null;
|
for (int i = 0; i <statPerOrder.size(); i++) {
|
ApsPlateProcessStat stat = statPerOrder.get(i);
|
stat.setId(IdUtils.fastSimpleUUID());
|
stat.setBatchNumber(batchNum);
|
stat.setCreateBy(SecurityUtils.getUsername());
|
if(i==0){
|
Date orderPlanEndDay = stat.getOrderPlanEndDay();
|
LocalDateTime transLocalDateTime = transLocalDateTime(orderPlanEndDay);
|
LocalTime endOfDay = LocalTime.of(23, 59, 59);
|
LocalDateTime orderPlanEndDayLocalDateTime = LocalDateTime.of( transLocalDateTime.toLocalDate(), endOfDay);
|
|
/*计划完工日=钣金计划工单完成时间*/
|
stat.setProcessPlanEndDay(transDate(orderPlanEndDayLocalDateTime));
|
/*计划开工日=钣金计划工单完成时间 - 工序总工时*/
|
stat.setProcessPlanStartDay(transDate(orderPlanEndDayLocalDateTime.minusHours(stat.getProcessTotalTime())));
|
}
|
/*当工艺工序号 > 工单当前工序时,代表是未来的工序,才进行计划开工日 和计划完工日的计算*/
|
if( stat.getRouteProcessNumber().compareTo(stat.getCurrentProcessNumber())>0){
|
/*&计划开工日 和 计划完成日 ,同时大于当前日期时执行计算*/
|
LocalDateTime currentEndDay = transLocalDateTime(stat.getProcessPlanEndDay());
|
LocalDateTime currentStartDay = transLocalDateTime(stat.getProcessPlanStartDay());
|
if(currentEndDay.isAfter(LocalDateTime.now()) && currentStartDay.isAfter(LocalDateTime.now())){
|
if(last!=null){
|
/*未开工工序的计划开工日=上一道工序的计划开工日+上一道工序的工序总工时。*/
|
stat.setProcessPlanEndDay(last.getProcessPlanStartDay());
|
stat.setProcessPlanStartDay(transDate(transLocalDateTime(last.getProcessPlanStartDay()).minusHours(stat.getProcessTotalTime()) ));
|
}
|
}
|
}
|
last = stat;
|
apsPlateProcessStatMapper.insertApsPlateProcessStat(stat);
|
}
|
|
}
|
apsPlateProcessStatMapper.removeOtherStat(batchNum);
|
|
}
|
|
|
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());
|
}
|
}
|