diff --git a/docs/JY1.0-立库详细界面功能说明书.html b/docs/JY1.0-立库详细界面功能说明书.html new file mode 100644 index 00000000..6933e7db --- /dev/null +++ b/docs/JY1.0-立库详细界面功能说明书.html @@ -0,0 +1,291 @@ + + + + + +JY1.0 立库详细界面功能说明书 + + + +

JY1.0 立库详细界面功能说明书

+

1. 文档目的

+

本文档用于整理 JY1.0 项目中“立库查询/立库可视化”组件目前已经实现的界面结构、后端数据来源、交互逻辑和现有功能范围,便于后续培训、验收、维护和功能扩展。

+

本文档依据当前前端实现整理,核心代码位置如下:

+ +

2. 页面定位

+

立库详细界面当前对应的页面名称为:

+ +

该页面用于展示立体仓库库位占用情况,并支持按巷道查看、按行层筛选、单击库位查看库位详情或物料明细。

+

3. 页面总体结构

+

图 1:立库可视化主界面

+
立库可视化主界面
+

页面整体采用标准的 div.app-container + el-card 布局,主体包含以下区域:

+
  1. 顶部筛选与操作区
  2. 统计信息卡片区
  3. 状态图例区
  4. 立库可视化表格区
  5. 分页区
  6. 库位详情弹窗
  7. 物料信息弹窗
+

当前页面只有一个主标签页:

+ +

代码中保留了图表分析相关逻辑,但当前模板中未实际启用“分析”页签。

+

4. 顶部筛选与操作区说明

+

图 2:筛选区与显示模式切换示意

+
筛选区与显示模式切换
+

顶部区域已经实现以下控件:

+

4.1 巷道筛选

+

控件类型:el-select

+

可选项固定为:

+ +

对应值为:

+ +

用途:

+ +

4.2 行层筛选

+

控件类型:el-select

+

用途:

+ +

特点:

+ +

4.3 搜索按钮

+

按钮文字:搜索

+

作用:

+ +

说明:

+ +

4.4 重置按钮

+

按钮文字:重置

+

作用:

+ +

页面提示:

+ +

注意:

+ +

4.5 刷新数据按钮

+

按钮文字:刷新数据

+

作用:

+ +

说明:

+ +

4.6 显示模式切换开关

+

控件类型:el-switch

+

两种模式:

+ +

作用:

+ +

切换效果:

+ +

- 锁库:el-icon-lock - 有物料有托盘:el-icon-box - 有托盘无物料:el-icon-tickets - 空库位:el-icon-minus

+

页面提示:

+ +

5. 统计信息卡片区说明

+

页面中部已实现 6 个统计卡片:

+

5.1 总库位数

+

计算方式:

+ +

5.2 有物料有托盘

+

统计状态值为 2 的库位数量。

+

5.3 有托盘无物料

+

统计状态值为 1 的库位数量。

+

5.4 空闲库位

+

统计状态值为 0 的库位数量。

+

5.5 使用率

+

计算方式:

+ +

保留 1 位小数。

+

5.6 数据行数

+

显示当前 warehouseData.length,即当前已加载的立库行数。

+

6. 状态图例说明

+

页面已实现状态图例,用于帮助用户理解库位颜色含义:

+ +

另外,代码中还支持:

+ +

该状态在单元格样式和状态文字中已实现,但图例区未单独展示“锁库”说明。

+

7. 立库可视化表格区说明

+

这是页面的核心区域。

+

7.1 展示形式

+

页面使用原生 table 绘制立库矩阵,不是 el-table

+

结构包含:

+ +

7.2 行列组织方式

+

+

每一行对应一个“行-层”值,例如:

+ +

页面左侧固定显示该行层编号。

+

+

每列按照数字列号展示,从 1columnCount

+

columnCount 的计算规则为:

+ +

7.3 单元格状态值

+

当前库位单元格支持以下状态:

+
状态值含义前端显示简称颜色
0空库位灰色
1有托盘无物料橙色
2有物料有托盘绿色
9锁库/在存取蓝色
+

7.4 单元格交互效果

+

当前已实现以下交互:

+ +

7.5 空数据处理

+

warehouseData.length === 0 时,页面显示空白占位区域。

+

说明:

+ +

8. 分页功能说明

+

页面底部已实现分页控件,条件为:

+ +

分页能力包括:

+ +

每页可选条数:

+ +

说明:

+ +

9. 库位详情弹窗说明

+

图 3:库位详情弹窗示意

+
库位详情弹窗
+

点击非物料状态库位时,会弹出“库位详情”窗口。

+

触发条件:

+ +

9.1 弹窗标题

+

格式:

+ +

例如:

+ +

9.2 弹窗内容

+

当前弹窗内容为库位状态说明文本,即 selectedCellDetail.description

+

不同状态说明如下:

+ +

9.3 当前实现特点

+

目前该弹窗属于轻量说明弹窗,展示内容较简洁,没有进一步展示:

+ +

这些字段在前端对象构造里有部分预留,但未在弹窗模板中完整展示。

+

10. 物料信息弹窗说明

+

图 4:物料信息弹窗示意

+
物料信息弹窗
+

点击状态为 2 的库位时,会弹出“库位信息”窗口。

+

触发条件:

+ +

10.1 弹窗标题

+

格式:

+ +

即使用返回数据第一条的库位编号作为标题显示。

+

10.2 数据来源

+

点击单元格后会调用 StockDetail(rowLayer, column),查询数据库视图:

+ +

查询方式为手写 SQL:

+ +

10.3 库位编号拼接规则

+

点击单元格时,前端会把界面上的 行-层 和列号转换为后端查询用的 pno

+
  1. 将列号补足 2 位
  2. 行-层- 拆分
  3. 行-列-层 重新拼装
+

例如:

+ +

10.4 弹窗字段

+

当前弹窗表格已展示以下字段:

+ +

其中数量字段已实现:

+ +

10.5 返回数据兼容处理

+

前端对接口返回做了多种兼容判断,支持以下几类格式:

+
  1. response.data 直接就是数组
  2. response.data.data 是数组
  3. response.data.rows 是数组
  4. response.data 是单对象,且对象里包含 mnopno
+

说明:

+ +

10.6 无数据提示

+

如果接口无返回数据,则提示:

+ +

11. 后端接口与数据来源说明

+

当前页面实际对接了两类立库相关数据。

+

11.1 立库布局/状态数据

+

请求方法:

+ +

请求构造:

+ +

参数内容:

+ +

调用方式:

+ +

返回结果用途:

+ +

11.2 库位物料明细数据

+

请求方法:

+ +

请求方式:

+ +

调用方式:

+ +

返回结果用途:

+ +

11.3 接口地址配置

+

立库接口使用独立配置地址:

+ +

说明:

+ +

12. 已实现功能清单

+

基于当前页面代码,已经实现并可确认的功能如下。

+

12.1 页面展示类功能

+ +

12.2 数据查询类功能

+ +

12.3 筛选与交互类功能

+ +

12.4 数据展示增强功能

+ +

13. 代码中存在但当前未完整启用的能力

+

以下能力在代码中已有部分实现或预留,但从当前模板和实际入口看,尚未完整开放为可见功能。

+

13.1 状态筛选

+

页面 data 中存在:

+ +

筛选逻辑中也保留了状态筛选分支,但顶部没有对应状态下拉框,因此用户当前无法直接按状态筛选。

+

13.2 关键字搜索

+

页面 data 中存在:

+ +

并保留了按列搜索的逻辑入口,但模板中没有对应输入框,因此当前不构成实际功能。

+

13.3 图表分析功能

+

代码中已实现:

+ +

但模板中没有对应图表容器,也没有实际启用 warehouse-analysis 页签,因此当前属于预留代码。

+

13.4 数据导出功能

+

代码中已实现 exportWarehouseData(),可以把当前 warehouseData 导出为 JSON 文件。

+

但当前页面模板没有挂出“导出”按钮,因此用户在界面上无法直接使用。

+

13.5 打印报表功能

+

代码中存在 printWarehouseReport(),但当前只是提示“功能开发中”,没有实际打印逻辑。

+

13.6 物料标签打印

+

代码中存在 printMaterialInfo(),当前同样仅提示“功能开发中”。

+

13.7 焦点定位功能

+

代码中存在 focusOnCell(rowLayer, column),可自动滚动到指定单元格位置。

+

但当前页面没有表格明细区或其他入口去调用它,因此属于预留能力。

+

14. 现有业务规则总结

+

从当前实现可归纳出以下业务规则。

+

14.1 单元格状态规则

+ +

14.2 巷道数据规则

+ +

14.3 编码转换规则

+

界面展示编码与后端查询编码不是同一个结构:

+ +

因此点击库位时必须做一次编号重组。

+

15. 使用流程说明

+

典型操作流程如下:

+
  1. 打开立库可视化页面
  2. 系统默认加载第一巷道数据
  3. 页面显示统计信息、图例和库位矩阵
  4. 用户可切换巷道并点击“搜索”
  5. 用户可按“行-层”筛选关注区域
  6. 用户可切换文字/图标显示模式
  7. 鼠标悬停可查看库位状态提示
  8. 点击空库位/托盘位/锁定位,查看库位说明
  9. 点击有物料库位,查看该库位物料明细
  10. 需要恢复视图时可点击“重置”或“刷新数据”
+

16. 当前界面优点

+

从现有实现看,该页面已经具备以下优点:

+ +

17. 当前界面限制

+

从代码现状看,也存在一些限制:

+ +

18. 维护与扩展建议

+

如果后续继续完善该页面,建议优先考虑以下方向:

+
  1. 增加状态筛选下拉框,补齐 statusFilter 实际入口
  2. 增加库位搜索输入框,支持直接定位 行-层-列
  3. 在界面上开放“导出 JSON”按钮
  4. 补上锁库状态图例
  5. 完善空数据占位提示
  6. 把图表分析页签正式接入模板
  7. 在库位详情弹窗中增加更多业务字段
  8. 将明细查询 SQL 封装为标准后端接口名,减少前端直接拼 SQL 的耦合
+

19. 结论

+

当前“立库详细界面”已经不是简单静态展示,而是一个具备实际业务查询能力的立库可视化页面。它已经实现了:

+ +

同时,代码中还保留了导出、图表分析、状态筛选、定位等扩展能力,说明该页面已经具备进一步升级为完整“立库监控与查询中心”的基础。

+ + \ No newline at end of file diff --git a/docs/JY1.0-立库详细界面功能说明书.md b/docs/JY1.0-立库详细界面功能说明书.md new file mode 100644 index 00000000..59a772a2 --- /dev/null +++ b/docs/JY1.0-立库详细界面功能说明书.md @@ -0,0 +1,672 @@ +# JY1.0 立库详细界面功能说明书 + +## 1. 文档目的 + +本文档用于整理 JY1.0 项目中“立库查询/立库可视化”组件目前已经实现的界面结构、后端数据来源、交互逻辑和现有功能范围,便于后续培训、验收、维护和功能扩展。 + +本文档依据当前前端实现整理,核心代码位置如下: + +- `src/views/WarehouseManagement/WarehouseVisualization/index.vue` +- `static/config.js` + +## 2. 页面定位 + +立库详细界面当前对应的页面名称为: + +- 页面组件名:`WarehouseVisualizationSystem` +- 页面标签名:`立库可视化` +- 目录位置:`src/views/WarehouseManagement/WarehouseVisualization/index.vue` + +该页面用于展示立体仓库库位占用情况,并支持按巷道查看、按行层筛选、单击库位查看库位详情或物料明细。 + +## 3. 页面总体结构 + +**图 1:立库可视化主界面** + +![立库可视化主界面](assets/warehouse-visualization/main.png) + + +页面整体采用标准的 `div.app-container + el-card` 布局,主体包含以下区域: + +1. 顶部筛选与操作区 +2. 统计信息卡片区 +3. 状态图例区 +4. 立库可视化表格区 +5. 分页区 +6. 库位详情弹窗 +7. 物料信息弹窗 + +当前页面只有一个主标签页: + +- `立库可视化` + +代码中保留了图表分析相关逻辑,但当前模板中未实际启用“分析”页签。 + +## 4. 顶部筛选与操作区说明 + +**图 2:筛选区与显示模式切换示意** + +![筛选区与显示模式切换](assets/warehouse-visualization/filter.png) + + +顶部区域已经实现以下控件: + +### 4.1 巷道筛选 + +控件类型:`el-select` + +可选项固定为: + +- 第一巷道 +- 第二巷道 +- 第三巷道 +- 第四巷道 + +对应值为: + +- `1` +- `2` +- `3` +- `4` + +用途: + +- 用户选择巷道后,点击“搜索”,页面会调用立库接口重新获取该巷道数据。 + +### 4.2 行层筛选 + +控件类型:`el-select` + +用途: + +- 根据当前已加载的立库数据,自动生成“行-层”下拉选项。 +- 用户可筛选某一行层,只显示对应行数据。 + +特点: + +- 选项从接口返回数据动态提取。 +- 会自动去重。 +- 按数值倒序排列。 + +### 4.3 搜索按钮 + +按钮文字:`搜索` + +作用: + +- 重置当前页码为第一页。 +- 先执行前端筛选。 +- 再根据当前巷道值调用 `GetPosition` 获取最新立库数据。 + +说明: + +- 当前“搜索”动作的核心是按巷道重新取数。 +- 代码里存在 `searchKeyword` 变量,但页面上没有对应输入框,因此当前没有“按列关键字搜索”的实际入口。 + +### 4.4 重置按钮 + +按钮文字:`重置` + +作用: + +- 清空状态筛选值 +- 清空行层筛选值 +- 清空搜索关键字 +- 页码回到第一页 +- 重新执行前端筛选 + +页面提示: + +- 执行后弹出“筛选条件已重置”。 + +注意: + +- 当前重置不会主动重新按巷道取数,只是重置前端筛选状态。 + +### 4.5 刷新数据按钮 + +按钮文字:`刷新数据` + +作用: + +- 触发加载动画 +- 500ms 后重新装载当前 `defaultWarehouseData` +- 更新时间戳 +- 弹出“数据刷新成功” + +说明: + +- 刷新逻辑最终仍依赖最近一次 `GetPosition` 返回并写入的 `defaultWarehouseData`。 +- 如果前面已经切换过巷道,刷新展示的是当前缓存的该次结果。 + +### 4.6 显示模式切换开关 + +控件类型:`el-switch` + +两种模式: + +- 显示文字:`text` +- 显示图标:`icon` + +作用: + +- 控制库位单元格显示简称文字还是图标。 + +切换效果: + +- 文字模式显示:`物 / 盘 / 空 / 锁` +- 图标模式显示: + - 锁库:`el-icon-lock` + - 有物料有托盘:`el-icon-box` + - 有托盘无物料:`el-icon-tickets` + - 空库位:`el-icon-minus` + +页面提示: + +- 切换后会提示当前已切换到文字模式或图标模式。 + +## 5. 统计信息卡片区说明 + +页面中部已实现 6 个统计卡片: + +### 5.1 总库位数 + +计算方式: + +- `立库行数 * 列数` + +### 5.2 有物料有托盘 + +统计状态值为 `2` 的库位数量。 + +### 5.3 有托盘无物料 + +统计状态值为 `1` 的库位数量。 + +### 5.4 空闲库位 + +统计状态值为 `0` 的库位数量。 + +### 5.5 使用率 + +计算方式: + +- `(有物料有托盘 + 有托盘无物料) / 总库位数 * 100%` + +保留 1 位小数。 + +### 5.6 数据行数 + +显示当前 `warehouseData.length`,即当前已加载的立库行数。 + +## 6. 状态图例说明 + +页面已实现状态图例,用于帮助用户理解库位颜色含义: + +- 绿色:有物料有托盘 +- 橙色:有托盘无物料 +- 灰色:空库位 +- 蓝色边框:当前选中库位 + +另外,代码中还支持: + +- 蓝色底:锁库(状态值 `9`) + +该状态在单元格样式和状态文字中已实现,但图例区未单独展示“锁库”说明。 + +## 7. 立库可视化表格区说明 + +这是页面的核心区域。 + +### 7.1 展示形式 + +页面使用原生 `table` 绘制立库矩阵,不是 `el-table`。 + +结构包含: + +- 表头列号 +- 左侧行层标识 +- 中间库位矩阵单元格 + +### 7.2 行列组织方式 + +#### 行 + +每一行对应一个“行-层”值,例如: + +- `01-01` +- `03-12` + +页面左侧固定显示该行层编号。 + +#### 列 + +每列按照数字列号展示,从 `1` 到 `columnCount`。 + +`columnCount` 的计算规则为: + +- 读取首行对象字段 +- 排除 `行-层` +- 其余字段个数即为列数 + +### 7.3 单元格状态值 + +当前库位单元格支持以下状态: + +| 状态值 | 含义 | 前端显示简称 | 颜色 | +| --- | --- | --- | --- | +| `0` | 空库位 | 空 | 灰色 | +| `1` | 有托盘无物料 | 盘 | 橙色 | +| `2` | 有物料有托盘 | 物 | 绿色 | +| `9` | 锁库/在存取 | 锁 | 蓝色 | + +### 7.4 单元格交互效果 + +当前已实现以下交互: + +- 鼠标悬停单元格时放大 +- 鼠标悬停显示状态浮层 +- 点击后高亮选中库位 +- 点击后高亮整行对应的行层 +- 点击某列后,对应列表头也会高亮 + +### 7.5 空数据处理 + +当 `warehouseData.length === 0` 时,页面显示空白占位区域。 + +说明: + +- 代码里曾预留 `el-empty` 结构,但目前已注释,没有实际“暂无数据”文案和“加载示例数据”按钮。 + +## 8. 分页功能说明 + +页面底部已实现分页控件,条件为: + +- `totalPages > 1` 时显示 + +分页能力包括: + +- 查看总数 +- 切换每页条数 +- 上一页/下一页 +- 页码跳转 +- 直接输入页码跳转 + +每页可选条数: + +- `5` +- `8` +- `10` +- `15` + +说明: + +- 分页针对的是“行数据”,不是单元格。 +- 也就是一次显示若干个“行-层”。 + +## 9. 库位详情弹窗说明 + +**图 3:库位详情弹窗示意** + +![库位详情弹窗](assets/warehouse-visualization/detail.png) + + +点击非物料状态库位时,会弹出“库位详情”窗口。 + +触发条件: + +- 单元格状态不等于 `2` + +### 9.1 弹窗标题 + +格式: + +- `库位详情 + 库位编号` + +例如: + +- `库位详情 03-12-01` + +### 9.2 弹窗内容 + +当前弹窗内容为库位状态说明文本,即 `selectedCellDetail.description`。 + +不同状态说明如下: + +- `0`:空闲库位,可存放物料 +- `1`:有托盘但无物料,需补充物料 +- `2`:有托盘且有物料,正常使用中 +- `9`:在存取,库位已锁 + +### 9.3 当前实现特点 + +目前该弹窗属于轻量说明弹窗,展示内容较简洁,没有进一步展示: + +- 仓库编号 +- 创建时间 +- 最近操作人 +- 任务锁定来源 + +这些字段在前端对象构造里有部分预留,但未在弹窗模板中完整展示。 + +## 10. 物料信息弹窗说明 + +**图 4:物料信息弹窗示意** + +![物料信息弹窗](assets/warehouse-visualization/material.png) + + +点击状态为 `2` 的库位时,会弹出“库位信息”窗口。 + +触发条件: + +- 单元格状态等于 `2` + +### 10.1 弹窗标题 + +格式: + +- `库位信息 + pno` + +即使用返回数据第一条的库位编号作为标题显示。 + +### 10.2 数据来源 + +点击单元格后会调用 `StockDetail(rowLayer, column)`,查询数据库视图: + +- `StockDetailView` + +查询方式为手写 SQL: + +- `select ... from StockDetailView where pno='xx-xx-xx'` + +### 10.3 库位编号拼接规则 + +点击单元格时,前端会把界面上的 `行-层` 和列号转换为后端查询用的 `pno`: + +1. 将列号补足 2 位 +2. 将 `行-层` 以 `-` 拆分 +3. 按 `行-列-层` 重新拼装 + +例如: + +- 页面行层:`03-01` +- 点击列:`12` +- 后端查询编码:`03-12-01` + +### 10.4 弹窗字段 + +当前弹窗表格已展示以下字段: + +- 物料编号 `mno` +- 物料名称 `mname` +- 图号 `spec` +- 型号 `thao` +- 库存数量 `qty` +- 锁定库存 `lockqty` +- 批次 `batch` + +其中数量字段已实现: + +- 保留三位小数格式化 +- 大于 0 时显示强调色 +- 在数量下方显示单位 `munit` + +### 10.5 返回数据兼容处理 + +前端对接口返回做了多种兼容判断,支持以下几类格式: + +1. `response.data` 直接就是数组 +2. `response.data.data` 是数组 +3. `response.data.rows` 是数组 +4. `response.data` 是单对象,且对象里包含 `mno` 或 `pno` + +说明: + +- 这意味着当前页面对后端返回结构的容错较强。 + +### 10.6 无数据提示 + +如果接口无返回数据,则提示: + +- `未查询到数据` + +## 11. 后端接口与数据来源说明 + +当前页面实际对接了两类立库相关数据。 + +### 11.1 立库布局/状态数据 + +请求方法: + +- `GetPosition(hang)` + +请求构造: + +- `this.CreateData('11', 'GetPositionView', param)` + +参数内容: + +- `hang`:巷道编号 +- `potvar`:空字符串 +- `tt`:固定值 `1` + +调用方式: + +- `this.ExecDatabase1(Data)` + +返回结果用途: + +- 写入 `defaultWarehouseData` +- 再触发 `refreshData()` +- 最终更新主界面矩阵 + +### 11.2 库位物料明细数据 + +请求方法: + +- `StockDetail(rowLayer, column)` + +请求方式: + +- 直接构造 SQL 查询 `StockDetailView` + +调用方式: + +- `this.ExecDatabase1(Data)` + +返回结果用途: + +- 写入 `materialInfoList` +- 打开物料信息弹窗 + +### 11.3 接口地址配置 + +立库接口使用独立配置地址: + +- `static/config.js` +- `url1 = http://192.168.1.27:10006` +- `request_config1 = url1 + '/submit/MESCommonBase.ashx'` + +说明: + +- 这表明立库数据并未走默认 MES 主接口,而是走单独的立库数据库服务入口。 + +## 12. 已实现功能清单 + +基于当前页面代码,已经实现并可确认的功能如下。 + +### 12.1 页面展示类功能 + +- 立库矩阵可视化展示 +- 行层与列号展示 +- 库位状态颜色区分 +- 文字/图标两种展示模式切换 +- 统计卡片展示 +- 状态图例展示 +- 分页展示 + +### 12.2 数据查询类功能 + +- 默认加载立库数据 +- 按巷道重新查询立库数据 +- 点击状态为 `2` 的库位查询物料明细 +- 点击非 `2` 状态库位查看库位状态说明 + +### 12.3 筛选与交互类功能 + +- 按行层筛选 +- 点击搜索按钮重新按巷道加载 +- 重置筛选条件 +- 刷新当前缓存数据 +- 鼠标悬停显示状态提示 +- 单元格选中高亮 +- 行高亮 +- 列高亮 + +### 12.4 数据展示增强功能 + +- 数量保留 3 位小数 +- 锁定库存单独显示 +- 单位显示 +- 物料列表支持多条记录显示 +- 接口返回结构兼容处理 + +## 13. 代码中存在但当前未完整启用的能力 + +以下能力在代码中已有部分实现或预留,但从当前模板和实际入口看,尚未完整开放为可见功能。 + +### 13.1 状态筛选 + +页面 `data` 中存在: + +- `statusFilter` + +筛选逻辑中也保留了状态筛选分支,但顶部没有对应状态下拉框,因此用户当前无法直接按状态筛选。 + +### 13.2 关键字搜索 + +页面 `data` 中存在: + +- `searchKeyword` + +并保留了按列搜索的逻辑入口,但模板中没有对应输入框,因此当前不构成实际功能。 + +### 13.3 图表分析功能 + +代码中已实现: + +- 状态分布饼图 +- 行列使用率图 +- ECharts 初始化与销毁 + +但模板中没有对应图表容器,也没有实际启用 `warehouse-analysis` 页签,因此当前属于预留代码。 + +### 13.4 数据导出功能 + +代码中已实现 `exportWarehouseData()`,可以把当前 `warehouseData` 导出为 JSON 文件。 + +但当前页面模板没有挂出“导出”按钮,因此用户在界面上无法直接使用。 + +### 13.5 打印报表功能 + +代码中存在 `printWarehouseReport()`,但当前只是提示“功能开发中”,没有实际打印逻辑。 + +### 13.6 物料标签打印 + +代码中存在 `printMaterialInfo()`,当前同样仅提示“功能开发中”。 + +### 13.7 焦点定位功能 + +代码中存在 `focusOnCell(rowLayer, column)`,可自动滚动到指定单元格位置。 + +但当前页面没有表格明细区或其他入口去调用它,因此属于预留能力。 + +## 14. 现有业务规则总结 + +从当前实现可归纳出以下业务规则。 + +### 14.1 单元格状态规则 + +- `2` 代表该库位已有物料,应进入物料明细查询流程 +- 非 `2` 状态不查物料,进入库位说明流程 +- `9` 表示库位正在存取或已锁定 + +### 14.2 巷道数据规则 + +- 页面默认在 `mounted` 时调用 `GetPosition(1)`,默认先加载第一巷道 +- 用户再通过顶部选择器切换其他巷道 + +### 14.3 编码转换规则 + +界面展示编码与后端查询编码不是同一个结构: + +- 界面主要使用 `行-层` +- 后端明细查询使用 `行-列-层` + +因此点击库位时必须做一次编号重组。 + +## 15. 使用流程说明 + +典型操作流程如下: + +1. 打开立库可视化页面 +2. 系统默认加载第一巷道数据 +3. 页面显示统计信息、图例和库位矩阵 +4. 用户可切换巷道并点击“搜索” +5. 用户可按“行-层”筛选关注区域 +6. 用户可切换文字/图标显示模式 +7. 鼠标悬停可查看库位状态提示 +8. 点击空库位/托盘位/锁定位,查看库位说明 +9. 点击有物料库位,查看该库位物料明细 +10. 需要恢复视图时可点击“重置”或“刷新数据” + +## 16. 当前界面优点 + +从现有实现看,该页面已经具备以下优点: + +- 视觉上能直接反映立库占用状态 +- 巷道切换清晰 +- 物料库位点击查询路径明确 +- 状态颜色和图标表达直观 +- 对后端返回结构适配较灵活 +- 前端交互响应比较轻量 + +## 17. 当前界面限制 + +从代码现状看,也存在一些限制: + +- 状态筛选未开放界面入口 +- 关键字搜索未开放界面入口 +- 导出功能未开放按钮 +- 图表分析功能未在页面中启用 +- 空数据时缺少明确提示文案 +- 锁库状态没有放入图例区 +- 库位详情弹窗信息量偏少 +- 刷新逻辑更多是前端缓存刷新,不是强制重新拉取所有条件数据 + +## 18. 维护与扩展建议 + +如果后续继续完善该页面,建议优先考虑以下方向: + +1. 增加状态筛选下拉框,补齐 `statusFilter` 实际入口 +2. 增加库位搜索输入框,支持直接定位 `行-层-列` +3. 在界面上开放“导出 JSON”按钮 +4. 补上锁库状态图例 +5. 完善空数据占位提示 +6. 把图表分析页签正式接入模板 +7. 在库位详情弹窗中增加更多业务字段 +8. 将明细查询 SQL 封装为标准后端接口名,减少前端直接拼 SQL 的耦合 + +## 19. 结论 + +当前“立库详细界面”已经不是简单静态展示,而是一个具备实际业务查询能力的立库可视化页面。它已经实现了: + +- 按巷道加载立库状态 +- 立库矩阵可视化展示 +- 库位状态识别 +- 库位详情查看 +- 库位物料明细查询 +- 筛选、分页、刷新、显示模式切换等基础交互 + +同时,代码中还保留了导出、图表分析、状态筛选、定位等扩展能力,说明该页面已经具备进一步升级为完整“立库监控与查询中心”的基础。 diff --git a/docs/JY1.0-立库详细界面功能说明书.pdf b/docs/JY1.0-立库详细界面功能说明书.pdf new file mode 100644 index 00000000..21d6a327 Binary files /dev/null and b/docs/JY1.0-立库详细界面功能说明书.pdf differ diff --git a/docs/JY1.0-采购件入库查询卡顿修改方案.md b/docs/JY1.0-采购件入库查询卡顿修改方案.md new file mode 100644 index 00000000..ab700594 --- /dev/null +++ b/docs/JY1.0-采购件入库查询卡顿修改方案.md @@ -0,0 +1,366 @@ +# JY1.0 采购件入库查询卡顿修改方案 + +## 1. 背景说明 + +仓储管理模块页面 `src/views/WarehouseManagement/PurchasePartsStorage/index.vue` 在执行查询操作时,存在页面明显卡顿、浏览器长时间无响应、严重时看起来像页面崩溃的问题。 + +本方案用于整理当前排查结论、明确问题成因,并提出分阶段修改建议。本文档只给出修改方案,不直接改动代码。 + +## 2. 问题现象 + +当前页面包含采购件入库、自制件入库、外协到货等多个页签,其中采购件入库页签在选择供应商或合同后会自动执行查询。 + +现场表现主要包括: + +- 点击查询后页面长时间卡住。 +- 表格数据返回后界面渲染明显变慢。 +- 数据量较大时浏览器出现假死或无响应。 +- 用户主观感受为“查询就崩”。 + +## 3. 涉及文件 + +- `src/views/WarehouseManagement/PurchasePartsStorage/index.vue` +- `src/main.js` +- `src/utils/request.js` + +重点排查方法: + +- `searchTable1()` +- `searchTable3()` +- `getSummaries()` +- `getSummaries1()` +- `handleSelectionChange()` +- `recalcSelection()` + +## 4. 原因分析 + +### 4.1 采购件入库查询未分页,前端一次性加载全量数据 + +在 `searchTable1()` 中,查询请求通过 `CreateData('11', ..., param)` 发送,但未传入分页参数。 + +这会带来两个问题: + +- 后端可能直接返回该供应商或合同下的全部数据。 +- 前端需要一次性渲染整张大表,数据量较大时会明显拖慢页面。 + +相比之下,自制件入库的 `searchTable3()` 已传入 `pageSize1` 和 `pageCurrent1`,说明当前页面内部本身就存在两种不同的数据加载策略,采购件入库部分的实现明显更重。 + +### 4.2 查询完成后自动逐行全选,进一步放大渲染压力 + +在 `searchTable1()` 中,查询成功后会遍历 `tableData1`,并对满足条件的行逐个执行: + +- `this.$refs.table.toggleRowSelection(row, true)` + +虽然代码里使用了 `_suppressSelectionChange` 来避免自定义选中计算被重复触发,但 Element UI 表格内部仍需要为每一行更新选中状态、复选框状态和相关渲染结果。 + +当查询结果很多时,这段“逐行自动勾选”的逻辑会成为非常重的同步操作,容易造成主线程阻塞。 + +### 4.3 表格每行挂载多个重量级组件,导致大表渲染成本过高 + +采购件入库与自制件入库表格中,每行都包含较多交互组件,例如: + +- `el-select` +- `el-input-number` +- 选择列 +- 按钮列 + +其中 `el-input-number` 和 `el-select` 在大数据表格中本身就属于渲染和响应式开销较高的组件。若查询结果达到数百行甚至更多,组件实例数、watcher 数量、DOM 节点数量都会迅速增大。 + +### 4.4 表格启用汇总行,汇总函数会对数据做多轮遍历 + +页面使用了: + +- `show-summary` +- `summary-method` + +而 `getSummaries()`、`getSummaries1()` 中对多个列执行了多次 `map + reduce` 计算。 + +这意味着: + +- 查询后首次渲染要做汇总计算。 +- 表格数据变化、选中变化、输入变化后,汇总有机会被再次触发。 +- 当数据量大时,汇总计算会持续放大卡顿感。 + +### 4.5 查询动作与下拉联动查询存在叠加请求 + +例如自制件入库页签中,订单切换时会同时触发: + +- `searchTable3()` +- `getnumberSelection()` + +这类逻辑虽然不是采购件入库“卡死”的唯一主因,但会增加同一时间段内的请求数和页面状态更新次数,让用户更容易感知到页面迟滞。 + +### 4.6 当前超时配置较大,不容易快速暴露性能问题 + +`src/utils/request.js` 中 Axios `timeout` 设置为 `1500000`。 + +这会导致: + +- 如果接口慢,页面会长时间停留在等待状态。 +- 如果前端渲染本身很重,用户更容易把“卡顿”感知为“页面崩溃”。 + +这不是根因,但会放大问题表现。 + +## 5. 结论判断 + +综合代码结构,当前“查询就卡页面崩溃”的高概率原因不是单一点故障,而是以下因素叠加: + +1. 采购件入库查询无分页。 +2. 查询完成后自动逐行勾选可入库数据。 +3. 大表格中每行挂载多个重量级输入组件。 +4. 汇总行对全量数据重复做统计计算。 + +其中,优先级最高、最值得首先处理的是前两项。 + +## 6. 修改目标 + +本次优化建议以“先止血,再优化体验”为原则,目标如下: + +- 将查询后的页面卡顿控制在可接受范围内。 +- 避免浏览器因大数据量渲染出现假死。 +- 保持现有业务流程基本不变。 +- 尽量复用项目现有分页、查询、表格处理模式。 +- 将改动范围控制在 `PurchasePartsStorage` 页面内部,避免影响其他模块。 + +## 7. 修改方案 + +### 7.1 方案一:为采购件入库查询增加分页 + +这是首要方案。 + +#### 修改思路 + +- 为采购件入库表格引入与自制件入库一致的分页机制。 +- 在 `searchTable1()` 中调用 `CreateData()` 时补充分页参数。 +- 页面新增采购件入库对应的分页组件与分页状态。 +- 后端查询过程若已支持分页,则直接接入。 +- 后端若尚未支持分页,需要同步补充分页查询能力。 + +#### 预期收益 + +- 避免一次性返回几百或几千条数据。 +- 大幅降低首屏渲染压力。 +- 为后续汇总优化、选择优化提供基础。 + +#### 风险点 + +- 需要确认后端 `仓储管理_采购入库合同明细_查询` 是否支持分页返回 `rows/total`。 +- 如果当前接口只返回普通数组,前后端都需要调整返回结构。 + +### 7.2 方案二:取消查询后自动全选所有可入库行 + +这是与分页并列的高优先级方案。 + +#### 修改思路 + +- 查询完成后不再自动执行 `toggleRowSelection` 遍历全表。 +- 保留手工勾选模式,由用户自主选择入库数据。 +- 如业务上确实需要批量选择,可增加单独按钮,例如“勾选当前页可入库项”。 +- 如仍需保留自动选择能力,建议限制为只处理当前页数据,而不是全量结果。 + +#### 预期收益 + +- 避免一次查询后产生大量同步 UI 更新。 +- 显著降低 Element 表格内部状态维护成本。 +- 使查询动作本身更纯粹,减少联动副作用。 + +#### 风险点 + +- 用户操作习惯会发生轻微变化。 +- 若一线人员依赖默认全选,需要补充一个显式批量勾选按钮作为替代。 + +### 7.3 方案三:降低表格每行组件数量 + +这是第二阶段优化方案。 + +#### 修改思路 + +- 默认以文本方式展示数值和货位。 +- 仅在用户点击某行或某单元格后切换为可编辑组件。 +- 或将数量、货位编辑能力迁移到弹窗/侧边表单中进行。 + +#### 可选实现方式 + +- 方式 A:保留表格编辑,但只对当前编辑行渲染 `el-input-number` 和 `el-select`。 +- 方式 B:表格只展示,编辑统一在“设置货位/修改本次到货数”弹窗内完成。 + +#### 预期收益 + +- 大幅减少页面初次渲染和更新渲染的组件实例数。 +- 降低响应式系统负担。 + +#### 风险点 + +- 交互形式改变较大,需业务确认。 +- 改动量大于分页和取消自动全选。 + +### 7.4 方案四:优化汇总逻辑 + +这是辅助优化方案。 + +#### 修改思路 + +- 汇总只统计当前页数据,不统计全量数据。 +- 或在查询成功后一次性计算并缓存汇总结果,避免在渲染阶段多次 `map + reduce`。 +- 对不必要展示汇总的列取消统计。 + +#### 预期收益 + +- 降低表格重渲染时的计算开销。 +- 对大页数据场景效果明显。 + +#### 风险点 + +- 需确认业务是否要求“全量合计”还是“当前页合计”。 + +### 7.5 方案五:收敛筛选联动查询,减少重复请求 + +这是体验优化方案。 + +#### 修改思路 + +- 将“切换筛选项即自动查询”改为“选择条件后点击查询按钮再执行”。 +- 对必须联动的下拉,仅查询下一级选项,不立即刷新大表。 +- 对输入型查询条件增加节流或按回车触发。 + +#### 预期收益 + +- 避免用户频繁切换条件时重复打接口和重复渲染。 +- 页面行为更可控。 + +#### 风险点 + +- 与当前“选择即查”的使用习惯不完全一致。 + +## 8. 推荐实施顺序 + +建议按以下顺序推进: + +### 第一阶段:快速止血 + +目标是在不大改页面交互的前提下,尽快解决“查询卡死”。 + +建议执行: + +1. 采购件入库增加分页。 +2. 取消查询后自动全选。 +3. 采购件入库增加显式“勾选当前页可入库项”按钮,作为自动全选替代。 + +### 第二阶段:性能优化 + +目标是继续提升大数据场景下的流畅度。 + +建议执行: + +1. 优化汇总函数。 +2. 减少表格内 `el-input-number`、`el-select` 的常驻渲染数量。 +3. 调整筛选联动逻辑,减少重复请求。 + +### 第三阶段:体验收敛 + +目标是统一仓储大表页面的实现模式。 + +建议执行: + +1. 对采购件入库、自制件入库、外协到货的查询行为做统一规范。 +2. 明确哪些页签必须分页、哪些页签允许全量查。 +3. 统一表格汇总、批量勾选、行编辑的实现方式。 + +## 9. 建议的具体改动点 + +以下为建议修改点,不代表本次已经改动: + +### 9.1 页面状态 + +在 `PurchasePartsStorage/index.vue` 中补充采购件入库分页状态,例如: + +- `pageCurrentRK` +- `pageSizeRK` +- `totalRK` + +或直接复用现有命名体系,保持与页面其他分区一致。 + +### 9.2 查询方法 + +重点调整: + +- `searchTable1()` + +建议: + +- 查询请求增加分页参数。 +- 查询结果改为接收分页结构。 +- 删除查询成功后的逐行 `toggleRowSelection` 自动勾选逻辑。 + +### 9.3 表格区域 + +采购件入库表格下方增加分页组件,行为对齐自制件入库分页实现。 + +### 9.4 批量选择逻辑 + +新增显式按钮: + +- “勾选当前页可入库” +- “取消当前页勾选” + +这样既能保留批量能力,也能避免查询完成后立即执行重计算。 + +### 9.5 汇总逻辑 + +重构: + +- `getSummaries()` +- `getSummaries1()` + +建议尽量减少重复遍历次数,并明确统计口径为“当前页合计”。 + +## 10. 验证方案 + +修改完成后建议按以下方式验证: + +### 10.1 功能验证 + +- 选择供应商后能正常查询采购件入库数据。 +- 切换合同后能正常刷新结果。 +- 分页切换后数据正确。 +- 手工勾选、批量勾选后入库功能正常。 +- 货位选择、数量输入、打印功能不受影响。 + +### 10.2 性能验证 + +- 查询 50 条、100 条、300 条时页面响应是否明显改善。 +- 查询后页面是否仍出现长时间卡死。 +- 批量勾选当前页时是否可接受。 +- 输入数量、选择货位时是否仍然卡顿。 + +### 10.3 回归验证 + +- 自制件入库页签行为不受影响。 +- 外协到货页签行为不受影响。 +- 入库单弹窗显示和合并逻辑不受影响。 + +## 11. 风险与注意事项 + +- 若后端接口当前不支持分页,本次优化需要前后端联动处理。 +- 若业务习惯依赖“查询即默认勾选全部可入库项”,需要提前通知用户交互变更。 +- 若汇总口径从全量改为当前页,需业务确认是否接受。 +- 若后续计划继续扩展该页面,建议优先统一仓储大表的分页和编辑规范,避免重复出现同类问题。 + +## 12. 最终建议 + +推荐采用“先小改止血,再做结构优化”的策略: + +1. 先做采购件入库分页。 +2. 同时取消查询后的自动逐行全选。 +3. 再根据现场体验决定是否继续推进表格轻量化和汇总优化。 + +若只能先做一项,优先级最高的是: + +- `searchTable1()` 增加分页能力。 + +若可以同时做两项,最佳组合是: + +- 采购件入库分页。 +- 取消查询后自动勾选。 + +这两项组合最有希望直接解决当前“查询就卡页面崩溃”的核心问题。 diff --git a/docs/assets/warehouse-visualization/detail.png b/docs/assets/warehouse-visualization/detail.png new file mode 100644 index 00000000..0bcac75c Binary files /dev/null and b/docs/assets/warehouse-visualization/detail.png differ diff --git a/docs/assets/warehouse-visualization/filter.png b/docs/assets/warehouse-visualization/filter.png new file mode 100644 index 00000000..6be914fe Binary files /dev/null and b/docs/assets/warehouse-visualization/filter.png differ diff --git a/docs/assets/warehouse-visualization/main.png b/docs/assets/warehouse-visualization/main.png new file mode 100644 index 00000000..f8edb478 Binary files /dev/null and b/docs/assets/warehouse-visualization/main.png differ diff --git a/docs/assets/warehouse-visualization/material.png b/docs/assets/warehouse-visualization/material.png new file mode 100644 index 00000000..b84a422a Binary files /dev/null and b/docs/assets/warehouse-visualization/material.png differ diff --git a/docs/preview-server.js b/docs/preview-server.js new file mode 100644 index 00000000..5016065e --- /dev/null +++ b/docs/preview-server.js @@ -0,0 +1,22 @@ +const http = require('http'); +const fs = require('fs'); +const path = require('path'); +const root = __dirname; +const types = { '.html': 'text/html; charset=utf-8', '.png': 'image/png', '.css': 'text/css; charset=utf-8', '.js': 'text/javascript; charset=utf-8', '.md': 'text/plain; charset=utf-8' }; +const server = http.createServer((req, res) => { + try { + const url = new URL(req.url, 'http://127.0.0.1:18765'); + const rel = decodeURIComponent(url.pathname).replace(/^\/+/, ''); + const filePath = path.resolve(root, rel); + if (!filePath.startsWith(path.resolve(root))) { + res.writeHead(403); res.end('Forbidden'); return; + } + fs.readFile(filePath, (err, data) => { + if (err) { res.writeHead(404); res.end('Not found: ' + filePath); return; } + res.writeHead(200, { 'Content-Type': types[path.extname(filePath).toLowerCase()] || 'application/octet-stream' }); + res.end(data); + }); + } catch (e) { res.writeHead(500); res.end(String(e)); } +}); +server.listen(18765, '127.0.0.1', () => console.log('preview server on 18765')); +setInterval(() => {}, 1000); diff --git a/docs/warehouse-visualization-preview.html b/docs/warehouse-visualization-preview.html new file mode 100644 index 00000000..6ce5ee6e --- /dev/null +++ b/docs/warehouse-visualization-preview.html @@ -0,0 +1,482 @@ + + + + + + 立库可视化功能截图预览 + + + +
+
+
立库可视化
+
+ +
第一巷道
+
03-01
+
🔍 搜索
+
↻ 重置
+
⟲ 刷新数据
+
显示文字
+
+
筛选区支持按巷道重新取数、按行-层收窄视图,并可切换文字/图标显示模式。
+
+
总库位数
384
+
有物料有托盘
138
+
有托盘无物料
76
+
空闲库位
154
+
使用率
55.7%
+
数据行数
8
+
+
+
有物料有托盘 (物)
+
有托盘无物料 (盘)
+
空库位 (空)
+
选中库位
+
+
+
+
立库组
+ + + + + +
行-层
+
+
显示 8 行数据
+
+ +
+
+ + + + + diff --git a/scripts/markdown-to-pdf.js b/scripts/markdown-to-pdf.js new file mode 100644 index 00000000..c5fa0e8b --- /dev/null +++ b/scripts/markdown-to-pdf.js @@ -0,0 +1,237 @@ +const fs = require('fs') +const path = require('path') + +const input = process.argv[2] +const output = process.argv[3] + +if (!input || !output) { + console.error('Usage: node scripts/markdown-to-pdf.js ') + process.exit(1) +} + +const markdown = fs.readFileSync(input, 'utf8') + +function escapeHtml(value) { + return value + .replace(/&/g, '&') + .replace(//g, '>') +} + +function inlineFormat(value) { + return escapeHtml(value) + .replace(/`([^`]+)`/g, '$1') + .replace(/\*\*([^*]+)\*\*/g, '$1') +} + +function renderTable(lines) { + const rows = lines + .filter(line => line.trim()) + .map(line => line.trim().replace(/^\|/, '').replace(/\|$/, '').split('|').map(cell => inlineFormat(cell.trim()))) + + if (rows.length < 2) return '' + + const head = rows[0] + const body = rows.slice(2) + return [ + '', + '' + head.map(cell => '').join('') + '', + '', + body.map(row => '' + row.map(cell => '').join('') + '').join('\n'), + '', + '
' + cell + '
' + cell + '
' + ].join('\n') +} + +function renderMarkdown(text) { + const lines = text.replace(/\r\n/g, '\n').split('\n') + const html = [] + let paragraph = [] + let list = [] + let code = [] + let inCode = false + let table = [] + + function flushParagraph() { + if (paragraph.length) { + html.push('

' + inlineFormat(paragraph.join(' ')) + '

') + paragraph = [] + } + } + + function flushList() { + if (list.length) { + html.push('') + list = [] + } + } + + function flushTable() { + if (table.length) { + html.push(renderTable(table)) + table = [] + } + } + + lines.forEach(line => { + if (/^```/.test(line.trim())) { + if (inCode) { + html.push('
' + escapeHtml(code.join('\n')) + '
') + code = [] + inCode = false + } else { + flushParagraph() + flushList() + flushTable() + inCode = true + } + return + } + + if (inCode) { + code.push(line) + return + } + + if (/^\|.*\|$/.test(line.trim())) { + flushParagraph() + flushList() + table.push(line) + return + } + + flushTable() + + if (!line.trim()) { + flushParagraph() + flushList() + return + } + + const heading = line.match(/^(#{1,6})\s+(.+)$/) + if (heading) { + flushParagraph() + flushList() + const level = heading[1].length + html.push('' + inlineFormat(heading[2]) + '') + return + } + + const image = line.match(/^!\[([^\]]*)\]\(([^)]+)\)$/) + if (image) { + flushParagraph() + flushList() + html.push('
' + escapeHtml(image[1]) + '
' + inlineFormat(image[1]) + '
') + return + } + + const listItem = line.match(/^- (.+)$/) + if (listItem) { + flushParagraph() + list.push(listItem[1]) + return + } + + paragraph.push(line.trim()) + }) + + flushParagraph() + flushList() + flushTable() + + return html.join('\n') +} + +const body = renderMarkdown(markdown) +const html = ` + + + + 零件改制功能设计方案 + + + +${body} + + +` + +fs.writeFileSync(output, html, 'utf8') diff --git a/src/views/PurchasingManagement/MaterialPurchaseProgress/index.vue b/src/views/PurchasingManagement/MaterialPurchaseProgress/index.vue index d37470ec..3347fb79 100644 --- a/src/views/PurchasingManagement/MaterialPurchaseProgress/index.vue +++ b/src/views/PurchasingManagement/MaterialPurchaseProgress/index.vue @@ -28,19 +28,36 @@ - - - - - - - - - + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
状态 + {{ detailRow.状态 }} + 订单号{{ detailRow.订单编号 }}
物料编码{{ detailRow.物料编码 }}物料名称{{ detailRow.物料名称 }}
图号或型号{{ detailRow.图号或型号 }}
采购数{{ detailRow.数量 }}已入库数量{{ detailRow.已到货数量 }}
采购合同{{ detailRow.采购合同编号 }}
+
+
+ + + + diff --git a/src/views/PurchasingManagement/PurchaseOrder/index.vue b/src/views/PurchasingManagement/PurchaseOrder/index.vue index e6bcacaf..b9fcebc9 100644 --- a/src/views/PurchasingManagement/PurchaseOrder/index.vue +++ b/src/views/PurchasingManagement/PurchaseOrder/index.vue @@ -681,7 +681,7 @@ @@ -880,6 +880,10 @@ export default { limit: 100, Data: {}, upload: url, + uploadSaving: false, + uploadFileTotal: 0, + uploadFileFinished: 0, + uploadFileFailed: 0, pageCurrent: 1, // 分页当前页 pageSize: 100, // 分页每页显示条数 pageCurrent1: 1, // 分页当前页 @@ -1324,20 +1328,39 @@ export default { if (response.data && response.data[0] && response.data[0].result === '1') { console.log('文件保存成功:', savePath) } else { + this.uploadFileFailed++ console.error('文件保存失败:', response.data) } }).catch(err => { + this.uploadFileFailed++ console.error('文件保存异常:', err) + }).finally(() => { + this.uploadFileFinished++ + if (this.uploadFileFinished >= this.uploadFileTotal) { + this.uploadSaving = false + if (this.uploadFileFailed === 0) { + this.$message.success('图片上传成功') + this.dialogFormVisible2 = false + this.$refs.upload.clearFiles() + } else { + this.$message.error('部分图片上传失败,请重新上传失败图片') + } + } }) - - this.dialogFormVisible2 = false - this.$refs.upload.clearFiles() }, updatePicture(row) { this.dialogFormVisible2 = true this.purchaseContractID = row.采购合同流水号 }, submitPicture() { + if (!this.$refs.upload || this.$refs.upload.uploadFiles.length === 0) { + this.$message.warning('请选择图片') + return + } + this.uploadSaving = true + this.uploadFileTotal = this.$refs.upload.uploadFiles.length + this.uploadFileFinished = 0 + this.uploadFileFailed = 0 var param = [] param[0] = ['采购合同流水号', this.purchaseContractID] param[1] = ['文件名称', ''] @@ -1346,7 +1369,6 @@ export default { var Data1 = this.CreateData('15', '采购合同查询_上传图片', param) this.Data.param = Data1 this.$refs.upload.submit() - this.dialogFormVisible2 = false }, getData() { if (this.PartType === '物料采购') { diff --git a/src/views/SalesManagement/ContractSearch/index.vue b/src/views/SalesManagement/ContractSearch/index.vue index ee9037e8..97d90e57 100644 --- a/src/views/SalesManagement/ContractSearch/index.vue +++ b/src/views/SalesManagement/ContractSearch/index.vue @@ -1207,7 +1207,8 @@ - diff --git a/src/views/WarehouseManagement/PurchasePartsStorage/index.vue b/src/views/WarehouseManagement/PurchasePartsStorage/index.vue index a09e3341..1f8090b3 100644 --- a/src/views/WarehouseManagement/PurchasePartsStorage/index.vue +++ b/src/views/WarehouseManagement/PurchasePartsStorage/index.vue @@ -123,7 +123,7 @@ - + @@ -329,7 +329,7 @@