mitao
2025-03-27 a382fedba62fa46b3d73c2e988fa6908412a99c9
medicalWaste-system/src/main/java/com/sinata/system/service/impl/MwTransitRouteServiceImpl.java
@@ -1,10 +1,33 @@
package com.sinata.system.service.impl;
import com.sinata.system.domain.MwTransitRoute;
import com.sinata.system.mapper.MwTransitRouteMapper;
import com.sinata.system.service.MwTransitRouteService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sinata.common.entity.PageDTO;
import com.sinata.common.exception.ServiceException;
import com.sinata.common.utils.BeanUtils;
import com.sinata.common.utils.CollUtils;
import com.sinata.common.utils.StringUtils;
import com.sinata.system.domain.MwTransitRoute;
import com.sinata.system.domain.MwTransitRouteCar;
import com.sinata.system.domain.MwTransitRoutePoints;
import com.sinata.system.domain.SysDepartment;
import com.sinata.system.domain.dto.MwTransitRouteDTO;
import com.sinata.system.domain.dto.MwTransitRoutePointsDTO;
import com.sinata.system.domain.query.MwTransitRouteQuery;
import com.sinata.system.domain.vo.MwTransitRouteVO;
import com.sinata.system.mapper.MwTransitRouteMapper;
import com.sinata.system.service.MwTransitCarService;
import com.sinata.system.service.MwTransitRouteCarService;
import com.sinata.system.service.MwTransitRoutePointsService;
import com.sinata.system.service.MwTransitRouteService;
import com.sinata.system.service.SysDepartmentService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
 * <p>
@@ -15,6 +38,144 @@
 * @since 2024-12-02
 */
@Service
@RequiredArgsConstructor
public class MwTransitRouteServiceImpl extends ServiceImpl<MwTransitRouteMapper, MwTransitRoute> implements MwTransitRouteService {
    private final SysDepartmentService sysDepartmentService;
    private final MwTransitCarService mwTransitCarService;
    private final MwTransitRoutePointsService mwTransitRoutePointsService;
    private final MwTransitRouteCarService mwTransitRouteCarService;
    /**
     * 分页列表
     *
     * @param query
     * @return
     */
    @Override
    public PageDTO<MwTransitRouteVO> pageList(MwTransitRouteQuery query) {
        String treeCode = sysDepartmentService.getTreeCodeByDepartmentId(query.getDepartmentId());
        if (StringUtils.isBlank(treeCode)) {
            return PageDTO.empty(0L, 0L);
        }
        Page<MwTransitRouteVO> page = baseMapper.pageList(new Page<>(query.getPageCurr(), query.getPageSize()), treeCode);
        return PageDTO.of(page);
    }
    /**
     * 详情
     *
     * @param id
     * @return
     */
    @Override
    public MwTransitRouteVO detail(Long id) {
        MwTransitRouteVO vo = baseMapper.detail(id);
        //关联医院
        vo.setHostpitalList(sysDepartmentService.getHospitalListByRouteId(vo.getId()));
        //关联车辆列表
        vo.setCarList(mwTransitCarService.getCarListByRouteId(vo.getId()));
        return vo;
    }
    /**
     * 新增
     *
     * @param dto
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void add(MwTransitRouteDTO dto) {
        //校验医院是否有关联线路
        validateHospitalUnique(dto);
        MwTransitRoute mwTransitRoute = BeanUtils.copyBean(dto, MwTransitRoute.class);
        mwTransitRoute.setHospitalQuantity(dto.getHostpitalList().size());
        save(mwTransitRoute);
        //关联医院
        List<MwTransitRoutePoints> mwTransitRoutePoints = BeanUtils.copyToList(dto.getHostpitalList(), MwTransitRoutePoints.class);
        mwTransitRoutePoints.forEach(points -> points.setRouteId(mwTransitRoute.getId()));
        mwTransitRoutePointsService.saveBatch(mwTransitRoutePoints);
        //关联车辆
        List<MwTransitRouteCar> mwTransitRouteCars = dto.getCarIdList().stream().map(carId -> {
            MwTransitRouteCar routeCar = new MwTransitRouteCar();
            routeCar.setRouteId(mwTransitRoute.getId());
            routeCar.setCarId(carId);
            return routeCar;
        }).collect(Collectors.toList());
        mwTransitRouteCarService.saveBatch(mwTransitRouteCars);
    }
    private void validateHospitalUnique(MwTransitRouteDTO dto) {
        //医院id列表
        List<Long> departmentIdList = dto.getHostpitalList().stream().map(MwTransitRoutePointsDTO::getDepartmentId).collect(Collectors.toList());
        List<MwTransitRoutePoints> list = mwTransitRoutePointsService.lambdaQuery()
                .in(MwTransitRoutePoints::getDepartmentId, departmentIdList)
                .ne(Objects.nonNull(dto.getId()), MwTransitRoutePoints::getRouteId, dto.getId())
                .list();
        if (CollUtils.isNotEmpty(list)) {
            SysDepartment department = sysDepartmentService.getById(list.get(0).getDepartmentId());
            throw new ServiceException(department.getDepartmentName() + "已关联转运线路!");
        }
    }
    /**
     * 编辑
     *
     * @param dto
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void edit(MwTransitRouteDTO dto) {
        if (Objects.isNull(dto.getId())) {
            throw new ServiceException("线路id不能为空");
        }
        validateHospitalUnique(dto);
        MwTransitRoute mwTransitRoute = BeanUtils.copyBean(dto, MwTransitRoute.class);
        mwTransitRoute.setHospitalQuantity(dto.getHostpitalList().size());
        updateById(mwTransitRoute);
        //移除关联医院
        mwTransitRoutePointsService.lambdaUpdate().eq(MwTransitRoutePoints::getRouteId, dto.getId()).remove();
        //关联医院
        List<MwTransitRoutePoints> mwTransitRoutePoints = BeanUtils.copyToList(dto.getHostpitalList(), MwTransitRoutePoints.class);
        mwTransitRoutePoints.forEach(points -> points.setRouteId(mwTransitRoute.getId()));
        mwTransitRoutePointsService.saveBatch(mwTransitRoutePoints);
        //移除关联车辆
        mwTransitRouteCarService.lambdaUpdate().eq(MwTransitRouteCar::getRouteId, dto.getId()).remove();
        //关联车辆
        List<MwTransitRouteCar> mwTransitRouteCars = dto.getCarIdList().stream().map(carId -> {
            MwTransitRouteCar routeCar = new MwTransitRouteCar();
            routeCar.setRouteId(mwTransitRoute.getId());
            routeCar.setCarId(carId);
            return routeCar;
        }).collect(Collectors.toList());
        mwTransitRouteCarService.saveBatch(mwTransitRouteCars);
    }
    /**
     * 删除
     *
     * @param id
     */
    @Override
    public void delete(Long id) {
        //移除关联医院
        mwTransitRoutePointsService.lambdaUpdate().eq(MwTransitRoutePoints::getRouteId, id).remove();
        //移除关联车辆
        mwTransitRouteCarService.lambdaUpdate().eq(MwTransitRouteCar::getRouteId, id).remove();
        removeById(id);
    }
    /**
     * 根据医院查询路线
     * @param departmentId
     * @return
     */
    @Override
    public MwTransitRoute queryRouteByDepartmentId(Long departmentId) {
        MwTransitRoutePoints routePoint = mwTransitRoutePointsService.lambdaQuery().eq(MwTransitRoutePoints::getDepartmentId, departmentId).last("LIMIT 1").one();
        if (Objects.nonNull(routePoint)) {
            return this.getById(routePoint.getRouteId());
        }
        return null;
    }
}