hongjli
2025-05-22 bc0fdd1f0c20ca4737e8f073050f37b27a658694
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
198
199
200
201
202
203
204
205
206
package com.aps.core.service.mainPlan.impl;
 
import com.aps.common.core.utils.DateUtils;
import com.aps.common.core.utils.uuid.IdUtils;
import com.aps.common.core.web.page.TableDataInfo;
import com.aps.common.security.utils.SecurityUtils;
import com.aps.core.controller.basicData.ApsGasPipelineCapacityPlanController;
import com.aps.core.domain.ApsGasPipelineCapacityPlan;
import com.aps.core.domain.mainPlan.ApsWeldSeamStatisticsV2;
import com.aps.core.mapper.mainPlan.ApsWeldSeamStatisticsV2Mapper;
import com.aps.core.service.IApsGasPipelineCapacityPlanService;
import com.aps.core.service.mainPlan.IApsWeldSeamStatisticsV2Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
 
/**
 * 焊缝统计表V2Service业务层处理
 *
 * @date 2023-08-01
 */
@Service
public class ApsWeldSeamStatisticsV2ServiceImpl implements IApsWeldSeamStatisticsV2Service {
    @Autowired
    private ApsWeldSeamStatisticsV2Mapper apsWeldSeamStatisticsV2Mapper;
    
    @Autowired
    private ApsGasPipelineCapacityPlanController apsGasPipelineCapacityPlanController;
 
    /**
     * 查询焊缝统计表V2列表
     *
     * @param apsWeldSeamStatisticsV2 焊缝统计表V2
     * @return 焊缝统计表V2
     */
    @Override
    public List<ApsWeldSeamStatisticsV2> selectApsWeldSeamStatisticsV2List(ApsWeldSeamStatisticsV2 apsWeldSeamStatisticsV2) {
        return apsWeldSeamStatisticsV2Mapper.selectApsWeldSeamStatisticsV2List(apsWeldSeamStatisticsV2);
    }
 
    /**
     * 修改焊缝统计表V2
     *
     * @param apsWeldSeamStatisticsV2 焊缝统计表V2
     * @return 更新后的记录
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public ApsWeldSeamStatisticsV2 updateApsWeldSeamStatisticsV2(ApsWeldSeamStatisticsV2 apsWeldSeamStatisticsV2)
    {
        // 设置更新时间
        apsWeldSeamStatisticsV2.setUpdateTime(DateUtils.getNowDate());
        apsWeldSeamStatisticsV2.setUpdateBy(SecurityUtils.getUsername());
 
        // 1. 从数据库获取原始记录,以保留其他字段不变
        ApsWeldSeamStatisticsV2 originalData = apsWeldSeamStatisticsV2Mapper.selectApsWeldSeamStatisticsV2ById(apsWeldSeamStatisticsV2.getId());
        if (originalData == null) {
            throw new RuntimeException("记录不存在,ID: " + apsWeldSeamStatisticsV2.getId());
        }
 
        // 2. 只更新reserveEmergencyOrderOutput和days两个字段
        originalData.setReserveEmergencyOrderOutput(apsWeldSeamStatisticsV2.getReserveEmergencyOrderOutput());
        originalData.setDays(apsWeldSeamStatisticsV2.getDays());
        originalData.setUpdateTime(apsWeldSeamStatisticsV2.getUpdateTime());
        originalData.setUpdateBy(apsWeldSeamStatisticsV2.getUpdateBy());
        
        // 3. 确保所有用于计算的BigDecimal字段不为null
        java.math.BigDecimal pipingOrderReq = (originalData.getPipingOrderRequirement() != null) 
                ? originalData.getPipingOrderRequirement() : java.math.BigDecimal.ZERO;
        
        java.math.BigDecimal pipingPredictionReq = (originalData.getPipingPredictionRequirement() != null) 
                ? originalData.getPipingPredictionRequirement() : java.math.BigDecimal.ZERO;
        
        java.math.BigDecimal gasOrderReq = (originalData.getGasOrderRequirement() != null) 
                ? originalData.getGasOrderRequirement() : java.math.BigDecimal.ZERO;
        
        java.math.BigDecimal gasPredictionReq = (originalData.getGasPredictionRequirement() != null) 
                ? originalData.getGasPredictionRequirement() : java.math.BigDecimal.ZERO;
        
        java.math.BigDecimal reserveEmergencyOutput = (originalData.getReserveEmergencyOrderOutput() != null) 
                ? originalData.getReserveEmergencyOrderOutput() : java.math.BigDecimal.ZERO;
        
        // 4. 属性1:重新计算total(合计)
        java.math.BigDecimal total = pipingOrderReq
                .add(pipingPredictionReq)
                .add(gasOrderReq)
                .add(gasPredictionReq)
                .add(reserveEmergencyOutput);
        
        originalData.setTotal(total);
        
        // 5. 如果days不为空且大于0,重新计算requirementDayWeldSeam和isSatisfy
        if(originalData.getDays() != null && originalData.getDays().doubleValue() > 0) {
            // 属性2:计算需求日焊缝 = 合计/天数,四舍五入
            double result = total.doubleValue() / originalData.getDays().doubleValue();
            java.math.BigDecimal requirementDayWeldSeam = new java.math.BigDecimal(result).setScale(0, java.math.RoundingMode.HALF_UP);
            originalData.setRequirementDayWeldSeam(requirementDayWeldSeam);
            
            // 属性3:判断是否满足
            if(originalData.getProductionDayWeldSeam() != null) {
                if(originalData.getProductionDayWeldSeam().compareTo(requirementDayWeldSeam) >= 0) {
                    originalData.setIsSatisfy("1"); // 满足
                } else {
                    originalData.setIsSatisfy("0"); // 不满足
                }
            } else {
                originalData.setIsSatisfy("0"); // 默认不满足
            }
        } else {
            // 如果天数为空或为0,设置为不满足
            originalData.setIsSatisfy("0");
        }
        
        // 6. 更新数据库
        apsWeldSeamStatisticsV2Mapper.updateApsWeldSeamStatisticsV2(originalData);
        
        // 7. 返回更新后的完整记录
        return originalData;
    }
 
    /**
     * 刷新焊缝统计表数据
     *
     * @param username 操作用户
     * @return 受影响的记录数
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int refreshWeldSeamStatistics(String username) {
        // 1. 清空统计表
        apsWeldSeamStatisticsV2Mapper.truncateTable();
        
        // 2. 获取最新的统计数据
        List<ApsWeldSeamStatisticsV2> statisticsList = apsWeldSeamStatisticsV2Mapper.queryWeldSeamStatistics();
        
        // 3. 设置创建信息和ID,并获取生产日焊缝数据
        Date now = new Date();
        for (ApsWeldSeamStatisticsV2 statistics : statisticsList) {
            // 使用UUID作为ID
            statistics.setId(IdUtils.fastUUID());
            statistics.setCreateBy(username);
            statistics.setCreateTime(now);
            
            // 先计算需求日焊缝(requirementDayWeldSeam)
            if(statistics.getDays() != null && statistics.getDays().doubleValue() > 0 && statistics.getTotal() != null) {
                // 计算需求日焊缝 = 合计/天数,四舍五入
                double result = statistics.getTotal().doubleValue() / statistics.getDays().doubleValue();
                BigDecimal requirementDayWeldSeam = new BigDecimal(result).setScale(0, java.math.RoundingMode.HALF_UP);
                statistics.setRequirementDayWeldSeam(requirementDayWeldSeam);
            } else if (statistics.getRequirementDayWeldSeam() == null) {
                // 如果无法计算且之前没有值,设置默认值
                statistics.setRequirementDayWeldSeam(BigDecimal.ZERO);
            }
            
            // 设置生产日焊缝(productionDayWeldSeam)
            // 根据year、month、productionBase查询对应的生产日焊缝数据
            if (statistics.getYear() != null && statistics.getMonth() != null && statistics.getProductionBase() != null) {
                // 创建查询条件
                ApsGasPipelineCapacityPlan queryParam = new ApsGasPipelineCapacityPlan();
                queryParam.setYear(statistics.getYear().toString());
                queryParam.setMonth(statistics.getMonth().toString());
                queryParam.setOrgCode(statistics.getProductionBase());
                
                // 直接调用Controller的list方法获取数据
                TableDataInfo tableDataInfo = apsGasPipelineCapacityPlanController.list(queryParam);
                List<ApsGasPipelineCapacityPlan> capacityPlans = (List<ApsGasPipelineCapacityPlan>) tableDataInfo.getRows();
                
                // 遍历找到processName为"气体管路轨道焊接组"的记录
                for (ApsGasPipelineCapacityPlan plan : capacityPlans) {
                    if ("气体管路轨道焊接组".equals(plan.getProcessName()) && plan.getDayProduceAllNum() != null) {
                        // 设置生产日焊缝值
                        statistics.setProductionDayWeldSeam(plan.getDayProduceAllNum());
                        break; // 找到匹配记录后退出循环
                    }
                }
            }
            
            // 如果没有找到匹配的产能规划数据,设置默认状态
            if (statistics.getProductionDayWeldSeam() == null) {
                statistics.setProductionDayWeldSeam(BigDecimal.ZERO);
            }
            
            // 最后统一计算isSatisfy(是否满足)
            // 当生产日焊缝 >= 需求日焊缝时为满足,否则为不满足
            if (statistics.getRequirementDayWeldSeam() != null && 
                statistics.getProductionDayWeldSeam() != null &&
                statistics.getProductionDayWeldSeam().compareTo(statistics.getRequirementDayWeldSeam()) >= 0) {
                statistics.setIsSatisfy("1"); // 满足
            } else {
                statistics.setIsSatisfy("0"); // 不满足
            }
        }
        
        // 4. 批量插入数据
        int count = 0;
        if (!statisticsList.isEmpty()) {
            count = apsWeldSeamStatisticsV2Mapper.batchInsert(statisticsList);
        }
        
        return count;
    }