李林
2023-10-07 658d4927d468c47208fd012d9128b09249c07eff
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
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
/*
 *    Copyright (c) 2018-2025, ztt All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 * Neither the name of the pig4cloud.com developer nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 * Author: ztt
 */
package com.chinaztt.mes.quality.service.impl;
 
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.chinaztt.mes.quality.dto.ProductionInfoDTO;
import com.chinaztt.mes.quality.dto.QualityMoSamplingRuleDTO;
import com.chinaztt.mes.quality.entity.Report;
import com.chinaztt.mes.quality.entity.ReportSamplingRecord;
import com.chinaztt.mes.quality.mapper.ReportMapper;
import com.chinaztt.mes.quality.mapper.ReportSamplingRecordMapper;
import com.chinaztt.mes.quality.service.ReportSamplingRecordService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.util.Objects;
 
/**
 * 检测汇报抽检记录
 *
 * @author shz
 * @date 2023-04-14 10:59:13
 */
@Service
@AllArgsConstructor
@Transactional(rollbackFor = Exception.class)
public class ReportSamplingRecordServiceImpl extends ServiceImpl<ReportSamplingRecordMapper, ReportSamplingRecord> implements ReportSamplingRecordService {
 
    private ReportMapper reportMapper;
 
    @Override
    public Long generateSamplingRecord(String systemNo, Long reportId, String applyType) {
        // 根据系统号获取生产相关信息
        ProductionInfoDTO productionInfo = this.baseMapper.getProductionInfo(systemNo);
        if (productionInfo == null) {
            return null;
        }
 
        // 查询是否存在抽检规则
        QualityMoSamplingRuleDTO moSamplingRule = this.baseMapper.getMoSamplingRule(productionInfo.getMoId(), productionInfo.getMoRoutingOperationId(), applyType);
        if (moSamplingRule == null) {
            return null;
        }
 
        // 找出该产出符合条件的投入批次
        String inputOutBatchNo = this.baseMapper.getInputOutBatchNo(productionInfo.getProductMainId(), moSamplingRule.getRetrospectOperationId());
        if (inputOutBatchNo == null) {
            return null;
        }
 
        // 存在相关抽检记录,更新抽检记录相关次数,否则新增抽检记录
        ReportSamplingRecord reportSamplingRecord = this.baseMapper.selectOne(Wrappers.<ReportSamplingRecord>lambdaQuery()
                .eq(ReportSamplingRecord::getMoId, productionInfo.getMoId())
                .eq(ReportSamplingRecord::getMoSamplingRuleId, moSamplingRule.getId())
                .eq(ReportSamplingRecord::getOutBatchNo, inputOutBatchNo)
                .ne(ReportSamplingRecord::getCheckedNum, moSamplingRule.getSamplingDenominator())
                .last("LIMIT 1"));
        if (reportSamplingRecord != null) {
            // 判断是否满足继承条件
            if (reportSamplingRecord.getSamplingNum() > 0 && judgeInherit(reportSamplingRecord)) {
                boolean updateResult = SqlHelper.retBool(this.baseMapper.updateSamplingRecordNum(reportSamplingRecord.getId(), 1, null, null, reportSamplingRecord.getVersion()));
                if (!updateResult) {
                    throw new RuntimeException("更新抽检记录失败请重试");
                }
                this.reportMapper.update(null, Wrappers.<Report>lambdaUpdate()
                        .set(Report::getSamplingRecordId, reportSamplingRecord.getId())
                        .set(Report::getSamplingCorrectState, true)
                        .eq(Report::getId, reportId));
                return reportSamplingRecord.getReportId();
            }
        } else {
            // 新增抽检记录
            ReportSamplingRecord newReportSamplingRecord = new ReportSamplingRecord();
            newReportSamplingRecord.setMoSamplingRuleId(moSamplingRule.getId());
            newReportSamplingRecord.setMoId(productionInfo.getMoId());
            newReportSamplingRecord.setReportId(reportId);
            newReportSamplingRecord.setOutBatchNo(inputOutBatchNo);
            newReportSamplingRecord.setSamplingNum(0);
            newReportSamplingRecord.setCheckedNum(0);
            newReportSamplingRecord.setVersion(0);
            newReportSamplingRecord.setSamplingDenominator(moSamplingRule.getSamplingDenominator());
            newReportSamplingRecord.setSamplingNumerator(moSamplingRule.getSamplingNumerator());
            newReportSamplingRecord.setSamplingPosition(moSamplingRule.getSamplingPosition());
            this.save(newReportSamplingRecord);
            // this.reportMapper.update(null, Wrappers.<Report>lambdaUpdate()
            //         .set(Report::getSamplingRecordId, newReportSamplingRecord.getId())
            //         .set(Report::getSamplingCorrectState, false)
            //         .eq(Report::getId, reportId));
        }
        return null;
    }
 
    private boolean judgeInherit(ReportSamplingRecord reportSamplingRecord) {
        // 检测数量还不满足,则需要判断是否继承
        if (!reportSamplingRecord.getSamplingNum().equals(reportSamplingRecord.getSamplingNumerator())) {
            // 获取目前已检测次数
            Integer count = this.reportMapper.selectCount(Wrappers.<Report>lambdaQuery().eq(Report::getSamplingRecordId, reportSamplingRecord.getId()));
            int samplingPosition = Integer.parseInt(reportSamplingRecord.getSamplingPosition().split(",")[reportSamplingRecord.getSamplingNum()]);
            if (count  + 1 < samplingPosition) {
                return true;
            }
        } else {
            return true;
        }
        return false;
    }
 
    @Override
    public Long addSamplingRecordNum(String systemNo, Long reportId, String applyType) {
        Report report = this.reportMapper.selectById(reportId);
        if (report.getSamplingRecordId() != null) {
            ReportSamplingRecord record = this.baseMapper.selectById(report.getSamplingRecordId());
            ReportSamplingRecord newRecord = this.getOne(Wrappers.<ReportSamplingRecord>lambdaQuery()
                    .eq(ReportSamplingRecord::getMoId, record.getMoId())
                    .eq(ReportSamplingRecord::getMoSamplingRuleId, record.getMoSamplingRuleId())
                    .eq(ReportSamplingRecord::getOutBatchNo, record.getOutBatchNo())
                    .ne(ReportSamplingRecord::getCheckedNum, record.getSamplingDenominator())
                    .last("LIMIT 1"));
 
            if (newRecord != null) {
                boolean flag = false;
                // 抽检数量不满足,则抽检也许新增次数
                if (!newRecord.getSamplingNum().equals(newRecord.getSamplingNumerator())) {
                    boolean updateResult = SqlHelper.retBool(this.baseMapper.updateSamplingRecordNum(newRecord.getId(), 1, 1, reportId, newRecord.getVersion()));
                    newRecord.setReportId(reportId);
                    if (!updateResult) {
                        throw new RuntimeException("更新抽检记录失败请重试");
                    }
                } else {
                    boolean updateResult = SqlHelper.retBool(this.baseMapper.updateSamplingRecordNum(newRecord.getId(), 1, null, null, newRecord.getVersion()));
                    flag = true;
                    if (!updateResult) {
                        throw new RuntimeException("更新抽检记录失败请重试");
                    }
                }
 
                this.reportMapper.update(null, Wrappers.<Report>lambdaUpdate()
                        .set(Report::getSamplingRecordId, newRecord.getId())
                        .set(Report::getSamplingCorrectState, true)
                        .eq(Report::getId, reportId));
                if (flag) {
                    return newRecord.getReportId();
                }
            } else {
                // 新增抽检记录
                ReportSamplingRecord newReportSamplingRecord = new ReportSamplingRecord();
                newReportSamplingRecord.setMoSamplingRuleId(record.getMoSamplingRuleId());
                newReportSamplingRecord.setMoId(record.getMoId());
                newReportSamplingRecord.setReportId(reportId);
                newReportSamplingRecord.setOutBatchNo(record.getOutBatchNo());
                newReportSamplingRecord.setSamplingNum(1);
                newReportSamplingRecord.setCheckedNum(1);
                newReportSamplingRecord.setSamplingDenominator(record.getSamplingDenominator());
                newReportSamplingRecord.setSamplingNumerator(record.getSamplingNumerator());
                this.save(newReportSamplingRecord);
                this.reportMapper.update(null, Wrappers.<Report>lambdaUpdate()
                        .set(Report::getSamplingRecordId, newReportSamplingRecord.getId())
                        .set(Report::getSamplingCorrectState, true)
                        .eq(Report::getId, reportId));
            }
        }
        return null;
    }
 
    @Override
    public void reduceSamplingRecordNum(Long id, Long reportId) {
        ReportSamplingRecord reportSamplingRecord = this.baseMapper.selectById(id);
        if (reportSamplingRecord.getCheckedNum() == 1) {
            this.removeById(id);
            return;
        }
        // 根据目前抽检次数获取当前抽检位置
        int samplingPosition = Integer.parseInt(reportSamplingRecord.getSamplingPosition().split(",")[reportSamplingRecord.getSamplingNum() - 1]);
        Long updateReportId = null;
        // 如果删除的是抽检记录,则需要更新抽检记录的汇报id
        if (reportSamplingRecord.getReportId().equals(reportId)) {
            Report report = reportMapper.selectOne(Wrappers.<Report>lambdaQuery()
                    .eq(Report::getSamplingRecordId, id)
                    .eq(Report::getIsSubmit, true)
                    .last("LIMIT 1"));
            if (report == null) {
                throw new RuntimeException("不存在已提交的抽检汇报记录,无法删除");
            }
            updateReportId = report.getId();
        }
        if (reportSamplingRecord.getCheckedNum() > samplingPosition) {
            baseMapper.updateSamplingRecordNum(id, -1, null, updateReportId, reportSamplingRecord.getVersion());
        } else {
            baseMapper.updateSamplingRecordNum(id, -1, -1, updateReportId, reportSamplingRecord.getVersion());
        }
    }
 
    @Override
    public void submitSamplingRecord(String systemNo, Long reportId, String applyType) {
        // 根据系统号获取生产相关信息
        ProductionInfoDTO productionInfo = this.baseMapper.getProductionInfo(systemNo);
        if (productionInfo == null) {
            return;
        }
 
        // 查询是否存在抽检规则
        QualityMoSamplingRuleDTO moSamplingRule = this.baseMapper.getMoSamplingRule(productionInfo.getMoId(), productionInfo.getMoRoutingOperationId(), applyType);
        if (moSamplingRule == null) {
            return;
        }
 
        // 找出该产出符合条件的投入批次
        String inputOutBatchNo = this.baseMapper.getInputOutBatchNo(productionInfo.getProductMainId(), moSamplingRule.getRetrospectOperationId());
        if (inputOutBatchNo == null) {
            return;
        }
 
        ReportSamplingRecord reportSamplingRecord = this.getOne(Wrappers.<ReportSamplingRecord>lambdaQuery()
                .eq(ReportSamplingRecord::getMoId, productionInfo.getMoId())
                .eq(ReportSamplingRecord::getMoSamplingRuleId, moSamplingRule.getId())
                .eq(ReportSamplingRecord::getOutBatchNo, inputOutBatchNo)
                .ne(ReportSamplingRecord::getSamplingNum, moSamplingRule.getSamplingNumerator())
                .last("LIMIT 1"));
 
        if (reportSamplingRecord != null) {
            boolean updateResult = SqlHelper.retBool(this.baseMapper.updateSamplingRecordNum(reportSamplingRecord.getId(), 1, 1, reportId, reportSamplingRecord.getVersion()));
            if (!updateResult) {
                throw new RuntimeException("更新抽检记录失败请重试");
            }
 
            this.reportMapper.update(null, Wrappers.<Report>lambdaUpdate()
                    .set(Report::getSamplingRecordId, reportSamplingRecord.getId())
                    .set(Report::getSamplingCorrectState, true)
                    .eq(Report::getId, reportId));
        }
    }
}