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
package org.jeecg.modules.eam.service.impl;
 
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.jeecg.modules.eam.entity.EamEquipment;
import org.jeecg.modules.eam.entity.EamFactorySecondMaintPlan;
import org.jeecg.modules.eam.mapper.EamFactorySecondMaintPlanMapper;
import org.jeecg.modules.eam.service.IEamEquipmentService;
import org.jeecg.modules.eam.service.IEamFactorySecondMaintPlanService;
import org.jeecg.modules.system.entity.BaseFactory;
import org.jeecg.modules.system.service.IBaseFactoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
 
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
 
import java.util.List;
 
/**
 * @Description: “首页车间二保计划
 * @Author:  jeecg-boot
 * @Date:   2025-08-22
 * @Version: V1.0
 */
@Service
public class EamFactorySecondMaintPlanServiceImpl extends ServiceImpl<EamFactorySecondMaintPlanMapper, EamFactorySecondMaintPlan> implements IEamFactorySecondMaintPlanService {
    @Autowired
    private IBaseFactoryService baseFactoryService;
 
    @Autowired
    private IEamEquipmentService eamEquipmentService;
 
    /**
     * 设备管理首页-车间二保计划列表
     * @return
     */
    @Override
    public List<EamFactorySecondMaintPlan> queryAllList(){
        return this.baseMapper.queryAllList();
    }
 
    /**
     * 新增首页车间二保计划
     * @param equipmentId
     * @param monthPlan
     * @return
     */
    @Override
    public EamFactorySecondMaintPlan add(String equipmentId, String monthPlan) {
        EamEquipment equipment=eamEquipmentService.getById(equipmentId);
        if (equipment==null) {
            return null;
        }
        String factoryId = baseFactoryService.queryByCode(equipment.getFactoryOrgCode().substring(0,6)).getId();
        // 尝试直接更新(原子操作)
        LambdaUpdateWrapper<EamFactorySecondMaintPlan> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(EamFactorySecondMaintPlan::getFactoryId, factoryId)
                .eq(EamFactorySecondMaintPlan::getMonthPlan, monthPlan)
                .setSql("quantity = quantity + 1"); // 原子增加
 
        int updated = this.baseMapper.update(null, updateWrapper);
 
        if (updated > 0) {
            // 更新成功,返回更新后的记录
            return this.getOne(Wrappers.<EamFactorySecondMaintPlan>lambdaQuery()
                    .eq(EamFactorySecondMaintPlan::getFactoryId, factoryId)
                    .eq(EamFactorySecondMaintPlan::getMonthPlan, monthPlan));
        } else {
            // 无记录存在,创建新记录
            return createNewPlan(factoryId, monthPlan);
        }
    }
 
    private EamFactorySecondMaintPlan createNewPlan(String factoryId, String monthPlan) {
        EamFactorySecondMaintPlan newPlan = new EamFactorySecondMaintPlan();
        newPlan.setFactoryId(factoryId);
        newPlan.setMonthPlan(monthPlan);
        newPlan.setQuantity(1);
 
        // 设置工厂名称(优化处理)
        BaseFactory baseFactory = baseFactoryService.getById(factoryId);
        if (baseFactory != null) {
            String orgCode = baseFactory.getOrgCode();
            // 使用整个orgCode(如果长度不足6)
            String nameOrgCode = orgCode.length() >= 6 ? orgCode.substring(0, 6) : orgCode;
            newPlan.setFactoryName(baseFactoryService.factoryDataNameByOrgCode(nameOrgCode));
        }
 
        // 处理并发创建冲突
        try {
            this.save(newPlan);
            return newPlan;
        } catch (DuplicateKeyException e) {
            // 其他线程已创建,转为更新
            return add(factoryId, monthPlan);
        }
    }
 
    /**
     * 日期变化
     * @param equipmentId 设备ID
     * @param oldMonthPlan 旧月份计划(格式如yyyy-MM)
     * @param newMonthPlan 新月份计划(格式如yyyy-MM)
     * @return 是否成功变更
    */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean dateChange(String equipmentId, String oldMonthPlan, String newMonthPlan) {
        // 1. 获取设备信息
        EamEquipment equipment = eamEquipmentService.getById(equipmentId);
        if (equipment == null) {
            return false;
        }
 
        // 2. 获取工厂ID
        String factoryOrgCodePrefix = equipment.getFactoryOrgCode().substring(0, 6);
        BaseFactory factory = baseFactoryService.queryByCode(factoryOrgCodePrefix);
        if (factory == null) {
            return false;
        }
        String factoryId = factory.getId();
 
        // 3. 如果月份未变化直接返回成功
        if (oldMonthPlan.equals(newMonthPlan)) {
            return true;
        }
 
        try {
            // 4. 减少旧月份计划数量(原子操作)
            boolean oldDecreased = decreasePlanQuantity(factoryId, oldMonthPlan);
            if (!oldDecreased) {
                throw new RuntimeException("减少旧月份计划数量失败,可能记录不存在或数量为0");
            }
 
            // 5. 增加新月份计划数量
            increasePlanQuantity(factoryId, newMonthPlan);
 
            return true;
        } catch (Exception e) {
            // 事务回滚
            throw new RuntimeException("日期变更失败: " + e.getMessage(), e);
        }
    }
 
    /**
     * 减少计划数量,如果减少后数量为0则删除记录
     */
    private boolean decreasePlanQuantity(String factoryId, String monthPlan) {
        // 先减少数量
        LambdaUpdateWrapper<EamFactorySecondMaintPlan> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(EamFactorySecondMaintPlan::getFactoryId, factoryId)
                .eq(EamFactorySecondMaintPlan::getMonthPlan, monthPlan)
                .gt(EamFactorySecondMaintPlan::getQuantity, 0) // 确保数量大于0
                .setSql("quantity = quantity - 1");
 
        int updated = baseMapper.update(null, updateWrapper);
 
        if (updated > 0) {
            // 检查更新后的数量是否为0,如果是则删除记录
            EamFactorySecondMaintPlan updatedPlan = baseMapper.selectOne(
                    Wrappers.<EamFactorySecondMaintPlan>lambdaQuery()
                            .eq(EamFactorySecondMaintPlan::getFactoryId, factoryId)
                            .eq(EamFactorySecondMaintPlan::getMonthPlan, monthPlan)
            );
 
            if (updatedPlan != null && updatedPlan.getQuantity() == 0) {
                baseMapper.deleteById(updatedPlan.getId());
            }
            return true;
        }
 
        return false;
    }
 
    /**
     * 增加计划数量
     */
    private void increasePlanQuantity(String factoryId, String monthPlan) {
        // 直接更新
        LambdaUpdateWrapper<EamFactorySecondMaintPlan> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(EamFactorySecondMaintPlan::getFactoryId, factoryId)
                .eq(EamFactorySecondMaintPlan::getMonthPlan, monthPlan)
                .setSql("quantity = quantity + 1");
 
        if (baseMapper.update(null, updateWrapper) == 0) {
            // 更新失败说明记录不存在,创建新记录
            createNewPlan(factoryId, monthPlan);
        }
    }
}