package com.ruoyi.technology.service.impl; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.technology.bean.dto.TechnologyRoutingOperationDto; import com.ruoyi.technology.bean.vo.TechnologyRoutingOperationVo; import com.ruoyi.technology.mapper.TechnologyRoutingMapper; import com.ruoyi.technology.mapper.TechnologyRoutingOperationMapper; import com.ruoyi.technology.pojo.TechnologyRoutingOperation; import com.ruoyi.technology.service.TechnologyRoutingOperationService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service @Transactional(rollbackFor = Exception.class) @RequiredArgsConstructor public class TechnologyRoutingOperationServiceImpl extends ServiceImpl implements TechnologyRoutingOperationService { private final TechnologyRoutingOperationMapper technologyRoutingOperationMapper; private final TechnologyRoutingMapper technologyRoutingMapper; @Override public IPage pageTechnologyRoutingOperation(Page page, TechnologyRoutingOperationDto technologyRoutingOperationDto) { Page entityPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal()); return this.page(entityPage, buildQueryWrapper(technologyRoutingOperationDto)) .convert(item -> BeanUtil.copyProperties(item, TechnologyRoutingOperationVo.class)); } @Override public List listTechnologyRoutingOperation(TechnologyRoutingOperationDto technologyRoutingOperationDto) { return BeanUtil.copyToList(this.list(buildQueryWrapper(technologyRoutingOperationDto)), TechnologyRoutingOperationVo.class); } @Override public TechnologyRoutingOperationVo getTechnologyRoutingOperationInfo(Long id) { TechnologyRoutingOperation technologyRoutingOperation = this.getById(id); if (technologyRoutingOperation == null) { return null; } return BeanUtil.copyProperties(technologyRoutingOperation, TechnologyRoutingOperationVo.class); } @Override public boolean saveTechnologyRoutingOperation(TechnologyRoutingOperation technologyRoutingOperation) { if (technologyRoutingOperation.getTechnologyRoutingId() == null || technologyRoutingMapper.selectById(technologyRoutingOperation.getTechnologyRoutingId()) == null) { throw new RuntimeException("工艺路线不存在,无法保存工序"); } if (technologyRoutingOperation.getDragSort() == null || technologyRoutingOperation.getDragSort() <= 0) { technologyRoutingOperation.setDragSort(nextDragSort(technologyRoutingOperation.getTechnologyRoutingId())); } return this.save(technologyRoutingOperation); } @Override public boolean removeTechnologyRoutingOperation(Long id) { TechnologyRoutingOperation technologyRoutingOperation = this.getById(id); if (technologyRoutingOperation == null) { return false; } boolean removed = this.removeById(id); if (removed) { resetDragSort(technologyRoutingOperation.getTechnologyRoutingId()); } return removed; } private LambdaQueryWrapper buildQueryWrapper(TechnologyRoutingOperationDto technologyRoutingOperation) { LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(technologyRoutingOperation.getId() != null, TechnologyRoutingOperation::getId, technologyRoutingOperation.getId()) .eq(technologyRoutingOperation.getTechnologyRoutingId() != null, TechnologyRoutingOperation::getTechnologyRoutingId, technologyRoutingOperation.getTechnologyRoutingId()) .eq(technologyRoutingOperation.getProductModelId() != null, TechnologyRoutingOperation::getProductModelId, technologyRoutingOperation.getProductModelId()) .eq(technologyRoutingOperation.getTechnologyOperationId() != null, TechnologyRoutingOperation::getTechnologyOperationId, technologyRoutingOperation.getTechnologyOperationId()) .eq(technologyRoutingOperation.getIsQuality() != null, TechnologyRoutingOperation::getIsQuality, technologyRoutingOperation.getIsQuality()) .orderByAsc(TechnologyRoutingOperation::getDragSort) .orderByAsc(TechnologyRoutingOperation::getId); return queryWrapper; } private Integer nextDragSort(Long technologyRoutingId) { TechnologyRoutingOperation lastOperation = technologyRoutingOperationMapper.selectOne( Wrappers.lambdaQuery() .eq(TechnologyRoutingOperation::getTechnologyRoutingId, technologyRoutingId) .orderByDesc(TechnologyRoutingOperation::getDragSort) .last("limit 1") ); if (lastOperation == null || lastOperation.getDragSort() == null) { return 1; } return lastOperation.getDragSort() + 1; } private void resetDragSort(Long technologyRoutingId) { List operationList = technologyRoutingOperationMapper.selectList( Wrappers.lambdaQuery() .eq(TechnologyRoutingOperation::getTechnologyRoutingId, technologyRoutingId) .orderByAsc(TechnologyRoutingOperation::getDragSort) .orderByAsc(TechnologyRoutingOperation::getId) ); for (int i = 0; i < operationList.size(); i++) { TechnologyRoutingOperation item = operationList.get(i); int dragSort = i + 1; if (item.getDragSort() == null || item.getDragSort() != dragSort) { item.setDragSort(dragSort); technologyRoutingOperationMapper.updateById(item); } } } }