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<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();
|
ApsPlateProcessStat apsPlateProcessStat = tempList.stream().filter(x -> x.getWorkOrderNo().equals("MO-250409003498")).findFirst().get();
|
Map<String, List<ApsPlateProcessStat>> groupByOrderNo = tempList.stream().collect(groupingBy(ApsPlateProcessStat::getWorkOrderNo));
|
Boolean hasBefore = false;
|
LocalDateTime now = LocalDateTime.now();
|
List<ApsPlateProcessStat> totalList=new ArrayList<>();
|
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());
|
stat.setWarning(false);
|
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);
|
if(orderPlanEndDayLocalDateTime.isBefore(now)){
|
hasBefore = true;
|
stat.setWarning(true);
|
stat.setProcessPlanEndDay(transDate(now));
|
stat.setProcessPlanStartDay(transDate(now));
|
}else {
|
/*计划完工日=钣金计划工单完成时间*/
|
stat.setProcessPlanEndDay(transDate(orderPlanEndDayLocalDateTime));
|
/*计划开工日=钣金计划工单完成时间 - 工序总工时*/
|
long seconds = stat.getProcessTotalTime().multiply(new BigDecimal(60)).multiply(new BigDecimal(60)).longValue();
|
LocalDateTime lastPlanStartDt = orderPlanEndDayLocalDateTime.minusSeconds(seconds);
|
if(lastPlanStartDt.isBefore(now)){
|
hasBefore = true;
|
stat.setProcessPlanStartDay(transDate(now));
|
}else {
|
stat.setProcessPlanStartDay(transDate(lastPlanStartDt));
|
}
|
}
|
}
|
/*当工艺工序号 >= 工单当前工序 代表是未来工序,才进行计划开工日 和计划完工日的计算
|
* 当工艺工序号 < 工单当前工序 过去工序,不进行计算
|
* */
|
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;
|
}
|
apsPlateProcessStatMapper.removeOtherStat(batchNum);
|
if(!totalList.isEmpty()){
|
int batchSize = 1000;
|
totalList.forEach(x->x.setId(String.valueOf(IdUtil.getSnowflakeNextId())));
|
for (int i = 0; i < totalList.size(); i += batchSize) {
|
int end = Math.min(i + batchSize, totalList.size());
|
List<ApsPlateProcessStat> batch = totalList.subList(i, end);
|
apsPlateProcessStatMapper.batchInsertPlateStat(batch);
|
}
|
}
|
}
|
|
|
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());
|
}
|
}
|