台位配送添加点对点搬运功能
This commit is contained in:
@@ -19,15 +19,6 @@ public class RuoYiApplication
|
|||||||
{
|
{
|
||||||
// System.setProperty("spring.devtools.restart.enabled", "false");
|
// System.setProperty("spring.devtools.restart.enabled", "false");
|
||||||
SpringApplication.run(RuoYiApplication.class, args);
|
SpringApplication.run(RuoYiApplication.class, args);
|
||||||
System.out.println("(♥◠‿◠)ノ゙ 若依启动成功 ლ(´ڡ`ლ)゙ \n" +
|
System.out.println("(♥◠‿◠)ノ゙ WMS启动成功 ლ(´ڡ`ლ)゙ ");
|
||||||
" .-------. ____ __ \n" +
|
|
||||||
" | _ _ \\ \\ \\ / / \n" +
|
|
||||||
" | ( ' ) | \\ _. / ' \n" +
|
|
||||||
" |(_ o _) / _( )_ .' \n" +
|
|
||||||
" | (_,_).' __ ___(_ o _)' \n" +
|
|
||||||
" | |\\ \\ | || |(_,_)' \n" +
|
|
||||||
" | | \\ `' /| `-' / \n" +
|
|
||||||
" | | \\ / \\ / \n" +
|
|
||||||
" ''-' `'-' `-..-' ");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,10 +4,12 @@ import java.util.List;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
import org.springframework.security.access.prepost.PreAuthorize;
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import com.ruoyi.common.core.controller.BaseController;
|
import com.ruoyi.common.core.controller.BaseController;
|
||||||
import com.ruoyi.bas.port.domain.BasProductPort;
|
import com.ruoyi.bas.port.domain.BasProductPort;
|
||||||
@@ -16,6 +18,8 @@ import com.ruoyi.bas.container.domain.BasContainer;
|
|||||||
import com.ruoyi.bas.container.service.IBasContainerService;
|
import com.ruoyi.bas.container.service.IBasContainerService;
|
||||||
import com.ruoyi.bas.containerDetails.domain.BasContainerDetails;
|
import com.ruoyi.bas.containerDetails.domain.BasContainerDetails;
|
||||||
import com.ruoyi.bas.containerDetails.service.IBasContainerDetailsService;
|
import com.ruoyi.bas.containerDetails.service.IBasContainerDetailsService;
|
||||||
|
import com.ruoyi.device.agv.domain.AgvContainerTask;
|
||||||
|
import com.ruoyi.device.agv.service.IAgvContainerTaskService;
|
||||||
import com.ruoyi.common.core.page.TableDataInfo;
|
import com.ruoyi.common.core.page.TableDataInfo;
|
||||||
import com.ruoyi.common.core.page.PageDomain;
|
import com.ruoyi.common.core.page.PageDomain;
|
||||||
import com.ruoyi.common.core.page.TableSupport;
|
import com.ruoyi.common.core.page.TableSupport;
|
||||||
@@ -41,26 +45,59 @@ public class BasStandPositionController extends BaseController
|
|||||||
@Autowired
|
@Autowired
|
||||||
private IBasContainerDetailsService basContainerDetailsService;
|
private IBasContainerDetailsService basContainerDetailsService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IAgvContainerTaskService agvContainerTaskService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询点位类型为6的基础点位列表,并关联容器和容器明细数据
|
* 查询基础点位列表,并关联容器和容器明细数据
|
||||||
|
* 支持根据点位类型和点位名称筛选,默认返回所有数据
|
||||||
*/
|
*/
|
||||||
@PreAuthorize("@ss.hasPermi('bas:basstandPosition:list')")
|
@PreAuthorize("@ss.hasPermi('bas:basstandPosition:list')")
|
||||||
@GetMapping("/portType6")
|
@GetMapping("/portType6")
|
||||||
public TableDataInfo getPortType6List(BasProductPort basProductPort)
|
public TableDataInfo getPortType6List(BasProductPort basProductPort, @RequestParam(required = false) Integer agvStatus)
|
||||||
{
|
{
|
||||||
// 设置查询条件:portType为6
|
// 如果没有传入portType参数,则查询所有类型的数据
|
||||||
basProductPort.setPortType("6");
|
// 如果传入了portType参数,则按指定类型筛选
|
||||||
|
// 如果传入了portName参数,则按点位名称筛选(模糊查询)
|
||||||
|
// 如果传入了agvStatus参数,则按AGV状态筛选
|
||||||
|
|
||||||
// 先查询所有portType为6的BasProductPort数据(不分页)
|
// 先查询所有符合条件的BasProductPort数据(不分页)
|
||||||
List<BasProductPort> allPortList = basProductPortService.selectBasProductPortList(basProductPort);
|
List<BasProductPort> allPortList = basProductPortService.selectBasProductPortList(basProductPort);
|
||||||
|
|
||||||
|
// 查询所有agv任务数据,避免重复查询
|
||||||
|
AgvContainerTask taskQuery = new AgvContainerTask();
|
||||||
|
List<AgvContainerTask> allTaskList = agvContainerTaskService.selectAgvContainerTaskList(taskQuery);
|
||||||
|
|
||||||
// 构建完整的返回结果列表
|
// 构建完整的返回结果列表
|
||||||
List<Map<String, Object>> allResultList = new ArrayList<>();
|
List<Map<String, Object>> allResultList = new ArrayList<>();
|
||||||
|
|
||||||
for (BasProductPort port : allPortList) {
|
for (BasProductPort port : allPortList) {
|
||||||
Map<String, Object> resultMap = new HashMap<>();
|
Map<String, Object> resultMap = new HashMap<>();
|
||||||
|
|
||||||
|
// 判断该点位的agv状态并添加到port对象中
|
||||||
|
int portAgvStatus = 0; // 默认为0
|
||||||
|
String portName = port.getPortName();
|
||||||
|
for (AgvContainerTask task : allTaskList) {
|
||||||
|
if ((task.getStartPoint() != null && task.getStartPoint().equals(portName)) ||
|
||||||
|
(task.getEndPoint() != null && task.getEndPoint().equals(portName))) {
|
||||||
|
portAgvStatus = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建一个包含agvStatus的port Map
|
||||||
|
Map<String, Object> portWithStatus = new HashMap<>();
|
||||||
|
portWithStatus.put("id", port.getId());
|
||||||
|
portWithStatus.put("portName", port.getPortName());
|
||||||
|
portWithStatus.put("portType", port.getPortType());
|
||||||
|
portWithStatus.put("portDesc", port.getPortDesc());
|
||||||
|
portWithStatus.put("warehouseId", port.getWarehouseId());
|
||||||
|
portWithStatus.put("createMan", port.getCreateMan());
|
||||||
|
portWithStatus.put("createTime", port.getCreateTime());
|
||||||
|
portWithStatus.put("agvStatus", portAgvStatus);
|
||||||
|
|
||||||
// 添加点位信息
|
// 添加点位信息
|
||||||
resultMap.put("port", port);
|
resultMap.put("port", portWithStatus);
|
||||||
|
|
||||||
// 根据portName查询容器信息
|
// 根据portName查询容器信息
|
||||||
BasContainer containerQuery = new BasContainer();
|
BasContainer containerQuery = new BasContainer();
|
||||||
@@ -78,6 +115,8 @@ public class BasStandPositionController extends BaseController
|
|||||||
BasContainerDetails detailsQuery = new BasContainerDetails();
|
BasContainerDetails detailsQuery = new BasContainerDetails();
|
||||||
detailsQuery.setContainerId(container.getContainerId());
|
detailsQuery.setContainerId(container.getContainerId());
|
||||||
List<BasContainerDetails> detailsList = basContainerDetailsService.selectBasContainerDetailsList(detailsQuery);
|
List<BasContainerDetails> detailsList = basContainerDetailsService.selectBasContainerDetailsList(detailsQuery);
|
||||||
|
|
||||||
|
// 直接添加明细信息,不需要重复添加agvStatus
|
||||||
containerMap.put("details", detailsList);
|
containerMap.put("details", detailsList);
|
||||||
|
|
||||||
containerWithDetails.add(containerMap);
|
containerWithDetails.add(containerMap);
|
||||||
@@ -87,6 +126,29 @@ public class BasStandPositionController extends BaseController
|
|||||||
allResultList.add(resultMap);
|
allResultList.add(resultMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 根据agvStatus筛选数据
|
||||||
|
if (agvStatus != null) {
|
||||||
|
allResultList = allResultList.stream().filter(resultMap -> {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
Map<String, Object> portMap = (Map<String, Object>) resultMap.get("port");
|
||||||
|
String portName = (String) portMap.get("portName");
|
||||||
|
|
||||||
|
// 判断该点位的agv状态
|
||||||
|
boolean hasAgvTask = false;
|
||||||
|
for (AgvContainerTask task : allTaskList) {
|
||||||
|
if ((task.getStartPoint() != null && task.getStartPoint().equals(portName)) ||
|
||||||
|
(task.getEndPoint() != null && task.getEndPoint().equals(portName))) {
|
||||||
|
hasAgvTask = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据筛选条件返回结果
|
||||||
|
int currentAgvStatus = hasAgvTask ? 1 : 0;
|
||||||
|
return currentAgvStatus == agvStatus.intValue();
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
// 手动实现分页
|
// 手动实现分页
|
||||||
PageDomain pageDomain = TableSupport.buildPageRequest();
|
PageDomain pageDomain = TableSupport.buildPageRequest();
|
||||||
int pageNum = pageDomain.getPageNum();
|
int pageNum = pageDomain.getPageNum();
|
||||||
@@ -123,6 +185,10 @@ public class BasStandPositionController extends BaseController
|
|||||||
// 查询所有BasProductPort数据(不限制portType)
|
// 查询所有BasProductPort数据(不限制portType)
|
||||||
List<BasProductPort> allPortList = basProductPortService.selectBasProductPortList(basProductPort);
|
List<BasProductPort> allPortList = basProductPortService.selectBasProductPortList(basProductPort);
|
||||||
|
|
||||||
|
// 查询所有agv任务数据,避免重复查询
|
||||||
|
AgvContainerTask taskQuery = new AgvContainerTask();
|
||||||
|
List<AgvContainerTask> allTaskList = agvContainerTaskService.selectAgvContainerTaskList(taskQuery);
|
||||||
|
|
||||||
// 构建无料架点位的返回结果列表
|
// 构建无料架点位的返回结果列表
|
||||||
List<Map<String, Object>> noContainerResultList = new ArrayList<>();
|
List<Map<String, Object>> noContainerResultList = new ArrayList<>();
|
||||||
|
|
||||||
@@ -134,13 +200,38 @@ public class BasStandPositionController extends BaseController
|
|||||||
|
|
||||||
// 如果该点位没有容器信息,则添加到结果列表中
|
// 如果该点位没有容器信息,则添加到结果列表中
|
||||||
if (containerList == null || containerList.isEmpty()) {
|
if (containerList == null || containerList.isEmpty()) {
|
||||||
|
// 判断该点位的agv状态并添加到port对象中
|
||||||
|
int portAgvStatus = 0; // 默认为0
|
||||||
|
String portName = port.getPortName();
|
||||||
|
for (AgvContainerTask task : allTaskList) {
|
||||||
|
if ((task.getStartPoint() != null && task.getStartPoint().equals(portName)) ||
|
||||||
|
(task.getEndPoint() != null && task.getEndPoint().equals(portName))) {
|
||||||
|
portAgvStatus = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 只返回agvStatus不等于1的点位数据
|
||||||
|
if (portAgvStatus != 1) {
|
||||||
|
// 创建一个包含agvStatus的port Map
|
||||||
|
Map<String, Object> portWithStatus = new HashMap<>();
|
||||||
|
portWithStatus.put("id", port.getId());
|
||||||
|
portWithStatus.put("portName", port.getPortName());
|
||||||
|
portWithStatus.put("portType", port.getPortType());
|
||||||
|
portWithStatus.put("portDesc", port.getPortDesc());
|
||||||
|
portWithStatus.put("warehouseId", port.getWarehouseId());
|
||||||
|
portWithStatus.put("createMan", port.getCreateMan());
|
||||||
|
portWithStatus.put("createTime", port.getCreateTime());
|
||||||
|
portWithStatus.put("agvStatus", portAgvStatus);
|
||||||
|
|
||||||
Map<String, Object> resultMap = new HashMap<>();
|
Map<String, Object> resultMap = new HashMap<>();
|
||||||
resultMap.put("port", port);
|
resultMap.put("port", portWithStatus);
|
||||||
resultMap.put("containers", new ArrayList<>());
|
resultMap.put("containers", new ArrayList<>());
|
||||||
resultMap.put("containerWithDetails", new ArrayList<>());
|
resultMap.put("containerWithDetails", new ArrayList<>());
|
||||||
noContainerResultList.add(resultMap);
|
noContainerResultList.add(resultMap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 手动实现分页
|
// 手动实现分页
|
||||||
PageDomain pageDomain = TableSupport.buildPageRequest();
|
PageDomain pageDomain = TableSupport.buildPageRequest();
|
||||||
@@ -178,6 +269,10 @@ public class BasStandPositionController extends BaseController
|
|||||||
// 查询所有BasProductPort数据(不限制portType)
|
// 查询所有BasProductPort数据(不限制portType)
|
||||||
List<BasProductPort> allPortList = basProductPortService.selectBasProductPortList(basProductPort);
|
List<BasProductPort> allPortList = basProductPortService.selectBasProductPortList(basProductPort);
|
||||||
|
|
||||||
|
// 查询所有agv任务数据,避免重复查询
|
||||||
|
AgvContainerTask taskQuery = new AgvContainerTask();
|
||||||
|
List<AgvContainerTask> allTaskList = agvContainerTaskService.selectAgvContainerTaskList(taskQuery);
|
||||||
|
|
||||||
// 构建有料架点位的返回结果列表
|
// 构建有料架点位的返回结果列表
|
||||||
List<Map<String, Object>> hasContainerResultList = new ArrayList<>();
|
List<Map<String, Object>> hasContainerResultList = new ArrayList<>();
|
||||||
|
|
||||||
@@ -189,10 +284,35 @@ public class BasStandPositionController extends BaseController
|
|||||||
|
|
||||||
// 如果该点位有容器信息,则添加到结果列表中
|
// 如果该点位有容器信息,则添加到结果列表中
|
||||||
if (containerList != null && !containerList.isEmpty()) {
|
if (containerList != null && !containerList.isEmpty()) {
|
||||||
|
// 判断该点位的agv状态并添加到port对象中
|
||||||
|
int portAgvStatus = 0; // 默认为0
|
||||||
|
String portName = port.getPortName();
|
||||||
|
for (AgvContainerTask task : allTaskList) {
|
||||||
|
if ((task.getStartPoint() != null && task.getStartPoint().equals(portName)) ||
|
||||||
|
(task.getEndPoint() != null && task.getEndPoint().equals(portName))) {
|
||||||
|
portAgvStatus = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建一个包含agvStatus的port Map
|
||||||
|
Map<String, Object> portWithStatus = new HashMap<>();
|
||||||
|
portWithStatus.put("id", port.getId());
|
||||||
|
portWithStatus.put("portName", port.getPortName());
|
||||||
|
portWithStatus.put("portType", port.getPortType());
|
||||||
|
portWithStatus.put("portDesc", port.getPortDesc());
|
||||||
|
portWithStatus.put("warehouseId", port.getWarehouseId());
|
||||||
|
portWithStatus.put("createMan", port.getCreateMan());
|
||||||
|
portWithStatus.put("createTime", port.getCreateTime());
|
||||||
|
portWithStatus.put("agvStatus", portAgvStatus);
|
||||||
|
|
||||||
|
// 只返回agvStatus不等于1的数据
|
||||||
|
if (portAgvStatus != 1) {
|
||||||
Map<String, Object> resultMap = new HashMap<>();
|
Map<String, Object> resultMap = new HashMap<>();
|
||||||
resultMap.put("port", port);
|
resultMap.put("port", portWithStatus);
|
||||||
resultMap.put("containers", containerList);
|
resultMap.put("containers", containerList);
|
||||||
|
|
||||||
|
|
||||||
// 为每个容器查询明细信息
|
// 为每个容器查询明细信息
|
||||||
List<Map<String, Object>> containerWithDetails = new ArrayList<>();
|
List<Map<String, Object>> containerWithDetails = new ArrayList<>();
|
||||||
for (BasContainer container : containerList) {
|
for (BasContainer container : containerList) {
|
||||||
@@ -212,6 +332,7 @@ public class BasStandPositionController extends BaseController
|
|||||||
hasContainerResultList.add(resultMap);
|
hasContainerResultList.add(resultMap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 手动实现分页
|
// 手动实现分页
|
||||||
PageDomain pageDomain = TableSupport.buildPageRequest();
|
PageDomain pageDomain = TableSupport.buildPageRequest();
|
||||||
|
|||||||
@@ -50,3 +50,12 @@ export function callMaterialRack(sourcePortName, targetPortName, containerId) {
|
|||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 推送AGV搬运作业
|
||||||
|
export function pushAgvMoveJob(data) {
|
||||||
|
return request({
|
||||||
|
url: '/api2wcs/pushAgvMoveJob',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
@@ -3852,6 +3852,9 @@ export default {
|
|||||||
basstandPosition: {
|
basstandPosition: {
|
||||||
positionType: '点位类型',
|
positionType: '点位类型',
|
||||||
description: '描述',
|
description: '描述',
|
||||||
|
enterPositionName:'请输入点位名称',
|
||||||
|
positionStatus:'点位状态',
|
||||||
|
selectPositionStatus:'请选择点位状态',
|
||||||
creator: '创建人',
|
creator: '创建人',
|
||||||
warehouseId: '仓库ID',
|
warehouseId: '仓库ID',
|
||||||
containerInfo: '容器信息',
|
containerInfo: '容器信息',
|
||||||
@@ -4090,6 +4093,10 @@ export default {
|
|||||||
a1: '未审核',
|
a1: '未审核',
|
||||||
a2: '审查通过',
|
a2: '审查通过',
|
||||||
a3: '审核不通过'
|
a3: '审核不通过'
|
||||||
|
},
|
||||||
|
agv_status:{
|
||||||
|
a1:'无任务',
|
||||||
|
a2:'任务中'
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3851,6 +3851,9 @@ export default {
|
|||||||
},
|
},
|
||||||
basstandPosition: {
|
basstandPosition: {
|
||||||
positionType: '点位类型',
|
positionType: '点位类型',
|
||||||
|
enterPositionName:'请输入点位名称',
|
||||||
|
positionStatus:'点位状态',
|
||||||
|
selectPositionStatus:'请选择点位状态',
|
||||||
description: '描述',
|
description: '描述',
|
||||||
creator: '创建人',
|
creator: '创建人',
|
||||||
warehouseId: '仓库ID',
|
warehouseId: '仓库ID',
|
||||||
@@ -4090,6 +4093,10 @@ export default {
|
|||||||
a1: '未审核',
|
a1: '未审核',
|
||||||
a2: '审查通过',
|
a2: '审查通过',
|
||||||
a3: '审核不通过'
|
a3: '审核不通过'
|
||||||
|
},
|
||||||
|
agv_status:{
|
||||||
|
a1:'无任务',
|
||||||
|
a2:'任务中'
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3851,6 +3851,9 @@ export default {
|
|||||||
},
|
},
|
||||||
basstandPosition: {
|
basstandPosition: {
|
||||||
positionType: '点位类型',
|
positionType: '点位类型',
|
||||||
|
enterPositionName:'请输入点位名称',
|
||||||
|
positionStatus:'点位状态',
|
||||||
|
selectPositionStatus:'请选择点位状态',
|
||||||
description: '描述',
|
description: '描述',
|
||||||
creator: '创建人',
|
creator: '创建人',
|
||||||
warehouseId: '仓库ID',
|
warehouseId: '仓库ID',
|
||||||
@@ -4090,6 +4093,10 @@ export default {
|
|||||||
a1: '未审核',
|
a1: '未审核',
|
||||||
a2: '审查通过',
|
a2: '审查通过',
|
||||||
a3: '审核不通过'
|
a3: '审核不通过'
|
||||||
|
},
|
||||||
|
agv_status:{
|
||||||
|
a1:'无任务',
|
||||||
|
a2:'任务中'
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,64 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
|
<!-- 筛选区域 -->
|
||||||
|
<div class="filter-container">
|
||||||
|
<el-form :inline="true" :model="queryParams" class="filter-form">
|
||||||
|
<el-form-item :label="$t('basstandPosition.positionType') /* 点位类型 */ + ':'">
|
||||||
|
<el-select
|
||||||
|
v-model="queryParams.portType"
|
||||||
|
:placeholder="$t('basstandPosition.selectPositionType') /* 请选择点位类型 */"
|
||||||
|
clearable
|
||||||
|
@change="handleFilterChange"
|
||||||
|
style="width: 150px;"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="dict in dict.type.port_type"
|
||||||
|
:key="dict.value"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="dict.value"
|
||||||
|
>
|
||||||
|
</el-option>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('basstandPosition.positionName') /* 点位名称 */ + ':'">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.portName"
|
||||||
|
:placeholder="$t('basstandPosition.enterPositionName') /* 请输入点位名称 */"
|
||||||
|
clearable
|
||||||
|
@keyup.enter.native="handleFilterSearch"
|
||||||
|
style="width: 200px;"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('basstandPosition.positionStatus') /* 点位状态 */ + ':'">
|
||||||
|
<el-select
|
||||||
|
v-model="queryParams.agvStatus"
|
||||||
|
:placeholder="$t('basstandPosition.selectPositionStatus') /* 请选择点位状态 */"
|
||||||
|
clearable
|
||||||
|
@change="handleFilterChange"
|
||||||
|
style="width: 150px;"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="dict in dict.type.agv_status"
|
||||||
|
:key="dict.value"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="dict.value"
|
||||||
|
>
|
||||||
|
</el-option>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" @click="handleFilterSearch" size="small">
|
||||||
|
<i class="el-icon-search"></i>
|
||||||
|
{{ $t('basstandPosition.search') /* 搜索 */ }}
|
||||||
|
</el-button>
|
||||||
|
<el-button @click="handleFilterReset" size="small">
|
||||||
|
<i class="el-icon-refresh"></i>
|
||||||
|
{{ $t('basstandPosition.reset') /* 重置 */ }}
|
||||||
|
</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div v-loading="loading" class="position-grid">
|
<div v-loading="loading" class="position-grid">
|
||||||
<div
|
<div
|
||||||
v-for="(item, index) in dataList"
|
v-for="(item, index) in dataList"
|
||||||
@@ -28,8 +87,10 @@
|
|||||||
<span class="value">{{ item.port.createMan || '-' }}</span>
|
<span class="value">{{ item.port.createMan || '-' }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="info-item">
|
<div class="info-item">
|
||||||
<span class="label">{{ $t('basstandPosition.warehouseId') /* 仓库ID */ }}:</span>
|
<span class="label">{{ $t('basstandPosition.positionStatus') /* 点位状态 */ }}:</span>
|
||||||
<span class="value">{{ item.port.warehouseId || '-' }}</span>
|
<span class="value">
|
||||||
|
<dict-tag :options="dict.type.agv_status" :value="item.port.agvStatus"/>
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -38,7 +99,7 @@
|
|||||||
<el-button
|
<el-button
|
||||||
type="primary"
|
type="primary"
|
||||||
size="small"
|
size="small"
|
||||||
:disabled="!hasContainers(item)"
|
:disabled="item.port.agvStatus === 1 || !hasContainers(item)"
|
||||||
@click="showContainerDetails(item)"
|
@click="showContainerDetails(item)"
|
||||||
class="full-width-button"
|
class="full-width-button"
|
||||||
v-hasPermi="['bas:basstandPosition:detail']"
|
v-hasPermi="['bas:basstandPosition:detail']"
|
||||||
@@ -50,7 +111,7 @@
|
|||||||
<el-button
|
<el-button
|
||||||
type="success"
|
type="success"
|
||||||
size="small"
|
size="small"
|
||||||
:disabled="hasContainers(item)"
|
:disabled="item.port.agvStatus === 1 || hasContainers(item)"
|
||||||
@click="callMaterialRack(item)"
|
@click="callMaterialRack(item)"
|
||||||
class="half-width-button"
|
class="half-width-button"
|
||||||
v-hasPermi="['bas:basstandPosition:call']"
|
v-hasPermi="['bas:basstandPosition:call']"
|
||||||
@@ -60,7 +121,7 @@
|
|||||||
<el-button
|
<el-button
|
||||||
type="warning"
|
type="warning"
|
||||||
size="small"
|
size="small"
|
||||||
:disabled="!hasContainers(item)"
|
:disabled="item.port.agvStatus === 1 || !hasContainers(item)"
|
||||||
@click="deliverContainer(item)"
|
@click="deliverContainer(item)"
|
||||||
class="half-width-button"
|
class="half-width-button"
|
||||||
v-hasPermi="['bas:basstandPosition:deliver']"
|
v-hasPermi="['bas:basstandPosition:deliver']"
|
||||||
@@ -104,8 +165,10 @@
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="detail-row">
|
<div class="detail-row">
|
||||||
<span class="detail-label">{{ $t('basstandPosition.warehouseId') /* 仓库ID */ }}:</span>
|
<span class="detail-label">{{ $t('basstandPosition.positionStatus') /* 点位状态 */ }}:</span>
|
||||||
<span class="detail-value">{{ selectedPosition.port.warehouseId || '-' }}</span>
|
<span class="detail-value">
|
||||||
|
<dict-tag :options="dict.type.agv_status" :value="selectedPosition.port.agvStatus"/>
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-card>
|
</el-card>
|
||||||
@@ -277,7 +340,11 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="port.portDesc" :label="$t('basstandPosition.positionDesc') /* 点位描述 */" min-width="150" />
|
<el-table-column prop="port.portDesc" :label="$t('basstandPosition.positionDesc') /* 点位描述 */" min-width="150" />
|
||||||
<el-table-column prop="port.warehouseId" :label="$t('basstandPosition.warehouseId') /* 仓库ID */" width="120" align="center" />
|
<el-table-column prop="port.agvStatus" :label="$t('basstandPosition.positionStatus') /* 点位状态 */" width="120" align="center">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<dict-tag :options="dict.type.agv_status" :value="scope.row.port.agvStatus"/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column prop="port.createMan" :label="$t('basstandPosition.creator') /* 创建人 */" width="120" align="center" />
|
<el-table-column prop="port.createMan" :label="$t('basstandPosition.creator') /* 创建人 */" width="120" align="center" />
|
||||||
<el-table-column :label="$t('basstandPosition.containerStatus') /* 容器状态 */" width="120" align="center">
|
<el-table-column :label="$t('basstandPosition.containerStatus') /* 容器状态 */" width="120" align="center">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
@@ -388,7 +455,13 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="port.portDesc" :label="$t('basstandPosition.positionDesc') /* 点位描述 */" min-width="150" />
|
<el-table-column prop="port.portDesc" :label="$t('basstandPosition.positionDesc') /* 点位描述 */" min-width="150" />
|
||||||
<el-table-column prop="port.warehouseId" :label="$t('basstandPosition.warehouseId') /* 仓库ID */" width="120" align="center" />
|
<!-- <el-table-column prop="port.warehouseId" :label="$t('basstandPosition.warehouseId') /* 仓库ID */" width="120" align="center" /> -->
|
||||||
|
<el-table-column prop="port.agvStatus" :label="$t('basstandPosition.positionStatus') /* 点位状态 */" width="120" align="center">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<dict-tag :options="dict.type.agv_status" :value="scope.row.port.agvStatus"/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column prop="port.createMan" :label="$t('basstandPosition.creator') /* 创建人 */" width="120" align="center" />
|
<el-table-column prop="port.createMan" :label="$t('basstandPosition.creator') /* 创建人 */" width="120" align="center" />
|
||||||
<el-table-column :label="$t('basstandPosition.containerStatus') /* 容器状态 */" width="120" align="center">
|
<el-table-column :label="$t('basstandPosition.containerStatus') /* 容器状态 */" width="120" align="center">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
@@ -439,12 +512,12 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { getPortType6List, getNoContainerList, getHasContainerList } from "@/api/bas/basstandPosition"
|
import { getPortType6List, getNoContainerList, getHasContainerList, pushAgvMoveJob } from "@/api/bas/basstandPosition"
|
||||||
import { getDicts } from "@/api/system/dict/data"
|
import { getDicts } from "@/api/system/dict/data"
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "BasStandPosition",
|
name: "BasStandPosition",
|
||||||
dicts: ['port_type'],
|
dicts: ['port_type', 'agv_status'],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
// 遮罩层
|
// 遮罩层
|
||||||
@@ -456,7 +529,10 @@ export default {
|
|||||||
// 查询参数
|
// 查询参数
|
||||||
queryParams: {
|
queryParams: {
|
||||||
pageNum: 1,
|
pageNum: 1,
|
||||||
pageSize: 10
|
pageSize: 10,
|
||||||
|
portType: null,
|
||||||
|
portName: null,
|
||||||
|
agvStatus: null
|
||||||
},
|
},
|
||||||
// 对话框显示状态
|
// 对话框显示状态
|
||||||
dialogVisible: false,
|
dialogVisible: false,
|
||||||
@@ -493,7 +569,10 @@ export default {
|
|||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
portType: null
|
portType: null
|
||||||
},
|
},
|
||||||
currentCallPosition: null
|
currentCallPosition: null,
|
||||||
|
// 定时器相关
|
||||||
|
refreshTimer: null,
|
||||||
|
isPageVisible: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -505,6 +584,18 @@ export default {
|
|||||||
this.getList()
|
this.getList()
|
||||||
this.getDictList()
|
this.getDictList()
|
||||||
},
|
},
|
||||||
|
mounted() {
|
||||||
|
// 启动定时器
|
||||||
|
this.startRefreshTimer()
|
||||||
|
// 监听页面可见性变化
|
||||||
|
this.addVisibilityListener()
|
||||||
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
// 清除定时器
|
||||||
|
this.clearRefreshTimer()
|
||||||
|
// 移除页面可见性监听
|
||||||
|
this.removeVisibilityListener()
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
/** 获取字典数据 */
|
/** 获取字典数据 */
|
||||||
getDictList() {
|
getDictList() {
|
||||||
@@ -561,6 +652,45 @@ export default {
|
|||||||
})
|
})
|
||||||
this.getList()
|
this.getList()
|
||||||
},
|
},
|
||||||
|
/** 启动定时器 */
|
||||||
|
startRefreshTimer() {
|
||||||
|
// 清除已存在的定时器
|
||||||
|
this.clearRefreshTimer()
|
||||||
|
// 只有在页面可见时才启动定时器
|
||||||
|
if (this.isPageVisible) {
|
||||||
|
this.refreshTimer = setInterval(() => {
|
||||||
|
if (this.isPageVisible) {
|
||||||
|
this.getList()
|
||||||
|
}
|
||||||
|
}, 10000) // 10秒
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/** 清除定时器 */
|
||||||
|
clearRefreshTimer() {
|
||||||
|
if (this.refreshTimer) {
|
||||||
|
clearInterval(this.refreshTimer)
|
||||||
|
this.refreshTimer = null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/** 添加页面可见性监听 */
|
||||||
|
addVisibilityListener() {
|
||||||
|
document.addEventListener('visibilitychange', this.handleVisibilityChange)
|
||||||
|
},
|
||||||
|
/** 移除页面可见性监听 */
|
||||||
|
removeVisibilityListener() {
|
||||||
|
document.removeEventListener('visibilitychange', this.handleVisibilityChange)
|
||||||
|
},
|
||||||
|
/** 处理页面可见性变化 */
|
||||||
|
handleVisibilityChange() {
|
||||||
|
this.isPageVisible = !document.hidden
|
||||||
|
if (this.isPageVisible) {
|
||||||
|
// 页面变为可见时,启动定时器
|
||||||
|
this.startRefreshTimer()
|
||||||
|
} else {
|
||||||
|
// 页面变为隐藏时,暂停定时器
|
||||||
|
this.clearRefreshTimer()
|
||||||
|
}
|
||||||
|
},
|
||||||
/** 获取无容器点位列表 */
|
/** 获取无容器点位列表 */
|
||||||
getNoContainerList() {
|
getNoContainerList() {
|
||||||
this.noContainerLoading = true
|
this.noContainerLoading = true
|
||||||
@@ -607,6 +737,24 @@ export default {
|
|||||||
this.noContainerQueryParams.pageNum = 1
|
this.noContainerQueryParams.pageNum = 1
|
||||||
this.getNoContainerList()
|
this.getNoContainerList()
|
||||||
},
|
},
|
||||||
|
/** 主筛选区域 - 筛选条件变化处理 */
|
||||||
|
handleFilterChange() {
|
||||||
|
this.queryParams.pageNum = 1
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
/** 主筛选区域 - 搜索处理 */
|
||||||
|
handleFilterSearch() {
|
||||||
|
this.queryParams.pageNum = 1
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
/** 主筛选区域 - 重置处理 */
|
||||||
|
handleFilterReset() {
|
||||||
|
this.queryParams.portType = null
|
||||||
|
this.queryParams.portName = null
|
||||||
|
this.queryParams.agvStatus = null
|
||||||
|
this.queryParams.pageNum = 1
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
/** 呼叫料架弹框 - 点位类型变化处理 */
|
/** 呼叫料架弹框 - 点位类型变化处理 */
|
||||||
handleCallPortTypeChange() {
|
handleCallPortTypeChange() {
|
||||||
this.hasContainerQueryParams.pageNum = 1
|
this.hasContainerQueryParams.pageNum = 1
|
||||||
@@ -639,20 +787,26 @@ export default {
|
|||||||
if (this.currentDeliverPosition && this.currentDeliverPosition.containers && this.currentDeliverPosition.containers.length > 0) {
|
if (this.currentDeliverPosition && this.currentDeliverPosition.containers && this.currentDeliverPosition.containers.length > 0) {
|
||||||
containerCode = this.currentDeliverPosition.containers[0].containerId
|
containerCode = this.currentDeliverPosition.containers[0].containerId
|
||||||
}
|
}
|
||||||
|
// 调用AGV搬运接口
|
||||||
// 打印配送信息
|
const agvMoveParam = {
|
||||||
console.log('当前点位名称:', currentPortName)
|
startPoint: currentPortName,
|
||||||
console.log('目标点位名称:', targetPortName)
|
endPoint: targetPortName,
|
||||||
console.log('容器编码:', containerCode)
|
containerCode: containerCode
|
||||||
// console.log('当前点位完整信息:', this.currentDeliverPosition)
|
}
|
||||||
// console.log('目标点位完整信息:', row)
|
// 配送容器
|
||||||
|
pushAgvMoveJob(agvMoveParam).then(response => {
|
||||||
this.$message({
|
this.$message({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
message: this.$t('basstandPosition.deliveringContainer', { containerCode, currentPortName, targetPortName }) /* 正在配送容器... */
|
message: this.$t('basstandPosition.deliveringContainer', { containerCode, currentPortName, targetPortName }) /* 正在配送容器... */
|
||||||
})
|
})
|
||||||
// 调用配送接口
|
|
||||||
this.deliverDialogVisible = false
|
this.deliverDialogVisible = false
|
||||||
|
this.refreshData() // 刷新列表
|
||||||
|
}).catch(error => {
|
||||||
|
this.$message({
|
||||||
|
type: 'error',
|
||||||
|
message: '配送失败: ' + (error.msg || error.message || '未知错误')
|
||||||
|
})
|
||||||
|
})
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
this.$message({
|
this.$message({
|
||||||
type: 'info',
|
type: 'info',
|
||||||
@@ -678,20 +832,26 @@ export default {
|
|||||||
? row.containers[0].containerId
|
? row.containers[0].containerId
|
||||||
: '未知容器'
|
: '未知容器'
|
||||||
|
|
||||||
// 打印呼叫信息
|
// 调用AGV搬运接口
|
||||||
console.log('=== 呼叫料架信息 ===')
|
const agvMoveParam = {
|
||||||
console.log('当前点位名称:', currentPortName)
|
startPoint: sourcePortName,
|
||||||
console.log('源点位名称:', sourcePortName)
|
endPoint: currentPortName,
|
||||||
console.log('容器编码:', containerCode)
|
containerCode: containerCode
|
||||||
console.log('==================')
|
}
|
||||||
|
//呼叫料架
|
||||||
// 这里添加实际的呼叫逻辑
|
pushAgvMoveJob(agvMoveParam).then(response => {
|
||||||
this.$message({
|
this.$message({
|
||||||
type: 'success',
|
type: 'success',
|
||||||
message: this.$t('basstandPosition.shelfCalledSuccess', { containerCode, sourcePortName, currentPortName }) /* 料架呼叫成功 */
|
message: this.$t('basstandPosition.shelfCalledSuccess', { containerCode, sourcePortName, currentPortName }) /* 料架呼叫成功 */
|
||||||
})
|
})
|
||||||
this.callDialogVisible = false
|
this.callDialogVisible = false
|
||||||
this.getHasContainerList() // 刷新列表
|
this.refreshData() // 刷新列表
|
||||||
|
}).catch(error => {
|
||||||
|
this.$message({
|
||||||
|
type: 'error',
|
||||||
|
message: '呼叫失败: ' + (error.msg || error.message || '未知错误')
|
||||||
|
})
|
||||||
|
})
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
this.$message({
|
this.$message({
|
||||||
type: 'info',
|
type: 'info',
|
||||||
@@ -987,6 +1147,44 @@ export default {
|
|||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 主筛选区域样式 */
|
||||||
|
.filter-container {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
padding: 20px;
|
||||||
|
background-color: #ffffff;
|
||||||
|
border-radius: 8px;
|
||||||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||||
|
border: 1px solid #e4e7ed;
|
||||||
|
}
|
||||||
|
|
||||||
|
.filter-container .filter-form {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.filter-container .el-form-item {
|
||||||
|
margin-bottom: 0;
|
||||||
|
margin-right: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.filter-container .el-form-item__label {
|
||||||
|
font-weight: 500;
|
||||||
|
color: #606266;
|
||||||
|
}
|
||||||
|
|
||||||
|
.filter-container .el-button {
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.filter-container .el-button--primary {
|
||||||
|
background-color: #409eff;
|
||||||
|
border-color: #409eff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.filter-container .el-button--primary:hover {
|
||||||
|
background-color: #66b1ff;
|
||||||
|
border-color: #66b1ff;
|
||||||
|
}
|
||||||
|
|
||||||
.filter-form .el-form-item {
|
.filter-form .el-form-item {
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
margin-right: 15px;
|
margin-right: 15px;
|
||||||
|
|||||||
@@ -253,7 +253,6 @@ export default {
|
|||||||
getListData() {
|
getListData() {
|
||||||
// 所有单据数量
|
// 所有单据数量
|
||||||
finishCount().then(response => {
|
finishCount().then(response => {
|
||||||
console.log(response)
|
|
||||||
this.quantity.inbound_order = response.data.stockinCount
|
this.quantity.inbound_order = response.data.stockinCount
|
||||||
this.quantity.outbound_order = response.data.stockoutCount
|
this.quantity.outbound_order = response.data.stockoutCount
|
||||||
this.quantity.inventory_sheet = response.data.stockcheckCount
|
this.quantity.inventory_sheet = response.data.stockcheckCount
|
||||||
|
|||||||
Reference in New Issue
Block a user