diff --git a/src/main/java/com/huaheng/api/wcs/service/warecellAllocation/LocationAllocationServiceImpl.java b/src/main/java/com/huaheng/api/wcs/service/warecellAllocation/LocationAllocationServiceImpl.java index 6d3c4fa..dc608b9 100644 --- a/src/main/java/com/huaheng/api/wcs/service/warecellAllocation/LocationAllocationServiceImpl.java +++ b/src/main/java/com/huaheng/api/wcs/service/warecellAllocation/LocationAllocationServiceImpl.java @@ -20,6 +20,7 @@ import com.huaheng.pc.config.zone.domain.Zone; import com.huaheng.pc.config.zone.service.ZoneService; import com.huaheng.pc.task.taskHeader.service.TaskHeaderService; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StopWatch; import javax.annotation.Resource; @@ -28,6 +29,7 @@ import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; +import static com.huaheng.common.constant.QuantityConstant.*; import static java.util.stream.Collectors.toList; @Service @@ -48,20 +50,14 @@ public class LocationAllocationServiceImpl implements LocationAllocationService @Resource private ConfigService configService; + @Transactional @Override public String allocation(int high, String area, String roadWay, String containerCode, Integer frequencyLocation, Integer emptyContainerTask, Integer isSelfCreated, boolean isFlammable) { - //容器 - Container container = containerService.getOne(new LambdaQueryWrapper<Container>().eq(Container::getCode, containerCode)); - //容器类型 - ContainerType containerType = containerTypeService.getOne(new LambdaQueryWrapper<ContainerType>().eq(ContainerType::getCode, container.getContainerType())); - if (containerType == null) { - throw new ServiceException("容器类型不存在"); - } //二期5号巷道 if (roadWay.equals("5")) { - return fiveStacker(high, containerType.getCode()); + return fiveStacker(high, containerCode); } else { return doubleRk(area, roadWay, high, frequencyLocation, emptyContainerTask, isSelfCreated, isFlammable); } @@ -70,13 +66,15 @@ public class LocationAllocationServiceImpl implements LocationAllocationService //一厂二期5号堆垛机,大小托盘 //分配库位排序,(层-外侧-内侧-列) - private String fiveStacker(int high, String containerTypeCode) { + private String fiveStacker(int high, String containerCode) { + Container container = containerService.getOne(new LambdaQueryWrapper<Container>().eq(Container::getCode, containerCode)); + String containerType = container.getContainerType(); //判断预留库位 int reserveNumber = getReserveNumber(); LambdaQueryWrapper<Location> wrapper = Wrappers.lambdaQuery(); wrapper .eq(Location::getRoadway, 5) - .eq(Location::getStatus, QuantityConstant.STATUS_LOCATION_EMPTY) + .eq(Location::getStatus, STATUS_LOCATION_EMPTY) .eq(Location::getHigh, high) .eq(Location::getContainerCode, "") .ne(Location::getIColumn, "26") @@ -91,17 +89,17 @@ public class LocationAllocationServiceImpl implements LocationAllocationService } //大托盘占两个库位 - if (containerTypeCode.equals("X") || containerTypeCode.equals("W")) { + if (containerType.equals(CONTAINER_TYPE_X) || containerType.equals(CONTAINER_TYPE_W)) { for (Location location : list) { - if (location.getIColumn() % 2 != 0 && location.getTemporaryType().charAt(0) != '1') { + if (location.getIColumn() % 2 != 0 && location.getTemporaryType().startsWith(SMALL_CONTAINER_TYPE)) { Location rightLocation = locationService.getRightEmptyLocation(location); if (rightLocation != null) { //禁用库位 - int updateCount = locationService.updateStatusNew(rightLocation.getCode(), "CS0001", QuantityConstant.STATUS_LOCATION_DISABLE, QuantityConstant.STATUS_LOCATION_EMPTY); + int updateCount = locationService.updateStatusNew(rightLocation.getCode(), DEFAULT_WAREHOUSE, STATUS_LOCATION_DISABLE, STATUS_LOCATION_EMPTY); if (updateCount != 1) { throw new ServiceException("禁用库位失败"); } - if (location.getTemporaryType().equals("0")) { + if (location.getTemporaryType().equals(UNDEFINED_CONTAINER_TYPE)) { //设置相邻临时库位类型 setTemporaryLocationType(location, true); } @@ -113,12 +111,12 @@ public class LocationAllocationServiceImpl implements LocationAllocationService } else { //小托盘不分配25列 list = list.stream().filter(location -> location.getIColumn() != 25 - && location.getTemporaryType().charAt(0) != '2').collect(toList()); + && !String.valueOf(location.getTemporaryType()).startsWith(BIG_CONTAINER_TYPE)).collect(Collectors.toList()); if (list.isEmpty()) { return null; } Location location = list.get(0); - if (location.getTemporaryType().equals("0")) { + if (location.getTemporaryType().equals(UNDEFINED_CONTAINER_TYPE)) { //设置相邻临时库位类型 setTemporaryLocationType(location, false); } @@ -129,7 +127,7 @@ public class LocationAllocationServiceImpl implements LocationAllocationService //设置相邻临时库位类型 void setTemporaryLocationType(Location location, boolean isBigContainer) { List<Location> setTemporaryTypeList = new ArrayList<>(); - String prefix = isBigContainer ? "2-" : "1-"; + String prefix = isBigContainer ? BIG_CONTAINER_TYPE : SMALL_CONTAINER_TYPE; setTemporaryTypeList.add(location); setTemporaryTypeList.add(getLocationByOffset(location, 0, 1)); @@ -138,8 +136,10 @@ public class LocationAllocationServiceImpl implements LocationAllocationService for (Location temporaryLocation : setTemporaryTypeList) { if (temporaryLocation != null) { - temporaryLocation.setTemporaryType(prefix + location.getCode() + "-" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd-HH:mm:ss"))); - locationService.updateById(temporaryLocation); + temporaryLocation.setTemporaryType(prefix + "-" + location.getCode() + "-" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd-HH:mm:ss"))); + if (locationService.updateById(temporaryLocation)) { + throw new ServiceException("设置临时库位类型失败"); + } } } } @@ -164,7 +164,7 @@ public class LocationAllocationServiceImpl implements LocationAllocationService LambdaQueryWrapper<Location> wrapper = Wrappers.lambdaQuery(); wrapper.eq(Location::getArea, area) .eq(Location::getRoadway, roadWay) - .eq(Location::getStatus, QuantityConstant.STATUS_LOCATION_EMPTY) + .eq(Location::getStatus, STATUS_LOCATION_EMPTY) .eq(Location::getHigh, high) .eq(Location::getContainerCode, "") .orderByAsc(Location::getILayer) @@ -196,9 +196,9 @@ public class LocationAllocationServiceImpl implements LocationAllocationService LambdaQueryWrapper<Location> locationLambda = Wrappers.lambdaQuery(); locationLambda.eq(Location::getArea, area) .eq(Location::getRoadway, roadWay) - .eq(Location::getStatus, QuantityConstant.STATUS_LOCATION_EMPTY) + .eq(Location::getStatus, STATUS_LOCATION_EMPTY) .eq(Location::getHigh, high) - .eq(Location::getRowFlag, QuantityConstant.ROW_OUT)//外侧 + .eq(Location::getRowFlag, ROW_OUT)//外侧 .eq(Location::getContainerCode, "") .last(" limit 20"); @@ -217,7 +217,7 @@ public class LocationAllocationServiceImpl implements LocationAllocationService } //频繁库位 - String str = ""; + String str; if (frequencyLocation == 1) { str = "frequencyLocation asc"; //locationLambda.orderByAsc(Location::getFrequencyLocation); //升序 @@ -258,9 +258,9 @@ public class LocationAllocationServiceImpl implements LocationAllocationService locationLambda = Wrappers.lambdaQuery(); locationLambda.eq(Location::getArea, area) .eq(StringUtils.isNotEmpty(roadWay), Location::getRoadway, roadWay) - .eq(Location::getStatus, QuantityConstant.STATUS_LOCATION_EMPTY) + .eq(Location::getStatus, STATUS_LOCATION_EMPTY) .eq(Location::getHigh, high) - .eq(Location::getRowFlag, QuantityConstant.ROW_IN) + .eq(Location::getRowFlag, ROW_IN) .eq(Location::getContainerCode, "") .last(" limit 20"); if (emptyContainerTask == 1) { @@ -318,7 +318,7 @@ public class LocationAllocationServiceImpl implements LocationAllocationService //获取双伸位预留库位数 private int getReserveNumber() { - String value = configService.getKey(QuantityConstant.DOUBLE_FORK_RESERVE_LOCATION); + String value = configService.getKey(DOUBLE_FORK_RESERVE_LOCATION); return StringUtils.isNotEmpty(value) ? Integer.parseInt(value) : 0; } diff --git a/src/main/java/com/huaheng/common/constant/QuantityConstant.java b/src/main/java/com/huaheng/common/constant/QuantityConstant.java index ec753dc..42f8f28 100644 --- a/src/main/java/com/huaheng/common/constant/QuantityConstant.java +++ b/src/main/java/com/huaheng/common/constant/QuantityConstant.java @@ -545,4 +545,19 @@ public class QuantityConstant { public static final String DEFAULT_DEPT = "01030101"; public static final String DEFAULT_STOCK = "035"; + + /** + * 动态分配库位 + */ + public static final String CONTAINER_TYPE_X = "X"; + public static final String CONTAINER_TYPE_W = "W"; + + /** + * 库位临时托盘类型 + */ + public static final String UNDEFINED_CONTAINER_TYPE = "0"; + public static final String SMALL_CONTAINER_TYPE = "1"; + public static final String BIG_CONTAINER_TYPE = "2"; + + } diff --git a/src/main/java/com/huaheng/pc/config/location/service/LocationServiceImpl.java b/src/main/java/com/huaheng/pc/config/location/service/LocationServiceImpl.java index 526036a..3f9bf17 100644 --- a/src/main/java/com/huaheng/pc/config/location/service/LocationServiceImpl.java +++ b/src/main/java/com/huaheng/pc/config/location/service/LocationServiceImpl.java @@ -33,6 +33,8 @@ import com.huaheng.pc.task.taskHeader.service.TaskHeaderService; import io.swagger.models.auth.In; import org.springframework.stereotype.Service; +import static com.huaheng.common.constant.QuantityConstant.*; + import javax.annotation.Resource; import java.text.MessageFormat; import java.util.*; @@ -783,36 +785,39 @@ public class LocationServiceImpl extends ServiceImpl<LocationMapper, Location> i @Override public void unbanRightLocationAndUnmark(String containerType, String locationCode) { //解禁用右侧库位 - Location location = locationService.getLocationByCode(locationCode, "CS0001"); - if (("X".equals(containerType) || "W".equals(containerType)) && "5".equals(location.getRoadway())) { + Location location = locationService.getLocationByCode(locationCode, DEFAULT_WAREHOUSE); + if ((CONTAINER_TYPE_X.equals(containerType) || CONTAINER_TYPE_W.equals(containerType)) && "5".equals(location.getRoadway())) { Location rightLocation = locationService.getRightDisableLocation(location); if (rightLocation != null) { - int updateCount = locationService.updateStatusNew(rightLocation.getCode(), "CS0001", QuantityConstant.STATUS_LOCATION_EMPTY, QuantityConstant.STATUS_LOCATION_DISABLE); + int updateCount = locationService.updateStatusNew(rightLocation.getCode(), DEFAULT_WAREHOUSE, STATUS_LOCATION_EMPTY, STATUS_LOCATION_DISABLE); if (updateCount != 1) { throw new ServiceException("重复分配库位时,解锁禁用失败!"); } } } - //清除库位的上下左右库位标记 - if (location.getTemporaryType().equals("0")) { + //清除就近4个库位的标记 + if (location.getTemporaryType().equals(UNDEFINED_CONTAINER_TYPE)) { throw new ServiceException("库位未被标记异常!"); } List<Location> list = locationService.list(new LambdaQueryWrapper<Location>().eq(Location::getTemporaryType, location.getTemporaryType())); - if (!list.isEmpty()) { - boolean flat = true; - for (Location l : list) { - if (StringUtils.isNotEmpty(l.getContainerCode()) || !l.getStatus().equals(QuantityConstant.STATUS_LOCATION_EMPTY)) { - flat = false; - break; - } - } - if (flat) { - locationService.update(new LambdaUpdateWrapper<Location>() - .set(Location::getTemporaryType, "0").in(Location::getCode, list.stream() - .map(Location::getCode).collect(Collectors.toList()))); + if (list.size() != 4) { + throw new ServiceException("库位标记异常,相同标记未达4个:" + list.size()); + } + + //4个库位都是空的,并且状态位空,才能清除标记 + boolean flat = true; + for (Location l : list) { + if (StringUtils.isNotEmpty(l.getContainerCode()) || !l.getStatus().equals(STATUS_LOCATION_EMPTY)) { + flat = false; + break; } } + if (flat) { + locationService.update(new LambdaUpdateWrapper<Location>() + .set(Location::getTemporaryType, UNDEFINED_CONTAINER_TYPE).in(Location::getCode, list.stream() + .map(Location::getCode).collect(Collectors.toList()))); + } }