From 797292bd319c01f7920b3ab8c6b78a792de31b76 Mon Sep 17 00:00:00 2001 From: 86156 <823267011@qq.com> Date: Mon, 3 Nov 2025 13:16:04 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=BD=95=E5=85=A5?= =?UTF-8?q?=E5=90=88=E5=8D=B7=E5=88=86=E5=8D=B7=E6=B7=BB=E5=8A=A0=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E5=88=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- klp-ui/src/components/CoilSelector/index.vue | 186 ++++++ klp-ui/src/views/wms/coil/merge.vue | 573 +++++++++++++++++ klp-ui/src/views/wms/coil/split.vue | 643 +++++++++++++++++++ 3 files changed, 1402 insertions(+) create mode 100644 klp-ui/src/components/CoilSelector/index.vue create mode 100644 klp-ui/src/views/wms/coil/merge.vue create mode 100644 klp-ui/src/views/wms/coil/split.vue diff --git a/klp-ui/src/components/CoilSelector/index.vue b/klp-ui/src/components/CoilSelector/index.vue new file mode 100644 index 00000000..def9e066 --- /dev/null +++ b/klp-ui/src/components/CoilSelector/index.vue @@ -0,0 +1,186 @@ + + + + + + + + + + + + 搜索 + 重置 + + + + + + + + + + + + + + + 选择 + + + + + + + + + + + + + + + diff --git a/klp-ui/src/views/wms/coil/merge.vue b/klp-ui/src/views/wms/coil/merge.vue new file mode 100644 index 00000000..cd7bcc9b --- /dev/null +++ b/klp-ui/src/views/wms/coil/merge.vue @@ -0,0 +1,573 @@ + + + + + + + 钢卷合卷 + + + 保存合卷 + 取消 + + + + + + + + + 源卷列表 + 添加钢卷 + + + + + + {{ index + 1 }} + + {{ item.currentCoilNo || '待选择' }} + {{ item.weight || '—' }} t + + + + + + 选择钢卷 + + + + + + + + + + + + + + + + + + + 合并 + + + + + + 目标卷信息 + + + + 新钢卷 + + + + + + + + + + + + + + + + + + + + + + + + + + + 合卷规则 + + + 同一钢种才可合卷 + 厚度差异不超过±0.05mm + 宽度必须完全一致 + 目标卷重量为源卷总和 + + + + + + + + + + + + + + diff --git a/klp-ui/src/views/wms/coil/split.vue b/klp-ui/src/views/wms/coil/split.vue new file mode 100644 index 00000000..dddf9615 --- /dev/null +++ b/klp-ui/src/views/wms/coil/split.vue @@ -0,0 +1,643 @@ + + + + + + + 钢卷分卷 + + + 保存分卷 + 取消 + + + + + + + + + 母卷信息 + 选择母卷 + + + + + {{ motherCoil.currentCoilNo || '—' }} + + + + 钢种: + {{ motherCoil.grade || '—' }} + + + 厚度: + {{ motherCoil.thickness || '—' }} mm + + + 宽度: + {{ motherCoil.width || '—' }} mm + + + 重量: + {{ motherCoil.weight || '—' }} t + + + + + + + + + + + + + + + + + 分割 + + + + + + + 子卷列表 + 添加子卷 + + + + + + {{ index + 1 }} + + + + + + + + + + + + + + + + + + + + + + 子卷数量: + {{ splitList.length }} + + + 总重量: + + {{ totalWeight.toFixed(2) }} t + + + + 剩余重量: + + {{ remainWeight.toFixed(2) }} t + + + + + + + + + + + + + + + From 325566e118eb7b981a18e90739d5062949c8690f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A0=82=E7=B3=96?= Date: Mon, 3 Nov 2025 14:20:58 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat(wms):=20=E6=B7=BB=E5=8A=A0=E5=AE=9E?= =?UTF-8?q?=E9=99=85=E5=BA=93=E5=8C=BA=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=8F=8A=E7=9B=B8=E5=85=B3=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增实际库区API接口文件 - 添加实际库区选择组件ActualWarehouseSelect - 在钢卷管理页面中集成实际库区字段 - 创建实际库区管理页面实现CRUD功能 - 修改钢卷列表查询接口添加dataType参数 --- klp-ui/src/api/wms/actualWarehouse.js | 44 +++ .../ActualWarehouseSelect/index.vue | 120 ++++++ .../views/wms/coil/panels/DrillDownTable.vue | 2 +- klp-ui/src/views/wms/coil/panels/base.vue | 22 +- klp-ui/src/views/wms/warehouse/real.vue | 370 ++++++++++++++++++ 5 files changed, 553 insertions(+), 5 deletions(-) create mode 100644 klp-ui/src/api/wms/actualWarehouse.js create mode 100644 klp-ui/src/components/KLPService/ActualWarehouseSelect/index.vue create mode 100644 klp-ui/src/views/wms/warehouse/real.vue diff --git a/klp-ui/src/api/wms/actualWarehouse.js b/klp-ui/src/api/wms/actualWarehouse.js new file mode 100644 index 00000000..b9edb67c --- /dev/null +++ b/klp-ui/src/api/wms/actualWarehouse.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询实际库区/库位自关联列表 +export function listActualWarehouse(query) { + return request({ + url: '/wms/actualWarehouse/list', + method: 'get', + params: query + }) +} + +// 查询实际库区/库位自关联详细 +export function getActualWarehouse(actualWarehouseId) { + return request({ + url: '/wms/actualWarehouse/' + actualWarehouseId, + method: 'get' + }) +} + +// 新增实际库区/库位自关联 +export function addActualWarehouse(data) { + return request({ + url: '/wms/actualWarehouse', + method: 'post', + data: data + }) +} + +// 修改实际库区/库位自关联 +export function updateActualWarehouse(data) { + return request({ + url: '/wms/actualWarehouse', + method: 'put', + data: data + }) +} + +// 删除实际库区/库位自关联 +export function delActualWarehouse(actualWarehouseId) { + return request({ + url: '/wms/actualWarehouse/' + actualWarehouseId, + method: 'delete' + }) +} diff --git a/klp-ui/src/components/KLPService/ActualWarehouseSelect/index.vue b/klp-ui/src/components/KLPService/ActualWarehouseSelect/index.vue new file mode 100644 index 00000000..07a9ad3d --- /dev/null +++ b/klp-ui/src/components/KLPService/ActualWarehouseSelect/index.vue @@ -0,0 +1,120 @@ + + + + + {{ item.actualWarehouseName }} + + + + + + + + diff --git a/klp-ui/src/views/wms/coil/panels/DrillDownTable.vue b/klp-ui/src/views/wms/coil/panels/DrillDownTable.vue index 501e2da5..ddabad39 100644 --- a/klp-ui/src/views/wms/coil/panels/DrillDownTable.vue +++ b/klp-ui/src/views/wms/coil/panels/DrillDownTable.vue @@ -147,7 +147,7 @@ export default { }; // 调用API获取数据 - listMaterialCoil(params).then(res => { + listMaterialCoil({ ...params, dataType: 1 }).then(res => { this.list = res.rows || []; this.total = res.total || 0; this.loading = false; diff --git a/klp-ui/src/views/wms/coil/panels/base.vue b/klp-ui/src/views/wms/coil/panels/base.vue index 1bd80fd2..6672cf50 100644 --- a/klp-ui/src/views/wms/coil/panels/base.vue +++ b/klp-ui/src/views/wms/coil/panels/base.vue @@ -18,6 +18,9 @@ + + + @@ -68,7 +71,8 @@ - + + {{ scope.row.itemType == 'product' ? '成品' : '原料' }} @@ -94,6 +98,8 @@ --> + + @@ -140,6 +146,9 @@ + + + @@ -200,6 +209,7 @@ import RawMaterialInfo from "@/components/KLPService/Renderer/RawMaterialInfo"; import CoilTraceResult from "./CoilTraceResult.vue"; // 路径根据实际存放位置调整 import LabelRender from './LabelRender/index.vue' import MaterialSelect from "@/components/KLPService/MaterialSelect"; +import ActualWarehouseSelect from "@/components/KLPService/ActualWarehouseSelect"; import { findItemWithBom } from "@/store/modules/category"; export default { @@ -214,7 +224,8 @@ export default { RawMaterialInfo, BomInfoMini, CoilTraceResult, - LabelRender + LabelRender, + ActualWarehouseSelect }, dicts: ['product_coil_status'], props: { @@ -278,6 +289,7 @@ export default { supplierCoilNo: undefined, warehouseId: undefined, nextWarehouseId: undefined, + actualWarehouseId: undefined, qrcodeRecordId: undefined, team: undefined, hasMergeSplit: undefined, @@ -409,6 +421,7 @@ export default { warehouseId: undefined, nextWarehouseId: undefined, qrcodeRecordId: undefined, + actualWarehouseId: undefined, team: undefined, hasMergeSplit: undefined, parentCoilNos: undefined, @@ -532,8 +545,9 @@ export default { '入场钢卷号': item.enterCoilNo || '', '当前钢卷号': item.currentCoilNo || '', '厂家原料卷号': item.supplierCoilNo || '', - '库区': item.itemType === 'product' ? '成品' : '原料', - '仓库': item.warehouseName || '', + '物料类型': item.itemType === 'product' ? '成品' : '原料', + '仓区': item.warehouseName || '', + '实际库区': item.actualWarehouseName || '', '物品': findItemWithBom(item.itemType, item.itemId)?.itemName || '', '数据类型': item.dataType === 0 ? '历史数据' : '当前数据', '班组': item.team || '', diff --git a/klp-ui/src/views/wms/warehouse/real.vue b/klp-ui/src/views/wms/warehouse/real.vue new file mode 100644 index 00000000..938f816a --- /dev/null +++ b/klp-ui/src/views/wms/warehouse/real.vue @@ -0,0 +1,370 @@ + + + + + + + + + + + + + + + + + + 搜索 + 重置 + + + + + + 新增 + + + 展开/折叠 + + + + + + + + + + + + + {{ scope.row.isEnabled == 1 ? '启用' : '禁用' }} + + + + + + 修改 + + 删除 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From ffbe9e181aa6b0c11a665554b519c48214e62312 Mon Sep 17 00:00:00 2001 From: 86156 <823267011@qq.com> Date: Mon, 3 Nov 2025 17:03:03 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0web=E7=9A=84=E5=90=88?= =?UTF-8?q?=E5=8D=B7=E5=88=86=E5=8D=B7=E5=90=88=E5=B9=B6=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- klp-ui/src/api/wms/coil.js | 20 +- klp-ui/src/api/wms/pendingAction.js | 86 ++ klp-ui/src/views/wms/coil/actflow.vue | 538 +++++++++++ klp-ui/src/views/wms/coil/merge.vue | 707 ++++++++++++--- klp-ui/src/views/wms/coil/split.vue | 545 ++++++++--- klp-ui/src/views/wms/coil/typing.vue | 843 ++++++++++++++++++ .../WmsCoilPendingActionController.java | 137 +++ .../com/klp/domain/WmsCoilPendingAction.java | 100 +++ .../klp/domain/bo/WmsCoilPendingActionBo.java | 99 ++ .../klp/domain/vo/WmsCoilPendingActionVo.java | 148 +++ .../mapper/WmsCoilPendingActionMapper.java | 16 + .../service/IWmsCoilPendingActionService.java | 69 ++ .../impl/WmsCoilPendingActionServiceImpl.java | 180 ++++ .../impl/WmsMaterialCoilServiceImpl.java | 35 +- .../mapper/wms/WmsCoilPendingActionMapper.xml | 31 + 15 files changed, 3307 insertions(+), 247 deletions(-) create mode 100644 klp-ui/src/api/wms/pendingAction.js create mode 100644 klp-ui/src/views/wms/coil/typing.vue create mode 100644 klp-wms/src/main/java/com/klp/controller/WmsCoilPendingActionController.java create mode 100644 klp-wms/src/main/java/com/klp/domain/WmsCoilPendingAction.java create mode 100644 klp-wms/src/main/java/com/klp/domain/bo/WmsCoilPendingActionBo.java create mode 100644 klp-wms/src/main/java/com/klp/domain/vo/WmsCoilPendingActionVo.java create mode 100644 klp-wms/src/main/java/com/klp/mapper/WmsCoilPendingActionMapper.java create mode 100644 klp-wms/src/main/java/com/klp/service/IWmsCoilPendingActionService.java create mode 100644 klp-wms/src/main/java/com/klp/service/impl/WmsCoilPendingActionServiceImpl.java create mode 100644 klp-wms/src/main/resources/mapper/wms/WmsCoilPendingActionMapper.xml diff --git a/klp-ui/src/api/wms/coil.js b/klp-ui/src/api/wms/coil.js index 38ce3500..4168a1e7 100644 --- a/klp-ui/src/api/wms/coil.js +++ b/klp-ui/src/api/wms/coil.js @@ -14,7 +14,7 @@ export function exportMaterialCoil(query) { url: '/wms/materialCoil/export', method: 'get', params: query - }) + }) } export function getMaterialCoil(CoilMaterialId) { @@ -83,3 +83,21 @@ export function getMaterialCoilDistributionByType(query) { params: query }) } + +// 钢卷分卷 +export function splitMaterialCoil(data) { + return request({ + url: '/wms/materialCoil', + method: 'put', + data: data + }) +} + +// 钢卷合卷 +export function mergeMaterialCoil(data) { + return request({ + url: '/wms/materialCoil', + method: 'put', + data: data + }) +} diff --git a/klp-ui/src/api/wms/pendingAction.js b/klp-ui/src/api/wms/pendingAction.js new file mode 100644 index 00000000..8b2d4eaf --- /dev/null +++ b/klp-ui/src/api/wms/pendingAction.js @@ -0,0 +1,86 @@ +import request from '@/utils/request' + +// 查询钢卷待操作列表 +export function listPendingAction(query) { + return request({ + url: '/wms/coilPendingAction/list', + method: 'get', + params: query + }) +} + +// 查询钢卷待操作详细 +export function getPendingAction(actionId) { + return request({ + url: '/wms/coilPendingAction/' + actionId, + method: 'get' + }) +} + +// 新增钢卷待操作 +export function addPendingAction(data) { + return request({ + url: '/wms/coilPendingAction', + method: 'post', + data: data + }) +} + +// 修改钢卷待操作 +export function updatePendingAction(data) { + return request({ + url: '/wms/coilPendingAction', + method: 'put', + data: data + }) +} + +// 删除钢卷待操作 +export function delPendingAction(actionId) { + return request({ + url: '/wms/coilPendingAction/' + actionId, + method: 'delete' + }) +} + +// 更新操作状态 +export function updateStatus(actionId, status) { + return request({ + url: `/wms/coilPendingAction/status/${actionId}/${status}`, + method: 'put' + }) +} + +// 开始处理操作 +export function startProcess(actionId) { + return request({ + url: `/wms/coilPendingAction/start/${actionId}`, + method: 'put' + }) +} + +// 完成操作 +export function completeAction(actionId) { + return request({ + url: `/wms/coilPendingAction/complete/${actionId}`, + method: 'put' + }) +} + +// 取消操作 +export function cancelAction(actionId) { + return request({ + url: `/wms/coilPendingAction/cancel/${actionId}`, + method: 'put' + }) +} + +// 导出钢卷待操作 +export function exportPendingAction(query) { + return request({ + url: '/wms/coilPendingAction/export', + method: 'post', + params: query + }) +} + diff --git a/klp-ui/src/views/wms/coil/actflow.vue b/klp-ui/src/views/wms/coil/actflow.vue index e69de29b..4dbc0c58 100644 --- a/klp-ui/src/views/wms/coil/actflow.vue +++ b/klp-ui/src/views/wms/coil/actflow.vue @@ -0,0 +1,538 @@ + + + + + + + + + + + + + + 搜索 + 重置 + + + + + + + 新增 + + + 删除 + + + 刷新 + + + + + + + + + + + + {{ scope.row.currentCoilNo }} + + + + + + + + + + + + 待处理 + 处理中 + 已完成 + 已取消 + + + + + + 普通 + 重要 + 紧急 + + + + + + + 扫码 + + + 手动 + + + + + + + {{ parseTime(scope.row.scanTime, '{y}-{m}-{d} {h}:{i}') }} + + + + + + + + {{ parseTime(scope.row.processTime, '{y}-{m}-{d} {h}:{i}') }} + + + + + + + + + + 操作 + 删除 + + + + 继续 + 取消 + + + + 删除 + + + + + + + + + + + + + + 选择钢卷 + + + {{ form.currentCoilNo }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/klp-ui/src/views/wms/coil/merge.vue b/klp-ui/src/views/wms/coil/merge.vue index cd7bcc9b..dc30c54e 100644 --- a/klp-ui/src/views/wms/coil/merge.vue +++ b/klp-ui/src/views/wms/coil/merge.vue @@ -7,8 +7,8 @@ 钢卷合卷 - 保存合卷 - 取消 + 保存合卷 + {{ readonly ? '返回' : '取消' }} @@ -18,29 +18,69 @@ 源卷列表 - 添加钢卷 + 添加钢卷 - + {{ index + 1 }} {{ item.currentCoilNo || '待选择' }} - {{ item.weight || '—' }} t - - + + + 入场钢卷号: + {{ item.enterCoilNo || '—' }} + + + 当前库区: + {{ item.warehouseName || '未分配' }} + + + 物料名称: + {{ item.materialName || item.productName || '—' }} + + + + + + 待合卷钢卷列表 + + + {{ pending.currentCoilNo }} + + 扫码时间: + {{ formatTime(pending.scanTime) }} + + + + + + 暂无其他待合卷钢卷 + + + + + 选择钢卷 + 未选择钢卷 @@ -51,14 +91,14 @@ - @@ -83,31 +123,68 @@ - + - - + + - - + + + + + + + + clearable + :disabled="readonly" + > + + - - + + + 吨 + - - + + + 吨 + + + + + + @@ -120,10 +197,9 @@ 合卷规则 - 同一钢种才可合卷 - 厚度差异不超过±0.05mm - 宽度必须完全一致 - 目标卷重量为源卷总和 + 至少需要2个源卷 + 所有源卷的物品类型和物品ID应保持一致 + 请确保录入正确的新钢卷号和班组信息 @@ -139,6 +215,10 @@ + + diff --git a/klp-wms/src/main/java/com/klp/controller/WmsCoilPendingActionController.java b/klp-wms/src/main/java/com/klp/controller/WmsCoilPendingActionController.java new file mode 100644 index 00000000..b066c20b --- /dev/null +++ b/klp-wms/src/main/java/com/klp/controller/WmsCoilPendingActionController.java @@ -0,0 +1,137 @@ +package com.klp.controller; + +import java.util.List; +import java.util.Arrays; + +import lombok.RequiredArgsConstructor; +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.*; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import com.klp.common.annotation.RepeatSubmit; +import com.klp.common.annotation.Log; +import com.klp.common.core.controller.BaseController; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.domain.R; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import com.klp.common.enums.BusinessType; +import com.klp.common.utils.poi.ExcelUtil; +import com.klp.domain.vo.WmsCoilPendingActionVo; +import com.klp.domain.bo.WmsCoilPendingActionBo; +import com.klp.service.IWmsCoilPendingActionService; +import com.klp.common.core.page.TableDataInfo; + +/** + * 钢卷待操作 + * + * @author Joshi + * @date 2025-11-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/wms/coilPendingAction") +public class WmsCoilPendingActionController extends BaseController { + + private final IWmsCoilPendingActionService iWmsCoilPendingActionService; + + /** + * 查询钢卷待操作列表 + */ + @GetMapping("/list") + public TableDataInfo list(WmsCoilPendingActionBo bo, PageQuery pageQuery) { + return iWmsCoilPendingActionService.queryPageList(bo, pageQuery); + } + + /** + * 导出钢卷待操作列表 + */ + @Log(title = "钢卷待操作", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(WmsCoilPendingActionBo bo, HttpServletResponse response) { + List list = iWmsCoilPendingActionService.queryList(bo); + ExcelUtil.exportExcel(list, "钢卷待操作", WmsCoilPendingActionVo.class, response); + } + + /** + * 获取钢卷待操作详细信息 + * + * @param actionId 主键 + */ + @GetMapping("/{actionId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long actionId) { + return R.ok(iWmsCoilPendingActionService.queryById(actionId)); + } + + /** + * 新增钢卷待操作 + */ + @Log(title = "钢卷待操作", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody WmsCoilPendingActionBo bo) { + return toAjax(iWmsCoilPendingActionService.insertByBo(bo)); + } + + /** + * 修改钢卷待操作 + */ + @Log(title = "钢卷待操作", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody WmsCoilPendingActionBo bo) { + return toAjax(iWmsCoilPendingActionService.updateByBo(bo)); + } + + /** + * 删除钢卷待操作 + * + * @param actionIds 主键串 + */ + @Log(title = "钢卷待操作", businessType = BusinessType.DELETE) + @DeleteMapping("/{actionIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable("actionIds") Long[] actionIds) { + return toAjax(iWmsCoilPendingActionService.deleteWithValidByIds(Arrays.asList(actionIds), true)); + } + + /** + * 更新操作状态 + */ + @Log(title = "钢卷待操作", businessType = BusinessType.UPDATE) + @PutMapping("/status/{actionId}/{status}") + public R updateStatus(@PathVariable("actionId") Long actionId, + @PathVariable("status") Integer status) { + return toAjax(iWmsCoilPendingActionService.updateStatus(actionId, status)); + } + + /** + * 开始处理操作 + */ + @Log(title = "钢卷待操作", businessType = BusinessType.UPDATE) + @PutMapping("/start/{actionId}") + public R startProcess(@PathVariable("actionId") Long actionId) { + return toAjax(iWmsCoilPendingActionService.startProcess(actionId)); + } + + /** + * 完成操作 + */ + @Log(title = "钢卷待操作", businessType = BusinessType.UPDATE) + @PutMapping("/complete/{actionId}") + public R completeAction(@PathVariable("actionId") Long actionId) { + return toAjax(iWmsCoilPendingActionService.completeAction(actionId)); + } + + /** + * 取消操作 + */ + @Log(title = "钢卷待操作", businessType = BusinessType.UPDATE) + @PutMapping("/cancel/{actionId}") + public R cancelAction(@PathVariable("actionId") Long actionId) { + return toAjax(iWmsCoilPendingActionService.cancelAction(actionId)); + } +} + diff --git a/klp-wms/src/main/java/com/klp/domain/WmsCoilPendingAction.java b/klp-wms/src/main/java/com/klp/domain/WmsCoilPendingAction.java new file mode 100644 index 00000000..e0a10af0 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/WmsCoilPendingAction.java @@ -0,0 +1,100 @@ +package com.klp.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 钢卷待操作对象 wms_coil_pending_action + * + * @author Joshi + * @date 2025-11-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("wms_coil_pending_action") +public class WmsCoilPendingAction extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "action_id", type = IdType.AUTO) + private Long actionId; + + /** + * 关联的钢卷ID + */ + private Long coilId; + + /** + * 当前钢卷号 + */ + private String currentCoilNo; + + /** + * 操作类型(1=分卷,2=合卷,3=更新) + */ + private Integer actionType; + + /** + * 操作状态(0=待处理,1=处理中,2=已完成,3=已取消) + */ + private Integer actionStatus; + + /** + * 扫码时间 + */ + private Date scanTime; + + /** + * 扫码设备(移动端设备信息) + */ + private String scanDevice; + + /** + * 优先级(0=普通,1=重要,2=紧急) + */ + private Integer priority; + + /** + * 来源类型(scan=扫码,manual=手动创建) + */ + private String sourceType; + + /** + * 所在库区ID + */ + private Long warehouseId; + + /** + * 操作人ID + */ + private Long operatorId; + + /** + * 操作人姓名 + */ + private String operatorName; + + /** + * 处理时间 + */ + private Date processTime; + + /** + * 完成时间 + */ + private Date completeTime; + + /** + * 删除标志(0=正常,1=已删除) + */ + @TableLogic + private Integer delFlag; +} + diff --git a/klp-wms/src/main/java/com/klp/domain/bo/WmsCoilPendingActionBo.java b/klp-wms/src/main/java/com/klp/domain/bo/WmsCoilPendingActionBo.java new file mode 100644 index 00000000..f6f1cbf6 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/bo/WmsCoilPendingActionBo.java @@ -0,0 +1,99 @@ +package com.klp.domain.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.*; +import java.util.Date; +import com.klp.common.core.domain.BaseEntity; + +/** + * 钢卷待操作业务对象 wms_coil_pending_action + * + * @author Joshi + * @date 2025-11-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class WmsCoilPendingActionBo extends BaseEntity { + + /** + * 主键ID + */ + @NotNull(message = "主键ID不能为空", groups = { EditGroup.class }) + private Long actionId; + + /** + * 关联的钢卷ID + */ + @NotNull(message = "关联的钢卷ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long coilId; + + /** + * 当前钢卷号 + */ + @NotBlank(message = "当前钢卷号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String currentCoilNo; + + /** + * 操作类型(1=分卷,2=合卷,3=更新) + */ + @NotNull(message = "操作类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer actionType; + + /** + * 操作状态(0=待处理,1=处理中,2=已完成,3=已取消) + */ + private Integer actionStatus; + + /** + * 扫码时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX", timezone = "GMT+8") + private Date scanTime; + + /** + * 扫码设备(移动端设备信息) + */ + private String scanDevice; + + /** + * 优先级(0=普通,1=重要,2=紧急) + */ + private Integer priority; + + /** + * 来源类型(scan=扫码,manual=手动创建) + */ + private String sourceType; + + /** + * 所在库区ID + */ + private Long warehouseId; + + /** + * 操作人ID + */ + private Long operatorId; + + /** + * 操作人姓名 + */ + private String operatorName; + + /** + * 处理时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX", timezone = "GMT+8") + private Date processTime; + + /** + * 完成时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX", timezone = "GMT+8") + private Date completeTime; +} + diff --git a/klp-wms/src/main/java/com/klp/domain/vo/WmsCoilPendingActionVo.java b/klp-wms/src/main/java/com/klp/domain/vo/WmsCoilPendingActionVo.java new file mode 100644 index 00000000..17562a5a --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/vo/WmsCoilPendingActionVo.java @@ -0,0 +1,148 @@ +package com.klp.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.klp.common.annotation.ExcelDictFormat; +import com.klp.common.convert.ExcelDictConvert; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 钢卷待操作视图对象 wms_coil_pending_action + * + * @author Joshi + * @date 2025-11-03 + */ +@Data +@ExcelIgnoreUnannotated +public class WmsCoilPendingActionVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @ExcelProperty(value = "主键ID") + private Long actionId; + + /** + * 关联的钢卷ID + */ + @ExcelProperty(value = "钢卷ID") + private Long coilId; + + /** + * 当前钢卷号 + */ + @ExcelProperty(value = "钢卷号") + private String currentCoilNo; + + /** + * 操作类型(1=分卷,2=合卷,3=更新) + */ + @ExcelProperty(value = "操作类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "wms_coil_action_type") + private Integer actionType; + + /** + * 操作状态(0=待处理,1=处理中,2=已完成,3=已取消) + */ + @ExcelProperty(value = "操作状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "wms_action_status") + private Integer actionStatus; + + /** + * 扫码时间 + */ + @ExcelProperty(value = "扫码时间") + private Date scanTime; + + /** + * 扫码设备 + */ + @ExcelProperty(value = "扫码设备") + private String scanDevice; + + /** + * 优先级(0=普通,1=重要,2=紧急) + */ + @ExcelProperty(value = "优先级", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "wms_action_priority") + private Integer priority; + + /** + * 来源类型 + */ + @ExcelProperty(value = "来源类型") + private String sourceType; + + /** + * 所在库区ID + */ + private Long warehouseId; + + /** + * 库区名称 + */ + @ExcelProperty(value = "库区") + private String warehouseName; + + /** + * 操作人ID + */ + private Long operatorId; + + /** + * 操作人姓名 + */ + @ExcelProperty(value = "操作人") + private String operatorName; + + /** + * 处理时间 + */ + @ExcelProperty(value = "处理时间") + private Date processTime; + + /** + * 完成时间 + */ + @ExcelProperty(value = "完成时间") + private Date completeTime; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + // 钢卷相关信息(关联查询) + /** + * 钢种 + */ + private String grade; + + /** + * 厚度 + */ + private Double thickness; + + /** + * 宽度 + */ + private Double width; + + /** + * 重量 + */ + private Double weight; +} + diff --git a/klp-wms/src/main/java/com/klp/mapper/WmsCoilPendingActionMapper.java b/klp-wms/src/main/java/com/klp/mapper/WmsCoilPendingActionMapper.java new file mode 100644 index 00000000..effe8507 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/mapper/WmsCoilPendingActionMapper.java @@ -0,0 +1,16 @@ +package com.klp.mapper; + +import com.klp.common.core.mapper.BaseMapperPlus; +import com.klp.domain.WmsCoilPendingAction; +import com.klp.domain.vo.WmsCoilPendingActionVo; + +/** + * 钢卷待操作Mapper接口 + * + * @author Joshi + * @date 2025-11-03 + */ +public interface WmsCoilPendingActionMapper extends BaseMapperPlus { + +} + diff --git a/klp-wms/src/main/java/com/klp/service/IWmsCoilPendingActionService.java b/klp-wms/src/main/java/com/klp/service/IWmsCoilPendingActionService.java new file mode 100644 index 00000000..528ef962 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/service/IWmsCoilPendingActionService.java @@ -0,0 +1,69 @@ +package com.klp.service; + +import com.klp.domain.vo.WmsCoilPendingActionVo; +import com.klp.domain.bo.WmsCoilPendingActionBo; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; + +import java.util.Collection; +import java.util.List; + +/** + * 钢卷待操作Service接口 + * + * @author Joshi + * @date 2025-11-03 + */ +public interface IWmsCoilPendingActionService { + + /** + * 查询钢卷待操作 + */ + WmsCoilPendingActionVo queryById(Long actionId); + + /** + * 查询钢卷待操作列表 + */ + TableDataInfo queryPageList(WmsCoilPendingActionBo bo, PageQuery pageQuery); + + /** + * 查询钢卷待操作列表 + */ + List queryList(WmsCoilPendingActionBo bo); + + /** + * 新增钢卷待操作 + */ + Boolean insertByBo(WmsCoilPendingActionBo bo); + + /** + * 修改钢卷待操作 + */ + Boolean updateByBo(WmsCoilPendingActionBo bo); + + /** + * 校验并批量删除钢卷待操作信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 更新操作状态 + */ + Boolean updateStatus(Long actionId, Integer status); + + /** + * 开始处理操作 + */ + Boolean startProcess(Long actionId); + + /** + * 完成操作 + */ + Boolean completeAction(Long actionId); + + /** + * 取消操作 + */ + Boolean cancelAction(Long actionId); +} + diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsCoilPendingActionServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsCoilPendingActionServiceImpl.java new file mode 100644 index 00000000..46f01194 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsCoilPendingActionServiceImpl.java @@ -0,0 +1,180 @@ +package com.klp.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.utils.StringUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.klp.common.helper.LoginHelper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import com.klp.domain.bo.WmsCoilPendingActionBo; +import com.klp.domain.vo.WmsCoilPendingActionVo; +import com.klp.domain.WmsCoilPendingAction; +import com.klp.mapper.WmsCoilPendingActionMapper; +import com.klp.service.IWmsCoilPendingActionService; + +import java.util.List; +import java.util.Collection; +import java.util.Date; + +/** + * 钢卷待操作Service业务层处理 + * + * @author Joshi + * @date 2025-11-03 + */ +@RequiredArgsConstructor +@Service +public class WmsCoilPendingActionServiceImpl implements IWmsCoilPendingActionService { + + private final WmsCoilPendingActionMapper baseMapper; + + /** + * 查询钢卷待操作 + */ + @Override + public WmsCoilPendingActionVo queryById(Long actionId){ + return baseMapper.selectVoById(actionId); + } + + /** + * 查询钢卷待操作列表 + */ + @Override + public TableDataInfo queryPageList(WmsCoilPendingActionBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询钢卷待操作列表 + */ + @Override + public List queryList(WmsCoilPendingActionBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(WmsCoilPendingActionBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getCoilId() != null, WmsCoilPendingAction::getCoilId, bo.getCoilId()); + lqw.like(StringUtils.isNotBlank(bo.getCurrentCoilNo()), WmsCoilPendingAction::getCurrentCoilNo, bo.getCurrentCoilNo()); + lqw.eq(bo.getActionType() != null, WmsCoilPendingAction::getActionType, bo.getActionType()); + lqw.eq(bo.getActionStatus() != null, WmsCoilPendingAction::getActionStatus, bo.getActionStatus()); + lqw.eq(bo.getWarehouseId() != null, WmsCoilPendingAction::getWarehouseId, bo.getWarehouseId()); + lqw.eq(bo.getPriority() != null, WmsCoilPendingAction::getPriority, bo.getPriority()); + lqw.like(StringUtils.isNotBlank(bo.getSourceType()), WmsCoilPendingAction::getSourceType, bo.getSourceType()); + lqw.orderByDesc(WmsCoilPendingAction::getPriority); + lqw.orderByDesc(WmsCoilPendingAction::getScanTime); + return lqw; + } + + /** + * 新增钢卷待操作 + */ + @Override + public Boolean insertByBo(WmsCoilPendingActionBo bo) { + WmsCoilPendingAction add = BeanUtil.toBean(bo, WmsCoilPendingAction.class); + validEntityBeforeSave(add); + // 设置默认值 + if (add.getActionStatus() == null) { + add.setActionStatus(0); // 默认待处理 + } + if (StringUtils.isBlank(add.getSourceType())) { + add.setSourceType("manual"); // 默认手动创建 + } + if (add.getScanTime() == null && "scan".equals(add.getSourceType())) { + add.setScanTime(new Date()); + } + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setActionId(add.getActionId()); + } + return flag; + } + + /** + * 修改钢卷待操作 + */ + @Override + public Boolean updateByBo(WmsCoilPendingActionBo bo) { + WmsCoilPendingAction update = BeanUtil.toBean(bo, WmsCoilPendingAction.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(WmsCoilPendingAction entity){ + // TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除钢卷待操作 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + // TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + /** + * 更新操作状态 + */ + @Override + public Boolean updateStatus(Long actionId, Integer status) { + WmsCoilPendingAction action = new WmsCoilPendingAction(); + action.setActionId(actionId); + action.setActionStatus(status); + return baseMapper.updateById(action) > 0; + } + + /** + * 开始处理操作 + */ + @Override + public Boolean startProcess(Long actionId) { + WmsCoilPendingAction action = new WmsCoilPendingAction(); + action.setActionId(actionId); + action.setActionStatus(1); // 处理中 + action.setProcessTime(new Date()); + try { + action.setOperatorId(LoginHelper.getUserId()); + action.setOperatorName(LoginHelper.getUsername()); + } catch (Exception e) { + // 如果获取登录用户失败,不影响主流程 + } + return baseMapper.updateById(action) > 0; + } + + /** + * 完成操作 + */ + @Override + public Boolean completeAction(Long actionId) { + WmsCoilPendingAction action = new WmsCoilPendingAction(); + action.setActionId(actionId); + action.setActionStatus(2); // 已完成 + action.setCompleteTime(new Date()); + return baseMapper.updateById(action) > 0; + } + + /** + * 取消操作 + */ + @Override + public Boolean cancelAction(Long actionId) { + WmsCoilPendingAction action = new WmsCoilPendingAction(); + action.setActionId(actionId); + action.setActionStatus(3); // 已取消 + return baseMapper.updateById(action) > 0; + } +} + diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java index 36b5de5e..0b77e9b6 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java @@ -230,7 +230,8 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { contentMap.put("enter_coil_no", bo.getEnterCoilNo()); // 入场钢卷号(唯一不变) contentMap.put("current_coil_no", currentCoilNo); // 当前钢卷号(可变) - contentMap.put("coil_id", "null"); // 钢卷ID(新增时暂时为null,插入后更新) + contentMap.put("coil_id", "null"); // 初始钢卷ID(新增时暂时为null,插入后更新) + contentMap.put("current_coil_id", "null"); // 当前有效的钢卷ID(新增时暂时为null,插入后更新) // 创建steps数组 List> steps = new ArrayList<>(); @@ -399,15 +400,17 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { if (newCoil.getItemId() == null) { newCoil.setItemId(oldCoil.getItemId()); } + // 确保warehouseId有值(如果前端没传,使用原值) + if (newCoil.getWarehouseId() == null) { + newCoil.setWarehouseId(oldCoil.getWarehouseId()); + } validEntityBeforeSave(newCoil); boolean flag = baseMapper.insert(newCoil) > 0; if (flag) { bo.setCoilId(newCoil.getCoilId()); - // 如果生成了新二维码,更新二维码中的coilId - if (warehouseChanged) { - updateQrcodeCoilId(qrcodeRecordId, newCoil.getCoilId()); - } + // 无论库区是否变化,都需要更新二维码中的current_coil_id + updateQrcodeCoilId(qrcodeRecordId, newCoil.getCoilId()); } return flag; } @@ -430,7 +433,8 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { contentMap.put("enter_coil_no", oldCoil.getEnterCoilNo()); // 入场钢卷号(始终不变) contentMap.put("current_coil_no", currentCoilNo); // 当前钢卷号 - contentMap.put("coil_id", "null"); // 钢卷ID(更新时暂时为null,插入后更新) + contentMap.put("coil_id", String.valueOf(oldCoil.getCoilId())); // 初始钢卷ID(记录最初的ID) + contentMap.put("current_coil_id", "null"); // 当前钢卷ID(更新时暂时为null,插入后更新) // 复制原钢卷的历史steps List> steps = new ArrayList<>(); @@ -630,7 +634,8 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { Map contentMap = new HashMap<>(); contentMap.put("enter_coil_no", oldCoil.getEnterCoilNo()); contentMap.put("current_coil_no", newCoilBo.getCurrentCoilNo()); - contentMap.put("coil_id", "null"); // 钢卷ID(分卷时暂时为null,插入后更新) + contentMap.put("coil_id", String.valueOf(oldCoil.getCoilId())); // 初始钢卷ID(记录原钢卷的ID) + contentMap.put("current_coil_id", "null"); // 当前钢卷ID(分卷时暂时为null,插入后更新) // 复制原钢卷的历史steps List> steps = new ArrayList<>(); @@ -700,7 +705,8 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { } contentMap.put("enter_coil_no", enterCoilNo); contentMap.put("current_coil_no", mergedCoilBo.getCurrentCoilNo()); - contentMap.put("coil_id", "null"); // 钢卷ID(合卷时暂时为null,插入后更新) + contentMap.put("coil_id", "null"); // 初始钢卷ID(合卷时为null) + contentMap.put("current_coil_id", "null"); // 当前钢卷ID(合卷时暂时为null,插入后更新) // 合并所有参与合卷的原始钢卷的历史steps List> steps = new ArrayList<>(); @@ -790,8 +796,13 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { ObjectMapper objectMapper = new ObjectMapper(); Map contentMap = objectMapper.readValue(record.getContent(), Map.class); - // 更新coilId - contentMap.put("coil_id", String.valueOf(coilId)); + // 如果是第一次设置coilId(从"null"变为实际ID),则同时设置coil_id和current_coil_id + if ("null".equals(contentMap.get("coil_id"))) { + contentMap.put("coil_id", String.valueOf(coilId)); // 初始ID,不再改变 + } + + // 始终更新current_coil_id为最新的钢卷ID + contentMap.put("current_coil_id", String.valueOf(coilId)); // 更新二维码记录 String newContentJson = objectMapper.writeValueAsString(contentMap); @@ -854,6 +865,10 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { // 更新当前钢卷号到最外层(方便快速查看) contentMap.put("current_coil_no", bo.getCurrentCoilNo()); + // 更新当前钢卷ID(注意:这里需要获取新插入的钢卷ID,但在这个方法中还没有新ID) + // 所以这个方法只在库区不变化时调用,此时钢卷ID不变 + // contentMap.put("current_coil_id", String.valueOf(bo.getCoilId())); // 保持当前ID不变 + // 更新二维码记录 String newContentJson = objectMapper.writeValueAsString(contentMap); WmsGenerateRecordBo updateBo = new WmsGenerateRecordBo(); diff --git a/klp-wms/src/main/resources/mapper/wms/WmsCoilPendingActionMapper.xml b/klp-wms/src/main/resources/mapper/wms/WmsCoilPendingActionMapper.xml new file mode 100644 index 00000000..e1fc1c34 --- /dev/null +++ b/klp-wms/src/main/resources/mapper/wms/WmsCoilPendingActionMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +