台位配送页面与其权限和国际化

This commit is contained in:
猫猫guowen
2025-07-31 15:40:06 +08:00
parent 58c3822e07
commit 27be485db1
6 changed files with 1545 additions and 3 deletions

View File

@@ -0,0 +1,241 @@
package com.ruoyi.bas.basstandPosition.controller;
import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.bas.port.domain.BasProductPort;
import com.ruoyi.bas.port.service.IBasProductPortService;
import com.ruoyi.bas.container.domain.BasContainer;
import com.ruoyi.bas.container.service.IBasContainerService;
import com.ruoyi.bas.containerDetails.domain.BasContainerDetails;
import com.ruoyi.bas.containerDetails.service.IBasContainerDetailsService;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.page.PageDomain;
import com.ruoyi.common.core.page.TableSupport;
import com.ruoyi.common.constant.HttpStatus;
/**
* 基础站台位置Controller
*
* @author ruoyi
* @date 2025-01-17
*/
@RestController
@RequestMapping("/bas/basstandPosition")
@PreAuthorize("@ss.hasPermi('bas:basstandPosition:list')")
public class BasStandPositionController extends BaseController
{
@Autowired
private IBasProductPortService basProductPortService;
@Autowired
private IBasContainerService basContainerService;
@Autowired
private IBasContainerDetailsService basContainerDetailsService;
/**
* 查询点位类型为6的基础点位列表,并关联容器和容器明细数据
*/
@PreAuthorize("@ss.hasPermi('bas:basstandPosition:list')")
@GetMapping("/portType6")
public TableDataInfo getPortType6List(BasProductPort basProductPort)
{
// 设置查询条件:portType为6
basProductPort.setPortType("6");
// 先查询所有portType为6的BasProductPort数据(不分页)
List<BasProductPort> allPortList = basProductPortService.selectBasProductPortList(basProductPort);
// 构建完整的返回结果列表
List<Map<String, Object>> allResultList = new ArrayList<>();
for (BasProductPort port : allPortList) {
Map<String, Object> resultMap = new HashMap<>();
// 添加点位信息
resultMap.put("port", port);
// 根据portName查询容器信息
BasContainer containerQuery = new BasContainer();
containerQuery.setPortName(port.getPortName());
List<BasContainer> containerList = basContainerService.selectBasContainerList(containerQuery);
resultMap.put("containers", containerList);
// 为每个容器查询明细信息
List<Map<String, Object>> containerWithDetails = new ArrayList<>();
for (BasContainer container : containerList) {
Map<String, Object> containerMap = new HashMap<>();
containerMap.put("container", container);
// 根据containerId查询容器明细
BasContainerDetails detailsQuery = new BasContainerDetails();
detailsQuery.setContainerId(container.getContainerId());
List<BasContainerDetails> detailsList = basContainerDetailsService.selectBasContainerDetailsList(detailsQuery);
containerMap.put("details", detailsList);
containerWithDetails.add(containerMap);
}
resultMap.put("containerWithDetails", containerWithDetails);
allResultList.add(resultMap);
}
// 手动实现分页
PageDomain pageDomain = TableSupport.buildPageRequest();
int pageNum = pageDomain.getPageNum();
int pageSize = pageDomain.getPageSize();
int total = allResultList.size();
// 计算分页范围
int startIndex = (pageNum - 1) * pageSize;
int endIndex = Math.min(startIndex + pageSize, total);
// 获取当前页数据
List<Map<String, Object>> pageResultList = new ArrayList<>();
if (startIndex < total) {
pageResultList = allResultList.subList(startIndex, endIndex);
}
// 构建分页结果
TableDataInfo rspData = new TableDataInfo();
rspData.setCode(HttpStatus.SUCCESS);
rspData.setMsg("查询成功");
rspData.setRows(pageResultList);
rspData.setTotal(total);
return rspData;
}
/**
* 查询所有无料架信息的点位数据(不限制portType)
*/
@PreAuthorize("@ss.hasPermi('bas:basstandPosition:list')")
@GetMapping("/noContainer")
public TableDataInfo getNoContainerPositions(BasProductPort basProductPort)
{
// 查询所有BasProductPort数据(不限制portType)
List<BasProductPort> allPortList = basProductPortService.selectBasProductPortList(basProductPort);
// 构建无料架点位的返回结果列表
List<Map<String, Object>> noContainerResultList = new ArrayList<>();
for (BasProductPort port : allPortList) {
// 根据portName查询容器信息
BasContainer containerQuery = new BasContainer();
containerQuery.setPortName(port.getPortName());
List<BasContainer> containerList = basContainerService.selectBasContainerList(containerQuery);
// 如果该点位没有容器信息,则添加到结果列表中
if (containerList == null || containerList.isEmpty()) {
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("port", port);
resultMap.put("containers", new ArrayList<>());
resultMap.put("containerWithDetails", new ArrayList<>());
noContainerResultList.add(resultMap);
}
}
// 手动实现分页
PageDomain pageDomain = TableSupport.buildPageRequest();
int pageNum = pageDomain.getPageNum();
int pageSize = pageDomain.getPageSize();
int total = noContainerResultList.size();
// 计算分页范围
int startIndex = (pageNum - 1) * pageSize;
int endIndex = Math.min(startIndex + pageSize, total);
// 获取当前页数据
List<Map<String, Object>> pageResultList = new ArrayList<>();
if (startIndex < total) {
pageResultList = noContainerResultList.subList(startIndex, endIndex);
}
// 构建分页结果
TableDataInfo rspData = new TableDataInfo();
rspData.setCode(HttpStatus.SUCCESS);
rspData.setMsg("查询成功");
rspData.setRows(pageResultList);
rspData.setTotal(total);
return rspData;
}
/**
* 查询所有有料架信息的点位数据(不限制portType)
*/
@PreAuthorize("@ss.hasPermi('bas:basstandPosition:list')")
@GetMapping("/hasContainer")
public TableDataInfo getHasContainerPositions(BasProductPort basProductPort)
{
// 查询所有BasProductPort数据(不限制portType)
List<BasProductPort> allPortList = basProductPortService.selectBasProductPortList(basProductPort);
// 构建有料架点位的返回结果列表
List<Map<String, Object>> hasContainerResultList = new ArrayList<>();
for (BasProductPort port : allPortList) {
// 根据portName查询容器信息
BasContainer containerQuery = new BasContainer();
containerQuery.setPortName(port.getPortName());
List<BasContainer> containerList = basContainerService.selectBasContainerList(containerQuery);
// 如果该点位有容器信息,则添加到结果列表中
if (containerList != null && !containerList.isEmpty()) {
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("port", port);
resultMap.put("containers", containerList);
// 为每个容器查询明细信息
List<Map<String, Object>> containerWithDetails = new ArrayList<>();
for (BasContainer container : containerList) {
Map<String, Object> containerMap = new HashMap<>();
containerMap.put("container", container);
// 根据containerId查询容器明细
BasContainerDetails detailsQuery = new BasContainerDetails();
detailsQuery.setContainerId(container.getContainerId());
List<BasContainerDetails> detailsList = basContainerDetailsService.selectBasContainerDetailsList(detailsQuery);
containerMap.put("details", detailsList);
containerWithDetails.add(containerMap);
}
resultMap.put("containerWithDetails", containerWithDetails);
hasContainerResultList.add(resultMap);
}
}
// 手动实现分页
PageDomain pageDomain = TableSupport.buildPageRequest();
int pageNum = pageDomain.getPageNum();
int pageSize = pageDomain.getPageSize();
int total = hasContainerResultList.size();
// 计算分页范围
int startIndex = (pageNum - 1) * pageSize;
int endIndex = Math.min(startIndex + pageSize, total);
// 获取当前页数据
List<Map<String, Object>> pageResultList = new ArrayList<>();
if (startIndex < total) {
pageResultList = hasContainerResultList.subList(startIndex, endIndex);
}
// 构建分页结果
TableDataInfo rspData = new TableDataInfo();
rspData.setCode(HttpStatus.SUCCESS);
rspData.setMsg("查询成功");
rspData.setRows(pageResultList);
rspData.setTotal(total);
return rspData;
}
}

View File

@@ -0,0 +1,52 @@
import request from '@/utils/request'
// 查询点位类型为6的基础点位列表,并关联容器和容器明细数据
export function getPortType6List(query) {
return request({
url: '/bas/basstandPosition/portType6',
method: 'get',
params: query
})
}
// 查询所有无料架信息的点位数据
export function getNoContainerList(query) {
return request({
url: '/bas/basstandPosition/noContainer',
method: 'get',
params: query
})
}
// 查询所有有料架信息的点位数据
export function getHasContainerList(query) {
return request({
url: '/bas/basstandPosition/hasContainer',
method: 'get',
params: query
})
}
// 查看容器详情
export function getContainerDetail(containerId) {
return request({
url: '/bas/basstandPosition/containerDetail/' + containerId,
method: 'get'
})
}
// 配送容器
export function deliverContainer(sourcePortName, targetPortName, containerId) {
return request({
url: '/bas/basstandPosition/deliver/' + sourcePortName + '/' + targetPortName + '/' + containerId,
method: 'get'
})
}
// 呼叫料架
export function callMaterialRack(sourcePortName, targetPortName, containerId) {
return request({
url: '/bas/basstandPosition/call/' + sourcePortName + '/' + targetPortName + '/' + containerId,
method: 'get'
})
}

View File

@@ -1209,6 +1209,7 @@ export default {
supplierManagement: 'supplierManagement',
materialManagement: 'materialManagement',
basicPointLocation: 'basicPointLocation',
basstandPosition:'basstandPosition',
//*************** 查询统计*************
queryStatistics: 'queryStatistics',
inventoryDetailQuery: 'inventoryDetailQuery',
@@ -3281,5 +3282,96 @@ export default {
deleteConfirm: 'Are you sure to delete the customerNo with ID {ids}?'
},
basstandPosition: {
// Position types
positionType: 'Position Type',
description: 'Description',
creator: 'Creator',
warehouseId: 'Warehouse ID',
positionName: 'Position Name',
positionId: 'Position ID',
containerNumber: 'Container Number',
status: 'Status',
capacity: 'Capacity',
materialType: 'Material Type',
operator: 'Operator',
createTime: 'Create Time',
materialId: 'Material ID',
materialName: 'Material Name',
quantity: 'Quantity',
unit: 'Unit',
positionDescription: 'Position Description',
containerStatus: 'Container Status',
operation: 'Operation',
// Buttons and actions
callShelf: 'Call Shelf',
deliverContainer: 'Deliver Container',
search: 'Search',
reset: 'Reset',
close: 'Close',
confirm: 'Confirm',
cancel: 'Cancel',
deliver: 'Deliver',
call: 'Call',
// Dialog titles
containerInfo: 'Container Information',
positionInfo: 'Position Information',
deliverContainerDialog: 'Deliver Container Dialog',
callShelfDialog: 'Call Shelf Dialog',
containerDetails: 'Container Details',
// Labels and text
containerList: 'Container List',
materialDetails: 'Material Details',
container: 'Container:',
items: 'items',
noContainer: 'No Container',
hasContainer: 'Has Container',
filterConditions: 'Filter Conditions',
// Messages
noMaterialDetails: 'No material details for this container',
noMaterialInfo: 'No material details information',
selectDeliveryTarget: 'Select Delivery Target Position',
selectTargetPositionPrompt: 'Below are positions without containers, please select the target position for container delivery',
refreshingData: 'Refreshing data...',
// Placeholders
selectPositionType: 'Please select position type',
// Confirmation dialogs
confirmDeliveryTitle: 'Delivery Confirmation',
confirmDeliveryMessage: 'Are you sure you want to deliver a container to position {positionName}?',
confirmCallTitle: 'Call Confirmation',
confirmCallMessage: 'Are you sure you want to call the shelf from position {sourcePosition} to position {targetPosition}?',
// Status messages
deliveringContainer: 'Delivering container {containerCode} from position {currentPosition} to position {targetPosition}...',
deliveryCancelled: 'Delivery cancelled',
shelfCalled: 'Shelf {containerCode} has been called from {sourcePosition} to {currentPosition}',
callCancelled: 'Call cancelled',
// Comments (for reference)
refreshList: 'Refresh list',
getContainerCount: 'Get container count',
getCurrentPositionInfo: 'Get current position information (from currentDeliverPosition)',
targetPositionName: 'Target position name',
getContainerCode: 'Get container code (from the first container in current position container information)',
defaultGeneratedContainerCode: 'Default generated container code',
printDeliveryInfo: 'Print delivery information',
currentPositionName: 'Current position name',
confirmCallShelf: 'Confirm call shelf',
getCurrentPositionName: 'Get current position name',
getSourcePositionName: 'Get source position name',
printCallInfo: 'Print call information',
callShelfInfo: 'Call shelf information',
sourcePositionName: 'Source position name',
dialogStyleOptimization: 'Dialog style optimization',
deliverContainerDialogStyle: 'Deliver container dialog style',
filterAreaStyle: 'Filter area style'
},
}

View File

@@ -1115,6 +1115,7 @@ export default {
supplierManagement:'供应商管理',
materialManagement:'物料管理',
basicPointLocation:'基础点位',
basstandPosition:'basstandPosition',
//*************** 查询统计*************
queryStatistics:'查询统计',
inventoryDetailQuery:'库存明细查询',
@@ -3216,20 +3217,111 @@ export default {
taskId: '任务编号',
pendingTasks: '待执行任务',
priority: '优先级',
// 单据类型
// ... existing content ...
inbound: '入库',
outbound: '出库',
inventory: '盘点',
// 单据状态
// ... existing content ...
unexecuted: '未执行',
reviewing: '审核中',
executing: '正执行',
// 饼图
// ... existing content ...
emptyLocation:"空货位",
fullLocation:"满货位",
inboundAllocated:"入库已分配",
outboundAllocated:"出库已分配",
inboundNeedCheck:"入库需盘点",
outboundNeedCheck:"出库需盘点",
},
basstandPosition: {
// Pozíció típusok
positionType: 'Pozíció típus',
description: 'Leírás',
creator: 'Létrehozó',
warehouseId: 'Raktár azonosító',
positionName: 'Pozíció neve',
positionId: 'Pozíció azonosító',
containerNumber: 'Konténer szám',
status: 'Állapot',
capacity: 'Kapacitás',
materialType: 'Anyag típus',
operator: 'Kezelő',
createTime: 'Létrehozás ideje',
materialId: 'Anyag azonosító',
materialName: 'Anyag neve',
quantity: 'Mennyiség',
unit: 'Egység',
positionDescription: 'Pozíció leírása',
containerStatus: 'Konténer állapot',
operation: 'Művelet',
// Gombok és műveletek
callShelf: 'Polc hívása',
deliverContainer: 'Konténer szállítása',
search: 'Keresés',
reset: 'Visszaállítás',
close: 'Bezárás',
confirm: 'Megerősítés',
cancel: 'Mégse',
deliver: 'Szállítás',
call: 'Hívás',
// Párbeszédpanel címek
containerInfo: 'Konténer információ',
positionInfo: 'Pozíció információ',
deliverContainerDialog: 'Konténer szállítási párbeszédpanel',
callShelfDialog: 'Polc hívási párbeszédpanel',
containerDetails: 'Konténer részletek',
// Címkék és szövegek
containerList: 'Konténer lista',
materialDetails: 'Anyag részletek',
container: 'Konténer:',
items: 'elemek',
noContainer: 'Nincs konténer',
hasContainer: 'Van konténer',
filterConditions: 'Szűrési feltételek',
// Üzenetek
noMaterialDetails: 'Nincs anyag részlet ehhez a konténerhez',
noMaterialInfo: 'Nincs anyag részlet információ',
selectDeliveryTarget: 'Szállítási célpozíció kiválasztása',
selectTargetPositionPrompt: 'Az alábbiakban konténer nélküli pozíciók találhatók, kérjük válassza ki a konténer szállítás célpozícióját',
refreshingData: 'Adatok frissítése...',
// Helyőrzők
selectPositionType: 'Kérjük válassza ki a pozíció típusát',
// Megerősítő párbeszédpanelek
confirmDeliveryTitle: 'Szállítás megerősítése',
confirmDeliveryMessage: 'Biztosan szeretne konténert szállítani a(z) {positionName} pozícióra?',
confirmCallTitle: 'Hívás megerősítése',
confirmCallMessage: 'Biztosan szeretné meghívni a polcot a(z) {sourcePosition} pozícióról a(z) {targetPosition} pozícióra?',
// Állapot üzenetek
deliveringContainer: 'Konténer {containerCode} szállítása a(z) {currentPosition} pozícióról a(z) {targetPosition} pozícióra...',
deliveryCancelled: 'Szállítás megszakítva',
shelfCalled: 'A(z) {containerCode} polc meghívva a(z) {sourcePosition} pozícióról a(z) {currentPosition} pozícióra',
callCancelled: 'Hívás megszakítva',
// Megjegyzések (referenciához)
refreshList: 'Lista frissítése',
getContainerCount: 'Konténer szám lekérése',
getCurrentPositionInfo: 'Jelenlegi pozíció információ lekérése (currentDeliverPosition-ból)',
targetPositionName: 'Célpozíció neve',
getContainerCode: 'Konténer kód lekérése (a jelenlegi pozíció konténer információjának első konténeréből)',
defaultGeneratedContainerCode: 'Alapértelmezett generált konténer kód',
printDeliveryInfo: 'Szállítási információ nyomtatása',
currentPositionName: 'Jelenlegi pozíció neve',
confirmCallShelf: 'Polc hívás megerősítése',
getCurrentPositionName: 'Jelenlegi pozíció neve lekérése',
getSourcePositionName: 'Forrás pozíció neve lekérése',
printCallInfo: 'Hívási információ nyomtatása',
callShelfInfo: 'Polc hívási információ',
sourcePositionName: 'Forrás pozíció neve',
dialogStyleOptimization: 'Párbeszédpanel stílus optimalizálás',
deliverContainerDialogStyle: 'Konténer szállítási párbeszédpanel stílus',
filterAreaStyle: 'Szűrési terület stílus'
}
}

View File

@@ -1257,6 +1257,7 @@ export default {
supplierManagement:'供应商管理',
materialManagement:'物料管理',
basicPointLocation:'基础点位',
basstandPosition:'台位配送',
//*************** 查询统计*************
queryStatistics:'查询统计',
inventoryDetailQuery:'库存明细查询',
@@ -3713,5 +3714,62 @@ barcodeInformationPrint: ' 条码信息打印 '
outboundAllocated:"出库已分配",
inboundNeedCheck:"入库需盘点",
outboundNeedCheck:"出库需盘点",
},
basstandPosition: {
positionType: '点位类型',
description: '描述',
creator: '创建人',
warehouseId: '仓库ID',
containerInfo: '容器信息',
callShelf: '呼叫料架',
deliverContainer: '配送容器',
positionInfo: '点位信息',
positionName: '点位名称',
positionId: '点位ID',
containerList: '容器列表',
containerCode: '容器编号',
status: '状态',
normal: '正常',
abnormal: '异常',
capacity: '容量',
materialTypes: '物料种类',
operator: '操作人',
createTime: '创建时间',
materialDetails: '物料明细',
container: '容器',
itemsMaterial: '项物料',
materialId: '物料ID',
materialName: '物料名称',
quantity: '数量',
unit: '单位',
noMaterialDetails: '该容器暂无物料明细',
noMaterialInfo: '暂无物料明细信息',
close: '关闭',
selectDeliveryTarget: '选择配送目标点位',
selectTargetPositionForDelivery: '以下是当前没有容器的点位,请选择需要配送容器的目标点位',
selectPositionType: '请选择点位类型',
search: '搜索',
reset: '重置',
positionDesc: '点位描述',
containerStatus: '容器状态',
noContainer: '无容器',
operation: '操作',
deliver: '配送',
selectCallShelfSource: '选择呼叫料架源点位',
selectSourcePositionForCall: '以下是当前有容器的点位,请选择需要呼叫料架的源点位',
hasContainer: '有容器',
call: '呼叫',
containerDetailsInfo: '容器详情信息',
refreshingData: '正在刷新数据...',
confirmDeliveryToPosition: '确认要为点位 {positionName} 配送容器吗?',
deliveryConfirm: '配送确认',
confirm: '确定',
cancel: '取消',
deliveringContainer: '正在将容器 {containerCode} 从点位 {currentPortName} 配送到点位 {targetPortName}...',
deliveryCancelled: '已取消配送',
confirmCallShelfFromPosition: '确认从点位 "{positionName}" 呼叫料架到当前点位吗?',
callConfirm: '呼叫确认',
shelfCalledSuccess: '料架 {containerCode} 已从 {sourcePortName} 呼叫到 {currentPortName}',
callCancelled: '已取消呼叫'
}
}

File diff suppressed because it is too large Load Diff