zhanghl
2025-05-16 c3c7756721b8b29585615f6d2c6cb6166f17c7cc
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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
package com.aps.core.service.impl;
 
import java.math.BigDecimal;
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));
        Boolean hasBefore = false;
        LocalDateTime now = LocalDateTime.now();
        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;
                apsPlateProcessStatMapper.insertApsPlateProcessStat(stat);
            }
            hasBefore=false;
 
        }
        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());
    }
}