package com.ruoyi.base.service.impl; import com.ruoyi.base.constant.Constant; import com.ruoyi.base.domain.BaseLocationInfo; import com.ruoyi.base.domain.BaseLocationZone; import com.ruoyi.base.domain.dto.BaseLocationInfoSameColDTO; import com.ruoyi.base.domain.vo.*; import com.ruoyi.base.mapper.BaseLocationInfoMapper; import com.ruoyi.base.mapper.BaseLocationZoneMapper; import com.ruoyi.base.service.IBaseLocationInfoService; import com.ruoyi.base.utils.CommonUtils; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * 库位信息Service业务层处理 * * @author andy * @date 2022-02-18 */ @Slf4j @Service public class BaseLocationInfoServiceImpl implements IBaseLocationInfoService { @Autowired private BaseLocationInfoMapper baseLocationInfoMapper; @Autowired private BaseLocationZoneMapper baseLocationZoneMapper; @Autowired private RedisCache redisCache; /** * 查询库位信息 * * @param id 库位信息主键 * @return 库位信息 */ @Override public BaseLocationInfo selectBaseLocationInfoById(Long id) { return baseLocationInfoMapper.selectBaseLocationInfoById(id); } @Override public BaseLocationInfo selectBaseLocationInfoByIdOrNo(String idOrNo, Long warehouseId) { BaseLocationInfo locationInfo = null; try { locationInfo = baseLocationInfoMapper.selectBaseLocationInfoById(Long.parseLong(idOrNo)); } catch (Exception e) { } if (locationInfo == null) { return baseLocationInfoMapper.selectBaseLocationInfoByLocationNo(idOrNo, warehouseId); } else { return locationInfo; } } /** * 查询库位信息列表 * * @param baseLocationInfo 库位信息 * @return 库位信息 */ @Override public List selectBaseLocationInfoList(BaseLocationInfo baseLocationInfo) { return baseLocationInfoMapper.selectBaseLocationInfoList(baseLocationInfo); } @Override public List selectBaseLocationInfoList(long locId) { BaseLocationInfo baseLocationInfo = new BaseLocationInfo(); baseLocationInfo.setId(locId); return baseLocationInfoMapper.selectBaseLocationInfoList(baseLocationInfo); } /** * 新增库位信息 * * @param baseLocationInfo 库位信息 * @return 结果 */ @Override public int insertBaseLocationInfo(BaseLocationInfo baseLocationInfo) { baseLocationInfo.setCreateTime(DateUtils.getNowDate()); return baseLocationInfoMapper.insertBaseLocationInfo(baseLocationInfo); } /** * 修改库位信息 * * @param baseLocationInfo 库位信息 * @return 结果 */ @Override public int updateBaseLocationInfo(BaseLocationInfo baseLocationInfo) { baseLocationInfo.setUpdateTime(DateUtils.getNowDate()); return baseLocationInfoMapper.updateBaseLocationInfo(baseLocationInfo); } /** * 批量删除库位信息 * * @param ids 需要删除的库位信息主键 * @return 结果 */ @Override public int deleteBaseLocationInfoByIds(Long[] ids) { return baseLocationInfoMapper.deleteBaseLocationInfoByIds(ids); } /** * 删除库位信息信息 * * @param id 库位信息主键 * @return 结果 */ @Override public int deleteBaseLocationInfoById(Long id) { return baseLocationInfoMapper.deleteBaseLocationInfoById(id); } @Override public List buildLocationTreeSelect() { List locationTrees = buildLocationTree(0L); return locationTrees.stream().map(TreeSelectVO::new).collect(Collectors.toList()); } @Override public List buildLocationTree(Long zoneId) { // 查询区域,库位树把区域也组装进去 BaseLocationZone queryZone = new BaseLocationZone(); queryZone.setStatus("0"); List zoneList = baseLocationZoneMapper.selectBaseLocationZoneList(queryZone); List locationTreeSelectVOList = new ArrayList<>(); //循环遍历每个区域的库位 for (BaseLocationZone zone : zoneList) { BasLocationTreeSelectVO parent = new BasLocationTreeSelectVO(); List children = new ArrayList<>(); BaseLocationInfo query = new BaseLocationInfo(); query.setZoneId(zone.getZoneId()); List locationInfoList = baseLocationInfoMapper.selectBaseLocationInfoList(query); for (BaseLocationInfo b : locationInfoList) { BasLocationTreeSelectVO child = new BasLocationTreeSelectVO(); child.setId(b.getId()); child.setTreeName(b.getLocationNo()); children.add(child); } parent.setId(zone.getZoneId()); parent.setTreeName(zone.getZoneName()); parent.setChildren(children); locationTreeSelectVOList.add(parent); } return locationTreeSelectVOList; } @Override public boolean checkIsLocation(String idOrNo, Long warehouseId) { BaseLocationInfo baseLocationInfo = this.selectBaseLocationInfoByIdOrNo(idOrNo, warehouseId); if (baseLocationInfo == null) { return false; } else { return true; } } @Override public List selectSortedLocatinListByZoneId(Long zoneId, Long warehouseId,String orderBy) { BaseLocationInfo query = new BaseLocationInfo(); query.setWarehouseId(warehouseId); query.setZoneId(zoneId); query.setOrderByClause(orderBy); return baseLocationInfoMapper.selectSortedLocationListByZoneId(query); } @Override public List selectSortedLocatinListByZoneId(List locationId, Long warehouseId, Map lotatt, String sku) { List result = new ArrayList<>(); List locationLotattVOList = baseLocationInfoMapper.selectSortedLocationLotattListByLocationIdList(locationId, warehouseId, lotatt, sku); BaseLocationLotattListVO current = null; for (BaseLocationLotattVO vo : locationLotattVOList) { if (current == null || current.getId().longValue() != vo.getId().longValue()) { current = new BaseLocationLotattListVO(); BeanUtils.copyProperties(vo, current); List lotattInfoList = new ArrayList<>(); current.setLotattInfoList(lotattInfoList); result.add(current); } LotattInfo lotattObj = new LotattInfo(); lotattObj.setSku(vo.getSku()); lotattObj.setQty(vo.getQty()); lotattObj.setLotattVO(vo.getLotattVO()); current.getLotattInfoList().add(lotattObj); } return result; } @Override public int updateLocationStockStatus(Long id, String status) { return baseLocationInfoMapper.updateLocationStockStatus(id, status); } @Override public List selectNeighborLocation(String colNo, Long zoneId) { List colNoList = baseLocationInfoMapper.selectAllColNo(); List resultList = new ArrayList<>(); String preColNo = ""; String nextColNo = ""; BaseLocationInfo currentLocation = null; for (int i = 0; i < colNoList.size(); i++) { if (!colNoList.get(i).getColNo().equals(colNo) && preColNo.equals("")) { preColNo = colNoList.get(i).getColNo(); continue; } if (colNoList.get(i).getColNo().equals(colNo)) { currentLocation = colNoList.get(i); preColNo = colNoList.get(i - 1).getColNo(); if (i + 1 < colNoList.size()) { nextColNo = colNoList.get(i + 1).getColNo(); } continue; } if (nextColNo.equals(colNoList.get(i).getColNo())) { continue; } else { if (i + 1 < colNoList.size()) { if (currentLocation != null) { if (CommonUtils.getString(colNoList.get(i + 1).getBindSku()).equals("") || CommonUtils.getString(colNoList.get(i + 1).getBindSku()).equals(currentLocation.getBindSku())) { nextColNo = colNoList.get(i + 1).getColNo(); } } } } } resultList.addAll(baseLocationInfoMapper.selectLocationByColNo(colNo)); resultList.addAll(baseLocationInfoMapper.selectLocationByColNo(preColNo)); resultList.addAll(baseLocationInfoMapper.selectLocationByColNo(nextColNo)); return resultList; } @Override public Boolean verifyLocationIsIdle(String locationId, Long warehouseId) { BaseLocationInfo baseLocationInfo = selectBaseLocationInfoByIdOrNo(locationId, warehouseId); if (!baseLocationInfo.getStockStatus().equals(Constant.STOCK_STATUS.STOCK00.getValue())) { return false; } return true; } @Override public Boolean verifyLocationIsInStock(String locationId, Long warehouseId) { BaseLocationInfo baseLocationInfo = selectBaseLocationInfoByIdOrNo(locationId, warehouseId); if (baseLocationInfo.getIsEmpty().equals(Constant.IS_YES.Y.toString())) { return false; } return true; } @Override public boolean lockLocationStockStatus(Long id, Long warehouseId, String updateBy) { return updateLocationStockStatusAndIsEmpty(id, warehouseId, updateBy , Constant.STOCK_STATUS.STOCK10, null); } @Override public boolean unLockLocationStockStatus(Long id, Long warehouseId, String updateBy) { return updateLocationStockStatusAndIsEmpty(id, warehouseId, updateBy , Constant.STOCK_STATUS.STOCK00, null); } @Override public boolean lockLocationStockStatus(Long locationFromId, Long locationToId, Long warehouseId, String updateBy) { if (!lockLocationStockStatus(locationFromId, warehouseId, updateBy)) { return false; } return lockLocationStockStatus(locationToId, warehouseId, updateBy); } @Override public boolean unLockLocationStockStatus(Long locationFromId, Long locationToId, Long warehouseId, String updateBy) { if (!unLockLocationStockStatus(locationFromId, warehouseId, updateBy)) { return false; } return unLockLocationStockStatus(locationToId, warehouseId, updateBy); } @Override public boolean occupyLocation(Long id, Long warehouseId, String updateBy) { return updateLocationStockStatusAndIsEmpty(id, warehouseId, updateBy , null, Constant.IS_YES.N); } @Override public boolean unOccupyLocation(Long id, Long warehouseId, String updateBy) { return updateLocationStockStatusAndIsEmpty(id, warehouseId, updateBy , null, Constant.IS_YES.Y); } @Override public boolean updateLocationIdleAndEmpty(Long id, Long warehouseId, String updateBy) { return updateLocationStockStatusAndIsEmpty(id, warehouseId, updateBy , Constant.STOCK_STATUS.STOCK00, Constant.IS_YES.Y); } @Override public boolean updateLocationIdleAndNoEmpty(Long id, Long warehouseId, String updateBy) { return updateLocationStockStatusAndIsEmpty(id, warehouseId, updateBy , Constant.STOCK_STATUS.STOCK00, Constant.IS_YES.N); } @Override public List selectBeforeLocationByColNo(String colNo, Long colIndex) { return baseLocationInfoMapper.selectBeforeLocationByColNo(colNo, colIndex); } @Override public List selectSameColCanToLoc(String colNo, Long colIndex) { return baseLocationInfoMapper.selectSameColCanToLoc(colNo, colIndex); } private boolean updateLocationStockStatusAndIsEmpty(Long id, Long warehouseId, String updateBy , Constant.STOCK_STATUS stockStatus, Constant.IS_YES isYes) { BaseLocationInfo locationInfo = selectBaseLocationInfoById(id); if (locationInfo == null) { return false; } BaseLocationInfo locationInfoFromUpdate = new BaseLocationInfo(); locationInfoFromUpdate.setId(locationInfo.getId()); if (stockStatus != null) { locationInfoFromUpdate.setStockStatus(stockStatus.getValue()); } if (isYes != null) { locationInfoFromUpdate.setIsEmpty(isYes.toString()); } locationInfoFromUpdate.setUpdateBy(updateBy); locationInfoFromUpdate.setWarehouseId(warehouseId); return this.updateBaseLocationInfo(locationInfoFromUpdate) > 0; } @Override public AjaxResult importLocation(List list, boolean updateSupport, String opname) { if (StringUtils.isNull(list) || list.size() == 0) { throw new ServiceException("导入库位基本信息数据不能为空!"); } int successNum = 0; int failureNum = 0; StringBuilder successMsg = new StringBuilder(); StringBuilder failureMsg = new StringBuilder(); for (BaseLocationInfo baseLocationInfo : list) { try { if (StringUtils.isEmpty(baseLocationInfo.getLocationNo())) { baseLocationInfo.setLocationNo(baseLocationInfo.getRowNo() + "-" + StringUtils.addZero(baseLocationInfo.getColNo(), 2) + "-" + StringUtils.addZero(baseLocationInfo.getShiftNo(), 2)); } BaseLocationInfo b = baseLocationInfoMapper.selectBaseLocationInfoByLocationNo(baseLocationInfo.getLocationNo(), Constant.WAREHOUSE_ID); if (b == null) { //BeanValidators.validateWithException(validator, stu); baseLocationInfo.setCreateBy(opname); baseLocationInfo.setCreateTime(new Date()); baseLocationInfo.setStockStatus("00"); baseLocationInfo.setWarehouseId(Constant.WAREHOUSE_ID); baseLocationInfo.setColNo(baseLocationInfo.getRowNo() + baseLocationInfo.getColNo()); this.insertBaseLocationInfo(baseLocationInfo); successNum++; successMsg.append("
" + successNum + "、库位 " + baseLocationInfo.getLocationNo() + " 导入成功"); } else if (updateSupport) { //BeanValidators.validateWithException(validator, stu); b.setUpdateBy(opname); b.setUpdateTime(new Date()); this.updateBaseLocationInfo(b); successNum++; successMsg.append("
" + successNum + "、库位 " + b.getLocationNo() + " 更新成功"); } else { failureNum++; failureMsg.append("
" + failureNum + "、库位 " + b.getLocationNo() + " 已存在"); } } catch (Exception e) { failureNum++; String msg = "
" + failureNum + "、库位 " + baseLocationInfo.getLocationNo() + " 导入失败:"; failureMsg.append(msg + e.getMessage()); log.error(msg, e); } } if (failureNum > 0) { failureMsg.insert(0, "导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); throw new ServiceException(failureMsg.toString()); } else { successMsg.insert(0, "数据已全部导入成功!共 " + successNum + " 条,数据如下:"); } return AjaxResult.success(successMsg); } }