package com.vincent.rsf.server.manager.service.impl; 
 | 
  
 | 
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 
 | 
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; 
 | 
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 
 | 
import com.vincent.rsf.framework.common.Cools; 
 | 
import com.vincent.rsf.framework.common.R; 
 | 
import com.vincent.rsf.framework.exception.CoolException; 
 | 
import com.vincent.rsf.server.manager.controller.params.LocMastInitParam; 
 | 
import com.vincent.rsf.server.manager.controller.params.LocModifyParams; 
 | 
import com.vincent.rsf.server.manager.entity.*; 
 | 
import com.vincent.rsf.server.manager.mapper.LocMapper; 
 | 
import com.vincent.rsf.server.manager.mapper.LocTypeRelaMapper; 
 | 
import com.vincent.rsf.server.manager.service.*; 
 | 
import com.vincent.rsf.server.manager.utils.Shelves; 
 | 
import org.apache.commons.lang3.StringUtils; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.stereotype.Service; 
 | 
import org.springframework.transaction.annotation.Transactional; 
 | 
  
 | 
import java.util.ArrayList; 
 | 
import java.util.List; 
 | 
import java.util.Objects; 
 | 
  
 | 
@Service("locPreviewService") 
 | 
public class LocPreviewServiceImpl extends ServiceImpl<LocMapper, Loc> implements LocPreviewService { 
 | 
  
 | 
    @Autowired 
 | 
    private WarehouseAreasService warehouseAreasService; 
 | 
  
 | 
    @Autowired 
 | 
    private LocTypeRelaService locTypeRelaService; 
 | 
  
 | 
    @Autowired 
 | 
    private LocAreaRelaService locAreaRelaService; 
 | 
  
 | 
    @Autowired 
 | 
    private LocAreaService locAreaService; 
 | 
  
 | 
    @Autowired 
 | 
    private LocTypeRelaMapper locTypeRelaMapper; 
 | 
  
 | 
    @Override 
 | 
    public R modifyLocs(LocModifyParams locs) { 
 | 
        if (locs.getId().isEmpty()) { 
 | 
            throw new CoolException("库位ID不能为空!!"); 
 | 
        } 
 | 
        Loc loc = locs.getLoc(); 
 | 
  
 | 
        if (Objects.isNull(loc)) { 
 | 
            throw new CoolException("修改库位信息不能为空!!"); 
 | 
        } 
 | 
  
 | 
        String join = loc.getType(); 
 | 
        if (!Objects.isNull(loc.getTypeIds()) && !loc.getTypeIds().isEmpty()) { 
 | 
             join = StringUtils.join(loc.getTypeIds(), ","); 
 | 
        } 
 | 
        boolean update = this.update(new LambdaUpdateWrapper<Loc>() 
 | 
                .in(Loc::getId, locs.getId()) 
 | 
                .eq(Loc::getStatus, 1) 
 | 
                .set(!Objects.isNull(loc.getAreaId()), Loc::getAreaId, loc.getAreaId()) 
 | 
                .set(!Objects.isNull(loc.getWarehouseId()), Loc::getWarehouseId, loc.getWarehouseId()) 
 | 
                .set(!Objects.isNull(loc.getUseStatus()), Loc::getUseStatus, loc.getUseStatus()) 
 | 
                .set(!Objects.isNull(loc.getTypeIds()) && !loc.getTypeIds().isEmpty(), Loc::getType, join) 
 | 
                .set(!Objects.isNull(loc.getLength()), Loc::getLength, loc.getLength()) 
 | 
                .set(!Objects.isNull(loc.getWidth()), Loc::getWidth, loc.getWidth()) 
 | 
                .set(!Objects.isNull(loc.getHeight()), Loc::getHeight, loc.getHeight()) 
 | 
                .set(!Objects.isNull(loc.getChannel()), Loc::getChannel, loc.getChannel()) 
 | 
                .set(!Objects.isNull(loc.getFlagLabelMange()), Loc::getFlagLabelMange, loc.getFlagLabelMange()) 
 | 
                .set(!Objects.isNull(loc.getStatus()), Loc::getStatus, loc.getStatus())); 
 | 
        if (!update) { 
 | 
            throw new CoolException("库位信息修改失败!!"); 
 | 
        } 
 | 
  
 | 
        return R.ok(loc); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    @Transactional(rollbackFor = Exception.class) 
 | 
    public R initLocs(LocMastInitParam param, Long loginUserId) { 
 | 
        //清空表 
 | 
//        this.baseMapper.deleteAll(); 
 | 
        //清空当前库区库位 
 | 
        List<Loc> locs = this.list(new LambdaQueryWrapper<Loc>().eq(Loc::getWarehouseId, param.getWarehouseId()).eq(Loc::getAreaId, param.getAreaId())); 
 | 
        if (!locs.isEmpty()) { 
 | 
            if (!this.remove(new LambdaQueryWrapper<Loc>().eq(Loc::getWarehouseId, param.getWarehouseId()).eq(Loc::getAreaId, param.getAreaId()))) { 
 | 
                throw new CoolException("初始化失败:数据删除失败!!"); 
 | 
            } 
 | 
        } 
 | 
        WarehouseAreas warehouseAreas = warehouseAreasService.getOne(new LambdaQueryWrapper<WarehouseAreas>() 
 | 
                .eq(WarehouseAreas::getWarehouseId, param.getWarehouseId()) 
 | 
                .eq(WarehouseAreas::getId, param.getAreaId())); 
 | 
        if (Objects.isNull(warehouseAreas)) { 
 | 
            throw new CoolException("库区不存在!!"); 
 | 
        } 
 | 
        String join = StringUtils.join(param.getTypeIds(), ","); 
 | 
  
 | 
        String[] split = warehouseAreas.getCode().split("\\."); 
 | 
        if (split.length == 0){ 
 | 
            throw new CoolException("库区编码错误!!"); 
 | 
        } 
 | 
        StringBuilder locStar = new StringBuilder(); 
 | 
        for (int i = 0; i < split.length; i++) { 
 | 
            locStar.append(split[i]).append("-"); 
 | 
        } 
 | 
  
 | 
        List<Loc> list = new ArrayList<>(); 
 | 
        Integer chanl = 0; //默认第一巷道 
 | 
        for (int r = param.getStartRow(); r <= param.getEndRow(); r++) { 
 | 
            try{ 
 | 
                Shelves shelves = new Shelves(param.getEndRow() - param.getStartRow() + 1, param.getChannel(),param.getStartRow()); 
 | 
                for (List<Integer> node : shelves.nodes){ 
 | 
                    if (node.contains(r)) { 
 | 
                        if (!Cools.isEmpty(param.getStartChannel()) && param.getStartChannel() > 0){ 
 | 
                            chanl = shelves.nodes.indexOf(node) + param.getStartChannel(); 
 | 
                        }else { 
 | 
                            chanl = shelves.nodes.indexOf(node) + 1; 
 | 
                        } 
 | 
                        break; 
 | 
                    } 
 | 
                } 
 | 
            }catch (Exception e){ 
 | 
                throw new CoolException("解析巷道号失败"); 
 | 
            } 
 | 
            for (int b = param.getStartBay(); b <= param.getEndBay(); b++) { 
 | 
                for (int l = param.getStartLev(); l <= param.getEndLev(); l++) { 
 | 
                    // 获取库位号 
 | 
                    String locNo = locStar +  String.format("%d", r) + String.format("-%d", b) + String.format("-%d", l); 
 | 
                    Loc loc = new Loc(); 
 | 
                    loc.setCode(locNo) 
 | 
                            .setUseStatus("O") 
 | 
                            .setRow(r) 
 | 
                            .setCol(b) 
 | 
                            .setLev(l) 
 | 
                            .setChannel(chanl) 
 | 
                            .setType(join) 
 | 
                            .setAreaId(param.getAreaId()) 
 | 
                            .setUpdateBy(loginUserId) 
 | 
                            .setCreateBy(loginUserId) 
 | 
                            .setWarehouseId(warehouseAreas.getWarehouseId()); 
 | 
                    list.add(loc); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
  
 | 
        if (!this.saveBatch(list)) { 
 | 
            throw new CoolException("库位初始化失败!!"); 
 | 
        } 
 | 
        List<LocTypeRela> locTypeRelas = new ArrayList<>(); 
 | 
        for (Long typeId : param.getTypeIds()) { 
 | 
            for (Loc loc : list) { 
 | 
                LocTypeRela typeRela = new LocTypeRela(); 
 | 
                typeRela.setLocId(loc.getId()).setTypeId(typeId); 
 | 
                locTypeRelas.add(typeRela); 
 | 
            } 
 | 
        } 
 | 
        if (!locTypeRelaService.saveBatch(locTypeRelas)) { 
 | 
            throw new CoolException("库位类型关联失败!!"); 
 | 
        } 
 | 
        return R.ok("初始化成功!!"); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public boolean saveType(Loc loc) { 
 | 
        List<LocTypeRela> relas =  new ArrayList<>(); 
 | 
        loc.getTypeIds().forEach(id -> { 
 | 
            LocTypeRela typeRela = new LocTypeRela(); 
 | 
            typeRela.setTypeId(id) 
 | 
                    .setLocId(loc.getId()); 
 | 
            relas.add(typeRela); 
 | 
        }); 
 | 
        if (!locTypeRelaService.saveOrUpdateBatch(relas)) { 
 | 
            throw new CoolException("库位关联关系保存失败!!"); 
 | 
        } 
 | 
        return true; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public boolean updateLoc(Loc loc) { 
 | 
        locTypeRelaMapper.delete(new LambdaQueryWrapper<LocTypeRela>().eq(LocTypeRela::getLocId, loc.getId())); 
 | 
        List<LocTypeRela> relas =  new ArrayList<>(); 
 | 
        loc.getTypeIds().forEach(id -> { 
 | 
            LocTypeRela typeRela = new LocTypeRela(); 
 | 
            typeRela.setTypeId(id) 
 | 
                    .setLocId(loc.getId()); 
 | 
            relas.add(typeRela); 
 | 
        }); 
 | 
        if (!locTypeRelaService.saveOrUpdateBatch(relas)) { 
 | 
            throw new CoolException("库位关联关系保存失败!!"); 
 | 
        } 
 | 
        return true; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public R batchBindLocs(LocModifyParams locs) { 
 | 
        if (locs.getId().isEmpty()) { 
 | 
            throw new CoolException("库位ID不能为空!!"); 
 | 
        } 
 | 
        if (Objects.isNull(locs.getLocAreaId())) { 
 | 
            throw new CoolException("修改库位信息不能为空!!"); 
 | 
        } 
 | 
        List<LocArea> locAreas = locAreaService.list(new LambdaQueryWrapper<LocArea>().eq(LocArea::getId, locs.getLocAreaId())); 
 | 
        if (locAreas.isEmpty()) { 
 | 
            throw new CoolException("库位分区不存在!!"); 
 | 
        } 
 | 
        List<LocAreaRela> relas = new ArrayList<>(); 
 | 
        locs.getId().forEach(id -> { 
 | 
            LocAreaRela locAreaRela = new LocAreaRela(); 
 | 
            locAreaRela.setLocId(id) 
 | 
                    .setLocAreaId(locs.getLocAreaId()); 
 | 
            relas.add(locAreaRela); 
 | 
        }); 
 | 
        if (!locAreaRelaService.saveBatch(relas)) { 
 | 
            throw new CoolException("库位分区失败!!"); 
 | 
        } 
 | 
  
 | 
        return R.ok(); 
 | 
    } 
 | 
} 
 |