From 27be485db1df647cdfe856317d8ee0d2b67a68c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8C=AB=E7=8C=ABguowen?= <9290821+guowen-the-cat@user.noreply.gitee.com> Date: Thu, 31 Jul 2025 15:40:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=B0=E4=BD=8D=E9=85=8D=E9=80=81=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E4=B8=8E=E5=85=B6=E6=9D=83=E9=99=90=E5=92=8C=E5=9B=BD?= =?UTF-8?q?=E9=99=85=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BasStandPositionController.java | 241 ++++ ruoyi-ui/src/api/bas/basstandPosition.js | 52 + ruoyi-ui/src/lang/en.js | 92 ++ ruoyi-ui/src/lang/hu.js | 98 +- ruoyi-ui/src/lang/zh.js | 58 + .../src/views/bas/basstandPosition/index.vue | 1007 +++++++++++++++++ 6 files changed, 1545 insertions(+), 3 deletions(-) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/bas/basstandPosition/controller/BasStandPositionController.java create mode 100644 ruoyi-ui/src/api/bas/basstandPosition.js create mode 100644 ruoyi-ui/src/views/bas/basstandPosition/index.vue diff --git a/ruoyi-admin/src/main/java/com/ruoyi/bas/basstandPosition/controller/BasStandPositionController.java b/ruoyi-admin/src/main/java/com/ruoyi/bas/basstandPosition/controller/BasStandPositionController.java new file mode 100644 index 0000000..2a5104b --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/bas/basstandPosition/controller/BasStandPositionController.java @@ -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 allPortList = basProductPortService.selectBasProductPortList(basProductPort); + + // 构建完整的返回结果列表 + List> allResultList = new ArrayList<>(); + + for (BasProductPort port : allPortList) { + Map resultMap = new HashMap<>(); + // 添加点位信息 + resultMap.put("port", port); + + // 根据portName查询容器信息 + BasContainer containerQuery = new BasContainer(); + containerQuery.setPortName(port.getPortName()); + List containerList = basContainerService.selectBasContainerList(containerQuery); + resultMap.put("containers", containerList); + + // 为每个容器查询明细信息 + List> containerWithDetails = new ArrayList<>(); + for (BasContainer container : containerList) { + Map containerMap = new HashMap<>(); + containerMap.put("container", container); + + // 根据containerId查询容器明细 + BasContainerDetails detailsQuery = new BasContainerDetails(); + detailsQuery.setContainerId(container.getContainerId()); + List 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> 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 allPortList = basProductPortService.selectBasProductPortList(basProductPort); + + // 构建无料架点位的返回结果列表 + List> noContainerResultList = new ArrayList<>(); + + for (BasProductPort port : allPortList) { + // 根据portName查询容器信息 + BasContainer containerQuery = new BasContainer(); + containerQuery.setPortName(port.getPortName()); + List containerList = basContainerService.selectBasContainerList(containerQuery); + + // 如果该点位没有容器信息,则添加到结果列表中 + if (containerList == null || containerList.isEmpty()) { + Map 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> 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 allPortList = basProductPortService.selectBasProductPortList(basProductPort); + + // 构建有料架点位的返回结果列表 + List> hasContainerResultList = new ArrayList<>(); + + for (BasProductPort port : allPortList) { + // 根据portName查询容器信息 + BasContainer containerQuery = new BasContainer(); + containerQuery.setPortName(port.getPortName()); + List containerList = basContainerService.selectBasContainerList(containerQuery); + + // 如果该点位有容器信息,则添加到结果列表中 + if (containerList != null && !containerList.isEmpty()) { + Map resultMap = new HashMap<>(); + resultMap.put("port", port); + resultMap.put("containers", containerList); + + // 为每个容器查询明细信息 + List> containerWithDetails = new ArrayList<>(); + for (BasContainer container : containerList) { + Map containerMap = new HashMap<>(); + containerMap.put("container", container); + + // 根据containerId查询容器明细 + BasContainerDetails detailsQuery = new BasContainerDetails(); + detailsQuery.setContainerId(container.getContainerId()); + List 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> 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; + } +} \ No newline at end of file diff --git a/ruoyi-ui/src/api/bas/basstandPosition.js b/ruoyi-ui/src/api/bas/basstandPosition.js new file mode 100644 index 0000000..eb24fac --- /dev/null +++ b/ruoyi-ui/src/api/bas/basstandPosition.js @@ -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' + }) +} diff --git a/ruoyi-ui/src/lang/en.js b/ruoyi-ui/src/lang/en.js index 6dd0659..2e5a6c8 100644 --- a/ruoyi-ui/src/lang/en.js +++ b/ruoyi-ui/src/lang/en.js @@ -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' + }, + } diff --git a/ruoyi-ui/src/lang/hu.js b/ruoyi-ui/src/lang/hu.js index 14dd9fc..f55674a 100644 --- a/ruoyi-ui/src/lang/hu.js +++ b/ruoyi-ui/src/lang/hu.js @@ -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' } } diff --git a/ruoyi-ui/src/lang/zh.js b/ruoyi-ui/src/lang/zh.js index 1598c9a..67ef8c8 100644 --- a/ruoyi-ui/src/lang/zh.js +++ b/ruoyi-ui/src/lang/zh.js @@ -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: '已取消呼叫' } } diff --git a/ruoyi-ui/src/views/bas/basstandPosition/index.vue b/ruoyi-ui/src/views/bas/basstandPosition/index.vue new file mode 100644 index 0000000..57d063b --- /dev/null +++ b/ruoyi-ui/src/views/bas/basstandPosition/index.vue @@ -0,0 +1,1007 @@ + + + + +