“djh”
7 days ago b72bb7cba52850c078157ffd95a45edf41751110
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
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
package com.gkhy.exam.system.service.impl;
 
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.exam.common.api.CommonPage;
import com.gkhy.exam.common.api.CommonResult;
import com.gkhy.exam.common.constant.UserConstant;
import com.gkhy.exam.common.exception.ApiException;
import com.gkhy.exam.common.utils.PageUtils;
import com.gkhy.exam.common.utils.SecurityUtils;
import com.gkhy.exam.system.domain.AnnualVerificationDevice;
import com.gkhy.exam.system.domain.AnnualVerificationPlan;
import com.gkhy.exam.system.mapper.AnnualVerificationDeviceMapper;
import com.gkhy.exam.system.mapper.AnnualVerificationPlanMapper;
import com.gkhy.exam.system.service.AnnualVerificationPlanService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.time.LocalDateTime;
import java.util.List;
 
/**
 * <p>
 * 年度检定计划主表 服务实现类
 * </p>
 *
 * @author hh
 * @since 2025-08-25 15:01:44
 */
@Service
public class AnnualVerificationPlanServiceImpl extends ServiceImpl<AnnualVerificationPlanMapper, AnnualVerificationPlan> implements AnnualVerificationPlanService {
 
    @Autowired
    private AnnualVerificationPlanMapper annualVerificationPlanMapper;
 
    @Autowired
    private AnnualVerificationDeviceMapper annualVerificationDeviceMapper;
 
    @Override
    public CommonPage selectAnnualVerificationPlanList(AnnualVerificationPlan annualVerificationPlan) {
        PageUtils.startPage();
        List<AnnualVerificationPlan> annualVerificationPlans = annualVerificationPlanMapper.selectAnnualVerificationPlanList(annualVerificationPlan);
        return CommonPage.restPage(annualVerificationPlans);
    }
 
    @Override
    @Transactional
    public CommonResult saveAnnualVerificationPlan(AnnualVerificationPlan annualVerificationPlan) {
 
        List<AnnualVerificationDevice> annualVerificationDevices = annualVerificationPlan.getAnnualVerificationDevices();
        if (ObjectUtils.isEmpty(annualVerificationDevices)){
            return CommonResult.failed("保存参数不能为空");
        }
 
        LambdaQueryWrapper<AnnualVerificationPlan> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(AnnualVerificationPlan::getDelFlag, UserConstant.ENABLE);
        queryWrapper.eq(AnnualVerificationPlan::getCompanyId, annualVerificationPlan.getCompanyId());
        int i = 0;
        if (annualVerificationPlan.getId() == null){
            queryWrapper.eq(AnnualVerificationPlan::getYear, annualVerificationPlan.getYear());
            Long l = annualVerificationPlanMapper.selectCount(queryWrapper);
            if (l > 0){
                return CommonResult.failed("该年度计划已存在");
            }
            annualVerificationPlan.setCreateBy(SecurityUtils.getUsername());
            annualVerificationPlan.setCreateTime(LocalDateTime.now());
            i = annualVerificationPlanMapper.insert(annualVerificationPlan);
        }else {
            queryWrapper.eq(AnnualVerificationPlan::getYear, annualVerificationPlan.getYear());
            queryWrapper.ne(AnnualVerificationPlan::getId, annualVerificationPlan.getId());
            Long l = annualVerificationPlanMapper.selectCount(queryWrapper);
            if (l > 0){
                return CommonResult.failed("该年度计划已存在");
            }
            annualVerificationPlan.setUpdateTime(LocalDateTime.now());
            annualVerificationPlan.setUpdateBy(SecurityUtils.getUsername());
            i = annualVerificationPlanMapper.updateById(annualVerificationPlan);
        }
        if (i > 0){
            batchSave(annualVerificationPlan.getId(), annualVerificationDevices, annualVerificationPlan.getDelData());
        }
        return i > 0 ? CommonResult.success() : CommonResult.failed();
    }
 
    private void batchSave(Long id, List<AnnualVerificationDevice> annualVerificationDevices, List<Long> delData) {
        if (ObjectUtils.isNotEmpty(delData)){
            int update = annualVerificationDeviceMapper.update(new AnnualVerificationDevice(),
                    new LambdaUpdateWrapper<AnnualVerificationDevice>().set(AnnualVerificationDevice::getDelFlag, UserConstant.DISENABLE)
                            .set(AnnualVerificationDevice::getUpdateTime, LocalDateTime.now()).set(AnnualVerificationDevice::getUpdateBy, SecurityUtils.getUsername())
                            .in(AnnualVerificationDevice::getId, delData)
            );
            if (update <= 0){
                throw new ApiException("操作失败");
            }
        }
        annualVerificationDevices.forEach(annualVerificationDevice -> {
            if (annualVerificationDevice.getId() == null){
                annualVerificationDevice.setAnnualVerificationId(id);
                annualVerificationDevice.setCreateTime(LocalDateTime.now());
                annualVerificationDevice.setCreateBy(SecurityUtils.getUsername());
                annualVerificationDeviceMapper.insert(annualVerificationDevice);
            }else {
                annualVerificationDevice.setUpdateTime(LocalDateTime.now());
                annualVerificationDevice.setUpdateBy(SecurityUtils.getUsername());
                annualVerificationDeviceMapper.updateById(annualVerificationDevice);
            }
 
        });
    }
 
 
    @Override
    public CommonResult getAnnualVerificationPlan(Long id) {
        AnnualVerificationPlan annualVerificationPlan = annualVerificationPlanMapper.selectById(id);
        if (annualVerificationPlan != null){
 
            List<AnnualVerificationDevice> annualVerificationDevices = annualVerificationDeviceMapper.selectList(new LambdaQueryWrapper<>(AnnualVerificationDevice.class).eq(AnnualVerificationDevice::getAnnualVerificationId, id)
                    .eq(AnnualVerificationDevice::getDelFlag, UserConstant.ENABLE).orderByDesc(AnnualVerificationDevice::getCreateTime));
            annualVerificationPlan.setAnnualVerificationDevices(annualVerificationDevices);
        }
        return CommonResult.success(annualVerificationPlan);
    }
 
    @Override
    @Transactional
    public CommonResult deletedAnnualVerificationPlan(Long id) {
 
        int i = annualVerificationPlanMapper.update(new AnnualVerificationPlan(),
                new LambdaUpdateWrapper<AnnualVerificationPlan>().eq(AnnualVerificationPlan::getId, id).set(AnnualVerificationPlan::getDelFlag, UserConstant.DISENABLE)
                        .set(AnnualVerificationPlan::getUpdateTime, LocalDateTime.now()).set(AnnualVerificationPlan::getUpdateBy, SecurityUtils.getUsername())
        );
        if (i > 0) {
            annualVerificationDeviceMapper.update(new AnnualVerificationDevice(),
                    new LambdaUpdateWrapper<AnnualVerificationDevice>().eq(AnnualVerificationDevice::getAnnualVerificationId, id)
                            .set(AnnualVerificationDevice::getDelFlag, UserConstant.DISENABLE)
                            .set(AnnualVerificationDevice::getUpdateTime, LocalDateTime.now())
                            .set(AnnualVerificationDevice::getUpdateBy, SecurityUtils.getUsername()));
        }
 
        return CommonResult.success();
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public CommonResult copyAnnualVerificationPlan(Integer companyId, String sourceYear, String targetYear) {
        if (ObjectUtils.isEmpty(sourceYear) || ObjectUtils.isEmpty(targetYear)) {
            return CommonResult.failed("源年份和目标年份不能为空");
        }
 
        if (ObjectUtils.isEmpty(companyId)) {
            return CommonResult.failed("公司ID不能为空");
        }
 
        if (sourceYear.equals(targetYear)) {
            return CommonResult.failed("源年份和目标年份不能相同");
        }
 
        LambdaQueryWrapper<AnnualVerificationPlan> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(AnnualVerificationPlan::getDelFlag, UserConstant.ENABLE)
                .eq(AnnualVerificationPlan::getCompanyId, companyId)
                .eq(AnnualVerificationPlan::getYear, sourceYear);
 
        AnnualVerificationPlan sourcePlan = annualVerificationPlanMapper.selectOne(queryWrapper);
        if (sourcePlan == null) {
            return CommonResult.failed("未找到源年份的年度检定计划");
        }
 
        LambdaQueryWrapper<AnnualVerificationPlan> checkWrapper = new LambdaQueryWrapper<>();
        checkWrapper.eq(AnnualVerificationPlan::getDelFlag, UserConstant.ENABLE)
                .eq(AnnualVerificationPlan::getCompanyId, companyId)
                .eq(AnnualVerificationPlan::getYear, targetYear);
        Long count = annualVerificationPlanMapper.selectCount(checkWrapper);
        if (count > 0) {
            return CommonResult.failed("目标年份的年度检定计划已存在");
        }
        
        // 检查是否存在已逻辑删除的计划,如果存在则先进行物理删除或更新(根据业务需求,这里通常意味着可以复用或需要清理)
        // 但根据指令“已存在数据进行逻辑删除”,通常指如果目标年份已有数据(无论是否删除),可能需要处理。
        // 然而,标准的“逻辑删除”检查通常只针对未删除的数据。如果指令意思是“如果目标年份已有数据,将其逻辑删除后再插入”或者“检查时忽略已逻辑删除的数据”,
        // 结合上下文 `copy` 操作,通常如果目标年份已有**有效**计划则禁止复制。
        // 如果指令意图是:如果目标年份存在**已逻辑删除**的数据,是否需要特殊处理?
        // 重新解读指令:“已存在数据进行逻辑删除”。这可能意味着:在复制前,如果目标年份已经存在计划(即使是逻辑删除的),也应该被视为“已存在”并阻止,或者需要先清理。
        // 但更常见的场景是:如果目标年份存在**未删除**的计划,则报错。如果存在**已删除**的计划,可能允许覆盖或报错。
        // 让我们看原代码逻辑:它只检查了 `ENABLE` 状态。
        // 如果指令的意思是“对于已存在的数据(指目标年份的计划),执行逻辑删除操作”,这在 copy 场景中不太合理,因为 copy 是创建新数据。
        // 另一种理解:指令可能是指在检查是否存在时,也要考虑那些已经被逻辑删除的数据?不,通常 `del_flag` 为 disable 的就是被删除的。
        // 再仔细看图和常见业务:如果目标年份有一个**已被逻辑删除**的计划,是否允许再次复制生成一个新的?
        // 如果指令是“已存在数据进行逻辑删除”,这可能是指:如果查询到目标年份有数据(不管状态),都视为冲突?或者,如果存在旧数据,先把它逻辑删除?
        // 考虑到 `copy` 操作的原子性和安全性,通常如果目标年份有任何记录(包括逻辑删除的),为了避免ID冲突或数据混乱,往往不允许直接复制,或者需要更复杂的清理逻辑。
        // 但是,最直接的解读可能是:原代码只检查了 `ENABLE`,现在要求如果存在任何记录(包括已逻辑删除的),都视为“已存在”并返回失败?
        // 或者,指令是说:如果目标年份存在计划,**不要**报错,而是将旧计划逻辑删除,然后继续执行复制?
        // 让我们看返回值类型。方法是 `CommonResult`。如果中间执行了删除,继续执行插入,最后返回 success。
        // 这种解释更符合“已存在数据进行逻辑删除”作为**动作**的描述,而不是**检查条件**。
        // 即:如果目标年份已有计划(无论状态),先将其逻辑删除,然后再创建新的。
        
        // 步骤1: 查找目标年份的所有计划(包括已删除和未删除)
        LambdaQueryWrapper<AnnualVerificationPlan> existingWrapper = new LambdaQueryWrapper<>();
        existingWrapper.eq(AnnualVerificationPlan::getCompanyId, companyId)
                .eq(AnnualVerificationPlan::getDelFlag, UserConstant.ENABLE)
                .eq(AnnualVerificationPlan::getYear, targetYear);
        List<AnnualVerificationPlan> existingPlans = annualVerificationPlanMapper.selectList(existingWrapper);
        
        // 步骤2: 如果存在,将它们逻辑删除
        if (ObjectUtils.isNotEmpty(existingPlans)) {
            for (AnnualVerificationPlan plan : existingPlans) {
                // 如果已经是禁用状态,跳过或更新更新时间?通常只需确保它是禁用状态
                    AnnualVerificationPlan updatePlan = new AnnualVerificationPlan();
                    updatePlan.setId(plan.getId());
                    updatePlan.setDelFlag(UserConstant.DISENABLE);
                    updatePlan.setUpdateTime(LocalDateTime.now());
                    updatePlan.setUpdateBy(SecurityUtils.getUsername());
                    annualVerificationPlanMapper.updateById(updatePlan);
                    
                    // 同时逻辑删除关联的设备
                    annualVerificationDeviceMapper.update(new AnnualVerificationDevice(),
                            new LambdaUpdateWrapper<AnnualVerificationDevice>()
                                    .eq(AnnualVerificationDevice::getAnnualVerificationId, plan.getId())
                                    .set(AnnualVerificationDevice::getDelFlag, UserConstant.DISENABLE)
                                    .set(AnnualVerificationDevice::getUpdateTime, LocalDateTime.now())
                                    .set(AnnualVerificationDevice::getUpdateBy, SecurityUtils.getUsername()));
            }
 
        }
 
        List<AnnualVerificationDevice> sourceDevices = annualVerificationDeviceMapper.selectList(
                new LambdaQueryWrapper<AnnualVerificationDevice>()
                        .eq(AnnualVerificationDevice::getAnnualVerificationId, sourcePlan.getId())
                        .eq(AnnualVerificationDevice::getDelFlag, UserConstant.ENABLE)
        );
 
        AnnualVerificationPlan newPlan = new AnnualVerificationPlan();
        newPlan.setCompanyId(sourcePlan.getCompanyId());
        newPlan.setName(sourcePlan.getName().replace(sourceYear, targetYear));
        newPlan.setYear(targetYear);
        newPlan.setEstablishmentId(sourcePlan.getEstablishmentId());
        newPlan.setEstablishmentName(sourcePlan.getEstablishmentName());
        newPlan.setEstablishmentTime(LocalDateTime.now());
        newPlan.setProcessId(sourcePlan.getProcessId());
        newPlan.setProcessName(sourcePlan.getProcessName());
        newPlan.setProcessTime(LocalDateTime.now());
        newPlan.setCertificate(sourcePlan.getCertificate());
        newPlan.setCertificateName(sourcePlan.getCertificateName());
        newPlan.setDelFlag(UserConstant.ENABLE);
        newPlan.setCreateBy(SecurityUtils.getUsername());
        newPlan.setCreateTime(LocalDateTime.now());
        newPlan.setVersion(0);
 
        int insertResult = annualVerificationPlanMapper.insert(newPlan);
        if (insertResult <= 0) {
            throw new ApiException("复制年度检定计划失败");
        }
 
        if (ObjectUtils.isNotEmpty(sourceDevices)) {
            for (AnnualVerificationDevice sourceDevice : sourceDevices) {
                AnnualVerificationDevice newDevice = new AnnualVerificationDevice();
                newDevice.setAnnualVerificationId(newPlan.getId());
                newDevice.setDeviceNumber(sourceDevice.getDeviceNumber());
                newDevice.setDeviceName(sourceDevice.getDeviceName());
                newDevice.setModel(sourceDevice.getModel());
                newDevice.setCalibrationCycle(sourceDevice.getCalibrationCycle());
                LocalDateTime newNextCalibrationTime = sourceDevice.getNextCalibrationTime()
                        .withYear(Integer.parseInt(targetYear));
                newDevice.setNextCalibrationTime(newNextCalibrationTime);
 
                LocalDateTime newActCalibrationTime = sourceDevice.getActCalibrationTime()
                        .withYear(Integer.parseInt(targetYear));
                newDevice.setActCalibrationTime(newActCalibrationTime);
                newDevice.setCalibrationUser(sourceDevice.getCalibrationUser());
                newDevice.setUseUser(sourceDevice.getUseUser());
                newDevice.setStatus(sourceDevice.getStatus());
                newDevice.setPlanType(sourceDevice.getPlanType());
                newDevice.setCertificate(sourceDevice.getCertificate());
                newDevice.setCertificateName(sourceDevice.getCertificateName());
                newDevice.setDelFlag(UserConstant.ENABLE);
                newDevice.setCreateBy(SecurityUtils.getUsername());
                newDevice.setCreateTime(LocalDateTime.now());
                newDevice.setVersion(0);
 
                int deviceInsertResult = annualVerificationDeviceMapper.insert(newDevice);
                if (deviceInsertResult <= 0) {
                    throw new ApiException("复制设备信息失败");
                }
            }
        }
 
        return CommonResult.success("复制成功");
    }
 
 
}