lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamFactorySecondMaintPlanServiceImpl.java
@@ -1,19 +1,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
 * @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);
        }
    }
}