修复bug:
1. 修复移库bug, 空盘只有1深度, 不存在移库问题; 空托出库按照深度, 层数, 列数, 排数依次升序排序, 从而避免移库操作; 成品移库寻找库位时修改接口调用参数为成品枚举
This commit is contained in:
parent
2ea7816428
commit
50dff8130e
|
|
@ -15,4 +15,13 @@ public enum WmsLocationTypeEnums {
|
||||||
TYPE_PRODUCT(3, "成品");
|
TYPE_PRODUCT(3, "成品");
|
||||||
private final Integer code;
|
private final Integer code;
|
||||||
private final String desc;
|
private final String desc;
|
||||||
|
|
||||||
|
public static WmsLocationTypeEnums getEnum(Integer code) {
|
||||||
|
for (WmsLocationTypeEnums e : WmsLocationTypeEnums.values()) {
|
||||||
|
if (e.getCode().equals(code)) {
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -57,7 +57,7 @@ public class YcwmsController {
|
||||||
public YcwmsResponse<Object> getOutLocation(@RequestBody OrderOutReq request) {
|
public YcwmsResponse<Object> getOutLocation(@RequestBody OrderOutReq request) {
|
||||||
String outLoc = ycwmsControllerService.getLocByGoodsId(request.getGoodsId());
|
String outLoc = ycwmsControllerService.getLocByGoodsId(request.getGoodsId());
|
||||||
if (StringUtils.isEmpty(outLoc)) {
|
if (StringUtils.isEmpty(outLoc)) {
|
||||||
return YcwmsResponse.error("查询为空", null);
|
return YcwmsResponse.error("查询库存为空", null);
|
||||||
} else {
|
} else {
|
||||||
return YcwmsResponse.success(outLoc);
|
return YcwmsResponse.success(outLoc);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,53 @@
|
||||||
|
package com.wms_main.repository.utils;
|
||||||
|
import com.wms_main.model.po.TAppStock;
|
||||||
|
import java.util.Comparator;
|
||||||
|
|
||||||
|
public class LocationIdComparator implements Comparator<TAppStock> {
|
||||||
|
@Override
|
||||||
|
public int compare(TAppStock s1, TAppStock s2) {
|
||||||
|
int[] parts1 = parseLocationId(s1.getLocationId());
|
||||||
|
int[] parts2 = parseLocationId(s2.getLocationId());
|
||||||
|
|
||||||
|
// 1. 深度排序 (最后一部分)
|
||||||
|
int cmp = Integer.compare(parts1[3], parts2[3]);
|
||||||
|
if (cmp != 0) return cmp;
|
||||||
|
|
||||||
|
// 2. 层数排序 (第三部分)
|
||||||
|
cmp = Integer.compare(parts1[2], parts2[2]);
|
||||||
|
if (cmp != 0) return cmp;
|
||||||
|
|
||||||
|
// 3. 列排序 (第二部分)
|
||||||
|
cmp = Integer.compare(parts1[1], parts2[1]);
|
||||||
|
if (cmp != 0) return cmp;
|
||||||
|
|
||||||
|
// 4. 排排序 (第一部分)
|
||||||
|
return Integer.compare(parts1[0], parts2[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int[] parseLocationId(String locationId) {
|
||||||
|
// 处理可能的空值
|
||||||
|
if (locationId == null || locationId.isEmpty()) return new int[4];
|
||||||
|
|
||||||
|
String[] parts = locationId.split("-");
|
||||||
|
int[] result = new int[4];
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 处理第一部分(如"A03" -> 提取数字3)
|
||||||
|
if (parts.length > 0) {
|
||||||
|
String p1 = parts[0].replaceAll("\\D", "");
|
||||||
|
result[0] = p1.isEmpty() ? 0 : Integer.parseInt(p1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理第二、三、四部分
|
||||||
|
for (int i = 1; i <= 3; i++) {
|
||||||
|
if (parts.length > i) {
|
||||||
|
result[i] = Integer.parseInt(parts[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
// 处理格式异常
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -153,21 +153,26 @@ public class YcwmsControllerServiceImpl implements IYcwmsControllerService {
|
||||||
if(!orderOutCheckList.isEmpty()) {
|
if(!orderOutCheckList.isEmpty()) {
|
||||||
return YcwmsResponse.error("出库单已存在,请勿重复推送", null);
|
return YcwmsResponse.error("出库单已存在,请勿重复推送", null);
|
||||||
}
|
}
|
||||||
TAppOrderOut orderOut = new TAppOrderOut();
|
String outPoint = getLocByGoodsId(request.getGoodsId());
|
||||||
orderOut.setRecordId(UUIDUtils.getNewUUID());
|
if (StringUtils.isEmpty(outPoint)) {
|
||||||
orderOut.setOrderId(request.getOrderId());
|
return YcwmsResponse.error("库存不足", null);
|
||||||
orderOut.setGoodsId(request.getGoodsId());
|
} else {
|
||||||
orderOut.setBatch(request.getBatch());
|
TAppOrderOut orderOut = new TAppOrderOut();
|
||||||
orderOut.setSpecification(request.getSpecification());
|
orderOut.setRecordId(UUIDUtils.getNewUUID());
|
||||||
orderOut.setQuantity(request.getQuantity());
|
orderOut.setOrderId(request.getOrderId());
|
||||||
orderOut.setOrderStatus(OrderStatusEnum.CREATE.getCode());
|
orderOut.setGoodsId(request.getGoodsId());
|
||||||
orderOut.setCreateTime(LocalDateTime.now());
|
orderOut.setBatch(request.getBatch());
|
||||||
orderOut.setUpdateTime(LocalDateTime.now());
|
orderOut.setSpecification(request.getSpecification());
|
||||||
orderOut.setRemark(request.getClientId());
|
orderOut.setQuantity(request.getQuantity());
|
||||||
if(!appOrderOutService.save(orderOut)) {
|
orderOut.setOrderStatus(OrderStatusEnum.CREATE.getCode());
|
||||||
return YcwmsResponse.error("出库单保存失败,请稍后再试", null);
|
orderOut.setCreateTime(LocalDateTime.now());
|
||||||
|
orderOut.setUpdateTime(LocalDateTime.now());
|
||||||
|
orderOut.setRemark(request.getClientId());
|
||||||
|
if(!appOrderOutService.save(orderOut)) {
|
||||||
|
return YcwmsResponse.error("出库单保存失败,请稍后再试", null);
|
||||||
|
}
|
||||||
|
return YcwmsResponse.success(outPoint);
|
||||||
}
|
}
|
||||||
return YcwmsResponse.success(getLocByGoodsId(request.getGoodsId()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -335,20 +340,21 @@ public class YcwmsControllerServiceImpl implements IYcwmsControllerService {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getLocByGoodsId(String goodsId) {
|
public String getLocByGoodsId(String goodsId) {
|
||||||
|
List<TAppStock> stocks = null;
|
||||||
if (goodsId.length() < 3) {
|
if (goodsId.length() < 3) {
|
||||||
return switch (goodsId) {
|
stocks = appStockService.list(
|
||||||
case "0" -> "LK-3";
|
new LambdaQueryWrapper<TAppStock>()
|
||||||
case "1" -> "LK-4";
|
.eq(TAppStock::getGoodsId, goodsId)
|
||||||
case "2" -> "LK-5";
|
);
|
||||||
case "3" -> "LK-6";
|
|
||||||
case "4" -> "LK-7";
|
|
||||||
default -> "";
|
|
||||||
};
|
|
||||||
} else {
|
} else {
|
||||||
List<TAppStock> stocks = appStockService.list(
|
stocks = appStockService.list(
|
||||||
new LambdaQueryWrapper<TAppStock>()
|
new LambdaQueryWrapper<TAppStock>()
|
||||||
.eq(TAppStock::getVehicleId, goodsId)
|
.eq(TAppStock::getVehicleId, goodsId)
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
if (stocks == null || stocks.isEmpty()) {
|
||||||
|
return "";
|
||||||
|
} else {
|
||||||
return ConvertUtils.convertDestinationToPoint(stocks.getFirst().getBarCode());
|
return ConvertUtils.convertDestinationToPoint(stocks.getFirst().getBarCode());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,10 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
import com.wms_main.constant.enums.wcs.WcsApiResponseCodeEnums;
|
import com.wms_main.constant.enums.wcs.WcsApiResponseCodeEnums;
|
||||||
import com.wms_main.constant.enums.wcs.WcsStackerTaskStatusEnums;
|
import com.wms_main.constant.enums.wcs.WcsStackerTaskStatusEnums;
|
||||||
import com.wms_main.constant.enums.wcs.WcsStackerTaskTypeEnums;
|
import com.wms_main.constant.enums.wcs.WcsStackerTaskTypeEnums;
|
||||||
import com.wms_main.constant.enums.wms.OrderStatusEnum;
|
import com.wms_main.constant.enums.wms.*;
|
||||||
import com.wms_main.constant.enums.wms.WmsStackerTaskStatusEnums;
|
|
||||||
import com.wms_main.constant.enums.wms.WmsStockStatusEnums;
|
|
||||||
import com.wms_main.constant.enums.wms.WmsVehicleStatusEnums;
|
|
||||||
import com.wms_main.dao.*;
|
import com.wms_main.dao.*;
|
||||||
import com.wms_main.model.bo.wcs.WcsStackerTask;
|
import com.wms_main.model.bo.wcs.WcsStackerTask;
|
||||||
import com.wms_main.model.dto.request.wcs.WcsStackerTaskRequest;
|
import com.wms_main.model.dto.request.wcs.WcsStackerTaskRequest;
|
||||||
|
|
@ -54,6 +51,8 @@ public class WcsStackerTaskSender implements Job {
|
||||||
|
|
||||||
private final ITAppVehicleService appVehicleService;
|
private final ITAppVehicleService appVehicleService;
|
||||||
|
|
||||||
|
private final ITAppLocationService appLocationService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 运行定时任务
|
* 运行定时任务
|
||||||
* 向Wcs发送堆垛机任务
|
* 向Wcs发送堆垛机任务
|
||||||
|
|
@ -68,6 +67,12 @@ public class WcsStackerTaskSender implements Job {
|
||||||
.eq(TAppWcsTask::getWcsTaskType, WcsStackerTaskTypeEnums.OUT.getCode()));
|
.eq(TAppWcsTask::getWcsTaskType, WcsStackerTaskTypeEnums.OUT.getCode()));
|
||||||
for (TAppWcsTask wcsTask : appWcsTasks) {
|
for (TAppWcsTask wcsTask : appWcsTasks) {
|
||||||
String locationId = wcsTask.getOrigin();
|
String locationId = wcsTask.getOrigin();
|
||||||
|
TAppLocation loc = appLocationService.list(
|
||||||
|
new LambdaQueryWrapper<TAppLocation>()
|
||||||
|
.eq(TAppLocation::getLocationId, locationId)
|
||||||
|
).getFirst();
|
||||||
|
Integer locType = loc.getLocationType();
|
||||||
|
WmsLocationTypeEnums locEnum = WmsLocationTypeEnums.getEnum(locType);
|
||||||
String[] str_lst = locationId.split("-");
|
String[] str_lst = locationId.split("-");
|
||||||
Integer equipmentId = appWcsTaskService.getEquipmentByLocation(locationId);
|
Integer equipmentId = appWcsTaskService.getEquipmentByLocation(locationId);
|
||||||
Integer depth = appWcsTaskService.getDepthByLocation(locationId);
|
Integer depth = appWcsTaskService.getDepthByLocation(locationId);
|
||||||
|
|
@ -120,7 +125,7 @@ public class WcsStackerTaskSender implements Job {
|
||||||
.eq(TAppStock::getStockStatus, WmsStockStatusEnums.OK.getCode()));
|
.eq(TAppStock::getStockStatus, WmsStockStatusEnums.OK.getCode()));
|
||||||
// 若有库存
|
// 若有库存
|
||||||
if (preStocks != null && !preStocks.isEmpty()) {
|
if (preStocks != null && !preStocks.isEmpty()) {
|
||||||
TAppLocation preLocation = stackerTaskService.getEmptyLocation(equipmentId, null);
|
TAppLocation preLocation = stackerTaskService.getEmptyLocation(equipmentId, locEnum);
|
||||||
|
|
||||||
WcsStackerTaskRequest request = new WcsStackerTaskRequest();
|
WcsStackerTaskRequest request = new WcsStackerTaskRequest();
|
||||||
request.setTaskId(UUIDUtils.getNewUUID());
|
request.setTaskId(UUIDUtils.getNewUUID());
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@ import com.wms_main.dao.ITAppWcsTaskService;
|
||||||
import com.wms_main.model.po.TAppOrderOut;
|
import com.wms_main.model.po.TAppOrderOut;
|
||||||
import com.wms_main.model.po.TAppStock;
|
import com.wms_main.model.po.TAppStock;
|
||||||
import com.wms_main.model.po.TAppWcsTask;
|
import com.wms_main.model.po.TAppWcsTask;
|
||||||
|
import com.wms_main.repository.utils.LocationIdComparator;
|
||||||
import com.wms_main.repository.utils.StringUtils;
|
import com.wms_main.repository.utils.StringUtils;
|
||||||
import com.wms_main.repository.utils.UUIDUtils;
|
import com.wms_main.repository.utils.UUIDUtils;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
@ -84,6 +85,7 @@ public class YcOutExecutor implements Job {
|
||||||
stock.setGoodsId(orderOut.getGoodsId());
|
stock.setGoodsId(orderOut.getGoodsId());
|
||||||
stock.setSled(orderOut.getSpecification());
|
stock.setSled(orderOut.getSpecification());
|
||||||
List<TAppStock> stockList = stockService.getWithEntity(stock);
|
List<TAppStock> stockList = stockService.getWithEntity(stock);
|
||||||
|
stockList.sort(new LocationIdComparator());
|
||||||
// 提取所有相关库存的载具号
|
// 提取所有相关库存的载具号
|
||||||
List<String> vehicleIds = stockList.stream().map(TAppStock::getVehicleId).distinct().toList();
|
List<String> vehicleIds = stockList.stream().map(TAppStock::getVehicleId).distinct().toList();
|
||||||
List<TAppStock> outStockList = new ArrayList<TAppStock>();
|
List<TAppStock> outStockList = new ArrayList<TAppStock>();
|
||||||
|
|
|
||||||
|
|
@ -199,7 +199,7 @@
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!-- 修改后 -->
|
<!-- 修改后 -->
|
||||||
<el-table-column label="操作" width="180" fixed="right">
|
<el-table-column label="操作" width="240" fixed="right">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<div class="action-buttons">
|
<div class="action-buttons">
|
||||||
<el-button
|
<el-button
|
||||||
|
|
@ -214,6 +214,12 @@
|
||||||
@click="openEditDialog(scope.row)"
|
@click="openEditDialog(scope.row)"
|
||||||
class="btn-edit"
|
class="btn-edit"
|
||||||
>编辑</el-button>
|
>编辑</el-button>
|
||||||
|
<el-button
|
||||||
|
type="danger"
|
||||||
|
size="small"
|
||||||
|
@click="deleteOrderInRecord(scope.row)"
|
||||||
|
class="btn-delete"
|
||||||
|
>删除</el-button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
@ -288,12 +294,12 @@
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import {reactive, ref, onMounted, nextTick, onBeforeUnmount} from 'vue'
|
import {reactive, ref, onMounted, nextTick, onBeforeUnmount} from 'vue'
|
||||||
import {ElMessage} from 'element-plus'
|
import {ElMessage, ElMessageBox} from 'element-plus'
|
||||||
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
|
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
|
||||||
import {loading} from '@/utils/loading.js'
|
import {loading} from '@/utils/loading.js'
|
||||||
import {errorBox} from '@/utils/myMessageBox.js'
|
import {errorBox} from '@/utils/myMessageBox.js'
|
||||||
import {labelPosition} from '@/constant/form'
|
import {labelPosition} from '@/constant/form'
|
||||||
import {submitOrderInForm, getOrderIns, updateOrderIn} from '@/api/orderIn.js'
|
import {submitOrderInForm, getOrderIns, updateOrderIn, deleteOrderIn} from '@/api/orderIn.js'
|
||||||
|
|
||||||
// 生成订单号方法
|
// 生成订单号方法
|
||||||
const generateOrderId = () => {
|
const generateOrderId = () => {
|
||||||
|
|
@ -567,6 +573,41 @@ const saveOrderStatus = () => {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 删除入库单记录
|
||||||
|
const deleteOrderInRecord = (row) => {
|
||||||
|
ElMessageBox.confirm(
|
||||||
|
`确认删除入库单 ${row.orderId} 吗?此操作不可恢复!`,
|
||||||
|
'删除确认',
|
||||||
|
{
|
||||||
|
confirmButtonText: '确定删除',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
type: 'warning',
|
||||||
|
confirmButtonClass: 'el-button--danger'
|
||||||
|
}
|
||||||
|
).then(() => {
|
||||||
|
loading.open()
|
||||||
|
deleteOrderIn(row.recordId)
|
||||||
|
.then(res => {
|
||||||
|
if (res.data.code === 0) {
|
||||||
|
ElMessage.success('入库单删除成功')
|
||||||
|
// 更新本地数据
|
||||||
|
orderInsList.value = orderInsList.value.filter(item => item.recordId !== row.recordId)
|
||||||
|
} else {
|
||||||
|
errorBox(`删除入库单失败: ${res.data.message}`)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
console.error(err)
|
||||||
|
errorBox('删除入库单时发生错误')
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
loading.close()
|
||||||
|
})
|
||||||
|
}).catch(() => {
|
||||||
|
// 用户取消删除
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user