dy
2025-04-16 3d3477dc4a070a48e21f1625914f55a321a6c096
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
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());
    }
}