Compare commits
52 Commits
810b198282
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9fc3aae3e9 | ||
|
|
fd84f9d3ca | ||
|
|
33549c3787 | ||
|
|
2b9058c69c | ||
|
|
9c1f52078d | ||
|
|
be0ff91e24 | ||
|
|
137e276340 | ||
|
|
99c7077865 | ||
|
|
bb30ba76d0 | ||
|
|
0c8c6587bd | ||
|
|
d81a528533 | ||
|
|
f4692027ce | ||
|
|
d523c57057 | ||
|
|
d0c6ee299c | ||
|
|
74c06cb592 | ||
|
|
7b969f0eb6 | ||
|
|
6569ed2cf3 | ||
|
|
d1cc111923 | ||
|
|
e3c13a6425 | ||
|
|
e40494287a | ||
|
|
833cd016ff | ||
|
|
197603483d | ||
|
|
b7b86b6549 | ||
|
|
f59c04288b | ||
|
|
c2b6fb1fbf | ||
|
|
bed9f863a0 | ||
|
|
68be7fcbee | ||
|
|
33be3364b6 | ||
|
|
86b87d62f6 | ||
|
|
9f654e2588 | ||
|
|
232b14e00a | ||
|
|
d1e482e8c3 | ||
|
|
26ee11ea9d | ||
|
|
242902ad36 | ||
|
|
518772aefe | ||
|
|
40bbb32e41 | ||
|
|
ca9bcd9994 | ||
|
|
00ae692c52 | ||
|
|
b668dc6b2b | ||
|
|
5fe6c42cb6 | ||
|
|
94f277ed32 | ||
|
|
ce0b9c9315 | ||
|
|
6c70b05861 | ||
|
|
a50608c4b0 | ||
|
|
db6a51eab5 | ||
|
|
f6802d9893 | ||
|
|
fd70670235 | ||
| 4969870de8 | |||
| 055075a41d | |||
| 563132273c | |||
|
|
fe5d3b70df | ||
|
|
120c7c1601 |
84
AGENTS.md
Normal file
@@ -0,0 +1,84 @@
|
||||
# JY1.0 项目 Agent 规则
|
||||
|
||||
## 项目概述
|
||||
|
||||
你正在参与「景耀 JY1.0」制造执行系统(MES)的前端开发工作。本项目是江苏高精机械设备有限公司的管理信息系统,基于 Vue 2 + Element UI 构建,后端为 ASP.NET(.ashx 通用处理程序)。
|
||||
|
||||
## 技术栈识别
|
||||
|
||||
本项目使用 Vue 2.5.17 + Vuex 3.0.1 + Vue Router 3.0.7 + Element UI 2.13 + Axios 0.18.0 + ECharts 4 + Webpack 4。不使用 TypeScript,不使用 Composition API,不使用 Vue 3 语法。所有代码均为 JavaScript + Vue 2 Options API 风格。
|
||||
|
||||
## API 通信规范
|
||||
|
||||
所有业务请求统一 POST 到单一端点 `MESCommonBase.ashx`,URL 字段留空(由 baseURL 统一代理)。通过 `name` 字段(中文命名,格式为`模块_子模块_操作_查询/增加/编辑/删除数据`)路由到后端不同存储过程。通过 `type` 字段区分操作:`'1'` 为查询,`'2'` 为增删改,`'7'` 为批量提交。参数通过 `param` 字段以 `key=value&key2=value2` 字符串拼接传递,非 JSON 对象。每个请求必须携带 `UserID`(从 Cookie 取)和 `ModularID`(当前路由路径)。
|
||||
|
||||
## 数据字段命名
|
||||
|
||||
后端返回的数据库字段名为中文,如 `状态`、`订单编号`、`零件名称`、`图号`、`投产日期` 等。前端模板中直接使用中文属性访问,如 `scope.row.状态`、`scope.row.订单号`。新增字段时必须使用中文命名以保持与后端一致。
|
||||
|
||||
## 视图组件结构
|
||||
|
||||
每个页面视图遵循统一布局模式:外层 `div.app-container` > `el-card` > 搜索栏 + 数据表格。搜索栏使用 `el-input`、`el-select`、`el-date-picker` 等组件,数据表格使用 `el-table` + `el-table-column`,固定高度(如 `height="750px"`),尺寸为 `size="mini"`,带 `border` 属性。状态列使用 `el-tag` 组件,通过 `:type` 属性区分不同状态颜色。
|
||||
|
||||
## 全局工具方法
|
||||
|
||||
项目通过 `Vue.prototype` 挂载了以下全局方法,在组件中通过 `this.xxx` 直接调用:`CreateData(type, name, data, pageSize, pageList)` 构建请求参数、`ExecDatabase(num)` 发送请求、`addForm(form, callback)` 重置并打开新增表单、`editForm(row, form, callback)` 填充行数据到编辑表单、`getSelect(requestData, select, carrier, param)` 获取下拉框数据、`getData(requestData, carrier, param)` 获取普通数据、`getTable(requestData, param, e)` 获取分页表格数据、`addTable(requestData, param, form, callback)` 新增表格行、`editTable(requestData, param, form, callback)` 编辑表格行、`deleteRow(requestData, id, callback)` 删除表格行。新增/编辑操作必须使用这些全局方法,不要自行封装。
|
||||
|
||||
## 状态管理
|
||||
|
||||
Vuex 采用 modules 模式,包含 `app`、`user`、`tagsView`、`permission` 四个模块。用户信息(token、name、id、userId)通过 `js-cookie` 持久化,有效期 1 天。权限控制采用静态路由 + 动态路由注入模式,`getRouter.js` 根据后端返回的菜单数据递归构建路由树。登录后通过 `store.dispatch('GetInfo')` 获取用户信息,再通过 `store.dispatch('GenerateRoutes', asyncRouterMap)` 动态添加路由。
|
||||
|
||||
## 路由配置
|
||||
|
||||
静态路由定义在 `src/router/index.js` 的 `constantRouterMap` 中,仅包含登录页、404页和首页。动态路由通过 `src/router/getRouter.js` 根据后端返回的菜单数据(含 pid 父子关系)递归构建,组件路径映射到 `src/views` 目录下对应的 `.vue` 文件。路由 meta 中包含 `title`(中文标题)和 `icon`(SVG 图标名称)。
|
||||
|
||||
## API 文件组织
|
||||
|
||||
API 文件按业务模块组织在 `src/api/` 目录下,子目录与业务模块一一对应:`BasicData`(基础数据)、`SalesManagement`(销售管理)、`ManufacturingCenter`(制造中心)、`Assembly`(装配管理)、`Inventory`(仓储管理)、`Outsourcing`(外协管理)、`PurchasingCenter`(采购中心)、`TechnologyCenter`(技术中心)、`WorkshopProcurement`(车间采购)、`MarketingCenter`(营销中心)、`ProjectManagement`(项目管理)。每个 API 文件导出多个命名函数,函数名以操作语义命名。
|
||||
|
||||
## 视图目录组织
|
||||
|
||||
视图文件按业务模块组织在 `src/views/` 目录下,与 API 目录结构对应。主要模块包括:`BasicData`(基础数据)、`SalesManagement`(销售管理)、`SeikoWorkshop`(精工车间)、`AssemblyManagement`(装配管理)、`DeviceManagement`(设备管理)、`PurchasingManagement`(采购管理)、`WarehouseManagement`(仓储管理)、`TechnologyCenter`(技术中心)、`ManufacturingCenter`(制造中心)。每个页面为独立文件夹 + `index.vue`。
|
||||
|
||||
## 配置管理
|
||||
|
||||
环境配置集中在 `static/config.js` 中,通过导出常量供 `src/utils/request.js` 引用。包含主服务地址、立库接口地址、文件上传下载路径、WebSocket 地址等。环境切换通过注释切换 IP 地址实现,不使用 `.env` 文件。修改配置时需同时关注 `request.js` 中的引用。
|
||||
|
||||
## 后端数据库
|
||||
|
||||
后端使用 SQL Server 数据库,连接信息如下:IP 地址 `192.168.1.27`,数据库名 `ERPTOOL_JY_20250826Back`,账号 `sa`,密码 `126.com`。
|
||||
|
||||
## 文件上传下载
|
||||
|
||||
文件上传使用多个专用处理器:`uploadFile.ashx`(通用上传)、`MESUploadFile.ashx`(MES 系统上传)、`uploadOP.ashx`(工序上传)、`uploadPerson.ashx`(人员上传)等。文件下载使用 `downloadFile.ashx` 和 `MESDownloadFile.ashx`。Excel 导出使用 `ExcelDownLoad` 配置指向 `MESCommonBase.ashx`,前端通过 `this.exportExcel_NPOI(param)` 触发下载。图片查看使用 `v-viewer` 插件。
|
||||
|
||||
## 样式规范
|
||||
|
||||
全局样式位于 `src/styles/` 目录,包含 `element-ui.scss`(Element UI 覆写)、`variables.scss`(SCSS 变量)、`mixin.scss`(混入)、`sidebar.scss`(侧边栏)、`transition.scss`(过渡动画)。组件内样式使用 `<style scoped>`,深度选择器使用 `>>>` 而非 `/deep/` 或 `::v-deep`。Element UI Dialog 的 `closeOnClickModal` 已全局设为 `false`。
|
||||
|
||||
## 国际化
|
||||
|
||||
项目集成了 `vue-i18n`,Element UI 组件已绑定 i18n。语言包位于 `src/lang/` 目录,包含 `zh.js`(中文)和 `en.js`(英文)。但实际业务代码中大量使用中文硬编码,国际化支持有限。
|
||||
|
||||
## 图标系统
|
||||
|
||||
SVG 图标位于 `src/icons/svg/` 目录,通过 `svg-sprite-loader` 自动注册。在模板中使用 `<svg-icon icon-class="xxx" />` 引用。图标文件名与路由 meta 中的 icon 字段对应,命名采用英文帕斯卡命名法(如 `ProcessPlanning.svg`、`AssemblyExecution.svg`)。
|
||||
|
||||
## 代码风格约束
|
||||
|
||||
不使用 ES6 解构导入组件,使用 `import Vue from 'vue'` 风格。不使用 `async/await`,使用 `.then().catch()` 链式调用。变量命名允许中文拼音或英文,但数据库字段必须使用中文。不添加 ESLint 忽略注释(`// eslint-disable-next-line`)除非绝对必要。不使用箭头函数作为 Vue 生命周期钩子。不引入项目中未使用的第三方库。
|
||||
|
||||
## 新增页面开发流程
|
||||
|
||||
新增页面时:1)在 `src/views/对应模块/` 下创建文件夹和 `index.vue`;2)在 `src/api/对应模块/` 下创建或追加 API 函数;3)后端配置菜单数据后,前端通过动态路由自动加载;4)页面结构遵循搜索栏 + 数据表格的标准布局;5)使用全局工具方法(`CreateData`、`ExecDatabase`、`getTable` 等)进行数据操作;6)表格列字段名使用中文与后端保持一致。
|
||||
|
||||
## 调试与排错
|
||||
|
||||
请求拦截器中会检查 Cookie 中的 `id` 是否存在,不存在则强制登出并刷新页面。登录 API(`name` 为 `菜单系统模块_用户名密码_查询数据_new2` 和 `菜单系统模块_获取角色模块_查询数据`)跳过此检查。控制台日志使用 `console.log`,不使用 `console.error` 输出调试信息。Vue Router 的 `replace` 方法已全局捕获异常避免重复导航报错。
|
||||
|
||||
## GPT/Codex 执行日志
|
||||
|
||||
每次 GPT/Codex 执行完成后,将完整的执行过程使用日志追加到 `/gptlog-process/gpdlog.md`,日志使用中文。
|
||||
|
||||
日志包含提问和结论以及完整的执行过程,写入该文件的日志内容必须使用中文记录。
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
'use strict'
|
||||
const path = require('path')
|
||||
const webpack = require('webpack')
|
||||
const utils = require('./utils')
|
||||
const config = require('../config')
|
||||
const { VueLoaderPlugin } = require('vue-loader')
|
||||
@@ -88,10 +89,19 @@ module.exports = {
|
||||
limit: 10000,
|
||||
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
|
||||
}
|
||||
},
|
||||
{
|
||||
test: /\.txt$/,
|
||||
use: 'raw-loader'
|
||||
}
|
||||
]
|
||||
},
|
||||
plugins: [new VueLoaderPlugin()],
|
||||
plugins: [
|
||||
new VueLoaderPlugin(),
|
||||
// 修改人:Ld 修改时间:2026-08-05 08:13:25; xlsx-style 的 cpexcel 会引用缺失的 cptable,导出 xlsx 时替换为本地兼容模块。
|
||||
new webpack.NormalModuleReplacementPlugin(/^\.\/cptable$/, resolve('src/vendor/xlsx-style-cptable.js')),
|
||||
new webpack.IgnorePlugin(/^\.\/cptable$/)
|
||||
],
|
||||
node: {
|
||||
// prevent webpack from injecting useless setImmediate polyfill because Vue
|
||||
// source contains it (although only uses it if it's native).
|
||||
|
||||
@@ -7,8 +7,8 @@ const os = require('os')
|
||||
|
||||
const networkInterfaces = os.networkInterfaces()
|
||||
|
||||
const ip = networkInterfaces['WLAN'][1] ? networkInterfaces['WLAN'][1].address : networkInterfaces['WLAN'][0].address
|
||||
// const ip = '127.0.0.1'
|
||||
// const ip = networkInterfaces['WLAN'][1] ? networkInterfaces['WLAN'][1].address : networkInterfaces['WLAN'][0].address
|
||||
const ip = '127.0.0.1'
|
||||
module.exports = {
|
||||
dev: {
|
||||
// Paths
|
||||
@@ -27,7 +27,7 @@ module.exports = {
|
||||
// Use Eslint Loader?
|
||||
// If true, your code will be linted during bundling and
|
||||
// linting errors and warnings will be shown in the console.
|
||||
useEslint: true,
|
||||
useEslint: false,
|
||||
// If true, eslint errors and warnings will also be shown in the error overlay
|
||||
// in the browser.
|
||||
showEslintErrorsInOverlay: false,
|
||||
|
||||
756
docs/JY1.0-AI助手知识库与DeepSeek对接设计文档.md
Normal file
@@ -0,0 +1,756 @@
|
||||
# JY1.0 AI 助手、知识库与 DeepSeek 对接设计文档
|
||||
|
||||
## 1. 文档目标
|
||||
|
||||
本文档用于设计面向「景耀 JY1.0」MES 项目的 AI 助手。该助手应具备项目知识问答、业务功能解释、代码定位、开发辅助、排障分析、规范检查和可选业务数据查询能力,并通过 MCP 服务读取项目上下文,通过知识库检索长期知识,通过 DeepSeek 模型生成答案。
|
||||
|
||||
## 2. AI 助手定位
|
||||
|
||||
AI 助手面向三类用户:
|
||||
|
||||
| 用户 | 主要诉求 |
|
||||
| --- | --- |
|
||||
| 前端开发 | 快速理解页面、定位 API、生成符合项目规范的 Vue 2 代码 |
|
||||
| 实施/运维 | 查询功能入口、解释业务流程、排查请求和权限问题 |
|
||||
| 管理/业务人员 | 了解系统模块、查询功能说明、按权限查询只读业务状态 |
|
||||
|
||||
助手边界:
|
||||
|
||||
- 可以解释项目、检索代码、生成建议。
|
||||
- 可以在授权后读取只读业务数据。
|
||||
- 不默认执行生产写操作。
|
||||
- 不保存用户密码、Cookie、token。
|
||||
- 不绕过现有系统权限。
|
||||
|
||||
## 3. 总体架构
|
||||
|
||||
推荐架构:
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
U["用户"] --> UI["AI 助手界面"]
|
||||
UI --> API["AI 助手服务"]
|
||||
API --> LLM["DeepSeek API"]
|
||||
API --> RAG["知识库检索服务"]
|
||||
API --> MCP["JY1.0 MCP 服务"]
|
||||
MCP --> Code["项目代码/文档"]
|
||||
MCP --> Meta["项目索引"]
|
||||
RAG --> VDB["向量库"]
|
||||
RAG --> Doc["文档与代码片段"]
|
||||
API --> Audit["审计日志"]
|
||||
API -.可选只读.-> Biz["MES 业务只读接口"]
|
||||
```
|
||||
|
||||
核心组件:
|
||||
|
||||
| 组件 | 职责 |
|
||||
| --- | --- |
|
||||
| AI 助手界面 | 聊天入口、问题输入、引用展示、审批确认 |
|
||||
| AI 助手服务 | 会话管理、工具编排、RAG 编排、权限控制 |
|
||||
| DeepSeek API | 自然语言理解、推理、答案生成 |
|
||||
| MCP 服务 | 项目代码、结构、页面、API、规范工具 |
|
||||
| 知识库 | 项目文档、代码摘要、业务流程、接口说明 |
|
||||
| 向量库 | 语义检索 |
|
||||
| 审计日志 | 记录工具调用、数据访问、用户问题 |
|
||||
| 业务只读接口 | 可选,查询订单、库存、设备、任务等状态 |
|
||||
|
||||
## 4. DeepSeek 对接方案
|
||||
|
||||
### 4.1 模型选择
|
||||
|
||||
建议按任务选择模型:
|
||||
|
||||
| 任务 | 推荐模型 |
|
||||
| --- | --- |
|
||||
| 日常项目问答、代码解释 | `deepseek-chat` |
|
||||
| 复杂设计、技术路线、长链路排障 | `deepseek-reasoner` |
|
||||
| 低成本批量摘要 | `deepseek-chat` |
|
||||
|
||||
DeepSeek API 兼容 OpenAI 风格的 Chat Completions 接口。建议在服务端使用 OpenAI SDK 兼容方式接入,避免前端暴露 API Key。
|
||||
|
||||
### 4.2 配置方式
|
||||
|
||||
环境变量:
|
||||
|
||||
```bash
|
||||
DEEPSEEK_API_KEY=你的密钥
|
||||
DEEPSEEK_BASE_URL=https://api.deepseek.com
|
||||
DEEPSEEK_MODEL=deepseek-chat
|
||||
```
|
||||
|
||||
Node.js 示例:
|
||||
|
||||
```js
|
||||
import OpenAI from 'openai'
|
||||
|
||||
const client = new OpenAI({
|
||||
apiKey: process.env.DEEPSEEK_API_KEY,
|
||||
baseURL: process.env.DEEPSEEK_BASE_URL || 'https://api.deepseek.com'
|
||||
})
|
||||
|
||||
export function chat(messages) {
|
||||
return client.chat.completions.create({
|
||||
model: process.env.DEEPSEEK_MODEL || 'deepseek-chat',
|
||||
messages: messages,
|
||||
temperature: 0.2
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
### 4.3 调用策略
|
||||
|
||||
- 业务问答:先检索知识库,再调用 DeepSeek。
|
||||
- 代码定位:先调用 MCP 工具,再让模型汇总。
|
||||
- 复杂问题:先让模型生成检索计划,再调用 MCP/RAG,再二次回答。
|
||||
- 代码生成:必须注入 `AGENTS.md` 规范和相似页面代码片段。
|
||||
- 排障:必须附带请求链路、文件路径、后端 `name`、参数。
|
||||
|
||||
### 4.4 Prompt 基线
|
||||
|
||||
系统提示词建议:
|
||||
|
||||
```text
|
||||
你是景耀 JY1.0 MES 项目的 AI 助手。项目使用 Vue 2、Element UI、Vuex、Vue Router、Axios、Webpack 4,不使用 Vue 3、TypeScript、Composition API。业务请求统一通过 MESCommonBase.ashx,使用 CreateData 和 ExecDatabase 构造请求。数据库字段和页面字段多为中文,回答和代码必须保留中文字段名。你必须优先根据知识库和 MCP 工具返回的项目事实回答;不确定时说明需要检索或确认。不得建议绕过权限、不得生成生产写库脚本、不得暴露密钥。
|
||||
```
|
||||
|
||||
开发辅助提示词应补充:
|
||||
|
||||
```text
|
||||
生成代码时遵循现有页面结构:div.app-container > el-card > 搜索栏 + el-table。使用 Vue 2 Options API、Element UI、.then().catch(),不新增第三方库。新增/编辑/删除优先使用全局工具方法。表格字段和请求参数使用后端中文字段名。
|
||||
```
|
||||
|
||||
## 5. 知识库设计
|
||||
|
||||
### 5.1 知识库目标
|
||||
|
||||
知识库用于解决模型“不知道项目细节”的问题。它应覆盖:
|
||||
|
||||
- 项目规则。
|
||||
- 业务模块说明。
|
||||
- 页面与 API 映射。
|
||||
- 后端过程名说明。
|
||||
- 常见问题。
|
||||
- 新增页面范式。
|
||||
- 部署和配置说明。
|
||||
- 历史变更与版本记录。
|
||||
|
||||
### 5.2 知识来源
|
||||
|
||||
| 来源 | 内容 | 入库方式 |
|
||||
| --- | --- | --- |
|
||||
| `AGENTS.md` | 项目 Agent 规则、代码规范 | 原文切片 |
|
||||
| `docs/` | 设计文档、实施文档 | 原文切片 |
|
||||
| `package.json` | 依赖和脚本 | 结构化摘要 |
|
||||
| `src/router` | 路由机制 | 代码摘要 |
|
||||
| `src/utils/request.js` | 请求封装 | 代码摘要 |
|
||||
| `src/utils/curd.js` | 全局 CRUD 方法 | 代码摘要 |
|
||||
| `src/views` | 页面功能、字段、后端调用 | 自动抽取摘要 |
|
||||
| `src/api` | API 函数和后端 `name` | 自动抽取摘要 |
|
||||
| `static/config.js` | 服务地址类型 | 脱敏摘要 |
|
||||
| `static/项目档案.docx` | 项目档案 | docx 转文本后入库 |
|
||||
|
||||
### 5.3 知识分类
|
||||
|
||||
建议知识库分为以下集合:
|
||||
|
||||
| 集合 | 内容 |
|
||||
| --- | --- |
|
||||
| `project_rules` | AGENTS、编码规范、技术栈 |
|
||||
| `architecture` | 路由、请求、状态、构建、部署 |
|
||||
| `business_modules` | 模块和页面说明 |
|
||||
| `api_operations` | 后端 `name`、参数、调用页面 |
|
||||
| `fields` | 中文字段、表格列、表单项 |
|
||||
| `faq` | 常见问题和排障 |
|
||||
| `change_logs` | 提交记录、变更说明 |
|
||||
|
||||
### 5.4 文档切片规则
|
||||
|
||||
Markdown:
|
||||
|
||||
- 按标题层级切片。
|
||||
- 每片 500 到 1200 中文字。
|
||||
- 保留标题路径。
|
||||
- 保留文件路径。
|
||||
|
||||
Vue 文件:
|
||||
|
||||
- template 摘要:页面结构、表格列、弹窗。
|
||||
- script 摘要:data、methods、CreateData 调用。
|
||||
- style 摘要:仅记录特殊样式。
|
||||
- 大文件不整篇入库,使用结构化抽取。
|
||||
|
||||
API 文件:
|
||||
|
||||
- 每个导出函数作为一个知识单元。
|
||||
- 提取函数名、type、name、param、UserID、ModularID。
|
||||
|
||||
后端过程:
|
||||
|
||||
- 每个 `name` 一个知识单元。
|
||||
- 汇总调用文件和参数。
|
||||
|
||||
### 5.5 知识条目结构
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "api:仓储管理_采购件入库_循环执行",
|
||||
"collection": "api_operations",
|
||||
"title": "仓储管理_采购件入库_循环执行",
|
||||
"content": "该后端操作由采购件入库页面 submitInStorage 调用,用于批量执行采购件入库...",
|
||||
"metadata": {
|
||||
"source": "src/views/WarehouseManagement/PurchasePartsStorage/index.vue",
|
||||
"module": "WarehouseManagement",
|
||||
"type": "backend_name",
|
||||
"operationType": "12",
|
||||
"fields": ["物料流水号组", "实际到货数量组", "入库人员流水号"],
|
||||
"updatedAt": "2026-06-10"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 5.6 向量库选型
|
||||
|
||||
本地/内网优先:
|
||||
|
||||
| 方案 | 适用场景 |
|
||||
| --- | --- |
|
||||
| Chroma | 快速原型、本地部署简单 |
|
||||
| Qdrant | 生产部署、性能和过滤较好 |
|
||||
| Milvus | 大规模、多项目知识库 |
|
||||
| SQLite + sqlite-vec | 单机轻量化 |
|
||||
|
||||
推荐路线:
|
||||
|
||||
- 原型阶段:Chroma 或 SQLite。
|
||||
- 内网生产:Qdrant。
|
||||
- 多系统统一知识库:Milvus。
|
||||
|
||||
### 5.7 Embedding 模型
|
||||
|
||||
DeepSeek 主要用于对话,不建议假设其提供可用的 embedding 服务。中文项目建议:
|
||||
|
||||
| 模型 | 特点 |
|
||||
| --- | --- |
|
||||
| `BAAI/bge-m3` | 中英多语、长文本、综合能力好 |
|
||||
| `bge-large-zh-v1.5` | 中文语义检索效果好 |
|
||||
| `text2vec-large-chinese` | 中文轻量方案 |
|
||||
|
||||
部署方式:
|
||||
|
||||
- 内网 GPU:本地 embedding 服务。
|
||||
- 无 GPU:CPU 量化模型或商用 embedding API。
|
||||
|
||||
## 6. RAG 检索流程
|
||||
|
||||
标准流程:
|
||||
|
||||
1. 用户提问。
|
||||
2. 意图识别:项目问答、代码定位、业务查询、开发生成、排障。
|
||||
3. 查询改写:补充同义词,如“入库”扩展到“采购件入库、外协入库、自制件入库”。
|
||||
4. 多路检索:
|
||||
- 向量检索文档。
|
||||
- BM25/关键词检索中文字段和后端 `name`。
|
||||
- MCP 工具检索代码结构。
|
||||
5. 重排:优先同模块、同页面、同后端 `name`。
|
||||
6. 构造上下文。
|
||||
7. DeepSeek 生成答案。
|
||||
8. 输出引用来源。
|
||||
9. 记录审计。
|
||||
|
||||
回答必须包含:
|
||||
|
||||
- 结论。
|
||||
- 文件/模块来源。
|
||||
- 如果是代码建议,说明需修改哪些文件。
|
||||
- 如果不确定,说明缺少什么信息。
|
||||
|
||||
## 7. AI 助手功能设计
|
||||
|
||||
### 7.1 项目问答
|
||||
|
||||
示例问题:
|
||||
|
||||
- “这个项目怎么新增一个页面?”
|
||||
- “`CreateData` 参数怎么传?”
|
||||
- “仓储管理有哪些页面?”
|
||||
- “菜单权限是怎么生成路由的?”
|
||||
|
||||
实现:
|
||||
|
||||
- 检索 `project_rules`、`architecture`。
|
||||
- 调用 MCP `list_business_modules` 或 `analyze_vue_page`。
|
||||
|
||||
### 7.2 业务功能解释
|
||||
|
||||
示例问题:
|
||||
|
||||
- “采购件入库页面做了什么?”
|
||||
- “装配执行的开始、暂停、完成分别调用哪个后端过程?”
|
||||
- “零件追溯在哪个页面?”
|
||||
|
||||
实现:
|
||||
|
||||
- MCP 分析页面。
|
||||
- 检索 `business_modules`、`api_operations`。
|
||||
- 输出操作流程、后端调用、关键字段。
|
||||
|
||||
### 7.3 代码定位
|
||||
|
||||
示例问题:
|
||||
|
||||
- “查找所有调用 `装配执行_完成装配` 的地方。”
|
||||
- “哪个页面用了字段 `订单编号`?”
|
||||
- “库存查询页面在哪里?”
|
||||
|
||||
实现:
|
||||
|
||||
- MCP `trace_backend_name`。
|
||||
- MCP `find_chinese_field`。
|
||||
- MCP `find_pages_by_keyword`。
|
||||
|
||||
### 7.4 新功能开发辅助
|
||||
|
||||
示例问题:
|
||||
|
||||
- “新增一个库存预警页面。”
|
||||
- “给采购订单查询增加供应商筛选。”
|
||||
- “新增一个导出按钮。”
|
||||
|
||||
实现:
|
||||
|
||||
- 检索相似页面。
|
||||
- 注入项目规范。
|
||||
- 生成最小改动方案。
|
||||
- 调用规范检查工具。
|
||||
|
||||
输出:
|
||||
|
||||
- 修改文件。
|
||||
- 代码片段。
|
||||
- 后端需要提供的 `name` 和字段。
|
||||
- 测试清单。
|
||||
|
||||
### 7.5 排障分析
|
||||
|
||||
示例问题:
|
||||
|
||||
- “登录后页面空白。”
|
||||
- “接口提示账号登录失效。”
|
||||
- “新增页面菜单点不开。”
|
||||
- “入库按钮点了没反应。”
|
||||
|
||||
实现:
|
||||
|
||||
- 检索 FAQ。
|
||||
- MCP 分析页面请求。
|
||||
- 检查路由、Cookie、后端 `name`、参数、返回结构。
|
||||
|
||||
### 7.6 规范检查
|
||||
|
||||
示例问题:
|
||||
|
||||
- “检查这个页面是否符合项目规范。”
|
||||
- “这次改动有没有用了 Vue 3 写法?”
|
||||
|
||||
实现:
|
||||
|
||||
- MCP `check_jy_conventions`。
|
||||
- 输出问题等级、路径、行号、修复建议。
|
||||
|
||||
### 7.7 只读业务查询
|
||||
|
||||
可选能力:
|
||||
|
||||
- 查询订单状态。
|
||||
- 查询库存汇总。
|
||||
- 查询设备状态。
|
||||
- 查询装配任务。
|
||||
- 查询采购到货。
|
||||
|
||||
要求:
|
||||
|
||||
- 使用独立业务只读代理。
|
||||
- 不允许任意 SQL。
|
||||
- 绑定当前登录用户。
|
||||
- 记录审计日志。
|
||||
- 对敏感字段脱敏。
|
||||
|
||||
## 8. AI 助手服务接口设计
|
||||
|
||||
### 8.1 聊天接口
|
||||
|
||||
`POST /api/ai/chat`
|
||||
|
||||
请求:
|
||||
|
||||
```json
|
||||
{
|
||||
"sessionId": "s001",
|
||||
"userId": "10001",
|
||||
"message": "采购件入库页面在哪里?",
|
||||
"context": {
|
||||
"currentRoute": "/WarehouseManagement/PurchasePartsStorage"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
响应:
|
||||
|
||||
```json
|
||||
{
|
||||
"answer": "采购件入库页面位于 ...",
|
||||
"citations": [
|
||||
{
|
||||
"type": "code",
|
||||
"path": "src/views/WarehouseManagement/PurchasePartsStorage/index.vue"
|
||||
}
|
||||
],
|
||||
"toolCalls": [
|
||||
{
|
||||
"name": "find_pages_by_keyword",
|
||||
"status": "success"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 8.2 知识库检索接口
|
||||
|
||||
`POST /api/knowledge/search`
|
||||
|
||||
```json
|
||||
{
|
||||
"query": "动态路由",
|
||||
"collections": ["architecture", "project_rules"],
|
||||
"topK": 5
|
||||
}
|
||||
```
|
||||
|
||||
### 8.3 知识库重建接口
|
||||
|
||||
`POST /api/knowledge/rebuild`
|
||||
|
||||
```json
|
||||
{
|
||||
"scope": "all",
|
||||
"force": false
|
||||
}
|
||||
```
|
||||
|
||||
### 8.4 页面分析接口
|
||||
|
||||
`POST /api/project/analyze-page`
|
||||
|
||||
```json
|
||||
{
|
||||
"path": "src/views/AssemblyManagement/AssemblyExecution/index.vue"
|
||||
}
|
||||
```
|
||||
|
||||
## 9. 数据库与存储设计
|
||||
|
||||
### 9.1 会话表
|
||||
|
||||
| 字段 | 说明 |
|
||||
| --- | --- |
|
||||
| `id` | 会话 ID |
|
||||
| `user_id` | 用户 ID |
|
||||
| `title` | 会话标题 |
|
||||
| `created_at` | 创建时间 |
|
||||
| `updated_at` | 更新时间 |
|
||||
|
||||
### 9.2 消息表
|
||||
|
||||
| 字段 | 说明 |
|
||||
| --- | --- |
|
||||
| `id` | 消息 ID |
|
||||
| `session_id` | 会话 ID |
|
||||
| `role` | user/assistant/tool |
|
||||
| `content` | 内容 |
|
||||
| `metadata` | 引用、工具调用、token |
|
||||
| `created_at` | 创建时间 |
|
||||
|
||||
### 9.3 知识文档表
|
||||
|
||||
| 字段 | 说明 |
|
||||
| --- | --- |
|
||||
| `id` | 文档 ID |
|
||||
| `source_path` | 来源路径 |
|
||||
| `collection` | 集合 |
|
||||
| `title` | 标题 |
|
||||
| `content_hash` | 内容哈希 |
|
||||
| `metadata` | 元数据 |
|
||||
| `updated_at` | 更新时间 |
|
||||
|
||||
### 9.4 工具审计表
|
||||
|
||||
| 字段 | 说明 |
|
||||
| --- | --- |
|
||||
| `id` | 审计 ID |
|
||||
| `user_id` | 用户 |
|
||||
| `tool_name` | 工具名 |
|
||||
| `input` | 输入,敏感字段脱敏 |
|
||||
| `output_summary` | 输出摘要 |
|
||||
| `status` | success/error |
|
||||
| `created_at` | 时间 |
|
||||
|
||||
## 10. 权限与安全设计
|
||||
|
||||
### 10.1 用户认证
|
||||
|
||||
可选方案:
|
||||
|
||||
- 与现有 MES 登录态集成。
|
||||
- 独立 AI 助手账号。
|
||||
- 内网单点登录。
|
||||
|
||||
建议:
|
||||
|
||||
- 前期使用独立账号和角色。
|
||||
- 后期接入 MES Cookie/session,并复用角色权限。
|
||||
|
||||
### 10.2 权限矩阵
|
||||
|
||||
| 功能 | 开发 | 实施 | 业务 |
|
||||
| --- | --- | --- | --- |
|
||||
| 项目文档问答 | 允许 | 允许 | 部分允许 |
|
||||
| 代码检索 | 允许 | 部分允许 | 禁止 |
|
||||
| 代码生成 | 允许 | 禁止 | 禁止 |
|
||||
| 业务功能解释 | 允许 | 允许 | 允许 |
|
||||
| 只读业务查询 | 部分允许 | 允许 | 按角色 |
|
||||
| 写业务数据 | 禁止 | 禁止 | 禁止 |
|
||||
| 知识库重建 | 允许 | 禁止 | 禁止 |
|
||||
|
||||
### 10.3 防护措施
|
||||
|
||||
- API Key 只放服务端环境变量。
|
||||
- 日志脱敏。
|
||||
- 工具调用白名单。
|
||||
- 禁止任意 SQL。
|
||||
- 禁止任意 shell。
|
||||
- 业务数据查询按角色过滤。
|
||||
- 生产写操作默认禁用。
|
||||
|
||||
## 11. 前端集成方案
|
||||
|
||||
### 11.1 独立 AI 助手页面
|
||||
|
||||
在现有项目新增:
|
||||
|
||||
```text
|
||||
src/views/AIAssistant/index.vue
|
||||
```
|
||||
|
||||
功能:
|
||||
|
||||
- 左侧会话列表。
|
||||
- 中间聊天窗口。
|
||||
- 右侧引用来源。
|
||||
- 支持复制答案、查看文件路径。
|
||||
- 支持按模块选择上下文。
|
||||
|
||||
页面仍使用 Vue 2 + Element UI。
|
||||
|
||||
### 11.2 嵌入式浮窗
|
||||
|
||||
在 `src/views/layout/components/Navbar.vue` 增加 AI 入口,点击打开右侧抽屉。
|
||||
|
||||
适合:
|
||||
|
||||
- 当前页面上下文问答。
|
||||
- “解释当前页面”。
|
||||
- “检查当前页面问题”。
|
||||
|
||||
### 11.3 权限菜单
|
||||
|
||||
后端菜单需新增:
|
||||
|
||||
- AI 助手。
|
||||
- AI 知识库管理。
|
||||
- AI 审计日志。
|
||||
|
||||
对应路由仍通过动态菜单注入。
|
||||
|
||||
## 12. 知识库更新机制
|
||||
|
||||
### 12.1 手动更新
|
||||
|
||||
开发者点击“重建知识库”或执行脚本:
|
||||
|
||||
```bash
|
||||
node scripts/build-knowledge.js --root D:/景耀/JY1.0
|
||||
```
|
||||
|
||||
### 12.2 Git Hook 更新
|
||||
|
||||
在提交或部署后触发:
|
||||
|
||||
- 检测变更文件。
|
||||
- 只重建变更页面/API/文档。
|
||||
- 更新向量库和索引。
|
||||
|
||||
### 12.3 定时更新
|
||||
|
||||
每天夜间:
|
||||
|
||||
- 扫描 `docs`、`src/views`、`src/api`。
|
||||
- 对比 hash。
|
||||
- 增量更新。
|
||||
|
||||
## 13. 技术路线
|
||||
|
||||
### 阶段 1:文档与代码知识库
|
||||
|
||||
周期:1 到 2 周。
|
||||
|
||||
任务:
|
||||
|
||||
- 建立知识库目录。
|
||||
- 编写项目规则、功能矩阵、API 映射文档。
|
||||
- 搭建向量库。
|
||||
- 实现 Markdown、Vue、JS 文件切片。
|
||||
- 接入 DeepSeek 基础问答。
|
||||
|
||||
验收:
|
||||
|
||||
- 能回答项目技术栈、目录结构、请求规范。
|
||||
- 能根据关键词找到页面。
|
||||
- 回答带来源。
|
||||
|
||||
### 阶段 2:MCP 工具接入
|
||||
|
||||
周期:2 到 3 周。
|
||||
|
||||
任务:
|
||||
|
||||
- 实现 MCP 服务。
|
||||
- 提供项目结构、页面分析、后端 `name` 反查工具。
|
||||
- AI 助手支持工具调用。
|
||||
|
||||
验收:
|
||||
|
||||
- 能分析指定 Vue 页面。
|
||||
- 能列出页面后端调用。
|
||||
- 能检查代码规范。
|
||||
|
||||
### 阶段 3:开发辅助能力
|
||||
|
||||
周期:2 周。
|
||||
|
||||
任务:
|
||||
|
||||
- 新增页面生成 Prompt。
|
||||
- 相似页面检索。
|
||||
- 代码规范检查。
|
||||
- 生成测试清单。
|
||||
|
||||
验收:
|
||||
|
||||
- 能生成符合 Vue 2 + Element UI + `CreateData` 风格的页面骨架。
|
||||
- 能解释需要后端配置的菜单和过程名。
|
||||
|
||||
### 阶段 4:业务只读查询
|
||||
|
||||
周期:3 到 4 周。
|
||||
|
||||
任务:
|
||||
|
||||
- 梳理只读业务查询白名单。
|
||||
- 建立业务查询代理。
|
||||
- 接入用户权限。
|
||||
- 增加审计。
|
||||
|
||||
验收:
|
||||
|
||||
- 能查询订单状态、库存概况、设备状态。
|
||||
- 无任意 SQL 能力。
|
||||
- 数据按用户权限过滤。
|
||||
|
||||
### 阶段 5:系统化运营
|
||||
|
||||
周期:持续。
|
||||
|
||||
任务:
|
||||
|
||||
- 增加问题反馈。
|
||||
- 建立 FAQ。
|
||||
- 统计高频问题。
|
||||
- 自动生成模块文档。
|
||||
- 结合提交记录生成变更说明。
|
||||
|
||||
## 14. 推荐代码仓库结构
|
||||
|
||||
建议在项目中新增:
|
||||
|
||||
```text
|
||||
docs/
|
||||
JY1.0-MCP服务设计文档.md
|
||||
JY1.0-AI助手知识库与DeepSeek对接设计文档.md
|
||||
功能矩阵.md
|
||||
后端过程清单.md
|
||||
常见问题.md
|
||||
|
||||
mcp-server/
|
||||
package.json
|
||||
src/
|
||||
server.js
|
||||
tools/
|
||||
project.js
|
||||
vue.js
|
||||
api.js
|
||||
conventions.js
|
||||
resources/
|
||||
project.js
|
||||
indexer/
|
||||
scan.js
|
||||
parseVue.js
|
||||
parseApi.js
|
||||
|
||||
ai-assistant-server/
|
||||
package.json
|
||||
src/
|
||||
app.js
|
||||
llm/deepseek.js
|
||||
rag/search.js
|
||||
rag/ingest.js
|
||||
mcp/client.js
|
||||
auth/
|
||||
audit/
|
||||
```
|
||||
|
||||
是否放在同一仓库取决于部署策略:
|
||||
|
||||
- 开发阶段可放同仓库,便于读取代码。
|
||||
- 生产阶段建议 MCP/AI 服务独立仓库,JY1.0 仓库只保留文档和客户端入口。
|
||||
|
||||
## 15. 关键风险与应对
|
||||
|
||||
| 风险 | 影响 | 应对 |
|
||||
| --- | --- | --- |
|
||||
| 源码存在编码异常 | 解析中文字段困难 | 逐步 UTF-8 规范化,索引器容错 |
|
||||
| 后端过程无正式文档 | AI 难以准确解释参数 | 从前端调用自动抽取,后续人工补全 |
|
||||
| 页面内直接写请求较多 | API 映射分散 | MCP 扫描 `CreateData` 调用 |
|
||||
| 任意 SQL 调用历史存在 | 安全风险 | AI 工具不暴露任意 SQL |
|
||||
| DeepSeek 输出幻觉 | 错误建议 | 强制 RAG 引用和工具来源 |
|
||||
| 生产数据敏感 | 合规风险 | 只读白名单、脱敏、审计 |
|
||||
|
||||
## 16. 验收清单
|
||||
|
||||
AI 助手上线前应验证:
|
||||
|
||||
- 能回答项目结构和技术栈。
|
||||
- 能解释统一请求机制。
|
||||
- 能检索所有主要业务模块。
|
||||
- 能定位指定页面路径。
|
||||
- 能反查后端 `name` 调用点。
|
||||
- 能抽取页面表格字段。
|
||||
- 能按项目规范生成 Vue 2 页面建议。
|
||||
- 能接入 DeepSeek 且 API Key 不出现在前端。
|
||||
- 知识库回答包含来源。
|
||||
- 审计日志可查看。
|
||||
- 默认不具备生产写库能力。
|
||||
|
||||
## 17. 参考资料
|
||||
|
||||
- Model Context Protocol 官方文档:https://modelcontextprotocol.io/
|
||||
- DeepSeek API 官方文档:https://api-docs.deepseek.com/
|
||||
943
docs/JY1.0-MCP服务设计文档.md
Normal file
@@ -0,0 +1,943 @@
|
||||
# JY1.0 项目结构、功能全景与 MCP 服务设计文档
|
||||
|
||||
## 1. 文档目标
|
||||
|
||||
本文档用于指导为「景耀 JY1.0」MES 前端项目创建配套 MCP 服务,使 AI 助手能够安全、可控地理解项目结构、查询业务功能、定位页面/API、生成代码建议、辅助排障,并在授权范围内调用项目相关工具。
|
||||
|
||||
本文档覆盖:
|
||||
|
||||
- 当前前端项目结构与技术栈。
|
||||
- 现有业务功能模块全景。
|
||||
- 前端与 ASP.NET `.ashx` 后端的通信规范。
|
||||
- MCP 服务的资源、工具、提示词、权限和数据模型设计。
|
||||
- MCP 服务的实施路线、部署方式和验收标准。
|
||||
|
||||
## 2. 项目概述
|
||||
|
||||
JY1.0 是江苏高精机械设备有限公司使用的制造执行系统前端,基于 Vue 2 和 Element UI 构建,后端以 ASP.NET 通用处理程序 `.ashx` 暴露统一入口。系统覆盖销售、基础资料、技术、精工车间、装配、采购、仓储、设备、可视化等制造业务。
|
||||
|
||||
项目特点:
|
||||
|
||||
- 前端为单页应用,基于 `vue-element-admin` 改造。
|
||||
- 运行时路由主要由后端菜单数据动态注入。
|
||||
- 业务请求统一 POST 到 `MESCommonBase.ashx` 一类端点。
|
||||
- 业务字段大量使用中文数据库字段名。
|
||||
- 页面以 Element UI 表单、筛选栏、表格、弹窗、分页为主。
|
||||
- 文件上传下载、Excel 导出、图片/PDF 查看属于重要业务能力。
|
||||
|
||||
## 3. 技术栈
|
||||
|
||||
| 类别 | 技术 |
|
||||
| --- | --- |
|
||||
| 框架 | Vue 2.5.17 |
|
||||
| 路由 | Vue Router 3.0.7 |
|
||||
| 状态 | Vuex 3.0.1 |
|
||||
| UI | Element UI 2.13 |
|
||||
| HTTP | Axios 0.18 |
|
||||
| 图表 | ECharts 4 |
|
||||
| 构建 | Webpack 4 |
|
||||
| 样式 | SCSS、Stylus |
|
||||
| 文档/导出 | xlsx、xlsx-style、FileSaver、jsPDF、html2canvas、docxtemplater |
|
||||
| 鉴权存储 | js-cookie |
|
||||
| 富文本 | TinyMCE 4.7.5 |
|
||||
| 预览 | v-viewer |
|
||||
|
||||
约束:
|
||||
|
||||
- 不使用 Vue 3。
|
||||
- 不使用 TypeScript。
|
||||
- 不使用 Composition API。
|
||||
- 业务页面保持 Vue 2 Options API 风格。
|
||||
- 请求封装沿用现有 `CreateData`、`ExecDatabase`、`getTable` 等全局方法。
|
||||
|
||||
## 4. 项目目录结构
|
||||
|
||||
根目录主要内容:
|
||||
|
||||
| 路径 | 说明 |
|
||||
| --- | --- |
|
||||
| `src/` | 前端源码 |
|
||||
| `src/views/` | 页面视图,按业务模块组织 |
|
||||
| `src/api/` | API 函数,部分新页面直接在视图内调用 `CreateData` |
|
||||
| `src/utils/` | 请求封装、CRUD 工具、鉴权、通用方法 |
|
||||
| `src/router/` | 静态路由与动态路由生成 |
|
||||
| `src/store/` | Vuex 模块 |
|
||||
| `src/components/` | 通用组件 |
|
||||
| `src/icons/svg/` | SVG 图标 |
|
||||
| `src/styles/` | 全局样式 |
|
||||
| `static/config.js` | 服务地址、上传下载地址、WebSocket 地址 |
|
||||
| `build/`、`config/` | Webpack 构建配置 |
|
||||
| `dist/`、`dist.zip`、`dist.7z` | 构建产物 |
|
||||
|
||||
`src/views` 已识别的业务目录:
|
||||
|
||||
| 模块目录 | 功能定位 |
|
||||
| --- | --- |
|
||||
| `SalesManagement` | 销售、合同、订单、发货、售后、统计分析 |
|
||||
| `BasicData` | 基础资料、人员、角色、菜单、工艺、班次、日历、物料 |
|
||||
| `TechnologyCenter` | 技术中心、BOM、图纸、物料查询、图纸确认 |
|
||||
| `SeikoWorkshop` | 精工车间、工艺制定、生产计划、派工、执行、质检、追溯 |
|
||||
| `AssemblyManagement` | 装配任务、装配执行、领料、补货、滑台/专机装配 |
|
||||
| `PurchasingManagement` | 采购订单、到货通知、供应商、外协采购查询 |
|
||||
| `WarehouseManagement` | 仓储、入库、出库、库存、盘点、调拨、补货、库位 |
|
||||
| `DeviceManagement` | 设备状态、点检、维修、实时监控、能耗、异常原因 |
|
||||
| `ManufacturingCenter` | 制造中心相关页面 |
|
||||
| `WarehouseVisualization` | 仓库可视化 |
|
||||
| `dashboard` | 首页仪表盘 |
|
||||
| `login` | 登录页 |
|
||||
| `layout` | 主框架、导航、侧边栏、标签页 |
|
||||
|
||||
## 5. 业务功能全景
|
||||
|
||||
### 5.1 登录、权限与菜单
|
||||
|
||||
核心文件:
|
||||
|
||||
- `src/api/login.js`
|
||||
- `src/store/modules/user.js`
|
||||
- `src/store/modules/permission.js`
|
||||
- `src/router/index.js`
|
||||
- `src/router/getRouter.js`
|
||||
- `src/permission.js`
|
||||
|
||||
功能:
|
||||
|
||||
- 用户名密码登录。
|
||||
- Cookie 保存 token、用户姓名、人员流水号、工号等。
|
||||
- 登录后获取用户信息和角色菜单。
|
||||
- 后端返回菜单数据,前端按 `pid` 递归构建路由。
|
||||
- 动态组件路径映射到 `src/views` 下的 Vue 文件。
|
||||
- 路由 `meta.title` 为中文标题,`meta.icon` 对应 `src/icons/svg` 文件。
|
||||
|
||||
动态路由核心模式:
|
||||
|
||||
```js
|
||||
component: () => import(`@/views${data[i].component}`)
|
||||
```
|
||||
|
||||
### 5.2 统一请求机制
|
||||
|
||||
核心文件:
|
||||
|
||||
- `src/utils/request.js`
|
||||
- `src/utils/curd.js`
|
||||
- `static/config.js`
|
||||
|
||||
请求入口:
|
||||
|
||||
- Axios `baseURL` 来自 `static/config.js` 的 `request_config`。
|
||||
- 业务请求 `url` 通常为空字符串。
|
||||
- 由后端统一入口根据 `name` 字段路由到存储过程或 SQL 逻辑。
|
||||
|
||||
标准请求字段:
|
||||
|
||||
| 字段 | 说明 |
|
||||
| --- | --- |
|
||||
| `type` | 操作类型,常见为 `1` 查询、`2` 增删改、`7` 批量,也存在项目内扩展值如 `11`、`12`、`2001` |
|
||||
| `name` | 后端过程名、业务路由名或特殊 SQL 字符串 |
|
||||
| `param` | 参数,旧 API 多为 `key=value&key2=value2`,新全局方法多为参数数组 JSON 字符串 |
|
||||
| `pageSize` | 分页大小 |
|
||||
| `pageList` | 当前页 |
|
||||
| `UserID` | 当前用户,来自 Cookie |
|
||||
| `ModularID` | 当前路由路径 |
|
||||
|
||||
全局工具:
|
||||
|
||||
| 方法 | 用途 |
|
||||
| --- | --- |
|
||||
| `CreateData(type, name, data, pageSize, pageList)` | 构建后端请求参数 |
|
||||
| `ExecDatabase(num)` | 向主服务发送 POST |
|
||||
| `ExecDatabase1(num)` | 向备用服务发送 POST |
|
||||
| `getTable(requestData, param, e)` | 分页表格查询并格式化日期 |
|
||||
| `getData(requestData, carrier, param)` | 普通查询 |
|
||||
| `getSelect(requestData, select, carrier, param)` | 下拉框查询 |
|
||||
| `addForm(form, callback)` | 打开新增表单并重置 |
|
||||
| `editForm(row, form, callback)` | 行数据填充到编辑表单 |
|
||||
| `addTable(...)` | 新增表格行 |
|
||||
| `editTable(...)` | 编辑表格行 |
|
||||
| `deleteRow(...)` | 删除表格行 |
|
||||
| `exportExcel_NPOI(param)` | 触发后端 NPOI Excel 导出 |
|
||||
| `setColumnWidth(str)` | 按中文字段名设置表格列宽 |
|
||||
|
||||
### 5.3 基础数据
|
||||
|
||||
目录:
|
||||
|
||||
- `src/views/BasicData`
|
||||
- `src/api/BasicData`
|
||||
|
||||
覆盖功能:
|
||||
|
||||
- 菜单管理。
|
||||
- 系统角色维护。
|
||||
- 用户权限管理。
|
||||
- 人员管理。
|
||||
- 车间人员角色管理。
|
||||
- 班次管理。
|
||||
- 工厂日历。
|
||||
- 物料维护。
|
||||
- 零件编号维护。
|
||||
- 工艺分类、工艺名称、工艺要求维护。
|
||||
- 设备能力设置。
|
||||
- 设备人员维护。
|
||||
- 项目管理显示。
|
||||
|
||||
MCP 需识别这些页面与 API 名称,支持按中文功能名定位文件、定位后端 `name` 调用点。
|
||||
|
||||
### 5.4 销售管理
|
||||
|
||||
目录:
|
||||
|
||||
- `src/views/SalesManagement`
|
||||
- `src/api/SalesManagement`
|
||||
|
||||
覆盖功能:
|
||||
|
||||
- 客户管理。
|
||||
- 公司信息维护。
|
||||
- 产品维护。
|
||||
- 报价创建。
|
||||
- 销售合同、机床合同、售后合同。
|
||||
- 合同查询、合同审核、合同新版页面。
|
||||
- 订单管理、订单下发、订单查询、订单审核。
|
||||
- 订单进度、订单进度总览、订单追溯、物料追溯。
|
||||
- 发货通知、发货记录、发货审核、产品发货、发货通知查询。
|
||||
- 售后、售后查询。
|
||||
- 统计分析:区域销售、订单趋势、产品类别、产品占比、产品定价、设备利用率、工时统计等。
|
||||
|
||||
### 5.5 技术中心
|
||||
|
||||
目录:
|
||||
|
||||
- `src/views/TechnologyCenter`
|
||||
|
||||
覆盖功能:
|
||||
|
||||
- BOM 基础数据。
|
||||
- BOM 维护、BOM 查询、BOM 库存查询。
|
||||
- BOM 导入。
|
||||
- 物料维护、物料查询。
|
||||
- 零件图导入。
|
||||
- 图纸确认、图纸确认分发、图纸确认查询。
|
||||
|
||||
### 5.6 精工车间
|
||||
|
||||
目录:
|
||||
|
||||
- `src/views/SeikoWorkshop`
|
||||
|
||||
覆盖功能:
|
||||
|
||||
- 工艺制定、工艺文档管理、工序查询。
|
||||
- 生产计划、生产任务查询。
|
||||
- 车间派工、生产执行、在加工零件。
|
||||
- 零件追溯、订单工时、工时统计。
|
||||
- 工况页面、设备监控。
|
||||
- 物料审核、采购合同审核。
|
||||
- 质检维护、自检记录、质检信息查询、采购质检、其他质检。
|
||||
- 报废投产、其他工作完成、测试数据录入。
|
||||
- Andon/异常提示相关页面。
|
||||
|
||||
### 5.7 装配管理
|
||||
|
||||
目录:
|
||||
|
||||
- `src/views/AssemblyManagement`
|
||||
|
||||
覆盖功能:
|
||||
|
||||
- 装配任务查询。
|
||||
- 接收装配任务。
|
||||
- 装配执行。
|
||||
- 专机装配执行。
|
||||
- 滑台装配执行。
|
||||
- 补货单、滑台补货单。
|
||||
- 装配领料、临时领料。
|
||||
- 装配开始、完成、自检、暂停、恢复、打回。
|
||||
- 装配参数、调试数据、滑台调试数据维护。
|
||||
|
||||
### 5.8 采购管理
|
||||
|
||||
目录:
|
||||
|
||||
- `src/views/PurchasingManagement`
|
||||
|
||||
覆盖功能:
|
||||
|
||||
- 供应商管理。
|
||||
- 到货通知。
|
||||
- 采购订单。
|
||||
- 外协采购订单。
|
||||
- 订单查询。
|
||||
- 外协订单查询。
|
||||
- 外购件查询。
|
||||
- 外协件查询。
|
||||
|
||||
### 5.9 仓储管理
|
||||
|
||||
目录:
|
||||
|
||||
- `src/views/WarehouseManagement`
|
||||
|
||||
覆盖功能:
|
||||
|
||||
- 采购件入库。
|
||||
- 外协入库。
|
||||
- 入库扫描。
|
||||
- 入库记录、采购入库记录、外协记录、主轴库存记录。
|
||||
- 出库、出库明细、采购出库记录。
|
||||
- 领料单查询、物料领用。
|
||||
- 退料记录。
|
||||
- 库存查询、库存记录、库存汇总、库存盘点。
|
||||
- 调拨查询、外协调拨。
|
||||
- 补货、补货查询、新补货查询。
|
||||
- 库位管理、物料库位、模具管理。
|
||||
- 外协厂维护。
|
||||
- 仓库可视化。
|
||||
|
||||
### 5.10 设备管理
|
||||
|
||||
目录:
|
||||
|
||||
- `src/views/DeviceManagement`
|
||||
|
||||
覆盖功能:
|
||||
|
||||
- 设备状态。
|
||||
- 设备状态监控。
|
||||
- 设备信息。
|
||||
- 实时信息、历史信息、当前监控。
|
||||
- 点检、点检记录。
|
||||
- 维修记录。
|
||||
- 设备能耗。
|
||||
- 灯控。
|
||||
- 不合格原因。
|
||||
|
||||
### 5.11 文件、打印、导出和可视化
|
||||
|
||||
功能:
|
||||
|
||||
- 文件上传:`uploadFile.ashx`、`MESUploadFile.ashx`、`uploadOP.ashx`、`uploadPerson.ashx` 等。
|
||||
- 文件下载:`downloadFile.ashx`、`MESDownloadFile.ashx`、`MESDownloadFileNew.ashx` 等。
|
||||
- Excel 导出:通过 `ExcelDownLoad` 指向统一服务。
|
||||
- 图片/PDF 查看:`v-viewer`、文件服务接口。
|
||||
- 条码/二维码:`@xkeshi/vue-barcode`、`qrcode`。
|
||||
- 图表:ECharts。
|
||||
- 3D/可视化:仓储可视化、设备监控中存在图片、布局图和部分 Three.js 依赖。
|
||||
|
||||
## 6. MCP 服务总体设计
|
||||
|
||||
### 6.1 MCP 服务定位
|
||||
|
||||
MCP 服务作为 AI 助手和 JY1.0 项目之间的受控桥梁,负责提供:
|
||||
|
||||
- 项目结构检索。
|
||||
- 页面、组件、API、路由定位。
|
||||
- 业务功能索引。
|
||||
- 后端 `name` 调用点分析。
|
||||
- 中文字段与页面表格列提取。
|
||||
- 代码规范检查。
|
||||
- 文档知识库检索。
|
||||
- 可选的只读运行状态查询。
|
||||
- 经审批的代码生成建议。
|
||||
|
||||
MCP 服务不应直接绕过现有前端权限去修改生产业务数据。所有业务数据写操作必须默认关闭,除非后续建立明确的审批、审计和沙箱机制。
|
||||
|
||||
### 6.2 设计原则
|
||||
|
||||
- 只读优先:默认工具只读取代码、文档和元数据。
|
||||
- 最小权限:按工具粒度授权,不暴露任意 shell。
|
||||
- 中文友好:所有业务搜索支持中文字段、中文页面名、中文过程名。
|
||||
- 可追溯:工具返回文件路径、行号、调用链、数据来源。
|
||||
- 与现有规范兼容:保留 Vue 2、Element UI、统一 `.ashx` 请求模式。
|
||||
- 安全隔离:生产数据库写操作不通过 MCP 直接暴露。
|
||||
|
||||
### 6.3 推荐技术选型
|
||||
|
||||
| 层 | 方案 |
|
||||
| --- | --- |
|
||||
| MCP SDK | Node.js MCP SDK 或 Python MCP SDK |
|
||||
| 语言 | Node.js 18+ 优先,便于解析 JS/Vue 项目 |
|
||||
| 传输 | 本地 stdio 用于 IDE/桌面助手;内网可选 Streamable HTTP |
|
||||
| 索引 | ripgrep + 自建 JSON 索引 |
|
||||
| 代码解析 | `@babel/parser`、`vue-template-compiler`、正则辅助 |
|
||||
| 文档解析 | Markdown 原生、docx 可用 mammoth |
|
||||
| 向量库 | 本地 Chroma/Qdrant/Milvus,轻量阶段可用 SQLite + 向量扩展 |
|
||||
| 嵌入模型 | DeepSeek 不提供嵌入时,可选 bge-m3、bge-large-zh、text2vec |
|
||||
| LLM | DeepSeek Chat / DeepSeek Reasoner |
|
||||
|
||||
## 7. MCP Resources 设计
|
||||
|
||||
Resources 用于暴露只读上下文。
|
||||
|
||||
| Resource URI | 内容 | 来源 |
|
||||
| --- | --- | --- |
|
||||
| `jy://project/overview` | 项目概览、技术栈、目录说明 | 自动生成 |
|
||||
| `jy://project/package` | `package.json` 依赖、脚本 | `package.json` |
|
||||
| `jy://project/config` | 服务地址配置摘要,敏感值脱敏 | `static/config.js` |
|
||||
| `jy://router/static` | 静态路由 | `src/router/index.js` |
|
||||
| `jy://router/dynamic-builder` | 动态路由生成逻辑 | `src/router/getRouter.js` |
|
||||
| `jy://api/request-wrapper` | 请求封装说明 | `src/utils/request.js`、`src/utils/curd.js` |
|
||||
| `jy://modules/list` | 业务模块目录与页面数量 | 扫描 `src/views` |
|
||||
| `jy://api/list` | API 文件与导出函数 | 扫描 `src/api` |
|
||||
| `jy://icons/list` | SVG 图标清单 | 扫描 `src/icons/svg` |
|
||||
| `jy://docs/index` | 项目文档索引 | `docs/`、`AGENTS.md` |
|
||||
|
||||
## 8. MCP Tools 设计
|
||||
|
||||
### 8.1 项目结构工具
|
||||
|
||||
#### `scan_project_structure`
|
||||
|
||||
用途:返回项目目录树、模块数量、关键文件状态。
|
||||
|
||||
输入:
|
||||
|
||||
```json
|
||||
{
|
||||
"maxDepth": 3,
|
||||
"includeFiles": true
|
||||
}
|
||||
```
|
||||
|
||||
输出:
|
||||
|
||||
```json
|
||||
{
|
||||
"root": "D:/景耀/JY1.0",
|
||||
"modules": ["SalesManagement", "BasicData"],
|
||||
"keyFiles": ["package.json", "static/config.js"],
|
||||
"tree": []
|
||||
}
|
||||
```
|
||||
|
||||
#### `list_business_modules`
|
||||
|
||||
用途:列出 `src/views` 下全部业务模块、页面数量、页面路径。
|
||||
|
||||
输入:
|
||||
|
||||
```json
|
||||
{
|
||||
"module": "WarehouseManagement",
|
||||
"includePages": true
|
||||
}
|
||||
```
|
||||
|
||||
输出需包含:
|
||||
|
||||
- 模块英文目录。
|
||||
- 建议中文名称。
|
||||
- 页面列表。
|
||||
- 每个页面的 `index.vue` 路径。
|
||||
|
||||
### 8.2 页面与组件分析工具
|
||||
|
||||
#### `analyze_vue_page`
|
||||
|
||||
用途:分析指定 Vue 页面。
|
||||
|
||||
输入:
|
||||
|
||||
```json
|
||||
{
|
||||
"path": "src/views/WarehouseManagement/PurchasePartsStorage/index.vue"
|
||||
}
|
||||
```
|
||||
|
||||
输出:
|
||||
|
||||
- 页面标题推断。
|
||||
- template 使用的 Element UI 组件。
|
||||
- 表格列中文字段。
|
||||
- data 字段。
|
||||
- methods 列表。
|
||||
- 调用的 `CreateData`/`ExecDatabase`。
|
||||
- 后端 `name` 清单。
|
||||
- 上传下载/打印/导出能力。
|
||||
|
||||
#### `find_pages_by_keyword`
|
||||
|
||||
用途:按中文或英文关键词查页面。
|
||||
|
||||
输入:
|
||||
|
||||
```json
|
||||
{
|
||||
"keyword": "入库",
|
||||
"scope": "views"
|
||||
}
|
||||
```
|
||||
|
||||
输出:
|
||||
|
||||
- 命中文件。
|
||||
- 命中行号。
|
||||
- 上下文片段。
|
||||
- 可能关联模块。
|
||||
|
||||
### 8.3 API 与后端过程分析工具
|
||||
|
||||
#### `list_backend_operations`
|
||||
|
||||
用途:扫描项目中所有 `CreateData`、API 文件 `name` 字段、SQL 字符串。
|
||||
|
||||
输入:
|
||||
|
||||
```json
|
||||
{
|
||||
"module": "AssemblyManagement",
|
||||
"operationType": "query"
|
||||
}
|
||||
```
|
||||
|
||||
输出字段:
|
||||
|
||||
| 字段 | 说明 |
|
||||
| --- | --- |
|
||||
| `file` | 文件路径 |
|
||||
| `line` | 行号 |
|
||||
| `type` | 请求类型 |
|
||||
| `name` | 后端过程名或 SQL |
|
||||
| `params` | 参数名列表 |
|
||||
| `page` | 页面路径 |
|
||||
|
||||
#### `trace_backend_name`
|
||||
|
||||
用途:根据后端 `name` 反查调用点。
|
||||
|
||||
输入:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "装配执行_开始装配"
|
||||
}
|
||||
```
|
||||
|
||||
输出:
|
||||
|
||||
- 调用页面。
|
||||
- 方法名。
|
||||
- 参数来源。
|
||||
- 用户操作入口。
|
||||
- 相关表格/弹窗。
|
||||
|
||||
### 8.4 字段与表格工具
|
||||
|
||||
#### `extract_table_columns`
|
||||
|
||||
用途:提取指定页面所有 `el-table-column` 的中文 label、prop、slot 字段。
|
||||
|
||||
输入:
|
||||
|
||||
```json
|
||||
{
|
||||
"path": "src/views/SeikoWorkshop/PartTraceability/index.vue"
|
||||
}
|
||||
```
|
||||
|
||||
输出:
|
||||
|
||||
```json
|
||||
{
|
||||
"tables": [
|
||||
{
|
||||
"columns": [
|
||||
{"label": "订单号", "prop": "订单号", "width": "140px"}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
#### `find_chinese_field`
|
||||
|
||||
用途:根据中文字段名搜索全项目引用。
|
||||
|
||||
输入:
|
||||
|
||||
```json
|
||||
{
|
||||
"field": "订单编号"
|
||||
}
|
||||
```
|
||||
|
||||
输出:
|
||||
|
||||
- 页面引用。
|
||||
- API 参数引用。
|
||||
- 表格列引用。
|
||||
- 表单字段引用。
|
||||
|
||||
### 8.5 代码规范检查工具
|
||||
|
||||
#### `check_jy_conventions`
|
||||
|
||||
用途:检查指定变更或文件是否符合本项目约束。
|
||||
|
||||
检查项:
|
||||
|
||||
- 是否使用 Vue 2 Options API。
|
||||
- 是否引入 Vue 3/Composition API。
|
||||
- 是否绕过 `CreateData`/`ExecDatabase` 自行封装业务请求。
|
||||
- 是否使用中文字段名。
|
||||
- 是否符合 `app-container > el-card > 搜索栏 + el-table` 模式。
|
||||
- 是否使用 `.then().catch()` 而非 `async/await`。
|
||||
- 是否新增第三方库。
|
||||
- 深度选择器是否使用 `>>>`。
|
||||
|
||||
输入:
|
||||
|
||||
```json
|
||||
{
|
||||
"paths": ["src/views/WarehouseManagement/NewPage/index.vue"]
|
||||
}
|
||||
```
|
||||
|
||||
输出:
|
||||
|
||||
- 违规等级。
|
||||
- 文件路径和行号。
|
||||
- 修改建议。
|
||||
|
||||
### 8.6 文档与知识库工具
|
||||
|
||||
#### `search_project_docs`
|
||||
|
||||
用途:检索 `AGENTS.md`、`docs/`、README、项目档案等文档。
|
||||
|
||||
输入:
|
||||
|
||||
```json
|
||||
{
|
||||
"query": "新增页面开发流程",
|
||||
"topK": 5
|
||||
}
|
||||
```
|
||||
|
||||
输出:
|
||||
|
||||
- 文档片段。
|
||||
- 文件路径。
|
||||
- 相关度。
|
||||
|
||||
#### `search_code_knowledge`
|
||||
|
||||
用途:从代码索引和向量知识库中检索相关页面/API/规范。
|
||||
|
||||
输入:
|
||||
|
||||
```json
|
||||
{
|
||||
"query": "如何实现采购件入库页面的批量入库",
|
||||
"topK": 8
|
||||
}
|
||||
```
|
||||
|
||||
输出:
|
||||
|
||||
- 命中代码片段。
|
||||
- 相关文档。
|
||||
- 可追溯引用。
|
||||
|
||||
### 8.7 可选业务查询工具
|
||||
|
||||
如需让 AI 助手查询真实业务数据,应单独设计白名单工具,不开放任意 SQL。
|
||||
|
||||
示例:
|
||||
|
||||
- `query_menu_by_user`
|
||||
- `query_role_modules`
|
||||
- `query_dictionary`
|
||||
- `query_order_status`
|
||||
- `query_inventory_summary`
|
||||
|
||||
要求:
|
||||
|
||||
- 只读。
|
||||
- 参数校验。
|
||||
- 绑定服务账号。
|
||||
- 返回数据脱敏。
|
||||
- 写审计日志。
|
||||
|
||||
## 9. MCP Prompts 设计
|
||||
|
||||
### 9.1 新增页面 Prompt
|
||||
|
||||
名称:`create_jy_vue_page`
|
||||
|
||||
用途:指导 AI 按项目规范新增 Vue 页面。
|
||||
|
||||
输入:
|
||||
|
||||
```json
|
||||
{
|
||||
"module": "WarehouseManagement",
|
||||
"pageName": "库存预警",
|
||||
"backendNames": ["仓储管理_库存预警_查询"],
|
||||
"fields": ["物料名称", "图号", "库存", "最低库存"]
|
||||
}
|
||||
```
|
||||
|
||||
输出:
|
||||
|
||||
- 页面文件建议路径。
|
||||
- API 调用建议。
|
||||
- Vue 2 代码骨架。
|
||||
- 表格列定义。
|
||||
- 查询条件。
|
||||
- 需要后端配置的菜单字段。
|
||||
|
||||
### 9.2 故障排查 Prompt
|
||||
|
||||
名称:`debug_jy_request`
|
||||
|
||||
用途:根据报错、页面、后端 `name` 定位问题。
|
||||
|
||||
输出:
|
||||
|
||||
- 请求链路。
|
||||
- 可能原因。
|
||||
- 需要检查的 Cookie、路由、参数、后端过程。
|
||||
- 前端修改建议。
|
||||
|
||||
### 9.3 功能说明 Prompt
|
||||
|
||||
名称:`explain_jy_feature`
|
||||
|
||||
用途:解释某个页面或模块功能。
|
||||
|
||||
输出:
|
||||
|
||||
- 功能入口。
|
||||
- 页面操作流程。
|
||||
- 涉及后端过程。
|
||||
- 关键字段。
|
||||
- 相关页面。
|
||||
|
||||
## 10. MCP 服务内部索引设计
|
||||
|
||||
### 10.1 文件索引
|
||||
|
||||
```json
|
||||
{
|
||||
"path": "src/views/WarehouseManagement/PurchasePartsStorage/index.vue",
|
||||
"module": "WarehouseManagement",
|
||||
"type": "vue",
|
||||
"mtime": "2026-04-23T16:54:00",
|
||||
"size": 123456
|
||||
}
|
||||
```
|
||||
|
||||
### 10.2 页面索引
|
||||
|
||||
```json
|
||||
{
|
||||
"path": "src/views/AssemblyManagement/AssemblyExecution/index.vue",
|
||||
"module": "AssemblyManagement",
|
||||
"components": ["el-table", "el-dialog", "el-select"],
|
||||
"methods": ["searchTable", "submitStart", "submitFinish"],
|
||||
"backendNames": ["装配执行_开始装配", "装配执行_完成装配"],
|
||||
"fields": ["订单号", "产品名称", "状态"]
|
||||
}
|
||||
```
|
||||
|
||||
### 10.3 后端操作索引
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "仓储管理_采购件入库_循环执行",
|
||||
"type": "12",
|
||||
"params": ["物料流水号组", "实际到货数量组", "入库人员流水号"],
|
||||
"callers": [
|
||||
{
|
||||
"file": "src/views/WarehouseManagement/PurchasePartsStorage/index.vue",
|
||||
"method": "submitInStorage",
|
||||
"line": 800
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 10.4 字段索引
|
||||
|
||||
```json
|
||||
{
|
||||
"field": "订单号",
|
||||
"occurrences": [
|
||||
{
|
||||
"file": "src/views/SalesManagement/OrderInquiry/index.vue",
|
||||
"kind": "table-column"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## 11. 安全设计
|
||||
|
||||
### 11.1 权限分层
|
||||
|
||||
| 等级 | 能力 | 默认 |
|
||||
| --- | --- | --- |
|
||||
| L0 | 读项目文档 | 开启 |
|
||||
| L1 | 读项目代码 | 开启 |
|
||||
| L2 | 生成建议,不写文件 | 开启 |
|
||||
| L3 | 写项目文档 | 需授权 |
|
||||
| L4 | 修改前端代码 | 需授权 |
|
||||
| L5 | 调用只读业务接口 | 需服务账号和审计 |
|
||||
| L6 | 调用写业务接口 | 默认禁止 |
|
||||
|
||||
### 11.2 敏感信息处理
|
||||
|
||||
- `static/config.js` 中 IP、文件服务地址可展示,但生产账号、密钥必须脱敏。
|
||||
- 用户提供的账号密码不写入文档和代码。
|
||||
- DeepSeek API Key 只能放环境变量或密钥管理服务。
|
||||
- MCP 日志不得记录完整 Cookie、token、密码、身份证、手机号等敏感数据。
|
||||
|
||||
### 11.3 业务写操作限制
|
||||
|
||||
禁止通过通用工具暴露:
|
||||
|
||||
- 任意 SQL 执行。
|
||||
- 任意 `type=2/7/12` 写操作。
|
||||
- 任意文件删除。
|
||||
- 任意生产数据库更新。
|
||||
|
||||
如后续确需写操作,必须满足:
|
||||
|
||||
- 白名单过程名。
|
||||
- 参数 schema。
|
||||
- 人工确认。
|
||||
- 审计日志。
|
||||
- 回滚方案。
|
||||
|
||||
## 12. 部署设计
|
||||
|
||||
### 12.1 本地 stdio 模式
|
||||
|
||||
适合开发者 IDE、Codex、Claude Desktop 等本地 AI 工具。
|
||||
|
||||
启动方式:
|
||||
|
||||
```bash
|
||||
node server.js --root D:/景耀/JY1.0
|
||||
```
|
||||
|
||||
配置示例:
|
||||
|
||||
```json
|
||||
{
|
||||
"mcpServers": {
|
||||
"jy-mes": {
|
||||
"command": "node",
|
||||
"args": ["D:/景耀/JY1.0/mcp-server/server.js", "--root", "D:/景耀/JY1.0"]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 12.2 内网 HTTP 模式
|
||||
|
||||
适合多人共享 AI 助手。
|
||||
|
||||
建议:
|
||||
|
||||
- 部署在内网服务器。
|
||||
- 使用反向代理和 HTTPS。
|
||||
- 增加用户认证。
|
||||
- 按用户角色限制工具。
|
||||
- 建立调用日志。
|
||||
|
||||
## 13. 实施路线
|
||||
|
||||
### 阶段 1:只读项目索引
|
||||
|
||||
目标:
|
||||
|
||||
- 搭建 MCP 服务骨架。
|
||||
- 实现 `scan_project_structure`、`list_business_modules`。
|
||||
- 建立页面/API/字段索引。
|
||||
- 支持按关键词搜索。
|
||||
|
||||
交付:
|
||||
|
||||
- `mcp-server/` 服务。
|
||||
- `index-store/` 索引文件。
|
||||
- 基础 Resources 和 Tools。
|
||||
|
||||
### 阶段 2:Vue/API 深度分析
|
||||
|
||||
目标:
|
||||
|
||||
- 解析 `.vue` 页面结构。
|
||||
- 提取 `el-table-column`。
|
||||
- 提取 `CreateData` 调用和参数。
|
||||
- 反查后端 `name` 调用链。
|
||||
|
||||
交付:
|
||||
|
||||
- `analyze_vue_page`。
|
||||
- `list_backend_operations`。
|
||||
- `trace_backend_name`。
|
||||
- `check_jy_conventions`。
|
||||
|
||||
### 阶段 3:文档知识库接入
|
||||
|
||||
目标:
|
||||
|
||||
- 将 `AGENTS.md`、`docs/`、关键源码说明入库。
|
||||
- 支持语义检索。
|
||||
- AI 回答必须给出来源。
|
||||
|
||||
交付:
|
||||
|
||||
- 知识库构建脚本。
|
||||
- 文档检索工具。
|
||||
- 知识库更新机制。
|
||||
|
||||
### 阶段 4:AI 助手集成
|
||||
|
||||
目标:
|
||||
|
||||
- 接入 DeepSeek。
|
||||
- 支持项目问答、功能解释、代码生成建议、排障。
|
||||
- 支持 MCP 工具调用。
|
||||
|
||||
交付:
|
||||
|
||||
- AI 助手后端服务。
|
||||
- Web 聊天界面或集成到现有系统。
|
||||
- 权限和审计。
|
||||
|
||||
### 阶段 5:受控业务查询
|
||||
|
||||
目标:
|
||||
|
||||
- 增加只读业务查询白名单。
|
||||
- 支持订单、库存、设备状态、任务状态等查询。
|
||||
|
||||
交付:
|
||||
|
||||
- 只读业务 API 代理。
|
||||
- 参数 schema。
|
||||
- 审计日志。
|
||||
|
||||
## 14. 验收标准
|
||||
|
||||
MCP 服务应满足:
|
||||
|
||||
- 能列出全部业务模块和页面。
|
||||
- 能按中文关键词定位页面和后端调用。
|
||||
- 能分析指定 Vue 文件中的表格列、方法、请求。
|
||||
- 能反查某个后端 `name` 被哪些页面调用。
|
||||
- 能根据项目规范检查新增页面。
|
||||
- 能检索项目文档并返回来源。
|
||||
- 不暴露任意 shell、任意 SQL、生产写操作。
|
||||
- 生成代码建议符合 Vue 2、Element UI、现有全局 CRUD 方法。
|
||||
|
||||
## 15. 后续建议
|
||||
|
||||
- 为后端存储过程建立正式清单,补齐参数、返回字段和业务含义。
|
||||
- 将页面中文标题、路由路径、组件路径、后端 `name` 维护成可生成的功能矩阵。
|
||||
- 将编码异常文件逐步统一为 UTF-8,降低 AI 和工具解析难度。
|
||||
- 将现有散落在页面内的 API 调用逐步沉淀到 `src/api`,便于 MCP 建模和复用。
|
||||
291
docs/JY1.0-功能矩阵与知识库覆盖清单.md
Normal file
@@ -0,0 +1,291 @@
|
||||
# JY1.0 功能矩阵与知识库覆盖清单
|
||||
|
||||
## 1. 用途
|
||||
|
||||
本文档用于作为 MCP 服务和 AI 助手知识库的覆盖清单。后续建设知识库、页面索引、API 索引和功能问答时,应以本清单为基础逐项补齐页面说明、后端过程、字段和常见问题。
|
||||
|
||||
## 2. 总体功能矩阵
|
||||
|
||||
| 模块目录 | 中文模块 | 页面数量约计 | 核心功能 | MCP/知识库覆盖点 |
|
||||
| --- | --- | ---: | --- | --- |
|
||||
| `SalesManagement` | 销售管理 | 37 | 客户、产品、报价、合同、订单、发货、售后、统计分析 | 合同/订单/发货流程、后端 `name`、订单字段、统计图表 |
|
||||
| `BasicData` | 基础数据 | 14 | 菜单、角色、权限、人员、班次、日历、物料、工艺、设备能力 | 权限配置、菜单路由、基础字典、工艺维护 |
|
||||
| `TechnologyCenter` | 技术中心 | 12 | BOM、物料、图纸、图纸确认、导入 | BOM 字段、图纸上传下载、导入模板 |
|
||||
| `SeikoWorkshop` | 精工车间 | 26 | 工艺制定、计划、派工、执行、质检、工时、追溯、工况 | 工艺流程、派工执行链路、零件追溯、质检字段 |
|
||||
| `AssemblyManagement` | 装配管理 | 11 | 装配任务、接收任务、执行、领料、补货、滑台/专机 | 装配开始/暂停/恢复/完成、领料、调试、自检 |
|
||||
| `PurchasingManagement` | 采购管理 | 8 | 供应商、到货通知、采购订单、外协订单、采购查询 | 采购订单字段、到货状态、供应商筛选 |
|
||||
| `WarehouseManagement` | 仓储管理 | 27 | 入库、出库、库存、盘点、调拨、库位、补货、可视化 | 入库/出库流程、库存字段、批量操作、条码打印 |
|
||||
| `DeviceManagement` | 设备管理 | 13 | 设备状态、监控、点检、维修、能耗、灯控、异常原因 | 设备状态字段、实时/历史数据、点检维修流程 |
|
||||
| `ManufacturingCenter` | 制造中心 | 1 | 制造中心扩展页面 | 页面调用和业务说明 |
|
||||
| `WarehouseVisualization` | 仓库可视化 | 1 | 仓储布局和可视化展示 | 可视化数据来源、布局资源 |
|
||||
| `dashboard` | 首页 | 1 | 首页信息、统计、入口 | 首页卡片、统计接口 |
|
||||
| `login` | 登录 | 1 | 登录、改密、获取角色菜单 | 登录接口、Cookie、动态路由 |
|
||||
| `layout` | 系统框架 | 8 | 顶栏、侧边栏、标签页、主内容区 | 导航结构、权限菜单、路由缓存 |
|
||||
|
||||
## 3. 销售管理覆盖清单
|
||||
|
||||
目录:`src/views/SalesManagement`
|
||||
|
||||
应覆盖页面能力:
|
||||
|
||||
- 客户管理:客户资料维护、查询、编辑。
|
||||
- 公司信息维护:公司基础资料。
|
||||
- 产品维护:产品基础资料。
|
||||
- 创建报价:报价单创建和维护。
|
||||
- 销售合同、机床合同、新版合同、售后合同。
|
||||
- 合同查询、新版合同查询、合同审核。
|
||||
- 订单管理、订单下发、订单查询、订单审核。
|
||||
- 订单进度、订单进度总览、订单追溯。
|
||||
- 物料追溯。
|
||||
- 发货通知、发货通知查询、发货记录、发货审核、产品发货。
|
||||
- 售后和售后查询。
|
||||
- 统计分析:区域销售、订单趋势、产品类别、产品占比、产品定价、设备利用率、工时统计。
|
||||
|
||||
知识库重点:
|
||||
|
||||
- 合同编号、订单号、客户名称、产品名称、发货状态等中文字段。
|
||||
- 合同到订单、订单到生产、订单到发货的业务链路。
|
||||
- 销售统计图表的数据口径。
|
||||
- 新旧合同页面差异。
|
||||
|
||||
## 4. 基础数据覆盖清单
|
||||
|
||||
目录:`src/views/BasicData`、`src/api/BasicData`
|
||||
|
||||
应覆盖页面能力:
|
||||
|
||||
- 菜单管理:角色模块分配、菜单上下移动、一级/二级菜单维护。
|
||||
- 系统角色维护。
|
||||
- 用户权限管理。
|
||||
- 人员管理、车间人员角色管理。
|
||||
- 班次管理、工厂日历。
|
||||
- 物料维护。
|
||||
- 零件编号维护。
|
||||
- 车间工艺分类、工艺名称、工艺要求维护。
|
||||
- 设备能力设置、设备人员维护。
|
||||
- 项目管理显示。
|
||||
|
||||
知识库重点:
|
||||
|
||||
- 动态菜单字段:`id`、`pid`、`path`、`component`、`redirect`、`name`、`title`、`icon`。
|
||||
- 权限配置影响路由和侧边栏。
|
||||
- 基础字典如何被其他模块作为下拉数据使用。
|
||||
- 工艺基础数据与精工车间工艺制定的关系。
|
||||
|
||||
## 5. 技术中心覆盖清单
|
||||
|
||||
目录:`src/views/TechnologyCenter`
|
||||
|
||||
应覆盖页面能力:
|
||||
|
||||
- BOM 基础数据。
|
||||
- BOM 维护、查询、库存查询。
|
||||
- BOM 导入。
|
||||
- 物料维护、物料查询。
|
||||
- 零件图导入。
|
||||
- 图纸确认、图纸确认分发、图纸确认查询。
|
||||
|
||||
知识库重点:
|
||||
|
||||
- BOM 层级、物料编码、图号、零件名称。
|
||||
- Excel 导入流程和校验。
|
||||
- 图纸上传下载接口。
|
||||
- 技术资料与生产/装配页面的关联。
|
||||
|
||||
## 6. 精工车间覆盖清单
|
||||
|
||||
目录:`src/views/SeikoWorkshop`
|
||||
|
||||
应覆盖页面能力:
|
||||
|
||||
- 制定工艺、工艺文档管理、工序查询。
|
||||
- 生产计划、生产任务查询。
|
||||
- 车间派工、生产执行、在加工零件。
|
||||
- 零件追溯。
|
||||
- 工时统计、订单工时、其他工作完成。
|
||||
- 工况、设备监控。
|
||||
- 物料审核、采购合同审核。
|
||||
- 质量维护、自检记录、质检信息查询、采购质检、其他质检。
|
||||
- 报废投产、测试数据录入。
|
||||
- Andon 异常提示。
|
||||
|
||||
知识库重点:
|
||||
|
||||
- 工艺制定到派工到执行的完整链路。
|
||||
- 工序、设备、人员、工时字段。
|
||||
- 零件追溯查询条件和结果字段。
|
||||
- 质检、报废、返工相关状态。
|
||||
|
||||
## 7. 装配管理覆盖清单
|
||||
|
||||
目录:`src/views/AssemblyManagement`
|
||||
|
||||
应覆盖页面能力:
|
||||
|
||||
- 装配任务查询、接收任务。
|
||||
- 装配执行、专机装配执行、滑台装配执行。
|
||||
- 装配领料、临时领料。
|
||||
- 补货单、滑台补货单。
|
||||
- 开始装配、完成装配、自检、暂停、恢复、打回。
|
||||
- 调试数据、滑台调试数据、产品详细参数维护。
|
||||
|
||||
知识库重点:
|
||||
|
||||
- `装配执行_开始装配`、`装配执行_完成装配`、`装配管理_暂停装配`、`装配管理_恢复装配` 等后端过程。
|
||||
- 领料单、三表查询、产品参数、调试记录。
|
||||
- 装配任务状态流转。
|
||||
- 装配页面涉及的图纸/PDF/客户资料查看。
|
||||
|
||||
## 8. 采购管理覆盖清单
|
||||
|
||||
目录:`src/views/PurchasingManagement`
|
||||
|
||||
应覆盖页面能力:
|
||||
|
||||
- 供应商管理。
|
||||
- 到货通知。
|
||||
- 采购订单、外协采购订单。
|
||||
- 订单查询、外协订单查询。
|
||||
- 外购件查询、外协件查询。
|
||||
|
||||
知识库重点:
|
||||
|
||||
- 供应商、采购合同、采购订单、到货数量、到货状态。
|
||||
- 采购到仓储入库的衔接。
|
||||
- 外协订单和普通采购订单差异。
|
||||
|
||||
## 9. 仓储管理覆盖清单
|
||||
|
||||
目录:`src/views/WarehouseManagement`
|
||||
|
||||
应覆盖页面能力:
|
||||
|
||||
- 采购件入库、自制件入库、外协到货/外协入库。
|
||||
- 入库扫描、入库记录、采购入库记录、外协记录、主轴库存记录。
|
||||
- 出库、出库明细、采购出库记录。
|
||||
- 领料单查询、物料领用、退料记录。
|
||||
- 库存查询、库存记录、库存汇总、库存盘点。
|
||||
- 调拨查询、外协调拨。
|
||||
- 补货、补货查询、新补货查询。
|
||||
- 库位管理、物料库位、模具管理。
|
||||
- 外协厂维护。
|
||||
- 仓库可视化。
|
||||
|
||||
知识库重点:
|
||||
|
||||
- 入库批量选择、数量校验、库位校验、条码打印。
|
||||
- 库存字段:物料名称、图号/型号、库存、库位、批次、单位。
|
||||
- 采购件、自制件、外协件的入库差异。
|
||||
- 出库、领料、调拨、盘点对库存的影响。
|
||||
|
||||
## 10. 设备管理覆盖清单
|
||||
|
||||
目录:`src/views/DeviceManagement`
|
||||
|
||||
应覆盖页面能力:
|
||||
|
||||
- 设备状态、设备状态监控。
|
||||
- 设备信息。
|
||||
- 实时信息、历史信息、当前监控。
|
||||
- 设备点检、点检记录。
|
||||
- 维修记录。
|
||||
- 设备能耗。
|
||||
- 灯控。
|
||||
- 不合格原因。
|
||||
|
||||
知识库重点:
|
||||
|
||||
- 设备编号、设备名称、状态、报警、点检、维修、能耗字段。
|
||||
- 实时监控和历史查询的数据差异。
|
||||
- 设备状态与车间生产执行的关联。
|
||||
|
||||
## 11. 系统框架覆盖清单
|
||||
|
||||
目录:`src/views/layout`、`src/router`、`src/store`
|
||||
|
||||
应覆盖能力:
|
||||
|
||||
- 登录后权限获取。
|
||||
- 动态路由注入。
|
||||
- 侧边栏渲染。
|
||||
- 顶栏用户操作。
|
||||
- 标签页缓存。
|
||||
- 404 和重定向。
|
||||
|
||||
知识库重点:
|
||||
|
||||
- `constantRouterMap` 与动态路由的边界。
|
||||
- `getRouter.js` 根据 `pid` 递归生成树。
|
||||
- `tagsView`、`permission`、`user` Vuex 模块职责。
|
||||
- Cookie 过期导致强制登出的处理。
|
||||
|
||||
## 12. 请求与后端过程覆盖清单
|
||||
|
||||
知识库和 MCP 必须覆盖以下请求类型:
|
||||
|
||||
| 类型 | 说明 | 覆盖要求 |
|
||||
| --- | --- | --- |
|
||||
| `type=1` | 查询 | 提取 name、param、分页、返回 rows/total |
|
||||
| `type=2` | 增删改 | 默认只做说明,不直接执行 |
|
||||
| `type=7` | 批量提交 | 提取批量字段和数组结构 |
|
||||
| `type=11` | 项目扩展查询 | 作为查询类处理 |
|
||||
| `type=12` | 项目扩展写操作 | 作为写操作说明,MCP 默认禁止执行 |
|
||||
| `type=3` | SQL/菜单类查询 | 高风险,知识库可说明,工具不得开放任意 SQL |
|
||||
| `type=2001` | 报表/特殊查询 | 记录来源和页面 |
|
||||
|
||||
## 13. AI 助手问题覆盖样例
|
||||
|
||||
项目类:
|
||||
|
||||
- JY1.0 使用什么技术栈?
|
||||
- 新增页面应该放在哪里?
|
||||
- 为什么不能用 Vue 3 写法?
|
||||
- 请求为什么 url 为空?
|
||||
|
||||
功能类:
|
||||
|
||||
- 仓储管理有哪些功能?
|
||||
- 采购件入库页面的流程是什么?
|
||||
- 装配执行有哪些状态流转?
|
||||
- 零件追溯在哪些页面用到?
|
||||
|
||||
代码类:
|
||||
|
||||
- 查找所有调用 `CreateData('12'...)` 的地方。
|
||||
- 查询字段 `订单号` 被哪些页面使用。
|
||||
- 找到 `装配执行_完成装配` 的调用点。
|
||||
- 分析指定 Vue 文件的表格列。
|
||||
|
||||
排障类:
|
||||
|
||||
- 登录后跳回登录页是什么原因?
|
||||
- 新增菜单后页面打不开如何排查?
|
||||
- 接口有返回但表格不显示如何排查?
|
||||
- 入库成功但库存没变化如何排查?
|
||||
|
||||
开发类:
|
||||
|
||||
- 生成一个符合项目规范的查询页面。
|
||||
- 给某个页面增加导出按钮。
|
||||
- 给表格增加状态标签。
|
||||
- 检查新页面是否符合 AGENTS.md 规则。
|
||||
|
||||
## 14. 后续补全计划
|
||||
|
||||
第一轮补全:
|
||||
|
||||
- 自动生成所有页面路径清单。
|
||||
- 自动生成所有 `CreateData` 后端 `name` 清单。
|
||||
- 自动生成所有表格中文字段清单。
|
||||
|
||||
第二轮补全:
|
||||
|
||||
- 人工补充每个后端过程的真实业务含义。
|
||||
- 人工补充关键页面操作流程。
|
||||
- 人工补充常见报错和解决方案。
|
||||
|
||||
第三轮补全:
|
||||
|
||||
- 接入只读业务查询。
|
||||
- 将高频问答沉淀为 FAQ。
|
||||
- 每次发布后增量更新知识库。
|
||||
366
docs/JY1.0-采购件入库查询卡顿修改方案.md
Normal file
@@ -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()` 增加分页能力。
|
||||
|
||||
若可以同时做两项,最佳组合是:
|
||||
|
||||
- 采购件入库分页。
|
||||
- 取消查询后自动勾选。
|
||||
|
||||
这两项组合最有希望直接解决当前“查询就卡页面崩溃”的核心问题。
|
||||
630
docs/JY1.0-阶段功能需求文档.md
Normal file
@@ -0,0 +1,630 @@
|
||||
# JY1.0 阶段功能需求文档
|
||||
|
||||
## 01-文档说明
|
||||
|
||||
本文档根据当前提出的 7 项业务需求整理,作为后续前端、后端、数据库、测试联调的需求依据。需求内容覆盖默认库位设置、物料编码查询、移动端适配、库存盘点、看板优化、语音播报、质检 PDA 应急扫码能力。
|
||||
|
||||
本文档为初稿,后续可根据现场确认结果继续补充字段、接口、菜单权限、数据库过程和验收样例。
|
||||
|
||||
## 02-总体目标
|
||||
|
||||
1. 优化仓储相关业务流程,减少物料维护页面职责过重的问题。
|
||||
2. 提升物料查询效率,在现有查询功能中统一补充物料编码查询能力。
|
||||
3. 改善移动端使用体验,支持车间派工在手机或移动终端上自适应展示和操作。
|
||||
4. 完善库存盘点、物料系列、库位编辑、入库库位选择等库存基础能力。
|
||||
5. 优化现有看板数据展示,并新增仓库、采购等业务看板。
|
||||
6. 增加新订单语音播报能力,提升部门电视机、现场广播等场景下的消息触达效率。
|
||||
7. 完善质检 PDA 应急方案,在 PDA 设备故障时使用手机扫码保障生产不中断。
|
||||
8. 三楼仓库可视化界面,直观展示各库位状态及整体仓储情况
|
||||
|
||||
## 需求一:优化仓储相关业务流程,减少物料维护页面职责过重的问题
|
||||
|
||||
### 1 需求背景
|
||||
|
||||
由仓库主管提出.当前“设置默认库位”功能位于物料标准维护或物料标准相关页面中,导致物料基础维护页面承载了仓储业务配置职责。为降低页面复杂度,并使库位规则更贴近入库业务,需要将默认库位设置从物料标准维护中移出,该功能转到由仓库人员决定库位。
|
||||
|
||||
### 2 功能目标
|
||||
|
||||
1. 去除物料标准维护中的“设置默认库位”入口和相关操作。
|
||||
2. 将默认库位设置功能迁移到其他更合适的仓储组件,或新建“默认库位设置”组件。
|
||||
3. 物料入库选择库位时,根据该物料是否存在默认库存或库位库存显示不同的库位范围。
|
||||
|
||||
### 3 业务规则
|
||||
|
||||
1. 如果物料没有默认库存或没有可识别的默认库位库存,入库时显示全库位选择。
|
||||
2. 如果物料已有库存库位,入库时优先显示该物料已有库存的库位选择。
|
||||
3. 默认库位设置不再依赖物料标准维护页面完成。
|
||||
4. 新组件需要支持按物料编码、物料名称、图号、规格型号等条件查询物料。
|
||||
5. 默认库位设置后,应能被物料入库、库存盘点、库存查询等仓储业务读取。
|
||||
|
||||
### 4 前端范围
|
||||
|
||||
1. 移除物料标准维护页面中的默认库位设置按钮、弹窗和相关方法。
|
||||
2. 新增或迁移默认库位设置组件,建议放入仓储管理模块。
|
||||
3. 物料入库组件调整库位下拉数据来源:
|
||||
- 无默认库存时显示全库位。
|
||||
- 有库存时显示该物料已有库存库位。
|
||||
4. 保持 Vue 2 Options API 和 Element UI 原有开发风格。
|
||||
|
||||
### 5 后端范围
|
||||
|
||||
1. 梳理现有默认库位相关存储过程、表字段和调用页面。
|
||||
2. 根据新组件补充查询、保存、删除默认库位的接口。
|
||||
3. 入库库位查询过程需支持按物料返回全库位或已有库存库位。
|
||||
|
||||
### 6 功能实现流程图
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["开始:调整默认库位设置功能"] --> B["前端移除物料标准维护中的默认库位入口"]
|
||||
B --> C["新建或迁移默认库位设置组件"]
|
||||
C --> D["组件提供物料查询和默认库位维护"]
|
||||
D --> E["调用后端默认库位查询/保存/删除过程"]
|
||||
E --> F["数据库保存物料与默认库位关系"]
|
||||
F --> G["物料入库页面选择物料"]
|
||||
G --> H{"该物料是否已有库存库位"}
|
||||
H -- "是" --> I["查询并显示该物料已有库存库位"]
|
||||
H -- "否" --> J["查询并显示全库位或默认库位候选"]
|
||||
I --> K["用户选择库位并提交入库"]
|
||||
J --> K
|
||||
K --> L["刷新入库、库存盘点、库存查询相关数据"]
|
||||
```
|
||||
|
||||
### 7 验收标准
|
||||
|
||||
1. 物料标准维护页面不再出现默认库位设置入口。
|
||||
2. 新默认库位设置组件可完成查询、设置、修改、删除。
|
||||
3. 物料无库存库位时,入库页面可选择全部库位。
|
||||
4. 物料已有库存库位时,入库页面只显示符合规则的库位。
|
||||
5. 默认库位变更后,相关仓储页面读取结果一致。
|
||||
|
||||
## 需求二:提升物料查询效率,在现有查询功能中统一补充物料编码查询能力
|
||||
|
||||
### 1 需求背景
|
||||
|
||||
由罗伟提出.系统中已有多个物料查询入口,但部分页面只能按物料名称、图号、规格型号等条件查询,无法直接按物料编码定位,影响仓储、销售、技术、装配等场景的查询效率,以及查询准确性。
|
||||
|
||||
### 2 功能目标
|
||||
|
||||
1. 在现有涉及物料查询的组件中新增“物料编码”查询条件。
|
||||
2. 物料编码查询需要与原有条件组合查询。
|
||||
3. 查询结果、导出结果、选择弹窗结果保持一致。
|
||||
|
||||
### 3 覆盖范围
|
||||
|
||||
优先覆盖以下类型页面:
|
||||
|
||||
| 模块 | 页面或组件类型 | 查询入口 |
|
||||
| ---- | ------------------- | ---------- |
|
||||
| 仓储管理 | 库存盘点、库存查询、入库记录、物料库位 | 主列表查询、导出 |
|
||||
| 仓储管理 | 领料、耗材、入库物料选择 | 物料选择弹窗 |
|
||||
| 技术中心 | 物料查询、物料维护、图纸确认 | 主列表或物料选择弹窗 |
|
||||
| 销售管理 | 订单管理、订单审核、订单查询 | 物料选择弹窗 |
|
||||
| 装配管理 | 接收装配任务、接收滑台装配任务 | 物料选择弹窗 |
|
||||
|
||||
### 4 前端规则
|
||||
|
||||
1. 搜索栏新增 `物料编码` 输入框。
|
||||
2. 输入框 placeholder 可使用“物料编码”或“物料编号”,但传参建议统一使用 `物料编码`。
|
||||
3. 原有查询按钮、重置按钮、分页查询逻辑保持不变。
|
||||
4. 导出功能应同步携带物料编码条件。
|
||||
5. 不新增第三方库,不改变现有 `CreateData`、`ExecDatabase`、`getTable` 调用模式。
|
||||
|
||||
### 5 后端规则
|
||||
|
||||
1. 相关查询存储过程增加可选参数:
|
||||
- `物料编码_check`
|
||||
- `物料编码`
|
||||
2. 未传物料编码时,不影响原有查询结果。
|
||||
3. 传入物料编码时,应支持模糊查询或按现场确认规则查询。
|
||||
4. 导出过程与页面查询过程保持条件一致。
|
||||
|
||||
### 6 功能实现流程图
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["开始:现有查询补充物料编码"] --> B["梳理涉及物料查询的页面和弹窗"]
|
||||
B --> C["搜索栏或弹窗新增物料编码输入框"]
|
||||
C --> D["查询方法拼接物料编码_check和物料编码参数"]
|
||||
D --> E["调用原有CreateData/ExecDatabase/getTable流程"]
|
||||
E --> F["后端查询过程接收物料编码可选参数"]
|
||||
F --> G{"是否传入物料编码"}
|
||||
G -- "是" --> H["按物料编码追加过滤条件"]
|
||||
G -- "否" --> I["沿用原有查询条件"]
|
||||
H --> J["返回查询结果"]
|
||||
I --> J
|
||||
J --> K["表格或物料选择弹窗刷新"]
|
||||
K --> L["导出流程同步携带相同物料编码条件"]
|
||||
```
|
||||
|
||||
### 7 验收标准
|
||||
|
||||
1. 用户可通过物料编码直接查询目标物料。
|
||||
2. 物料编码可与物料名称、图号、规格型号等条件组合查询。
|
||||
3. 查询和导出数据一致。
|
||||
4. 所有改造页面无模板解析错误、无明显布局错位。
|
||||
|
||||
## 需求三:改善移动端使用体验,支持车间派工在手机或移动终端上自适应展示和操作
|
||||
|
||||
### 1 需求背景
|
||||
|
||||
由车间主管提出.车间派工业务需要在移动设备上查看和操作,当前桌面端布局在手机或窄屏设备上可能存在表格过宽、按钮拥挤、筛选条件不易操作等问题。
|
||||
|
||||
### 2 功能目标
|
||||
|
||||
1. 开发车间派工组件的移动端自适应布局。
|
||||
2. 保持桌面端原有操作习惯不受影响。
|
||||
3. 移动端重点保证查询、查看、派工、确认等高频操作可用。
|
||||
|
||||
### 3 前端要求
|
||||
|
||||
1. 使用响应式样式适配手机、平板、窄屏电脑。
|
||||
2. 搜索条件在移动端可折叠或纵向排列。
|
||||
3. 表格在移动端可采用横向滚动、卡片式列表或核心字段列表展示。
|
||||
4. 操作按钮在移动端需要保证可点击区域足够,不出现文字挤压。
|
||||
5. 弹窗在移动端宽度应适配屏幕,不应超出视口。
|
||||
6. 不引入 Vue 3、Composition API 或新的 UI 库。
|
||||
|
||||
### 4 重点场景
|
||||
|
||||
1. 手机查看待派工任务。
|
||||
2. 手机按订单、物料、工序、人员等条件筛选。
|
||||
3. 手机进入派工明细并提交。
|
||||
4. 手机查看派工状态、数量、人员、设备等关键字段。
|
||||
|
||||
### 5 功能实现流程图
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["开始:车间派工移动端适配"] --> B["梳理车间派工桌面端页面结构和核心操作"]
|
||||
B --> C["识别搜索区、列表区、明细区、操作按钮"]
|
||||
C --> D["增加响应式样式和移动端布局规则"]
|
||||
D --> E{"当前屏幕宽度是否为移动端"}
|
||||
E -- "是" --> F["搜索条件纵向排列或折叠展示"]
|
||||
F --> G["表格转为横向滚动或核心字段卡片列表"]
|
||||
G --> H["弹窗宽度和按钮点击区域适配手机"]
|
||||
E -- "否" --> I["保留桌面端原有布局"]
|
||||
H --> J["调用原有查询、派工、提交接口"]
|
||||
I --> J
|
||||
J --> K["按移动端和桌面端分别验证页面与业务操作"]
|
||||
```
|
||||
|
||||
### 6 验收标准
|
||||
|
||||
1. 375px、414px、768px、1366px 宽度下页面可正常展示。
|
||||
2. 移动端无关键按钮遮挡、重叠、不可点击问题。
|
||||
3. 桌面端布局保持稳定。
|
||||
4. 派工提交、查询、刷新等原有功能正常。
|
||||
|
||||
## 需求四:完善库存盘点、物料系列、库位编辑、入库库位选择等库存基础能力
|
||||
|
||||
### 1 需求背景
|
||||
|
||||
由罗伟提出.库存盘点需要更细粒度筛选物料,并支持对盘点库位进行维护。当前盘点和入库库位选择逻辑需要与物料库存库位更紧密关联。
|
||||
|
||||
### 2 功能目标
|
||||
|
||||
1. 新增“系列”字段,用于物料筛选和盘点筛选。
|
||||
2. 在物料维护组件中支持编辑物料系列。
|
||||
3. 库存盘点组件增加按系列筛选物料和库存的能力。
|
||||
4. 库存盘点组件添加编辑库位功能。
|
||||
5. 物料入库组件的库位选择只显示有该物料的库位。
|
||||
|
||||
### 3 物料维护要求
|
||||
|
||||
1. 物料维护列表展示“系列”字段。
|
||||
2. 新增、编辑物料时可维护“系列”。
|
||||
3. 系列字段建议使用中文字段名 `系列`。
|
||||
4. 系列可根据现场数据情况使用输入框或下拉框。
|
||||
|
||||
### 4 库存盘点要求
|
||||
|
||||
1. 搜索栏增加“系列”筛选条件。
|
||||
2. 支持按系列查询物料盘点数据。
|
||||
3. 支持按系列查询库存盘点数据。
|
||||
4. 表格展示需要包含系列字段,便于盘点人员核对。
|
||||
5. 增加编辑库位功能,可调整物料对应盘点库位。
|
||||
|
||||
### 5 物料入库要求
|
||||
|
||||
1. 入库时选择库位只显示有该物料的库位。
|
||||
2. 如果该物料没有任何库存库位,需要结合需求一规则显示全库位或默认库位候选。
|
||||
3. 库位下拉数据需要避免显示与该物料无关且容易误选的库位。
|
||||
|
||||
### 6 后端要求
|
||||
|
||||
1. 物料基础表或相关视图增加 `系列` 字段。
|
||||
2. 物料维护查询、新增、编辑过程支持系列字段。
|
||||
3. 库存盘点查询过程支持系列筛选。
|
||||
4. 库位编辑过程需要记录修改人、修改时间。
|
||||
5. 入库库位查询过程按物料库存库位过滤。
|
||||
|
||||
### 7 功能实现流程图
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["开始:库存盘点和物料系列优化"] --> B["数据库物料基础数据增加系列字段"]
|
||||
B --> C["物料维护组件新增系列展示和编辑"]
|
||||
C --> D["保存物料系列到后端"]
|
||||
D --> E["库存盘点组件搜索栏增加系列筛选"]
|
||||
E --> F["调用盘点查询过程并传入系列参数"]
|
||||
F --> G["盘点表格展示物料、库存、系列、库位等信息"]
|
||||
G --> H["用户编辑盘点库位"]
|
||||
H --> I["调用库位编辑过程并记录修改人和修改时间"]
|
||||
I --> J["刷新库存盘点列表"]
|
||||
J --> K["物料入库选择物料"]
|
||||
K --> L["按物料查询已有库存库位"]
|
||||
L --> M{"是否存在该物料库位"}
|
||||
M -- "是" --> N["入库库位下拉只显示该物料库位"]
|
||||
M -- "否" --> O["按默认库位规则显示候选库位"]
|
||||
```
|
||||
|
||||
### 8 验收标准
|
||||
|
||||
1. 物料维护可新增和编辑系列字段。
|
||||
2. 库存盘点可按系列筛选数据。
|
||||
3. 库存盘点可编辑库位,并保存成功。
|
||||
4. 物料入库库位选择符合“只显示该物料相关库位”的规则。
|
||||
5. 相关查询、保存后刷新数据一致。
|
||||
|
||||
## 需求五:优化现有看板数据展示,并新增仓库、采购等业务看板
|
||||
|
||||
### 1 需求背景
|
||||
|
||||
由罗总提出,开会讨论得出.现场看板需要更清晰地展示仓库、采购、订单、库存等业务状态。现有看板需要数据口径优化,同时新增部分业务看板。
|
||||
|
||||
### 2 功能目标
|
||||
|
||||
1. 新增仓库看板组件。
|
||||
2. 新增或优化采购看板组件。
|
||||
3. 优化现有看板的数据口径、展示字段和刷新方式。
|
||||
4. 仓库看板展示入库单滚动信息。
|
||||
5. 采购看板展示仍在采购中的合同。
|
||||
|
||||
### 3 仓库看板要求
|
||||
|
||||
1. 展示入库单滚动列表。
|
||||
2. 滚动内容建议包括入库单号、供应商、物料名称、物料编码、数量、入库日期、状态。
|
||||
3. 支持自动刷新,刷新频率需现场确认。
|
||||
4. 大屏展示时文字清晰,不出现字段重叠。
|
||||
5. 支持异常状态突出显示,例如待处理、待上架、未完成。
|
||||
|
||||
### 4 采购看板要求
|
||||
|
||||
1. 展示仍在采购中的合同。
|
||||
2. 合同状态口径需要明确,例如未完成、采购中、部分到货、逾期未到。
|
||||
3. 建议展示合同号、供应商、物料、数量、已到数量、未到数量、交期、状态。
|
||||
4. 对逾期或临近交期的数据进行醒目提示。
|
||||
|
||||
### 5 现有看板优化要求
|
||||
|
||||
1. 梳理现有看板数据来源和字段含义。
|
||||
2. 对不准确、不及时或口径不一致的数据进行调整。
|
||||
3. 保持大屏自适应显示效果。
|
||||
4. 对滚动、刷新、排序、状态颜色做统一规范。
|
||||
|
||||
### 6 功能实现流程图
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["开始:看板新增与优化"] --> B["梳理现有看板组件和数据接口"]
|
||||
B --> C["确认仓库看板、采购看板、现有看板数据口径"]
|
||||
C --> D["新增仓库看板组件"]
|
||||
C --> E["新增或优化采购看板组件"]
|
||||
C --> F["调整现有看板数据查询逻辑"]
|
||||
D --> G["查询入库单数据并生成滚动列表"]
|
||||
E --> H["查询采购中的合同和交期状态"]
|
||||
F --> I["统一字段、排序、状态颜色、刷新频率"]
|
||||
G --> J["大屏页面自动滚动展示"]
|
||||
H --> J
|
||||
I --> J
|
||||
J --> K["按刷新频率重新拉取数据"]
|
||||
K --> L["验证大屏分辨率、滚动、刷新和数据准确性"]
|
||||
```
|
||||
|
||||
### 7 验收标准
|
||||
|
||||
1. 仓库看板可滚动展示入库单数据。
|
||||
2. 采购看板可展示采购中的合同。
|
||||
3. 现有看板数据口径与业务确认一致。
|
||||
4. 大屏展示无明显错位、遮挡、空白异常。
|
||||
5. 自动刷新不影响页面稳定性。
|
||||
|
||||
## 需求六:增加新订单语音播报能力,提升部门电视机、现场广播等场景下的消息触达效率
|
||||
|
||||
### 1 需求背景
|
||||
|
||||
由罗总提出,开会讨论的出.当系统产生新的订单或重要业务消息时,需要在部门电视机或全场广播中自动播报,类似商家外卖新订单语音提醒,减少人工盯屏和漏看消息。
|
||||
|
||||
### 2 功能目标
|
||||
|
||||
1. 新订单产生时触发语音播报。
|
||||
2. 支持部门电视机播报或全场广播播报。
|
||||
3. 播报内容简洁明确,便于现场人员快速理解。
|
||||
4. 后续可扩展到采购到货、异常提醒、质检任务等事件。
|
||||
|
||||
### 3 播报场景
|
||||
|
||||
1. 新订单生成。
|
||||
2. 新订单分配到指定部门。
|
||||
3. 订单状态发生关键变化。
|
||||
4. 后续可扩展为库存预警、采购逾期、质检待处理等。
|
||||
|
||||
### 4 播报内容建议
|
||||
|
||||
新订单播报示例:
|
||||
|
||||
```text
|
||||
您有新的生产订单,请及时处理。订单号:XXXX,客户:XXXX,数量:XXXX。
|
||||
```
|
||||
|
||||
部门播报示例:
|
||||
|
||||
```text
|
||||
技术中心有新的图纸确认任务,请及时处理。
|
||||
```
|
||||
|
||||
### 5 技术要求
|
||||
|
||||
1. 前端可使用浏览器语音能力或播放预生成音频。
|
||||
2. 如果用于电视机浏览器,需要确认浏览器是否允许自动播放声音。
|
||||
3. 如果接入全场广播,需要确认广播设备是否支持网页音频输入、接口触发或本地客户端转发。
|
||||
4. 新消息检测可采用轮询、WebSocket 或已有消息接口。
|
||||
5. 需要增加播报开关、播报范围、播报频率、防重复播报规则。
|
||||
|
||||
### 6 权限和配置
|
||||
|
||||
1. 管理员可配置是否启用语音播报。
|
||||
2. 可按部门配置播报内容和播报设备。
|
||||
3. 同一订单不应重复无限播报。
|
||||
4. 需要记录已播报状态或播报日志,便于追查。
|
||||
|
||||
### 7 功能实现流程图
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["开始:语音播报功能"] --> B["配置播报开关、部门范围、播报终端"]
|
||||
B --> C["前端看板或播报终端启动消息监听"]
|
||||
C --> D["通过轮询、WebSocket或消息接口检测新订单"]
|
||||
D --> E{"是否存在未播报的新订单"}
|
||||
E -- "否" --> C
|
||||
E -- "是" --> F["生成播报文本"]
|
||||
F --> G{"当前终端是否允许播放声音"}
|
||||
G -- "是" --> H["调用浏览器语音或播放音频"]
|
||||
G -- "否" --> I["提示用户激活播放权限或使用客户端方案"]
|
||||
H --> J["回写已播报状态或记录播报日志"]
|
||||
I --> J
|
||||
J --> K["防止同一订单重复播报"]
|
||||
K --> C
|
||||
```
|
||||
|
||||
### 8 验收标准
|
||||
|
||||
1. 新订单出现后,指定终端可听到语音播报。
|
||||
2. 同一订单不会被重复播报造成干扰。
|
||||
3. 播报开关关闭后不再播报。
|
||||
4. 部门播报和全场播报范围符合配置。
|
||||
5. 电视机或广播设备在生产环境中可稳定使用。
|
||||
|
||||
## 需求七:完善质检 PDA 应急方案,在 PDA 设备故障时使用手机扫码保障生产不中断
|
||||
|
||||
### 1 需求背景
|
||||
|
||||
由质检部门提出,梁宁超核实后上报需求.质检 PDA 已有扫码作业能力,但在 PDA 设备故障时,需要使用手机应急完成扫码和质检相关工作。当前功能已开发完成,但生产环境下由于扫码组件安全限制无法使用。
|
||||
|
||||
### 2 功能目标
|
||||
|
||||
1. 确保手机扫码功能在生产环境可正常使用。
|
||||
2. 在 PDA 故障时,手机可以临时替代 PDA 进行扫码质检作业。
|
||||
3. 解决扫码组件在生产环境下的安全限制问题。
|
||||
|
||||
### 3 问题说明
|
||||
|
||||
扫码组件通常依赖浏览器摄像头权限。生产环境可能存在以下限制:
|
||||
|
||||
1. 页面不是 HTTPS,浏览器禁止调用摄像头。
|
||||
2. 访问地址使用 IP 或非受信任域名,浏览器阻止摄像头权限。
|
||||
3. 手机浏览器权限未授权。
|
||||
4. 扫码组件要求安全上下文,HTTP 环境不可用。
|
||||
5. 内嵌浏览器或企业微信、钉钉 WebView 权限策略不同。
|
||||
|
||||
### 4 解决方向
|
||||
|
||||
1. 将生产环境扫码页面部署到 HTTPS。
|
||||
2. 配置可信域名和证书,避免直接使用不安全 HTTP 地址调用摄像头。
|
||||
3. 如果必须内网使用,需要评估内网 HTTPS 证书或受信任证书安装方案。
|
||||
4. 针对手机浏览器、企业微信、钉钉等访问方式分别验证摄像头权限。
|
||||
5. 保留手工输入条码的兜底方案,避免扫码不可用时业务中断。
|
||||
|
||||
### 5 功能要求
|
||||
|
||||
1. 手机页面可打开摄像头并扫码。
|
||||
2. 扫码结果可回填到质检业务流程。
|
||||
3. 扫码失败时允许手动输入条码。
|
||||
4. 页面需要适配手机端显示。
|
||||
5. 扫码权限异常时给出明确提示,例如“请使用 HTTPS 地址访问”或“请允许摄像头权限”。
|
||||
|
||||
### 6 功能实现流程图
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["开始:质检PDA手机扫码应急"] --> B["用户使用手机打开质检扫码页面"]
|
||||
B --> C{"访问环境是否为HTTPS或安全上下文"}
|
||||
C -- "否" --> D["提示使用HTTPS地址或可信访问方式"]
|
||||
C -- "是" --> E["请求摄像头权限"]
|
||||
E --> F{"用户是否授权摄像头"}
|
||||
F -- "否" --> G["提示开启摄像头权限并提供手动输入"]
|
||||
F -- "是" --> H["启动扫码组件识别条码"]
|
||||
H --> I{"是否扫码成功"}
|
||||
I -- "否" --> G
|
||||
I -- "是" --> J["扫码结果回填质检业务单据"]
|
||||
G --> K["手动输入条码"]
|
||||
J --> L["调用原有质检业务查询或提交接口"]
|
||||
K --> L
|
||||
L --> M["完成质检应急作业并保留PDA原有流程"]
|
||||
```
|
||||
|
||||
### 7 验收标准
|
||||
|
||||
1. 生产环境手机扫码可正常调用摄像头。
|
||||
2. 扫码后可完成质检业务操作。
|
||||
3. PDA 故障时,手机应急流程可完整跑通。
|
||||
4. 摄像头权限失败时有明确提示和手动输入兜底。
|
||||
5. 不影响 PDA 原有扫码功能。
|
||||
|
||||
## 需求八:三楼仓库可视化界面,直观展示各库位状态及整体仓储情况
|
||||
|
||||
### 1 需求背景
|
||||
|
||||
由仓库管理提出.三楼仓库目前缺少直观的库位可视化展示能力,仓库人员无法快速了解各库位使用状态、物料分布和整体仓储情况。现有立库查询界面已具备 2D 网格矩阵可视化能力(巷道筛选、状态颜色标识、库位点击查看物料详情、统计面板),可参考该方案为三楼仓库开发类似的可视化界面。
|
||||
|
||||
### 2 功能目标
|
||||
|
||||
1. 新增三楼仓库可视化组件,直观展示三楼仓库各库位的实时状态。
|
||||
2. 展示三楼仓库整体统计信息,包括总库位数、已占用库位数、空闲库位数、使用率等。
|
||||
3. 支持按区域、库位类型、物料等条件筛选库位。
|
||||
4. 支持点击库位查看物料详情,包括物料编号、物料名称、图号、规格型号、库存数量等。
|
||||
5. 参考立库可视化界面的颜色标识方案,用不同颜色区分库位状态。
|
||||
|
||||
### 3 界面参考
|
||||
|
||||
参考现有立库可视化界面(`WarehouseVisualization` 组件)的设计模式:
|
||||
|
||||
1. **统计面板**:顶部展示总库位数、已占用数、空闲数、使用率等关键指标,参考立库的 `el-row` + `el-col` 卡片布局。
|
||||
2. **颜色图例**:用不同颜色标识库位状态,参考立库的颜色方案:
|
||||
- 绿色:有库存(对应立库"有物料有托盘")
|
||||
- 橙色/黄色:预占或待处理
|
||||
- 灰色:空闲库位
|
||||
- 红色:异常或禁用
|
||||
3. **库位矩阵**:以网格或表格形式展示库位分布,行列对应仓库物理位置。
|
||||
4. **库位详情弹窗**:点击库位后弹窗展示物料明细,参考立库的 `el-dialog` 详情弹窗。
|
||||
5. **筛选条件**:支持按区域、库位编号、物料编码等条件筛选。
|
||||
|
||||
### 4 前端要求
|
||||
|
||||
1. 新增三楼仓库可视化页面,建议放在仓储管理模块下,路径如 `src/views/WarehouseManagement/ThirdFloorWarehouse/`。
|
||||
2. 参考立库可视化组件的页面结构:统计卡片 + 图例 + 库位网格矩阵 + 详情弹窗。
|
||||
3. 使用 Vue 2 Options API + Element UI,保持与现有代码风格一致。
|
||||
4. 库位网格支持点击交互,点击后弹出物料详情。
|
||||
5. 支持区域切换或筛选,适配三楼仓库的物理布局(如多个区域或排)。
|
||||
6. 统计数据实时计算,支持手动刷新和自动刷新(刷新频率可配置)。
|
||||
7. 适配大屏展示,文字清晰、布局不拥挤。
|
||||
8. 不引入新的第三方库,不使用 Vue 3 或 Composition API。
|
||||
|
||||
### 5 后端要求
|
||||
|
||||
1. 新增三楼仓库库位数据查询接口,返回库位编号、库位状态、所在区域等信息。
|
||||
2. 新增三楼仓库库位物料详情查询接口,根据库位编号返回物料信息(物料编号、物料名称、图号、规格型号、库存数量、批次等)。
|
||||
3. 接口命名遵循现有规范(如 `仓储管理_三楼仓库库位_查询数据`)。
|
||||
4. 如果三楼仓库库位数据已有现成的查询过程,优先复用,必要时补充字段。
|
||||
5. 统计数据可由前端根据库位列表计算,也可由后端单独提供汇总接口。
|
||||
|
||||
### 6 功能实现流程图
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["开始:三楼仓库可视化界面"] --> B["梳理三楼仓库库位数据和物理布局"]
|
||||
B --> C["后端新增或复用库位查询和物料详情接口"]
|
||||
C --> D["前端新增三楼仓库可视化页面组件"]
|
||||
D --> E["页面加载时调用库位查询接口获取全部库位数据"]
|
||||
E --> F["根据库位数据生成网格矩阵并按状态着色"]
|
||||
F --> G["顶部展示统计面板:总库位、已占用、空闲、使用率"]
|
||||
G --> H["用户点击某个库位"]
|
||||
H --> I{"库位是否有物料"}
|
||||
I -- "是" --> J["弹出物料详情弹窗:物料编号、名称、图号、型号、数量等"]
|
||||
I -- "否" --> K["弹出库位信息弹窗:库位编号、状态、区域"]
|
||||
J --> L["用户关闭弹窗或继续操作"]
|
||||
K --> L
|
||||
L --> M{"是否切换区域或筛选条件"}
|
||||
M -- "是" --> N["按筛选条件重新查询库位数据"]
|
||||
N --> F
|
||||
M -- "否" --> O{"是否手动刷新或自动刷新触发"}
|
||||
O -- "是" --> E
|
||||
O -- "否" --> L
|
||||
```
|
||||
|
||||
### 7 验收标准
|
||||
|
||||
1. 三楼仓库可视化页面可正常加载并展示所有库位。
|
||||
2. 不同状态的库位用不同颜色区分,图例说明清晰。
|
||||
3. 统计面板数据与实际库位状态一致。
|
||||
4. 点击有物料的库位可查看物料详情。
|
||||
5. 点击空闲库位可查看库位基本信息。
|
||||
6. 区域筛选和条件筛选功能正常。
|
||||
7. 刷新数据后页面状态更新正确。
|
||||
8. 大屏展示布局合理,文字清晰可读。
|
||||
9. 不影响现有立库可视化功能。
|
||||
|
||||
## 03-优先级建议
|
||||
|
||||
| 优先级 | 需求 | 原因 |
|
||||
| --- | --------------- | ----------------------------------------- |
|
||||
| P2 | 质检 PDA 手机扫码应急功能 | 已开发但生产不可用,影响故障应急能力,即使PDA设备故障也可手动输入不影响现场生产 |
|
||||
| P0 | 库存盘点及入库库位选择优化 | 直接影响库存准确性和入库操作,现场急要 |
|
||||
| P0 | 默认库位设置功能调整 | 影响仓储配置职责和入库库位逻辑,现场急要 |
|
||||
| P0 | 物料编码查询 | 涉及页面多,但收益明确,现场急要 |
|
||||
| P1 | 三楼仓库可视化界面 | 参考立库已有方案,可快速实现,提升仓库管理直观性 |
|
||||
| P1 | 车间派工移动端适配 | 改善现场移动操作效率,现场提出,未经过确认需要 |
|
||||
| P2 | 看板优化 | 影响现场展示和管理效率,需求还不明确 |
|
||||
| P2 | 语音播报 | 需要确认硬件、浏览器和广播接入方案,需求还不明确 |
|
||||
|
||||
## 04-实施拆分建议
|
||||
|
||||
### 第一阶段:库存与查询基础能力
|
||||
|
||||
1. 默认库位设置迁移。
|
||||
2. 物料编码查询补充。
|
||||
3. 物料系列字段和库存盘点筛选。
|
||||
4. 物料入库库位过滤。
|
||||
5. 三楼仓库可视化界面(参考立库可视化组件)。
|
||||
|
||||
### 第二阶段:移动端与应急能力
|
||||
|
||||
1. 车间派工移动端适配。
|
||||
2. 质检 PDA 手机扫码生产环境修复。
|
||||
|
||||
### 第三阶段:看板与播报能力
|
||||
|
||||
1. 仓库看板新增。
|
||||
2. 采购看板新增或优化。
|
||||
3. 现有看板数据口径调整。
|
||||
4. 新订单语音播报试点。
|
||||
|
||||
## 05-待确认事项
|
||||
|
||||
1. 默认库位设置新组件归属菜单:仓储管理、基础数据,或单独配置模块。
|
||||
2. “没有默认库存”与“没有库存库位”的业务定义是否一致。
|
||||
3. 物料入库库位选择在无库存时是否显示全库位,还是优先显示默认库位。
|
||||
4. 系列字段的数据来源:手工输入、固定字典、还是由后端基础数据维护。
|
||||
5. 库存盘点编辑库位是否允许直接改变已有库存所在库位,是否需要保留调整记录。
|
||||
6. 看板刷新频率和大屏分辨率。
|
||||
7. 语音播报使用电视机网页播放,还是接入全场广播硬件。
|
||||
8. 手机扫码生产环境访问方式:HTTPS 域名、内网 IP、企业微信、钉钉或普通浏览器。
|
||||
9. 语音播报和扫码功能是否需要新增系统配置表。
|
||||
10. 三楼仓库的物理布局和库位编码规则(区域划分、行列定义)。
|
||||
11. 三楼仓库库位状态分类是否与立库一致,还是需要单独定义(如是否有"预占"、"异常"等状态)。
|
||||
12. 三楼仓库可视化是否需要自动刷新,刷新频率多少。
|
||||
|
||||
## 06-风险说明
|
||||
|
||||
1. 默认库位、库存库位、入库库位逻辑如果口径不统一,可能导致入库误选库位。
|
||||
2. 物料编码查询涉及页面多,需要避免漏改导出和弹窗查询。
|
||||
3. 库存盘点编辑库位如果缺少日志,后续库存差异追溯困难。
|
||||
4. 看板数据口径需与业务部门确认,否则容易出现“页面正确但业务理解不一致”的问题。
|
||||
5. 浏览器语音自动播放和摄像头扫码都受 HTTPS、安全策略、设备权限影响,必须在生产环境实测。
|
||||
6. 全场广播接入可能涉及硬件、网络、音频设备,不应只按前端功能估算工作量。
|
||||
7. 三楼仓库库位数据如果与立库数据结构差异较大,可能需要单独设计接口和前端组件,复用程度需评估。
|
||||
|
||||
## 07-文档备注
|
||||
|
||||
本次变更为新增需求文档,未修改业务代码。
|
||||
|
||||
修改人:Ld 修改时间:2026-06-29 10:29:16
|
||||
|
||||
补充内容:为 7 项需求分别增加功能实现流程图。
|
||||
|
||||
修改人:Ld 修改时间:2026-06-29 14:24:36
|
||||
|
||||
补充内容:新增需求八"三楼仓库可视化界面",参考立库查询界面设计,优先级 P1,纳入第一阶段实施。同步更新优先级建议、实施拆分、待确认事项和风险说明。
|
||||
|
||||
修改人:Ld 修改时间:2026-06-30
|
||||
BIN
docs/JY1.0库房管理文档.docx
Normal file
BIN
docs/assets/warehouse-management-doc/flow_count.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
docs/assets/warehouse-management-doc/flow_inbound.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
docs/assets/warehouse-management-doc/flow_outbound.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
docs/assets/warehouse-management-doc/flow_replenishment.png
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
docs/assets/warehouse-management-doc/flow_return.png
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
docs/assets/warehouse-management-doc/flow_transfer.png
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
docs/assets/warehouse-visualization/detail.png
Normal file
|
After Width: | Height: | Size: 92 KiB |
BIN
docs/assets/warehouse-visualization/filter.png
Normal file
|
After Width: | Height: | Size: 72 KiB |
BIN
docs/assets/warehouse-visualization/main.png
Normal file
|
After Width: | Height: | Size: 77 KiB |
BIN
docs/assets/warehouse-visualization/material.png
Normal file
|
After Width: | Height: | Size: 82 KiB |
919
docs/三楼仓库可视化/三楼仓库可视化界面设计方案.md
Normal file
@@ -0,0 +1,919 @@
|
||||
# 三楼仓库可视化界面设计方案
|
||||
|
||||
## 一、背景
|
||||
|
||||
由仓库管理提出,三楼仓库目前缺少直观的库位可视化展示能力,仓库人员无法快速了解各库位使用状态、物料分布和整体仓储情况。现有立库查询界面已具备 2D 网格矩阵可视化能力(巷道筛选、状态颜色标识、库位点击查看物料详情、统计面板),可参考该方案为三楼仓库开发类似的可视化界面。
|
||||
|
||||
当前仓库人员判断库位使用情况主要依赖库位管理页面(`LocationManagement`)逐条查询和物料库位页面(`MaterialLocation`)按物料查阅,缺少全局视角的库位状态总览。在盘点、出入库规划、空间利用率评估等场景下,仓库人员需要一屏总览仓库所有库位状态和物料分布,便于快速定位目标库位和发现异常。
|
||||
|
||||
本次需求优先级为 P1,纳入第一阶段实施。
|
||||
|
||||
<br/>
|
||||
|
||||
## 二、现状核对
|
||||
|
||||
### 2.1 已有立库可视化组件
|
||||
|
||||
主组件文件:
|
||||
|
||||
- `src/views/WarehouseManagement/WarehouseVisualization/index.vue`
|
||||
- 组件名:`WarehouseVisualizationSystem`
|
||||
|
||||
已实现功能:
|
||||
|
||||
- 按 4 个巷道加载立库数据,接口名为 `GetPositionView`
|
||||
- 库位矩阵用原生 HTML `<table>` 绘制
|
||||
- 4 种库位状态:0=空库位、1=有托盘无物料、2=有物料有托盘、9=锁库
|
||||
- 统计信息卡片:总库位数、有物料有托盘数、有托盘无物料数、空闲库位数、使用率、数据行数
|
||||
- 支持按行-层筛选、分页显示
|
||||
- 点击状态为 2 的库位调用 `StockDetail(rowLayer, column)` 查询 `StockDetailView` 获取物料明细
|
||||
- 点击非 2 状态库位弹出库位详情弹窗
|
||||
- 支持文字/图标两种显示模式切换
|
||||
- 使用独立的立库数据库服务入口(`ExecDatabase1`,走 `config.js` 中的 `url1`)
|
||||
|
||||
辅助组件文件:
|
||||
|
||||
- `src/views/WarehouseVisualization/index.vue`
|
||||
- 组件名:`WarehouseVisualization`
|
||||
- 纯展示组件,通过 `props` 接收 `warehouseData`
|
||||
|
||||
### 2.2 已有仓储数据页面
|
||||
|
||||
| 页面 | 路径 | 功能 |
|
||||
| --- | --- | --- |
|
||||
| 库位管理 | `WarehouseManagement/LocationManagement/index.vue` | 库位增删改查,接口 `仓储管理_库位_查询` |
|
||||
| 物料库位 | `WarehouseManagement/MaterialLocation/index.vue` | 按物料查库位,接口 `仓储管理_物料库位_查询数据` |
|
||||
| 库存查询 | `WarehouseManagement/InventoryQuery/index.vue` | 库存汇总查询,接口 `仓储管理_库存查询_查询` |
|
||||
| 库存盘点 | `WarehouseManagement/InventoryCheck/index.vue` | 盘点数据查询 |
|
||||
| 仓储汇总 | `WarehouseManagement/WarehouseSummary/index.vue` | 看板式统计汇总 |
|
||||
|
||||
### 2.3 接口调用模式
|
||||
|
||||
仓储管理模块所有页面的 API 调用均内联在 `.vue` 组件中,通过 `this.CreateData()` + `this.ExecDatabase()` 构造请求参数并调用后端,无独立 API 文件。接口命名遵循 `模块_子模块_操作` 格式。
|
||||
|
||||
立库可视化走独立的 `ExecDatabase1`(连接立库数据库 `url1`),三楼仓库数据走主业务数据库(`ExecDatabase`),两者数据源不同。
|
||||
|
||||
### 2.4 数据差异
|
||||
|
||||
| 对比项 | 立库 | 三楼仓库 |
|
||||
| --- | --- | --- |
|
||||
| 数据服务 | 独立志库数据库(`url1:10006`) | 主业务数据库(`url:8030`) |
|
||||
| 库位编码 | 行-列-层 三段式(如 `03-12-01`) | 待确认(需求文档待确认事项第 10 条) |
|
||||
| 调用方法 | `ExecDatabase1` | `ExecDatabase` |
|
||||
| 库位状态 | 0=空、1=有盘无物、2=有物有盘、9=锁 | 待确认(需求文档待确认事项第 11 条) |
|
||||
| 物理布局 | 巷道-行-列-层 四维结构 | 待确认(需求文档待确认事项第 10 条) |
|
||||
|
||||
## 三、设计原则
|
||||
|
||||
1. 参考立库可视化组件的页面结构和交互模式(统计卡片 + 图例 + 库位网格矩阵 + 详情弹窗),复用成熟的交互设计,降低用户学习成本。
|
||||
2. 三楼仓库数据走主业务数据库(`ExecDatabase`),不走立库独立服务(`ExecDatabase1`),与库位管理、物料库位、库存盘点等仓储页面使用同一数据源。
|
||||
3. 接口命名遵循项目现有规范(如 `仓储管理_三楼仓库库位_查询数据`)。
|
||||
4. 使用 Vue 2 Options API + Element UI,保持与现有代码风格一致。
|
||||
5. 不引入新的第三方库,不使用 Vue 3 或 Composition API。
|
||||
6. 样式与立库可视化保持一致的设计语言(颜色方案、卡片风格、单元格交互),但库位布局和状态分类根据三楼仓库实际业务定义。
|
||||
7. 库位数据查询和物料详情查询走标准后端接口名,前端不直接拼 SQL,与立库组件中 `StockDetail` 直接构造 SQL 的做法不同,降低前后端耦合。
|
||||
|
||||
<br/>
|
||||
|
||||
## 四、前端页面结构设计
|
||||
|
||||
### 4.1 页面总览
|
||||
|
||||
新增三楼仓库可视化页面,路径:`src/views/WarehouseManagement/ThirdFloorWarehouse/index.vue`
|
||||
|
||||
页面整体采用标准的 `div.app-container > el-card` 布局,主体包含以下区域:
|
||||
|
||||
1. 顶部筛选与操作区
|
||||
2. 统计信息卡片区
|
||||
3. 状态图例区
|
||||
4. 三楼仓库库位网格矩阵区
|
||||
5. 分页区
|
||||
6. 库位详情弹窗
|
||||
7. 物料信息弹窗
|
||||
|
||||
### 4.2 顶部筛选与操作区
|
||||
|
||||
参考立库可视化的筛选区布局,但筛选维度调整为三楼仓库的实际布局维度。
|
||||
|
||||
#### 4.2.1 区域筛选
|
||||
|
||||
控件类型:`el-select`
|
||||
|
||||
用途:三楼仓库按物理区域划分(如 A 区、B 区、C 区等,具体区域名称需现场确认)。
|
||||
|
||||
数据来源:页面初始化时从库位数据中自动提取去重,或后端返回区域字典。
|
||||
|
||||
选项生成规则:
|
||||
|
||||
- 从库位查询结果中提取 `区域` 字段
|
||||
- 自动去重
|
||||
- 按区域编码或名称排序
|
||||
|
||||
#### 4.2.2 库位类型筛选
|
||||
|
||||
控件类型:`el-select`
|
||||
|
||||
可选项(具体需现场确认):
|
||||
|
||||
- 全部
|
||||
- 有库存
|
||||
- 空闲
|
||||
- 预占/待处理
|
||||
- 异常/禁用
|
||||
|
||||
用途:按库位状态快速筛选关注类别的库位。
|
||||
|
||||
#### 4.2.3 库位编号搜索
|
||||
|
||||
控件类型:`el-input`
|
||||
|
||||
用途:直接输入库位编号定位到对应库位。
|
||||
|
||||
交互:
|
||||
|
||||
- 输入库位编号后,点击搜索,矩阵中匹配的库位高亮显示
|
||||
- 支持模糊匹配
|
||||
|
||||
#### 4.2.4 操作按钮
|
||||
|
||||
| 按钮 | 类型 | 作用 |
|
||||
| --- | --- | --- |
|
||||
| 搜索 | `el-button type="primary"` | 按筛选条件重新查询库位数据 |
|
||||
| 重置 | `el-button type="default"` | 清空所有筛选条件,恢复全局视图 |
|
||||
| 刷新数据 | `el-button type="success"` | 重新调用后端接口获取最新数据 |
|
||||
| 自动刷新开关 | `el-switch` | 控制定时自动刷新(默认关闭) |
|
||||
|
||||
#### 4.2.5 显示模式切换
|
||||
|
||||
控件类型:`el-switch`
|
||||
|
||||
两种模式:
|
||||
|
||||
- 显示文字:每个库位格显示状态简称(如 `存`、`空`、`预`、`异`)
|
||||
- 显示图标:每个库位格显示对应 Element UI 图标
|
||||
|
||||
### 4.3 统计信息卡片区
|
||||
|
||||
参考立库可视化的 `el-row + el-col` 卡片布局,展示以下 6 项指标:
|
||||
|
||||
| 序号 | 统计项 | 计算方式 | 颜色 |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | 总库位数 | 当前加载的库位总数 | `#303133` |
|
||||
| 2 | 有库存 | 状态为"有库存"的库位数 | `#4caf50`(绿色) |
|
||||
| 3 | 预占/待处理 | 状态为"预占"的库位数 | `#ff9800`(橙色) |
|
||||
| 4 | 空闲库位 | 状态为"空闲"的库位数 | `#e0e0e0`(灰色) |
|
||||
| 5 | 异常/禁用 | 状态为"异常"的库位数 | `#f56c6c`(红色) |
|
||||
| 6 | 使用率 | `(有库存 + 预占) / 总库位数 * 100%` | `#2196f3`(蓝色) |
|
||||
|
||||
布局:`el-row :gutter="10"`,每项占 `el-col :span="4"`。
|
||||
|
||||
统计计算方式:
|
||||
|
||||
- 前端根据库位列表数据实时计算
|
||||
- 支持筛选后重新统计(筛选后统计数字反映当前筛选结果)
|
||||
|
||||
### 4.4 状态图例区
|
||||
|
||||
参考立库可视化图例,居中展示库位状态颜色含义:
|
||||
|
||||
| 颜色 | 含义 | 文字简称 | 图标 |
|
||||
| --- | --- | --- | --- |
|
||||
| 绿色 `#4caf50` | 有库存 | 存 | `el-icon-box` |
|
||||
| 橙色 `#ff9800` | 预占或待处理 | 预 | `el-icon-time` |
|
||||
| 灰色 `#e0e0e0` | 空闲库位 | 空 | `el-icon-minus` |
|
||||
| 红色 `#f56c6c` | 异常或禁用 | 异 | `el-icon-warning` |
|
||||
| 蓝色边框 `#2196f3` | 当前选中库位 | — | — |
|
||||
|
||||
说明:
|
||||
|
||||
- 具体状态分类需与仓库现场确认(待确认事项第 11 条)
|
||||
- 如果三楼仓库不需要"预占"和"异常"状态,可简化为三种状态(有库存、空闲、选中)
|
||||
- 如果三楼仓库与立库状态分类一致,可直接复用立库的 4 状态方案(0=空、1=盘无物、2=物有盘、9=锁),但建议重新命名以贴合三楼仓库业务
|
||||
|
||||
### 4.5 库位网格矩阵区
|
||||
|
||||
参考立库可视化组件使用原生 `<table>` 绘制矩阵的方案。
|
||||
|
||||
#### 4.5.1 矩阵布局
|
||||
|
||||
三楼仓库的物理布局需现场确认(待确认事项第 10 条),本设计按以下原则适配:
|
||||
|
||||
- 如果三楼仓库按"排-列"二维布局:每行对应一排,每列对应一个列号
|
||||
- 如果三楼仓库按"区域-排-列"三维布局:区域通过顶部筛选切换,每个区域内按"排-列"二维展示
|
||||
- 如果三楼仓库按不规则布局:可按库位编号分组展示,或按物理位置映射到网格
|
||||
|
||||
矩阵结构:
|
||||
|
||||
```html
|
||||
<table class="warehouse-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="row-header">排/行号</th>
|
||||
<th v-for="col in columnCount" :key="col" class="column-header">{{ col }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="(row, rowIndex) in displayedLocationData" :key="rowIndex">
|
||||
<td class="row-label-cell">{{ row['行标识'] }}</td>
|
||||
<td v-for="col in columnKeys" :key="col"
|
||||
:class="['status-' + row[col].状态, { 'selected-cell': isSelected(row['行标识'], col) }]"
|
||||
class="location-cell"
|
||||
@click="selectLocation(row['行标识'], col, row[col])"
|
||||
@mouseenter="onCellHover(row['行标识'], col, row[col])"
|
||||
@mouseleave="onCellLeave">
|
||||
<div class="cell-content">
|
||||
<span v-if="showCellText === 'text'" class="cell-text">{{ getStatusText(row[col].状态) }}</span>
|
||||
<span v-else class="cell-icon"><i :class="getStatusIcon(row[col].状态)"></i></span>
|
||||
<div v-if="isHoveredCell(row['行标识'], col)" class="cell-tooltip">
|
||||
{{ getStatusDescription(row[col].状态) }}
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
```
|
||||
|
||||
#### 4.5.2 单元格数据结构
|
||||
|
||||
每个库位单元格的数据结构建议如下:
|
||||
|
||||
```javascript
|
||||
{
|
||||
'行标识': 'A-01', // 行/排标识
|
||||
1: { // 列号对应的库位信息
|
||||
库位编号: 'A-01-01',
|
||||
库位名称: 'A-01-01',
|
||||
状态: 0, // 0=空闲, 1=预占, 2=有库存, 3=异常
|
||||
区域: 'A区'
|
||||
},
|
||||
2: {
|
||||
库位编号: 'A-01-02',
|
||||
库位名称: 'A-01-02',
|
||||
状态: 2,
|
||||
区域: 'A区'
|
||||
}
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
说明:
|
||||
|
||||
- 矩阵数据结构参考立库 `warehouseData` 的组织方式(行标识 + 列号映射),但每个单元格从简单状态值扩展为包含 `库位编号`、`库位名称`、`状态`、`区域` 的对象
|
||||
- 与立库组件中单元格仅存储状态数字值(`0/1/2/9`)相比,三楼仓库单元格存储更丰富的信息,便于点击时直接获取库位编号查询物料明细
|
||||
|
||||
#### 4.5.3 单元格交互效果
|
||||
|
||||
参考立库可视化组件的交互设计:
|
||||
|
||||
- 鼠标悬停:单元格放大(`transform: scale(1.1)`)并显示状态说明浮层
|
||||
- 点击选中:蓝色边框高亮选中库位
|
||||
- 选中后高亮当前行和列
|
||||
|
||||
### 4.6 分页区
|
||||
|
||||
参考立库分页方案,当库位行数较多时支持分页显示:
|
||||
|
||||
- 分页针对"行数据",不是单元格
|
||||
- 每页可选条数:`5`、`8`、`10`、`15`
|
||||
- 布局:`total, sizes, prev, pager, next, jumper`
|
||||
|
||||
### 4.7 库位详情弹窗
|
||||
|
||||
点击非"有库存"状态的库位时弹出,参考立库的库位详情弹窗但信息更丰富。
|
||||
|
||||
弹窗标题:`库位详情 - {库位编号}`
|
||||
|
||||
弹窗内容(使用 `el-descriptions` 组件):
|
||||
|
||||
| 字段 | 数据来源 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| 库位编号 | 行数据 | 当前点击的库位编号 |
|
||||
| 库位名称 | 行数据 | 库位显示名称 |
|
||||
| 区域 | 行数据 | 所属区域 |
|
||||
| 当前状态 | 行数据 | 状态中文说明 |
|
||||
| 状态描述 | 前端映射 | 状态对应的业务说明 |
|
||||
| 最后更新时间 | 后端接口 | 该库位最近一次库存变动时间(需后端支持) |
|
||||
|
||||
弹窗底部操作按钮:
|
||||
|
||||
| 按钮 | 作用 |
|
||||
| --- | --- |
|
||||
| 关闭 | 关闭弹窗 |
|
||||
|
||||
### 4.8 物料信息弹窗
|
||||
|
||||
点击"有库存"状态的库位时弹出,参考立库的物料信息弹窗。
|
||||
|
||||
弹窗标题:`库位物料信息 - {库位编号}`
|
||||
|
||||
弹窗内容(使用 `el-table` 组件):
|
||||
|
||||
| 列名 | 字段 | 宽度 | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| 物料编号 | `物料编号` | 150 | 显示溢出省略 |
|
||||
| 物料名称 | `物料名称` | 120 | 显示溢出省略 |
|
||||
| 图号 | `图号` | 150 | 显示溢出省略 |
|
||||
| 规格型号 | `规格型号` | 150 | 显示溢出省略 |
|
||||
| 库存数量 | `库存数量` | 100 | 右对齐,大于 0 绿色、等于 0 红色,保留 3 位小数,下方显示单位 |
|
||||
| 批次 | `批次` | 120 | 显示溢出省略 |
|
||||
|
||||
弹窗底部操作按钮:
|
||||
|
||||
| 按钮 | 作用 |
|
||||
| --- | --- |
|
||||
| 关闭 | 关闭弹窗 |
|
||||
|
||||
数据来源:调用后端接口 `仓储管理_三楼仓库库位物料_查询数据`,传入库位编号。
|
||||
|
||||
### 4.9 自动刷新
|
||||
|
||||
仓储汇总看板(`WarehouseSummary`)已有 1 分钟定时刷新的先例。三楼仓库可视化支持可选的自动刷新:
|
||||
|
||||
- 默认关闭,通过顶部 `el-switch` 开启
|
||||
- 刷新频率可选:30 秒、1 分钟、5 分钟
|
||||
- 刷新时调用与初始加载相同的后端接口重新查询
|
||||
- 刷新期间显示 `v-loading` 加载动画
|
||||
- 刷新期间不阻断用户操作
|
||||
|
||||
<br/>
|
||||
|
||||
## 五、后端接口设计
|
||||
|
||||
### 5.1 库位数据查询接口
|
||||
|
||||
接口名:`仓储管理_三楼仓库库位_查询数据`
|
||||
|
||||
请求类型:`type = '1'`(查询)
|
||||
|
||||
请求参数:
|
||||
|
||||
| 参数名 | 参数类型 | 是否必填 | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| `区域_check` | int | 否 | 是否传入区域筛选,0=不筛选,1=筛选 |
|
||||
| `区域` | string | 否 | 区域名称,如 `A区` |
|
||||
| `库位编号_check` | int | 否 | 是否传入库位编号筛选 |
|
||||
| `库位编号` | string | 否 | 库位编号,支持模糊匹配 |
|
||||
| `库位状态_check` | int | 否 | 是否传入状态筛选 |
|
||||
| `库位状态` | int | 否 | 库位状态值 |
|
||||
|
||||
返回数据结构:
|
||||
|
||||
```javascript
|
||||
[
|
||||
{
|
||||
'行标识': 'A-01', // 矩阵行标识
|
||||
1: { // 列号
|
||||
库位编号: 'A-01-01',
|
||||
库位名称: 'A-01-01',
|
||||
状态: 0, // 0=空闲, 1=预占, 2=有库存, 3=异常
|
||||
区域: 'A区'
|
||||
},
|
||||
2: {
|
||||
库位编号: 'A-01-02',
|
||||
库位名称: 'A-01-02',
|
||||
状态: 2,
|
||||
区域: 'A区'
|
||||
}
|
||||
// ...
|
||||
},
|
||||
// ...
|
||||
]
|
||||
```
|
||||
|
||||
说明:
|
||||
|
||||
- 返回数据结构与立库 `GetPositionView` 类似,但单元格从简单数字扩展为含库位信息的对象
|
||||
- 如果后端返回扁平的库位列表更便于实现,前端也可以在接收到扁平数据后自行转换为矩阵结构(见 5.3 节数据转换说明)
|
||||
- 后端也可以按立库的方式返回矩阵格式,前端直接渲染
|
||||
|
||||
备选方案(后端返回扁平列表):
|
||||
|
||||
```javascript
|
||||
[
|
||||
{ 库位编号: 'A-01-01', 库位名称: 'A-01-01', 状态: 0, 区域: 'A区', 排: 'A-01', 列: 1 },
|
||||
{ 库位编号: 'A-01-02', 库位名称: 'A-01-02', 状态: 2, 区域: 'A区', 排: 'A-01', 列: 2 },
|
||||
// ...
|
||||
]
|
||||
```
|
||||
|
||||
前端接收到扁平数据后自动生成矩阵(见 5.3 节)。
|
||||
|
||||
### 5.2 库位物料详情查询接口
|
||||
|
||||
接口名:`仓储管理_三楼仓库库位物料_查询数据`
|
||||
|
||||
请求类型:`type = '1'`(查询)
|
||||
|
||||
请求参数:
|
||||
|
||||
| 参数名 | 参数类型 | 是否必填 | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| `库位编号_check` | int | 是 | 固定传 1 |
|
||||
| `库位编号` | string | 是 | 当前点击的库位编号 |
|
||||
| `UserID` | string | 是 | 从 Cookie 获取 |
|
||||
| `ModularID` | string | 是 | 当前路由路径 |
|
||||
|
||||
返回数据结构:
|
||||
|
||||
```javascript
|
||||
[
|
||||
{
|
||||
物料编号: '02.009.001.0001',
|
||||
物料名称: '齿轮',
|
||||
图号: 'LRS3056-001',
|
||||
规格型号: 'LRS3056-001-A',
|
||||
库存数量: 12.000,
|
||||
单位: '台',
|
||||
批次: 'BATCH20260601001'
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
说明:
|
||||
|
||||
- 返回字段与立库 `StockDetailView` 对齐(物料编号 mno、物料名称 mname、图号 spec、型号 thao、库存数量 qty、单位 munit、批次 batch),但使用中文字段名以保持与项目命名规范一致
|
||||
- 如果后端已在仓储管理相关视图中维护了三楼仓库的物料库存与库位关系,优先复用现有视图或过程
|
||||
|
||||
### 5.3 数据转换(前端侧)
|
||||
|
||||
如果后端返回扁平的库位列表,前端需要将扁平数据转换为矩阵结构。转换逻辑如下:
|
||||
|
||||
```javascript
|
||||
// 将扁平库位列表转换为矩阵结构
|
||||
transformToMatrix(locationList) {
|
||||
// 按"排/行标识"分组
|
||||
var rowMap = {}
|
||||
locationList.forEach(function(item) {
|
||||
var rowKey = item.排 || item.行标识
|
||||
if (!rowMap[rowKey]) {
|
||||
rowMap[rowKey] = { '行标识': rowKey }
|
||||
}
|
||||
var colKey = item.列
|
||||
rowMap[rowKey][colKey] = {
|
||||
库位编号: item.库位编号,
|
||||
库位名称: item.库位名称,
|
||||
状态: item.状态,
|
||||
区域: item.区域
|
||||
}
|
||||
})
|
||||
// 转为数组并按行标识排序
|
||||
var matrixData = Object.values(rowMap)
|
||||
matrixData.sort(function(a, b) {
|
||||
return a['行标识'].localeCompare(b['行标识'])
|
||||
})
|
||||
return matrixData
|
||||
}
|
||||
```
|
||||
|
||||
### 5.4 后端接口复用评估
|
||||
|
||||
| 已有接口 | 可否复用 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| `仓储管理_库位_查询` | 部分复用 | 现有库位管理页查询全部库位,但缺少"状态"字段和矩阵布局信息,需补充或新增三楼仓库专用接口 |
|
||||
| `仓储管理_物料库位_查询数据` | 作为物料详情备选 | 按物料查库位,可反向使用按库位查物料,但参数和返回字段可能需要调整 |
|
||||
| `仓储管理_库存查询_查询` | 不直接复用 | 库存查询按物料聚合,与按库位聚合的需求方向不同 |
|
||||
| `仓储管理_库存盘点_查询` | 参考数据来源 | 库存盘点数据包含物料与库位的对应关系和库存数量,可作为三楼仓库库位状态和物料明细的数据来源 |
|
||||
| `GetPositionView`(立库) | 不复用 | 立库走独立数据库,数据结构不同 |
|
||||
|
||||
<br/>
|
||||
|
||||
## 六、data 数据结构设计
|
||||
|
||||
```javascript
|
||||
data() {
|
||||
return {
|
||||
// ========== 筛选条件 ==========
|
||||
areaFilter: '', // 区域筛选值
|
||||
statusFilter: '', // 状态筛选值
|
||||
locationCodeSearch: '', // 库位编号搜索
|
||||
areaOptions: [], // 区域下拉选项,从数据动态生成
|
||||
statusOptions: [ // 状态下拉选项
|
||||
{ label: '全部', value: '' },
|
||||
{ label: '有库存', value: 2 },
|
||||
{ label: '预占/待处理', value: 1 },
|
||||
{ label: '空闲', value: 0 },
|
||||
{ label: '异常/禁用', value: 3 }
|
||||
],
|
||||
|
||||
// ========== 自动刷新 ==========
|
||||
autoRefresh: false, // 自动刷新开关
|
||||
refreshInterval: 60, // 刷新间隔(秒)
|
||||
refreshTimer: null, // 定时器引用
|
||||
refreshOptions: [ // 刷新间隔选项
|
||||
{ label: '30秒', value: 30 },
|
||||
{ label: '1分钟', value: 60 },
|
||||
{ label: '5分钟', value: 300 }
|
||||
],
|
||||
|
||||
// ========== 分页 ==========
|
||||
pageCurrent: 1,
|
||||
pageSize: 8,
|
||||
|
||||
// ========== 矩阵数据 ==========
|
||||
locationRawData: [], // 后端返回的原始数据(扁平列表)
|
||||
locationMatrixData: [], // 转换后的矩阵数据
|
||||
filteredData: [], // 筛选后的矩阵数据
|
||||
displayedData: [], // 当前页显示的矩阵数据
|
||||
|
||||
// ========== 选中与交互状态 ==========
|
||||
selectedCell: null, // { 行标识, 列号, 库位信息 }
|
||||
highlightedRow: null, // 当前高亮行
|
||||
hoveredCell: null, // 当前悬停单元格
|
||||
|
||||
// ========== 统计信息 ==========
|
||||
statistics: {
|
||||
total: 0,
|
||||
withStock: 0,
|
||||
preOccupied: 0,
|
||||
empty: 0,
|
||||
abnormal: 0,
|
||||
usageRate: 0
|
||||
},
|
||||
|
||||
// ========== 弹窗 ==========
|
||||
detailDialogVisible: false, // 库位详情弹窗
|
||||
detailInfo: {}, // 当前弹窗展示的库位信息
|
||||
materialDialogVisible: false, // 物料信息弹窗
|
||||
materialLoading: false,
|
||||
materialList: [], // 当前库位的物料列表
|
||||
materialLocationCode: '', // 当前查询的库位编号
|
||||
|
||||
// ========== 显示设置 ==========
|
||||
showCellText: 'text', // 'text' 或 'icon'
|
||||
loading: false,
|
||||
lastUpdateTime: ''
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
<br/>
|
||||
|
||||
## 七、methods 核心方法设计
|
||||
|
||||
### 7.1 数据加载与转换
|
||||
|
||||
```javascript
|
||||
// 加载三楼仓库库位数据
|
||||
loadLocationData() {
|
||||
this.loading = true
|
||||
var param = []
|
||||
param[0] = ['区域_check', this.areaFilter ? 1 : 0]
|
||||
param[1] = ['区域', this.areaFilter]
|
||||
param[2] = ['库位编号_check', this.locationCodeSearch ? 1 : 0]
|
||||
param[3] = ['库位编号', this.locationCodeSearch]
|
||||
param[4] = ['库位状态_check', this.statusFilter !== '' ? 1 : 0]
|
||||
param[5] = ['库位状态', this.statusFilter]
|
||||
var Data = this.CreateData('1', '仓储管理_三楼仓库库位_查询数据', param)
|
||||
this.getTable(Data).then(response => {
|
||||
this.locationRawData = response.data || []
|
||||
this.locationMatrixData = this.transformToMatrix(this.locationRawData)
|
||||
this.filteredData = this.locationMatrixData
|
||||
this.updateStatistics()
|
||||
this.updateDisplayedData()
|
||||
this.updateAreaOptions()
|
||||
this.updateLastUpdateTime()
|
||||
this.loading = false
|
||||
}).catch(() => {
|
||||
this.loading = false
|
||||
})
|
||||
}
|
||||
|
||||
// 将扁平库位列表转换为矩阵结构
|
||||
transformToMatrix(list) {
|
||||
// 按"排/行标识"分组(同 5.3 节)
|
||||
}
|
||||
```
|
||||
|
||||
### 7.2 统计计算
|
||||
|
||||
```javascript
|
||||
updateStatistics() {
|
||||
var withStock = 0
|
||||
var preOccupied = 0
|
||||
var empty = 0
|
||||
var abnormal = 0
|
||||
this.filteredData.forEach(function(row) {
|
||||
Object.keys(row).forEach(function(key) {
|
||||
if (key !== '行标识') {
|
||||
var status = row[key].状态
|
||||
if (status === 2) withStock++
|
||||
else if (status === 1) preOccupied++
|
||||
else if (status === 0) empty++
|
||||
else if (status === 3) abnormal++
|
||||
}
|
||||
})
|
||||
})
|
||||
var total = withStock + preOccupied + empty + abnormal
|
||||
var usageRate = total > 0 ? (((withStock + preOccupied) / total) * 100).toFixed(1) : 0
|
||||
this.statistics = { total, withStock, preOccupied, empty, abnormal, usageRate }
|
||||
}
|
||||
```
|
||||
|
||||
### 7.3 单元格点击交互
|
||||
|
||||
```javascript
|
||||
selectLocation(rowKey, colKey, locationInfo) {
|
||||
this.selectedCell = { 行标识: rowKey, 列号: colKey, 信息: locationInfo }
|
||||
this.highlightedRow = rowKey
|
||||
if (locationInfo.状态 === 2) {
|
||||
// 有库存,查询物料明细
|
||||
this.loadMaterialDetail(locationInfo.库位编号)
|
||||
} else {
|
||||
// 非有库存状态,显示库位详情
|
||||
this.showLocationDetail(locationInfo)
|
||||
}
|
||||
}
|
||||
|
||||
// 查询库位物料明细
|
||||
loadMaterialDetail(locationCode) {
|
||||
this.materialLoading = true
|
||||
this.materialLocationCode = locationCode
|
||||
var param = []
|
||||
param[0] = ['库位编号_check', 1]
|
||||
param[1] = ['库位编号', locationCode]
|
||||
var Data = this.CreateData('1', '仓储管理_三楼仓库库位物料_查询数据', param)
|
||||
this.getTable(Data).then(response => {
|
||||
this.materialList = response.data || []
|
||||
this.materialDialogVisible = true
|
||||
this.materialLoading = false
|
||||
}).catch(() => {
|
||||
this.materialLoading = false
|
||||
})
|
||||
}
|
||||
|
||||
// 显示库位详情
|
||||
showLocationDetail(locationInfo) {
|
||||
this.detailInfo = {
|
||||
库位编号: locationInfo.库位编号,
|
||||
库位名称: locationInfo.库位名称,
|
||||
区域: locationInfo.区域,
|
||||
状态: this.getStatusLabel(locationInfo.状态),
|
||||
状态描述: this.getStatusDescription(locationInfo.状态)
|
||||
}
|
||||
this.detailDialogVisible = true
|
||||
}
|
||||
```
|
||||
|
||||
### 7.4 状态映射方法
|
||||
|
||||
```javascript
|
||||
// 获取状态显示文字
|
||||
getStatusLabel(status) {
|
||||
var map = { 0: '空', 1: '预', 2: '存', 3: '异' }
|
||||
return map[status] || '未知'
|
||||
}
|
||||
|
||||
// 获取状态完整描述
|
||||
getStatusDescription(status) {
|
||||
var map = {
|
||||
0: '空闲库位,可存放物料',
|
||||
1: '预占或待处理,库位已被预留',
|
||||
2: '有库存,库位上存放有物料',
|
||||
3: '异常或禁用,库位不可使用'
|
||||
}
|
||||
return map[status] || '未知状态'
|
||||
}
|
||||
|
||||
// 获取状态图标类名
|
||||
getStatusIcon(status) {
|
||||
var map = {
|
||||
0: 'el-icon-minus',
|
||||
1: 'el-icon-time',
|
||||
2: 'el-icon-box',
|
||||
3: 'el-icon-warning'
|
||||
}
|
||||
return map[status] || 'el-icon-question'
|
||||
}
|
||||
```
|
||||
|
||||
### 7.5 自动刷新
|
||||
|
||||
```javascript
|
||||
// 切换自动刷新
|
||||
handleAutoRefreshChange(val) {
|
||||
if (val) {
|
||||
this.startAutoRefresh()
|
||||
} else {
|
||||
this.stopAutoRefresh()
|
||||
}
|
||||
}
|
||||
|
||||
startAutoRefresh() {
|
||||
this.stopAutoRefresh()
|
||||
var self = this
|
||||
this.refreshTimer = setInterval(function() {
|
||||
self.loadLocationData()
|
||||
}, this.refreshInterval * 1000)
|
||||
}
|
||||
|
||||
stopAutoRefresh() {
|
||||
if (this.refreshTimer) {
|
||||
clearInterval(this.refreshTimer)
|
||||
this.refreshTimer = null
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
<br/>
|
||||
|
||||
## 八、页面样式设计
|
||||
|
||||
参考立库可视化组件的样式方案,保持一致的设计语言。
|
||||
|
||||
### 8.1 核心样式类
|
||||
|
||||
| 类名 | 用途 | 参考来源 |
|
||||
| --- | --- | --- |
|
||||
| `.warehouse-table` | 矩阵表格 | 立库 `.warehouse-table` 复用 |
|
||||
| `.location-cell` | 库位单元格 | 立库 `.warehouse-cell` 调整命名 |
|
||||
| `.status-0` | 空闲库位灰色 | 立库 `.status-0` 复用 |
|
||||
| `.status-1` | 预占橙色 | 立库 `.status-1`(橙色),新增 |
|
||||
| `.status-2` | 有库存绿色 | 立库 `.status-2` 复用 |
|
||||
| `.status-3` | 异常红色 | 新增,区别于立库锁库蓝色 |
|
||||
| `.selected-cell` | 选中蓝色边框 | 立库 `.selected-cell` 复用 |
|
||||
| `.highlighted-row` | 行高亮 | 立库 `.highlighted-row` 复用 |
|
||||
| `.cell-tooltip` | 悬浮提示 | 立库 `.cell-tooltip` 复用 |
|
||||
| `.legend-color` | 图例色块 | 立库 `.legend-color` 复用 |
|
||||
|
||||
### 8.2 大屏适配
|
||||
|
||||
参考立库可视化组件的响应式断点:
|
||||
|
||||
```scss
|
||||
// 全屏大屏:默认 1920px
|
||||
.warehouse-table {
|
||||
min-width: 1200px;
|
||||
.location-cell { min-width: 40px; height: 40px; }
|
||||
}
|
||||
|
||||
// 中等屏幕:1400px 以下
|
||||
@media (max-width: 1400px) {
|
||||
.warehouse-table {
|
||||
min-width: 900px;
|
||||
.location-cell { min-width: 35px; height: 35px; }
|
||||
}
|
||||
}
|
||||
|
||||
// 小屏幕:992px 以下
|
||||
@media (max-width: 992px) {
|
||||
.warehouse-table {
|
||||
min-width: 700px;
|
||||
.location-cell { min-width: 30px; height: 30px; }
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 8.3 与立库样式的差异
|
||||
|
||||
| 差异项 | 立库 | 三楼仓库 |
|
||||
| --- | --- | --- |
|
||||
| 异常状态颜色 | 锁库=天蓝色 `skyblue` | 异常=红色 `#f56c6c` |
|
||||
| 状态数量 | 4 种 | 3-4 种(取决于现场确认) |
|
||||
| 单元格内容 | 纯状态值 | 含库位信息的对象 |
|
||||
|
||||
<br/>
|
||||
|
||||
## 九、功能实现流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["开始:三楼仓库可视化"] --> B["页面 created 调用 loadLocationData"]
|
||||
B --> C["构造请求参数:区域、库位编号、状态"]
|
||||
C --> D["调用 仓储管理_三楼仓库库位_查询数据"]
|
||||
D --> E{"后端返回数据格式"}
|
||||
E -- "矩阵格式" --> F["直接渲染矩阵"]
|
||||
E -- "扁平列表" --> G["前端调用 transformToMatrix 转换为矩阵"]
|
||||
F --> H["更新统计卡片、图例、矩阵"]
|
||||
G --> H
|
||||
H --> I["用户操作"]
|
||||
I --> J{"操作类型"}
|
||||
J -- "切换区域" --> K["更新 areaFilter 并重新 loadLocationData"]
|
||||
J -- "切换状态筛选" --> L["前端筛选 filteredData 并重新统计"]
|
||||
J -- "输入库位编号搜索" --> M["高亮匹配库位"]
|
||||
J -- "切换显示模式" --> N["切换文字/图标"]
|
||||
J -- "点击库位" --> O{"库位状态"}
|
||||
O -- "有库存" --> P["调用 仓储管理_三楼仓库库位物料_查询数据"]
|
||||
P --> Q["弹出物料信息表格弹窗"]
|
||||
O -- "非有库存" --> R["弹出库位详情描述弹窗"]
|
||||
J -- "开启自动刷新" --> S["启动定时器,按间隔重新 loadLocationData"]
|
||||
S --> I
|
||||
K --> H
|
||||
L --> H
|
||||
```
|
||||
|
||||
<br/>
|
||||
|
||||
## 十、待确认事项
|
||||
|
||||
| 序号 | 事项 | 影响 | 建议 |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | 三楼仓库的物理布局和库位编码规则 | 决定矩阵行列定义和编码规则 | 需仓库现场确认区域划分、排/列号规则 |
|
||||
| 2 | 库位状态分类是否与立库一致 | 决定状态数量、颜色和业务含义 | 建议与仓库确认是否需要"预占"和"异常"状态 |
|
||||
| 3 | 自动刷新频率 | 刷新频率影响服务器压力 | 建议默认 1 分钟,大屏场景可配置 |
|
||||
| 4 | 后端是否可返回矩阵格式数据 | 影响前端转换复杂度 | 建议后端返回扁平列表,前端转换为矩阵,职责更清晰 |
|
||||
| 5 | 库位数据是否与立库共用表还是独立表 | 影响后端接口是否复用 | 需后端确认三楼仓库库位数据所在表 |
|
||||
| 6 | 是否需要导出功能 | 需求文档未提及,但立库已预留 | 建议本期暂不实现,预留后续扩展 |
|
||||
| 7 | 三楼仓库库位数量规模 | 影响是否需要分页和性能优化 | 需现场确认库位总数,若少于 100 个可一屏展示不分页 |
|
||||
|
||||
<br/>
|
||||
|
||||
## 十一、影响范围
|
||||
|
||||
### 11.1 新增文件
|
||||
|
||||
| 文件 | 说明 |
|
||||
| --- | --- |
|
||||
| `src/views/WarehouseManagement/ThirdFloorWarehouse/index.vue` | 三楼仓库可视化页面组件 |
|
||||
|
||||
### 11.2 新增后端接口
|
||||
|
||||
| 接口名 | 说明 |
|
||||
| --- | --- |
|
||||
| `仓储管理_三楼仓库库位_查询数据` | 查询三楼仓库库位列表及状态 |
|
||||
| `仓储管理_三楼仓库库位物料_查询数据` | 按库位编号查询物料明细 |
|
||||
|
||||
### 11.3 不受影响
|
||||
|
||||
- 立库可视化组件 `WarehouseVisualization` 不受影响
|
||||
- 库位管理 `LocationManagement` 不受影响
|
||||
- 物料库位 `MaterialLocation` 不受影响
|
||||
- 其他仓储业务页面不受影响
|
||||
|
||||
<br/>
|
||||
|
||||
## 十二、验收清单
|
||||
|
||||
| 序号 | 验收项 | 验收方式 |
|
||||
| --- | --- | --- |
|
||||
| 1 | 三楼仓库可视化页面可正常加载并展示所有库位 | 打开页面,确认矩阵展示正常 |
|
||||
| 2 | 不同状态的库位用不同颜色区分,图例说明清晰 | 检查图例与矩阵颜色对应 |
|
||||
| 3 | 统计面板数据与实际库位状态一致 | 手工统计库位数量与面板数据对比 |
|
||||
| 4 | 点击有库存的库位可查看物料详情 | 点击绿色库位,弹窗显示物料编号、名称、图号、库存数量等 |
|
||||
| 5 | 点击空闲库位可查看库位基本信息 | 点击灰色库位,弹窗显示库位编号、状态说明等 |
|
||||
| 6 | 区域筛选和状态筛选功能正常 | 切换筛选条件,矩阵刷新并统计更新 |
|
||||
| 7 | 库位编号搜索可定位到对应库位 | 输入库位编号,点击搜索,目标库位高亮 |
|
||||
| 8 | 刷新数据后页面状态更新正确 | 点击刷新按钮,矩阵重新加载 |
|
||||
| 9 | 自动刷新开启后定时更新 | 开启自动刷新,等待自动刷新触发,确认数据更新 |
|
||||
| 10 | 文字/图标两种显示模式切换正常 | 切换显示模式,确认单元格内容变化 |
|
||||
| 11 | 大屏展示布局合理,文字清晰可读 | 在 1920px 宽度下检查布局和字体 |
|
||||
| 12 | 不影响现有立库可视化功能 | 切换到立库可视化页面,确认功能正常 |
|
||||
| 13 | 分页功能正常(如库位行数较多) | 切换分页,确认分页数据正确 |
|
||||
|
||||
<br/>
|
||||
|
||||
## 十三、风险与回退
|
||||
|
||||
### 13.1 风险
|
||||
|
||||
| 风险 | 影响 | 缓解措施 |
|
||||
| --- | --- | --- |
|
||||
| 三楼仓库库位数据与立库数据结构差异较大 | 可能需要单独设计接口和前端组件 | 复用立库可视化交互设计模式,仅数据层调整 |
|
||||
| 库位编码规则未确认 | 矩阵行列定义无法确定 | 先与仓库确认编码规则再开发,避免返工 |
|
||||
| 库位状态分类未确认 | 状态值和颜色方案无法确定 | 先与仓库确认状态需求再定义映射 |
|
||||
| 库位数量规模未知 | 影响性能和分页设计 | 预留分页方案,小规模时可一屏展示 |
|
||||
| 后端接口未就绪 | 前端无法联调 | 前端先用模拟数据开发,接口就绪后对接 |
|
||||
|
||||
### 13.2 回退方式
|
||||
|
||||
- 该功能为新增页面,不修改现有任何组件
|
||||
- 如有问题,直接移除 `ThirdFloorWarehouse` 目录和对应菜单配置即可回退
|
||||
- 不影响其他任何仓储页面功能
|
||||
|
||||
<br/>
|
||||
|
||||
## 十四、发布步骤
|
||||
|
||||
1. 后端部署库位查询和物料详情查询接口
|
||||
2. 后端配置三楼仓库可视化的菜单数据(路由、菜单名称、图标等)
|
||||
3. 发布前端代码(`ThirdFloorWarehouse/index.vue`)
|
||||
4. 清浏览器缓存后进入系统
|
||||
5. 在仓储管理菜单下打开三楼仓库可视化页面
|
||||
6. 验证库位矩阵展示与仓库实际布局一致
|
||||
7. 验证统计卡片数据准确
|
||||
8. 验证点击库位可查看物料详情或库位详情
|
||||
9. 验证筛选、搜索、刷新、自动刷新等功能正常
|
||||
10. 由仓库人员在现场环境实际使用并确认数据正确性
|
||||
|
||||
<br/>
|
||||
|
||||
## 十五、实施拆分
|
||||
|
||||
### 开发步骤
|
||||
|
||||
| 步骤 | 内容 | 前置依赖 |
|
||||
| --- | --- | --- |
|
||||
| 1 | 与仓库确认物理布局、库位编码规则、状态分类 | 无 |
|
||||
| 2 | 后端新增库位查询和物料详情查询接口 | 步骤 1 |
|
||||
| 3 | 前端创建 `ThirdFloorWarehouse/index.vue` 页面框架 | 步骤 1 |
|
||||
| 4 | 实现矩阵数据加载和转换逻辑 | 步骤 2、3 |
|
||||
| 5 | 实现统计卡片、图例、矩阵渲染 | 步骤 4 |
|
||||
| 6 | 实现单元格点击交互和弹窗 | 步骤 5 |
|
||||
| 7 | 实现筛选、搜索、分页功能 | 步骤 5 |
|
||||
| 8 | 实现自动刷新功能 | 步骤 4 |
|
||||
| 9 | 大屏适配和样式调优 | 步骤 7 |
|
||||
| 10 | 联调测试 | 步骤 9 |
|
||||
|
||||
<br/>
|
||||
|
||||
修改人:Ld 修改时间:2026-06-30
|
||||
BIN
docs/产品报缺/产品报缺补货需求.docx
Normal file
167
docs/入库退货同步库存盘点库存设计说明.md
Normal file
@@ -0,0 +1,167 @@
|
||||
# 入库退货同步库存盘点库存设计说明
|
||||
|
||||
## 01-功能内容
|
||||
|
||||
本次修复针对入库记录组件发起退货后,库存盘点组件中的对应库位库存未同步减少的问题。
|
||||
|
||||
原问题现象:
|
||||
|
||||
1. 用户在“入库记录”组件中对采购件、耗材或自制件执行退货。
|
||||
2. 入库记录自身的退货数、入库数等数据已修改。
|
||||
3. 库存盘点组件中对应物料、对应库位的库存数未同步减少。
|
||||
4. 用户在库存盘点组件中点击编辑库存时,页面会重新读取未同步的盘点库存,导致库存数看起来“变回来”。
|
||||
|
||||
修复目标:
|
||||
|
||||
1. 入库记录退货成功时,同步扣减库存盘点对应库位库存。
|
||||
2. 扣减对象必须精确到原入库记录的 `货位流水号`。
|
||||
3. 采购件、耗材、自制件退货均支持同步扣减。
|
||||
4. 如果库存盘点中找不到对应库位库存,或库存不足,应阻止退货并给出错误。
|
||||
5. 保持原有入库记录、退货记录、采购合同状态更新逻辑不变。
|
||||
|
||||
## 02-程序开发步骤
|
||||
|
||||
### 前端改造
|
||||
|
||||
1. 在入库记录组件发起退货校验时,补传当前行的 `入库记录流水号`。
|
||||
2. 后端通过 `入库记录流水号` 读取原入库记录中的 `货位流水号`。
|
||||
3. 避免仅通过物料、合同、批次、入库时间等条件推断库位,防止扣错库位。
|
||||
|
||||
涉及前端文件:
|
||||
|
||||
- `src/views/WarehouseManagement/WarehousingRecord/WarehousingRecord.vue`
|
||||
|
||||
核心参数调整:
|
||||
|
||||
```js
|
||||
param[6] = ['入库记录流水号', this.DeliveryNumber]
|
||||
```
|
||||
|
||||
### 后端改造
|
||||
|
||||
1. 调整采购/耗材退货验证过程:
|
||||
- `仓储管理_入库记录_退货入库_验证`
|
||||
2. 调整采购/耗材退货执行过程:
|
||||
- `仓储管理_入库记录_退货入库`
|
||||
3. 调整自制件退货执行过程:
|
||||
- `仓储管理_自制件入库记录_退货入库`
|
||||
4. 退货时按原入库记录中的 `货位流水号` 扣减:
|
||||
- `库存管理_物料与货位对照表.货位存量`
|
||||
5. 采购件和耗材按外购件库存表处理。
|
||||
6. 自制件按自制件入库记录中的库位处理。
|
||||
7. 所有扣减、退货记录插入、入库记录回写放在事务中执行,任一步失败则回滚。
|
||||
|
||||
涉及 SQL 脚本:
|
||||
|
||||
- `sql/仓储管理_入库退货同步盘点库存.sql`
|
||||
|
||||
## 03-推进台账
|
||||
|
||||
| 轮次 | 做了什么 | 改了哪些文件/对象 | 验证了什么 | 下一步 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 1 | 分析退货后库存盘点不变原因 | 入库记录组件、退货存储过程 | 确认退货未按原入库库位精确扣减盘点库存 | 设计同步扣减方案 |
|
||||
| 2 | 前端退货校验补传入库记录流水号 | `WarehousingRecord.vue` | 参数可传到后端验证过程 | 改造 SQL |
|
||||
| 3 | 改造采购/耗材退货验证过程 | `仓储管理_入库记录_退货入库_验证` | 可按入库记录读取原货位 | 改造退货执行 |
|
||||
| 4 | 改造采购/耗材退货执行过程 | `仓储管理_入库记录_退货入库` | 退货时扣减对应库位库存 | 覆盖自制件 |
|
||||
| 5 | 改造自制件退货执行过程 | `仓储管理_自制件入库记录_退货入库` | 自制件退货也同步扣减盘点库存 | 编译和执行脚本 |
|
||||
| 6 | 执行 SQL 脚本并验证对象 | SQL Server 数据库 | 3 个过程已成功更新 | 形成修复文档 |
|
||||
|
||||
## 04-任务矩阵
|
||||
|
||||
| 任务编号 | 任务内容 | 状态 | 验收标准 |
|
||||
| --- | --- | --- | --- |
|
||||
| R-001 | 定位入库退货和库存盘点库存不同步原因 | 已完成 | 明确退货扣减未精确同步库存盘点库位库存 |
|
||||
| R-002 | 前端退货验证补传 `入库记录流水号` | 已完成 | 采购/耗材退货验证参数包含入库记录流水号 |
|
||||
| R-003 | 采购/耗材退货验证按原入库库位校验库存 | 已完成 | 库存不足或未找到对应库位库存时不允许退货 |
|
||||
| R-004 | 采购/耗材退货执行同步扣减盘点库存 | 已完成 | `库存管理_物料与货位对照表.货位存量` 减少退货数量 |
|
||||
| R-005 | 自制件退货执行同步扣减盘点库存 | 已完成 | 自制件原入库库位库存同步减少 |
|
||||
| R-006 | SQL 事务保护 | 已完成 | 退货记录、入库记录、库存扣减任一步失败均回滚 |
|
||||
| R-007 | 前端结构验证 | 已完成 | `WarehousingRecord.vue` 模板和脚本解析通过 |
|
||||
| R-008 | SQL 对象部署验证 | 已完成 | 相关存储过程已在目标库更新 |
|
||||
|
||||
## 05-验收证据
|
||||
|
||||
### 前端验证
|
||||
|
||||
验证文件:
|
||||
|
||||
- `src/views/WarehouseManagement/WarehousingRecord/WarehousingRecord.vue`
|
||||
|
||||
验证内容:
|
||||
|
||||
1. 采购/耗材退货校验参数已补充:
|
||||
|
||||
```js
|
||||
param[6] = ['入库记录流水号', this.DeliveryNumber]
|
||||
```
|
||||
|
||||
2. Vue 单文件结构解析通过:
|
||||
|
||||
```text
|
||||
template ok
|
||||
script ok
|
||||
```
|
||||
|
||||
### SQL 验证
|
||||
|
||||
目标数据库:
|
||||
|
||||
- SQL Server:`192.168.1.27`
|
||||
- 数据库:`ERPTOOL_JY_20250826Back`
|
||||
|
||||
部署脚本:
|
||||
|
||||
```text
|
||||
sql/仓储管理_入库退货同步盘点库存.sql
|
||||
```
|
||||
|
||||
已更新对象:
|
||||
|
||||
```text
|
||||
仓储管理_入库记录_退货入库
|
||||
仓储管理_入库记录_退货入库_验证
|
||||
仓储管理_自制件入库记录_退货入库
|
||||
```
|
||||
|
||||
验证结果:
|
||||
|
||||
```text
|
||||
sql compile ok
|
||||
仓储管理_入库记录_退货入库 2026/6/27 9:30:02
|
||||
仓储管理_入库记录_退货入库_验证 2026/6/27 9:30:02
|
||||
仓储管理_自制件入库记录_退货入库 2026/6/27 9:30:02
|
||||
```
|
||||
|
||||
## 06-决策记录
|
||||
|
||||
| 决策点 | 选择 | 原因 |
|
||||
| --- | --- | --- |
|
||||
| 库存扣减定位方式 | 使用 `入库记录流水号` 反查原 `货位流水号` | 最精确,避免同物料多库位时扣错库位 |
|
||||
| 是否继续按物料、合同、批次、时间匹配 | 保留为辅助条件,但核心以原入库库位为准 | 原匹配条件无法唯一确定库位 |
|
||||
| 库存不足时如何处理 | 阻止退货并回滚事务 | 避免库存盘点出现负数或账实不一致 |
|
||||
| 采购/耗材和自制件是否共用逻辑 | 分别改造对应过程 | 两类入库记录来源表不同,分开更符合现有结构 |
|
||||
| 是否只改前端 | 否,必须改后端存储过程 | 库存一致性应由数据库事务保证 |
|
||||
| 是否影响库存调拨功能 | 不直接影响 | 退货扣减和调拨是两条库存变动路径,但都作用于库存盘点库位库存 |
|
||||
|
||||
## 07-业务流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["入库记录组件点击退货"] --> B["前端提交退货数量、原因、入库记录流水号"]
|
||||
B --> C["后端读取原入库记录"]
|
||||
C --> D["取得物料流水号、批次、原货位流水号"]
|
||||
D --> E{"对应库位库存是否足够"}
|
||||
E -- "否" --> F["阻止退货并返回错误"]
|
||||
E -- "是" --> G["插入退货记录"]
|
||||
G --> H["回写入库记录退货数量"]
|
||||
H --> I["扣减库存盘点对应库位货位存量"]
|
||||
I --> J["更新采购合同/订单状态"]
|
||||
J --> K["提交事务"]
|
||||
```
|
||||
|
||||
## 08-后续注意事项
|
||||
|
||||
1. 之后所有库存减少类业务,都应明确扣减到具体 `货位流水号`。
|
||||
2. 不建议再用“物料 + 批次 + 时间”推断库位,存在多库位同批次时扣错风险。
|
||||
3. 若后续增加退货撤销功能,应同步反向增加对应库位库存。
|
||||
4. 若库存盘点支持通用件、自制件、采购件多库存表,后续可抽出统一库存变动存储过程,减少重复逻辑。
|
||||
235
docs/工序工价与生产任务审核/MES提交审批到质检入库全链路测试报告.md
Normal file
@@ -0,0 +1,235 @@
|
||||
# MES 提交审批到质检入库全链路测试报告
|
||||
|
||||
## 一、测试结论
|
||||
|
||||
本次测试通过数据库事务方式模拟完整业务链路,链路可以跑通。
|
||||
|
||||
验证通过的流程为:
|
||||
|
||||
1. MES 工作站工作机端提交生产完成审批。
|
||||
2. JY 主系统生产审核组件审核通过。
|
||||
3. 原 MES 完工链路继续执行,工序和工艺计划完成数据更新。
|
||||
4. PDA 仓库自制件质检入口可查询到待质检数据,并可提交质检。
|
||||
5. JY 主系统仓储模块自制件入库确认可查询并完成入库。
|
||||
6. 测试全程在事务内执行并最终回滚,未污染正式业务数据。
|
||||
|
||||
需要注意:自制件最终入库确认入口当前在 JY 主系统仓储模块,不在 PDA 项目的采购件入库页面中;PDA 项目本次验证的是自制件质检入口。
|
||||
|
||||
## 二、测试环境
|
||||
|
||||
| 项目 | 内容 |
|
||||
| --- | --- |
|
||||
| 测试时间 | 2026-07-06 |
|
||||
| 数据库服务器 | 192.168.1.27 |
|
||||
| 数据库 | ERPTOOL_JY_20250826Back |
|
||||
| MES 工作站项目 | D:\景耀\MES工作站 |
|
||||
| JY 主系统项目 | D:\景耀\JY1.0 |
|
||||
| PDA 仓库项目 | D:\景耀\PDA_仓库 6.30 |
|
||||
| 测试方式 | SQL Server 事务内模拟,最终 ROLLBACK |
|
||||
|
||||
## 三、涉及入口和过程
|
||||
|
||||
| 环节 | 前端入口 | 后端过程 |
|
||||
| --- | --- | --- |
|
||||
| MES 提交审批 | `D:\景耀\MES工作站\src\components\login.vue` | `MES_机加工MES_加工完成整修审核_提交` |
|
||||
| 系统内审核 | `D:\景耀\JY1.0\src\views\SeikoWorkshop\ProductionCompletionAudit\index.vue` | `机加工MES_加工完成整修审核_审核数据` |
|
||||
| 原完工链路 | 审核过程内部继续调用 | `设备管理_零件工序_工序完成过程情况_增加数据` |
|
||||
| PDA 自制件质检查询 | `D:\景耀\PDA_仓库 6.30\src\components\purchasedWareHouse.vue` | `质检管理_订单查询_查询数据`、`质检管理_工序任务_查询数据`、`质检管理_工序信息_查询数据`、`质检管理_分配任务_查询数据` |
|
||||
| PDA 自制件质检提交 | `D:\景耀\PDA_仓库 6.30\src\components\purchasedWareHouse.vue` | `车间生产管理_质检管理_不合格处理` |
|
||||
| 自制件入库确认 | `D:\景耀\JY1.0\src\views\WarehouseManagement\PurchasePartsStorage\index.vue` | `仓储管理_自制件入库_查询`、`仓储管理_自制件入库_循环执行` |
|
||||
|
||||
## 四、测试数据
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| 工序流水号 | 124831 |
|
||||
| 工艺计划流水号 | 6584 |
|
||||
| 工艺任务流水号 | 38671 |
|
||||
| 订单流水号 | 19278 |
|
||||
| 订单号 | BHGZ202606250004 |
|
||||
| 产品名称 | XT40-2-BT40-AMB |
|
||||
| 零件名称 | 打刀缸 |
|
||||
| 零件图号 | XT40-2-BT40-BC-G |
|
||||
| 物料流水号 | 496 |
|
||||
| 工序 | 改制 |
|
||||
| 操作者 | 王建荣 |
|
||||
| 工位号 | C080 |
|
||||
| 设备 | 半自动双面铣床 |
|
||||
| 测试完成数量 | 1 |
|
||||
| 测试货位流水号 | 1 |
|
||||
|
||||
选用该数据的原因:该任务为末道工序,未完成数量为 1 件,具备从完工审核推进到自制件质检和入库确认的完整条件。
|
||||
|
||||
## 五、测试步骤与结果
|
||||
|
||||
### 1. MES 工作站提交审批
|
||||
|
||||
执行过程:`MES_机加工MES_加工完成整修审核_提交`
|
||||
|
||||
关键参数:
|
||||
|
||||
| 参数 | 值 |
|
||||
| --- | --- |
|
||||
| 工序流水号 | 124831 |
|
||||
| 工作者考勤编号 | 6027 |
|
||||
| 完成数量 | 1 |
|
||||
| 完成类型 | 1 |
|
||||
| 录工票人员编号 | 209 |
|
||||
| 工位号 | C080 |
|
||||
| 开始时间 | 2026-07-06 08:30:00 |
|
||||
| 结束时间 | 2026-07-06 08:40:00 |
|
||||
|
||||
结果:
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| result | 1 |
|
||||
| 审核流水号 | 10 |
|
||||
|
||||
结论:MES 工作站提交审批成功,审核记录可以生成。
|
||||
|
||||
### 2. JY 主系统审核通过
|
||||
|
||||
执行过程:`机加工MES_加工完成整修审核_审核数据`
|
||||
|
||||
审核结果:
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| result | 1 |
|
||||
| 审核状态 | 审核通过 |
|
||||
| 审核表开始时间 | 2026-07-06 08:30:00 |
|
||||
| 审核表结束时间 | 2026-07-06 08:40:00 |
|
||||
| 工序完成数量 | 1 |
|
||||
| 工序状态 | 4 |
|
||||
| 工艺计划完成数量 | 1 |
|
||||
| 工艺计划考核状态 | 3 |
|
||||
|
||||
结论:审核通过后已继续调用原 MES 完工链路,工序完成和工艺计划完成数据已推进。
|
||||
|
||||
### 3. PDA 自制件质检查询
|
||||
|
||||
在审核通过后的事务内,模拟 PDA 页面查询:
|
||||
|
||||
| 查询过程 | 验证结果 |
|
||||
| --- | --- |
|
||||
| `质检管理_订单查询_查询数据` | 可查到订单 `19278 / BHGZ202606250004` |
|
||||
| `质检管理_工序任务_查询数据` | 可查到 `改制-王建荣`,任务流水号 `38671` |
|
||||
| `质检管理_工序信息_查询数据` | 可查到零件、工序、设备和数量 |
|
||||
| `质检管理_分配任务_查询数据` | 可查到该工序分配记录 |
|
||||
|
||||
结论:审核通过后,PDA 自制件质检页面的数据查询链路可用。
|
||||
|
||||
### 4. PDA 自制件质检提交
|
||||
|
||||
执行过程:`车间生产管理_质检管理_不合格处理`
|
||||
|
||||
关键参数:
|
||||
|
||||
| 参数 | 值 |
|
||||
| --- | --- |
|
||||
| 零部件流水号 | 38671 |
|
||||
| 质检类型代码 | 3 |
|
||||
| 数量 | 1 |
|
||||
| 是否合格 | 1 |
|
||||
| 人员编号 | 5 |
|
||||
| 不合格数量 | 0 |
|
||||
| 订单流水号 | 19278 |
|
||||
| 订单号 | BHGZ202606250004 |
|
||||
| 质检数量 | 1 |
|
||||
|
||||
结果:
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| 质检流水号 | 15915 |
|
||||
| 质检主表记录数 | 1 |
|
||||
| 待入库单数 | 1 |
|
||||
|
||||
结论:PDA 自制件质检提交成功,并生成自制待入库单。
|
||||
|
||||
### 5. 自制件入库查询
|
||||
|
||||
执行过程:`仓储管理_自制件入库_查询`
|
||||
|
||||
查询条件:
|
||||
|
||||
| 参数 | 值 |
|
||||
| --- | --- |
|
||||
| 订单号_check | 1 |
|
||||
| 订单号 | 19278 |
|
||||
| 零件图号_check | 1 |
|
||||
| 零件图号 | XT40-2-BT40-BC-G |
|
||||
|
||||
结果:
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| 工艺计划流水号 | 6584 |
|
||||
| 物料流水号 | 496 |
|
||||
| 零件名称 | 打刀缸 |
|
||||
| 零件图号 | XT40-2-BT40-BC-G |
|
||||
| 完成数量 | 1 |
|
||||
| 入库数量 | 0 |
|
||||
| 本次入库 | 1 |
|
||||
| 类型 | 自制件 |
|
||||
|
||||
结论:质检后,自制件入库确认列表可以查询到该待入库记录。
|
||||
|
||||
### 6. 自制件入库确认
|
||||
|
||||
执行过程:`仓储管理_自制件入库_循环执行`
|
||||
|
||||
关键参数:
|
||||
|
||||
| 参数 | 值 |
|
||||
| --- | --- |
|
||||
| 物料流水号组 | 496 |
|
||||
| 实际到货数量组 | 1 |
|
||||
| 工艺计划流水号组 | 6584 |
|
||||
| 入库人员流水号 | 5 |
|
||||
| 货位流水号组 | 1 |
|
||||
| 类型组 | 自制件 |
|
||||
| 批号组 | 0 |
|
||||
|
||||
事务内结果:
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| 工艺计划入库数量 | 1 |
|
||||
| 工艺计划考核状态 | 4 |
|
||||
| 自制件入库记录数 | 1 |
|
||||
| 货位存量 | 1 |
|
||||
|
||||
结论:自制件入库确认成功,库存与工艺计划入库状态能够更新。
|
||||
|
||||
### 7. 回滚验证
|
||||
|
||||
执行 `ROLLBACK TRAN` 后复查:
|
||||
|
||||
| 字段 | 回滚后结果 |
|
||||
| --- | --- |
|
||||
| 工序完成数量 | NULL |
|
||||
| 工序状态 | NULL |
|
||||
| 工艺计划完成数量 | 0 |
|
||||
| 工艺计划入库数量 | 0 |
|
||||
| 工艺计划考核状态 | 2 |
|
||||
| 审核记录是否存在 | 0 |
|
||||
| 质检记录是否存在 | 0 |
|
||||
|
||||
结论:测试数据已全部回滚,未污染正式数据。
|
||||
|
||||
## 六、风险和注意事项
|
||||
|
||||
1. 本次为数据库事务内模拟测试,验证的是后端过程和页面查询入口对应的业务链路,不等同于人工在浏览器逐按钮点击的 UI 测试。
|
||||
2. 自制件最终入库确认入口在 JY 主系统仓储模块 `PurchasePartsStorage`,PDA 项目当前未发现自制件最终入库确认页面。
|
||||
3. PDA 项目的 `inbound.vue` 主要覆盖采购件、离线件、车间采购件等入库,不是本次自制件完工质检后的最终入库确认入口。
|
||||
4. 若后续要求“全程都在 PDA 完成入库确认”,需要新增或调整 PDA 自制件入库确认页面,并对接 `仓储管理_自制件入库_查询` 和 `仓储管理_自制件入库_循环执行`。
|
||||
|
||||
## 七、最终结论
|
||||
|
||||
从 MES 工作站提交生产完成审批,到 JY 主系统审核通过,再到 PDA 自制件质检,最后到 JY 主系统自制件入库确认,数据库业务链路验证通过。
|
||||
|
||||
本次测试未发现阻断性问题。
|
||||
|
||||
修改人:Ld 修改时间:2026-07-06 09:14:24;
|
||||
423
docs/工序工价与生产任务审核/工序工价与生产任务审核开发说明.md
Normal file
@@ -0,0 +1,423 @@
|
||||
# 工序工价与生产任务审核开发说明
|
||||
|
||||
## 一、需求来源
|
||||
|
||||
本文档根据桌面需求文件 `工序工价需求文档.docx`、`生产任务审核.docx` 整理,用于指导 JY1.0 前端、接口和数据库开发。
|
||||
|
||||
## 二、需求范围
|
||||
|
||||
本次需求分为两组功能:
|
||||
|
||||
1. 工序工价与工时金额:新增工序定价录入、工时统计金额显示、整修记录补助金额。
|
||||
2. 生产任务审核:车间工况机完成数量提报或异常报备后,先生成计划员审核单,审核通过后进入原系统后续流程。
|
||||
|
||||
## 三、现状入口
|
||||
|
||||
| 功能点 | 现有入口 | 现有接口/过程 |
|
||||
| --- | --- | --- |
|
||||
| 工时统计 | `src/views/SeikoWorkshop/WorkingHoursStatistics/index.vue` | `车间生产管理_工人工时统计_查询数据`、`精工车间_员工工时统计_详情_查询数据`、`车间生产管理_设备工时统计_查询数据`、`精工车间_设备工时统计_详情_查询数据` |
|
||||
| 工艺/工序基础维护 | `src/views/BasicData/WorkshopProcessMaintenance/index.vue` | `工艺名称_查询`、`车间生产管理工艺_基础表_工艺名称_增加数据`、`车间生产管理工艺_基础表_工艺名称_修改名称及简称` |
|
||||
| 生产任务查询 | `src/views/SeikoWorkshop/ProductionTaskQuery/index.vue` | `精工车间_生成任务_查询数据`、`车间生产管理工艺_追溯加工_查询工序` |
|
||||
| 整修记录 | `src/views/DeviceManagement/RepairRecord/index.vue` | `设备管理_整修记录_查询` |
|
||||
|
||||
## 四、工序工价功能设计
|
||||
|
||||
### 4.1 新增独立工序工价维护页面
|
||||
|
||||
需求中提到现场希望把 9 个工价字段放入已有车间查看工艺组件。考虑现有查看工艺组件偏生产现场查看,字段较多且属于工价管理,建议新增独立页面。
|
||||
|
||||
建议新增页面:
|
||||
|
||||
```text
|
||||
src/views/SeikoWorkshop/ProcessPrice/index.vue
|
||||
```
|
||||
|
||||
建议新增接口文件:
|
||||
|
||||
```text
|
||||
src/api/ManufacturingCenter/ProcessPrice.js
|
||||
```
|
||||
|
||||
页面结构:
|
||||
|
||||
1. 搜索栏:工序名称、工艺名称、零件名称、图号、启用状态。
|
||||
2. 左侧表格:工序列表。
|
||||
3. 右侧表格或弹窗:工序工价字段维护。
|
||||
4. 操作:查询、新增、编辑、删除、查看历史定价。
|
||||
|
||||
建议字段:
|
||||
|
||||
| 字段名 | 类型 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| 工价流水号 | int | 主键 |
|
||||
| 工序流水号 | int | 关联 `车间生产管理工艺_零件工序` |
|
||||
| 工艺计划流水号 | int | 关联生产任务工艺计划 |
|
||||
| 工序名称 | nvarchar | 页面显示 |
|
||||
| 计价方式 | nvarchar | 按件、按时、固定金额 |
|
||||
| 单件工价 | decimal | 按件计价 |
|
||||
| 单时工价 | decimal | 按工时计价 |
|
||||
| 准结工价 | decimal | 准结补偿 |
|
||||
| 难度系数 | decimal | 价格修正 |
|
||||
| 质量系数 | decimal | 质量修正 |
|
||||
| 设备系数 | decimal | 设备修正 |
|
||||
| 生效日期 | datetime | 价格生效时间 |
|
||||
| 失效日期 | datetime | 价格失效时间 |
|
||||
| 是否启用 | int | 1 启用,0 停用 |
|
||||
| 备注 | nvarchar | 说明 |
|
||||
| 创建人 | nvarchar | 操作者 |
|
||||
| 创建时间 | datetime | 写入时间 |
|
||||
| 修改人 | nvarchar | 最后修改人 |
|
||||
| 修改时间 | datetime | 最后修改时间 |
|
||||
|
||||
> 需求原文提到“9 个字段数据”,实际字段名称需要现场确认。上表先按定价业务补全为可落库方案,开发前应与业务确认 9 个必填字段。
|
||||
|
||||
### 4.2 工序历史定价
|
||||
|
||||
新增历史查询能力,用于查看工序价格变更轨迹。
|
||||
|
||||
建议数据表:
|
||||
|
||||
```text
|
||||
车间生产管理工艺_工序工价历史记录
|
||||
```
|
||||
|
||||
记录内容:
|
||||
|
||||
| 字段名 | 说明 |
|
||||
| --- | --- |
|
||||
| 历史流水号 | 主键 |
|
||||
| 工价流水号 | 对应当前工价记录 |
|
||||
| 工序流水号 | 对应工序 |
|
||||
| 修改前数据 | 可按字段拆列或保存摘要 |
|
||||
| 修改后数据 | 可按字段拆列或保存摘要 |
|
||||
| 操作类型 | 新增、编辑、停用 |
|
||||
| 操作者 | 当前用户 |
|
||||
| 操作时间 | 当前时间 |
|
||||
|
||||
### 4.3 接口设计
|
||||
|
||||
新增过程建议:
|
||||
|
||||
| 接口名称 | type | 用途 |
|
||||
| --- | --- | --- |
|
||||
| `车间生产管理工艺_工序工价_查询数据` | `11` | 查询工序工价列表 |
|
||||
| `车间生产管理工艺_工序工价_增加数据` | `12` | 新增工序工价 |
|
||||
| `车间生产管理工艺_工序工价_编辑数据` | `12` | 编辑工序工价 |
|
||||
| `车间生产管理工艺_工序工价_删除数据` | `12` | 停用或删除工价 |
|
||||
| `车间生产管理工艺_工序工价_历史_查询数据` | `11` | 查询历史定价 |
|
||||
|
||||
前端请求继续使用项目统一方式:
|
||||
|
||||
```js
|
||||
var Data = this.CreateData('11', '车间生产管理工艺_工序工价_查询数据', param, this.pageSize, this.pageCurrent)
|
||||
this.ExecDatabase(Data).then(response => {
|
||||
this.tableData = response.data.rows
|
||||
this.total = response.data.total
|
||||
})
|
||||
```
|
||||
|
||||
## 五、工时统计金额功能设计
|
||||
|
||||
### 5.1 页面改造
|
||||
|
||||
修改页面:
|
||||
|
||||
```text
|
||||
src/views/SeikoWorkshop/WorkingHoursStatistics/index.vue
|
||||
```
|
||||
|
||||
员工工时统计左侧汇总表增加:
|
||||
|
||||
| 新增列 | 说明 |
|
||||
| --- | --- |
|
||||
| 工价 | 按所选人员统计周期内匹配工序工价后的平均或汇总工价 |
|
||||
| 总金额 | 汇总加工金额 |
|
||||
|
||||
员工工时明细表增加:
|
||||
|
||||
| 新增列 | 说明 |
|
||||
| --- | --- |
|
||||
| 工价 | 当前工序匹配的有效工价 |
|
||||
| 金额 | 按 `完成数`、`加工时长` 和计价方式计算 |
|
||||
|
||||
设备工时统计如业务需要同步增加金额列,字段逻辑与员工工时一致,但汇总维度为设备。
|
||||
|
||||
### 5.2 汇总规则
|
||||
|
||||
建议后端统一计算金额,前端只展示和汇总,避免不同页面计算规则不一致。
|
||||
|
||||
计价规则:
|
||||
|
||||
| 计价方式 | 金额计算 |
|
||||
| --- | --- |
|
||||
| 按件 | `完成数 * 单件工价 * 难度系数 * 质量系数 * 设备系数` |
|
||||
| 按时 | `加工时长 / 60 * 单时工价 * 难度系数 * 质量系数 * 设备系数` |
|
||||
| 固定金额 | `固定工价` |
|
||||
|
||||
表格最后一栏金额汇总可使用 Element UI `show-summary`,也可由后端返回汇总行。为保证分页情况下金额准确,建议后端返回总金额字段,前端展示分页明细和总计。
|
||||
|
||||
### 5.3 工时修正
|
||||
|
||||
需求中提到“工时记录与现实不同时可以修改”。建议新增明细行编辑入口,仅允许有权限人员调整。
|
||||
|
||||
新增字段:
|
||||
|
||||
| 字段名 | 说明 |
|
||||
| --- | --- |
|
||||
| 原加工时长 | 系统扫码产生的原始工时 |
|
||||
| 调整后工时 | 审核后用于结算的工时 |
|
||||
| 工时调整原因 | 必填 |
|
||||
| 工时调整人 | 当前用户 |
|
||||
| 工时调整时间 | 当前时间 |
|
||||
|
||||
新增接口:
|
||||
|
||||
| 接口名称 | type | 用途 |
|
||||
| --- | --- | --- |
|
||||
| `车间生产管理工艺_工时统计_工时修正_编辑数据` | `12` | 修改工时并记录原因 |
|
||||
| `车间生产管理工艺_工时统计_工时修正记录_查询数据` | `11` | 查看修正历史 |
|
||||
|
||||
## 六、整修记录补助金额功能设计
|
||||
|
||||
### 6.1 页面改造
|
||||
|
||||
修改页面:
|
||||
|
||||
```text
|
||||
src/views/DeviceManagement/RepairRecord/index.vue
|
||||
```
|
||||
|
||||
搜索栏新增:
|
||||
|
||||
| 控件 | 字段 |
|
||||
| --- | --- |
|
||||
| `el-input` 或 `el-select` | 报备人 |
|
||||
|
||||
表格新增:
|
||||
|
||||
| 新增列 | 说明 |
|
||||
| --- | --- |
|
||||
| 单时补助 | 可编辑,记录每小时补助金额 |
|
||||
| 总金额 | 自动计算,`工时 * 单时补助` |
|
||||
|
||||
页面新增汇总:
|
||||
|
||||
1. 当前查询条件下的整修工时合计。
|
||||
2. 当前查询条件下的补助金额合计。
|
||||
|
||||
### 6.2 编辑规则
|
||||
|
||||
1. `单时补助` 必须大于等于 0。
|
||||
2. `总金额` 不允许手工编辑,由后端或前端按工时自动计算。
|
||||
3. 修改单时补助后写入操作日志。
|
||||
4. 导出 Excel 时同步输出 `单时补助` 和 `总金额`。
|
||||
|
||||
### 6.3 接口设计
|
||||
|
||||
调整现有查询过程:
|
||||
|
||||
```text
|
||||
设备管理_整修记录_查询
|
||||
```
|
||||
|
||||
新增入参:
|
||||
|
||||
```text
|
||||
报备人
|
||||
```
|
||||
|
||||
新增返回字段:
|
||||
|
||||
```text
|
||||
单时补助
|
||||
总金额
|
||||
```
|
||||
|
||||
新增编辑过程:
|
||||
|
||||
| 接口名称 | type | 用途 |
|
||||
| --- | --- | --- |
|
||||
| `设备管理_整修记录_单时补助_编辑数据` | `12` | 更新单时补助 |
|
||||
| `设备管理_整修记录_补助修改记录_查询数据` | `11` | 查询补助修改历史 |
|
||||
|
||||
## 七、生产任务审核功能设计
|
||||
|
||||
### 7.1 业务流程
|
||||
|
||||
车间工况机端提报加工完成或异常报备时,先生成审核单。计划员审核通过后,再进入原有后续流程。
|
||||
|
||||
经现场讨论,取消“不通过打回”功能。如数据不准确,由审核员在审核页面直接修改完成数量、完成时间、异常信息等数据后审核通过。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["工况机提报完成数量或异常报备"] --> B["生成生产任务审核单"]
|
||||
B --> C["计划员进入审核页面"]
|
||||
C --> D{"数据是否准确"}
|
||||
D -- "准确" --> E["审核通过"]
|
||||
D -- "不准确" --> F["审核员修改完成数量/完成时间/异常信息"]
|
||||
F --> E
|
||||
E --> G["写入原生产任务后续流程"]
|
||||
G --> H["刷新生产任务/工时/追溯数据"]
|
||||
```
|
||||
|
||||
### 7.2 新增审核页面
|
||||
|
||||
建议新增页面:
|
||||
|
||||
```text
|
||||
src/views/SeikoWorkshop/ProductionTaskAudit/index.vue
|
||||
```
|
||||
|
||||
页面结构:
|
||||
|
||||
1. 搜索栏:提交时间、订单号、零件名称、图号、操作者、审核状态。
|
||||
2. 表格:待审核/已审核任务。
|
||||
3. 操作:查看、编辑、审核通过。
|
||||
|
||||
表格字段:
|
||||
|
||||
| 字段名 | 说明 |
|
||||
| --- | --- |
|
||||
| 审核流水号 | 主键 |
|
||||
| 来源类型 | 完工提报、异常报备 |
|
||||
| 工艺计划流水号 | 关联生产任务 |
|
||||
| 工序流水号 | 关联工序 |
|
||||
| 订单号 | 显示 |
|
||||
| 零件名称 | 显示 |
|
||||
| 图号 | 显示 |
|
||||
| 工序 | 显示 |
|
||||
| 提报完成数量 | 工况机提报数量 |
|
||||
| 审核完成数量 | 审核员可修改 |
|
||||
| 提报完成时间 | 工况机提报时间 |
|
||||
| 审核完成时间 | 审核员可修改 |
|
||||
| 异常类型 | 异常报备使用 |
|
||||
| 异常说明 | 异常报备使用 |
|
||||
| 提报人 | 工况机操作者 |
|
||||
| 提报时间 | 创建审核单时间 |
|
||||
| 审核状态 | 待审核、已审核 |
|
||||
| 审核人 | 当前用户 |
|
||||
| 审核时间 | 审核通过时间 |
|
||||
| 审核备注 | 说明 |
|
||||
|
||||
### 7.3 数据表设计
|
||||
|
||||
建议新增:
|
||||
|
||||
```text
|
||||
车间生产管理_生产任务审核单
|
||||
```
|
||||
|
||||
关键字段:
|
||||
|
||||
| 字段名 | 类型 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| 审核流水号 | int identity | 主键 |
|
||||
| 来源类型 | nvarchar(20) | 完工提报/异常报备 |
|
||||
| 业务流水号 | int | 原工况机记录或异常记录 |
|
||||
| 工艺计划流水号 | int | 生产任务 |
|
||||
| 工序流水号 | int | 工序 |
|
||||
| 提报完成数量 | decimal(18, 4) | 原始数量 |
|
||||
| 审核完成数量 | decimal(18, 4) | 审核后数量 |
|
||||
| 提报完成时间 | datetime | 原始时间 |
|
||||
| 审核完成时间 | datetime | 审核后时间 |
|
||||
| 异常类型 | nvarchar(100) | 异常报备 |
|
||||
| 异常说明 | nvarchar(500) | 异常报备 |
|
||||
| 提报人 | nvarchar(50) | 工况机人员 |
|
||||
| 提报时间 | datetime | 创建时间 |
|
||||
| 审核状态 | int | 0 待审核,1 已审核 |
|
||||
| 审核人 | nvarchar(50) | 计划员 |
|
||||
| 审核时间 | datetime | 审核时间 |
|
||||
| 审核备注 | nvarchar(500) | 备注 |
|
||||
| 是否删除 | int | 软删除 |
|
||||
|
||||
### 7.4 接口设计
|
||||
|
||||
新增过程:
|
||||
|
||||
| 接口名称 | type | 用途 |
|
||||
| --- | --- | --- |
|
||||
| `精工车间_生产任务审核_查询数据` | `11` | 审核单分页查询 |
|
||||
| `精工车间_生产任务审核_编辑数据` | `12` | 审核前修改提报数据 |
|
||||
| `精工车间_生产任务审核_通过` | `12` | 审核通过并推进原流程 |
|
||||
| `精工车间_生产任务审核_详情_查询数据` | `11` | 查看单据详情 |
|
||||
|
||||
审核通过过程必须使用事务:
|
||||
|
||||
```text
|
||||
BEGIN TRAN
|
||||
锁定审核单
|
||||
校验审核状态 = 待审核
|
||||
更新审核单审核数量、审核时间、审核人
|
||||
按来源类型调用或复刻原完工/异常报备后续逻辑
|
||||
更新生产任务、工序、工时、异常记录
|
||||
COMMIT TRAN
|
||||
```
|
||||
|
||||
失败时:
|
||||
|
||||
```text
|
||||
ROLLBACK TRAN
|
||||
返回 result = 0 和 msg
|
||||
```
|
||||
|
||||
## 八、权限与菜单
|
||||
|
||||
建议新增菜单:
|
||||
|
||||
| 菜单名称 | 路由 |
|
||||
| --- | --- |
|
||||
| 工序工价维护 | `/SeikoWorkshop/ProcessPrice` |
|
||||
| 生产任务审核 | `/SeikoWorkshop/ProductionTaskAudit` |
|
||||
|
||||
建议权限:
|
||||
|
||||
1. 工序工价维护:仅工艺、财务、车间管理人员可编辑。
|
||||
2. 工时修正:仅车间主管或授权计划员可编辑。
|
||||
3. 生产任务审核:计划员可审核,车间操作员不可审核自己的提报。
|
||||
4. 整修补助编辑:设备管理或车间主管可编辑。
|
||||
|
||||
## 九、开发步骤
|
||||
|
||||
1. 与现场确认工序工价 9 个字段的准确名称、类型和必填规则。
|
||||
2. 创建工序工价主表、历史表、生产任务审核单表。
|
||||
3. 新增工序工价查询、新增、编辑、删除、历史查询存储过程。
|
||||
4. 改造工时统计查询过程,返回工价、金额、总金额。
|
||||
5. 改造整修记录查询过程,支持报备人筛选,返回单时补助和总金额。
|
||||
6. 新增整修记录单时补助编辑过程。
|
||||
7. 改造工况机完成提报、异常报备后端逻辑,改为先生成审核单。
|
||||
8. 新增生产任务审核查询、编辑、通过过程。
|
||||
9. 新增 `ProcessPrice` 页面。
|
||||
10. 新增 `ProductionTaskAudit` 页面。
|
||||
11. 修改 `WorkingHoursStatistics` 页面,增加工价、金额展示和汇总。
|
||||
12. 修改 `RepairRecord` 页面,增加报备人筛选、补助编辑、金额汇总。
|
||||
13. 配置菜单和角色权限。
|
||||
14. 联调工况机提报、审核通过、生产任务流转、工时统计、整修补助导出。
|
||||
|
||||
## 十、验收清单
|
||||
|
||||
| 验收项 | 预期结果 |
|
||||
| --- | --- |
|
||||
| 工序工价新增 | 保存成功,列表可查询 |
|
||||
| 工序工价编辑 | 修改后历史记录可追溯 |
|
||||
| 历史定价查询 | 能查看同一工序多次价格变更 |
|
||||
| 工时统计金额 | 明细金额和汇总金额正确 |
|
||||
| 工时修正 | 调整后工时参与金额计算,并保留原始工时 |
|
||||
| 整修记录按报备人查询 | 能按报备人过滤数据 |
|
||||
| 整修补助编辑 | 单时补助保存成功,总金额自动变化 |
|
||||
| 整修记录导出 | 导出包含单时补助和总金额 |
|
||||
| 完工提报审核单 | 工况机提交后生成待审核单 |
|
||||
| 异常报备审核单 | 异常报备后生成待审核单 |
|
||||
| 审核数据修改 | 审核员可修改完成数量、完成时间 |
|
||||
| 审核通过 | 通过后进入原生产任务后续流程 |
|
||||
| 重复审核控制 | 已审核单据不能再次审核 |
|
||||
| 权限控制 | 未授权用户不能编辑工价、补助或审核 |
|
||||
|
||||
## 十一、风险与待确认项
|
||||
|
||||
1. 工序工价“9 个字段”的具体字段名未在需求文档中列明,需要业务补充。
|
||||
2. 工时金额计算需要确认按件、按时还是混合计价,以及是否区分准结工时。
|
||||
3. 工况机端完工和异常报备的现有后续逻辑需要在数据库中定位后再改造,避免绕过原有工时、质检、追溯更新。
|
||||
4. 审核员修改完成数量后,是否需要同步影响质检数、不良数、入库可用数,需要业务确认。
|
||||
5. 已有历史工时是否需要补算金额,需要确认补算范围。
|
||||
|
||||
修改人:Ld 修改时间:2026-07-02 13:01:57;
|
||||
248
docs/工序工价与生产任务审核/工序工价开发说明.md
Normal file
@@ -0,0 +1,248 @@
|
||||
# 工序工价开发说明
|
||||
|
||||
## 一、需求来源
|
||||
|
||||
本文档根据桌面需求文件 `工序工价需求文档.docx` 整理,用于指导 JY1.0 工序工价、工时金额和整修补助相关开发。
|
||||
|
||||
## 二、需求范围
|
||||
|
||||
本需求包含三个目标:
|
||||
|
||||
1. 给工序增加 9 个工价相关字段,并支持录入、维护和历史定价查看。
|
||||
2. 工时统计组件增加工价、金额字段,并在汇总栏展示金额合计。
|
||||
3. 整修记录模块增加按报备人查询,并增加单时补助、总金额和汇总。
|
||||
|
||||
## 三、现有入口
|
||||
|
||||
| 功能点 | 现有入口 | 现有接口/过程 |
|
||||
| --- | --- | --- |
|
||||
| 工时统计 | `src/views/SeikoWorkshop/WorkingHoursStatistics/index.vue` | `车间生产管理_工人工时统计_查询数据`、`精工车间_员工工时统计_详情_查询数据`、`车间生产管理_设备工时统计_查询数据`、`精工车间_设备工时统计_详情_查询数据` |
|
||||
| 工艺/工序基础维护 | `src/views/BasicData/WorkshopProcessMaintenance/index.vue` | `工艺名称_查询`、`车间生产管理工艺_基础表_工艺名称_增加数据`、`车间生产管理工艺_基础表_工艺名称_修改名称及简称` |
|
||||
| 整修记录 | `src/views/DeviceManagement/RepairRecord/index.vue` | `设备管理_整修记录_查询` |
|
||||
|
||||
## 四、工序工价维护设计
|
||||
|
||||
### 4.1 页面方案
|
||||
|
||||
需求原文提到现场希望把 9 个字段加入已有车间查看工艺组件。考虑现有查看工艺组件偏现场查看,字段多且属于价格管理,建议新增独立页面。
|
||||
|
||||
建议新增页面:
|
||||
|
||||
```text
|
||||
src/views/SeikoWorkshop/ProcessPrice/index.vue
|
||||
```
|
||||
|
||||
建议新增接口文件:
|
||||
|
||||
```text
|
||||
src/api/ManufacturingCenter/ProcessPrice.js
|
||||
```
|
||||
|
||||
页面结构:
|
||||
|
||||
1. 搜索栏:工艺名称、工序名称、零件名称、图号、启用状态。
|
||||
2. 数据表格:展示工序工价记录。
|
||||
3. 操作列:新增、编辑、停用、历史定价。
|
||||
4. 弹窗:维护 9 个工价字段和备注。
|
||||
|
||||
### 4.2 字段设计
|
||||
|
||||
需求文档未列出 9 个字段的准确名称,开发前需现场补充确认。建议先按以下字段作为设计草案:
|
||||
|
||||
| 字段名 | 类型 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| 工价流水号 | int | 主键 |
|
||||
| 工序流水号 | int | 关联工序 |
|
||||
| 工艺计划流水号 | int | 可选,关联生产任务工艺计划 |
|
||||
| 工序名称 | nvarchar | 页面显示 |
|
||||
| 计价方式 | nvarchar | 按件、按时、固定金额 |
|
||||
| 单件工价 | decimal | 按件计价 |
|
||||
| 单时工价 | decimal | 按工时计价 |
|
||||
| 准结工价 | decimal | 准结补偿 |
|
||||
| 难度系数 | decimal | 价格修正 |
|
||||
| 质量系数 | decimal | 质量修正 |
|
||||
| 设备系数 | decimal | 设备修正 |
|
||||
| 生效日期 | datetime | 价格生效时间 |
|
||||
| 失效日期 | datetime | 价格失效时间 |
|
||||
| 是否启用 | int | 1 启用,0 停用 |
|
||||
| 备注 | nvarchar | 说明 |
|
||||
| 创建人 | nvarchar | 当前用户 |
|
||||
| 创建时间 | datetime | 写入时间 |
|
||||
| 修改人 | nvarchar | 最后修改人 |
|
||||
| 修改时间 | datetime | 最后修改时间 |
|
||||
|
||||
### 4.3 历史定价
|
||||
|
||||
新增历史记录表:
|
||||
|
||||
```text
|
||||
车间生产管理工艺_工序工价历史记录
|
||||
```
|
||||
|
||||
历史表记录工价新增、编辑、停用前后的关键数据,支持按工序查看历次定价变化。
|
||||
|
||||
## 五、接口设计
|
||||
|
||||
新增过程:
|
||||
|
||||
| 接口名称 | type | 用途 |
|
||||
| --- | --- | --- |
|
||||
| `车间生产管理工艺_工序工价_查询数据` | `11` | 分页查询工序工价 |
|
||||
| `车间生产管理工艺_工序工价_增加数据` | `12` | 新增工价 |
|
||||
| `车间生产管理工艺_工序工价_编辑数据` | `12` | 编辑工价 |
|
||||
| `车间生产管理工艺_工序工价_删除数据` | `12` | 停用或删除 |
|
||||
| `车间生产管理工艺_工序工价_历史_查询数据` | `11` | 查询历史定价 |
|
||||
|
||||
前端继续使用项目统一请求方式:
|
||||
|
||||
```js
|
||||
var Data = this.CreateData('11', '车间生产管理工艺_工序工价_查询数据', param, this.pageSize, this.pageCurrent)
|
||||
this.ExecDatabase(Data).then(response => {
|
||||
this.tableData = response.data.rows
|
||||
this.total = response.data.total
|
||||
})
|
||||
```
|
||||
|
||||
## 六、工时统计金额设计
|
||||
|
||||
修改页面:
|
||||
|
||||
```text
|
||||
src/views/SeikoWorkshop/WorkingHoursStatistics/index.vue
|
||||
```
|
||||
|
||||
员工工时统计汇总表新增:
|
||||
|
||||
| 字段 | 说明 |
|
||||
| --- | --- |
|
||||
| 工价 | 当前统计周期匹配的工价信息 |
|
||||
| 总金额 | 查询条件下人员金额合计 |
|
||||
|
||||
员工工时明细表新增:
|
||||
|
||||
| 字段 | 说明 |
|
||||
| --- | --- |
|
||||
| 工价 | 当前工序有效工价 |
|
||||
| 金额 | 按工价规则计算 |
|
||||
|
||||
建议后端返回金额,前端只展示和汇总,避免分页和多页面计算规则不一致。
|
||||
|
||||
金额规则建议:
|
||||
|
||||
| 计价方式 | 金额计算 |
|
||||
| --- | --- |
|
||||
| 按件 | `完成数 * 单件工价 * 难度系数 * 质量系数 * 设备系数` |
|
||||
| 按时 | `加工时长 / 60 * 单时工价 * 难度系数 * 质量系数 * 设备系数` |
|
||||
| 固定金额 | `固定工价` |
|
||||
|
||||
## 七、工时修正设计
|
||||
|
||||
需求补充提到工时记录与实际不符时可修改。建议在员工工时明细行增加“修正工时”入口。
|
||||
|
||||
新增字段:
|
||||
|
||||
| 字段名 | 说明 |
|
||||
| --- | --- |
|
||||
| 原加工时长 | 系统扫码原始工时 |
|
||||
| 调整后工时 | 用于金额结算的工时 |
|
||||
| 工时调整原因 | 必填 |
|
||||
| 工时调整人 | 当前用户 |
|
||||
| 工时调整时间 | 当前时间 |
|
||||
|
||||
新增接口:
|
||||
|
||||
| 接口名称 | type | 用途 |
|
||||
| --- | --- | --- |
|
||||
| `车间生产管理工艺_工时统计_工时修正_编辑数据` | `12` | 修改工时 |
|
||||
| `车间生产管理工艺_工时统计_工时修正记录_查询数据` | `11` | 查询修正历史 |
|
||||
|
||||
## 八、整修记录补助设计
|
||||
|
||||
修改页面:
|
||||
|
||||
```text
|
||||
src/views/DeviceManagement/RepairRecord/index.vue
|
||||
```
|
||||
|
||||
搜索栏新增:
|
||||
|
||||
| 控件 | 字段 |
|
||||
| --- | --- |
|
||||
| `el-input` 或 `el-select` | 报备人 |
|
||||
|
||||
表格新增:
|
||||
|
||||
| 字段 | 说明 |
|
||||
| --- | --- |
|
||||
| 单时补助 | 可编辑,记录每小时补助金额 |
|
||||
| 总金额 | 自动计算,`工时 * 单时补助` |
|
||||
|
||||
规则:
|
||||
|
||||
1. 单时补助必须大于等于 0。
|
||||
2. 总金额不允许手工编辑。
|
||||
3. 修改单时补助时写入修改记录。
|
||||
4. 导出 Excel 同步包含单时补助和总金额。
|
||||
|
||||
调整现有查询过程:
|
||||
|
||||
```text
|
||||
设备管理_整修记录_查询
|
||||
```
|
||||
|
||||
新增入参:
|
||||
|
||||
```text
|
||||
报备人
|
||||
```
|
||||
|
||||
新增返回字段:
|
||||
|
||||
```text
|
||||
单时补助
|
||||
总金额
|
||||
```
|
||||
|
||||
新增接口:
|
||||
|
||||
| 接口名称 | type | 用途 |
|
||||
| --- | --- | --- |
|
||||
| `设备管理_整修记录_单时补助_编辑数据` | `12` | 更新单时补助 |
|
||||
| `设备管理_整修记录_补助修改记录_查询数据` | `11` | 查询补助修改历史 |
|
||||
|
||||
## 九、开发步骤
|
||||
|
||||
1. 与现场确认工序工价 9 个字段的准确名称、类型、必填规则。
|
||||
2. 创建工序工价主表和历史表。
|
||||
3. 新增工序工价查询、新增、编辑、删除、历史查询过程。
|
||||
4. 新增 `ProcessPrice` 页面并配置菜单。
|
||||
5. 改造工时统计查询过程,返回工价、金额、总金额。
|
||||
6. 修改 `WorkingHoursStatistics` 页面,增加工价、金额展示和汇总。
|
||||
7. 新增工时修正过程和修正记录查询。
|
||||
8. 改造整修记录查询过程,支持报备人筛选,返回单时补助和总金额。
|
||||
9. 修改 `RepairRecord` 页面,增加报备人筛选、补助编辑、金额汇总。
|
||||
10. 联调导出、分页、汇总和权限控制。
|
||||
|
||||
## 十、验收清单
|
||||
|
||||
| 验收项 | 预期结果 |
|
||||
| --- | --- |
|
||||
| 工序工价新增 | 保存成功,列表可查询 |
|
||||
| 工序工价编辑 | 修改后历史记录可追溯 |
|
||||
| 历史定价查询 | 能查看同一工序多次价格变更 |
|
||||
| 工时统计金额 | 明细金额和汇总金额正确 |
|
||||
| 工时修正 | 调整后工时参与金额计算,并保留原始工时 |
|
||||
| 整修记录按报备人查询 | 能按报备人过滤数据 |
|
||||
| 整修补助编辑 | 单时补助保存成功,总金额自动变化 |
|
||||
| 整修记录导出 | 导出包含单时补助和总金额 |
|
||||
| 权限控制 | 未授权用户不能编辑工价、工时和补助 |
|
||||
|
||||
## 十一、风险与待确认项
|
||||
|
||||
1. 工序工价 9 个字段的具体名称未在需求文档中列明。
|
||||
2. 工时金额计算需要确认按件、按时还是混合计价。
|
||||
3. 准结工时是否参与金额计算需要确认。
|
||||
4. 已有历史工时是否需要补算金额需要确认。
|
||||
5. 整修补助是否按所有工时计算,还是按有效整修时间计算,需要确认。
|
||||
|
||||
修改人:Ld 修改时间:2026-07-02 13:05:56;
|
||||
214
docs/工序工价与生产任务审核/生产任务审核开发说明.md
Normal file
@@ -0,0 +1,214 @@
|
||||
# 生产任务审核开发说明
|
||||
|
||||
## 一、需求来源
|
||||
|
||||
本文档根据桌面需求文件 `生产任务审核.docx` 整理,用于指导 JY1.0 生产任务审核功能开发。
|
||||
|
||||
## 二、需求范围
|
||||
|
||||
本需求目标:
|
||||
|
||||
车间工况机端填报完成数量,或进行异常报备时,需要先提交计划员审核。审核通过后,系统才进入原有后续流程。
|
||||
|
||||
现场讨论结果:
|
||||
|
||||
1. 取消“不通过打回”功能。
|
||||
2. 如果提报数据不准确,由审核员直接修改完成数量、完成时间等数据。
|
||||
3. 审核员修正后审核通过,再进入系统后续流程。
|
||||
|
||||
## 三、现有入口
|
||||
|
||||
| 功能点 | 现有入口 | 现有接口/过程 |
|
||||
| --- | --- | --- |
|
||||
| 生产任务查询 | `src/views/SeikoWorkshop/ProductionTaskQuery/index.vue` | `精工车间_生成任务_查询数据` |
|
||||
| 零件追溯 | `src/views/SeikoWorkshop/ProductionTaskQuery/index.vue` | `车间生产管理工艺_追溯加工_查询工序` |
|
||||
| 车间派工 | `src/views/SeikoWorkshop/WorkshopAssignment/index.vue` | 派工、取消派工、已派工查询相关过程 |
|
||||
| 工时统计 | `src/views/SeikoWorkshop/WorkingHoursStatistics/index.vue` | 工人工时、设备工时统计过程 |
|
||||
|
||||
## 四、业务流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["工况机提报完成数量或异常报备"] --> B["生成生产任务审核单"]
|
||||
B --> C["计划员进入审核页面"]
|
||||
C --> D{"提报数据是否准确"}
|
||||
D -- "准确" --> E["审核通过"]
|
||||
D -- "不准确" --> F["审核员修改完成数量/完成时间/异常信息"]
|
||||
F --> E
|
||||
E --> G["写入原生产任务后续流程"]
|
||||
G --> H["刷新生产任务、工时、追溯数据"]
|
||||
```
|
||||
|
||||
## 五、新增审核页面
|
||||
|
||||
建议新增页面:
|
||||
|
||||
```text
|
||||
src/views/SeikoWorkshop/ProductionTaskAudit/index.vue
|
||||
```
|
||||
|
||||
页面结构:
|
||||
|
||||
1. 搜索栏:提交时间、订单号、零件名称、图号、操作者、审核状态。
|
||||
2. 数据表格:待审核和已审核任务。
|
||||
3. 操作列:查看、编辑、审核通过。
|
||||
4. 编辑弹窗:允许审核员修正完成数量、完成时间、异常信息和审核备注。
|
||||
|
||||
## 六、页面字段
|
||||
|
||||
| 字段名 | 说明 |
|
||||
| --- | --- |
|
||||
| 审核流水号 | 主键 |
|
||||
| 来源类型 | 完工提报、异常报备 |
|
||||
| 工艺计划流水号 | 关联生产任务 |
|
||||
| 工序流水号 | 关联工序 |
|
||||
| 订单号 | 页面显示 |
|
||||
| 零件名称 | 页面显示 |
|
||||
| 图号 | 页面显示 |
|
||||
| 工序 | 页面显示 |
|
||||
| 提报完成数量 | 工况机原始提报数量 |
|
||||
| 审核完成数量 | 审核员可修改 |
|
||||
| 提报完成时间 | 工况机原始提报时间 |
|
||||
| 审核完成时间 | 审核员可修改 |
|
||||
| 异常类型 | 异常报备使用 |
|
||||
| 异常说明 | 异常报备使用 |
|
||||
| 提报人 | 工况机操作者 |
|
||||
| 提报时间 | 创建审核单时间 |
|
||||
| 审核状态 | 待审核、已审核 |
|
||||
| 审核人 | 当前审核用户 |
|
||||
| 审核时间 | 审核通过时间 |
|
||||
| 审核备注 | 说明 |
|
||||
|
||||
## 七、数据表设计
|
||||
|
||||
建议新增表:
|
||||
|
||||
```text
|
||||
车间生产管理_生产任务审核单
|
||||
```
|
||||
|
||||
字段设计:
|
||||
|
||||
| 字段名 | 类型 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| 审核流水号 | int identity | 主键 |
|
||||
| 来源类型 | nvarchar(20) | 完工提报/异常报备 |
|
||||
| 业务流水号 | int | 原工况机记录或异常记录 |
|
||||
| 工艺计划流水号 | int | 生产任务 |
|
||||
| 工序流水号 | int | 工序 |
|
||||
| 提报完成数量 | decimal(18, 4) | 原始数量 |
|
||||
| 审核完成数量 | decimal(18, 4) | 审核后数量 |
|
||||
| 提报完成时间 | datetime | 原始时间 |
|
||||
| 审核完成时间 | datetime | 审核后时间 |
|
||||
| 异常类型 | nvarchar(100) | 异常报备 |
|
||||
| 异常说明 | nvarchar(500) | 异常报备 |
|
||||
| 提报人 | nvarchar(50) | 工况机人员 |
|
||||
| 提报时间 | datetime | 创建时间 |
|
||||
| 审核状态 | int | 0 待审核,1 已审核 |
|
||||
| 审核人 | nvarchar(50) | 计划员 |
|
||||
| 审核时间 | datetime | 审核时间 |
|
||||
| 审核备注 | nvarchar(500) | 备注 |
|
||||
| 是否删除 | int | 软删除 |
|
||||
|
||||
## 八、接口设计
|
||||
|
||||
新增过程:
|
||||
|
||||
| 接口名称 | type | 用途 |
|
||||
| --- | --- | --- |
|
||||
| `精工车间_生产任务审核_查询数据` | `11` | 审核单分页查询 |
|
||||
| `精工车间_生产任务审核_编辑数据` | `12` | 审核前修改提报数据 |
|
||||
| `精工车间_生产任务审核_通过` | `12` | 审核通过并推进原流程 |
|
||||
| `精工车间_生产任务审核_详情_查询数据` | `11` | 查看单据详情 |
|
||||
|
||||
前端请求示例:
|
||||
|
||||
```js
|
||||
var Data = this.CreateData('11', '精工车间_生产任务审核_查询数据', param, this.pageSize, this.pageCurrent)
|
||||
this.ExecDatabase(Data).then(response => {
|
||||
this.tableData = response.data.rows
|
||||
this.total = response.data.total
|
||||
})
|
||||
```
|
||||
|
||||
## 九、审核通过事务
|
||||
|
||||
审核通过过程必须使用事务,确保审核单和原生产任务流程一致。
|
||||
|
||||
```text
|
||||
BEGIN TRAN
|
||||
锁定审核单
|
||||
校验审核状态 = 待审核
|
||||
更新审核完成数量、审核完成时间、审核人、审核时间
|
||||
按来源类型执行原完工提报或异常报备后续逻辑
|
||||
更新生产任务、工序、工时、异常记录
|
||||
COMMIT TRAN
|
||||
```
|
||||
|
||||
失败时:
|
||||
|
||||
```text
|
||||
ROLLBACK TRAN
|
||||
返回 result = 0 和 msg
|
||||
```
|
||||
|
||||
## 十、前端交互规则
|
||||
|
||||
1. 待审核状态允许编辑和审核通过。
|
||||
2. 已审核状态只允许查看,不允许再次编辑和审核。
|
||||
3. 审核完成数量必须大于等于 0。
|
||||
4. 审核完成时间不能为空。
|
||||
5. 异常报备类型为异常时,异常类型或异常说明按业务要求校验。
|
||||
6. 审核通过前需要二次确认。
|
||||
7. 审核成功后刷新列表。
|
||||
|
||||
## 十一、权限与菜单
|
||||
|
||||
建议新增菜单:
|
||||
|
||||
| 菜单名称 | 路由 |
|
||||
| --- | --- |
|
||||
| 生产任务审核 | `/SeikoWorkshop/ProductionTaskAudit` |
|
||||
|
||||
建议权限:
|
||||
|
||||
1. 计划员可审核。
|
||||
2. 车间操作员不可审核自己的提报。
|
||||
3. 未授权用户只能查看或不可进入页面。
|
||||
4. 审核通过后如需修改,必须走管理员修正或数据库审计流程。
|
||||
|
||||
## 十二、开发步骤
|
||||
|
||||
1. 定位工况机完成提报和异常报备现有后端逻辑。
|
||||
2. 新增生产任务审核单表。
|
||||
3. 改造工况机提报逻辑,提交后先生成待审核单,不直接进入后续流程。
|
||||
4. 新增审核查询、编辑、通过、详情过程。
|
||||
5. 新增 `ProductionTaskAudit` 页面。
|
||||
6. 配置菜单和角色权限。
|
||||
7. 联调完工提报生成审核单。
|
||||
8. 联调异常报备生成审核单。
|
||||
9. 联调审核员修改完成数量、完成时间。
|
||||
10. 联调审核通过后生产任务、工时、追溯数据更新。
|
||||
|
||||
## 十三、验收清单
|
||||
|
||||
| 验收项 | 预期结果 |
|
||||
| --- | --- |
|
||||
| 完工提报审核单 | 工况机提交后生成待审核单 |
|
||||
| 异常报备审核单 | 异常报备后生成待审核单 |
|
||||
| 审核列表查询 | 可按时间、订单、人员、状态查询 |
|
||||
| 审核数据修改 | 审核员可修改完成数量、完成时间 |
|
||||
| 审核通过 | 通过后进入原生产任务后续流程 |
|
||||
| 重复审核控制 | 已审核单据不能再次审核 |
|
||||
| 状态同步 | 生产任务、工序、工时、追溯数据一致 |
|
||||
| 权限控制 | 未授权用户不能审核 |
|
||||
|
||||
## 十四、风险与待确认项
|
||||
|
||||
1. 工况机端完工和异常报备的现有后续逻辑需要在数据库中定位后再改造。
|
||||
2. 审核员修改完成数量后,是否同步影响质检数、不良数、入库可用数,需要业务确认。
|
||||
3. 异常报备审核通过后是否立即触发停机、维修、质量等后续流程,需要确认。
|
||||
4. 历史已提报数据是否需要补生成审核单,需要确认。
|
||||
5. 审核权限是否按角色、人员或菜单按钮控制,需要确认。
|
||||
|
||||
修改人:Ld 修改时间:2026-07-02 13:05:56;
|
||||
120
docs/工艺接口设计文档.md
Normal file
@@ -0,0 +1,120 @@
|
||||
# 存储过程:工艺数据\_PLM导入 - 运行流程图
|
||||
|
||||
## 流程图示
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始]) --> Validate1{产品流水号<br>是否为空?}
|
||||
Validate1 -->|是| Fail1[导入类型=0<br>返回:产品流水号不能为空]
|
||||
Fail1 --> End1([结束])
|
||||
|
||||
Validate1 -->|否| CheckProduct[查询产品信息表<br>获取产品名称]
|
||||
CheckProduct --> Validate2{产品是否存在?}
|
||||
Validate2 -->|否| Fail2[导入类型=0<br>返回:产品流水号不存在]
|
||||
Fail2 --> End2([结束])
|
||||
|
||||
Validate2 -->|是| SetName[设置产品名称<br>若为空则使用查询到的名称]
|
||||
SetName --> Validate3{必填字段验证:<br>图号/名称/工序号/<br>工艺名称/工艺要求}
|
||||
|
||||
Validate3 -->|任一为空| Fail3[导入类型=3<br>返回:对应字段不能为空]
|
||||
Fail3 --> End3([结束])
|
||||
|
||||
Validate3 -->|全部非空| FindMaterial1{物料编码是否存在<br>且非空?}
|
||||
|
||||
FindMaterial1 -->|是| FindByCode[通过物料编码<br>查询物料主文件]
|
||||
FindByCode --> FindMaterial2{是否找到物料?}
|
||||
|
||||
FindMaterial1 -->|否| FindByDrawing[通过图号+名称<br>查询物料主文件]
|
||||
FindByDrawing --> FindMaterial2
|
||||
|
||||
FindMaterial2 -->|否| Fail4[导入类型=0<br>返回:物料不存在提示]
|
||||
Fail4 --> End4([结束])
|
||||
|
||||
FindMaterial2 -->|是| GetProcessPlan[订单流水号<br>存在且>0?]
|
||||
GetProcessPlan --> CheckExist{获取工艺计划流水号<br>从零件工艺计划视图通过订单号,零件名称,图号查询}
|
||||
|
||||
CheckExist --> CheckDuplicate[检查工艺数据是否已存在<br>查询零件工序表]
|
||||
|
||||
|
||||
CheckDuplicate -->|是-更新| UpdateOrder[更新订单工艺数据<br>SET 工艺计划流水号/<br>工序顺序/工艺编号/工艺要求]
|
||||
UpdateOrder --> CheckUpdate{更新成功?<br>ROWCOUNT>0}
|
||||
|
||||
CheckDuplicate -->|否-新增| InsertOrder[插入订单工艺数据]
|
||||
InsertOrder --> CheckInsert{插入成功?<br>ROWCOUNT>0}
|
||||
|
||||
|
||||
CheckUpdate -->|是| Success2[导入类型=2<br>返回:更新成功]
|
||||
CheckUpdate -->|否| Fail6[导入类型=0<br>返回:工艺数据更新失败]
|
||||
|
||||
CheckInsert -->|是| Success1[导入类型=1<br>返回:新增成功]
|
||||
CheckInsert -->|否| Fail7[导入类型=0<br>返回:工艺数据导入失败]
|
||||
|
||||
Success1 --> End6([结束])
|
||||
Success2 --> End6
|
||||
Fail6 --> End6
|
||||
Fail7 --> End6
|
||||
```
|
||||
|
||||
***
|
||||
|
||||
## 涉及的数据表
|
||||
|
||||
| 表名 | 用途 |
|
||||
| :------------------ | :--------------- |
|
||||
| 产品信息\_基础表 | 验证产品是否存在,获取产品名称 |
|
||||
| 库存管理\_物料主文件\_基本 | 验证物料是否存在,获取物料流水号 |
|
||||
| 车间生产管理\_零件工艺计划\_视图 | 获取工艺计划流水号 |
|
||||
| 车间生产管理工艺\_基础表\_工艺名称 | 获取工艺编号 |
|
||||
| 车间生产管理工艺\_零件工序 | 工艺数据的主存储表(增删改查) |
|
||||
|
||||
***
|
||||
|
||||
## 流程说明
|
||||
|
||||
### 3.1 产品验证阶段
|
||||
|
||||
1. **产品流水号校验**:检查产品流水号是否为空
|
||||
2. **产品存在性验证**:从产品信息表查询产品是否存在
|
||||
3. **产品名称设置**:若传入的产品名称为空,则使用查询到的名称
|
||||
|
||||
### 3.2 必填字段验证阶段
|
||||
|
||||
验证以下必填字段是否非空:
|
||||
|
||||
- 图号
|
||||
- 名称
|
||||
- 工序号
|
||||
- 工艺名称
|
||||
- 工艺要求
|
||||
|
||||
### 3.3 物料查找阶段
|
||||
|
||||
支持两种查找方式:
|
||||
|
||||
1. **优先通过物料编码查找**:若物料编码存在且非空,通过物料编码查询
|
||||
2. **图号+名称查找**:若物料编码为空,通过图号和名称组合查询
|
||||
|
||||
|
||||
### 3.4 数据处理阶段
|
||||
|
||||
根据订单流水号判断处理逻辑:
|
||||
|
||||
| 条件 | 处理方式 |
|
||||
| :-------- | :-------------------------- |
|
||||
| 订单流水号 > 0 | 查询零件工序表检查是否已存在,存在则更新,不存在则新增 |
|
||||
| 订单流水号 ≤ 0 | 直接插入产品工艺数据 |
|
||||
|
||||
### 3.5 工艺信息获取阶段
|
||||
|
||||
1. **获取工艺计划流水号**:从零件工艺计划视图通过订单号获取
|
||||
|
||||
### 3.6 返回结果码说明
|
||||
|
||||
| 返回码 | 说明 |
|
||||
| :-- | :-------------------------------- |
|
||||
| 0 | 失败(产品流水号不存在、物料不存在、工艺名称错误、更新/插入失败) |
|
||||
| 1 | 新增成功 |
|
||||
| 2 | 更新成功 |
|
||||
| 3 | 数据不完整(必填字段为空) |
|
||||
| 4 | 工艺名称错误(工艺编号不存在) |
|
||||
|
||||
108
docs/库存调拨/01-项目功能内容.md
Normal file
@@ -0,0 +1,108 @@
|
||||
# 01-项目功能内容
|
||||
|
||||
## 功能名称
|
||||
|
||||
库存盘点组件库存调拨功能。
|
||||
|
||||
## 应用场景
|
||||
|
||||
本功能用于仓储管理中的库存盘点页面。现场盘点时,用户发现某个物料的库存需要从当前库位转移到另一个库位,或者目标库位尚未在系统中维护,需要在调拨时一键新建库位,并把调拨数量从原库位库存中扣减、增加到目标库位库存中。
|
||||
|
||||
应用页面:
|
||||
|
||||
```text
|
||||
src/views/WarehouseManagement/InventoryCheck/index.vue
|
||||
```
|
||||
|
||||
## 功能目标
|
||||
|
||||
1. 在库存盘点列表行内增加“调拨”操作。
|
||||
2. 点击“调拨”打开库存调拨弹窗。
|
||||
3. 弹窗自动带出物料名称、图号/型号、原库位、原库存数。
|
||||
4. 支持选择已有目标库位。
|
||||
5. 支持输入新库位名称并一键新建库位。
|
||||
6. 新库位创建成功后自动刷新库位下拉并回填目标库位。
|
||||
7. 用户输入调拨数量后,提交时从原库位库存数扣减该数量。
|
||||
8. 如果目标库位已有同物料库存,则目标库位库存累加调拨数量。
|
||||
9. 如果目标库位没有同物料库存,则新增目标库位的物料库存记录。
|
||||
10. 调拨成功后刷新库存盘点列表。
|
||||
11. 后端记录调拨流水,便于追溯操作人、原库位、目标库位、调拨前后库存。
|
||||
|
||||
## 功能边界
|
||||
|
||||
本次实现的是库存盘点组件内的轻量级库存调拨,不做完整调拨单流程。
|
||||
|
||||
包含:
|
||||
|
||||
| 功能点 | 说明 |
|
||||
| --- | --- |
|
||||
| 行内调拨 | 在库存盘点表格中直接对单行库存发起调拨 |
|
||||
| 选择目标库位 | 从现有库位下拉中选择 |
|
||||
| 一键新建库位 | 新建库位后回填为目标库位 |
|
||||
| 原库位扣减 | 调拨数量从原库位库存中扣除 |
|
||||
| 目标库位增加 | 已存在则累加,不存在则新增 |
|
||||
| 调拨记录 | 记录调拨前后库存和操作信息 |
|
||||
|
||||
不包含:
|
||||
|
||||
| 不包含内容 | 原因 |
|
||||
| --- | --- |
|
||||
| 独立调拨单页面 | 当前需求聚焦盘点现场快速调整 |
|
||||
| 调拨审批 | 未纳入本次业务流程 |
|
||||
| 打印调拨单 | 未纳入本次验收 |
|
||||
| 调出确认、调入确认 | 本次为单步原子调拨 |
|
||||
| 跨仓库复杂调拨 | 当前只有库位级调拨 |
|
||||
| 外协调拨 | 外协调拨已有独立业务范围 |
|
||||
|
||||
## 关键业务规则
|
||||
|
||||
| 规则编号 | 规则内容 |
|
||||
| --- | --- |
|
||||
| BR-001 | 调拨数量必须大于 0 |
|
||||
| BR-002 | 调拨数量不能大于原库位当前库存 |
|
||||
| BR-003 | 目标库位不能为空 |
|
||||
| BR-004 | 目标库位不能等于原库位 |
|
||||
| BR-005 | 新库位名称不能为空 |
|
||||
| BR-006 | 新库位名称不能重复 |
|
||||
| BR-007 | 后端必须以数据库当前库存重新校验,不能只信任前端原库存数 |
|
||||
| BR-008 | 原库位扣减、目标库位增加、调拨记录写入必须在同一事务中完成 |
|
||||
| BR-009 | 调拨后原库位库存为 0 时保留库存记录 |
|
||||
|
||||
## 涉及数据对象
|
||||
|
||||
| 数据对象 | 用途 |
|
||||
| --- | --- |
|
||||
| `库存管理_物料与货位对照表` | 普通物料库位库存 |
|
||||
| `库存管理_半成品与货位对照表` | 通用件库位库存 |
|
||||
| `库存管理_货位主文件` | 库位基础数据 |
|
||||
| `库存盘点_调拨记录` | 库存调拨日志 |
|
||||
| `库存盘点_修改记录` | 保留原库存修改记录能力 |
|
||||
|
||||
## 涉及接口
|
||||
|
||||
| 接口/过程 | 类型 | 用途 |
|
||||
| --- | --- | --- |
|
||||
| `仓储管理_库存盘点_查询` | 查询 | 调拨前后刷新库存盘点列表 |
|
||||
| `仓储管理_库位_查询` | 查询 | 获取库位下拉 |
|
||||
| `仓储管理_库位_验证是否存在` | 查询 | 新建库位前校验重复 |
|
||||
| `仓储管理_库位_增加数据` | 增改 | 新增目标库位 |
|
||||
| `仓储管理_库存盘点_库存调拨` | 增改 | 执行原子调拨 |
|
||||
|
||||
## 用户操作流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["进入库存盘点页面"] --> B["选择一行库存记录"]
|
||||
B --> C["点击调拨"]
|
||||
C --> D["打开库存调拨弹窗"]
|
||||
D --> E{"目标库位是否已存在"}
|
||||
E -- "存在" --> F["选择目标库位"]
|
||||
E -- "不存在" --> G["输入新库位名称并新建"]
|
||||
G --> F
|
||||
F --> H["输入调拨数量和备注"]
|
||||
H --> I["提交调拨"]
|
||||
I --> J["后端事务扣减原库位并增加目标库位"]
|
||||
J --> K["写入调拨记录"]
|
||||
K --> L["刷新库存盘点列表"]
|
||||
```
|
||||
|
||||
264
docs/库存调拨/02-项目程序开发详细步骤.md
Normal file
@@ -0,0 +1,264 @@
|
||||
# 02-项目程序开发详细步骤
|
||||
|
||||
## 开发入口
|
||||
|
||||
前端页面:
|
||||
|
||||
```text
|
||||
src/views/WarehouseManagement/InventoryCheck/index.vue
|
||||
```
|
||||
|
||||
SQL 脚本:
|
||||
|
||||
```text
|
||||
sql/仓储管理_库存盘点_库存调拨.sql
|
||||
```
|
||||
|
||||
## 第 1 步:梳理现有库存盘点页面
|
||||
|
||||
确认页面已有能力:
|
||||
|
||||
| 已有能力 | 说明 |
|
||||
| --- | --- |
|
||||
| 库存查询 | 调用 `仓储管理_库存盘点_查询` |
|
||||
| 编辑库存 | 调用 `仓储管理_库存盘点_货位数量_编辑数据` |
|
||||
| 库位下拉 | 调用 `仓储管理_库位_查询` |
|
||||
| 新增物料存货 | 页面已有新增库存相关逻辑 |
|
||||
|
||||
确认表格已有字段:
|
||||
|
||||
```text
|
||||
物料编码
|
||||
物料流水号
|
||||
物料名称
|
||||
图号或型号
|
||||
物料与货位流水号
|
||||
类型
|
||||
库存
|
||||
货位流水号
|
||||
货位名称
|
||||
批次编号
|
||||
```
|
||||
|
||||
## 第 2 步:增加表格调拨入口
|
||||
|
||||
在库存盘点表格操作列增加“调拨”按钮。
|
||||
|
||||
实现要求:
|
||||
|
||||
1. 原操作列宽度调整为可容纳“编辑”和“调拨”。
|
||||
2. 行处于编辑状态时不显示调拨按钮。
|
||||
3. 行不处于编辑状态时显示调拨按钮。
|
||||
|
||||
关键逻辑:
|
||||
|
||||
```html
|
||||
<el-button v-if="!scope.row.edit" type="text" size="mini" @click="openTransfer(scope.row)">调拨</el-button>
|
||||
```
|
||||
|
||||
## 第 3 步:增加调拨状态和表单对象
|
||||
|
||||
在 `data()` 中增加:
|
||||
|
||||
```js
|
||||
transferDialogVisible: false,
|
||||
transferLocationAdding: false,
|
||||
transferSubmitting: false,
|
||||
transferForm: {
|
||||
物料与货位流水号: '',
|
||||
物料流水号: '',
|
||||
物料名称: '',
|
||||
图号或型号: '',
|
||||
类型: '',
|
||||
原货位流水号: '',
|
||||
原货位名称: '',
|
||||
原库存数: 0,
|
||||
目标货位流水号: '',
|
||||
目标货位名称: '',
|
||||
新货位名称: '',
|
||||
调拨数量: 1,
|
||||
调拨备注: ''
|
||||
}
|
||||
```
|
||||
|
||||
## 第 4 步:增加库存调拨弹窗
|
||||
|
||||
新增 `el-dialog`,标题为:
|
||||
|
||||
```text
|
||||
库存调拨
|
||||
```
|
||||
|
||||
弹窗内容:
|
||||
|
||||
| 字段 | 控件 | 是否可编辑 |
|
||||
| --- | --- | --- |
|
||||
| 物料名称 | 文本 | 否 |
|
||||
| 图号/型号 | 文本 | 否 |
|
||||
| 原库位 | 文本 | 否 |
|
||||
| 原库存数 | 文本 | 否 |
|
||||
| 目标库位 | `el-select` | 是 |
|
||||
| 新库位 | `el-input` | 是 |
|
||||
| 调拨数量 | `el-input-number` | 是 |
|
||||
| 调拨备注 | `el-input` | 是 |
|
||||
|
||||
## 第 5 步:打开调拨弹窗
|
||||
|
||||
新增方法:
|
||||
|
||||
```js
|
||||
openTransfer(row)
|
||||
```
|
||||
|
||||
处理内容:
|
||||
|
||||
1. 校验当前行是否有 `物料与货位流水号`。
|
||||
2. 校验当前行库存是否大于 0。
|
||||
3. 将当前行物料、库位、库存信息填入 `transferForm`。
|
||||
4. 清空目标库位、新库位、备注。
|
||||
5. 打开调拨弹窗。
|
||||
|
||||
## 第 6 步:选择目标库位
|
||||
|
||||
新增方法:
|
||||
|
||||
```js
|
||||
handleTransferLocationChange(value)
|
||||
```
|
||||
|
||||
处理内容:
|
||||
|
||||
1. 根据选择的 `货位流水号`,从 `storageLocation` 中找到货位名称。
|
||||
2. 回填 `transferForm.目标货位名称`。
|
||||
|
||||
## 第 7 步:一键新建库位
|
||||
|
||||
新增方法:
|
||||
|
||||
```js
|
||||
addTransferLocation()
|
||||
```
|
||||
|
||||
处理流程:
|
||||
|
||||
1. 校验 `transferForm.新货位名称` 不能为空。
|
||||
2. 调用 `仓储管理_库位_验证是否存在`。
|
||||
3. 如果库位已存在,提示并按库位名称回填已有库位。
|
||||
4. 如果库位不存在,调用 `仓储管理_库位_增加数据`。
|
||||
5. 新增成功后调用 `getLocateName()` 刷新库位下拉。
|
||||
6. 调用 `selectTransferLocation(locationName)` 回填目标库位。
|
||||
|
||||
## 第 8 步:提交库存调拨
|
||||
|
||||
新增方法:
|
||||
|
||||
```js
|
||||
submitTransfer()
|
||||
```
|
||||
|
||||
前端校验:
|
||||
|
||||
| 校验项 | 提示 |
|
||||
| --- | --- |
|
||||
| 目标库位为空 | 请选择目标库位 |
|
||||
| 目标库位等于原库位 | 目标库位不能与原库位相同 |
|
||||
| 调拨数量小于等于 0 | 调拨数量必须大于0 |
|
||||
| 调拨数量大于原库存 | 调拨数量不能大于原库存数 |
|
||||
|
||||
提交参数:
|
||||
|
||||
| 序号 | 参数名 |
|
||||
| --- | --- |
|
||||
| 0 | 物料与货位流水号 |
|
||||
| 1 | 物料流水号 |
|
||||
| 2 | 原货位流水号 |
|
||||
| 3 | 目标货位流水号 |
|
||||
| 4 | 调拨数量 |
|
||||
| 5 | 原库存数 |
|
||||
| 6 | 调拨备注 |
|
||||
| 7 | 操作者 |
|
||||
| 8 | 类型 |
|
||||
|
||||
调用接口:
|
||||
|
||||
```js
|
||||
var Data = this.CreateData('12', '仓储管理_库存盘点_库存调拨', param)
|
||||
```
|
||||
|
||||
成功后:
|
||||
|
||||
1. 提示“调拨成功”。
|
||||
2. 关闭调拨弹窗。
|
||||
3. 调用 `searchTable()` 刷新列表。
|
||||
|
||||
## 第 9 步:后端脚本设计
|
||||
|
||||
脚本文件:
|
||||
|
||||
```text
|
||||
sql/仓储管理_库存盘点_库存调拨.sql
|
||||
```
|
||||
|
||||
脚本内容:
|
||||
|
||||
1. 如果 `库存盘点_调拨记录` 不存在,则创建该表。
|
||||
2. 删除并重建存储过程 `dbo.仓储管理_库存盘点_库存调拨`。
|
||||
3. 按 `@类型` 判断库存表:
|
||||
- `@类型 = N'通用件'` 使用 `库存管理_半成品与货位对照表`。
|
||||
- 其他类型使用 `库存管理_物料与货位对照表`。
|
||||
4. 使用事务处理扣减、增加、新增目标记录、写入日志。
|
||||
5. 出错时回滚并返回失败信息。
|
||||
|
||||
## 第 10 步:后端事务流程
|
||||
|
||||
```text
|
||||
BEGIN TRAN
|
||||
锁定原库存记录
|
||||
校验原库存记录存在
|
||||
校验目标库位不等于原库位
|
||||
校验当前库存 >= 调拨数量
|
||||
扣减原库位库存
|
||||
查询目标库位同物料库存
|
||||
如果存在则增加目标库存
|
||||
如果不存在则新增目标库存记录
|
||||
写入库存盘点_调拨记录
|
||||
COMMIT TRAN
|
||||
```
|
||||
|
||||
失败处理:
|
||||
|
||||
```text
|
||||
ROLLBACK TRAN
|
||||
返回 result = 0 和 msg
|
||||
```
|
||||
|
||||
## 第 11 步:数据库部署
|
||||
|
||||
部署目标:
|
||||
|
||||
```text
|
||||
SQL Server: 192.168.1.27
|
||||
Database: ERPTOOL_JY_20250826Back
|
||||
```
|
||||
|
||||
部署对象:
|
||||
|
||||
```text
|
||||
库存盘点_调拨记录
|
||||
仓储管理_库存盘点_库存调拨
|
||||
```
|
||||
|
||||
## 第 12 步:验证
|
||||
|
||||
验证项:
|
||||
|
||||
1. SQL 脚本编译通过。
|
||||
2. 数据库对象存在。
|
||||
3. 存储过程参数完整。
|
||||
4. 前端模板解析通过。
|
||||
5. 前端脚本解析通过。
|
||||
6. 页面实际选择库存记录调拨。
|
||||
7. 原库位库存减少。
|
||||
8. 目标库位库存增加或新增。
|
||||
9. 调拨记录写入。
|
||||
|
||||
48
docs/库存调拨/03-推进台账.md
Normal file
@@ -0,0 +1,48 @@
|
||||
# 03-推进台账
|
||||
|
||||
## 台账说明
|
||||
|
||||
本文记录库存调拨功能每轮推进情况,包括做了什么、改了哪些文件、验证了什么、下一步是什么。后续继续开发或验收时,应优先查看本台账,避免重复分析。
|
||||
|
||||
## 推进台账
|
||||
|
||||
| 轮次 | 做了什么 | 改了哪些文件/对象 | 验证了什么 | 下一步 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 1 | 生成初版库存调拨方案,偏完整调拨单流程 | `库存调拨功能设计方案.md` | 参考仓储模块已有调拨、库存查询页面 | 根据实际场景收敛设计 |
|
||||
| 2 | 按用户补充场景重写方案,聚焦库存盘点组件内调拨 | `docs/库存调拨/库存调拨功能设计方案.md` | 确认目标是盘点页内一键新建库位并扣减原库位库存 | 开始开发 |
|
||||
| 3 | 梳理库存盘点页面现状 | `src/views/WarehouseManagement/InventoryCheck/index.vue` | 确认已有库存、库位、物料货位字段和查询接口 | 增加前端交互 |
|
||||
| 4 | 增加表格“调拨”按钮 | `src/views/WarehouseManagement/InventoryCheck/index.vue` | 操作列支持编辑和调拨两个入口 | 增加弹窗 |
|
||||
| 5 | 增加库存调拨弹窗和 `transferForm` | `src/views/WarehouseManagement/InventoryCheck/index.vue` | 弹窗可展示物料、图号、原库位、原库存数等字段 | 增加库位选择 |
|
||||
| 6 | 增加目标库位选择和库位名称同步 | `src/views/WarehouseManagement/InventoryCheck/index.vue` | 选择货位流水号后可同步目标货位名称 | 增加一键新建库位 |
|
||||
| 7 | 增加一键新建库位逻辑 | `src/views/WarehouseManagement/InventoryCheck/index.vue` | 调用 `仓储管理_库位_验证是否存在`、`仓储管理_库位_增加数据` | 增加调拨提交 |
|
||||
| 8 | 增加 `submitTransfer()` 调拨提交逻辑 | `src/views/WarehouseManagement/InventoryCheck/index.vue` | 前端校验目标库位、调拨数量、原库存限制 | 设计后端原子接口 |
|
||||
| 9 | 编写 SQL 调拨脚本 | `sql/仓储管理_库存盘点_库存调拨.sql` | 脚本包含记录表和调拨存储过程 | 编译检查 |
|
||||
| 10 | 执行 SQL 编译检查 | `sql/仓储管理_库存盘点_库存调拨.sql` | `SET NOEXEC ON` 编译输出 `sql compile ok` | 部署数据库对象 |
|
||||
| 11 | 在 SQL Server 创建调拨对象 | 数据库对象:`库存盘点_调拨记录`、`仓储管理_库存盘点_库存调拨` | 查询 `sys.objects` 确认对象存在 | 验证参数和字段 |
|
||||
| 12 | 查询存储过程参数和记录表字段 | SQL Server 元数据 | 确认 9 个存储过程参数和调拨记录表字段 | 做前端静态验证 |
|
||||
| 13 | 前端模板和脚本解析 | `src/views/WarehouseManagement/InventoryCheck/index.vue` | 输出 `template ok`、`script ok` | 页面联调 |
|
||||
| 14 | 生成开发说明文档 | `docs/库存调拨/库存调拨功能开发说明.md` | 汇总功能、步骤、证据、任务矩阵、决策记录 | 按用户要求拆分 7 份文档 |
|
||||
| 15 | 拆分项目矩阵化文档 | `docs/库存调拨/01-项目功能内容.md` 等 7 份文档 | 文档目录可作为后续推进索引 | 后续补页面截图或实际业务数据验收 |
|
||||
|
||||
## 当前状态
|
||||
|
||||
| 类型 | 状态 |
|
||||
| --- | --- |
|
||||
| 前端开发 | 已完成基础开发 |
|
||||
| 后端脚本 | 已完成并执行 |
|
||||
| 数据库对象 | 已创建 |
|
||||
| 静态验证 | 已完成 |
|
||||
| 页面实测 | 待执行 |
|
||||
| 真实数据调拨验收 | 待执行 |
|
||||
| 截图/PDF 验收材料 | 待补充 |
|
||||
|
||||
## 下一步建议
|
||||
|
||||
1. 使用测试账号进入库存盘点页面。
|
||||
2. 查询一条库存大于 0 的物料库位记录。
|
||||
3. 点击“调拨”。
|
||||
4. 先调拨到已有库位,验证原库位扣减、目标库位增加。
|
||||
5. 再新建库位并调拨,验证目标库存记录新增。
|
||||
6. 查询 `库存盘点_调拨记录`,核对调拨前后库存。
|
||||
7. 对上述步骤截图,补充到 `05-验收证据.md`。
|
||||
|
||||
70
docs/库存调拨/04-任务矩阵.md
Normal file
@@ -0,0 +1,70 @@
|
||||
# 04-任务矩阵
|
||||
|
||||
## 任务矩阵说明
|
||||
|
||||
本文用于记录库存调拨功能所有任务编号、状态和验收标准。后续继续推进时,先检查任务状态,避免重复开发或重复验证。
|
||||
|
||||
状态说明:
|
||||
|
||||
| 状态 | 含义 |
|
||||
| --- | --- |
|
||||
| 已完成 | 已开发或已验证完成 |
|
||||
| 待执行 | 需要后续继续做 |
|
||||
| 待补充 | 已有基础内容,但需要补充更完整证据 |
|
||||
| 阻塞 | 当前缺少条件,无法推进 |
|
||||
|
||||
## 任务矩阵
|
||||
|
||||
| 任务编号 | 任务名称 | 状态 | 验收标准 |
|
||||
| --- | --- | --- | --- |
|
||||
| INV-TR-001 | 明确应用场景 | 已完成 | 方案明确为库存盘点组件内调拨,不做完整调拨单 |
|
||||
| INV-TR-002 | 编写库存调拨设计方案 | 已完成 | `docs/库存调拨/库存调拨功能设计方案.md` 已存在 |
|
||||
| INV-TR-003 | 梳理库存盘点现有字段和接口 | 已完成 | 明确 `库存`、`货位流水号`、`物料与货位流水号` 等字段 |
|
||||
| INV-TR-004 | 增加表格调拨按钮 | 已完成 | `InventoryCheck/index.vue` 操作列出现“调拨”按钮 |
|
||||
| INV-TR-005 | 增加调拨弹窗 | 已完成 | 弹窗展示物料、图号、原库位、原库存数、目标库位、新库位、调拨数量、备注 |
|
||||
| INV-TR-006 | 增加调拨状态变量 | 已完成 | 存在 `transferDialogVisible`、`transferLocationAdding`、`transferSubmitting` |
|
||||
| INV-TR-007 | 增加 `transferForm` | 已完成 | 表单包含原库存、目标库位、新库位、调拨数量、调拨备注 |
|
||||
| INV-TR-008 | 打开调拨弹窗方法 | 已完成 | `openTransfer(row)` 可带出当前行库存信息 |
|
||||
| INV-TR-009 | 目标库位选择联动 | 已完成 | `handleTransferLocationChange(value)` 可同步目标货位名称 |
|
||||
| INV-TR-010 | 一键新建库位 | 已完成 | `addTransferLocation()` 可验证重复并新增库位 |
|
||||
| INV-TR-011 | 新库位回填目标库位 | 已完成 | `selectTransferLocation(locationName)` 可按名称回填新增库位 |
|
||||
| INV-TR-012 | 调拨提交前端校验 | 已完成 | 目标库位、调拨数量、原库存边界均有校验 |
|
||||
| INV-TR-013 | 调拨提交接口调用 | 已完成 | 调用 `仓储管理_库存盘点_库存调拨` 并传 9 个参数 |
|
||||
| INV-TR-014 | 前端传入 `类型` 参数 | 已完成 | 后端可按普通物料/通用件分支处理 |
|
||||
| INV-TR-015 | 新增调拨 SQL 脚本 | 已完成 | `sql/仓储管理_库存盘点_库存调拨.sql` 已存在 |
|
||||
| INV-TR-016 | 新增调拨记录表 | 已完成 | 数据库存在 `库存盘点_调拨记录` |
|
||||
| INV-TR-017 | 新增调拨存储过程 | 已完成 | 数据库存在 `仓储管理_库存盘点_库存调拨` |
|
||||
| INV-TR-018 | 普通物料调拨分支 | 已完成 | 使用 `库存管理_物料与货位对照表` 扣减和增加 |
|
||||
| INV-TR-019 | 通用件调拨分支 | 已完成 | 使用 `库存管理_半成品与货位对照表` 扣减和增加 |
|
||||
| INV-TR-020 | 原库位库存不足校验 | 已完成 | 后端当前库存不足时返回失败并回滚 |
|
||||
| INV-TR-021 | 目标库位已有库存累加 | 已完成 | 目标库位存在同物料记录时累加库存 |
|
||||
| INV-TR-022 | 目标库位无库存新增 | 已完成 | 目标库位不存在同物料记录时新增记录 |
|
||||
| INV-TR-023 | 写入调拨记录 | 已完成 | 调拨记录包含原库位、目标库位、调拨前后库存 |
|
||||
| INV-TR-024 | SQL 编译检查 | 已完成 | 编译输出 `sql compile ok` |
|
||||
| INV-TR-025 | 数据库对象验证 | 已完成 | `sys.objects` 可查到表和过程 |
|
||||
| INV-TR-026 | 存储过程参数验证 | 已完成 | `sys.parameters` 可查到 9 个参数 |
|
||||
| INV-TR-027 | 调拨记录字段验证 | 已完成 | `INFORMATION_SCHEMA.COLUMNS` 可查到记录字段 |
|
||||
| INV-TR-028 | 前端模板解析 | 已完成 | `vue-template-compiler` 输出 `template ok` |
|
||||
| INV-TR-029 | 前端脚本解析 | 已完成 | Babel/脚本解析输出 `script ok` |
|
||||
| INV-TR-030 | 实际页面调拨到已有库位 | 待执行 | 原库位库存减少,目标库位库存增加 |
|
||||
| INV-TR-031 | 实际页面调拨到新库位 | 待执行 | 新库位创建成功,目标库存记录新增 |
|
||||
| INV-TR-032 | 调拨记录业务核对 | 待执行 | `库存盘点_调拨记录` 中调拨前后库存正确 |
|
||||
| INV-TR-033 | 页面截图留档 | 待补充 | 调拨前、弹窗、调拨后、数据库记录截图齐全 |
|
||||
| INV-TR-034 | README 索引创建 | 已完成 | `docs/库存调拨/README.md` 指向 7 份文档 |
|
||||
|
||||
## 防重复规则
|
||||
|
||||
1. 凡状态为“已完成”的任务,后续不重复开发,只做回归验证。
|
||||
2. 若发现已完成任务仍有缺陷,应新增缺陷任务编号,不直接覆盖原任务含义。
|
||||
3. 页面实测类任务必须保留截图或数据库查询结果。
|
||||
4. SQL 过程变更必须同步更新 `05-验收证据.md` 和 `06-决策记录.md`。
|
||||
|
||||
## 当前优先级
|
||||
|
||||
| 优先级 | 任务编号 | 原因 |
|
||||
| --- | --- | --- |
|
||||
| P0 | INV-TR-030 | 需要真实页面验证核心调拨能力 |
|
||||
| P0 | INV-TR-031 | 需要验证一键新建库位闭环 |
|
||||
| P1 | INV-TR-032 | 需要确认追溯记录可用于审计 |
|
||||
| P1 | INV-TR-033 | 需要补齐交付验收材料 |
|
||||
|
||||
209
docs/库存调拨/05-验收证据.md
Normal file
@@ -0,0 +1,209 @@
|
||||
# 05-验收证据
|
||||
|
||||
## 验收证据说明
|
||||
|
||||
本文记录库存调拨功能已经产生的命令、页面、数据库对象、脚本、输出结果等验收证据。后续如果补充截图、PDF、页面录屏、job_id、report_id,应继续追加到本文。
|
||||
|
||||
## 证据 1:文件清单
|
||||
|
||||
已新增或修改的关键文件:
|
||||
|
||||
```text
|
||||
src/views/WarehouseManagement/InventoryCheck/index.vue
|
||||
sql/仓储管理_库存盘点_库存调拨.sql
|
||||
docs/库存调拨/库存调拨功能设计方案.md
|
||||
docs/库存调拨/库存调拨功能开发说明.md
|
||||
docs/库存调拨/01-项目功能内容.md
|
||||
docs/库存调拨/02-项目程序开发详细步骤.md
|
||||
docs/库存调拨/03-推进台账.md
|
||||
docs/库存调拨/04-任务矩阵.md
|
||||
docs/库存调拨/05-验收证据.md
|
||||
docs/库存调拨/06-决策记录.md
|
||||
docs/库存调拨/README.md
|
||||
```
|
||||
|
||||
## 证据 2:数据库连接
|
||||
|
||||
数据库连接目标:
|
||||
|
||||
```text
|
||||
SQL Server IP:192.168.1.27
|
||||
数据库:ERPTOOL_JY_20250826Back
|
||||
```
|
||||
|
||||
已验证连接结果:
|
||||
|
||||
```text
|
||||
DatabaseName=ERPTOOL_JY_20250826Back
|
||||
Version=Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (X64)
|
||||
```
|
||||
|
||||
## 证据 3:SQL 编译检查
|
||||
|
||||
脚本:
|
||||
|
||||
```text
|
||||
sql/仓储管理_库存盘点_库存调拨.sql
|
||||
```
|
||||
|
||||
检查方式:
|
||||
|
||||
```sql
|
||||
SET NOEXEC ON
|
||||
-- 执行脚本文本做编译检查
|
||||
SET NOEXEC OFF
|
||||
```
|
||||
|
||||
输出结果:
|
||||
|
||||
```text
|
||||
sql compile ok
|
||||
```
|
||||
|
||||
## 证据 4:数据库对象创建
|
||||
|
||||
执行调拨脚本后查询 `sys.objects`,确认对象存在:
|
||||
|
||||
```text
|
||||
仓储管理_库存盘点_库存调拨 SQL_STORED_PROCEDURE
|
||||
库存盘点_调拨记录 USER_TABLE
|
||||
```
|
||||
|
||||
验收标准:
|
||||
|
||||
| 对象 | 标准 | 状态 |
|
||||
| --- | --- | --- |
|
||||
| `仓储管理_库存盘点_库存调拨` | 存储过程存在 | 已通过 |
|
||||
| `库存盘点_调拨记录` | 用户表存在 | 已通过 |
|
||||
|
||||
## 证据 5:存储过程参数
|
||||
|
||||
查询 `sys.parameters`,确认过程参数:
|
||||
|
||||
```text
|
||||
1 @物料与货位流水号 int
|
||||
2 @物料流水号 int
|
||||
3 @原货位流水号 int
|
||||
4 @目标货位流水号 int
|
||||
5 @调拨数量 float
|
||||
6 @原库存数 float
|
||||
7 @调拨备注 nvarchar
|
||||
8 @操作者 int
|
||||
9 @类型 nvarchar
|
||||
```
|
||||
|
||||
验收标准:
|
||||
|
||||
1. 参数包含原库存记录流水号。
|
||||
2. 参数包含原货位和目标货位。
|
||||
3. 参数包含调拨数量。
|
||||
4. 参数包含操作者。
|
||||
5. 参数包含类型,用于区分普通物料和通用件。
|
||||
|
||||
状态:已通过。
|
||||
|
||||
## 证据 6:调拨记录表字段
|
||||
|
||||
查询 `INFORMATION_SCHEMA.COLUMNS`,确认调拨记录表字段:
|
||||
|
||||
```text
|
||||
库存调拨流水号 int
|
||||
类型 nvarchar
|
||||
物料流水号 int
|
||||
原物料与货位流水号 int
|
||||
原货位流水号 int
|
||||
目标物料与货位流水号 int
|
||||
目标货位流水号 int
|
||||
调拨数量 float
|
||||
调拨前原库存 float
|
||||
调拨后原库存 float
|
||||
调拨前目标库存 float
|
||||
调拨后目标库存 float
|
||||
调拨备注 nvarchar
|
||||
操作人 int
|
||||
操作时间 datetime
|
||||
```
|
||||
|
||||
验收标准:
|
||||
|
||||
| 字段组 | 标准 | 状态 |
|
||||
| --- | --- | --- |
|
||||
| 原库位信息 | 可记录原库存流水号和原货位 | 已通过 |
|
||||
| 目标库位信息 | 可记录目标库存流水号和目标货位 | 已通过 |
|
||||
| 库存变化 | 可记录调拨前后库存 | 已通过 |
|
||||
| 操作信息 | 可记录备注、操作人、时间 | 已通过 |
|
||||
|
||||
## 证据 7:前端静态检查
|
||||
|
||||
检查对象:
|
||||
|
||||
```text
|
||||
src/views/WarehouseManagement/InventoryCheck/index.vue
|
||||
```
|
||||
|
||||
检查内容:
|
||||
|
||||
1. Vue template 解析。
|
||||
2. script 解析。
|
||||
|
||||
输出结果:
|
||||
|
||||
```text
|
||||
template ok
|
||||
script ok
|
||||
```
|
||||
|
||||
说明:
|
||||
|
||||
命令因本机 Node 启动较慢触到超时边界,但在超时前已成功输出检查结果。
|
||||
|
||||
## 证据 8:页面验收待补充
|
||||
|
||||
当前仍需补充实际页面证据:
|
||||
|
||||
| 证据编号 | 页面/动作 | 状态 | 需要补充 |
|
||||
| --- | --- | --- | --- |
|
||||
| PAGE-001 | 库存盘点列表出现“调拨”按钮 | 待补充 | 页面截图 |
|
||||
| PAGE-002 | 打开库存调拨弹窗 | 待补充 | 弹窗截图 |
|
||||
| PAGE-003 | 选择已有目标库位调拨 | 待补充 | 调拨前后库存截图 |
|
||||
| PAGE-004 | 新建库位并调拨 | 待补充 | 新库位回填截图 |
|
||||
| PAGE-005 | 调拨记录写入 | 待补充 | SQL 查询结果截图 |
|
||||
|
||||
## 证据 9:建议补充的 SQL 核对语句
|
||||
|
||||
后续页面实测后,可用以下方向核对:
|
||||
|
||||
```sql
|
||||
-- 查询调拨记录
|
||||
SELECT TOP 20 *
|
||||
FROM 库存盘点_调拨记录
|
||||
ORDER BY 操作时间 DESC;
|
||||
```
|
||||
|
||||
```sql
|
||||
-- 查询普通物料库位库存
|
||||
SELECT *
|
||||
FROM 库存管理_物料与货位对照表
|
||||
WHERE 物料流水号 = @物料流水号
|
||||
AND 货位流水号 IN (@原货位流水号, @目标货位流水号);
|
||||
```
|
||||
|
||||
```sql
|
||||
-- 查询通用件库位库存
|
||||
SELECT *
|
||||
FROM 库存管理_半成品与货位对照表
|
||||
WHERE 半成品流水号 = @物料流水号
|
||||
AND 货位流水号 IN (@原货位流水号, @目标货位流水号);
|
||||
```
|
||||
|
||||
## 当前验收结论
|
||||
|
||||
| 验收项 | 结论 |
|
||||
| --- | --- |
|
||||
| 前端基础实现 | 通过 |
|
||||
| SQL 编译 | 通过 |
|
||||
| 数据库对象创建 | 通过 |
|
||||
| 参数和字段结构 | 通过 |
|
||||
| 页面实际业务调拨 | 待补充 |
|
||||
| 截图/PDF/report_id/job_id | 暂无,待页面验收时补充 |
|
||||
|
||||
106
docs/库存调拨/06-决策记录.md
Normal file
@@ -0,0 +1,106 @@
|
||||
# 06-决策记录
|
||||
|
||||
## 决策记录说明
|
||||
|
||||
本文记录库存调拨功能中的关键决策。后续变更时,优先查阅本文,避免重复争论已经确定的技术和业务选择。
|
||||
|
||||
## ADR-001:不做完整调拨单流程
|
||||
|
||||
| 项目 | 内容 |
|
||||
| --- | --- |
|
||||
| 状态 | 已采纳 |
|
||||
| 决策 | 库存调拨只做库存盘点组件内轻量调拨 |
|
||||
| 原因 | 用户明确场景是盘点时快速把库存从原库位调到目标库位,并支持一键新建库位 |
|
||||
| 影响 | 不新增独立调拨单页面、不做审批、不做打印 |
|
||||
| 后续变更条件 | 如果业务要求调拨审批、打印、跨仓库流转,再新增独立调拨单模块 |
|
||||
|
||||
## ADR-002:使用后端原子存储过程完成调拨
|
||||
|
||||
| 项目 | 内容 |
|
||||
| --- | --- |
|
||||
| 状态 | 已采纳 |
|
||||
| 决策 | 新增 `仓储管理_库存盘点_库存调拨`,由一个事务完成扣减和增加 |
|
||||
| 原因 | 前端拆成两次请求会出现只扣不加、只加不扣、并发负库存风险 |
|
||||
| 影响 | 前端只提交一次调拨请求,库存一致性由数据库保证 |
|
||||
| 后续变更条件 | 如果未来迁移到后端服务层,也必须保留事务边界 |
|
||||
|
||||
## ADR-003:调拨数量使用 FLOAT
|
||||
|
||||
| 项目 | 内容 |
|
||||
| --- | --- |
|
||||
| 状态 | 已采纳 |
|
||||
| 决策 | `@调拨数量`、库存记录字段按 `float` 处理 |
|
||||
| 原因 | 现有库存表 `货位存量` 使用 `float`,库存可能存在小数 |
|
||||
| 影响 | 调拨支持小数库存 |
|
||||
| 后续变更条件 | 若未来统一库存数量精度,应迁移为 decimal 并同步所有库存过程 |
|
||||
|
||||
## ADR-004:以后端当前库存为准
|
||||
|
||||
| 项目 | 内容 |
|
||||
| --- | --- |
|
||||
| 状态 | 已采纳 |
|
||||
| 决策 | 前端传 `原库存数` 只作参考,后端必须重新查询并锁定当前库存 |
|
||||
| 原因 | 多人同时操作时,前端库存可能已过期 |
|
||||
| 影响 | 可以避免并发调拨造成负库存 |
|
||||
| 后续变更条件 | 无。库存扣减类业务都应遵守该规则 |
|
||||
|
||||
## ADR-005:区分普通物料和通用件库存表
|
||||
|
||||
| 项目 | 内容 |
|
||||
| --- | --- |
|
||||
| 状态 | 已采纳 |
|
||||
| 决策 | 根据 `@类型 = N'通用件'` 选择库存表 |
|
||||
| 原因 | 现有系统中通用件使用 `库存管理_半成品与货位对照表`,普通物料使用 `库存管理_物料与货位对照表` |
|
||||
| 影响 | 前端必须传 `类型` 参数 |
|
||||
| 后续变更条件 | 如果后续统一库存表,可移除分支 |
|
||||
|
||||
## ADR-006:目标库位不存在同物料库存时新增记录
|
||||
|
||||
| 项目 | 内容 |
|
||||
| --- | --- |
|
||||
| 状态 | 已采纳 |
|
||||
| 决策 | 目标库位已有同物料库存则累加,没有则新增库存记录 |
|
||||
| 原因 | 盘点调拨常见场景是将物料拆分到新库位 |
|
||||
| 影响 | 调拨过程需要同时处理 update 和 insert |
|
||||
| 后续变更条件 | 如果业务规定必须先建库存记录,再调拨,可改为无记录时报错 |
|
||||
|
||||
## ADR-007:原库位库存为 0 时保留记录
|
||||
|
||||
| 项目 | 内容 |
|
||||
| --- | --- |
|
||||
| 状态 | 已采纳 |
|
||||
| 决策 | 调拨后原库位库存为 0,不物理删除库存记录 |
|
||||
| 原因 | 保留历史库位关系,便于追溯,也符合盘点页库存可编辑为 0 的现状 |
|
||||
| 影响 | 查询页面是否显示 0 库存由查询条件控制 |
|
||||
| 后续变更条件 | 如果业务要求隐藏 0 库存,优先改查询,不建议删除记录 |
|
||||
|
||||
## ADR-008:一键新建库位复用现有接口
|
||||
|
||||
| 项目 | 内容 |
|
||||
| --- | --- |
|
||||
| 状态 | 已采纳 |
|
||||
| 决策 | 复用 `仓储管理_库位_验证是否存在` 和 `仓储管理_库位_增加数据` |
|
||||
| 原因 | 系统已有库位校验和新增能力,不重复造接口 |
|
||||
| 影响 | 新库位创建逻辑与现有库位维护规则保持一致 |
|
||||
| 后续变更条件 | 如果库位维护规则变化,应统一改库位接口 |
|
||||
|
||||
## ADR-009:新增轻量调拨记录表
|
||||
|
||||
| 项目 | 内容 |
|
||||
| --- | --- |
|
||||
| 状态 | 已采纳 |
|
||||
| 决策 | 新增 `库存盘点_调拨记录` |
|
||||
| 原因 | 旧库存修改记录无法完整表达“从哪个库位调到哪个库位” |
|
||||
| 影响 | 后续可以按记录追溯调拨数量、原库位、目标库位、操作人 |
|
||||
| 后续变更条件 | 如需要调拨单,可在该记录基础上扩展主从表 |
|
||||
|
||||
## ADR-010:暂不生成 PDF 和截图
|
||||
|
||||
| 项目 | 内容 |
|
||||
| --- | --- |
|
||||
| 状态 | 已采纳 |
|
||||
| 决策 | 当前阶段只保留 Markdown 和命令/数据库证据 |
|
||||
| 原因 | 功能尚需页面真实数据联调,截图/PDF 应在最终页面验收时生成 |
|
||||
| 影响 | `05-验收证据.md` 中页面截图、PDF、report_id 暂为空 |
|
||||
| 后续变更条件 | 页面实测完成后补充截图或 PDF 验收材料 |
|
||||
|
||||
64
docs/库存调拨/README.md
Normal file
@@ -0,0 +1,64 @@
|
||||
# 库存调拨文档索引
|
||||
|
||||
## 目录说明
|
||||
|
||||
本目录用于沉淀“库存盘点组件库存调拨功能”的设计、开发、推进、验收和决策资料。后续继续开发或验收时,优先从本 README 和任务矩阵开始,避免重复分析和重复开发。
|
||||
|
||||
## 标准文档
|
||||
|
||||
| 序号 | 文档 | 用途 |
|
||||
| --- | --- | --- |
|
||||
| 01 | [01-项目功能内容.md](./01-项目功能内容.md) | 说明功能范围、业务规则、数据对象和接口范围 |
|
||||
| 02 | [02-项目程序开发详细步骤.md](./02-项目程序开发详细步骤.md) | 说明前端、后端、数据库的详细开发步骤 |
|
||||
| 03 | [03-推进台账.md](./03-推进台账.md) | 记录每轮做了什么、改了什么、验证了什么、下一步是什么 |
|
||||
| 04 | [04-任务矩阵.md](./04-任务矩阵.md) | 记录所有任务编号、状态和验收标准 |
|
||||
| 05 | [05-验收证据.md](./05-验收证据.md) | 汇总命令、数据库对象、输出结果、待补截图等证据 |
|
||||
| 06 | [06-决策记录.md](./06-决策记录.md) | 记录为什么这么做,后续变更时避免重复争论 |
|
||||
|
||||
## 历史文档
|
||||
|
||||
| 文档 | 用途 |
|
||||
| --- | --- |
|
||||
| [库存调拨功能设计方案.md](./库存调拨功能设计方案.md) | 初始设计方案,包含较完整的业务和技术说明 |
|
||||
| [库存调拨功能开发说明.md](./库存调拨功能开发说明.md) | 已开发内容汇总,包含早期推进台账和验收证据 |
|
||||
|
||||
## 当前任务状态摘要
|
||||
|
||||
| 事项 | 状态 |
|
||||
| --- | --- |
|
||||
| 前端调拨入口 | 已完成 |
|
||||
| 调拨弹窗 | 已完成 |
|
||||
| 一键新建库位 | 已完成 |
|
||||
| 调拨提交 | 已完成 |
|
||||
| 调拨 SQL 脚本 | 已完成 |
|
||||
| 数据库调拨记录表 | 已创建 |
|
||||
| 数据库调拨存储过程 | 已创建 |
|
||||
| 前端静态验证 | 已完成 |
|
||||
| SQL 编译验证 | 已完成 |
|
||||
| 页面真实数据联调 | 待执行 |
|
||||
| 页面截图/PDF 验收资料 | 待补充 |
|
||||
|
||||
## 后续推进顺序
|
||||
|
||||
1. 打开 [04-任务矩阵.md](./04-任务矩阵.md),查看 `INV-TR-030` 之后的待执行任务。
|
||||
2. 按 [05-验收证据.md](./05-验收证据.md) 中的待补页面证据进行实际页面验收。
|
||||
3. 页面实测完成后,将截图、SQL 查询结果、PDF 或 report_id 补充到 `05-验收证据.md`。
|
||||
4. 如果新增业务规则或改变调拨流程,先更新 [06-决策记录.md](./06-决策记录.md),再改代码。
|
||||
5. 如果新增任务,追加到 [04-任务矩阵.md](./04-任务矩阵.md),不要复用已有任务编号。
|
||||
|
||||
## 快速入口
|
||||
|
||||
实际开发文件:
|
||||
|
||||
```text
|
||||
src/views/WarehouseManagement/InventoryCheck/index.vue
|
||||
sql/仓储管理_库存盘点_库存调拨.sql
|
||||
```
|
||||
|
||||
核心数据库对象:
|
||||
|
||||
```text
|
||||
库存盘点_调拨记录
|
||||
仓储管理_库存盘点_库存调拨
|
||||
```
|
||||
|
||||
202
docs/库存调拨/库存调拨功能开发说明.md
Normal file
@@ -0,0 +1,202 @@
|
||||
# 库存盘点组件库存调拨功能开发说明
|
||||
|
||||
## 01-功能内容
|
||||
|
||||
本次功能在库存盘点组件中增加轻量级“库存调拨”能力,应用页面为:
|
||||
|
||||
```text
|
||||
src/views/WarehouseManagement/InventoryCheck/index.vue
|
||||
```
|
||||
|
||||
功能目标:
|
||||
|
||||
- 在库存盘点列表每一行增加“调拨”操作。
|
||||
- 点击“调拨”后弹出库存调拨窗口。
|
||||
- 自动带出当前行物料名称、图号/型号、原库位、原库存数。
|
||||
- 支持选择已有目标库位。
|
||||
- 支持在弹窗中输入新库位名称,并一键新增库位。
|
||||
- 新增库位成功后自动刷新库位下拉,并回填为目标库位。
|
||||
- 输入调拨数量后,提交时从原库位库存数中扣减该数量。
|
||||
- 目标库位已有同物料库存时累加库存。
|
||||
- 目标库位没有同物料库存时新增物料货位库存记录。
|
||||
- 调拨成功后关闭弹窗并刷新库存盘点列表。
|
||||
- 后端保留调拨记录,记录调拨前后库存、原库位、目标库位、操作人和操作时间。
|
||||
|
||||
本次不做完整调拨单流程,不包含审批、打印、调出确认、调入确认、外协调拨和跨仓库复杂流转。
|
||||
|
||||
## 02-程序开发步骤
|
||||
|
||||
1. 梳理库存盘点页面现状:
|
||||
- 查询页面现有字段:`库存`、`货位流水号`、`货位名称`、`物料与货位流水号`。
|
||||
- 确认现有接口:`仓储管理_库存盘点_查询`、`仓储管理_库存盘点_货位数量_编辑数据`、`仓储管理_库存盘点_物料货位数量_增加数据`。
|
||||
|
||||
2. 梳理库位管理现有接口:
|
||||
- 查询库位:`仓储管理_库位_查询`。
|
||||
- 验证库位是否存在:`仓储管理_库位_验证是否存在`。
|
||||
- 新增库位:`仓储管理_库位_增加数据`。
|
||||
|
||||
3. 前端开发:
|
||||
- 在库存盘点表格操作列增加“调拨”按钮。
|
||||
- 新增 `transferDialogVisible`、`transferLocationAdding`、`transferSubmitting` 状态。
|
||||
- 新增 `transferForm` 表单对象。
|
||||
- 新增库存调拨弹窗。
|
||||
- 新增 `openTransfer(row)` 打开弹窗方法。
|
||||
- 新增 `handleTransferLocationChange(value)` 同步目标库位名称。
|
||||
- 新增 `selectTransferLocation(locationName)` 新库位新增后回填目标库位。
|
||||
- 新增 `addTransferLocation()` 一键新增库位。
|
||||
- 新增 `submitTransfer()` 提交调拨。
|
||||
|
||||
4. 后端设计:
|
||||
- 新增 SQL 脚本:`sql/仓储管理_库存盘点_库存调拨.sql`。
|
||||
- 新增调拨记录表:`库存盘点_调拨记录`。
|
||||
- 新增存储过程:`仓储管理_库存盘点_库存调拨`。
|
||||
- 存储过程使用事务,确保原库位扣减、目标库位增加、新增目标库存记录、累计库存更新、调拨记录写入同时成功或失败。
|
||||
|
||||
5. 数据库创建:
|
||||
- 已连接 SQL Server:`192.168.1.27`。
|
||||
- 已在数据库 `ERPTOOL_JY_20250826Back` 中执行脚本。
|
||||
- 已确认 `库存盘点_调拨记录` 和 `仓储管理_库存盘点_库存调拨` 创建成功。
|
||||
|
||||
## 03-推进台账
|
||||
|
||||
| 轮次 | 做了什么 | 改了哪些文件 | 验证了什么 | 下一步 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 1 | 生成初版库存调拨设计方案,偏完整调拨单流程 | `库存调拨功能设计方案.md` | 参考了仓储模块现有 `TransferQuery`、`InventoryQuery` | 根据实际应用场景收敛方案 |
|
||||
| 2 | 按用户补充场景重写方案,聚焦库存盘点组件内调拨 | `库存调拨功能设计方案.md` | 确认 `InventoryCheck/index.vue` 已有库存、库位和新增物料货位接口 | 开始前端开发 |
|
||||
| 3 | 开发前端调拨入口和弹窗 | `src/views/WarehouseManagement/InventoryCheck/index.vue` | Vue 模板解析输出 `template ok`,脚本解析输出 `script ok` | 设计后端原子调拨接口 |
|
||||
| 4 | 连接 SQL Server,读取相关存储过程和表结构 | 无代码文件变更 | 成功连接 `ERPTOOL_JY_20250826Back`,确认 SQL Server 2008;读取现有盘点、库位相关过程 | 编写调拨存储过程 |
|
||||
| 5 | 新增存储过程脚本,适配普通物料和通用件 | `sql/仓储管理_库存盘点_库存调拨.sql`、`src/views/WarehouseManagement/InventoryCheck/index.vue` | SQL `NOEXEC` 编译检查输出 `sql compile ok`;前端补传 `类型` 参数 | 创建数据库对象 |
|
||||
| 6 | 在数据库中创建调拨记录表和调拨存储过程 | 数据库对象:`库存盘点_调拨记录`、`仓储管理_库存盘点_库存调拨` | 查询 `sys.objects` 确认对象存在;查询参数和表字段确认结构 | 做页面联调和实际数据调拨测试 |
|
||||
| 7 | 按要求生成开发说明文档 | `库存调拨功能开发说明.md` | 汇总开发内容、验证证据、任务矩阵和决策记录 | 等待业务数据联调 |
|
||||
|
||||
## 04-任务矩阵
|
||||
|
||||
| 任务编号 | 任务名称 | 状态 | 验收标准 |
|
||||
| --- | --- | --- | --- |
|
||||
| INV-TR-001 | 明确应用场景 | 已完成 | 方案明确为库存盘点组件内调拨,不做完整调拨单 |
|
||||
| INV-TR-002 | 编写设计方案 | 已完成 | `库存调拨功能设计方案.md` 已按盘点调拨场景重写 |
|
||||
| INV-TR-003 | 增加表格调拨按钮 | 已完成 | `InventoryCheck/index.vue` 操作列出现“调拨”按钮 |
|
||||
| INV-TR-004 | 增加调拨弹窗 | 已完成 | 弹窗展示物料、图号、原库位、原库存数、目标库位、新库位、调拨数量、备注 |
|
||||
| INV-TR-005 | 支持选择目标库位 | 已完成 | 目标库位使用现有 `storageLocation` 下拉,变化时同步目标库位名称 |
|
||||
| INV-TR-006 | 支持一键新建库位 | 已完成 | 调用 `仓储管理_库位_验证是否存在` 和 `仓储管理_库位_增加数据`,成功后刷新并回填 |
|
||||
| INV-TR-007 | 调拨前端校验 | 已完成 | 校验库存流水号、库存大于 0、目标库位非空、目标库位不等于原库位、调拨数量合法 |
|
||||
| INV-TR-008 | 提交调拨接口调用 | 已完成 | 前端调用 `仓储管理_库存盘点_库存调拨`,传入调拨数量、目标库位、操作者、类型等参数 |
|
||||
| INV-TR-009 | 设计存储过程脚本 | 已完成 | `sql/仓储管理_库存盘点_库存调拨.sql` 已生成 |
|
||||
| INV-TR-010 | 创建调拨记录表 | 已完成 | 数据库中存在 `库存盘点_调拨记录` |
|
||||
| INV-TR-011 | 创建调拨存储过程 | 已完成 | 数据库中存在 `仓储管理_库存盘点_库存调拨` |
|
||||
| INV-TR-012 | SQL 编译检查 | 已完成 | `NOEXEC` 检查输出 `sql compile ok` |
|
||||
| INV-TR-013 | 前端模板和脚本基础检查 | 已完成 | 输出 `template ok`、`script ok` |
|
||||
| INV-TR-014 | 页面实际联调 | 待执行 | 在系统页面选择真实库存行,完成调拨并刷新列表 |
|
||||
| INV-TR-015 | 数据库调拨结果核对 | 待执行 | 原库位库存减少,目标库位库存增加或新增,累计库存保持正确,调拨记录写入 |
|
||||
|
||||
## 05-验收证据
|
||||
|
||||
### 5.1 数据库连接证据
|
||||
|
||||
连接 SQL Server 后返回:
|
||||
|
||||
```text
|
||||
DatabaseName=ERPTOOL_JY_20250826Back
|
||||
Version=Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (X64)
|
||||
```
|
||||
|
||||
### 5.2 SQL 编译证据
|
||||
|
||||
对 `sql/仓储管理_库存盘点_库存调拨.sql` 使用 `SET NOEXEC ON` 编译检查:
|
||||
|
||||
```text
|
||||
sql compile ok
|
||||
```
|
||||
|
||||
### 5.3 数据库对象创建证据
|
||||
|
||||
执行创建脚本后查询 `sys.objects`:
|
||||
|
||||
```text
|
||||
仓储管理_库存盘点_库存调拨 SQL_STORED_PROCEDURE
|
||||
库存盘点_调拨记录 USER_TABLE
|
||||
```
|
||||
|
||||
### 5.4 存储过程参数证据
|
||||
|
||||
查询 `sys.parameters`:
|
||||
|
||||
```text
|
||||
1 @物料与货位流水号 int
|
||||
2 @物料流水号 int
|
||||
3 @原货位流水号 int
|
||||
4 @目标货位流水号 int
|
||||
5 @调拨数量 float
|
||||
6 @原库存数 float
|
||||
7 @调拨备注 nvarchar
|
||||
8 @操作者 int
|
||||
9 @类型 nvarchar
|
||||
```
|
||||
|
||||
### 5.5 调拨记录表字段证据
|
||||
|
||||
查询 `INFORMATION_SCHEMA.COLUMNS`:
|
||||
|
||||
```text
|
||||
库存调拨流水号 int
|
||||
类型 nvarchar
|
||||
物料流水号 int
|
||||
原物料与货位流水号 int
|
||||
原货位流水号 int
|
||||
目标物料与货位流水号 int
|
||||
目标货位流水号 int
|
||||
调拨数量 float
|
||||
调拨前原库存 float
|
||||
调拨后原库存 float
|
||||
调拨前目标库存 float
|
||||
调拨后目标库存 float
|
||||
调拨备注 nvarchar
|
||||
操作人 int
|
||||
操作时间 datetime
|
||||
```
|
||||
|
||||
### 5.6 前端静态检查证据
|
||||
|
||||
使用 `vue-template-compiler` 和 Babel 对 `InventoryCheck/index.vue` 做基础解析,输出:
|
||||
|
||||
```text
|
||||
template ok
|
||||
script ok
|
||||
```
|
||||
|
||||
说明:命令因本机 Node 启动较慢触到超时边界,但成功输出了检查结果。
|
||||
|
||||
### 5.7 文件证据
|
||||
|
||||
新增/修改文件:
|
||||
|
||||
```text
|
||||
src/views/WarehouseManagement/InventoryCheck/index.vue
|
||||
sql/仓储管理_库存盘点_库存调拨.sql
|
||||
库存调拨功能设计方案.md
|
||||
库存调拨功能开发说明.md
|
||||
```
|
||||
|
||||
## 06-决策记录
|
||||
|
||||
| 决策编号 | 决策 | 原因 | 后续影响 |
|
||||
| --- | --- | --- | --- |
|
||||
| ADR-001 | 不做完整调拨单流程 | 用户明确应用场景是库存盘点组件内快速调拨 | 页面内弹窗完成,不新增调拨单页面 |
|
||||
| ADR-002 | 前端不拆成两次库存编辑请求 | 两次请求可能出现只扣不加或并发负库存 | 新增后端原子存储过程 |
|
||||
| ADR-003 | 调拨数量使用 `FLOAT` | 库存表 `货位存量` 是 `float`,旧编辑过程用 `int` 有丢小数风险 | 新过程支持小数库存调拨 |
|
||||
| ADR-004 | 通过 `物料与货位流水号` 反查物料/产品流水号 | `外购件库存_视图` 当前不返回 `物料流水号` | 前端传空也不影响后端执行 |
|
||||
| ADR-005 | 支持普通物料和通用件两套表 | 现有盘点编辑过程按 `类型 = 通用件` 区分半成品表和物料表 | 存储过程内部按 `@类型` 分支处理 |
|
||||
| ADR-006 | 调拨后原库位库存为 0 时保留记录 | 便于追溯,也符合盘点页库存可为 0 的现状 | 查询是否隐藏 0 库存由查询条件控制 |
|
||||
| ADR-007 | 一键新建库位复用现有库位接口 | 项目已有 `仓储管理_库位_验证是否存在` 和 `仓储管理_库位_增加数据` | 不重复新增库位存储过程 |
|
||||
| ADR-008 | 新增轻量调拨记录表 | 旧 `库存盘点_修改记录` 只能记录原库存更改,不记录目标库位和调拨前后目标库存 | 后续可扩展调拨记录查询 |
|
||||
| ADR-009 | 前端传 `类型` 参数 | 避免普通物料和通用件流水号存在歧义 | 后端能明确走正确库存对照表 |
|
||||
| ADR-010 | 暂不做页面截图/PDF | 当前任务聚焦开发和数据库对象创建,未启动本地页面联调 | 下一步实际页面验收时补截图证据 |
|
||||
|
||||
## 下一步建议
|
||||
|
||||
1. 在测试环境登录系统,进入库存盘点页面。
|
||||
2. 选择一条库存大于 0 的记录点击“调拨”。
|
||||
3. 选择已有库位进行调拨,验证原库位减少、目标库位增加。
|
||||
4. 输入新库位名称点击“新建”,验证库位新增后自动回填。
|
||||
5. 再执行一次调拨到新库位,验证目标库位新增库存记录。
|
||||
6. 查询 `库存盘点_调拨记录`,确认调拨记录写入完整。
|
||||
541
docs/库存调拨/库存调拨功能设计方案.md
Normal file
@@ -0,0 +1,541 @@
|
||||
# 库存盘点组件库存调拨功能设计方案
|
||||
|
||||
## 0. 需求背景
|
||||
|
||||
当前库存盘点页面 `src/views/WarehouseManagement/InventoryCheck/index.vue` 已支持查询物料库存、编辑库存数、选择库位,并已存在新增物料货位数量的相关接口。现场盘点时,经常会发现同一物料的实际库存需要从原库位拆分到另一个库位,例如:
|
||||
|
||||
- 盘点发现物料实际摆放到了新库位。
|
||||
- 原库位库存数量过多,需要拆一部分到新库位。
|
||||
- 系统中还没有目标库位,需要现场一键新建库位后立即调拨。
|
||||
- 需要保留原库位库存,只把输入的调拨数量从原库位扣掉,并增加到目标库位。
|
||||
|
||||
因此本次功能不设计完整调拨单流程,而是在“库存盘点”组件内增加轻量级库存调拨能力:选择一行库存,输入调拨数量,选择或新建目标库位,提交后直接完成原库位库存扣减和目标库位库存增加。
|
||||
|
||||
## 1. 设计目标
|
||||
|
||||
本功能面向库存盘点页面,核心目标如下:
|
||||
|
||||
- 在库存盘点表格行上增加“调拨”操作。
|
||||
- 调拨弹窗中自动带出当前物料、原库位、原库存数。
|
||||
- 支持选择已有目标库位。
|
||||
- 支持一键新建目标库位,并自动回填为调入库位。
|
||||
- 输入调拨数量后,提交时从原库位库存数中减掉该调拨数量。
|
||||
- 如果目标库位已有同物料库存,则目标库位库存数增加调拨数量。
|
||||
- 如果目标库位没有同物料库存,则新增一条物料与货位数量记录。
|
||||
- 调拨后刷新库存盘点列表,保持页面显示与数据库一致。
|
||||
|
||||
## 2. 功能范围
|
||||
|
||||
本次只处理库存盘点组件内的库位库存调整,不新增独立“库存调拨单”页面。
|
||||
|
||||
包含:
|
||||
|
||||
- 盘点列表行内调拨。
|
||||
- 一键新增库位。
|
||||
- 原库位扣减库存。
|
||||
- 目标库位增加库存。
|
||||
- 调拨操作记录。
|
||||
|
||||
不包含:
|
||||
|
||||
- 调拨单主表和明细表。
|
||||
- 调出确认、调入确认两段式流程。
|
||||
- 审批流程。
|
||||
- 跨仓库复杂调拨。
|
||||
- 打印调拨单。
|
||||
- 外协调拨。
|
||||
|
||||
## 3. 页面改造位置
|
||||
|
||||
现有页面:
|
||||
|
||||
```text
|
||||
src/views/WarehouseManagement/InventoryCheck/index.vue
|
||||
```
|
||||
|
||||
当前页面已有相关字段和接口:
|
||||
|
||||
- 表格字段:`库存`、`货位流水号`、`货位名称`、`物料与货位流水号`
|
||||
- 库位下拉查询:`仓储管理_库位_查询`
|
||||
- 盘点查询:`仓储管理_库存盘点_查询`
|
||||
- 库存编辑:`仓储管理_库存盘点_货位数量_编辑数据`
|
||||
- 新增物料货位数量验证:`仓储管理_库存盘点_物料货位数量_增加数据_验证是否存在`
|
||||
- 新增物料货位数量:`仓储管理_库存盘点_物料货位数量_增加数据`
|
||||
|
||||
## 4. 前端交互设计
|
||||
|
||||
### 4.1 表格增加操作按钮
|
||||
|
||||
在库存盘点表格操作列增加:
|
||||
|
||||
```text
|
||||
调拨
|
||||
```
|
||||
|
||||
按钮显示规则:
|
||||
|
||||
- 当前行 `物料与货位流水号` 存在时显示。
|
||||
- 当前行 `库存 > 0` 时允许点击。
|
||||
- 如果库存为 0,按钮禁用或点击提示“当前库位库存为0,不能调拨”。
|
||||
|
||||
建议按钮:
|
||||
|
||||
```html
|
||||
<el-button type="text" size="mini" @click="openTransfer(scope.row)">调拨</el-button>
|
||||
```
|
||||
|
||||
### 4.2 调拨弹窗
|
||||
|
||||
新增 `el-dialog`:
|
||||
|
||||
```text
|
||||
库存调拨
|
||||
```
|
||||
|
||||
弹窗字段:
|
||||
|
||||
| 字段 | 控件 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| 物料名称 | 文本 | 当前行带出,只读 |
|
||||
| 图号或型号 | 文本 | 当前行带出,只读 |
|
||||
| 原库位 | 文本 | 当前行 `货位名称`,只读 |
|
||||
| 原库存数 | 文本 | 当前行 `库存`,只读 |
|
||||
| 目标库位 | el-select | 选择已有库位 |
|
||||
| 新库位名称 | el-input | 一键新建库位时填写 |
|
||||
| 调拨数量 | el-input-number | 需要从原库位调出的数量 |
|
||||
| 调拨备注 | el-input | 可选 |
|
||||
|
||||
弹窗按钮:
|
||||
|
||||
- 新建库位
|
||||
- 确定调拨
|
||||
- 取消
|
||||
|
||||
### 4.3 一键新建库位
|
||||
|
||||
在调拨弹窗中增加“新建库位”小区域:
|
||||
|
||||
```text
|
||||
新库位名称 + 新建按钮
|
||||
```
|
||||
|
||||
用户输入新库位名称后点击“新建库位”:
|
||||
|
||||
1. 校验库位名称不能为空。
|
||||
2. 调用后端新增库位接口。
|
||||
3. 新增成功后重新查询库位下拉。
|
||||
4. 将新库位流水号自动赋值给 `transferForm.目标货位流水号`。
|
||||
5. 提示“库位新增成功”。
|
||||
|
||||
接口建议:
|
||||
|
||||
```js
|
||||
var Data = this.CreateData('12', '仓储管理_库位_增加', param)
|
||||
```
|
||||
|
||||
参数建议:
|
||||
|
||||
| 参数名 | 说明 |
|
||||
| --- | --- |
|
||||
| 货位名称 | 新库位名称 |
|
||||
| UserID | 当前用户 |
|
||||
| ModularID | 当前路由 |
|
||||
|
||||
如果后端已有通用库位新增接口,应优先复用现有接口,不重复新增存储过程。
|
||||
|
||||
## 5. 调拨业务规则
|
||||
|
||||
### 5.1 数量规则
|
||||
|
||||
调拨数量必须满足:
|
||||
|
||||
```text
|
||||
0 < 调拨数量 <= 原库存数
|
||||
```
|
||||
|
||||
前端校验:
|
||||
|
||||
```js
|
||||
if (Number(this.transferForm.调拨数量) <= 0) {
|
||||
this.$message.warning('调拨数量必须大于0')
|
||||
return
|
||||
}
|
||||
if (Number(this.transferForm.调拨数量) > Number(this.transferForm.原库存数)) {
|
||||
this.$message.warning('调拨数量不能大于原库存数')
|
||||
return
|
||||
}
|
||||
```
|
||||
|
||||
后端也必须重复校验,避免多人同时操作导致库存被扣成负数。
|
||||
|
||||
### 5.2 库位规则
|
||||
|
||||
目标库位必须满足:
|
||||
|
||||
- 目标库位不能为空。
|
||||
- 目标库位不能等于原库位。
|
||||
- 新建库位名称不能与已有库位重复。
|
||||
|
||||
### 5.3 库存更新规则
|
||||
|
||||
提交调拨后,后端一次性完成两个动作:
|
||||
|
||||
```text
|
||||
原库位库存 = 原库位库存 - 调拨数量
|
||||
目标库位库存 = 目标库位库存 + 调拨数量
|
||||
```
|
||||
|
||||
如果目标库位不存在该物料库存记录:
|
||||
|
||||
```text
|
||||
新增 物料 + 目标库位 的库存记录,库存数 = 调拨数量
|
||||
```
|
||||
|
||||
如果目标库位已存在该物料库存记录:
|
||||
|
||||
```text
|
||||
更新目标库位库存数,库存数 = 原目标库位库存数 + 调拨数量
|
||||
```
|
||||
|
||||
### 5.4 原库位库存为 0 的处理
|
||||
|
||||
调拨后如果原库位库存变为 0,建议保留该物料货位记录,并显示库存为 0。
|
||||
|
||||
原因:
|
||||
|
||||
- 便于追溯原库位曾经存在该物料。
|
||||
- 避免删除记录影响历史盘点记录。
|
||||
- 与当前盘点页面“库存数可为 0”的逻辑一致。
|
||||
|
||||
如果现场明确要求隐藏 0 库存,可以在查询接口中过滤,不建议物理删除。
|
||||
|
||||
## 6. 数据字段设计
|
||||
|
||||
### 6.1 前端弹窗对象
|
||||
|
||||
建议新增:
|
||||
|
||||
```js
|
||||
transferForm: {
|
||||
物料与货位流水号: '',
|
||||
物料流水号: '',
|
||||
物料名称: '',
|
||||
图号或型号: '',
|
||||
原货位流水号: '',
|
||||
原货位名称: '',
|
||||
原库存数: 0,
|
||||
目标货位流水号: '',
|
||||
目标货位名称: '',
|
||||
新货位名称: '',
|
||||
调拨数量: 1,
|
||||
调拨备注: ''
|
||||
}
|
||||
```
|
||||
|
||||
### 6.2 后端调拨接口参数
|
||||
|
||||
建议新增一个原子接口,避免前端连续调用两个编辑接口导致只扣不加或只加不扣。
|
||||
|
||||
接口:
|
||||
|
||||
```js
|
||||
var Data = this.CreateData('12', '仓储管理_库存盘点_库存调拨', param)
|
||||
```
|
||||
|
||||
参数:
|
||||
|
||||
| 参数名 | 说明 |
|
||||
| --- | --- |
|
||||
| 物料与货位流水号 | 原库存记录流水号 |
|
||||
| 物料流水号 | 当前物料流水号 |
|
||||
| 原货位流水号 | 原库位流水号 |
|
||||
| 目标货位流水号 | 目标库位流水号 |
|
||||
| 调拨数量 | 本次调拨数量 |
|
||||
| 原库存数 | 页面带出的原库存数,仅用于校验参考 |
|
||||
| 调拨备注 | 调拨备注 |
|
||||
| 操作人 | UserID |
|
||||
|
||||
后端处理必须放在同一个事务中:
|
||||
|
||||
1. 查询原库存记录,并锁定或重新校验当前库存。
|
||||
2. 校验当前库存是否大于等于调拨数量。
|
||||
3. 扣减原库位库存。
|
||||
4. 查询目标库位是否已有同物料记录。
|
||||
5. 有则累加目标库位库存。
|
||||
6. 无则新增目标库位库存记录。
|
||||
7. 写入库存调拨记录。
|
||||
8. 返回成功。
|
||||
|
||||
## 7. 调拨记录设计
|
||||
|
||||
建议新增轻量级调拨记录表,便于盘点后追溯谁把多少库存从哪个库位调到哪个库位。
|
||||
|
||||
字段建议:
|
||||
|
||||
| 字段名 | 说明 |
|
||||
| --- | --- |
|
||||
| 库存调拨流水号 | 主键 |
|
||||
| 物料流水号 | 物料流水号 |
|
||||
| 物料名称 | 冗余名称,便于查询 |
|
||||
| 图号或型号 | 冗余图号 |
|
||||
| 原物料与货位流水号 | 原库存记录 |
|
||||
| 原货位流水号 | 原库位 |
|
||||
| 原货位名称 | 原库位名称 |
|
||||
| 目标物料与货位流水号 | 目标库存记录 |
|
||||
| 目标货位流水号 | 目标库位 |
|
||||
| 目标货位名称 | 目标库位名称 |
|
||||
| 调拨数量 | 调拨数量 |
|
||||
| 调拨前原库存 | 扣减前原库位库存 |
|
||||
| 调拨后原库存 | 扣减后原库位库存 |
|
||||
| 调拨前目标库存 | 增加前目标库位库存 |
|
||||
| 调拨后目标库存 | 增加后目标库位库存 |
|
||||
| 调拨备注 | 备注 |
|
||||
| 操作人 | UserID |
|
||||
| 操作时间 | 调拨时间 |
|
||||
|
||||
查询接口建议:
|
||||
|
||||
```js
|
||||
var Data = this.CreateData('11', '仓储管理_库存盘点_库存调拨记录_查询', param, this.pageSize, this.pageCurrent)
|
||||
```
|
||||
|
||||
第一版可以不新增独立页面,只在库存盘点页面增加“调拨记录”按钮或弹窗。
|
||||
|
||||
## 8. API 设计
|
||||
|
||||
### 8.1 查询库位
|
||||
|
||||
沿用现有:
|
||||
|
||||
```js
|
||||
var Data = this.CreateData('11', '仓储管理_库位_查询', param)
|
||||
```
|
||||
|
||||
### 8.2 新增库位
|
||||
|
||||
建议新增或复用:
|
||||
|
||||
```js
|
||||
var Data = this.CreateData('12', '仓储管理_库位_增加', param)
|
||||
```
|
||||
|
||||
参数:
|
||||
|
||||
| 参数名 | 说明 |
|
||||
| --- | --- |
|
||||
| 货位名称 | 新库位名称 |
|
||||
| 备注 | 可选 |
|
||||
| UserID | 当前用户 |
|
||||
|
||||
返回:
|
||||
|
||||
| 字段 | 说明 |
|
||||
| --- | --- |
|
||||
| result | 是否成功 |
|
||||
| 货位流水号 | 新增库位流水号 |
|
||||
| 货位名称 | 新增库位名称 |
|
||||
|
||||
### 8.3 库存调拨
|
||||
|
||||
建议新增:
|
||||
|
||||
```js
|
||||
var Data = this.CreateData('12', '仓储管理_库存盘点_库存调拨', param)
|
||||
```
|
||||
|
||||
这是本功能最核心接口,必须由后端事务保证扣减和增加同时成功或同时失败。
|
||||
|
||||
### 8.4 调拨记录查询
|
||||
|
||||
建议新增:
|
||||
|
||||
```js
|
||||
var Data = this.CreateData('11', '仓储管理_库存盘点_库存调拨记录_查询', param, this.pageSize, this.pageCurrent)
|
||||
```
|
||||
|
||||
查询参数:
|
||||
|
||||
| 参数名 | 说明 |
|
||||
| --- | --- |
|
||||
| 物料名称_check | 是否按物料名称查询 |
|
||||
| 物料名称 | 物料名称 |
|
||||
| 图号或型号_check | 是否按图号查询 |
|
||||
| 图号或型号 | 图号或型号 |
|
||||
| 原货位流水号_check | 是否按原库位查询 |
|
||||
| 原货位流水号 | 原库位 |
|
||||
| 目标货位流水号_check | 是否按目标库位查询 |
|
||||
| 目标货位流水号 | 目标库位 |
|
||||
| 操作时间_check | 是否按时间查询 |
|
||||
| 开始时间 | 开始时间 |
|
||||
| 结束时间 | 结束时间 |
|
||||
|
||||
## 9. 前端方法设计
|
||||
|
||||
### 9.1 打开调拨弹窗
|
||||
|
||||
```js
|
||||
openTransfer(row) {
|
||||
if (Number(row.库存) <= 0) {
|
||||
this.$message.warning('当前库位库存为0,不能调拨')
|
||||
return
|
||||
}
|
||||
this.transferForm.物料与货位流水号 = row.物料与货位流水号
|
||||
this.transferForm.物料流水号 = row.物料流水号
|
||||
this.transferForm.物料名称 = row.物料名称
|
||||
this.transferForm.图号或型号 = row.图号或型号
|
||||
this.transferForm.原货位流水号 = row.货位流水号
|
||||
this.transferForm.原货位名称 = row.货位名称
|
||||
this.transferForm.原库存数 = Number(row.库存)
|
||||
this.transferForm.目标货位流水号 = ''
|
||||
this.transferForm.目标货位名称 = ''
|
||||
this.transferForm.新货位名称 = ''
|
||||
this.transferForm.调拨数量 = 1
|
||||
this.transferForm.调拨备注 = ''
|
||||
this.transferDialogVisible = true
|
||||
}
|
||||
```
|
||||
|
||||
### 9.2 新建库位
|
||||
|
||||
```js
|
||||
addTransferLocation() {
|
||||
if (!this.transferForm.新货位名称) {
|
||||
this.$message.warning('请输入新库位名称')
|
||||
return
|
||||
}
|
||||
var param = []
|
||||
param[0] = ['货位名称', this.transferForm.新货位名称]
|
||||
var Data = this.CreateData('12', '仓储管理_库位_增加', param)
|
||||
this.ExecDatabase(Data).then(response => {
|
||||
if (response.data && response.data.length > 0) {
|
||||
this.getStorageLocation()
|
||||
this.transferForm.目标货位流水号 = response.data[0].货位流水号
|
||||
this.$message.success('库位新增成功')
|
||||
}
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
说明:具体返回结构以现有后端为准,若只返回成功标识,则新增后通过库位名称重新查询并回填。
|
||||
|
||||
### 9.3 提交调拨
|
||||
|
||||
```js
|
||||
submitTransfer() {
|
||||
if (!this.transferForm.目标货位流水号) {
|
||||
this.$message.warning('请选择目标库位')
|
||||
return
|
||||
}
|
||||
if (this.transferForm.目标货位流水号 === this.transferForm.原货位流水号) {
|
||||
this.$message.warning('目标库位不能与原库位相同')
|
||||
return
|
||||
}
|
||||
if (Number(this.transferForm.调拨数量) <= 0) {
|
||||
this.$message.warning('调拨数量必须大于0')
|
||||
return
|
||||
}
|
||||
if (Number(this.transferForm.调拨数量) > Number(this.transferForm.原库存数)) {
|
||||
this.$message.warning('调拨数量不能大于原库存数')
|
||||
return
|
||||
}
|
||||
|
||||
var param = []
|
||||
param[0] = ['物料与货位流水号', this.transferForm.物料与货位流水号]
|
||||
param[1] = ['物料流水号', this.transferForm.物料流水号]
|
||||
param[2] = ['原货位流水号', this.transferForm.原货位流水号]
|
||||
param[3] = ['目标货位流水号', this.transferForm.目标货位流水号]
|
||||
param[4] = ['调拨数量', this.transferForm.调拨数量]
|
||||
param[5] = ['原库存数', this.transferForm.原库存数]
|
||||
param[6] = ['调拨备注', this.transferForm.调拨备注]
|
||||
var Data = this.CreateData('12', '仓储管理_库存盘点_库存调拨', param)
|
||||
this.ExecDatabase(Data).then(response => {
|
||||
this.$message.success('调拨成功')
|
||||
this.transferDialogVisible = false
|
||||
this.searchTable()
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
## 10. 后端事务逻辑
|
||||
|
||||
后端存储过程建议逻辑:
|
||||
|
||||
```text
|
||||
开始事务
|
||||
查询原物料货位库存记录
|
||||
如果不存在,返回“原库存记录不存在”
|
||||
如果当前库存 < 调拨数量,返回“库存不足”
|
||||
如果原货位流水号 = 目标货位流水号,返回“目标库位不能与原库位相同”
|
||||
|
||||
更新原库位库存 = 当前库存 - 调拨数量
|
||||
|
||||
查询目标货位是否存在同物料库存记录
|
||||
如果存在:
|
||||
更新目标库位库存 = 当前目标库存 + 调拨数量
|
||||
如果不存在:
|
||||
新增目标货位库存记录,库存 = 调拨数量
|
||||
|
||||
写入库存调拨记录
|
||||
提交事务
|
||||
```
|
||||
|
||||
任何一步失败必须回滚,避免库存只扣不加。
|
||||
|
||||
## 11. 与现有编辑库存功能的关系
|
||||
|
||||
当前库存盘点页面已有“编辑库存数”和“编辑库位”的能力:
|
||||
|
||||
```js
|
||||
var Data = this.CreateData('12', '仓储管理_库存盘点_货位数量_编辑数据', param)
|
||||
```
|
||||
|
||||
新调拨功能不建议复用前端两次调用该接口来完成扣减和增加,因为:
|
||||
|
||||
- 两次请求中间失败会造成库存不一致。
|
||||
- 多人并发时容易出现负库存。
|
||||
- 目标库位不存在同物料记录时还需要新增记录。
|
||||
|
||||
因此建议新增一个后端原子接口:
|
||||
|
||||
```text
|
||||
仓储管理_库存盘点_库存调拨
|
||||
```
|
||||
|
||||
该接口内部统一完成扣减、增加、新增目标记录、写调拨记录。
|
||||
|
||||
## 12. 实施步骤
|
||||
|
||||
1. 后端新增或确认库位新增接口:`仓储管理_库位_增加`。
|
||||
2. 后端新增库存调拨接口:`仓储管理_库存盘点_库存调拨`。
|
||||
3. 后端新增库存调拨记录表。
|
||||
4. 后端新增库存调拨记录查询接口。
|
||||
5. 前端 `InventoryCheck/index.vue` 增加“调拨”按钮。
|
||||
6. 前端增加调拨弹窗和 `transferForm`。
|
||||
7. 前端增加“一键新建库位”方法。
|
||||
8. 前端增加“确定调拨”方法。
|
||||
9. 调拨成功后调用 `searchTable()` 刷新盘点列表。
|
||||
10. 联调库存扣减、目标库位增加、目标库位不存在时新增记录。
|
||||
|
||||
## 13. 风险点
|
||||
|
||||
### 13.1 并发扣减风险
|
||||
|
||||
盘点期间多人可能同时调拨同一库位库存。后端必须以数据库当前库存为准,不能只相信前端传入的 `原库存数`。
|
||||
|
||||
### 13.2 目标库位重复风险
|
||||
|
||||
一键新建库位时需要校验 `货位名称` 是否已存在。若已存在,应直接提示或返回已有库位,不应重复新增同名库位。
|
||||
|
||||
### 13.3 只扣不加风险
|
||||
|
||||
调拨不能由前端拆成“编辑原库存”和“新增目标库存”两个独立请求。必须由一个后端事务接口完成。
|
||||
|
||||
### 13.4 数据追溯风险
|
||||
|
||||
虽然不做完整调拨单,也必须保留调拨记录,记录调拨前后库存、原库位、目标库位、操作人和时间。
|
||||
|
||||
## 14. 总结
|
||||
|
||||
本方案将库存调拨限定在库存盘点组件内,采用“行内调拨弹窗 + 一键新建库位 + 后端事务扣减/增加库存”的轻量设计。用户在盘点时选择一行库存,输入调拨数量和目标库位,系统直接将调拨数量从原库位库存中减掉,并增加到目标库位库存中。
|
||||
|
||||
关键点是新增一个原子后端接口 `仓储管理_库存盘点_库存调拨`,避免前端多次请求造成库存不一致。同时保留调拨记录,满足后续盘点追溯。
|
||||
BIN
docs/库房管理/dataflow_charts/01_数据流总览.png
Normal file
|
After Width: | Height: | Size: 98 KiB |
BIN
docs/库房管理/dataflow_charts/02_主数据流.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
docs/库房管理/dataflow_charts/03_入库数据流.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
docs/库房管理/dataflow_charts/04_出库数据流.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
docs/库房管理/dataflow_charts/05_移库数据流.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
docs/库房管理/dataflow_charts/06_盘点数据流.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
docs/库房管理/dataflow_charts/07_综合查询数据流.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
docs/库房管理/dataflow_charts/08_正向查询数据流.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
docs/库房管理/dataflow_charts/09_逆向查询数据流.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
docs/库房管理/dataflow_charts/10_前端页面数据流.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
docs/库房管理/实施计划_补充完善版.docx
Normal file
BIN
docs/库房管理/实施计划_补充完善版_含库房管理界面.docx
Normal file
BIN
docs/库房管理/库房管理实施方案.docx
Normal file
885
docs/库房管理/库房管理实施方案.md
Normal file
@@ -0,0 +1,885 @@
|
||||
# 库房管理模块实施方案
|
||||
|
||||
## 1. 建设目标
|
||||
|
||||
本方案用于先把库房管理业务闭环走通,再进入前端页面、后端接口和 SQL 脚本开发。第一版建设范围包括:
|
||||
|
||||
1. 库房管理模块。
|
||||
2. 库房对应库位管理。
|
||||
3. 物料入库、出库、退库、移库、调拨等库存变动。
|
||||
4. 物料盘点、盘盈、盘亏、差异确认。
|
||||
5. 物料综合查询。
|
||||
6. 物料正向查询和逆向查询:查物料在哪些库位,也查某个库位放置了哪些物料。
|
||||
|
||||
核心原则:真实库存必须落到具体库房、具体库位、具体物料,所有库存数量变化都必须通过业务单据和库存流水产生,不允许只修改结果表而不留变动记录。
|
||||
|
||||
## 2. 总体业务架构
|
||||
|
||||
### 2.1 主数据
|
||||
|
||||
库房管理依赖以下主数据:
|
||||
|
||||
| 主数据 | 说明 | 维护入口 |
|
||||
| --- | --- | --- |
|
||||
| 库房 | 仓储空间的一级单位,如一楼仓库、三楼仓库、外协暂存库 | 新增库房管理页面 |
|
||||
| 库位 | 库房下的具体存放位置,如 A01-01、B02-03 | 新增或复用货位管理页面 |
|
||||
| 物料 | 现有物料主文件,字段包含物料编码、物料名称、图号或型号、规格、单位等 | 现有物料维护 |
|
||||
| 库存现存量 | 某物料在某库房、某库位的当前库存数量 | 由出入库、盘点、调拨自动维护 |
|
||||
| 库存变动流水 | 每一次入库、出库、盘点、调拨产生的数量变化记录 | 由业务单据自动写入 |
|
||||
|
||||
### 2.2 单据数据
|
||||
|
||||
| 单据 | 说明 | 影响库存 |
|
||||
| --- | --- | --- |
|
||||
| 入库单 | 采购件、自制件、退料、其他入库 | 增加指定库位库存 |
|
||||
| 出库单 | 领料、生产出库、销售出库、其他出库 | 减少指定库位库存 |
|
||||
| 移库单 | 同库房或跨库房从一个库位移动到另一个库位 | 原库位减少,目标库位增加 |
|
||||
| 盘点单 | 按库房、库位、物料生成盘点任务并录入实盘数量 | 差异确认后调整库存 |
|
||||
| 库存调整单 | 非盘点场景的库存调整,需权限控制 | 按调整方向增减库存 |
|
||||
|
||||
## 3. 业务流程设计
|
||||
|
||||
### 3.1 库房与库位建档流程
|
||||
|
||||
1. 仓库主管新增库房,维护库房编号、库房名称、库房类型、负责人、启用状态。
|
||||
2. 在库房下新增库位,维护库位编号、库位名称、库区、货架、层号、容量、是否允许混放、启用状态。
|
||||
3. 系统校验同一库房下库位编号唯一。
|
||||
4. 已发生库存业务的库位不允许物理删除,只允许停用。
|
||||
5. 停用库位如果仍有库存,禁止停用或提示先完成移库。
|
||||
|
||||
### 3.2 入库流程
|
||||
|
||||
1. 用户选择入库来源:采购入库、自制件入库、退料入库、其他入库。
|
||||
2. 系统带出物料、批次、供应商、订单或生产任务等来源信息。
|
||||
3. 仓库人员选择实际上架库房和库位。
|
||||
4. 系统校验库房、库位启用状态,校验数量大于 0。
|
||||
5. 提交后写入入库单主表、入库单明细表。
|
||||
6. 同一事务内更新库存现存量:
|
||||
- 如果该物料、批次、库位已存在库存记录,则累加库存数量。
|
||||
- 如果不存在,则新增库存现存量记录。
|
||||
7. 写入库存变动流水,变动类型为“入库”,变动数量为正数。
|
||||
|
||||
### 3.3 出库流程
|
||||
|
||||
1. 用户选择出库来源:领料单、生产任务、销售发货、其他出库。
|
||||
2. 系统按物料查询可用库存,展示该物料在哪些库房、库位有库存。
|
||||
3. 仓库人员选择出库库位和出库数量。
|
||||
4. 系统校验出库数量必须小于等于该库位可用库存。
|
||||
5. 提交后写入出库单主表、出库单明细表。
|
||||
6. 同一事务内扣减库存现存量。
|
||||
7. 写入库存变动流水,变动类型为“出库”,变动数量为负数。
|
||||
8. 如果库存扣减后为 0,保留库存现存量记录,便于追溯历史库位;查询时可默认过滤 0 库存。
|
||||
|
||||
### 3.4 移库和调拨流程
|
||||
|
||||
移库用于同一库房或不同库房之间调整物料位置。
|
||||
|
||||
1. 用户选择需要移动的物料库存记录。
|
||||
2. 系统带出原库房、原库位、当前库存。
|
||||
3. 用户选择目标库房、目标库位和移库数量。
|
||||
4. 系统校验移库数量大于 0 且不超过原库位库存。
|
||||
5. 提交后写入移库单主表、移库单明细表。
|
||||
6. 同一事务内扣减原库位库存、增加目标库位库存。
|
||||
7. 写入两条库存变动流水:
|
||||
- 原库位“移出”,数量为负数。
|
||||
- 目标库位“移入”,数量为正数。
|
||||
|
||||
### 3.5 盘点流程
|
||||
|
||||
1. 仓库主管创建盘点单,选择盘点库房、库位范围、物料范围。
|
||||
2. 系统按当前库存现存量生成盘点明细,记录账面数量。
|
||||
3. 盘点人员录入实盘数量,也可补录账面不存在但现场存在的物料和库位。
|
||||
4. 系统计算差异数量:差异数量 = 实盘数量 - 账面数量。
|
||||
5. 无差异明细可直接确认。
|
||||
6. 有差异明细需要仓库主管确认差异原因。
|
||||
7. 确认后生成库存调整:
|
||||
- 盘盈:增加库存。
|
||||
- 盘亏:减少库存。
|
||||
8. 写入库存变动流水,变动类型为“盘盈”或“盘亏”。
|
||||
9. 盘点单状态流转为:草稿、盘点中、待确认、已确认、已作废。
|
||||
|
||||
### 3.6 物料综合查询流程
|
||||
|
||||
物料综合查询用于按物料维度查看当前库存、库位分布和出入库历史。
|
||||
|
||||
查询条件:
|
||||
|
||||
| 条件 | 说明 |
|
||||
| --- | --- |
|
||||
| 物料编码 | 精确或模糊查询 |
|
||||
| 物料名称 | 模糊查询 |
|
||||
| 图号或型号 | 模糊查询 |
|
||||
| 规格 | 模糊查询 |
|
||||
| 库房 | 按库房过滤 |
|
||||
| 库位 | 按库位过滤 |
|
||||
| 是否只看有库存 | 默认是 |
|
||||
|
||||
返回内容:
|
||||
|
||||
| 信息 | 说明 |
|
||||
| --- | --- |
|
||||
| 物料基础信息 | 编码、名称、图号、规格、单位 |
|
||||
| 总库存 | 该物料所有库位库存合计 |
|
||||
| 主库位 | 库存数量最大的库位,用于快速定位 |
|
||||
| 库位明细 | 每个库位的库存数量 |
|
||||
| 最近入库 | 最近一次入库时间、数量、来源单号 |
|
||||
| 最近出库 | 最近一次出库时间、数量、来源单号 |
|
||||
|
||||
### 3.7 正向查询和逆向查询
|
||||
|
||||
正向查询:物料在哪些库位。
|
||||
|
||||
1. 输入物料编码、物料名称、图号或型号。
|
||||
2. 系统查询库存现存量表。
|
||||
3. 返回该物料所有库存大于 0 的库房、库位、批次、库存数量。
|
||||
4. 支持点击库位查看该库位其他物料。
|
||||
|
||||
逆向查询:某库位放置哪些物料。
|
||||
|
||||
1. 选择库房和库位。
|
||||
2. 系统查询该库位所有库存大于 0 的物料。
|
||||
3. 返回物料编码、物料名称、图号或型号、规格、批次、库存数量。
|
||||
4. 支持点击物料反查该物料在其他库位的分布。
|
||||
|
||||
## 4. 表结构设计
|
||||
|
||||
以下为推荐新表或标准化表结构。若数据库中已有同名或相近表,应优先复用现有表,并通过新增字段、视图或存储过程兼容现有业务。
|
||||
|
||||
### 4.1 库房主表
|
||||
|
||||
表名:`仓储管理_库房主表`
|
||||
|
||||
| 字段名 | 类型 | 必填 | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| 库房流水号 | int identity | 是 | 主键 |
|
||||
| 库房编号 | nvarchar(50) | 是 | 业务编号,唯一 |
|
||||
| 库房名称 | nvarchar(100) | 是 | 库房名称 |
|
||||
| 库房类型 | nvarchar(50) | 否 | 原料库、成品库、半成品库、暂存库等 |
|
||||
| 地址 | nvarchar(200) | 否 | 库房位置 |
|
||||
| 负责人流水号 | int | 否 | 对应人员表 |
|
||||
| 负责人 | nvarchar(50) | 否 | 冗余显示 |
|
||||
| 联系电话 | nvarchar(50) | 否 | 联系方式 |
|
||||
| 是否启用 | bit | 是 | 默认 1 |
|
||||
| 排序号 | int | 否 | 页面排序 |
|
||||
| 备注 | nvarchar(500) | 否 | 备注 |
|
||||
| 创建人 | int | 是 | UserID |
|
||||
| 创建时间 | datetime | 是 | 默认 GETDATE() |
|
||||
| 修改人 | int | 否 | UserID |
|
||||
| 修改时间 | datetime | 否 | 修改时间 |
|
||||
|
||||
主键:`PK_仓储管理_库房主表`,字段 `库房流水号`。
|
||||
|
||||
唯一约束:`UK_仓储管理_库房主表_库房编号`,字段 `库房编号`。
|
||||
|
||||
### 4.2 库位主表
|
||||
|
||||
表名:`仓储管理_库位主表`
|
||||
|
||||
| 字段名 | 类型 | 必填 | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| 库位流水号 | int identity | 是 | 主键 |
|
||||
| 库房流水号 | int | 是 | 外键,关联库房 |
|
||||
| 库位编号 | nvarchar(50) | 是 | 同一库房下唯一 |
|
||||
| 库位名称 | nvarchar(100) | 是 | 页面显示名称 |
|
||||
| 库区 | nvarchar(50) | 否 | 如 A 区、B 区 |
|
||||
| 货架 | nvarchar(50) | 否 | 货架编号 |
|
||||
| 层号 | nvarchar(50) | 否 | 货架层号 |
|
||||
| 容量 | decimal(18,4) | 否 | 可选容量 |
|
||||
| 容量单位 | nvarchar(20) | 否 | 件、箱、kg 等 |
|
||||
| 是否允许混放 | bit | 是 | 默认 1 |
|
||||
| 是否启用 | bit | 是 | 默认 1 |
|
||||
| 备注 | nvarchar(500) | 否 | 备注 |
|
||||
| 创建人 | int | 是 | UserID |
|
||||
| 创建时间 | datetime | 是 | 默认 GETDATE() |
|
||||
| 修改人 | int | 否 | UserID |
|
||||
| 修改时间 | datetime | 否 | 修改时间 |
|
||||
|
||||
主键:`PK_仓储管理_库位主表`,字段 `库位流水号`。
|
||||
|
||||
外键:`FK_仓储管理_库位主表_库房`,`库房流水号` 关联 `仓储管理_库房主表.库房流水号`。
|
||||
|
||||
唯一约束:`UK_仓储管理_库位主表_库房库位编号`,字段 `库房流水号、库位编号`。
|
||||
|
||||
### 4.3 库存现存量表
|
||||
|
||||
表名:`仓储管理_库存现存量`
|
||||
|
||||
| 字段名 | 类型 | 必填 | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| 库存流水号 | bigint identity | 是 | 主键 |
|
||||
| 物料流水号 | int | 是 | 关联物料主文件 |
|
||||
| 物料编码 | nvarchar(100) | 否 | 冗余字段,便于查询 |
|
||||
| 物料名称 | nvarchar(200) | 是 | 冗余字段 |
|
||||
| 图号或型号 | nvarchar(200) | 否 | 冗余字段 |
|
||||
| 规格 | nvarchar(200) | 否 | 冗余字段 |
|
||||
| 单位 | nvarchar(50) | 否 | 冗余字段 |
|
||||
| 库房流水号 | int | 是 | 外键,关联库房 |
|
||||
| 库位流水号 | int | 是 | 外键,关联库位 |
|
||||
| 批次编号 | nvarchar(100) | 否 | 有批次管理时必填 |
|
||||
| 库存数量 | decimal(18,4) | 是 | 当前库存数量 |
|
||||
| 冻结数量 | decimal(18,4) | 是 | 默认 0 |
|
||||
| 可用数量 | AS | 否 | 建议计算列:库存数量 - 冻结数量 |
|
||||
| 最后入库时间 | datetime | 否 | 最近入库时间 |
|
||||
| 最后出库时间 | datetime | 否 | 最近出库时间 |
|
||||
| 最后变动时间 | datetime | 是 | 最近库存变化时间 |
|
||||
| 状态 | nvarchar(20) | 是 | 正常、冻结、停用 |
|
||||
| 创建人 | int | 是 | UserID |
|
||||
| 创建时间 | datetime | 是 | 默认 GETDATE() |
|
||||
| 修改人 | int | 否 | UserID |
|
||||
| 修改时间 | datetime | 否 | 修改时间 |
|
||||
|
||||
主键:`PK_仓储管理_库存现存量`,字段 `库存流水号`。
|
||||
|
||||
外键:
|
||||
|
||||
| 外键 | 字段 | 关联表 |
|
||||
| --- | --- | --- |
|
||||
| FK_仓储管理_库存现存量_库房 | 库房流水号 | 仓储管理_库房主表.库房流水号 |
|
||||
| FK_仓储管理_库存现存量_库位 | 库位流水号 | 仓储管理_库位主表.库位流水号 |
|
||||
| FK_仓储管理_库存现存量_物料 | 物料流水号 | 库存管理_物料主文件_基本.物料流水号 |
|
||||
|
||||
唯一约束:`UK_仓储管理_库存现存量_物料库位批次`,字段 `物料流水号、库位流水号、批次编号`。如果批次允许为空,需要在存储过程中统一把空批次处理为固定空值,避免 SQL Server 唯一约束对 NULL 的差异影响。
|
||||
|
||||
### 4.4 库存变动流水表
|
||||
|
||||
表名:`仓储管理_库存变动流水`
|
||||
|
||||
| 字段名 | 类型 | 必填 | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| 库存变动流水号 | bigint identity | 是 | 主键 |
|
||||
| 库存流水号 | bigint | 否 | 关联库存现存量 |
|
||||
| 业务类型 | nvarchar(50) | 是 | 入库、出库、退库、移库、盘盈、盘亏、调整 |
|
||||
| 业务单号 | nvarchar(100) | 否 | 入库单号、出库单号、盘点单号等 |
|
||||
| 业务主表流水号 | bigint | 否 | 来源主表流水号 |
|
||||
| 业务明细流水号 | bigint | 否 | 来源明细流水号 |
|
||||
| 物料流水号 | int | 是 | 物料 |
|
||||
| 物料编码 | nvarchar(100) | 否 | 冗余 |
|
||||
| 物料名称 | nvarchar(200) | 是 | 冗余 |
|
||||
| 图号或型号 | nvarchar(200) | 否 | 冗余 |
|
||||
| 库房流水号 | int | 是 | 变动发生库房 |
|
||||
| 库位流水号 | int | 是 | 变动发生库位 |
|
||||
| 批次编号 | nvarchar(100) | 否 | 批次 |
|
||||
| 变动前数量 | decimal(18,4) | 是 | 变动前库存 |
|
||||
| 变动数量 | decimal(18,4) | 是 | 入库为正,出库为负 |
|
||||
| 变动后数量 | decimal(18,4) | 是 | 变动后库存 |
|
||||
| 对方库房流水号 | int | 否 | 移库时使用 |
|
||||
| 对方库位流水号 | int | 否 | 移库时使用 |
|
||||
| 操作人 | int | 是 | UserID |
|
||||
| 操作时间 | datetime | 是 | 默认 GETDATE() |
|
||||
| 备注 | nvarchar(500) | 否 | 备注 |
|
||||
|
||||
主键:`PK_仓储管理_库存变动流水`,字段 `库存变动流水号`。
|
||||
|
||||
索引:
|
||||
|
||||
| 索引 | 字段 | 用途 |
|
||||
| --- | --- | --- |
|
||||
| IX_库存变动流水_物料时间 | 物料流水号、操作时间 | 物料追溯 |
|
||||
| IX_库存变动流水_库位时间 | 库位流水号、操作时间 | 库位追溯 |
|
||||
| IX_库存变动流水_业务单据 | 业务类型、业务主表流水号、业务明细流水号 | 单据追溯 |
|
||||
|
||||
### 4.5 入库单主表
|
||||
|
||||
表名:`仓储管理_入库单主表`
|
||||
|
||||
| 字段名 | 类型 | 必填 | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| 入库单流水号 | bigint identity | 是 | 主键 |
|
||||
| 入库单号 | nvarchar(100) | 是 | 业务单号 |
|
||||
| 入库类型 | nvarchar(50) | 是 | 采购入库、自制件入库、退料入库、其他入库 |
|
||||
| 来源单号 | nvarchar(100) | 否 | 采购合同、生产任务等 |
|
||||
| 供应商 | nvarchar(200) | 否 | 采购入库时使用 |
|
||||
| 入库人 | int | 是 | UserID |
|
||||
| 入库日期 | datetime | 是 | 入库时间 |
|
||||
| 状态 | nvarchar(20) | 是 | 草稿、已入库、已作废 |
|
||||
| 备注 | nvarchar(500) | 否 | 备注 |
|
||||
| 创建人 | int | 是 | UserID |
|
||||
| 创建时间 | datetime | 是 | 默认 GETDATE() |
|
||||
| 修改人 | int | 否 | UserID |
|
||||
| 修改时间 | datetime | 否 | 修改时间 |
|
||||
|
||||
主键:`PK_仓储管理_入库单主表`。
|
||||
|
||||
唯一约束:`UK_仓储管理_入库单主表_入库单号`。
|
||||
|
||||
### 4.6 入库单明细表
|
||||
|
||||
表名:`仓储管理_入库单明细表`
|
||||
|
||||
| 字段名 | 类型 | 必填 | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| 入库明细流水号 | bigint identity | 是 | 主键 |
|
||||
| 入库单流水号 | bigint | 是 | 外键,关联入库主表 |
|
||||
| 物料流水号 | int | 是 | 物料 |
|
||||
| 物料编码 | nvarchar(100) | 否 | 冗余 |
|
||||
| 物料名称 | nvarchar(200) | 是 | 冗余 |
|
||||
| 图号或型号 | nvarchar(200) | 否 | 冗余 |
|
||||
| 规格 | nvarchar(200) | 否 | 冗余 |
|
||||
| 单位 | nvarchar(50) | 否 | 冗余 |
|
||||
| 库房流水号 | int | 是 | 入库库房 |
|
||||
| 库位流水号 | int | 是 | 入库库位 |
|
||||
| 批次编号 | nvarchar(100) | 否 | 批次 |
|
||||
| 入库数量 | decimal(18,4) | 是 | 入库数量 |
|
||||
| 来源明细流水号 | bigint | 否 | 来源明细 |
|
||||
| 备注 | nvarchar(500) | 否 | 备注 |
|
||||
|
||||
主键:`PK_仓储管理_入库单明细表`。
|
||||
|
||||
外键:
|
||||
|
||||
| 外键 | 字段 | 关联表 |
|
||||
| --- | --- | --- |
|
||||
| FK_入库明细_主表 | 入库单流水号 | 仓储管理_入库单主表.入库单流水号 |
|
||||
| FK_入库明细_库房 | 库房流水号 | 仓储管理_库房主表.库房流水号 |
|
||||
| FK_入库明细_库位 | 库位流水号 | 仓储管理_库位主表.库位流水号 |
|
||||
|
||||
### 4.7 出库单主表
|
||||
|
||||
表名:`仓储管理_出库单主表`
|
||||
|
||||
| 字段名 | 类型 | 必填 | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| 出库单流水号 | bigint identity | 是 | 主键 |
|
||||
| 出库单号 | nvarchar(100) | 是 | 业务单号 |
|
||||
| 出库类型 | nvarchar(50) | 是 | 领料出库、生产出库、销售出库、其他出库 |
|
||||
| 来源单号 | nvarchar(100) | 否 | 领料单、销售单等 |
|
||||
| 领用部门 | nvarchar(100) | 否 | 领用部门 |
|
||||
| 领用人 | nvarchar(100) | 否 | 领用人 |
|
||||
| 出库人 | int | 是 | UserID |
|
||||
| 出库日期 | datetime | 是 | 出库时间 |
|
||||
| 状态 | nvarchar(20) | 是 | 草稿、已出库、已作废 |
|
||||
| 备注 | nvarchar(500) | 否 | 备注 |
|
||||
| 创建人 | int | 是 | UserID |
|
||||
| 创建时间 | datetime | 是 | 默认 GETDATE() |
|
||||
| 修改人 | int | 否 | UserID |
|
||||
| 修改时间 | datetime | 否 | 修改时间 |
|
||||
|
||||
主键:`PK_仓储管理_出库单主表`。
|
||||
|
||||
唯一约束:`UK_仓储管理_出库单主表_出库单号`。
|
||||
|
||||
### 4.8 出库单明细表
|
||||
|
||||
表名:`仓储管理_出库单明细表`
|
||||
|
||||
| 字段名 | 类型 | 必填 | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| 出库明细流水号 | bigint identity | 是 | 主键 |
|
||||
| 出库单流水号 | bigint | 是 | 外键,关联出库主表 |
|
||||
| 物料流水号 | int | 是 | 物料 |
|
||||
| 物料编码 | nvarchar(100) | 否 | 冗余 |
|
||||
| 物料名称 | nvarchar(200) | 是 | 冗余 |
|
||||
| 图号或型号 | nvarchar(200) | 否 | 冗余 |
|
||||
| 规格 | nvarchar(200) | 否 | 冗余 |
|
||||
| 单位 | nvarchar(50) | 否 | 冗余 |
|
||||
| 库房流水号 | int | 是 | 出库库房 |
|
||||
| 库位流水号 | int | 是 | 出库库位 |
|
||||
| 批次编号 | nvarchar(100) | 否 | 批次 |
|
||||
| 出库数量 | decimal(18,4) | 是 | 出库数量 |
|
||||
| 来源明细流水号 | bigint | 否 | 来源明细 |
|
||||
| 备注 | nvarchar(500) | 否 | 备注 |
|
||||
|
||||
主键:`PK_仓储管理_出库单明细表`。
|
||||
|
||||
外键:
|
||||
|
||||
| 外键 | 字段 | 关联表 |
|
||||
| --- | --- | --- |
|
||||
| FK_出库明细_主表 | 出库单流水号 | 仓储管理_出库单主表.出库单流水号 |
|
||||
| FK_出库明细_库房 | 库房流水号 | 仓储管理_库房主表.库房流水号 |
|
||||
| FK_出库明细_库位 | 库位流水号 | 仓储管理_库位主表.库位流水号 |
|
||||
|
||||
### 4.9 移库单主表
|
||||
|
||||
表名:`仓储管理_移库单主表`
|
||||
|
||||
| 字段名 | 类型 | 必填 | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| 移库单流水号 | bigint identity | 是 | 主键 |
|
||||
| 移库单号 | nvarchar(100) | 是 | 业务单号 |
|
||||
| 移库类型 | nvarchar(50) | 是 | 同库移位、跨库调拨 |
|
||||
| 移库人 | int | 是 | UserID |
|
||||
| 移库日期 | datetime | 是 | 移库时间 |
|
||||
| 状态 | nvarchar(20) | 是 | 草稿、已移库、已作废 |
|
||||
| 备注 | nvarchar(500) | 否 | 备注 |
|
||||
| 创建人 | int | 是 | UserID |
|
||||
| 创建时间 | datetime | 是 | 默认 GETDATE() |
|
||||
| 修改人 | int | 否 | UserID |
|
||||
| 修改时间 | datetime | 否 | 修改时间 |
|
||||
|
||||
### 4.10 移库单明细表
|
||||
|
||||
表名:`仓储管理_移库单明细表`
|
||||
|
||||
| 字段名 | 类型 | 必填 | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| 移库明细流水号 | bigint identity | 是 | 主键 |
|
||||
| 移库单流水号 | bigint | 是 | 外键,关联移库主表 |
|
||||
| 物料流水号 | int | 是 | 物料 |
|
||||
| 批次编号 | nvarchar(100) | 否 | 批次 |
|
||||
| 原库房流水号 | int | 是 | 原库房 |
|
||||
| 原库位流水号 | int | 是 | 原库位 |
|
||||
| 目标库房流水号 | int | 是 | 目标库房 |
|
||||
| 目标库位流水号 | int | 是 | 目标库位 |
|
||||
| 移库数量 | decimal(18,4) | 是 | 移库数量 |
|
||||
| 备注 | nvarchar(500) | 否 | 备注 |
|
||||
|
||||
### 4.11 盘点单主表
|
||||
|
||||
表名:`仓储管理_盘点单主表`
|
||||
|
||||
| 字段名 | 类型 | 必填 | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| 盘点单流水号 | bigint identity | 是 | 主键 |
|
||||
| 盘点单号 | nvarchar(100) | 是 | 业务单号 |
|
||||
| 盘点名称 | nvarchar(200) | 是 | 盘点任务名称 |
|
||||
| 盘点范围 | nvarchar(50) | 是 | 全库、库房、库位、物料 |
|
||||
| 库房流水号 | int | 否 | 按库房盘点时使用 |
|
||||
| 开始时间 | datetime | 否 | 开始时间 |
|
||||
| 结束时间 | datetime | 否 | 结束时间 |
|
||||
| 状态 | nvarchar(20) | 是 | 草稿、盘点中、待确认、已确认、已作废 |
|
||||
| 创建人 | int | 是 | UserID |
|
||||
| 创建时间 | datetime | 是 | 默认 GETDATE() |
|
||||
| 确认人 | int | 否 | UserID |
|
||||
| 确认时间 | datetime | 否 | 确认时间 |
|
||||
| 备注 | nvarchar(500) | 否 | 备注 |
|
||||
|
||||
### 4.12 盘点单明细表
|
||||
|
||||
表名:`仓储管理_盘点单明细表`
|
||||
|
||||
| 字段名 | 类型 | 必填 | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| 盘点明细流水号 | bigint identity | 是 | 主键 |
|
||||
| 盘点单流水号 | bigint | 是 | 外键,关联盘点主表 |
|
||||
| 库存流水号 | bigint | 否 | 来源库存记录 |
|
||||
| 物料流水号 | int | 是 | 物料 |
|
||||
| 物料编码 | nvarchar(100) | 否 | 冗余 |
|
||||
| 物料名称 | nvarchar(200) | 是 | 冗余 |
|
||||
| 图号或型号 | nvarchar(200) | 否 | 冗余 |
|
||||
| 库房流水号 | int | 是 | 库房 |
|
||||
| 库位流水号 | int | 是 | 库位 |
|
||||
| 批次编号 | nvarchar(100) | 否 | 批次 |
|
||||
| 账面数量 | decimal(18,4) | 是 | 生成盘点时库存数量 |
|
||||
| 实盘数量 | decimal(18,4) | 否 | 盘点录入数量 |
|
||||
| 差异数量 | decimal(18,4) | 否 | 实盘 - 账面 |
|
||||
| 差异原因 | nvarchar(500) | 否 | 差异说明 |
|
||||
| 处理方式 | nvarchar(50) | 否 | 盘盈、盘亏、不调整 |
|
||||
| 是否已确认 | bit | 是 | 默认 0 |
|
||||
| 备注 | nvarchar(500) | 否 | 备注 |
|
||||
|
||||
## 5. 表关系设计
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
仓储管理_库房主表 ||--o{ 仓储管理_库位主表 : 包含
|
||||
仓储管理_库房主表 ||--o{ 仓储管理_库存现存量 : 拥有
|
||||
仓储管理_库位主表 ||--o{ 仓储管理_库存现存量 : 存放
|
||||
库存管理_物料主文件_基本 ||--o{ 仓储管理_库存现存量 : 对应
|
||||
仓储管理_入库单主表 ||--o{ 仓储管理_入库单明细表 : 包含
|
||||
仓储管理_出库单主表 ||--o{ 仓储管理_出库单明细表 : 包含
|
||||
仓储管理_移库单主表 ||--o{ 仓储管理_移库单明细表 : 包含
|
||||
仓储管理_盘点单主表 ||--o{ 仓储管理_盘点单明细表 : 包含
|
||||
仓储管理_库存现存量 ||--o{ 仓储管理_库存变动流水 : 产生
|
||||
```
|
||||
|
||||
关系说明:
|
||||
|
||||
| 关系 | 说明 |
|
||||
| --- | --- |
|
||||
| 一个库房有多个库位 | `仓储管理_库位主表.库房流水号` 指向库房 |
|
||||
| 一个库位可放多个物料 | 通过 `仓储管理_库存现存量` 表体现 |
|
||||
| 一个物料可在多个库位 | 通过 `仓储管理_库存现存量` 表体现 |
|
||||
| 入库、出库、移库、盘点都写流水 | `仓储管理_库存变动流水` 记录库存变化来源 |
|
||||
| 查询库存以现存量为准 | 综合查询不直接汇总单据,默认读取库存现存量 |
|
||||
| 追溯库存以流水为准 | 查原因时读取库存变动流水和来源单据 |
|
||||
|
||||
## 6. 库存处理存储过程设计
|
||||
|
||||
### 6.1 公共库存增加过程
|
||||
|
||||
建议新增公共过程:`仓储管理_库存_增加`
|
||||
|
||||
入参:
|
||||
|
||||
| 参数 | 说明 |
|
||||
| --- | --- |
|
||||
| 物料流水号 | 物料 |
|
||||
| 库房流水号 | 库房 |
|
||||
| 库位流水号 | 库位 |
|
||||
| 批次编号 | 批次 |
|
||||
| 数量 | 增加数量 |
|
||||
| 业务类型 | 入库、退料、盘盈、移入 |
|
||||
| 业务单号 | 来源单号 |
|
||||
| 业务主表流水号 | 来源主表 |
|
||||
| 业务明细流水号 | 来源明细 |
|
||||
| 操作人 | UserID |
|
||||
| 备注 | 备注 |
|
||||
|
||||
处理规则:
|
||||
|
||||
1. 在事务内锁定 `仓储管理_库存现存量` 的对应物料、库位、批次记录。
|
||||
2. 存在则更新 `库存数量 = 库存数量 + 数量`。
|
||||
3. 不存在则新增库存记录。
|
||||
4. 写入库存变动流水。
|
||||
5. 返回库存流水号和变动后数量。
|
||||
|
||||
### 6.2 公共库存扣减过程
|
||||
|
||||
建议新增公共过程:`仓储管理_库存_扣减`
|
||||
|
||||
处理规则:
|
||||
|
||||
1. 在事务内锁定对应库存记录。
|
||||
2. 校验库存记录存在。
|
||||
3. 校验 `库存数量 - 冻结数量 >= 数量`。
|
||||
4. 更新 `库存数量 = 库存数量 - 数量`。
|
||||
5. 写入库存变动流水,`变动数量 = -数量`。
|
||||
6. 返回库存流水号和变动后数量。
|
||||
|
||||
### 6.3 公共库存移库过程
|
||||
|
||||
建议新增公共过程:`仓储管理_库存_移库`
|
||||
|
||||
处理规则:
|
||||
|
||||
1. 开启事务。
|
||||
2. 调用或复用扣减逻辑扣减原库位库存。
|
||||
3. 调用或复用增加逻辑增加目标库位库存。
|
||||
4. 写入移库单和移库明细。
|
||||
5. 写入库存变动流水。
|
||||
6. 提交事务。
|
||||
|
||||
注意:扣减和增加必须在同一个事务内完成,不能由前端拆成两个请求。
|
||||
|
||||
### 6.4 公共盘点确认过程
|
||||
|
||||
建议新增公共过程:`仓储管理_库存盘点_确认`
|
||||
|
||||
处理规则:
|
||||
|
||||
1. 校验盘点单状态为待确认。
|
||||
2. 遍历盘点明细。
|
||||
3. 差异数量为 0 的明细只标记确认。
|
||||
4. 差异数量大于 0 的明细调用库存增加逻辑,业务类型为“盘盈”。
|
||||
5. 差异数量小于 0 的明细调用库存扣减逻辑,业务类型为“盘亏”。
|
||||
6. 明细全部处理完成后,盘点单状态改为已确认。
|
||||
|
||||
## 7. 前端页面设计
|
||||
|
||||
### 7.1 库房管理页面
|
||||
|
||||
建议路径:`src/views/WarehouseManagement/Warehouse/index.vue`
|
||||
|
||||
页面结构:
|
||||
|
||||
1. 搜索栏:库房编号、库房名称、库房类型、是否启用。
|
||||
2. 表格:库房编号、库房名称、库房类型、地址、负责人、是否启用、备注。
|
||||
3. 操作:新增、编辑、停用、查看库位。
|
||||
|
||||
接口名称建议:
|
||||
|
||||
| 操作 | name |
|
||||
| --- | --- |
|
||||
| 查询 | 仓储管理_库房_查询 |
|
||||
| 新增 | 仓储管理_库房_增加 |
|
||||
| 编辑 | 仓储管理_库房_编辑 |
|
||||
| 停用 | 仓储管理_库房_停用 |
|
||||
|
||||
### 7.2 库位管理页面
|
||||
|
||||
建议优先复用或改造现有 `src/views/WarehouseManagement/LocationManagement`。
|
||||
|
||||
页面结构:
|
||||
|
||||
1. 搜索栏:库房、库区、库位编号、库位名称、是否启用。
|
||||
2. 表格:库房名称、库位编号、库位名称、库区、货架、层号、容量、是否允许混放、是否启用。
|
||||
3. 操作:新增、编辑、停用、查看物料。
|
||||
|
||||
接口名称建议:
|
||||
|
||||
| 操作 | name |
|
||||
| --- | --- |
|
||||
| 查询 | 仓储管理_库位_查询 |
|
||||
| 新增 | 仓储管理_库位_增加 |
|
||||
| 编辑 | 仓储管理_库位_编辑 |
|
||||
| 停用 | 仓储管理_库位_停用 |
|
||||
| 查询库位物料 | 仓储管理_库位_物料明细_查询 |
|
||||
|
||||
### 7.3 物料入库页面
|
||||
|
||||
建议优先兼容现有 `src/views/WarehouseManagement/PurchasePartsStorage`、`Inboundscanning`、`WarehousingRecord` 等入库入口。
|
||||
|
||||
页面要求:
|
||||
|
||||
1. 入库时必须选择库房和库位。
|
||||
2. 优先显示该物料已有库存库位。
|
||||
3. 没有已有库存库位时显示全部启用库位。
|
||||
4. 提交时传入 `库房流水号`、`库位流水号`、`物料流水号`、`入库数量`。
|
||||
5. 后端必须通过公共库存增加过程维护库存。
|
||||
|
||||
### 7.4 物料出库页面
|
||||
|
||||
建议路径可结合现有领料和出库页面,例如 `MaterialRequisition`、`OutboundDetails`。
|
||||
|
||||
页面要求:
|
||||
|
||||
1. 选择物料后展示该物料所有可用库存库位。
|
||||
2. 用户选择具体库位和出库数量。
|
||||
3. 页面校验数量,但最终以数据库事务校验为准。
|
||||
4. 出库成功后刷新物料库位库存。
|
||||
|
||||
### 7.5 物料盘点页面
|
||||
|
||||
建议优先改造现有 `src/views/WarehouseManagement/InventoryCheck/index.vue`。
|
||||
|
||||
页面功能:
|
||||
|
||||
1. 创建盘点单。
|
||||
2. 生成盘点明细。
|
||||
3. 按库房、库位、物料录入实盘数量。
|
||||
4. 显示账面数量、实盘数量、差异数量。
|
||||
5. 差异确认后更新库存。
|
||||
6. 支持导出盘点表。
|
||||
|
||||
### 7.6 物料综合查询页面
|
||||
|
||||
建议优先改造现有 `src/views/WarehouseManagement/InventoryQuery/index.vue`。
|
||||
|
||||
页面功能:
|
||||
|
||||
1. 主表按物料聚合显示总库存。
|
||||
2. 主库位显示库存数量最大的库位。
|
||||
3. 点击主库位弹出库位明细。
|
||||
4. 点击物料编码弹出库存流水。
|
||||
5. 支持正向查询和逆向查询切换。
|
||||
|
||||
## 8. 查询 SQL 设计思路
|
||||
|
||||
### 8.1 物料正向查询
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
k.物料流水号,
|
||||
k.物料编码,
|
||||
k.物料名称,
|
||||
k.图号或型号,
|
||||
k.规格,
|
||||
f.库房编号,
|
||||
f.库房名称,
|
||||
w.库位编号,
|
||||
w.库位名称,
|
||||
k.批次编号,
|
||||
k.库存数量,
|
||||
k.冻结数量,
|
||||
k.最后变动时间
|
||||
FROM 仓储管理_库存现存量 k
|
||||
LEFT JOIN 仓储管理_库房主表 f ON k.库房流水号 = f.库房流水号
|
||||
LEFT JOIN 仓储管理_库位主表 w ON k.库位流水号 = w.库位流水号
|
||||
WHERE ISNULL(k.库存数量, 0) > 0
|
||||
AND (@物料流水号 IS NULL OR k.物料流水号 = @物料流水号)
|
||||
ORDER BY f.库房编号, w.库位编号;
|
||||
```
|
||||
|
||||
### 8.2 库位逆向查询
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
f.库房编号,
|
||||
f.库房名称,
|
||||
w.库位编号,
|
||||
w.库位名称,
|
||||
k.物料流水号,
|
||||
k.物料编码,
|
||||
k.物料名称,
|
||||
k.图号或型号,
|
||||
k.规格,
|
||||
k.批次编号,
|
||||
k.库存数量,
|
||||
k.最后变动时间
|
||||
FROM 仓储管理_库存现存量 k
|
||||
LEFT JOIN 仓储管理_库房主表 f ON k.库房流水号 = f.库房流水号
|
||||
LEFT JOIN 仓储管理_库位主表 w ON k.库位流水号 = w.库位流水号
|
||||
WHERE ISNULL(k.库存数量, 0) > 0
|
||||
AND k.库位流水号 = @库位流水号
|
||||
ORDER BY k.物料编码, k.物料名称;
|
||||
```
|
||||
|
||||
### 8.3 物料综合查询
|
||||
|
||||
```sql
|
||||
WITH 汇总 AS (
|
||||
SELECT
|
||||
物料流水号,
|
||||
MAX(物料编码) AS 物料编码,
|
||||
MAX(物料名称) AS 物料名称,
|
||||
MAX(图号或型号) AS 图号或型号,
|
||||
MAX(规格) AS 规格,
|
||||
SUM(ISNULL(库存数量, 0)) AS 总库存
|
||||
FROM 仓储管理_库存现存量
|
||||
WHERE ISNULL(库存数量, 0) > 0
|
||||
GROUP BY 物料流水号
|
||||
),
|
||||
主库位 AS (
|
||||
SELECT
|
||||
k.物料流水号,
|
||||
f.库房名称,
|
||||
w.库位名称,
|
||||
k.库存数量,
|
||||
ROW_NUMBER() OVER (
|
||||
PARTITION BY k.物料流水号
|
||||
ORDER BY ISNULL(k.库存数量, 0) DESC, k.库位流水号 ASC
|
||||
) AS 排名
|
||||
FROM 仓储管理_库存现存量 k
|
||||
LEFT JOIN 仓储管理_库房主表 f ON k.库房流水号 = f.库房流水号
|
||||
LEFT JOIN 仓储管理_库位主表 w ON k.库位流水号 = w.库位流水号
|
||||
WHERE ISNULL(k.库存数量, 0) > 0
|
||||
)
|
||||
SELECT
|
||||
h.物料流水号,
|
||||
h.物料编码,
|
||||
h.物料名称,
|
||||
h.图号或型号,
|
||||
h.规格,
|
||||
h.总库存,
|
||||
z.库房名称 AS 主库房名称,
|
||||
z.库位名称 AS 主库位名称,
|
||||
z.库存数量 AS 主库位库存
|
||||
FROM 汇总 h
|
||||
LEFT JOIN 主库位 z ON h.物料流水号 = z.物料流水号 AND z.排名 = 1;
|
||||
```
|
||||
|
||||
## 9. 实施步骤
|
||||
|
||||
### 9.1 第一阶段:数据库方案落地
|
||||
|
||||
1. 核对现有表:库房、货位、物料与货位对照、入库记录、出库记录、库存盘点。
|
||||
2. 确认哪些表复用,哪些表新增。
|
||||
3. 建立或补齐主外键关系。
|
||||
4. 建立库存现存量唯一约束。
|
||||
5. 建立库存变动流水表。
|
||||
6. 编写公共库存增加、扣减、移库、盘点确认存储过程。
|
||||
7. 在测试库 `ERPTOOL_JY_20250826Back` 编译并验证。
|
||||
|
||||
### 9.2 第二阶段:入库和出库闭环
|
||||
|
||||
1. 改造入库接口,提交时必须传库房和库位。
|
||||
2. 入库接口调用公共库存增加过程。
|
||||
3. 改造出库接口,出库时必须指定库存现存量或库位。
|
||||
4. 出库接口调用公共库存扣减过程。
|
||||
5. 验证同一物料多库位、多批次场景。
|
||||
|
||||
### 9.3 第三阶段:盘点闭环
|
||||
|
||||
1. 盘点页面支持生成盘点单。
|
||||
2. 盘点明细记录账面数量。
|
||||
3. 支持录入实盘数量和差异原因。
|
||||
4. 确认盘点时调用盘点确认过程。
|
||||
5. 验证盘盈、盘亏、无差异三类场景。
|
||||
|
||||
### 9.4 第四阶段:综合查询闭环
|
||||
|
||||
1. 新增物料综合查询接口。
|
||||
2. 新增物料库位明细查询接口。
|
||||
3. 新增库位物料明细查询接口。
|
||||
4. 前端支持正向查询和逆向查询。
|
||||
5. 前端支持点击主库位查看全部库位库存。
|
||||
6. 前端支持点击物料查看库存变动流水。
|
||||
|
||||
### 9.5 第五阶段:历史数据整理
|
||||
|
||||
1. 从现有 `库存管理_物料与货位对照表` 或相近库存表迁移当前库存。
|
||||
2. 迁移时必须保留物料、货位、库存数量、批次等关键字段。
|
||||
3. 对没有库房归属的货位先补齐库房。
|
||||
4. 对重复物料库位批次记录进行合并。
|
||||
5. 迁移后核对物料总库存和原库存查询结果是否一致。
|
||||
6. 历史 0 库存记录可暂不迁移,后续按盘点结果清理。
|
||||
|
||||
## 10. 验收标准
|
||||
|
||||
| 验收项 | 标准 |
|
||||
| --- | --- |
|
||||
| 库房管理 | 可新增、编辑、停用库房 |
|
||||
| 库位管理 | 库位必须归属库房,同一库房库位编号不可重复 |
|
||||
| 入库 | 入库后指定库位库存增加,并生成库存流水 |
|
||||
| 出库 | 出库后指定库位库存减少,并生成库存流水 |
|
||||
| 库存不足 | 出库、移库、盘亏时库存不足必须阻止提交 |
|
||||
| 移库 | 原库位减少,目标库位增加,事务一致 |
|
||||
| 盘点 | 差异确认后库存正确增减 |
|
||||
| 正向查询 | 可查询某物料在哪些库位 |
|
||||
| 逆向查询 | 可查询某库位有哪些物料 |
|
||||
| 综合查询 | 总库存等于所有库位库存合计 |
|
||||
| 追溯 | 每一次库存变化都能查到来源单据和操作人 |
|
||||
|
||||
## 11. 风险与控制
|
||||
|
||||
| 风险 | 控制措施 |
|
||||
| --- | --- |
|
||||
| 多人同时出库导致负库存 | 数据库事务内加锁并重新校验库存 |
|
||||
| 前端拆分请求导致只扣不加 | 移库、盘点确认必须由后端单事务完成 |
|
||||
| 历史库存和新库存表不一致 | 迁移前备份,迁移后做总量对账 |
|
||||
| 库位停用后仍被选择 | 所有业务查询默认只返回启用库位 |
|
||||
| 物料多库位导致扣错库存 | 出库必须指定库位或库存流水号 |
|
||||
| 批次为空导致唯一约束失效 | 存储过程统一处理空批次 |
|
||||
|
||||
## 12. 推荐开发顺序
|
||||
|
||||
1. 先建立库房、库位、库存现存量、库存变动流水四张核心表。
|
||||
2. 再做公共库存增加和扣减过程。
|
||||
3. 再把入库和出库接入公共库存过程。
|
||||
4. 再做移库和盘点。
|
||||
5. 最后做综合查询、正向查询、逆向查询和报表优化。
|
||||
|
||||
这样做的原因是:只要库存现存量和库存变动流水先稳定,后续所有业务都只是围绕“增加、扣减、移动、调整”四类库存动作扩展,业务链路会更稳。
|
||||
|
||||
## 13. 后续开发对象清单
|
||||
|
||||
### 13.1 SQL 脚本
|
||||
|
||||
建议新增:
|
||||
|
||||
```text
|
||||
sql/仓储管理_库房库位库存基础表.sql
|
||||
sql/仓储管理_库存公共过程.sql
|
||||
sql/仓储管理_入库出库接入库存.sql
|
||||
sql/仓储管理_盘点流程.sql
|
||||
sql/仓储管理_库存综合查询.sql
|
||||
```
|
||||
|
||||
### 13.2 前端页面
|
||||
|
||||
建议新增或改造:
|
||||
|
||||
```text
|
||||
src/views/WarehouseManagement/Warehouse/index.vue
|
||||
src/views/WarehouseManagement/LocationManagement/index.vue
|
||||
src/views/WarehouseManagement/InventoryQuery/index.vue
|
||||
src/views/WarehouseManagement/InventoryCheck/index.vue
|
||||
src/views/WarehouseManagement/PurchasePartsStorage/index.vue
|
||||
src/views/WarehouseManagement/OutboundDetails/index.vue
|
||||
```
|
||||
|
||||
### 13.3 后端接口名称
|
||||
|
||||
建议新增:
|
||||
|
||||
```text
|
||||
仓储管理_库房_查询
|
||||
仓储管理_库房_增加
|
||||
仓储管理_库房_编辑
|
||||
仓储管理_库房_停用
|
||||
仓储管理_库位_查询
|
||||
仓储管理_库位_增加
|
||||
仓储管理_库位_编辑
|
||||
仓储管理_库位_停用
|
||||
仓储管理_库存_物料正向查询
|
||||
仓储管理_库存_库位逆向查询
|
||||
仓储管理_库存_综合查询
|
||||
仓储管理_库存_变动流水_查询
|
||||
仓储管理_库存盘点_创建
|
||||
仓储管理_库存盘点_明细_查询
|
||||
仓储管理_库存盘点_实盘_编辑
|
||||
仓储管理_库存盘点_确认
|
||||
```
|
||||
|
||||
修改人:Ld 修改时间:2026-07-28 15:37:19
|
||||
BIN
docs/库房管理/库房管理方案数据流.docx
Normal file
349
docs/库房管理/库房管理方案数据流.md
Normal file
@@ -0,0 +1,349 @@
|
||||
# 库房管理方案数据流
|
||||
|
||||
## 1. 数据流总览
|
||||
|
||||
库房管理模块的数据流以 `库存现存量` 为当前结果表,以 `库存变动流水` 为全过程追溯表。所有入库、出库、移库、盘点确认都不能直接只改现存量,必须同步写入业务单据和库存流水。
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A["库房主数据"] --> C["库位主数据"]
|
||||
B["物料主文件"] --> D["库存现存量"]
|
||||
C --> D
|
||||
E["入库单"] --> P1["库存增加过程"]
|
||||
F["出库单"] --> P2["库存扣减过程"]
|
||||
G["移库单"] --> P3["库存移库过程"]
|
||||
H["盘点单"] --> P4["盘点确认过程"]
|
||||
P1 --> D
|
||||
P2 --> D
|
||||
P3 --> D
|
||||
P4 --> D
|
||||
P1 --> L["库存变动流水"]
|
||||
P2 --> L
|
||||
P3 --> L
|
||||
P4 --> L
|
||||
D --> Q1["物料综合查询"]
|
||||
D --> Q2["物料正向查询"]
|
||||
D --> Q3["库位逆向查询"]
|
||||
L --> Q4["库存追溯查询"]
|
||||
```
|
||||
|
||||
## 2. 核心数据对象
|
||||
|
||||
| 数据对象 | 数据来源 | 写入时机 | 主要用途 |
|
||||
| --- | --- | --- | --- |
|
||||
| 库房主表 | 库房管理页面 | 新增、编辑库房时 | 定义仓储空间一级单位 |
|
||||
| 库位主表 | 库位管理页面 | 新增、编辑库位时 | 定义物料实际存放位置 |
|
||||
| 物料主文件 | 现有物料维护 | 物料建档时 | 提供物料编码、名称、图号、规格、单位 |
|
||||
| 入库单主表/明细表 | 入库页面 | 入库提交成功时 | 记录入库业务来源 |
|
||||
| 出库单主表/明细表 | 出库页面 | 出库提交成功时 | 记录出库业务来源 |
|
||||
| 移库单主表/明细表 | 移库页面 | 移库提交成功时 | 记录库位之间库存移动 |
|
||||
| 盘点单主表/明细表 | 盘点页面 | 创建盘点、录入实盘、确认盘点时 | 记录账面、实盘和差异 |
|
||||
| 库存现存量 | 公共库存过程 | 入库、出库、移库、盘点确认时 | 查询当前库存结果 |
|
||||
| 库存变动流水 | 公共库存过程 | 每次库存数量变化时 | 追溯库存变化原因 |
|
||||
|
||||
## 3. 主数据流
|
||||
|
||||
主数据先建立库房,再建立库位,物料主文件沿用现有数据。库存业务发生前,库位必须归属一个有效库房。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["维护库房"] --> B["写入 仓储管理_库房主表"]
|
||||
B --> C["维护库位"]
|
||||
C --> D["写入 仓储管理_库位主表"]
|
||||
E["现有物料维护"] --> F["库存管理_物料主文件_基本"]
|
||||
D --> G["入库/出库/移库/盘点可选择库位"]
|
||||
F --> G
|
||||
```
|
||||
|
||||
数据规则:
|
||||
|
||||
1. `库位主表.库房流水号` 必须关联 `库房主表.库房流水号`。
|
||||
2. 同一库房下 `库位编号` 不允许重复。
|
||||
3. 停用库位不允许在新业务中选择。
|
||||
4. 已有库存的库位不允许直接删除。
|
||||
|
||||
## 4. 入库数据流
|
||||
|
||||
入库数据流从入库页面开始,先形成入库单据,再调用公共库存增加过程,最后更新库存现存量并写流水。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant UI as 入库页面
|
||||
participant API as MESCommonBase.ashx
|
||||
participant SP as 入库存储过程
|
||||
participant ADD as 仓储管理_库存_增加
|
||||
participant STOCK as 库存现存量
|
||||
participant LOG as 库存变动流水
|
||||
|
||||
UI->>API: 提交物料、批次、库房、库位、入库数量
|
||||
API->>SP: name=仓储管理_入库_增加
|
||||
SP->>SP: 写入入库单主表/明细表
|
||||
SP->>ADD: 调用库存增加过程
|
||||
ADD->>STOCK: 存在则累加,不存在则新增
|
||||
ADD->>LOG: 写入变动类型=入库,数量为正数
|
||||
ADD-->>SP: 返回变动后库存
|
||||
SP-->>API: 返回成功
|
||||
API-->>UI: 刷新入库记录和库存查询
|
||||
```
|
||||
|
||||
入库关键字段:
|
||||
|
||||
| 字段 | 去向 |
|
||||
| --- | --- |
|
||||
| 物料流水号 | 入库明细表、库存现存量、库存变动流水 |
|
||||
| 库房流水号 | 入库明细表、库存现存量、库存变动流水 |
|
||||
| 库位流水号 | 入库明细表、库存现存量、库存变动流水 |
|
||||
| 批次编号 | 入库明细表、库存现存量、库存变动流水 |
|
||||
| 入库数量 | 入库明细表,库存流水正数 |
|
||||
| 入库单号 | 入库主表,库存流水业务单号 |
|
||||
|
||||
## 5. 出库数据流
|
||||
|
||||
出库必须先查询可用库存,再指定具体库位扣减。后端以数据库当前库存为准重新校验,不能只相信前端显示数量。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant UI as 出库页面
|
||||
participant QUERY as 可用库存查询
|
||||
participant API as MESCommonBase.ashx
|
||||
participant SP as 出库存储过程
|
||||
participant SUB as 仓储管理_库存_扣减
|
||||
participant STOCK as 库存现存量
|
||||
participant LOG as 库存变动流水
|
||||
|
||||
UI->>QUERY: 按物料查询可用库位库存
|
||||
QUERY-->>UI: 返回库房、库位、批次、可用数量
|
||||
UI->>API: 提交出库库位和出库数量
|
||||
API->>SP: name=仓储管理_出库_增加
|
||||
SP->>SP: 写入出库单主表/明细表
|
||||
SP->>SUB: 调用库存扣减过程
|
||||
SUB->>STOCK: 锁定库存并校验可用数量
|
||||
SUB->>STOCK: 扣减库存数量
|
||||
SUB->>LOG: 写入变动类型=出库,数量为负数
|
||||
SP-->>API: 返回成功或库存不足
|
||||
API-->>UI: 刷新出库记录和库存查询
|
||||
```
|
||||
|
||||
出库控制点:
|
||||
|
||||
1. 出库数量必须大于 0。
|
||||
2. 出库数量不能超过数据库当前可用库存。
|
||||
3. 同一物料多库位时,必须传入 `库位流水号` 或 `库存流水号`。
|
||||
4. 库存扣减后为 0 时,建议保留库存现存量记录,查询默认过滤 0 库存。
|
||||
|
||||
## 6. 移库数据流
|
||||
|
||||
移库是同一事务内完成“原库位扣减”和“目标库位增加”。前端不能拆成两个接口。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["选择原库存记录"] --> B["输入移库数量"]
|
||||
B --> C["选择目标库房/目标库位"]
|
||||
C --> D["提交移库单"]
|
||||
D --> E["写移库单主表/明细表"]
|
||||
E --> F{"原库位库存是否足够"}
|
||||
F -->|否| X["回滚并提示库存不足"]
|
||||
F -->|是| G["原库位库存减少"]
|
||||
G --> H["目标库位库存增加"]
|
||||
H --> I["写库存流水:移出"]
|
||||
H --> J["写库存流水:移入"]
|
||||
I --> K["提交事务"]
|
||||
J --> K
|
||||
```
|
||||
|
||||
移库流水规则:
|
||||
|
||||
| 流水 | 变动类型 | 库位 | 数量 |
|
||||
| --- | --- | --- | --- |
|
||||
| 第一条 | 移出 | 原库位 | 负数 |
|
||||
| 第二条 | 移入 | 目标库位 | 正数 |
|
||||
|
||||
## 7. 盘点数据流
|
||||
|
||||
盘点分为生成账面、录入实盘、确认差异三段。只有确认差异时才改变库存。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["创建盘点单"] --> B["按库房/库位/物料范围读取库存现存量"]
|
||||
B --> C["生成盘点明细:记录账面数量"]
|
||||
C --> D["盘点人员录入实盘数量"]
|
||||
D --> E["系统计算差异数量=实盘-账面"]
|
||||
E --> F{"差异是否为0"}
|
||||
F -->|是| G["明细标记无差异"]
|
||||
F -->|否| H["填写差异原因和处理方式"]
|
||||
H --> I["主管确认盘点"]
|
||||
I --> J{"差异方向"}
|
||||
J -->|盘盈| K["调用库存增加过程"]
|
||||
J -->|盘亏| L["调用库存扣减过程"]
|
||||
K --> M["写库存流水"]
|
||||
L --> M
|
||||
G --> N["盘点单已确认"]
|
||||
M --> N
|
||||
```
|
||||
|
||||
盘点数据状态:
|
||||
|
||||
| 阶段 | 写入表 | 是否影响库存 |
|
||||
| --- | --- | --- |
|
||||
| 创建盘点 | 盘点单主表、盘点单明细表 | 否 |
|
||||
| 录入实盘 | 盘点单明细表 | 否 |
|
||||
| 确认盘盈 | 库存现存量、库存变动流水 | 是,增加 |
|
||||
| 确认盘亏 | 库存现存量、库存变动流水 | 是,减少 |
|
||||
|
||||
## 8. 综合查询数据流
|
||||
|
||||
综合查询不从单据实时汇总,而是读取 `库存现存量`,再关联物料、库房、库位,并可继续钻取库存流水。
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A["查询条件:物料/库房/库位/是否有库存"] --> B["库存现存量"]
|
||||
B --> C["关联物料主文件"]
|
||||
B --> D["关联库房主表"]
|
||||
B --> E["关联库位主表"]
|
||||
C --> F["按物料汇总总库存"]
|
||||
D --> F
|
||||
E --> F
|
||||
F --> G["取库存最多库位作为主库位"]
|
||||
G --> H["库存综合查询主表"]
|
||||
H --> I["点击主库位:库位明细"]
|
||||
H --> J["点击物料:库存流水"]
|
||||
```
|
||||
|
||||
综合查询输出:
|
||||
|
||||
| 输出字段 | 来源 |
|
||||
| --- | --- |
|
||||
| 物料编码、物料名称、图号或型号、规格、单位 | 物料主文件/库存现存量冗余字段 |
|
||||
| 总库存 | 库存现存量按物料汇总 |
|
||||
| 主库房、主库位 | 库存数量最大的库位 |
|
||||
| 库位明细 | 库存现存量按物料展开 |
|
||||
| 最近变动 | 库存变动流水 |
|
||||
|
||||
## 9. 正向查询和逆向查询数据流
|
||||
|
||||
### 9.1 物料正向查询
|
||||
|
||||
正向查询回答:某个物料在哪些库位。
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A["输入物料编码/名称/图号"] --> B["定位物料流水号"]
|
||||
B --> C["查询库存现存量"]
|
||||
C --> D["关联库房/库位"]
|
||||
D --> E["返回库房、库位、批次、库存数量"]
|
||||
```
|
||||
|
||||
### 9.2 库位逆向查询
|
||||
|
||||
逆向查询回答:某个库位放了哪些物料。
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A["选择库房/库位"] --> B["定位库位流水号"]
|
||||
B --> C["查询库存现存量"]
|
||||
C --> D["关联物料主文件"]
|
||||
D --> E["返回物料、图号、规格、批次、库存数量"]
|
||||
```
|
||||
|
||||
## 10. 数据一致性控制
|
||||
|
||||
| 控制点 | 说明 |
|
||||
| --- | --- |
|
||||
| 单事务 | 入库、出库、移库、盘点确认必须在数据库事务内完成 |
|
||||
| 防负库存 | 出库、移库、盘亏都必须重新读取数据库库存并校验 |
|
||||
| 流水必写 | 只要库存数量变化,就必须写库存变动流水 |
|
||||
| 单据关联 | 库存流水必须记录业务类型、业务单号、业务主表流水号、业务明细流水号 |
|
||||
| 库位精确 | 库存扣减必须精确到库位,不能只按物料扣减 |
|
||||
| 0 库存保留 | 库存为 0 的现存量记录可保留,查询默认过滤 |
|
||||
| 历史追溯 | 查询当前库存看现存量,查变化原因看库存流水 |
|
||||
|
||||
## 11. 数据落表顺序
|
||||
|
||||
### 11.1 入库落表顺序
|
||||
|
||||
1. 校验物料、库房、库位、数量。
|
||||
2. 写入入库单主表。
|
||||
3. 写入入库单明细表。
|
||||
4. 调用库存增加过程。
|
||||
5. 更新或新增库存现存量。
|
||||
6. 写入库存变动流水。
|
||||
7. 提交事务。
|
||||
|
||||
### 11.2 出库落表顺序
|
||||
|
||||
1. 校验物料、库位、数量。
|
||||
2. 写入出库单主表。
|
||||
3. 写入出库单明细表。
|
||||
4. 调用库存扣减过程。
|
||||
5. 锁定库存现存量并校验可用数量。
|
||||
6. 扣减库存现存量。
|
||||
7. 写入库存变动流水。
|
||||
8. 提交事务。
|
||||
|
||||
### 11.3 移库落表顺序
|
||||
|
||||
1. 校验原库位、目标库位、移库数量。
|
||||
2. 写入移库单主表。
|
||||
3. 写入移库单明细表。
|
||||
4. 锁定原库位库存并扣减。
|
||||
5. 更新或新增目标库位库存。
|
||||
6. 写入移出流水。
|
||||
7. 写入移入流水。
|
||||
8. 提交事务。
|
||||
|
||||
### 11.4 盘点确认落表顺序
|
||||
|
||||
1. 读取盘点单明细。
|
||||
2. 校验盘点单状态为待确认。
|
||||
3. 按明细计算差异。
|
||||
4. 无差异只确认明细。
|
||||
5. 盘盈调用库存增加过程。
|
||||
6. 盘亏调用库存扣减过程。
|
||||
7. 写库存变动流水。
|
||||
8. 更新盘点单状态为已确认。
|
||||
9. 提交事务。
|
||||
|
||||
## 12. 前端页面数据流
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["页面 created 初始化"] --> B["读取库房下拉"]
|
||||
A --> C["读取启用库位"]
|
||||
A --> D["读取库存汇总表"]
|
||||
E["用户输入查询条件"] --> F["CreateData 构建 param 字符串"]
|
||||
F --> G["ExecDatabase POST MESCommonBase.ashx"]
|
||||
G --> H["后端按 name 路由存储过程"]
|
||||
H --> I["返回中文字段结果集"]
|
||||
I --> J["el-table 展示中文字段"]
|
||||
J --> K["点击物料/库位"]
|
||||
K --> L["再次查询明细或流水"]
|
||||
```
|
||||
|
||||
前端传参要求:
|
||||
|
||||
| 参数 | 来源 |
|
||||
| --- | --- |
|
||||
| UserID | Cookie 当前用户 |
|
||||
| ModularID | 当前路由路径 |
|
||||
| name | 中文接口名称 |
|
||||
| type | 查询为 1,增删改为 2,批量为 7 |
|
||||
| param | `key=value&key2=value2` 字符串 |
|
||||
|
||||
## 13. 推荐接口数据流名称
|
||||
|
||||
| 页面动作 | name |
|
||||
| --- | --- |
|
||||
| 查询库房 | 仓储管理_库房_查询 |
|
||||
| 查询库位 | 仓储管理_库位_查询 |
|
||||
| 入库提交 | 仓储管理_入库_增加 |
|
||||
| 出库提交 | 仓储管理_出库_增加 |
|
||||
| 移库提交 | 仓储管理_库存_移库 |
|
||||
| 创建盘点 | 仓储管理_库存盘点_创建 |
|
||||
| 录入实盘 | 仓储管理_库存盘点_实盘_编辑 |
|
||||
| 确认盘点 | 仓储管理_库存盘点_确认 |
|
||||
| 综合查询 | 仓储管理_库存_综合查询 |
|
||||
| 物料正向查询 | 仓储管理_库存_物料正向查询 |
|
||||
| 库位逆向查询 | 仓储管理_库存_库位逆向查询 |
|
||||
| 库存流水查询 | 仓储管理_库存_变动流水_查询 |
|
||||
|
||||
修改人:Ld 修改时间:2026-07-29 10:42:45
|
||||
BIN
docs/库房管理/库房管理方案数据流_替换流程图前备份.docx
Normal file
BIN
docs/库房管理/库房管理方案数据流_流程图.png
Normal file
|
After Width: | Height: | Size: 108 KiB |
BIN
docs/库房管理/库房管理方案数据流_流程图版.docx
Normal file
BIN
docs/库房管理/库房管理界面预览图.png
Normal file
|
After Width: | Height: | Size: 94 KiB |
BIN
docs/排产优化方案.docx
Normal file
BIN
docs/景耀项目工作日志.xlsx
Normal file
398
docs/物料库位设置/物料库位功能调整测试报告.md
Normal file
@@ -0,0 +1,398 @@
|
||||
# 物料库位功能调整测试报告
|
||||
|
||||
## 一、测试概述
|
||||
|
||||
测试日期:2026-06-29
|
||||
|
||||
测试范围:
|
||||
|
||||
- 物料新增/编辑移除库位设置。
|
||||
- 物料标准库位维护页面移除编辑能力。
|
||||
- 入库时库位选择逻辑调整为:有库存库位优先显示已有库存库位,无库存库位时显示全库位。
|
||||
- 数据库脚本可发布性核对。
|
||||
- 前端构建验证。
|
||||
|
||||
测试环境:
|
||||
|
||||
- 工作目录:`D:\景耀\JY1.0`
|
||||
- 前端技术栈:Vue 2.5.17、Element UI 2.13、Webpack 4
|
||||
- 数据库服务器:`192.168.1.27`
|
||||
- 数据库:`ERPTOOL_JY_20250826Back`
|
||||
|
||||
本次测试未直接执行数据库 ALTER 脚本,仅做只读核对。
|
||||
|
||||
## 二、测试对象
|
||||
|
||||
### 2.1 前端文件
|
||||
|
||||
- `src/views/TechnologyCenter/MaterialMaintain/index.vue`
|
||||
- `src/views/TechnologyCenter/MaterialQuery/index.vue`
|
||||
- `src/views/WarehouseManagement/MaterialLocation/index.vue`
|
||||
- `src/views/WarehouseManagement/PurchasePartsStorage/index.vue`
|
||||
|
||||
### 2.2 SQL 文件
|
||||
|
||||
- `sql/移除物料标准库位维护.sql`
|
||||
|
||||
### 2.3 文档文件
|
||||
|
||||
- `docs/物料库位功能调整设计方案.md`
|
||||
- `docs/物料库位功能调整测试报告.md`
|
||||
|
||||
## 三、测试用例与结果
|
||||
|
||||
### 3.1 静态残留检查:物料维护与物料库位页面
|
||||
|
||||
测试目的:
|
||||
|
||||
确认物料新增/编辑页面不再残留库位表单、库位必填校验、默认库位、物料库位编辑调用。
|
||||
|
||||
执行命令:
|
||||
|
||||
```powershell
|
||||
rg -n "form\.库位|库位: \[|inventoryLocation|getInventoryLocation|= 2514|货位流水号', this\.form\.库位|仓储管理_物料库位_编辑数据|@row-dblclick=\"changeState\"|changeState\(|confirmEdit\(|cancelEdit\(|submitLocation\(|addLocation\(" src/views/TechnologyCenter/MaterialMaintain/index.vue src/views/TechnologyCenter/MaterialQuery/index.vue src/views/WarehouseManagement/MaterialLocation/index.vue
|
||||
```
|
||||
|
||||
测试结果:
|
||||
|
||||
- 命令退出码:`1`
|
||||
- 输出:无匹配结果
|
||||
|
||||
结果说明:
|
||||
|
||||
`rg` 在无匹配时返回退出码 `1`,本测试场景表示未发现目标残留代码。检查通过。
|
||||
|
||||
结论:
|
||||
|
||||
通过。
|
||||
|
||||
### 3.2 静态逻辑检查:入库库位选择
|
||||
|
||||
测试目的:
|
||||
|
||||
确认入库页面包含以下关键逻辑:
|
||||
|
||||
- 页面创建时加载全库位。
|
||||
- 调用 `仓储管理_库存盘点_查询` 查询已有库存库位。
|
||||
- 已有库存库位显示库存数量。
|
||||
- 无库存库位 fallback 到全库位。
|
||||
- 入库提交仍传递 `货位流水号组`。
|
||||
|
||||
执行命令:
|
||||
|
||||
```powershell
|
||||
rg -n "getLocateName\(|locateSource|locateName\.slice|库存:|仓储管理_库存盘点_查询|仓储管理_库位_查询|货位流水号组" src/views/WarehouseManagement/PurchasePartsStorage/index.vue
|
||||
```
|
||||
|
||||
测试结果摘要:
|
||||
|
||||
```text
|
||||
760: this.getLocateName()
|
||||
1048: getLocateName() {
|
||||
1050: var Data = this.CreateData('11', '仓储管理_库位_查询', param)
|
||||
1133: var Data = this.CreateData('11', '仓储管理_库存盘点_查询', param)
|
||||
1141: label: data[i].货位名称 + '(库存:' + inventory + ')',
|
||||
1149: this.$set(row, 'locateSource', 'inventory')
|
||||
1152: this.$set(row, 'locateName', this.locateName.slice())
|
||||
1153: this.$set(row, 'locateSource', 'all')
|
||||
1156: this.getLocateName().then(setAllLocate)
|
||||
1299: param[5] = ['货位流水号组', locateGroup]
|
||||
1436: param[4] = ['货位流水号组', locateGroup]
|
||||
```
|
||||
|
||||
结果说明:
|
||||
|
||||
关键代码路径均存在:
|
||||
|
||||
- `created()` 中加载全库位。
|
||||
- `getLocateName()` 使用 `仓储管理_库位_查询`。
|
||||
- `getInventoryLocateName(row)` 使用 `仓储管理_库存盘点_查询`。
|
||||
- 有库存库位时设置 `locateSource = 'inventory'`。
|
||||
- 无库存库位时使用 `this.locateName.slice()` 设置全库位,并设置 `locateSource = 'all'`。
|
||||
- 采购入库、自制件入库提交仍使用 `货位流水号组`。
|
||||
|
||||
结论:
|
||||
|
||||
通过。
|
||||
|
||||
### 3.3 SQL 脚本静态检查
|
||||
|
||||
测试目的:
|
||||
|
||||
确认 SQL 脚本包含目标存储过程,并保留 `@货位流水号` 兼容参数。
|
||||
|
||||
执行命令:
|
||||
|
||||
```powershell
|
||||
rg -n "ALTER PROCEDURE|库存管理_物料与货位对照表|货位流水号|货位流水号 = @货位流水号|货位流水号=@货位流水号" sql/移除物料标准库位维护.sql
|
||||
```
|
||||
|
||||
测试结果摘要:
|
||||
|
||||
```text
|
||||
8: 3. 保留 @货位流水号 参数,兼容未同步发布的旧前端调用。
|
||||
11:ALTER PROCEDURE [dbo].[物料管理_增加]
|
||||
13: @货位流水号 int = null,
|
||||
41:ALTER PROCEDURE [dbo].[物料管理_增加新]
|
||||
43: @货位流水号 int = null,
|
||||
105:ALTER PROCEDURE [dbo].[物料管理_编辑]
|
||||
107: @货位流水号 int = null,
|
||||
```
|
||||
|
||||
结果说明:
|
||||
|
||||
- 脚本包含 `物料管理_增加`、`物料管理_增加新`、`物料管理_编辑`。
|
||||
- 脚本保留 `@货位流水号` 参数。
|
||||
- 未检出 `货位流水号=@货位流水号` 或 `货位流水号 = @货位流水号` 写入语句。
|
||||
- 未检出对 `库存管理_物料与货位对照表` 的新增/更新语句。
|
||||
|
||||
结论:
|
||||
|
||||
通过。
|
||||
|
||||
### 3.4 数据库对象参数核对
|
||||
|
||||
测试目的:
|
||||
|
||||
确认目标数据库中相关存储过程和参数存在,为脚本发布与接口兼容提供依据。
|
||||
|
||||
执行命令:
|
||||
|
||||
```powershell
|
||||
sqlcmd -S 192.168.1.27 -d ERPTOOL_JY_20250826Back -U sa -P ****** -C -Q "SET NOCOUNT ON; SELECT o.name AS ObjectName, p.name AS ParamName, TYPE_NAME(p.user_type_id) AS TypeName, p.parameter_id FROM sys.objects o LEFT JOIN sys.parameters p ON o.object_id=p.object_id WHERE o.name IN (N'物料管理_增加',N'物料管理_增加新',N'物料管理_编辑',N'仓储管理_物料库位_编辑数据',N'仓储管理_库存盘点_查询',N'仓储管理_库位_查询') ORDER BY o.name,p.parameter_id;"
|
||||
```
|
||||
|
||||
测试结果摘要:
|
||||
|
||||
- `仓储管理_库存盘点_查询` 存在,参数包含:
|
||||
- `@物料名称_check`
|
||||
- `@物料名称`
|
||||
- `@图号或型号_check`
|
||||
- `@图号或型号`
|
||||
- `@库位_check`
|
||||
- `@库位`
|
||||
- `@排序名称`
|
||||
- `@排序方式`
|
||||
- `@物料编码_check`
|
||||
- `@物料编码`
|
||||
- `仓储管理_库位_查询` 存在,参数包含:
|
||||
- `@库位_check`
|
||||
- `@库位`
|
||||
- `物料管理_增加` 存在,参数包含 `@货位流水号`。
|
||||
- `物料管理_增加新` 存在,参数包含 `@货位流水号`。
|
||||
- `物料管理_编辑` 存在,参数包含 `@货位流水号`。
|
||||
- `仓储管理_物料库位_编辑数据` 存在,参数包含 `@物料流水号`、`@货位流水号`。
|
||||
|
||||
结果说明:
|
||||
|
||||
数据库对象与前端调用所需过程匹配。`物料管理_增加/增加新/编辑` 仍保留 `@货位流水号` 参数,因此前端传 `货位流水号 = null` 可以作为兼容占位。
|
||||
|
||||
结论:
|
||||
|
||||
通过。
|
||||
|
||||
### 3.5 数据库当前过程行为核对
|
||||
|
||||
测试目的:
|
||||
|
||||
确认目标数据库当前是否已经执行过本次 SQL 调整脚本。
|
||||
|
||||
执行命令:
|
||||
|
||||
```powershell
|
||||
sqlcmd -S 192.168.1.27 -d ERPTOOL_JY_20250826Back -U sa -P ****** -C -Q "SET NOCOUNT ON; SELECT o.name AS ObjectName, CASE WHEN m.definition LIKE N'%库存管理_物料与货位对照表%' THEN 1 ELSE 0 END AS TouchMaterialLocationTable, CASE WHEN m.definition LIKE N'%货位流水号=@货位流水号%' OR m.definition LIKE N'%货位流水号 = @货位流水号%' THEN 1 ELSE 0 END AS WritesLocationSerial FROM sys.objects o JOIN sys.sql_modules m ON o.object_id=m.object_id WHERE o.name IN (N'物料管理_增加',N'物料管理_增加新',N'物料管理_编辑',N'仓储管理_物料库位_编辑数据');"
|
||||
```
|
||||
|
||||
测试结果:
|
||||
|
||||
```text
|
||||
ObjectName TouchMaterialLocationTable WritesLocationSerial
|
||||
仓储管理_物料库位_编辑数据 1 1
|
||||
物料管理_编辑 1 1
|
||||
物料管理_增加 1 0
|
||||
物料管理_增加新 1 0
|
||||
```
|
||||
|
||||
结果说明:
|
||||
|
||||
目标数据库当前仍是旧过程行为:
|
||||
|
||||
- `物料管理_增加`、`物料管理_增加新` 仍接触 `库存管理_物料与货位对照表`。
|
||||
- `物料管理_编辑` 仍写入 `货位流水号`。
|
||||
- `仓储管理_物料库位_编辑数据` 仍写入物料库位。
|
||||
|
||||
这说明 `sql/移除物料标准库位维护.sql` 尚未执行到目标数据库。
|
||||
|
||||
结论:
|
||||
|
||||
部分通过。数据库对象存在,但后端脚本尚未发布。上线前必须执行 SQL 脚本。
|
||||
|
||||
### 3.6 库位基础数据与库存库位样本核对
|
||||
|
||||
测试目的:
|
||||
|
||||
确认全库位查询、已有库存库位查询存在可用样本数据。
|
||||
|
||||
执行命令:
|
||||
|
||||
```powershell
|
||||
sqlcmd -S 192.168.1.27 -d ERPTOOL_JY_20250826Back -U sa -P ****** -C -Q "SET NOCOUNT ON; SELECT TOP 10 货位流水号,货位名称 FROM 库存管理_货位主文件 ORDER BY 货位流水号; SELECT TOP 10 物料名称,图号或型号,货位名称,库存,货位流水号 FROM 外购件库存_视图 WHERE ISNULL(库存,0)>0 ORDER BY 物料名称;"
|
||||
```
|
||||
|
||||
测试结果摘要:
|
||||
|
||||
全库位样本:
|
||||
|
||||
```text
|
||||
货位流水号 货位名称
|
||||
1 A1
|
||||
2 A1-1
|
||||
3 A1-2
|
||||
4 A1-3
|
||||
5 A1-4
|
||||
6 A1-5
|
||||
7 A1-6
|
||||
8 A1-7
|
||||
9 A1-8
|
||||
10 A1-9
|
||||
```
|
||||
|
||||
已有库存库位样本:
|
||||
|
||||
```text
|
||||
物料名称 图号或型号 货位名称 库存 货位流水号
|
||||
壳体I模具 XT50-2-07.01MJ 模具库 1.0 2588
|
||||
盔甲护罩(左) WRS5085L 07-12-03 1.0 3789
|
||||
垃圾袋 垃圾袋 A000 1.0 2514
|
||||
内六角圆柱头螺钉 M10x45 GB/T70.1-2008 A000 1184.0 2514
|
||||
```
|
||||
|
||||
结果说明:
|
||||
|
||||
- 全库位基础数据存在。
|
||||
- 真实库存库位样本存在。
|
||||
- 可用于后续页面业务回归测试。
|
||||
|
||||
结论:
|
||||
|
||||
通过。
|
||||
|
||||
### 3.7 前端生产构建测试
|
||||
|
||||
测试目的:
|
||||
|
||||
确认本次前端修改没有引入 Vue/JavaScript 编译错误。
|
||||
|
||||
执行命令:
|
||||
|
||||
```powershell
|
||||
npm run build
|
||||
```
|
||||
|
||||
测试结果摘要:
|
||||
|
||||
```text
|
||||
Hash: bfc0aa9b97bada6643bc
|
||||
Version: webpack 4.16.5
|
||||
Time: 64306ms
|
||||
Built at: 2026/06/29 14:57:00
|
||||
Build complete.
|
||||
```
|
||||
|
||||
构建告警摘要:
|
||||
|
||||
- asset size limit 超限。
|
||||
- entrypoint size limit 超限。
|
||||
- Browserslist/caniuse-lite 过期提示。
|
||||
- npm 日志无法写入用户 npm-cache 日志目录。
|
||||
- shelljs 循环依赖属性访问告警。
|
||||
|
||||
异常说明:
|
||||
|
||||
构建已输出 `Build complete`,产物已生成;但命令进程在构建完成后未及时退出,被工具在 180 秒时截断,退出码为 `124`。
|
||||
|
||||
判断:
|
||||
|
||||
- 编译结果:通过。
|
||||
- 命令退出:异常,疑似项目旧构建脚本或环境中残留进程导致。
|
||||
- 告警均为项目既有构建告警或环境日志权限告警,本次未发现由修改代码造成的编译错误。
|
||||
|
||||
结论:
|
||||
|
||||
条件通过。
|
||||
|
||||
## 四、功能测试结论
|
||||
|
||||
| 测试项 | 结果 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| 物料新增/编辑库位 UI 移除 | 通过 | 静态检查无残留 |
|
||||
| 物料库位维护编辑能力移除 | 通过 | 静态检查无残留 |
|
||||
| 入库库存库位优先逻辑 | 通过 | 关键代码路径存在 |
|
||||
| 入库无库存 fallback 全库位 | 通过 | 关键代码路径存在 |
|
||||
| SQL 脚本静态检查 | 通过 | 脚本未写标准库位 |
|
||||
| 数据库对象参数核对 | 通过 | 所需过程和参数存在 |
|
||||
| 目标数据库后端脚本发布状态 | 未完成 | 当前库仍为旧过程 |
|
||||
| 前端生产构建 | 条件通过 | 已 Build complete,但进程超时退出 |
|
||||
|
||||
## 五、待办与风险
|
||||
|
||||
### 5.1 必须执行的上线前动作
|
||||
|
||||
1. 在目标数据库执行:
|
||||
|
||||
```text
|
||||
sql/移除物料标准库位维护.sql
|
||||
```
|
||||
|
||||
2. 执行后重新核对:
|
||||
|
||||
```sql
|
||||
SELECT o.name,
|
||||
CASE WHEN m.definition LIKE N'%库存管理_物料与货位对照表%' THEN 1 ELSE 0 END AS TouchMaterialLocationTable,
|
||||
CASE WHEN m.definition LIKE N'%货位流水号=@货位流水号%' OR m.definition LIKE N'%货位流水号 = @货位流水号%' THEN 1 ELSE 0 END AS WritesLocationSerial
|
||||
FROM sys.objects o
|
||||
JOIN sys.sql_modules m ON o.object_id = m.object_id
|
||||
WHERE o.name IN (N'物料管理_增加', N'物料管理_增加新', N'物料管理_编辑');
|
||||
```
|
||||
|
||||
预期:
|
||||
|
||||
- `TouchMaterialLocationTable = 0`
|
||||
- `WritesLocationSerial = 0`
|
||||
|
||||
### 5.2 需要人工页面回归的场景
|
||||
|
||||
由于本次未启动登录态浏览器访问业务系统,以下场景需要在测试环境人工回归:
|
||||
|
||||
- 新增物料弹窗不显示库位。
|
||||
- 编辑物料弹窗不显示库位。
|
||||
- 新增物料后数据库不生成 0 库存库位记录。
|
||||
- 编辑物料不改变已有真实库存库位。
|
||||
- 物料库位维护页面不可编辑。
|
||||
- 采购入库已有库存物料时,下拉只显示已有库存库位。
|
||||
- 采购入库无库存物料时,下拉显示全库位。
|
||||
- 自制件入库已有库存物料时,下拉只显示已有库存库位。
|
||||
- 自制件入库无库存物料时,下拉显示全库位。
|
||||
- 未选择库位时仍禁止入库。
|
||||
- 选择库位后入库成功,入库记录显示正确库位。
|
||||
|
||||
### 5.3 风险项
|
||||
|
||||
- 目标数据库当前仍是旧过程,若不执行 SQL 脚本,新增/编辑物料仍可能写入标准库位或物料货位对照数据。
|
||||
- 旧历史数据中已有 0 库存物料货位记录,本次不清理;若某些视图未过滤库存大于 0,仍可能被查询显示。
|
||||
- `npm run build` 构建完成后进程未正常退出,建议后续单独排查构建脚本或环境中的挂起任务。
|
||||
|
||||
## 六、最终结论
|
||||
|
||||
本次代码级测试与构建测试总体通过:
|
||||
|
||||
- 前端库位维护能力已按设计移除。
|
||||
- 入库库位选择逻辑已按设计实现。
|
||||
- SQL 脚本已准备完成,静态检查符合预期。
|
||||
- 生产构建已输出 `Build complete`。
|
||||
|
||||
当前不满足完整上线闭环的唯一关键项:
|
||||
|
||||
- 目标数据库尚未执行 `sql/移除物料标准库位维护.sql`。
|
||||
|
||||
建议先在测试数据库执行 SQL 脚本,再按 5.2 的页面回归清单完成业务验证。
|
||||
435
docs/物料库位设置/物料库位功能调整设计方案.md
Normal file
@@ -0,0 +1,435 @@
|
||||
# 物料库位功能调整设计方案
|
||||
|
||||
## 一、背景
|
||||
|
||||
当前系统在新建、编辑物料时会维护物料的默认库位,并在数据库中写入物料与货位的初始关系。该机制会导致物料主档承担库存库位职责,也会在无真实库存的情况下生成 `货位存量 = 0` 的物料货位记录。
|
||||
|
||||
本次需求由仓库主管提出。现场正在进行库存盘点,盘点人员需要依据系统库存数据到对应库位核对物料实物数量、批次和状态。但当前系统内的库存库位设置并非由仓库人员在实际入库、上架或盘点业务中选择确认,而是在物料基础资料维护阶段预先设置,导致系统记录的库位与现场实际存放库位不匹配。该问题会直接影响盘点人员按系统数据查找物料,容易出现找不到物料、盘点库位错误、盘点差异无法快速定位等情况,进而影响库存准确性和仓库现场作业效率。
|
||||
|
||||
因此,本次功能调整的核心诉求不是单纯修改一个库位字段,而是将“物料标准库位”从物料主档维护中剥离,把库位确认权回归到仓库实际业务动作中,由仓库人员在入库、上架、调拨、盘点等场景按现场真实情况选择和确认库位,确保系统库存库位能够反映实际库存位置,为当前及后续库存盘点提供可靠的数据依据。
|
||||
|
||||
<br />
|
||||
|
||||
本次调整目标是:
|
||||
|
||||
1. 物料主档不再强制维护真实库存库位。
|
||||
2. 物料标准维护组件不再编辑物料库位。
|
||||
3. 入库时根据真实库存情况选择库位。
|
||||
4. 有现有库存库位时优先显示已有库存库位;没有库存库位时显示全库位。
|
||||
5. 盘点人员后续依据系统库存查询结果进行盘点时,系统库位应尽可能来源于仓库真实业务记录,减少基础资料预设库位造成的现场偏差。
|
||||
6. 库存盘点组件增加物料存货功能修改,增加物料是可以选择库位
|
||||
7. 库存查询组件主列表“库位”列显示该物料当前有库存且库存数最多的库位;点击该库位可查看该物料所有有库存的库位及对应库存数。
|
||||
|
||||
## 二、现状核对
|
||||
|
||||
### 2.1 前端现状
|
||||
|
||||
物料维护入口:
|
||||
|
||||
- `src/views/TechnologyCenter/MaterialMaintain/index.vue`
|
||||
- `src/views/TechnologyCenter/MaterialQuery/index.vue`
|
||||
|
||||
原逻辑:
|
||||
|
||||
- 新增/编辑物料弹窗中存在“库位”下拉。
|
||||
- 新增物料默认设置 `form.库位 = 2514`。
|
||||
- 表单规则要求库位必填。
|
||||
- 新增/编辑提交时传递 `货位流水号`。
|
||||
|
||||
物料库位维护入口:
|
||||
|
||||
- `src/views/WarehouseManagement/MaterialLocation/index.vue`
|
||||
|
||||
原逻辑:
|
||||
|
||||
- 页面查询物料主档库位。
|
||||
- 行内可编辑 `货位流水号`。
|
||||
- 点击确定后调用 `仓储管理_物料库位_编辑数据`。
|
||||
|
||||
入库入口:
|
||||
|
||||
- `src/views/WarehouseManagement/PurchasePartsStorage/index.vue`
|
||||
|
||||
原逻辑:
|
||||
|
||||
- 采购入库、自制件入库行内可选择库位。
|
||||
- 已有 `getInventoryLocateName(row)` 方法,可按物料查询库存库位。
|
||||
- 但无库存库位时没有完整 fallback 到全库位的闭环。
|
||||
|
||||
### 2.2 数据库现状
|
||||
|
||||
已核对相关存储过程:
|
||||
|
||||
- `物料管理_增加`
|
||||
- `物料管理_增加新`
|
||||
- `物料管理_编辑`
|
||||
- `仓储管理_物料库位_编辑数据`
|
||||
- `仓储管理_库存盘点_查询`
|
||||
- `仓储管理_库位_查询`
|
||||
|
||||
当前数据库行为:
|
||||
|
||||
- `物料管理_增加`、`物料管理_增加新` 会把 `@货位流水号` 写入 `库存管理_物料主文件_基本.货位流水号`。
|
||||
- 新增物料后会向 `库存管理_物料与货位对照表` 插入一条 `货位存量 = 0` 的记录。
|
||||
- `物料管理_编辑` 会更新 `库存管理_物料主文件_基本.货位流水号`,并同步更新 `库存管理_物料与货位对照表.货位流水号`。
|
||||
- `仓储管理_物料库位_编辑数据` 会同时更新物料主文件和物料货位对照表。
|
||||
|
||||
## 三、设计原则
|
||||
|
||||
1. 物料主档可记录“存放库位/建议库位”,但维护入口不放在物料新建页面,且该库位不等同于真实库存库位。
|
||||
2. 真实库存库位只由入库、调拨、盘点等库存业务动作产生或调整。
|
||||
3. 入库库位选择以真实库存记录优先;没有真实库存库位时,可参考物料存放库位或全库位选择。
|
||||
4. 保留旧接口参数兼容,降低前后端发布顺序风险。
|
||||
5. 不删除历史库位数据,避免影响历史库存、出入库记录和查询报表。
|
||||
6. 仓库库位数据应以仓库人员实际作业确认结果为准,避免由技术、基础资料维护环节提前指定库位。
|
||||
7. 当前库存盘点期间,优先保障盘点人员能够通过系统库存数据定位真实库位;对历史不准确库位数据不做批量自动修正,防止误改真实库存,需要结合盘点结果逐步校正。
|
||||
8. 库存查询主列表以“库存数最多的库位”作为默认展示库位,降低一物多库位时主表信息分散和误判风险。
|
||||
|
||||
<br />
|
||||
|
||||
## 四、前端改造方案
|
||||
|
||||
### 4.1 物料维护页面
|
||||
|
||||
涉及文件:
|
||||
|
||||
- `src/views/TechnologyCenter/MaterialMaintain/index.vue`
|
||||
- `src/views/TechnologyCenter/MaterialQuery/index.vue`
|
||||
|
||||
改造内容:
|
||||
|
||||
- 新增物料弹窗不显示库位或存放库位字段。
|
||||
- 编辑物料弹窗不显示库位或存放库位字段。
|
||||
- 删除 `form.库位` 字段。
|
||||
- 删除 `库位` 必填校验。
|
||||
- 删除 `inventoryLocation` 数据源。
|
||||
- 删除 `getInventoryLocation()` 方法及页面初始化调用。
|
||||
- 删除新增时默认 `form.库位 = 2514`,避免未选择时自动落到固定库位。
|
||||
- 新增/编辑提交时传递 `货位流水号 = null`,不在物料建档流程中写入存放库位或真实库存库位。
|
||||
|
||||
说明:
|
||||
|
||||
物料新建和编辑只维护物料基础属性,不维护库位。这样可以避免技术或基础资料人员在建档阶段提前指定库位,把库位维护职责交还给仓储相关组件。
|
||||
|
||||
存放库位仍然允许维护,但入口应放在仓储侧的独立组件或现有物料库位组件中,业务含义是“建议存放位置”,不是库存现存量位置。
|
||||
|
||||
<br />
|
||||
|
||||
### 4.2 新增存放库位功能
|
||||
|
||||
承载方案:
|
||||
|
||||
- 方案 :修改 `src/views/WarehouseManagement/InventoryCheck/index.vue` 库存盘点页面。
|
||||
|
||||
改造内容:
|
||||
|
||||
- 增加物料存货按钮功能修改,在添加时可以选择库位并且库存数可以为0
|
||||
- 操作列添加删除按钮,将原先编辑按钮库存数是0的库位删除功能调整到删除按钮上,库存数为0时不删除库位
|
||||
|
||||
说明:
|
||||
|
||||
用于仓库存放物料时原库位放不下时可以给该物料新建一个库位存放物料,当物料不打算放在该库位时确认库存为0便可删除物料与库位的关联,同时库位还打算存放该物料不会应为库存为0删除库位。
|
||||
|
||||
<br />
|
||||
|
||||
### 4.3 入库库位选择
|
||||
|
||||
涉及文件:
|
||||
|
||||
- `src/views/WarehouseManagement/PurchasePartsStorage/index.vue`
|
||||
|
||||
改造内容:
|
||||
|
||||
- 页面创建时加载全库位列表。
|
||||
- `getLocateName()` 返回 Promise,并统一生成 `{ label, name, value }` 结构。
|
||||
- `getInventoryLocateName(row)` 按当前物料名称、图号或型号查询 `仓储管理_库存盘点_查询`。
|
||||
- 查询结果中只保留库存大于 0 的库位。
|
||||
- 如果存在库存库位:
|
||||
- 当前行 `locateName` 使用库存库位列表。
|
||||
- 下拉显示格式为 `货位名称(库存:数量)`。
|
||||
- 设置 `locateSource = 'inventory'`。
|
||||
- 如果不存在库存库位:
|
||||
- 若物料主档存在存放库位,可优先把该库位排在下拉列表首位,并标记为建议库位。
|
||||
- 当前行 `locateName` 使用全库位列表。
|
||||
- 设置 `locateSource = 'all'`。
|
||||
- 入库提交逻辑保持不变,继续校验并提交 `货位流水号组`。
|
||||
|
||||
业务要求:
|
||||
|
||||
- 仓库人员办理采购入库、自制件入库时,必须根据现场实际上架库位选择系统库位。
|
||||
- 系统存在该物料真实库存库位时,优先引导仓库人员选择已有库存库位,便于同物料集中存放和后续盘点。
|
||||
- 系统不存在该物料真实库存库位时,可以参考物料新建时维护的存放库位;仓库人员仍可从全库位中选择本次实际上架库位,形成后续库存查询和盘点依据。
|
||||
- 盘点发现实物库位与系统库位不一致时,应通过盘点调整、移库或后续明确的库存业务流程修正,不再通过物料基础资料维护直接改库位。
|
||||
|
||||
<br />
|
||||
|
||||
### 4.4 库存查询库位展示与明细查看
|
||||
|
||||
涉及文件:
|
||||
|
||||
- `src/views/WarehouseManagement/InventoryQuery/index.vue`
|
||||
|
||||
当前现状:
|
||||
|
||||
- 主表已有“库位”列,当前展示 `scope.row.货位名称`。
|
||||
- 主表已有“库存”列,展示该行 `scope.row.库存`。
|
||||
- 主表已有 `@cell-click="handleEdit"`,当前只处理点击“物料编码”展开出入库记录。
|
||||
- 页面查询调用 `仓储管理_库存查询_查询`。
|
||||
|
||||
改造目标:
|
||||
|
||||
- 库存查询主列表每个物料只展示一个主库位。
|
||||
- 主库位取该物料所有有库存库位中库存数最多的库位。
|
||||
- 用户点击主库位后,弹出或展开该物料所有有库存库位明细。
|
||||
|
||||
前端改造内容:
|
||||
|
||||
- 将“库位”列展示改为可点击文本。
|
||||
- 库位列显示字段建议为 `最大库存库位名称`,如后端暂不改字段名,也可继续使用 `货位名称`,但后端需保证该字段已经是最大库存库位。
|
||||
- 点击库位列时调用 `handleLocationClick(row)`。
|
||||
- 新增库位明细弹窗或 `el-popover`:
|
||||
- 表格列包含 `货位名称`、`货位存量`、`批次编号`、`供应商`、`最后入库日期` 等字段。
|
||||
- 明细只显示 `货位存量 > 0` 的库位。
|
||||
- 默认按 `货位存量 DESC` 排序。
|
||||
- 如果物料只有一个有库存库位,点击仍可显示明细,方便盘点人员查看库存数来源。
|
||||
|
||||
后端改造建议:
|
||||
|
||||
- 新增或调整库存查询明细过程,例如:
|
||||
- `仓储管理_库存查询_物料库位明细_查询`
|
||||
- 入参:
|
||||
- `物料流水号`
|
||||
- 返回:
|
||||
- `物料流水号`
|
||||
- `物料编码`
|
||||
- `物料名称`
|
||||
- `图号或型号`
|
||||
- `货位流水号`
|
||||
- `货位名称`
|
||||
- `货位存量`
|
||||
- `批次编号`
|
||||
- `供应商`
|
||||
- 主查询 `仓储管理_库存查询_查询` 调整为:
|
||||
- 按物料聚合库存。
|
||||
- 对每个物料取 `货位存量` 最大的库位作为主表 `货位名称`。
|
||||
- 若多个库位库存数相同,按 `货位流水号` 或 `货位名称` 稳定排序取第一条。
|
||||
|
||||
示例 SQL 思路:
|
||||
|
||||
```sql
|
||||
WITH LocationRank AS (
|
||||
SELECT
|
||||
物料流水号,
|
||||
货位流水号,
|
||||
货位名称,
|
||||
货位存量,
|
||||
ROW_NUMBER() OVER (
|
||||
PARTITION BY 物料流水号
|
||||
ORDER BY ISNULL(货位存量, 0) DESC, 货位流水号 ASC
|
||||
) AS rn
|
||||
FROM 库存管理_物料与货位对照表
|
||||
LEFT JOIN 库存管理_货位主文件
|
||||
ON 库存管理_物料与货位对照表.货位流水号 = 库存管理_货位主文件.货位流水号
|
||||
WHERE ISNULL(货位存量, 0) > 0
|
||||
)
|
||||
SELECT *
|
||||
FROM LocationRank
|
||||
WHERE rn = 1;
|
||||
```
|
||||
|
||||
业务说明:
|
||||
|
||||
- 主表库位用于快速定位优先盘点库位。
|
||||
- 明细库位用于处理一物多库位、一物多批次的盘点场景。
|
||||
- 主表库存仍应为该物料总库存,不能只显示最大库位库存。
|
||||
|
||||
## 五、后端改造方案
|
||||
|
||||
新增 SQL 脚本:
|
||||
|
||||
- `sql/移除物料标准库位维护.sql`
|
||||
|
||||
脚本调整对象:
|
||||
|
||||
- `物料管理_增加`
|
||||
- `物料管理_增加新`
|
||||
- `物料管理_编辑`
|
||||
|
||||
调整内容:
|
||||
|
||||
- 保留 `@货位流水号` 参数,兼容旧调用。
|
||||
- 新增物料时允许写入 `库存管理_物料主文件_基本.货位流水号`,作为物料“存放库位/建议库位”。
|
||||
- 新增物料时不再向 `库存管理_物料与货位对照表` 插入 `货位存量 = 0` 的初始记录。
|
||||
- 编辑物料时默认不更新 `库存管理_物料主文件_基本.货位流水号`,除非后续明确增加“修改存放库位”的独立权限入口。
|
||||
- 编辑物料时不再更新 `库存管理_物料与货位对照表.货位流水号`。
|
||||
- 库存查询主过程需按物料聚合真实库存,并返回库存数最多的库位作为主表展示库位。
|
||||
- 新增库存查询库位明细过程,用于点击主表库位时查看该物料所有有库存库位。
|
||||
|
||||
不调整内容:
|
||||
|
||||
- 入库过程仍继续接收 `货位流水号组`。
|
||||
- 历史物料主档中的 `货位流水号` 暂不清理,后续作为存放库位参考。
|
||||
- 历史 `库存管理_物料与货位对照表` 中的 0 库存记录暂不清理。
|
||||
|
||||
后端调整边界:
|
||||
|
||||
- 本次不批量重算历史库存库位,避免在盘点期间引入新的数据扰动。
|
||||
- 对已产生实际库存的物料库位关系,以库存业务单据和库存现存量记录为准;物料主档存放库位只作为建议或参考。
|
||||
- 后续若仓库主管确认需要清理历史 `货位存量 = 0` 的无效库位记录,应另行制定数据清理脚本,并在盘点结束或盘点数据确认后执行。
|
||||
|
||||
<br />
|
||||
|
||||
## 六、入库库位选择流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["用户点击入库行的库位按钮"] --> B["按物料名称和图号查询库存盘点"]
|
||||
B --> C{"是否存在库存大于 0 的库位"}
|
||||
C -->|是| D["显示已有库存库位"]
|
||||
C -->|否| E{"物料是否维护存放库位"}
|
||||
E -->|是| E1["全库位列表中优先展示存放库位"]
|
||||
E -->|否| E2["显示全库位"]
|
||||
D --> F["用户选择库位"]
|
||||
E1 --> F
|
||||
E2 --> F
|
||||
F --> G["写回行数据: 货位流水号、货位名称"]
|
||||
G --> H["入库提交"]
|
||||
H --> I["提交货位流水号组"]
|
||||
```
|
||||
|
||||
## 七、库存查询库位展示流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["库存查询加载主列表"] --> B["按物料汇总所有有库存库位"]
|
||||
B --> C["按货位存量倒序排序"]
|
||||
C --> D["取库存数最多的库位作为主表库位"]
|
||||
D --> E["用户点击主表库位"]
|
||||
E --> F["查询该物料所有货位存量大于 0 的库位"]
|
||||
F --> G["弹窗展示库位、库存数、批次等明细"]
|
||||
```
|
||||
|
||||
## 八、影响范围
|
||||
|
||||
### 8.1 受影响页面
|
||||
|
||||
- 技术中心物料维护
|
||||
- 技术中心物料查询
|
||||
- 仓储管理物料库位
|
||||
- 仓储管理采购入库
|
||||
- 仓储管理自制件入库
|
||||
- 仓储管理库存查询
|
||||
- 库存盘点人员使用的库存查询和盘点核对结果会间接受益于本次调整,后续新增库存的系统库位将更贴近现场真实库位。
|
||||
|
||||
<br />
|
||||
|
||||
### 8.2 受影响数据库对象
|
||||
|
||||
- `库存管理_物料主文件_基本`
|
||||
- `库存管理_物料与货位对照表`
|
||||
- `库存管理_外购件累计库存`
|
||||
- `物料管理_增加`
|
||||
- `物料管理_增加新`
|
||||
- `物料管理_编辑`
|
||||
- `仓储管理_库存查询_查询`
|
||||
- 新增 `仓储管理_库存查询_物料库位明细_查询`
|
||||
|
||||
### 8.3 不受影响业务
|
||||
|
||||
- 已有入库记录查询。
|
||||
- 已有出库、领料、调拨中基于真实库存记录的库位逻辑。
|
||||
- 库位基础资料维护页面 `LocationManagement`。
|
||||
- 当前历史库存数量不因本次调整自动变化。
|
||||
- 当前盘点差异数据不因本次调整自动生成或自动消除。
|
||||
|
||||
<br />
|
||||
|
||||
## 九、发布步骤
|
||||
|
||||
1. 发布前端代码。
|
||||
2. 执行 `sql/移除物料标准库位维护.sql`。
|
||||
3. 清浏览器缓存后进入系统验证。
|
||||
4. 验证物料新增可选择存放库位,编辑物料不修改真实库存库位。
|
||||
5. 验证物料库位维护页不可编辑。
|
||||
6. 验证采购入库和自制件入库的库位选择逻辑。
|
||||
7. 验证库存查询主表库位显示库存数最多的库位。
|
||||
8. 验证点击库存查询主表库位可查看该物料所有有库存库位。
|
||||
9. 由仓库主管或指定仓库人员抽取正在盘点的物料进行核对,确认系统库存库位、入库选择库位和现场实际库位的对应关系。
|
||||
10. 对盘点期间发现的历史库位不一致数据,记录物料名称、图号、系统库位、实际库位和差异原因,作为后续数据清理或库存调整依据。
|
||||
|
||||
<br />
|
||||
|
||||
推荐前后端同时发布。若不能同时发布,先发布后端脚本更稳妥。
|
||||
|
||||
## 十、验证清单
|
||||
|
||||
### 9.1 物料新增
|
||||
|
||||
- 新增弹窗显示“存放库位”。
|
||||
- 存放库位非必填。
|
||||
- 新增物料可正常保存。
|
||||
- 新增时选择存放库位后,`库存管理_物料主文件_基本.货位流水号` 写入该建议库位。
|
||||
- 新增时不选择存放库位后,`库存管理_物料主文件_基本.货位流水号` 为空。
|
||||
- 新增后不生成 `货位存量 = 0` 的物料货位对照记录。
|
||||
|
||||
### 9.2 物料编辑
|
||||
|
||||
- 编辑弹窗不显示库位。
|
||||
- 修改名称、图号、单位、材料、类型、物料库等字段可正常保存。
|
||||
- 编辑时不改变物料已有真实库存库位。
|
||||
- 编辑时不覆盖物料主档存放库位。
|
||||
|
||||
### 9.3 物料库位查询
|
||||
|
||||
- 页面可正常按物料名称、图号、库位查询。
|
||||
- 页面不显示编辑按钮。
|
||||
- 双击行不进入编辑状态。
|
||||
- 不再调用 `仓储管理_物料库位_编辑数据`。
|
||||
|
||||
### 9.4 入库库位选择
|
||||
|
||||
- 物料已有库存库位时,下拉只显示已有库存库位。
|
||||
- 下拉显示库存数量。
|
||||
- 物料没有库存库位时,下拉显示全库位。
|
||||
- 未选择库位时不允许入库。
|
||||
- 选择库位后采购入库可正常提交。
|
||||
- 选择库位后自制件入库可正常提交。
|
||||
|
||||
### 9.5 盘点业务核对
|
||||
|
||||
- 盘点人员按系统库存查询结果查看物料库位时,可以明确区分历史库位数据和后续真实入库库位数据。
|
||||
- 仓库人员新办理入库后,库存查询或盘点查询中的库位应与入库时选择的实际库位一致。
|
||||
- 对无真实库存的物料,不应因为物料新增自动生成 `货位存量 = 0` 的库位记录干扰盘点查询。
|
||||
- 对现场已发现系统库位与实际库位不一致的物料,应形成差异记录,不通过物料主档编辑直接修正。
|
||||
|
||||
### 9.6 库存查询库位展示
|
||||
|
||||
- 一物一库位时,主表库位显示该库位。
|
||||
- 一物多库位时,主表库位显示 `货位存量` 最大的库位。
|
||||
- 多个库位库存数相同,主表库位按稳定排序规则显示固定结果。
|
||||
- 主表“库存”列显示物料总库存,不显示单个库位库存。
|
||||
- 点击主表库位,弹出该物料所有 `货位存量 > 0` 的库位明细。
|
||||
- 库位明细按库存数倒序显示。
|
||||
- 库位明细中不显示 0 库存库位。
|
||||
|
||||
<br />
|
||||
|
||||
## 十一、风险与回退
|
||||
|
||||
### 11.1 风险
|
||||
|
||||
- 若后端脚本未执行,物料新增时仍可能向物料货位对照表写入 `货位存量 = 0` 的记录。
|
||||
- 历史 0 库存物料货位记录仍存在,若库存盘点视图没有过滤库存数量,可能仍被查询出来。
|
||||
- 部分报表如依赖物料主档默认库位,需要明确该字段现在是“存放库位/建议库位”,不代表真实库存库位。
|
||||
- 当前盘点期间已经暴露的历史库位不匹配问题,不会因本次功能调整自动修复,需要仓库结合盘点结果进行后续校正。
|
||||
- 若仓库人员入库时未按实际上架位置选择库位,仍可能继续产生新的系统库位与实际库位不一致问题,因此需要同步明确仓库操作要求。
|
||||
- 库存查询主表改为显示最大库存库位后,用户可能误以为物料只在该库位,需要通过点击明细和文案提示说明“一物可能多库位”。
|
||||
|
||||
<br />
|
||||
|
||||
### 11.2 回退方式
|
||||
|
||||
- 前端回退相关 Vue 文件。
|
||||
- 数据库可用脚本备份中的原存储过程定义恢复。
|
||||
- 回退后重新构建并发布前端。
|
||||
|
||||
158
docs/物料编码搜索功能/核心物料搜索栏添加物料编码查询测试报告.md
Normal file
@@ -0,0 +1,158 @@
|
||||
# 核心物料搜索栏添加物料编码查询测试报告
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 15:06:32
|
||||
|
||||
## 1. 测试背景
|
||||
|
||||
本次测试对应罗伟提出的“核心物料搜索栏页面添加物料编码搜索功能”需求。现场库存盘点过程中,存在部分物料在新建时因物料名称、图号重复命名导致盘点人员难以准确确认物料的问题。后续现场计划在物料标签中使用唯一物料编码进行识别,因此系统核心物料搜索栏需要支持按物料编码进行查询和筛选,便于盘点、库存查询、物料库位查询、入库记录、出入库记录等业务快速匹配唯一物料。
|
||||
|
||||
测试目标是确认前端核心页面已增加物料编码搜索条件,后端核心查询存储过程已支持物料编码参数,且通过真实数据库数据验证物料编码能够正确筛选目标物料。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 15:06:32
|
||||
|
||||
## 2. 测试环境
|
||||
|
||||
| 项目 | 内容 |
|
||||
| --- | --- |
|
||||
| 项目路径 | D:\景耀\JY1.0 |
|
||||
| 前端框架 | Vue 2.5.17、Element UI 2.13.0 |
|
||||
| 模板编译工具 | vue-template-compiler 2.5.17 |
|
||||
| 数据库服务器 | 192.168.1.27 |
|
||||
| 数据库名称 | ERPTOOL_JY_20250826Back |
|
||||
| 数据库账号 | sa |
|
||||
| 数据库密码 | 已脱敏,不在测试文档中明文记录 |
|
||||
| 测试时间 | 2026-06-29 15:03 至 2026-06-29 15:06 |
|
||||
| 测试人员 | GPT/Codex |
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 15:06:32
|
||||
|
||||
## 3. 测试范围
|
||||
|
||||
### 3.1 前端页面范围
|
||||
|
||||
| 序号 | 页面 | 文件 |
|
||||
| --- | --- | --- |
|
||||
| 1 | 技术中心-物料查询 | src/views/TechnologyCenter/MaterialQuery/index.vue |
|
||||
| 2 | 技术中心-物料维护 | src/views/TechnologyCenter/MaterialMaintain/index.vue |
|
||||
| 3 | 仓储管理-库存查询 | src/views/WarehouseManagement/InventoryQuery/index.vue |
|
||||
| 4 | 仓储管理-物料库位 | src/views/WarehouseManagement/MaterialLocation/index.vue |
|
||||
| 5 | 仓储管理-库存盘点 | src/views/WarehouseManagement/InventoryCheck/index.vue |
|
||||
| 6 | 仓储管理-入库记录 | src/views/WarehouseManagement/WarehousingRecord/WarehousingRecord.vue |
|
||||
| 7 | 仓储管理-物料记录 | src/views/WarehouseManagement/MaterialRecord/index.vue |
|
||||
| 8 | 仓储管理-盘点记录 | src/views/WarehouseManagement/InventoryRecord/index.vue |
|
||||
| 9 | 仓储管理-入库退货记录 | src/views/WarehouseManagement/ReturnRecord/index.vue |
|
||||
|
||||
### 3.2 数据库过程范围
|
||||
|
||||
| 序号 | 存储过程 |
|
||||
| --- | --- |
|
||||
| 1 | 物料管理_查询数据_分页 |
|
||||
| 2 | 仓储管理_库存查询_查询 |
|
||||
| 3 | 报表_仓储管理_通用库存_查询 |
|
||||
| 4 | 仓储管理_库存盘点_查询 |
|
||||
| 5 | 仓储管理_物料库位_查询数据 |
|
||||
| 6 | 仓储管理_入库记录_查询 |
|
||||
| 7 | 仓储管理_入库记录_导出表格_查询 |
|
||||
| 8 | 仓储管理_物料记录_查询新 |
|
||||
| 9 | 仓储管理_物料记录_查询 |
|
||||
| 10 | 报表_仓储管理_物料记录_查询 |
|
||||
| 11 | 仓储管理_盘点记录_查询 |
|
||||
| 12 | 报表_仓储管理_盘点记录_查询 |
|
||||
| 13 | 仓储管理_入库记录退货_条件查询 |
|
||||
|
||||
### 3.3 脚本范围
|
||||
|
||||
| 类型 | 文件 |
|
||||
| --- | --- |
|
||||
| SQL调整脚本 | sql/核心物料搜索栏_物料编码查询_存储过程调整.sql |
|
||||
| 设计方案文档 | docs/核心物料搜索栏添加物料编码查询设计方案.md |
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 15:06:32
|
||||
|
||||
## 4. 测试方法
|
||||
|
||||
1. 使用 vue-template-compiler 对核心页面 Vue 单文件组件模板进行编译检查,确认新增物料编码搜索栏不会导致模板语法错误。
|
||||
2. 使用静态检索检查核心页面是否存在物料编码搜索栏、物料编码字段绑定、物料编码请求参数和后端参数名。
|
||||
3. 使用静态检索确认核心页面搜索栏中不再残留容易造成现场误解的“物料编号”展示文案。
|
||||
4. 连接 SQL Server 测试库,检查核心存储过程是否均已具备 `@物料编码_check` 和 `@物料编码` 参数。
|
||||
5. 使用不存在的物料编码 `__CODEX_NOT_EXISTS__` 执行核心查询过程,验证过程能够正常执行且筛选无匹配数据时不报错。
|
||||
6. 从物料主文件中选取真实物料编码 `03.101.001.0011`,执行物料主数据、库存查询、物料库位、库存盘点等关键链路查询,验证可按物料编码返回目标物料。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 15:06:32
|
||||
|
||||
## 5. 测试用例与结果
|
||||
|
||||
| 用例编号 | 测试项 | 测试步骤 | 期望结果 | 实际结果 | 结论 |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| TC-001 | 前端模板编译 | 对 8 个已修改核心页面执行 Vue 模板编译 | 模板编译通过,无语法错误 | 8 个页面均返回 template ok | 通过 |
|
||||
| TC-002 | 前端物料编码搜索栏覆盖 | 检索 `placeholder="物料编码"`、`label="物料编码"`、`物料编码_check`、`materialCodeValue`、`MaterialCode`、`materialCode` | 核心页面存在物料编码输入框、导出条件和请求参数 | 9 个核心页面均检索到预期字段或参数 | 通过 |
|
||||
| TC-003 | 前端旧文案清理 | 检索核心页面中的 `placeholder="物料编号"` 和 `label="物料编号"` | 核心搜索栏不再展示“物料编号”旧文案 | 未检索到旧展示文案 | 通过 |
|
||||
| TC-004 | 数据库存储过程参数覆盖 | 查询 13 个核心存储过程的参数 | 每个过程均包含 `@物料编码_check` 和 `@物料编码` | 13 个过程均返回 CodeParamCount=2 | 通过 |
|
||||
| TC-005 | 不存在物料编码查询 | 使用 `__CODEX_NOT_EXISTS__` 执行物料记录、盘点记录、报表等过程 | 过程正常执行,无 SQL 错误,允许无数据返回 | 所有执行过程退出码为 0,导出类过程返回导出元数据 | 通过 |
|
||||
| TC-006 | 物料主数据按编码查询 | 使用真实编码 `03.101.001.0011` 执行 `物料管理_查询数据_分页` | 返回该编码对应物料 | 返回物料编码 `03.101.001.0011`,物料名称为 `304不锈钢内外牙螺母转换变径牙套` | 通过 |
|
||||
| TC-007 | 库存查询按编码查询 | 使用真实编码执行 `仓储管理_库存查询_查询` | 库存查询结果限定目标物料 | 返回物料编码 `03.101.001.0011` 及对应名称、规格信息 | 通过 |
|
||||
| TC-008 | 物料库位按编码查询 | 使用真实编码执行 `仓储管理_物料库位_查询数据` | 物料库位结果限定目标物料 | 返回物料编码 `03.101.001.0011`、物料流水号 `24371`、物料分类编号 `2581` | 通过 |
|
||||
| TC-009 | 库存盘点按编码查询 | 使用真实编码执行 `仓储管理_库存盘点_查询` | 盘点列表结果限定目标物料 | 返回物料编码 `03.101.001.0011` 及对应盘点字段 | 通过 |
|
||||
| TC-010 | 导出过程参数兼容 | 检查导出类存储过程并执行无匹配编码场景 | 导出过程接受物料编码参数且不报错 | `报表_仓储管理_物料记录_查询`、`报表_仓储管理_盘点记录_查询` 均正常返回导出元数据 | 通过 |
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 15:06:32
|
||||
|
||||
## 6. 关键测试输出摘要
|
||||
|
||||
### 6.1 前端模板编译结果
|
||||
|
||||
```text
|
||||
src/views/TechnologyCenter/MaterialMaintain/index.vue template ok
|
||||
src/views/WarehouseManagement/MaterialRecord/index.vue template ok
|
||||
src/views/WarehouseManagement/InventoryRecord/index.vue template ok
|
||||
src/views/WarehouseManagement/ReturnRecord/index.vue template ok
|
||||
src/views/WarehouseManagement/MaterialLocation/index.vue template ok
|
||||
src/views/WarehouseManagement/InventoryCheck/index.vue template ok
|
||||
src/views/WarehouseManagement/InventoryQuery/index.vue template ok
|
||||
src/views/WarehouseManagement/WarehousingRecord/WarehousingRecord.vue template ok
|
||||
```
|
||||
|
||||
### 6.2 数据库存储过程参数检查结果
|
||||
|
||||
```text
|
||||
报表_仓储管理_盘点记录_查询 CodeParamCount=2
|
||||
报表_仓储管理_通用库存_查询 CodeParamCount=2
|
||||
报表_仓储管理_物料记录_查询 CodeParamCount=2
|
||||
仓储管理_库存查询_查询 CodeParamCount=2
|
||||
仓储管理_库存盘点_查询 CodeParamCount=2
|
||||
仓储管理_盘点记录_查询 CodeParamCount=2
|
||||
仓储管理_入库记录_查询 CodeParamCount=2
|
||||
仓储管理_入库记录_导出表格_查询 CodeParamCount=2
|
||||
仓储管理_入库记录退货_条件查询 CodeParamCount=2
|
||||
仓储管理_物料记录_查询 CodeParamCount=2
|
||||
仓储管理_物料记录_查询新 CodeParamCount=2
|
||||
仓储管理_物料库位_查询数据 CodeParamCount=2
|
||||
物料管理_查询数据_分页 CodeParamCount=2
|
||||
```
|
||||
|
||||
### 6.3 真实物料编码验证结果
|
||||
|
||||
| 验证编码 | 物料名称 | 规格 | 关键结果 |
|
||||
| --- | --- | --- | --- |
|
||||
| 03.101.001.0011 | 304不锈钢内外牙螺母转换变径牙套 | M8×M12×L20 | 物料主数据、库存查询、物料库位、库存盘点均可按编码返回目标物料 |
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 15:06:32
|
||||
|
||||
## 7. 风险与限制
|
||||
|
||||
1. 本次未执行浏览器登录后的端到端点击测试,原因是当前测试环境未启动已认证的前端业务系统;已通过 Vue 模板编译、静态字段覆盖和数据库真实过程调用验证核心链路。
|
||||
2. 本次未执行完整 `npm run build`,避免对当前工作区已有构建产物和无关脏文件产生额外影响;如后续上线前需要,可单独执行完整构建验证。
|
||||
3. SQL 正向测试依赖当前测试库真实数据,若后续物料编码 `03.101.001.0011` 被删除、停用或调整,复测时需要重新选取存在的物料编码。
|
||||
4. `仓储管理_库存查询_查询` 执行时会输出动态 SQL 文本,该输出为过程现有行为,不属于本次物料编码查询改造错误。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 15:06:32
|
||||
|
||||
## 8. 测试结论
|
||||
|
||||
本次测试结论为通过。
|
||||
|
||||
核心物料搜索栏已覆盖物料编码查询条件,相关前端页面模板编译通过,核心页面未残留容易混淆的“物料编号”搜索栏展示文案。数据库侧 13 个核心查询及导出存储过程均已包含物料编码筛选参数,使用不存在编码和真实编码分别验证后,过程执行正常,真实物料编码能够正确匹配物料主数据、库存查询、物料库位和库存盘点结果。
|
||||
|
||||
该功能满足现场库存盘点通过唯一物料编码快速确认物料的需求,可进入后续人工业务验收和上线前回归验证阶段。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 15:06:32
|
||||
399
docs/物料编码搜索功能/核心物料搜索栏添加物料编码查询设计方案.md
Normal file
@@ -0,0 +1,399 @@
|
||||
# 核心物料搜索栏添加物料编码查询设计方案
|
||||
|
||||
## 1. 需求背景
|
||||
|
||||
本需求由罗伟提出,主要服务于现场库存盘点业务。
|
||||
|
||||
当前现场正在进行库存盘点。盘点过程中发现,系统内部分物料在新建物料信息时,由于历史录入习惯、命名规则不统一、同类物料复用名称、图号或型号描述不完整等原因,存在物料名称重复、图号或型号重复、名称与图号组合仍无法准确区分物料的情况。
|
||||
|
||||
在盘点现场,仓库人员需要快速确认实物标签对应的系统物料。如果仅依赖物料名称、规格型号、图号等字段进行搜索,当多个物料名称或图号相近甚至重复时,页面会返回多条近似记录,盘点人员需要逐条比对,容易出现以下问题:
|
||||
|
||||
1. 盘点确认速度慢,影响现场盘点效率。
|
||||
2. 同名或同图号物料难以区分,增加误选风险。
|
||||
3. 实物标签与系统数据匹配不稳定,后续盘点差异复核成本高。
|
||||
4. 现场人员对物料主数据命名差异不熟悉时,更难快速定位唯一物料。
|
||||
|
||||
为解决上述问题,现场计划后续物料标签统一使用唯一的物料编码作为识别依据。同时,系统内最核心的物料搜索栏页面需要增加“物料编码”查询筛选能力,使盘点人员可以直接根据标签上的唯一物料编码定位系统物料,避免因物料名称、图号或型号重复导致的识别困难。
|
||||
|
||||
<br />
|
||||
|
||||
## 2. 建设目标
|
||||
|
||||
本次设计目标是在项目中最核心、最常用于物料查询和盘点确认的页面搜索栏中增加“物料编码”查询功能。
|
||||
|
||||
具体目标如下:
|
||||
|
||||
1. 在核心物料搜索栏页面增加独立的“物料编码”输入条件。
|
||||
2. 支持用户输入物料编码后直接查询并筛选唯一或近似匹配物料。
|
||||
3. 保留原有物料名称、图号或型号、物料类型、库位、仓库等查询条件,保证历史操作习惯不受影响。
|
||||
4. 支持物料编码与原有查询条件组合筛选。
|
||||
5. 后端查询过程增加物料编码可选参数,未输入物料编码时保持原查询结果不变。
|
||||
6. 涉及导出、分页、排序等功能的页面,应保持查询结果与导出结果一致。
|
||||
7. 为后续物料标签使用唯一物料编码提供系统查询支撑。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
## 3. 设计范围
|
||||
|
||||
本次范围以“页面搜索栏”为主,不包含新增物料、选择物料、查看库存等弹窗中的临时查询入口。
|
||||
|
||||
优先改造以下最核心页面:
|
||||
|
||||
| 模块 | 页面名称 | 文件路径 | 当前查询特点 | 本次调整 |
|
||||
| ---- | ----- | ----------------------------------------------------------------------- | ------------------------------- | ------------------- |
|
||||
| 技术中心 | 物料查询 | `src/views/TechnologyCenter/MaterialQuery/index.vue` | 物料主数据查询,已有物料编码、物料名称、图号/型号等条件 | 统一确认物料编码条件传参和后端过滤能力 |
|
||||
| 技术中心 | 物料维护 | `src/views/TechnologyCenter/MaterialMaintain/index.vue` | 物料主数据维护,已有物料编码、物料名称、图号/型号等条件 | 统一确认物料编码条件传参和后端过滤能力 |
|
||||
| 仓储管理 | 库存查询 | `src/views/WarehouseManagement/InventoryQuery/index.vue` | 库存主查询,包含物料编号、物料名称、图号型号、类型、库位等条件 | 增强物料编码精确定位能力 |
|
||||
| 仓储管理 | 物料库位 | `src/views/WarehouseManagement/MaterialLocation/index.vue` | 按物料、图号、库位查询物料所在库位 | 增强按物料编码定位库位能力 |
|
||||
| 仓储管理 | 库存盘点 | `src/views/WarehouseManagement/InventoryCheck/index.vue` | 盘点现场高频页面,涉及物料、图号、编码等查询条件 | 重点支持标签物料编码查询 |
|
||||
| 仓储管理 | 入库记录 | `src/views/WarehouseManagement/WarehousingRecord/WarehousingRecord.vue` | 入库记录中可按物料名称、物料编码等条件筛选 | 确认搜索栏编码条件与导出条件一致 |
|
||||
| 仓储管理 | 退货记录 | `src/views/WarehouseManagement/ReturnRecord/index.vue` | 当前输入框偏综合条件,按物料名称/编号/规格/型号查询 | 明确拆分或补充物料编码查询能力 |
|
||||
| 仓储管理 | 物料记录 | `src/views/WarehouseManagement/MaterialRecord/index.vue` | 物料出入库记录查询,当前主要按物料名称筛选 | 增加物料编码条件 |
|
||||
| 仓储管理 | 库存记录 | `src/views/WarehouseManagement/InventoryRecord/index.vue` | 库存历史记录查询,当前主要按物料名称筛选 | 增加物料编码条件 |
|
||||
| 仓储管理 | 采购件入库 | `src/views/WarehouseManagement/PurchasePartsStorage/index.vue` | 入库相关查询涉及物料名称、图号或型号 | 增加或统一物料编码条件 |
|
||||
|
||||
后续可根据现场使用频率扩展至采购、精工车间、销售、装配等更多页面,但第一阶段应优先保证仓储盘点和物料主数据查询链路完整。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
## 4. 现状问题分析
|
||||
|
||||
### 4.1 物料名称不是唯一识别字段
|
||||
|
||||
物料名称用于业务人员理解物料含义,但并不适合作为唯一识别依据。现场存在同类物料使用相同或近似名称的情况,例如名称相同但规格、批次、厂家、图号或内部编码不同。
|
||||
|
||||
仅按物料名称查询时,系统可能返回多条记录,盘点人员需要再人工判断,效率低且容易误选。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
### 4.2 图号或型号也可能重复或不完整
|
||||
|
||||
图号或型号通常来源于技术资料、采购资料或历史录入。由于历史数据存在命名不统一、字段填写不完整、图号简称和完整图号混用等情况,图号或型号同样无法稳定保证唯一。
|
||||
|
||||
盘点人员如果只扫描或输入图号,仍可能出现多条记录,无法快速确认实物对应的系统物料。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
### 4.3 现场标签需要与系统查询方式统一
|
||||
|
||||
现场后续计划使用唯一物料编码作为标签识别字段。如果系统页面没有物料编码搜索能力,即使实物标签已经规范,人员仍需要通过名称或图号间接查找,标签规范化的价值无法充分发挥。
|
||||
|
||||
因此,系统查询方式必须与标签识别方式保持一致。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
## 5. 总体方案
|
||||
|
||||
本次方案采用“前端增加独立查询条件、后端存储过程增加可选参数、查询和导出同步支持”的方式实施。
|
||||
|
||||
### 5.1 前端搜索栏调整
|
||||
|
||||
在核心页面搜索栏中增加或确认“物料编码”输入框。
|
||||
|
||||
推荐展示方式:
|
||||
|
||||
```html
|
||||
<el-input
|
||||
v-model="materialCodeValue"
|
||||
style="width: 160px"
|
||||
placeholder="物料编码"
|
||||
size="small"
|
||||
clearable
|
||||
@keyup.enter.native="pageCurrent=1;searchTable()"/>
|
||||
```
|
||||
|
||||
如果页面已有“物料编号”输入框,应统一确认其实际传参字段是否对应数据库中的 `物料编码`。如果只是综合搜索字段,应调整为独立字段,避免和物料名称、规格型号混在同一个条件中。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
### 5.2 前端参数拼接规则
|
||||
|
||||
在 `searchTable()` 或对应主查询方法中增加物料编码条件。
|
||||
|
||||
推荐参数格式:
|
||||
|
||||
```js
|
||||
this.materialCodeValue ? materialCodeValue_check = 1 : materialCodeValue_check = 0
|
||||
param[n] = ['物料编码_check', materialCodeValue_check]
|
||||
param[n + 1] = ['物料编码', this.materialCodeValue]
|
||||
```
|
||||
|
||||
如果后端存储过程使用字段名 `物料编码`,前端统一传 `物料编码_check` 和 `物料编码`。如果历史过程使用 `物料码`、`物料编号`、`物料流水号` 等字段,需要在后端过程内做兼容或在本页面保持原过程约定,但文档和页面显示统一为“物料编码”。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
### 5.3 后端查询过程调整
|
||||
|
||||
涉及页面对应的存储过程需要增加物料编码可选参数。
|
||||
|
||||
推荐参数:
|
||||
|
||||
```sql
|
||||
@物料编码_check int = 0,
|
||||
@物料编码 nvarchar(100) = null
|
||||
```
|
||||
|
||||
推荐过滤逻辑:
|
||||
|
||||
```sql
|
||||
if @物料编码_check = 1
|
||||
begin
|
||||
set @sql = @sql + ' and 物料编码 like ''%'' + @物料编码 + ''%'' '
|
||||
end
|
||||
```
|
||||
|
||||
如果业务上要求扫码后精确定位,可在库存盘点页面优先使用精确匹配:
|
||||
|
||||
```sql
|
||||
and 物料编码 = @物料编码
|
||||
```
|
||||
|
||||
考虑到目前系统搜索习惯多为模糊查询,第一阶段建议使用模糊查询;后续如果标签扫码稳定,可在盘点页面增加“精确匹配”策略或自动识别完整编码时使用精确匹配。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
### 5.4 查询与导出一致
|
||||
|
||||
凡是页面支持 Excel 导出的,导出参数必须同步增加物料编码条件。
|
||||
|
||||
要求:
|
||||
|
||||
1. 页面查询传入 `物料编码_check` 和 `物料编码`。
|
||||
2. 导出方法传入同样的 `物料编码_check` 和 `物料编码`。
|
||||
3. 同一组搜索条件下,页面列表与导出文件数据范围一致。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
## 6. 页面设计细节
|
||||
|
||||
### 6.1 物料查询页面
|
||||
|
||||
文件:`src/views/TechnologyCenter/MaterialQuery/index.vue`
|
||||
|
||||
设计要求:
|
||||
|
||||
1. 搜索栏保留物料编码、物料名称、图号/型号、物料类型、修改时间。
|
||||
2. 查询方法 `searchTable()` 中确认 `物料编码_check`、`物料编码` 参数可传入后端。
|
||||
3. 表格中建议保留或增加物料编码列,便于和搜索条件互相验证。
|
||||
4. 物料编码为空时,查询结果与原逻辑一致。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
### 6.2 物料维护页面
|
||||
|
||||
文件:`src/views/TechnologyCenter/MaterialMaintain/index.vue`
|
||||
|
||||
设计要求:
|
||||
|
||||
1. 与物料查询页面保持搜索条件一致。
|
||||
2. 维护人员可通过物料编码快速定位需要修改的物料。
|
||||
3. 如果物料名称或图号重复,编码搜索结果应能明确定位到具体记录。
|
||||
4. 修改物料基础信息时,不允许随意修改唯一物料编码;如确需修改,应由权限或后端规则控制。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
### 6.3 库存查询页面
|
||||
|
||||
文件:`src/views/WarehouseManagement/InventoryQuery/index.vue`
|
||||
|
||||
设计要求:
|
||||
|
||||
1. 搜索栏保留物料编号、物料名称、图号型号、类型、库位或仓库等条件。
|
||||
2. 页面显示文案建议统一为“物料编码”,避免“物料编号”和“物料编码”混用造成理解偏差。
|
||||
3. 查询时支持按物料编码过滤当前库存。
|
||||
4. 如果用户同时输入物料编码和库位,应返回该编码在指定库位下的库存记录。
|
||||
5. 导出库存数据时同步带入物料编码条件。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
### 6.4 物料库位页面
|
||||
|
||||
文件:`src/views/WarehouseManagement/MaterialLocation/index.vue`
|
||||
|
||||
设计要求:
|
||||
|
||||
1. 搜索栏保留物料编码、物料名称/规格、图号/型号、库位。
|
||||
2. 现场可输入标签物料编码,快速确认该物料当前绑定或存放库位。
|
||||
3. 物料编码与库位组合查询时,应可用于检查实物库位与系统库位是否一致。
|
||||
4. 若未查到数据,应提示用户确认物料编码是否存在或是否已维护库位。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
### 6.5 库存盘点页面
|
||||
|
||||
文件:`src/views/WarehouseManagement/InventoryCheck/index.vue`
|
||||
|
||||
设计要求:
|
||||
|
||||
1. 作为本次需求的重点页面,搜索栏必须支持物料编码。
|
||||
2. 现场盘点时,人员可根据物料标签输入或扫码物料编码,快速筛选盘点记录。
|
||||
3. 如果物料编码唯一匹配一条库存记录,应减少人工在多条同名物料中判断的成本。
|
||||
4. 如果同一物料编码在多个库位有库存,应按库位分行展示,便于盘点人员逐库位确认。
|
||||
5. 盘点导入、盘点导出、盘点明细查询如使用同一查询条件,应同步支持物料编码。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
### 6.6 入库记录和退货记录页面
|
||||
|
||||
涉及文件:
|
||||
|
||||
- `src/views/WarehouseManagement/WarehousingRecord/WarehousingRecord.vue`
|
||||
- `src/views/WarehouseManagement/ReturnRecord/index.vue`
|
||||
|
||||
设计要求:
|
||||
|
||||
1. 入库记录应可按物料编码追溯某一物料的入库历史。
|
||||
2. 退货记录应可按物料编码追溯某一物料的退货历史。
|
||||
3. 如果当前页面只有“物料名称/编号/规格/型号”综合输入框,建议拆分出独立“物料编码”输入框。
|
||||
4. 页面查询与导出保持一致。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
## 7. 接口和存储过程影响
|
||||
|
||||
本项目业务请求统一通过 `MESCommonBase.ashx`,前端通过 `CreateData(type, name, data, pageSize, pageList)` 构建请求。新增物料编码查询不改变请求端点,不新增前端请求封装方式。
|
||||
|
||||
可能涉及的后端过程包括但不限于:
|
||||
|
||||
| 页面 | 可能涉及接口或过程 | 调整内容 |
|
||||
| ---- | ------------------------ | -------- |
|
||||
| 物料查询 | `物料管理_查询数据_分页` | 增加物料编码过滤 |
|
||||
| 物料维护 | `物料管理_查询数据_分页` 或对应维护查询过程 | 增加物料编码过滤 |
|
||||
| 库存查询 | 仓储库存查询相关过程 | 增加物料编码过滤 |
|
||||
| 物料库位 | 仓储管理物料库位查询相关过程 | 增加物料编码过滤 |
|
||||
| 库存盘点 | 仓储管理库存盘点查询相关过程 | 增加物料编码过滤 |
|
||||
| 入库记录 | 仓储管理入库记录查询和导出过程 | 增加物料编码过滤 |
|
||||
| 退货记录 | 仓储管理退货记录查询过程 | 增加物料编码过滤 |
|
||||
|
||||
后端调整原则:
|
||||
|
||||
1. 新增参数必须为可选参数,避免影响未改造页面。
|
||||
2. 原有查询条件保持不变,物料编码作为新增条件叠加。
|
||||
3. SQL 字段命名优先使用数据库现有字段,常见字段为 `物料编码`。
|
||||
4. 如果查询主表没有物料编码字段,应通过物料流水号关联物料主文件取得编码后过滤。
|
||||
5. 对大数据页面应确认物料编码字段有索引或可使用已有索引,避免新增条件后查询变慢。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
## 8. 数据规则
|
||||
|
||||
### 8.1 物料编码唯一性
|
||||
|
||||
物料编码应作为系统内识别物料的唯一业务编码。后续标签打印、库存盘点、入库、出库、库位维护等环节,应优先使用物料编码进行识别和核对。
|
||||
|
||||
如果历史数据中存在物料编码为空或重复,应先由主数据维护人员进行清理,并形成异常清单。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
### 8.2 物料名称和图号保留辅助识别
|
||||
|
||||
新增物料编码搜索后,物料名称、图号或型号仍然保留,用于人工理解和辅助筛选。系统不应因为新增物料编码而删除或弱化原有查询字段。
|
||||
|
||||
推荐使用方式:
|
||||
|
||||
1. 盘点现场优先输入或扫码物料编码。
|
||||
2. 不清楚编码时,可使用物料名称或图号模糊查询。
|
||||
3. 编码、名称、图号可组合使用,进一步缩小范围。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
## 9. 前端开发步骤
|
||||
|
||||
1. 梳理核心页面现有搜索栏,确认是否已有物料编码输入框。
|
||||
2. 对没有独立物料编码输入框的页面,新增 `el-input`。
|
||||
3. 在 `data()` 中新增或确认变量,例如 `materialCodeValue`、`MaterialCode`。
|
||||
4. 在 `searchTable()` 中增加编码输入值判断,生成 `物料编码_check`。
|
||||
5. 在 `param` 数组中追加 `物料编码_check` 和 `物料编码`。
|
||||
6. 同步调整导出方法中的查询参数。
|
||||
7. 确认分页重置逻辑:点击查询或回车查询时,`pageCurrent` 应重置为 `1`。
|
||||
8. 检查表格是否显示物料编码列;若不显示,应评估是否需要补充。
|
||||
9. 按项目要求在变更代码处追加备注:`修改人:Ld 修改时间:当时的时间`。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
## 10. 后端开发步骤
|
||||
|
||||
1. 确认各页面 `CreateData` 中的 `name` 对应后端存储过程。
|
||||
2. 在存储过程参数中增加 `物料编码_check` 和 `物料编码`。
|
||||
3. 在查询条件中增加物料编码过滤逻辑。
|
||||
4. 如果过程使用动态 SQL,同步补充 `sp_executesql` 参数定义和参数传值。
|
||||
5. 如果导出使用独立过程,导出过程同步增加物料编码过滤。
|
||||
6. 对库存盘点、库存查询等大数据过程执行查询计划检查。
|
||||
7. 使用实际物料编码测试单条件查询、组合条件查询、空条件查询。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
## 11. 验收标准
|
||||
|
||||
### 11.1 功能验收
|
||||
|
||||
1. 在核心物料搜索栏页面可以看到“物料编码”查询条件。
|
||||
2. 输入完整物料编码后,可以查询到对应物料或库存记录。
|
||||
3. 输入不存在的物料编码时,页面返回空结果,不报错。
|
||||
4. 物料编码与物料名称组合查询时,结果同时满足两个条件。
|
||||
5. 物料编码与图号或型号组合查询时,结果同时满足两个条件。
|
||||
6. 清空物料编码后,查询结果恢复为原有条件下的结果。
|
||||
7. 页面分页、排序、刷新后查询逻辑正常。
|
||||
8. 导出文件与页面查询结果范围一致。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
### 11.2 现场验收
|
||||
|
||||
1. 使用现场物料标签上的唯一物料编码进行查询。
|
||||
2. 同名物料、同图号物料场景下,能通过物料编码准确区分。
|
||||
3. 盘点人员可以根据物料编码快速定位物料及库位。
|
||||
4. 现场不再需要仅依赖物料名称或图号人工判断同名物料。
|
||||
5. 盘点差异复核时,可以通过物料编码追溯库存记录、入库记录或退货记录。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
## 12. 测试用例
|
||||
|
||||
| 用例编号 | 测试场景 | 操作步骤 | 预期结果 |
|
||||
| ------ | --------- | ---------------- | ---------------- |
|
||||
| TC-001 | 按完整物料编码查询 | 输入完整物料编码,点击查询 | 返回对应物料记录 |
|
||||
| TC-002 | 按部分物料编码查询 | 输入物料编码前几位,点击查询 | 返回编码包含输入内容的记录 |
|
||||
| TC-003 | 编码不存在 | 输入不存在的编码,点击查询 | 返回空列表,页面不报错 |
|
||||
| TC-004 | 编码加名称组合查询 | 输入物料编码和物料名称,点击查询 | 结果同时满足编码和名称条件 |
|
||||
| TC-005 | 编码加图号组合查询 | 输入物料编码和图号,点击查询 | 结果同时满足编码和图号条件 |
|
||||
| TC-006 | 清空编码查询 | 清空物料编码,仅保留原条件查询 | 结果与原逻辑一致 |
|
||||
| TC-007 | 盘点页面标签验证 | 使用现场标签编码查询库存盘点页面 | 能快速定位对应物料或对应库位库存 |
|
||||
| TC-008 | 导出一致性 | 输入物料编码查询后导出 | 导出数据与页面筛选范围一致 |
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
## 13. 风险与控制
|
||||
|
||||
| 风险 | 影响 | 控制措施 |
|
||||
| ---------------------- | ------------- | ------------------------- |
|
||||
| 历史物料编码为空 | 无法通过编码定位部分旧物料 | 输出异常清单,先补齐主数据 |
|
||||
| 历史物料编码重复 | 查询结果仍可能多条 | 主数据维护阶段校验唯一性 |
|
||||
| 前端显示“物料编号”、后端字段为“物料编码” | 用户理解和开发传参不一致 | 页面文案统一为“物料编码”,后端字段按实际字段兼容 |
|
||||
| 大表增加模糊查询后变慢 | 查询性能下降 | 对物料编码字段建立索引,必要时完整编码使用精确匹配 |
|
||||
| 查询和导出条件不一致 | 用户导出数据与页面不一致 | 导出方法同步加入物料编码参数 |
|
||||
| 弹窗查询未同步改造 | 部分业务入口仍无法按编码查 | 第一阶段聚焦页面搜索栏,第二阶段再扩展弹窗 |
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
## 14. 推进计划
|
||||
|
||||
| 阶段 | 工作内容 | 产出 |
|
||||
| ---- | --------------------------- | -------------- |
|
||||
| 第一阶段 | 确认核心页面和对应存储过程 | 页面与接口清单 |
|
||||
| 第二阶段 | 改造库存盘点、库存查询、物料库位、物料查询、物料维护 | 核心页面支持物料编码查询 |
|
||||
| 第三阶段 | 改造入库记录、退货记录、物料记录、库存记录、采购件入库 | 相关追溯页面支持物料编码查询 |
|
||||
| 第四阶段 | 调整导出、分页、排序、后端过程性能 | 查询与导出一致 |
|
||||
| 第五阶段 | 使用现场标签数据验收 | 验收记录和问题清单 |
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
|
||||
## 15. 结论
|
||||
|
||||
本次“核心物料搜索栏添加物料编码查询功能”是库存盘点现场提出的实际业务需求。需求核心不是简单增加一个输入框,而是将现场实物标签识别方式与系统查询方式统一起来。
|
||||
|
||||
通过在核心物料搜索栏页面增加物料编码查询能力,系统可以减少因物料名称、图号或型号重复导致的盘点确认困难,帮助现场人员以唯一物料编码快速定位物料、库存和库位记录,提高盘点效率和数据准确性。
|
||||
|
||||
第一阶段建议优先完成仓储盘点和物料主数据相关页面,确保现场库存盘点可用;第二阶段再逐步扩展到采购、生产、装配、销售等模块中更多物料相关查询入口。
|
||||
|
||||
备注:修改人:Ld 修改时间:2026-06-29 13:26:44
|
||||
155
docs/物料编码搜索功能/物料编号搜索功能设计说明.md
Normal file
@@ -0,0 +1,155 @@
|
||||
# 物料编号搜索功能设计说明
|
||||
|
||||
## 01-功能内容
|
||||
|
||||
本次功能是在项目中涉及物料搜索的页面和弹窗中,新增“物料编号/物料编码”独立搜索条件。
|
||||
|
||||
目标效果:
|
||||
|
||||
1. 用户可以直接输入物料编号定位物料。
|
||||
2. 原有物料名称、图号/型号、库位、类型等搜索条件保持不变。
|
||||
3. 新增编号搜索与原有条件可以组合查询。
|
||||
4. 后端存储过程新增可选参数,未传物料编号时不影响原查询结果。
|
||||
5. 导出场景同步支持物料编号条件,避免页面查询和导出数据不一致。
|
||||
|
||||
覆盖范围:
|
||||
|
||||
| 模块 | 页面/组件 | 查询入口 |
|
||||
| --- | --- | --- |
|
||||
| 仓储管理 | 库存盘点 | 主列表查询、导出 |
|
||||
| 仓储管理 | 库存查询 | 主列表查询、导出 |
|
||||
| 仓储管理 | 入库记录 | 主列表查询、导出 |
|
||||
| 仓储管理 | 物料库位 | 主列表查询 |
|
||||
| 仓储管理 | 领料/耗材 | 耗材物料选择查询 |
|
||||
| 技术中心 | 物料查询 | 主列表查询 |
|
||||
| 技术中心 | 物料维护 | 主列表查询 |
|
||||
| 技术中心 | 图纸确认 | 物料选择弹窗 |
|
||||
| 技术中心 | 图纸确认分配 | 物料选择弹窗 |
|
||||
| 销售管理 | 订单管理 | 物料选择弹窗 |
|
||||
| 销售管理 | 订单审核 | 物料选择弹窗 |
|
||||
| 销售管理 | 订单查询 | 物料选择弹窗 |
|
||||
| 装配管理 | 接收装配任务 | 物料选择弹窗 |
|
||||
| 装配管理 | 接收滑台装配任务 | 物料选择弹窗 |
|
||||
|
||||
## 02-程序开发步骤
|
||||
|
||||
### 前端改造
|
||||
|
||||
1. 定位所有已有物料搜索入口,重点筛选包含 `物料名称_check`、`物料名称规格型号`、`仓储管理_通用库存_查询`、`物料管理_查询数据_分页` 的组件。
|
||||
2. 在搜索栏或物料选择弹窗中新增输入框:
|
||||
- `placeholder="物料编号"` 或 `placeholder="物料编码"`
|
||||
- 使用 Vue 2 Options API 的 `data()` 字段维护输入值。
|
||||
3. 在查询方法中新增判断变量:
|
||||
- `物料编码_check = 1/0`
|
||||
- `物料编码 = 输入值`
|
||||
4. 将新增参数追加到原有 `param` 数组中。
|
||||
5. 导出方法同步追加相同参数,保证查询和导出一致。
|
||||
6. 保持原有 `CreateData`、`ExecDatabase` 调用方式,不新增请求封装。
|
||||
|
||||
### 后端改造
|
||||
|
||||
1. 对相关 SQL Server 存储过程增加可选参数:
|
||||
- `@物料编码_check bit = null`
|
||||
- `@物料编码 nvarchar(50) = null`
|
||||
2. 在动态 SQL WHERE 条件中追加:
|
||||
- 当 `@物料编码_check = 1` 时,按物料编码模糊查询。
|
||||
3. 对 `sp_executesql` 同步补充参数声明和值传递。
|
||||
4. 保持兼容性:未传编号条件时,原查询逻辑不变。
|
||||
|
||||
## 03-推进台账
|
||||
|
||||
| 轮次 | 做了什么 | 改了哪些文件/对象 | 验证了什么 | 下一步 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 1 | 全局扫描物料搜索入口 | `src/views/**` | 找到物料名称搜索、物料选择弹窗、库存类查询入口 | 确定改造范围 |
|
||||
| 2 | 仓储核心页面新增编号搜索 | 库存盘点、库存查询、入库记录 | 前端参数可生成 `物料编码_check/物料编码` | 补后端过程 |
|
||||
| 3 | 共用物料选择弹窗新增编号搜索 | 销售、装配、技术确认相关页面 | 统一覆盖 `仓储管理_通用库存_查询` | 补共用查询过程 |
|
||||
| 4 | 剩余物料主数据类入口新增编号搜索 | 物料查询、物料维护、物料库位、耗材领料 | 页面输入框与参数完整 | 补对应过程 |
|
||||
| 5 | 执行 SQL Server 存储过程改造 | 9 个存储过程 | 直接调用过程验证编号条件不报错 | 前端解析验证 |
|
||||
| 6 | 前端结构验证 | 14 个 `.vue` 文件 | `vue-template-compiler` 模板解析通过 | 形成文档 |
|
||||
|
||||
## 04-任务矩阵
|
||||
|
||||
| 任务编号 | 任务内容 | 状态 | 验收标准 |
|
||||
| --- | --- | --- | --- |
|
||||
| M-001 | 库存盘点增加物料编号搜索 | 已完成 | 页面可输入物料编号查询,导出同条件 |
|
||||
| M-002 | 库存查询增加物料编号搜索 | 已完成 | 主查询和导出均带编号条件 |
|
||||
| M-003 | 入库记录增加物料编号搜索 | 已完成 | 主查询和导出均带编号条件 |
|
||||
| M-004 | 物料库位增加物料编号搜索 | 已完成 | 可按物料编号定位库位记录 |
|
||||
| M-005 | 耗材领料增加物料编号搜索 | 已完成 | 耗材列表可按编号查询 |
|
||||
| M-006 | 物料查询增加物料编码搜索 | 已完成 | 物料主文件查询可按编码过滤 |
|
||||
| M-007 | 物料维护增加物料编码搜索 | 已完成 | 维护列表可按编码过滤 |
|
||||
| M-008 | 共用库存物料选择弹窗增加编号搜索 | 已完成 | 销售、装配、技术确认弹窗可按编号查 |
|
||||
| M-009 | 后端查询过程增加编号参数 | 已完成 | 存储过程直接传编号参数执行成功 |
|
||||
| M-010 | 前端模板结构验证 | 已完成 | 改动 `.vue` 模板解析全部通过 |
|
||||
|
||||
## 05-验收证据
|
||||
|
||||
### 前端解析验证
|
||||
|
||||
验证命令:
|
||||
|
||||
```powershell
|
||||
node -e "使用 vue-template-compiler 解析改动的 .vue 文件"
|
||||
```
|
||||
|
||||
验证范围:
|
||||
|
||||
- `src/views/WarehouseManagement/InventoryCheck/index.vue`
|
||||
- `src/views/WarehouseManagement/InventoryQuery/index.vue`
|
||||
- `src/views/WarehouseManagement/WarehousingRecord/WarehousingRecord.vue`
|
||||
- `src/views/WarehouseManagement/MaterialLocation/index.vue`
|
||||
- `src/views/WarehouseManagement/MaterialRequisition/index.vue`
|
||||
- `src/views/TechnologyCenter/MaterialQuery/index.vue`
|
||||
- `src/views/TechnologyCenter/MaterialMaintain/index.vue`
|
||||
- `src/views/AssemblyManagement/ReceiveAssemblyTask/index.vue`
|
||||
- `src/views/AssemblyManagement/ReceiveAssemblyTaskSliding/index.vue`
|
||||
- `src/views/SalesManagement/OrderExamine/index.vue`
|
||||
- `src/views/SalesManagement/OrderManagement/index.vue`
|
||||
- `src/views/SalesManagement/OrderInquiry/index.vue`
|
||||
- `src/views/TechnologyCenter/DrawingConfirmation/index.vue`
|
||||
- `src/views/TechnologyCenter/DrawingConfirmationDistribution/index.vue`
|
||||
|
||||
结果:全部 `ok`。
|
||||
|
||||
### SQL 执行验证
|
||||
|
||||
验证数据库:
|
||||
|
||||
- SQL Server:`192.168.1.27`
|
||||
- 数据库:`ERPTOOL_JY_20250826Back`
|
||||
|
||||
验证方式:直接调用相关存储过程并传入 `@物料编码_check=1,@物料编码=N'0'`。
|
||||
|
||||
验证通过的过程:
|
||||
|
||||
- `物料管理_查询数据_分页`
|
||||
- `仓储管理_物料库位_查询数据`
|
||||
- `仓储管理_耗材出库_查询`
|
||||
- `仓储管理_库存盘点_查询`
|
||||
- `仓储管理_库存查询_查询`
|
||||
- `仓储管理_通用库存_查询`
|
||||
- `报表_仓储管理_通用库存_查询`
|
||||
- `仓储管理_入库记录_查询`
|
||||
- `仓储管理_入库记录_导出表格_查询`
|
||||
|
||||
结果:`all sql execution ok`。
|
||||
|
||||
## 06-决策记录
|
||||
|
||||
| 决策点 | 选择 | 原因 |
|
||||
| --- | --- | --- |
|
||||
| 搜索字段命名 | 前端显示“物料编号/物料编码”,后端参数使用 `物料编码` | 数据库字段主要为 `物料编码`,页面展示常称为物料编号 |
|
||||
| 是否复用物料名称输入框 | 不复用,新增独立输入框 | 用户明确要求“添加物料编号搜索功能”,独立条件更清晰 |
|
||||
| 后端参数是否必传 | 可选参数 | 保持旧页面、旧查询兼容 |
|
||||
| 查询方式 | 模糊查询 | 与项目内物料名称、图号搜索习惯一致 |
|
||||
| 共用弹窗处理 | 统一改 `仓储管理_通用库存_查询` 调用方 | 多个页面共用同一库存物料选择过程,统一补能避免重复逻辑 |
|
||||
| 导出是否同步 | 同步 | 防止页面筛选结果和导出结果不一致 |
|
||||
| 是否完整构建 | 未执行完整 build | 当前工作区已有 `dist.7z` 等既有脏文件,避免构建重写产物 |
|
||||
|
||||
## 07-后续注意事项
|
||||
|
||||
1. 新增物料搜索页面时,如表格展示 `物料编码`,搜索栏应同步提供物料编号输入框。
|
||||
2. 新增后端查询过程时,建议统一支持:
|
||||
- `@物料编码_check`
|
||||
- `@物料编码`
|
||||
3. 如果后续改为统一物料选择组件,可将物料编号、物料名称、图号/型号三个搜索项抽成共用弹窗,减少重复页面维护。
|
||||
BIN
docs/物料编码查询功能添加.docx
Normal file
BIN
docs/物料编码查询功能添加.pdf
Normal file
521
docs/移动端适配/车间派工移动端自适应设计方案.md
Normal file
@@ -0,0 +1,521 @@
|
||||
# 车间派工移动端自适应设计方案
|
||||
|
||||
## 1. 需求目标
|
||||
|
||||
需求:车间需求一个车间派工组件的移动端功能,车间内及时操作
|
||||
|
||||
本次方案包含两部分:
|
||||
|
||||
1. 将现有车间派工组件复制并改造为移动端自适应页面。
|
||||
2. 移动端用户登录系统后,首页只显示该自适应派工页面,不显示桌面端首页、侧边栏、顶部导航和标签栏。
|
||||
|
||||
总体原则:
|
||||
|
||||
- 不影响现有 PC 端车间派工页面。
|
||||
- 不修改后端接口和参数格式。
|
||||
- 移动端只改交互和布局,业务逻辑尽量复用现有页面。
|
||||
- 保持 Vue 2 + Element UI + Options API 写法。
|
||||
|
||||
## 2. 当前代码基础
|
||||
|
||||
现有车间派工页面:
|
||||
|
||||
```text
|
||||
src/views/SeikoWorkshop/WorkshopAssignment/index.vue
|
||||
```
|
||||
|
||||
现有登录后首页:
|
||||
|
||||
```text
|
||||
src/views/dashboard/index.vue
|
||||
```
|
||||
|
||||
现有主布局:
|
||||
|
||||
```text
|
||||
src/views/layout/Layout.vue
|
||||
src/views/layout/components/AppMain.vue
|
||||
```
|
||||
|
||||
现有动态路由生成:
|
||||
|
||||
```text
|
||||
src/router/getRouter.js
|
||||
src/permission.js
|
||||
```
|
||||
|
||||
现有设备判断逻辑:
|
||||
|
||||
```text
|
||||
src/views/layout/mixin/ResizeHandler.js
|
||||
src/store/modules/app.js
|
||||
```
|
||||
|
||||
项目中已有类似移动端/滑动版页面命名示例:
|
||||
|
||||
```text
|
||||
src/views/AssemblyManagement/AssemblyExecutionSliding/index.vue
|
||||
src/views/AssemblyManagement/ReceiveAssemblyTaskSliding/index.vue
|
||||
src/views/AssemblyManagement/ReplenishmentOrdersSliding/index.vue
|
||||
```
|
||||
|
||||
因此本次建议采用“新增独立移动端页面”的方式,而不是直接改造现有 PC 页面。
|
||||
|
||||
## 3. 总体设计
|
||||
|
||||
新增移动端页面:
|
||||
|
||||
```text
|
||||
src/views/SeikoWorkshop/WorkshopAssignmentMobile/index.vue
|
||||
```
|
||||
|
||||
新增移动端空布局:
|
||||
|
||||
```text
|
||||
src/views/layout/MobileLayout.vue
|
||||
```
|
||||
|
||||
新增设备判断工具:
|
||||
|
||||
```text
|
||||
src/utils/device.js
|
||||
```
|
||||
|
||||
修改路由配置:
|
||||
|
||||
```text
|
||||
src/router/index.js
|
||||
```
|
||||
|
||||
修改登录后跳转逻辑:
|
||||
|
||||
```text
|
||||
src/permission.js
|
||||
```
|
||||
|
||||
移动端访问路径建议为:
|
||||
|
||||
```text
|
||||
/mobile/workshop-assignment
|
||||
```
|
||||
|
||||
PC 端继续使用现有动态菜单路径:
|
||||
|
||||
```text
|
||||
/SeikoWorkshop/WorkshopAssignment
|
||||
```
|
||||
|
||||
## 4. 移动端页面结构设计
|
||||
|
||||
现有 PC 页面是左右两栏布局:
|
||||
|
||||
- 左侧:订单/零件待派工列表。
|
||||
- 右侧:选中零件后的工序派工列表。
|
||||
|
||||
移动端不适合继续使用左右两栏和大表格,建议改为纵向流程。
|
||||
|
||||
### 4.1 顶部筛选区
|
||||
|
||||
移动端顶部展示查询条件:
|
||||
|
||||
- 订单号
|
||||
- 产品/零件名称
|
||||
- 名称或图号
|
||||
- 查询按钮
|
||||
- 查看图纸按钮
|
||||
- 加急/取消加急按钮
|
||||
- 手动报废结单按钮,按原权限控制
|
||||
|
||||
布局方式:
|
||||
|
||||
- 筛选项纵向排列。
|
||||
- 输入框、下拉框宽度 `100%`。
|
||||
- 操作按钮使用两列或满宽布局。
|
||||
- 顶部筛选区可固定,也可随页面滚动。第一版建议随页面滚动,避免遮挡内容。
|
||||
|
||||
### 4.2 待派工零件列表
|
||||
|
||||
将 PC 端左侧 `el-table` 改为卡片列表。
|
||||
|
||||
每张卡片展示核心字段:
|
||||
|
||||
- 订单号
|
||||
- 产品名称
|
||||
- 零件图号
|
||||
- 零件名称
|
||||
- 数量
|
||||
- 毛坯库存
|
||||
- 下达日期
|
||||
- 完工期限
|
||||
- 订单备注
|
||||
- 技术备注
|
||||
|
||||
交互:
|
||||
|
||||
- 点击卡片后调用现有行点击逻辑,加载该零件的工序列表。
|
||||
- 当前选中卡片需要有明显选中态。
|
||||
- 列表底部保留分页,移动端分页建议简化为“上一页 / 下一页 / 当前页”。
|
||||
|
||||
### 4.3 工序派工列表
|
||||
|
||||
将 PC 端右侧工序表格改为工序卡片列表。
|
||||
|
||||
每张工序卡片展示:
|
||||
|
||||
- 工序顺序
|
||||
- 工序名称
|
||||
- 投产数
|
||||
- 完成数
|
||||
- 操作者
|
||||
- 报废数量
|
||||
- 加工设备
|
||||
- 派工状态
|
||||
|
||||
卡片操作按钮:
|
||||
|
||||
- 编辑
|
||||
- 派工
|
||||
- 取消派工
|
||||
|
||||
按钮禁用条件沿用现有 PC 页面判断逻辑。
|
||||
|
||||
### 4.4 派工编辑区
|
||||
|
||||
移动端保留人员和设备选择:
|
||||
|
||||
- 操作者
|
||||
- 设备
|
||||
- 派工数量
|
||||
- 计划完成日期
|
||||
|
||||
建议使用 `el-dialog` 或底部弹层形式。
|
||||
|
||||
Element UI 项目中现有弹窗较多,第一版建议继续使用 `el-dialog`,移动端适配如下:
|
||||
|
||||
```vue
|
||||
<el-dialog :visible.sync="dialogVisible" width="94%" top="5vh">
|
||||
```
|
||||
|
||||
表单布局:
|
||||
|
||||
- `el-form-item` 纵向排列。
|
||||
- `el-select`、`el-input`、`el-date-picker`、`el-input-number` 宽度统一 `100%`。
|
||||
- 底部按钮固定为“取消 / 确定”。
|
||||
|
||||
### 4.5 文件和图纸查看
|
||||
|
||||
现有页面中图纸、文件查看逻辑继续保留。
|
||||
|
||||
移动端展示方式:
|
||||
|
||||
- 文件使用纵向列表。
|
||||
- 每个文件展示图标、文件名。
|
||||
- 点击后沿用现有下载/预览地址。
|
||||
- 弹窗宽度 `94%`。
|
||||
|
||||
## 5. 业务接口复用
|
||||
|
||||
移动端页面不新增后端接口,复用现有车间派工页面中的请求。
|
||||
|
||||
主要请求包括:
|
||||
|
||||
```text
|
||||
精工车间_车间派工_查询
|
||||
车间生产管理工艺_零件工序_已派工查询
|
||||
车间生产管理工艺_零件工序_派工_工序查询
|
||||
车间生产管理工艺_零件工序_派工
|
||||
车间生产管理工艺_零件工序_取消派工
|
||||
车间生产管理工艺_零件工序_派工_修改数量
|
||||
车间生产管理工艺_零件工序_派工_设置计划完成日期
|
||||
人事档案管理_人员_部门与人员_派工_查询数据_根据部门编号
|
||||
车间派工_手动报废结单_查询信息
|
||||
车间派工_手动报废结单
|
||||
```
|
||||
|
||||
请求规范继续遵守项目约定:
|
||||
|
||||
- 统一 POST 到 `MESCommonBase.ashx`。
|
||||
- `url` 字段留空。
|
||||
- 使用 `CreateData` 构建请求。
|
||||
- 使用 `ExecDatabase` 或现有全局工具方法发送请求。
|
||||
- 参数继续使用 `key=value&key2=value2` 字符串。
|
||||
- 字段名继续使用后端返回的中文字段。
|
||||
|
||||
## 6. 路由设计
|
||||
|
||||
### 6.1 新增移动端空布局
|
||||
|
||||
新增文件:
|
||||
|
||||
```text
|
||||
src/views/layout/MobileLayout.vue
|
||||
```
|
||||
|
||||
职责:
|
||||
|
||||
- 不显示侧边栏。
|
||||
- 不显示顶部导航。
|
||||
- 不显示标签栏。
|
||||
- 只渲染当前移动端页面。
|
||||
|
||||
结构示例:
|
||||
|
||||
```vue
|
||||
<template>
|
||||
<section class="mobile-main">
|
||||
<router-view/>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'MobileLayout'
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.mobile-main {
|
||||
min-height: 100vh;
|
||||
width: 100%;
|
||||
background: #f5f7fa;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
</style>
|
||||
```
|
||||
|
||||
### 6.2 新增静态隐藏路由
|
||||
|
||||
修改:
|
||||
|
||||
```text
|
||||
src/router/index.js
|
||||
```
|
||||
|
||||
新增:
|
||||
|
||||
```js
|
||||
import MobileLayout from '../views/layout/MobileLayout'
|
||||
```
|
||||
|
||||
在 `constantRouterMap` 中增加:
|
||||
|
||||
```js
|
||||
{
|
||||
path: '/mobile',
|
||||
component: MobileLayout,
|
||||
hidden: true,
|
||||
children: [{
|
||||
path: 'workshop-assignment',
|
||||
component: () => import('@/views/SeikoWorkshop/WorkshopAssignmentMobile/index'),
|
||||
meta: { title: '车间派工' }
|
||||
}]
|
||||
}
|
||||
```
|
||||
|
||||
最终移动端首页路径:
|
||||
|
||||
```text
|
||||
/mobile/workshop-assignment
|
||||
```
|
||||
|
||||
## 7. 移动端登录后首页跳转设计
|
||||
|
||||
新增工具:
|
||||
|
||||
```text
|
||||
src/utils/device.js
|
||||
```
|
||||
|
||||
内容:
|
||||
|
||||
```js
|
||||
export function isMobileDevice() {
|
||||
if (!document || !document.body) {
|
||||
return false
|
||||
}
|
||||
return document.body.getBoundingClientRect().width < 1024
|
||||
}
|
||||
```
|
||||
|
||||
修改:
|
||||
|
||||
```text
|
||||
src/permission.js
|
||||
```
|
||||
|
||||
在已登录逻辑中增加判断:
|
||||
|
||||
- 用户已登录。
|
||||
- 当前目标路径是 `/` 或 `/dashboard`。
|
||||
- 当前设备为移动端。
|
||||
- 自动跳转 `/mobile/workshop-assignment`。
|
||||
|
||||
设计示例:
|
||||
|
||||
```js
|
||||
import { isMobileDevice } from '@/utils/device'
|
||||
|
||||
// beforeEach 内部,已登录分支中
|
||||
if ((to.path === '/' || to.path === '/dashboard') && isMobileDevice()) {
|
||||
next({ path: '/mobile/workshop-assignment', replace: true })
|
||||
NProgress.done()
|
||||
return
|
||||
}
|
||||
```
|
||||
|
||||
这样移动端登录后不会进入桌面首页,而是直接进入移动端派工页。
|
||||
|
||||
## 8. 样式设计
|
||||
|
||||
移动端页面样式建议:
|
||||
|
||||
- 根节点使用 `.mobile-assignment-page`。
|
||||
- 页面最小高度 `100vh`。
|
||||
- 主背景使用浅灰色。
|
||||
- 卡片使用白底、细边框、轻阴影。
|
||||
- 卡片圆角控制在 `6px` 或 `8px`。
|
||||
- 字号保持可读,不使用随视口缩放的字体。
|
||||
- 所有按钮、输入框高度适合触摸操作。
|
||||
- 避免横向滚动。
|
||||
|
||||
建议结构:
|
||||
|
||||
```scss
|
||||
.mobile-assignment-page {
|
||||
min-height: 100vh;
|
||||
padding: 10px;
|
||||
background: #f5f7fa;
|
||||
}
|
||||
|
||||
.mobile-filter {
|
||||
background: #fff;
|
||||
border-radius: 6px;
|
||||
padding: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.assignment-card {
|
||||
background: #fff;
|
||||
border: 1px solid #ebeef5;
|
||||
border-radius: 6px;
|
||||
padding: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.assignment-card.is-active {
|
||||
border-color: #409EFF;
|
||||
}
|
||||
|
||||
.card-title {
|
||||
font-size: 15px;
|
||||
font-weight: bold;
|
||||
color: #303133;
|
||||
}
|
||||
|
||||
.card-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
line-height: 24px;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.card-label {
|
||||
color: #909399;
|
||||
}
|
||||
|
||||
.card-value {
|
||||
color: #303133;
|
||||
text-align: right;
|
||||
}
|
||||
```
|
||||
|
||||
## 9. 实施步骤
|
||||
|
||||
1. 新建 `src/views/SeikoWorkshop/WorkshopAssignmentMobile/index.vue`。
|
||||
2. 从 `WorkshopAssignment/index.vue` 复制业务数据、方法和接口调用。
|
||||
3. 将模板改为移动端筛选区、零件卡片列表、工序卡片列表。
|
||||
4. 将弹窗宽度、表单布局和按钮布局改为移动端适配。
|
||||
5. 新建 `src/views/layout/MobileLayout.vue`。
|
||||
6. 新建 `src/utils/device.js`。
|
||||
7. 修改 `src/router/index.js`,增加 `/mobile/workshop-assignment` 静态隐藏路由。
|
||||
8. 修改 `src/permission.js`,移动端登录后访问 `/` 或 `/dashboard` 时跳转移动端派工页。
|
||||
9. 本地运行项目,分别验证 PC 和移动端宽度。
|
||||
|
||||
## 10. 验收标准
|
||||
|
||||
PC 端:
|
||||
|
||||
- 原车间派工页面正常访问。
|
||||
- 原首页正常显示。
|
||||
- 原动态菜单不受影响。
|
||||
|
||||
移动端:
|
||||
|
||||
- 登录后自动进入 `/mobile/workshop-assignment`。
|
||||
- 页面不显示侧边栏、顶部导航、标签栏。
|
||||
- 页面只显示移动端车间派工自适应页面。
|
||||
- 查询条件可正常使用。
|
||||
- 零件列表可正常加载和分页。
|
||||
- 点击零件后可加载工序列表。
|
||||
- 派工、取消派工、编辑数量、设置计划完成日期功能正常。
|
||||
- 查看图纸和文件功能正常。
|
||||
- 权限按钮显示逻辑与 PC 端一致。
|
||||
- 页面无明显横向滚动、文字重叠、按钮遮挡。
|
||||
|
||||
## 11. 风险与控制
|
||||
|
||||
### 11.1 现有页面体量较大
|
||||
|
||||
风险:
|
||||
|
||||
- 直接抽公共逻辑可能引入 PC 页面回归问题。
|
||||
|
||||
控制:
|
||||
|
||||
- 第一版复制现有页面业务逻辑,只重写移动端模板。
|
||||
- 待移动端稳定后,再考虑抽公共 mixin。
|
||||
|
||||
### 11.2 移动端首页跳转时机
|
||||
|
||||
风险:
|
||||
|
||||
- `Layout` 中的设备判断发生较晚,登录跳转时可能还未写入 Vuex。
|
||||
|
||||
控制:
|
||||
|
||||
- 在 `permission.js` 中直接使用 DOM 宽度判断,不依赖 Vuex 中的 `device`。
|
||||
|
||||
### 11.3 动态菜单权限
|
||||
|
||||
风险:
|
||||
|
||||
- 移动端隐藏路由如果依赖后端菜单,可能因为菜单未配置导致无法访问。
|
||||
|
||||
控制:
|
||||
|
||||
- 将移动端派工路由注册为静态隐藏路由。
|
||||
- 登录后仍经过 token 校验,但不依赖菜单显示。
|
||||
|
||||
### 11.4 手机端表格不可用
|
||||
|
||||
风险:
|
||||
|
||||
- 继续使用大表格会产生横向滚动,操作困难。
|
||||
|
||||
控制:
|
||||
|
||||
- 移动端核心列表统一改为卡片式展示。
|
||||
- 表格只在确实需要多列批量选择时使用,并控制宽度。
|
||||
|
||||
## 12. 推荐结论
|
||||
|
||||
建议第一版采用“独立移动端页面 + 移动端空布局 + 登录后设备重定向”的实现方式。
|
||||
|
||||
该方案改动边界清晰:
|
||||
|
||||
- PC 端页面不动。
|
||||
- 后端接口不动。
|
||||
- 权限体系基本不动。
|
||||
- 移动端首页可直接进入派工工作流。
|
||||
|
||||
后续如果移动端使用稳定,再将 PC 和移动端共用的派工请求、字段处理、校验逻辑抽成公共 mixin,减少长期维护成本。
|
||||
120
docs/移动端适配/采购合同生成入库单移动端组件设计方案.md
Normal file
@@ -0,0 +1,120 @@
|
||||
# 采购合同生成入库单移动端组件设计方案
|
||||
|
||||
## 目标
|
||||
|
||||
在不改动现有采购合同查询组件 `src/views/PurchasingManagement/OrderInquiry/index.vue` 的前提下,将其中“生成入库单”功能设计为一个独立的新组件,优先适配手机和平板操作,同时在桌面端保持可用。
|
||||
|
||||

|
||||
|
||||
## 现状梳理
|
||||
|
||||
现有入口位于采购合同查询页面工具栏,按钮触发 `addArrivalNotice()`,打开 `width="1000px"` 的 `el-dialog`。弹窗内包含供应商选择、合同号选择、查询、入库单号展示、合同明细表、到货数量输入、是否质检开关、推送部门展示、到货汇总、提交和取消。
|
||||
|
||||
现有逻辑主要包含:
|
||||
|
||||
- `getArrivalContract()`:按供应商加载可生成入库单的采购合同。
|
||||
- `searchArrivalDetail()`:按供应商和合同查询合同明细,并读取后端返回的入库单号。
|
||||
- `submitArrivalNotice()`:筛选本次到货数量大于 0 的明细,按是否质检拆分提示,并调用新增接口提交。
|
||||
- 涉及接口名称包括 `仓储管理_采购入库合同_查询`、`采购管理_采购入库合同明细_查询`、`采购管理_到货内容_新增`。
|
||||
|
||||
当前问题是弹窗宽度固定、明细依赖横向表格,手机端选择合同、输入到货数量、切换质检开关和确认汇总都不方便。
|
||||
|
||||
## 新组件建议
|
||||
|
||||
建议新增独立视图组件:
|
||||
|
||||
`src/views/PurchasingManagement/PurchaseInboundCreateMobile/index.vue`
|
||||
|
||||
也可以在后续实现时拆成业务组件:
|
||||
|
||||
`src/components/PurchaseInboundCreateMobile/index.vue`
|
||||
|
||||
若需要菜单直接访问,使用视图路径;若只作为其他页面内嵌入口,使用组件路径。为了满足“单独做一个新组件方便移动端使用”,本方案优先建议新增视图组件,后端配置菜单后通过动态路由进入,不影响原采购合同查询页面。
|
||||
|
||||
## 页面布局
|
||||
|
||||
移动端采用单列流程:
|
||||
|
||||
1. 顶部固定标题区:显示“生成入库单”、当前状态、返回按钮。
|
||||
2. 查询条件区:供应商、合同号使用整行选择框,合同号随供应商联动加载。
|
||||
3. 单据摘要区:展示入库单号、本次到货物料数、需质检数、直入库数。
|
||||
4. 明细卡片区:每个物料一张卡片,展示合同号、物料名称、图号或型号、采购数、已到数、可到数。
|
||||
5. 卡片操作区:到货数量使用 `el-input-number`,质检使用 `el-switch`,推送部门用标签显示“质检部/仓库”。
|
||||
6. 底部固定操作栏:提交入库单、清空本次数量。
|
||||
|
||||
桌面端自适应为双栏:
|
||||
|
||||
- 左侧为条件和摘要。
|
||||
- 右侧为明细表格或卡片网格。
|
||||
- 最大宽度控制在内容区内,不再使用固定 1000px 弹窗。
|
||||
|
||||
## 交互流程
|
||||
|
||||
1. 用户进入新组件。
|
||||
2. 选择供应商,组件调用合同查询接口刷新合同列表。
|
||||
3. 选择合同号后自动查询明细,也保留“查询”按钮用于手动刷新。
|
||||
4. 明细默认 `到货数量=0`、`需要质检=false`。
|
||||
5. 用户填写某一行到货数量后,该行质检开关可操作。
|
||||
6. 汇总区实时计算本次到货条数、需质检条数、直入库条数。
|
||||
7. 提交前校验至少一条明细 `到货数量 > 0`,并校验到货数量不超过 `采购数 - 已到数`。
|
||||
8. 提交成功后提示成功、清空当前明细或停留展示结果,由实现时按现场使用习惯确定。
|
||||
|
||||
## 数据设计
|
||||
|
||||
组件内部建议沿用原页面字段,不新增后端字段:
|
||||
|
||||
- `arrivalSupplierName`:供应商流水号。
|
||||
- `arrivalContractNo`:采购合同流水号。
|
||||
- `arrivalContractLabel`:采购合同编号。
|
||||
- `入库单号`:后端返回的入库单号。
|
||||
- `arrivalTableData`:合同明细数组。
|
||||
- `到货数量`:前端临时输入字段。
|
||||
- `需要质检`:前端临时开关字段。
|
||||
|
||||
提交参数继续沿用原逻辑:
|
||||
|
||||
- `通知内容`
|
||||
- `发起人`
|
||||
- `采购合同流水号`
|
||||
- `到货数组`
|
||||
- `物料流水号组`
|
||||
- `质检标志组`
|
||||
- `采购合同`
|
||||
- `供应商流水号`
|
||||
- `入库单号`
|
||||
|
||||
## 技术实现要点
|
||||
|
||||
- 使用 Vue 2 Options API,不使用 Composition API。
|
||||
- 请求继续使用 `this.CreateData()` 和 `this.ExecDatabase()`,不单独封装新的请求客户端。
|
||||
- 生命周期使用普通函数,不使用箭头函数。
|
||||
- 移动端样式放在 `<style scoped>`,通过媒体查询控制桌面和手机布局。
|
||||
- 断点建议:`max-width: 768px` 使用单列卡片和底部固定按钮;`min-width: 769px` 使用双栏或表格。
|
||||
- 明细卡片保留中文字段访问,和后端返回字段保持一致。
|
||||
- 组件创建后不修改采购合同查询组件;若后续需要入口,可以由菜单配置或新增移动端菜单进入。
|
||||
|
||||
## 样式建议
|
||||
|
||||
- 手机端避免 `el-table` 作为主要录入载体,改用卡片列表承载物料明细。
|
||||
- 数量输入按钮高度不小于 36px,底部提交按钮高度不小于 44px。
|
||||
- 顶部和底部区域使用 `position: sticky` 或固定布局,方便长列表滚动时随时提交。
|
||||
- 摘要区使用三个轻量统计块:本次到货、需质检、直入库。
|
||||
- 质检状态用颜色区分:需质检为橙色,直入库为绿色。
|
||||
|
||||
## 实施步骤
|
||||
|
||||
1. 新增 `PurchaseInboundCreateMobile/index.vue`,复制并整理原生成入库单相关 data、computed、methods。
|
||||
2. 将明细展示从表格改为移动端卡片,桌面端可保留表格或两列卡片。
|
||||
3. 增加响应式样式和底部固定提交栏。
|
||||
4. 本地验证供应商联动、合同明细查询、数量上限、质检开关、汇总和提交参数。
|
||||
5. 由后端配置菜单,指向新组件路径,原采购合同查询组件保持不动。
|
||||
|
||||
## 验收标准
|
||||
|
||||
- 手机端宽度 375px 下不出现横向滚动。
|
||||
- 到货数量、质检开关、提交按钮在触屏下易点击。
|
||||
- 提交参数与原弹窗一致。
|
||||
- 原采购合同查询页面行为不变。
|
||||
- 新组件可通过动态路由单独打开。
|
||||
|
||||
修改人:Ld 修改时间:2026-07-21 13:10:54;
|
||||
98
docs/移动端适配/采购合同生成入库单移动端预览.svg
Normal file
@@ -0,0 +1,98 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1320" height="860" viewBox="0 0 1320 860">
|
||||
<rect width="1320" height="860" fill="#eef2f7"/>
|
||||
<text x="64" y="62" font-family="Microsoft YaHei, Arial, sans-serif" font-size="28" font-weight="700" fill="#1f2937">采购合同生成入库单 - 移动端新组件预览</text>
|
||||
<text x="64" y="96" font-family="Microsoft YaHei, Arial, sans-serif" font-size="16" fill="#64748b">独立组件,不改动采购合同查询原页面;手机优先,桌面端自适应为双栏。</text>
|
||||
|
||||
<g transform="translate(110,130)">
|
||||
<rect x="0" y="0" width="390" height="690" rx="32" fill="#111827"/>
|
||||
<rect x="14" y="16" width="362" height="658" rx="24" fill="#f8fafc"/>
|
||||
<rect x="150" y="30" width="90" height="8" rx="4" fill="#111827" opacity=".35"/>
|
||||
|
||||
<rect x="14" y="52" width="362" height="74" fill="#ffffff"/>
|
||||
<text x="32" y="86" font-family="Microsoft YaHei, Arial, sans-serif" font-size="19" font-weight="700" fill="#111827">生成入库单</text>
|
||||
<text x="32" y="110" font-family="Microsoft YaHei, Arial, sans-serif" font-size="12" fill="#64748b">采购合同 CG-20260721001</text>
|
||||
<rect x="278" y="76" width="76" height="28" rx="14" fill="#e0f2fe"/>
|
||||
<text x="296" y="95" font-family="Microsoft YaHei, Arial, sans-serif" font-size="12" fill="#0369a1">待提交</text>
|
||||
|
||||
<rect x="30" y="146" width="330" height="118" rx="10" fill="#ffffff" stroke="#dbe3ef"/>
|
||||
<text x="48" y="176" font-family="Microsoft YaHei, Arial, sans-serif" font-size="13" fill="#64748b">供应商</text>
|
||||
<text x="48" y="202" font-family="Microsoft YaHei, Arial, sans-serif" font-size="17" font-weight="700" fill="#111827">江苏高精机械配件有限公司</text>
|
||||
<line x1="48" y1="222" x2="342" y2="222" stroke="#e5e7eb"/>
|
||||
<text x="48" y="245" font-family="Microsoft YaHei, Arial, sans-serif" font-size="13" fill="#64748b">合同号</text>
|
||||
<text x="112" y="245" font-family="Microsoft YaHei, Arial, sans-serif" font-size="13" fill="#2563eb">点击切换</text>
|
||||
|
||||
<g transform="translate(30,282)">
|
||||
<rect x="0" y="0" width="104" height="62" rx="10" fill="#ecfdf5"/>
|
||||
<text x="16" y="25" font-family="Microsoft YaHei, Arial, sans-serif" font-size="12" fill="#047857">本次到货</text>
|
||||
<text x="16" y="50" font-family="Arial, sans-serif" font-size="24" font-weight="700" fill="#065f46">8</text>
|
||||
<rect x="113" y="0" width="104" height="62" rx="10" fill="#fff7ed"/>
|
||||
<text x="129" y="25" font-family="Microsoft YaHei, Arial, sans-serif" font-size="12" fill="#c2410c">需质检</text>
|
||||
<text x="129" y="50" font-family="Arial, sans-serif" font-size="24" font-weight="700" fill="#9a3412">3</text>
|
||||
<rect x="226" y="0" width="104" height="62" rx="10" fill="#eff6ff"/>
|
||||
<text x="242" y="25" font-family="Microsoft YaHei, Arial, sans-serif" font-size="12" fill="#1d4ed8">直入库</text>
|
||||
<text x="242" y="50" font-family="Arial, sans-serif" font-size="24" font-weight="700" fill="#1e40af">5</text>
|
||||
</g>
|
||||
|
||||
<g transform="translate(30,366)">
|
||||
<rect x="0" y="0" width="330" height="118" rx="12" fill="#ffffff" stroke="#dbe3ef"/>
|
||||
<text x="18" y="30" font-family="Microsoft YaHei, Arial, sans-serif" font-size="16" font-weight="700" fill="#111827">轴承座 / LRS250-01MP</text>
|
||||
<text x="18" y="55" font-family="Microsoft YaHei, Arial, sans-serif" font-size="12" fill="#64748b">采购数 20 · 已到 12 · 可到 8</text>
|
||||
<rect x="18" y="73" width="118" height="30" rx="6" fill="#f1f5f9"/>
|
||||
<text x="34" y="94" font-family="Microsoft YaHei, Arial, sans-serif" font-size="13" fill="#111827">到货数量 4</text>
|
||||
<rect x="234" y="73" width="78" height="30" rx="15" fill="#fef3c7"/>
|
||||
<text x="252" y="94" font-family="Microsoft YaHei, Arial, sans-serif" font-size="13" fill="#92400e">质检</text>
|
||||
</g>
|
||||
|
||||
<g transform="translate(30,498)">
|
||||
<rect x="0" y="0" width="330" height="118" rx="12" fill="#ffffff" stroke="#dbe3ef"/>
|
||||
<text x="18" y="30" font-family="Microsoft YaHei, Arial, sans-serif" font-size="16" font-weight="700" fill="#111827">直线导轨 / HGH25CA</text>
|
||||
<text x="18" y="55" font-family="Microsoft YaHei, Arial, sans-serif" font-size="12" fill="#64748b">采购数 10 · 已到 0 · 可到 10</text>
|
||||
<rect x="18" y="73" width="118" height="30" rx="6" fill="#f1f5f9"/>
|
||||
<text x="34" y="94" font-family="Microsoft YaHei, Arial, sans-serif" font-size="13" fill="#111827">到货数量 4</text>
|
||||
<rect x="234" y="73" width="78" height="30" rx="15" fill="#dcfce7"/>
|
||||
<text x="252" y="94" font-family="Microsoft YaHei, Arial, sans-serif" font-size="13" fill="#166534">仓库</text>
|
||||
</g>
|
||||
|
||||
<rect x="14" y="612" width="362" height="62" fill="#ffffff"/>
|
||||
<rect x="30" y="624" width="330" height="40" rx="20" fill="#2563eb"/>
|
||||
<text x="142" y="650" font-family="Microsoft YaHei, Arial, sans-serif" font-size="15" font-weight="700" fill="#ffffff">提交入库单</text>
|
||||
</g>
|
||||
|
||||
<g transform="translate(575,154)">
|
||||
<rect x="0" y="0" width="650" height="512" rx="12" fill="#ffffff" stroke="#dbe3ef"/>
|
||||
<rect x="0" y="0" width="650" height="64" rx="12" fill="#f8fafc"/>
|
||||
<text x="28" y="40" font-family="Microsoft YaHei, Arial, sans-serif" font-size="20" font-weight="700" fill="#111827">桌面端自适应状态</text>
|
||||
<rect x="28" y="92" width="210" height="74" rx="8" fill="#f8fafc" stroke="#dbe3ef"/>
|
||||
<text x="46" y="121" font-family="Microsoft YaHei, Arial, sans-serif" font-size="13" fill="#64748b">供应商</text>
|
||||
<text x="46" y="148" font-family="Microsoft YaHei, Arial, sans-serif" font-size="15" font-weight="700" fill="#111827">江苏高精机械配件有限公司</text>
|
||||
<rect x="258" y="92" width="210" height="74" rx="8" fill="#f8fafc" stroke="#dbe3ef"/>
|
||||
<text x="276" y="121" font-family="Microsoft YaHei, Arial, sans-serif" font-size="13" fill="#64748b">合同号</text>
|
||||
<text x="276" y="148" font-family="Microsoft YaHei, Arial, sans-serif" font-size="15" font-weight="700" fill="#111827">CG-20260721001</text>
|
||||
<rect x="488" y="92" width="134" height="74" rx="8" fill="#eff6ff" stroke="#bfdbfe"/>
|
||||
<text x="506" y="121" font-family="Microsoft YaHei, Arial, sans-serif" font-size="13" fill="#1d4ed8">入库单号</text>
|
||||
<text x="506" y="148" font-family="Microsoft YaHei, Arial, sans-serif" font-size="15" font-weight="700" fill="#1e40af">RKD260721</text>
|
||||
|
||||
<rect x="28" y="196" width="594" height="48" rx="8" fill="#f1f5f9"/>
|
||||
<text x="48" y="226" font-family="Microsoft YaHei, Arial, sans-serif" font-size="14" fill="#334155">明细以卡片/表格双模式展示:移动端卡片,桌面端表格;同一数据源和提交参数。</text>
|
||||
|
||||
<g transform="translate(28,270)">
|
||||
<rect x="0" y="0" width="594" height="50" fill="#f8fafc" stroke="#dbe3ef"/>
|
||||
<text x="20" y="31" font-family="Microsoft YaHei, Arial, sans-serif" font-size="13" font-weight="700" fill="#334155">物料</text>
|
||||
<text x="238" y="31" font-family="Microsoft YaHei, Arial, sans-serif" font-size="13" font-weight="700" fill="#334155">可到</text>
|
||||
<text x="336" y="31" font-family="Microsoft YaHei, Arial, sans-serif" font-size="13" font-weight="700" fill="#334155">本次到货</text>
|
||||
<text x="488" y="31" font-family="Microsoft YaHei, Arial, sans-serif" font-size="13" font-weight="700" fill="#334155">去向</text>
|
||||
<rect x="0" y="50" width="594" height="56" fill="#ffffff" stroke="#dbe3ef"/>
|
||||
<text x="20" y="84" font-family="Microsoft YaHei, Arial, sans-serif" font-size="13" fill="#111827">轴承座 / LRS250-01MP</text>
|
||||
<text x="250" y="84" font-family="Arial, sans-serif" font-size="14" fill="#111827">8</text>
|
||||
<text x="368" y="84" font-family="Arial, sans-serif" font-size="14" fill="#111827">4</text>
|
||||
<text x="488" y="84" font-family="Microsoft YaHei, Arial, sans-serif" font-size="13" fill="#92400e">质检部</text>
|
||||
<rect x="0" y="106" width="594" height="56" fill="#ffffff" stroke="#dbe3ef"/>
|
||||
<text x="20" y="140" font-family="Microsoft YaHei, Arial, sans-serif" font-size="13" fill="#111827">直线导轨 / HGH25CA</text>
|
||||
<text x="250" y="140" font-family="Arial, sans-serif" font-size="14" fill="#111827">10</text>
|
||||
<text x="368" y="140" font-family="Arial, sans-serif" font-size="14" fill="#111827">4</text>
|
||||
<text x="488" y="140" font-family="Microsoft YaHei, Arial, sans-serif" font-size="13" fill="#166534">仓库</text>
|
||||
</g>
|
||||
</g>
|
||||
|
||||
<!-- 修改人:Ld 修改时间:2026-07-21 13:10:54; -->
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 8.4 KiB |
291
docs/立库/JY1.0-立库详细界面功能说明书.html
Normal file
@@ -0,0 +1,291 @@
|
||||
<!doctype html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>JY1.0 立库详细界面功能说明书</title>
|
||||
<style>
|
||||
@page { size: A4; margin: 16mm 13mm 15mm; }
|
||||
body { font-family: "Microsoft YaHei", "PingFang SC", Arial, sans-serif; color:#222; line-height:1.62; font-size:13.5px; }
|
||||
h1,h2,h3,h4 { color:#111; margin: 1.1em 0 0.5em; page-break-after: avoid; }
|
||||
h1 { font-size: 25px; border-bottom: 2px solid #2f6fed; padding-bottom: 10px; }
|
||||
h2 { font-size: 19px; border-left: 4px solid #2f6fed; padding-left: 10px; }
|
||||
h3 { font-size: 16px; }
|
||||
p { margin: 0.35em 0 0.75em; }
|
||||
ul,ol { margin: 0.35em 0 0.75em 1.4em; }
|
||||
li { margin: 0.18em 0; }
|
||||
code { background:#f5f7fa; padding:2px 6px; border-radius:4px; font-family: Consolas, monospace; font-size: 12px; }
|
||||
table { width:100%; border-collapse: collapse; margin: 10px 0 16px; font-size: 13px; }
|
||||
th,td { border:1px solid #dcdfe6; padding:8px 10px; vertical-align: top; }
|
||||
th { background:#f5f7fa; }
|
||||
tr:nth-child(even) td { background:#fafafa; }
|
||||
figure { margin: 10px 0 18px; page-break-inside: avoid; }
|
||||
img { display:block; width:100%; max-width:100%; border:1px solid #dcdfe6; border-radius:4px; box-shadow:0 2px 8px rgba(0,0,0,.08); }
|
||||
strong { color:#111; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>JY1.0 立库详细界面功能说明书</h1>
|
||||
<h2>1. 文档目的</h2>
|
||||
<p>本文档用于整理 JY1.0 项目中“立库查询/立库可视化”组件目前已经实现的界面结构、后端数据来源、交互逻辑和现有功能范围,便于后续培训、验收、维护和功能扩展。</p>
|
||||
<p>本文档依据当前前端实现整理,核心代码位置如下:</p>
|
||||
<ul><li><code>src/views/WarehouseManagement/WarehouseVisualization/index.vue</code></li><li><code>static/config.js</code></li></ul>
|
||||
<h2>2. 页面定位</h2>
|
||||
<p>立库详细界面当前对应的页面名称为:</p>
|
||||
<ul><li>页面组件名:<code>WarehouseVisualizationSystem</code></li><li>页面标签名:<code>立库可视化</code></li><li>目录位置:<code>src/views/WarehouseManagement/WarehouseVisualization/index.vue</code></li></ul>
|
||||
<p>该页面用于展示立体仓库库位占用情况,并支持按巷道查看、按行层筛选、单击库位查看库位详情或物料明细。</p>
|
||||
<h2>3. 页面总体结构</h2>
|
||||
<p><strong>图 1:立库可视化主界面</strong></p>
|
||||
<figure><img src="assets/warehouse-visualization/main.png" alt="立库可视化主界面" /></figure>
|
||||
<p>页面整体采用标准的 <code>div.app-container + el-card</code> 布局,主体包含以下区域:</p>
|
||||
<ol><li>顶部筛选与操作区</li><li>统计信息卡片区</li><li>状态图例区</li><li>立库可视化表格区</li><li>分页区</li><li>库位详情弹窗</li><li>物料信息弹窗</li></ol>
|
||||
<p>当前页面只有一个主标签页:</p>
|
||||
<ul><li><code>立库可视化</code></li></ul>
|
||||
<p>代码中保留了图表分析相关逻辑,但当前模板中未实际启用“分析”页签。</p>
|
||||
<h2>4. 顶部筛选与操作区说明</h2>
|
||||
<p><strong>图 2:筛选区与显示模式切换示意</strong></p>
|
||||
<figure><img src="assets/warehouse-visualization/filter.png" alt="筛选区与显示模式切换" /></figure>
|
||||
<p>顶部区域已经实现以下控件:</p>
|
||||
<h3>4.1 巷道筛选</h3>
|
||||
<p>控件类型:<code>el-select</code></p>
|
||||
<p>可选项固定为:</p>
|
||||
<ul><li>第一巷道</li><li>第二巷道</li><li>第三巷道</li><li>第四巷道</li></ul>
|
||||
<p>对应值为:</p>
|
||||
<ul><li><code>1</code></li><li><code>2</code></li><li><code>3</code></li><li><code>4</code></li></ul>
|
||||
<p>用途:</p>
|
||||
<ul><li>用户选择巷道后,点击“搜索”,页面会调用立库接口重新获取该巷道数据。</li></ul>
|
||||
<h3>4.2 行层筛选</h3>
|
||||
<p>控件类型:<code>el-select</code></p>
|
||||
<p>用途:</p>
|
||||
<ul><li>根据当前已加载的立库数据,自动生成“行-层”下拉选项。</li><li>用户可筛选某一行层,只显示对应行数据。</li></ul>
|
||||
<p>特点:</p>
|
||||
<ul><li>选项从接口返回数据动态提取。</li><li>会自动去重。</li><li>按数值倒序排列。</li></ul>
|
||||
<h3>4.3 搜索按钮</h3>
|
||||
<p>按钮文字:<code>搜索</code></p>
|
||||
<p>作用:</p>
|
||||
<ul><li>重置当前页码为第一页。</li><li>先执行前端筛选。</li><li>再根据当前巷道值调用 <code>GetPosition</code> 获取最新立库数据。</li></ul>
|
||||
<p>说明:</p>
|
||||
<ul><li>当前“搜索”动作的核心是按巷道重新取数。</li><li>代码里存在 <code>searchKeyword</code> 变量,但页面上没有对应输入框,因此当前没有“按列关键字搜索”的实际入口。</li></ul>
|
||||
<h3>4.4 重置按钮</h3>
|
||||
<p>按钮文字:<code>重置</code></p>
|
||||
<p>作用:</p>
|
||||
<ul><li>清空状态筛选值</li><li>清空行层筛选值</li><li>清空搜索关键字</li><li>页码回到第一页</li><li>重新执行前端筛选</li></ul>
|
||||
<p>页面提示:</p>
|
||||
<ul><li>执行后弹出“筛选条件已重置”。</li></ul>
|
||||
<p>注意:</p>
|
||||
<ul><li>当前重置不会主动重新按巷道取数,只是重置前端筛选状态。</li></ul>
|
||||
<h3>4.5 刷新数据按钮</h3>
|
||||
<p>按钮文字:<code>刷新数据</code></p>
|
||||
<p>作用:</p>
|
||||
<ul><li>触发加载动画</li><li>500ms 后重新装载当前 <code>defaultWarehouseData</code></li><li>更新时间戳</li><li>弹出“数据刷新成功”</li></ul>
|
||||
<p>说明:</p>
|
||||
<ul><li>刷新逻辑最终仍依赖最近一次 <code>GetPosition</code> 返回并写入的 <code>defaultWarehouseData</code>。</li><li>如果前面已经切换过巷道,刷新展示的是当前缓存的该次结果。</li></ul>
|
||||
<h3>4.6 显示模式切换开关</h3>
|
||||
<p>控件类型:<code>el-switch</code></p>
|
||||
<p>两种模式:</p>
|
||||
<ul><li>显示文字:<code>text</code></li><li>显示图标:<code>icon</code></li></ul>
|
||||
<p>作用:</p>
|
||||
<ul><li>控制库位单元格显示简称文字还是图标。</li></ul>
|
||||
<p>切换效果:</p>
|
||||
<ul><li>文字模式显示:<code>物 / 盘 / 空 / 锁</code></li><li>图标模式显示:</li></ul>
|
||||
<p>- 锁库:<code>el-icon-lock</code> - 有物料有托盘:<code>el-icon-box</code> - 有托盘无物料:<code>el-icon-tickets</code> - 空库位:<code>el-icon-minus</code></p>
|
||||
<p>页面提示:</p>
|
||||
<ul><li>切换后会提示当前已切换到文字模式或图标模式。</li></ul>
|
||||
<h2>5. 统计信息卡片区说明</h2>
|
||||
<p>页面中部已实现 6 个统计卡片:</p>
|
||||
<h3>5.1 总库位数</h3>
|
||||
<p>计算方式:</p>
|
||||
<ul><li><code>立库行数 * 列数</code></li></ul>
|
||||
<h3>5.2 有物料有托盘</h3>
|
||||
<p>统计状态值为 <code>2</code> 的库位数量。</p>
|
||||
<h3>5.3 有托盘无物料</h3>
|
||||
<p>统计状态值为 <code>1</code> 的库位数量。</p>
|
||||
<h3>5.4 空闲库位</h3>
|
||||
<p>统计状态值为 <code>0</code> 的库位数量。</p>
|
||||
<h3>5.5 使用率</h3>
|
||||
<p>计算方式:</p>
|
||||
<ul><li><code>(有物料有托盘 + 有托盘无物料) / 总库位数 * 100%</code></li></ul>
|
||||
<p>保留 1 位小数。</p>
|
||||
<h3>5.6 数据行数</h3>
|
||||
<p>显示当前 <code>warehouseData.length</code>,即当前已加载的立库行数。</p>
|
||||
<h2>6. 状态图例说明</h2>
|
||||
<p>页面已实现状态图例,用于帮助用户理解库位颜色含义:</p>
|
||||
<ul><li>绿色:有物料有托盘</li><li>橙色:有托盘无物料</li><li>灰色:空库位</li><li>蓝色边框:当前选中库位</li></ul>
|
||||
<p>另外,代码中还支持:</p>
|
||||
<ul><li>蓝色底:锁库(状态值 <code>9</code>)</li></ul>
|
||||
<p>该状态在单元格样式和状态文字中已实现,但图例区未单独展示“锁库”说明。</p>
|
||||
<h2>7. 立库可视化表格区说明</h2>
|
||||
<p>这是页面的核心区域。</p>
|
||||
<h3>7.1 展示形式</h3>
|
||||
<p>页面使用原生 <code>table</code> 绘制立库矩阵,不是 <code>el-table</code>。</p>
|
||||
<p>结构包含:</p>
|
||||
<ul><li>表头列号</li><li>左侧行层标识</li><li>中间库位矩阵单元格</li></ul>
|
||||
<h3>7.2 行列组织方式</h3>
|
||||
<h4>行</h4>
|
||||
<p>每一行对应一个“行-层”值,例如:</p>
|
||||
<ul><li><code>01-01</code></li><li><code>03-12</code></li></ul>
|
||||
<p>页面左侧固定显示该行层编号。</p>
|
||||
<h4>列</h4>
|
||||
<p>每列按照数字列号展示,从 <code>1</code> 到 <code>columnCount</code>。</p>
|
||||
<p><code>columnCount</code> 的计算规则为:</p>
|
||||
<ul><li>读取首行对象字段</li><li>排除 <code>行-层</code></li><li>其余字段个数即为列数</li></ul>
|
||||
<h3>7.3 单元格状态值</h3>
|
||||
<p>当前库位单元格支持以下状态:</p>
|
||||
<table><thead><tr><th>状态值</th><th>含义</th><th>前端显示简称</th><th>颜色</th></tr></thead><tbody><tr><td><code>0</code></td><td>空库位</td><td>空</td><td>灰色</td></tr><tr><td><code>1</code></td><td>有托盘无物料</td><td>盘</td><td>橙色</td></tr><tr><td><code>2</code></td><td>有物料有托盘</td><td>物</td><td>绿色</td></tr><tr><td><code>9</code></td><td>锁库/在存取</td><td>锁</td><td>蓝色</td></tr></tbody></table>
|
||||
<h3>7.4 单元格交互效果</h3>
|
||||
<p>当前已实现以下交互:</p>
|
||||
<ul><li>鼠标悬停单元格时放大</li><li>鼠标悬停显示状态浮层</li><li>点击后高亮选中库位</li><li>点击后高亮整行对应的行层</li><li>点击某列后,对应列表头也会高亮</li></ul>
|
||||
<h3>7.5 空数据处理</h3>
|
||||
<p>当 <code>warehouseData.length === 0</code> 时,页面显示空白占位区域。</p>
|
||||
<p>说明:</p>
|
||||
<ul><li>代码里曾预留 <code>el-empty</code> 结构,但目前已注释,没有实际“暂无数据”文案和“加载示例数据”按钮。</li></ul>
|
||||
<h2>8. 分页功能说明</h2>
|
||||
<p>页面底部已实现分页控件,条件为:</p>
|
||||
<ul><li><code>totalPages > 1</code> 时显示</li></ul>
|
||||
<p>分页能力包括:</p>
|
||||
<ul><li>查看总数</li><li>切换每页条数</li><li>上一页/下一页</li><li>页码跳转</li><li>直接输入页码跳转</li></ul>
|
||||
<p>每页可选条数:</p>
|
||||
<ul><li><code>5</code></li><li><code>8</code></li><li><code>10</code></li><li><code>15</code></li></ul>
|
||||
<p>说明:</p>
|
||||
<ul><li>分页针对的是“行数据”,不是单元格。</li><li>也就是一次显示若干个“行-层”。</li></ul>
|
||||
<h2>9. 库位详情弹窗说明</h2>
|
||||
<p><strong>图 3:库位详情弹窗示意</strong></p>
|
||||
<figure><img src="assets/warehouse-visualization/detail.png" alt="库位详情弹窗" /></figure>
|
||||
<p>点击非物料状态库位时,会弹出“库位详情”窗口。</p>
|
||||
<p>触发条件:</p>
|
||||
<ul><li>单元格状态不等于 <code>2</code></li></ul>
|
||||
<h3>9.1 弹窗标题</h3>
|
||||
<p>格式:</p>
|
||||
<ul><li><code>库位详情 + 库位编号</code></li></ul>
|
||||
<p>例如:</p>
|
||||
<ul><li><code>库位详情 03-12-01</code></li></ul>
|
||||
<h3>9.2 弹窗内容</h3>
|
||||
<p>当前弹窗内容为库位状态说明文本,即 <code>selectedCellDetail.description</code>。</p>
|
||||
<p>不同状态说明如下:</p>
|
||||
<ul><li><code>0</code>:空闲库位,可存放物料</li><li><code>1</code>:有托盘但无物料,需补充物料</li><li><code>2</code>:有托盘且有物料,正常使用中</li><li><code>9</code>:在存取,库位已锁</li></ul>
|
||||
<h3>9.3 当前实现特点</h3>
|
||||
<p>目前该弹窗属于轻量说明弹窗,展示内容较简洁,没有进一步展示:</p>
|
||||
<ul><li>仓库编号</li><li>创建时间</li><li>最近操作人</li><li>任务锁定来源</li></ul>
|
||||
<p>这些字段在前端对象构造里有部分预留,但未在弹窗模板中完整展示。</p>
|
||||
<h2>10. 物料信息弹窗说明</h2>
|
||||
<p><strong>图 4:物料信息弹窗示意</strong></p>
|
||||
<figure><img src="assets/warehouse-visualization/material.png" alt="物料信息弹窗" /></figure>
|
||||
<p>点击状态为 <code>2</code> 的库位时,会弹出“库位信息”窗口。</p>
|
||||
<p>触发条件:</p>
|
||||
<ul><li>单元格状态等于 <code>2</code></li></ul>
|
||||
<h3>10.1 弹窗标题</h3>
|
||||
<p>格式:</p>
|
||||
<ul><li><code>库位信息 + pno</code></li></ul>
|
||||
<p>即使用返回数据第一条的库位编号作为标题显示。</p>
|
||||
<h3>10.2 数据来源</h3>
|
||||
<p>点击单元格后会调用 <code>StockDetail(rowLayer, column)</code>,查询数据库视图:</p>
|
||||
<ul><li><code>StockDetailView</code></li></ul>
|
||||
<p>查询方式为手写 SQL:</p>
|
||||
<ul><li><code>select ... from StockDetailView where pno='xx-xx-xx'</code></li></ul>
|
||||
<h3>10.3 库位编号拼接规则</h3>
|
||||
<p>点击单元格时,前端会把界面上的 <code>行-层</code> 和列号转换为后端查询用的 <code>pno</code>:</p>
|
||||
<ol><li>将列号补足 2 位</li><li>将 <code>行-层</code> 以 <code>-</code> 拆分</li><li>按 <code>行-列-层</code> 重新拼装</li></ol>
|
||||
<p>例如:</p>
|
||||
<ul><li>页面行层:<code>03-01</code></li><li>点击列:<code>12</code></li><li>后端查询编码:<code>03-12-01</code></li></ul>
|
||||
<h3>10.4 弹窗字段</h3>
|
||||
<p>当前弹窗表格已展示以下字段:</p>
|
||||
<ul><li>物料编号 <code>mno</code></li><li>物料名称 <code>mname</code></li><li>图号 <code>spec</code></li><li>型号 <code>thao</code></li><li>库存数量 <code>qty</code></li><li>锁定库存 <code>lockqty</code></li><li>批次 <code>batch</code></li></ul>
|
||||
<p>其中数量字段已实现:</p>
|
||||
<ul><li>保留三位小数格式化</li><li>大于 0 时显示强调色</li><li>在数量下方显示单位 <code>munit</code></li></ul>
|
||||
<h3>10.5 返回数据兼容处理</h3>
|
||||
<p>前端对接口返回做了多种兼容判断,支持以下几类格式:</p>
|
||||
<ol><li><code>response.data</code> 直接就是数组</li><li><code>response.data.data</code> 是数组</li><li><code>response.data.rows</code> 是数组</li><li><code>response.data</code> 是单对象,且对象里包含 <code>mno</code> 或 <code>pno</code></li></ol>
|
||||
<p>说明:</p>
|
||||
<ul><li>这意味着当前页面对后端返回结构的容错较强。</li></ul>
|
||||
<h3>10.6 无数据提示</h3>
|
||||
<p>如果接口无返回数据,则提示:</p>
|
||||
<ul><li><code>未查询到数据</code></li></ul>
|
||||
<h2>11. 后端接口与数据来源说明</h2>
|
||||
<p>当前页面实际对接了两类立库相关数据。</p>
|
||||
<h3>11.1 立库布局/状态数据</h3>
|
||||
<p>请求方法:</p>
|
||||
<ul><li><code>GetPosition(hang)</code></li></ul>
|
||||
<p>请求构造:</p>
|
||||
<ul><li><code>this.CreateData('11', 'GetPositionView', param)</code></li></ul>
|
||||
<p>参数内容:</p>
|
||||
<ul><li><code>hang</code>:巷道编号</li><li><code>potvar</code>:空字符串</li><li><code>tt</code>:固定值 <code>1</code></li></ul>
|
||||
<p>调用方式:</p>
|
||||
<ul><li><code>this.ExecDatabase1(Data)</code></li></ul>
|
||||
<p>返回结果用途:</p>
|
||||
<ul><li>写入 <code>defaultWarehouseData</code></li><li>再触发 <code>refreshData()</code></li><li>最终更新主界面矩阵</li></ul>
|
||||
<h3>11.2 库位物料明细数据</h3>
|
||||
<p>请求方法:</p>
|
||||
<ul><li><code>StockDetail(rowLayer, column)</code></li></ul>
|
||||
<p>请求方式:</p>
|
||||
<ul><li>直接构造 SQL 查询 <code>StockDetailView</code></li></ul>
|
||||
<p>调用方式:</p>
|
||||
<ul><li><code>this.ExecDatabase1(Data)</code></li></ul>
|
||||
<p>返回结果用途:</p>
|
||||
<ul><li>写入 <code>materialInfoList</code></li><li>打开物料信息弹窗</li></ul>
|
||||
<h3>11.3 接口地址配置</h3>
|
||||
<p>立库接口使用独立配置地址:</p>
|
||||
<ul><li><code>static/config.js</code></li><li><code>url1 = http://192.168.1.27:10006</code></li><li><code>request_config1 = url1 + '/submit/MESCommonBase.ashx'</code></li></ul>
|
||||
<p>说明:</p>
|
||||
<ul><li>这表明立库数据并未走默认 MES 主接口,而是走单独的立库数据库服务入口。</li></ul>
|
||||
<h2>12. 已实现功能清单</h2>
|
||||
<p>基于当前页面代码,已经实现并可确认的功能如下。</p>
|
||||
<h3>12.1 页面展示类功能</h3>
|
||||
<ul><li>立库矩阵可视化展示</li><li>行层与列号展示</li><li>库位状态颜色区分</li><li>文字/图标两种展示模式切换</li><li>统计卡片展示</li><li>状态图例展示</li><li>分页展示</li></ul>
|
||||
<h3>12.2 数据查询类功能</h3>
|
||||
<ul><li>默认加载立库数据</li><li>按巷道重新查询立库数据</li><li>点击状态为 <code>2</code> 的库位查询物料明细</li><li>点击非 <code>2</code> 状态库位查看库位状态说明</li></ul>
|
||||
<h3>12.3 筛选与交互类功能</h3>
|
||||
<ul><li>按行层筛选</li><li>点击搜索按钮重新按巷道加载</li><li>重置筛选条件</li><li>刷新当前缓存数据</li><li>鼠标悬停显示状态提示</li><li>单元格选中高亮</li><li>行高亮</li><li>列高亮</li></ul>
|
||||
<h3>12.4 数据展示增强功能</h3>
|
||||
<ul><li>数量保留 3 位小数</li><li>锁定库存单独显示</li><li>单位显示</li><li>物料列表支持多条记录显示</li><li>接口返回结构兼容处理</li></ul>
|
||||
<h2>13. 代码中存在但当前未完整启用的能力</h2>
|
||||
<p>以下能力在代码中已有部分实现或预留,但从当前模板和实际入口看,尚未完整开放为可见功能。</p>
|
||||
<h3>13.1 状态筛选</h3>
|
||||
<p>页面 <code>data</code> 中存在:</p>
|
||||
<ul><li><code>statusFilter</code></li></ul>
|
||||
<p>筛选逻辑中也保留了状态筛选分支,但顶部没有对应状态下拉框,因此用户当前无法直接按状态筛选。</p>
|
||||
<h3>13.2 关键字搜索</h3>
|
||||
<p>页面 <code>data</code> 中存在:</p>
|
||||
<ul><li><code>searchKeyword</code></li></ul>
|
||||
<p>并保留了按列搜索的逻辑入口,但模板中没有对应输入框,因此当前不构成实际功能。</p>
|
||||
<h3>13.3 图表分析功能</h3>
|
||||
<p>代码中已实现:</p>
|
||||
<ul><li>状态分布饼图</li><li>行列使用率图</li><li>ECharts 初始化与销毁</li></ul>
|
||||
<p>但模板中没有对应图表容器,也没有实际启用 <code>warehouse-analysis</code> 页签,因此当前属于预留代码。</p>
|
||||
<h3>13.4 数据导出功能</h3>
|
||||
<p>代码中已实现 <code>exportWarehouseData()</code>,可以把当前 <code>warehouseData</code> 导出为 JSON 文件。</p>
|
||||
<p>但当前页面模板没有挂出“导出”按钮,因此用户在界面上无法直接使用。</p>
|
||||
<h3>13.5 打印报表功能</h3>
|
||||
<p>代码中存在 <code>printWarehouseReport()</code>,但当前只是提示“功能开发中”,没有实际打印逻辑。</p>
|
||||
<h3>13.6 物料标签打印</h3>
|
||||
<p>代码中存在 <code>printMaterialInfo()</code>,当前同样仅提示“功能开发中”。</p>
|
||||
<h3>13.7 焦点定位功能</h3>
|
||||
<p>代码中存在 <code>focusOnCell(rowLayer, column)</code>,可自动滚动到指定单元格位置。</p>
|
||||
<p>但当前页面没有表格明细区或其他入口去调用它,因此属于预留能力。</p>
|
||||
<h2>14. 现有业务规则总结</h2>
|
||||
<p>从当前实现可归纳出以下业务规则。</p>
|
||||
<h3>14.1 单元格状态规则</h3>
|
||||
<ul><li><code>2</code> 代表该库位已有物料,应进入物料明细查询流程</li><li>非 <code>2</code> 状态不查物料,进入库位说明流程</li><li><code>9</code> 表示库位正在存取或已锁定</li></ul>
|
||||
<h3>14.2 巷道数据规则</h3>
|
||||
<ul><li>页面默认在 <code>mounted</code> 时调用 <code>GetPosition(1)</code>,默认先加载第一巷道</li><li>用户再通过顶部选择器切换其他巷道</li></ul>
|
||||
<h3>14.3 编码转换规则</h3>
|
||||
<p>界面展示编码与后端查询编码不是同一个结构:</p>
|
||||
<ul><li>界面主要使用 <code>行-层</code></li><li>后端明细查询使用 <code>行-列-层</code></li></ul>
|
||||
<p>因此点击库位时必须做一次编号重组。</p>
|
||||
<h2>15. 使用流程说明</h2>
|
||||
<p>典型操作流程如下:</p>
|
||||
<ol><li>打开立库可视化页面</li><li>系统默认加载第一巷道数据</li><li>页面显示统计信息、图例和库位矩阵</li><li>用户可切换巷道并点击“搜索”</li><li>用户可按“行-层”筛选关注区域</li><li>用户可切换文字/图标显示模式</li><li>鼠标悬停可查看库位状态提示</li><li>点击空库位/托盘位/锁定位,查看库位说明</li><li>点击有物料库位,查看该库位物料明细</li><li>需要恢复视图时可点击“重置”或“刷新数据”</li></ol>
|
||||
<h2>16. 当前界面优点</h2>
|
||||
<p>从现有实现看,该页面已经具备以下优点:</p>
|
||||
<ul><li>视觉上能直接反映立库占用状态</li><li>巷道切换清晰</li><li>物料库位点击查询路径明确</li><li>状态颜色和图标表达直观</li><li>对后端返回结构适配较灵活</li><li>前端交互响应比较轻量</li></ul>
|
||||
<h2>17. 当前界面限制</h2>
|
||||
<p>从代码现状看,也存在一些限制:</p>
|
||||
<ul><li>状态筛选未开放界面入口</li><li>关键字搜索未开放界面入口</li><li>导出功能未开放按钮</li><li>图表分析功能未在页面中启用</li><li>空数据时缺少明确提示文案</li><li>锁库状态没有放入图例区</li><li>库位详情弹窗信息量偏少</li><li>刷新逻辑更多是前端缓存刷新,不是强制重新拉取所有条件数据</li></ul>
|
||||
<h2>18. 维护与扩展建议</h2>
|
||||
<p>如果后续继续完善该页面,建议优先考虑以下方向:</p>
|
||||
<ol><li>增加状态筛选下拉框,补齐 <code>statusFilter</code> 实际入口</li><li>增加库位搜索输入框,支持直接定位 <code>行-层-列</code></li><li>在界面上开放“导出 JSON”按钮</li><li>补上锁库状态图例</li><li>完善空数据占位提示</li><li>把图表分析页签正式接入模板</li><li>在库位详情弹窗中增加更多业务字段</li><li>将明细查询 SQL 封装为标准后端接口名,减少前端直接拼 SQL 的耦合</li></ol>
|
||||
<h2>19. 结论</h2>
|
||||
<p>当前“立库详细界面”已经不是简单静态展示,而是一个具备实际业务查询能力的立库可视化页面。它已经实现了:</p>
|
||||
<ul><li>按巷道加载立库状态</li><li>立库矩阵可视化展示</li><li>库位状态识别</li><li>库位详情查看</li><li>库位物料明细查询</li><li>筛选、分页、刷新、显示模式切换等基础交互</li></ul>
|
||||
<p>同时,代码中还保留了导出、图表分析、状态筛选、定位等扩展能力,说明该页面已经具备进一步升级为完整“立库监控与查询中心”的基础。</p>
|
||||
</body>
|
||||
</html>
|
||||
672
docs/立库/JY1.0-立库详细界面功能说明书.md
Normal file
@@ -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:立库可视化主界面**
|
||||
|
||||

|
||||
|
||||
|
||||
页面整体采用标准的 `div.app-container + el-card` 布局,主体包含以下区域:
|
||||
|
||||
1. 顶部筛选与操作区
|
||||
2. 统计信息卡片区
|
||||
3. 状态图例区
|
||||
4. 立库可视化表格区
|
||||
5. 分页区
|
||||
6. 库位详情弹窗
|
||||
7. 物料信息弹窗
|
||||
|
||||
当前页面只有一个主标签页:
|
||||
|
||||
- `立库可视化`
|
||||
|
||||
代码中保留了图表分析相关逻辑,但当前模板中未实际启用“分析”页签。
|
||||
|
||||
## 4. 顶部筛选与操作区说明
|
||||
|
||||
**图 2:筛选区与显示模式切换示意**
|
||||
|
||||

|
||||
|
||||
|
||||
顶部区域已经实现以下控件:
|
||||
|
||||
### 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:库位详情弹窗示意**
|
||||
|
||||

|
||||
|
||||
|
||||
点击非物料状态库位时,会弹出“库位详情”窗口。
|
||||
|
||||
触发条件:
|
||||
|
||||
- 单元格状态不等于 `2`
|
||||
|
||||
### 9.1 弹窗标题
|
||||
|
||||
格式:
|
||||
|
||||
- `库位详情 + 库位编号`
|
||||
|
||||
例如:
|
||||
|
||||
- `库位详情 03-12-01`
|
||||
|
||||
### 9.2 弹窗内容
|
||||
|
||||
当前弹窗内容为库位状态说明文本,即 `selectedCellDetail.description`。
|
||||
|
||||
不同状态说明如下:
|
||||
|
||||
- `0`:空闲库位,可存放物料
|
||||
- `1`:有托盘但无物料,需补充物料
|
||||
- `2`:有托盘且有物料,正常使用中
|
||||
- `9`:在存取,库位已锁
|
||||
|
||||
### 9.3 当前实现特点
|
||||
|
||||
目前该弹窗属于轻量说明弹窗,展示内容较简洁,没有进一步展示:
|
||||
|
||||
- 仓库编号
|
||||
- 创建时间
|
||||
- 最近操作人
|
||||
- 任务锁定来源
|
||||
|
||||
这些字段在前端对象构造里有部分预留,但未在弹窗模板中完整展示。
|
||||
|
||||
## 10. 物料信息弹窗说明
|
||||
|
||||
**图 4:物料信息弹窗示意**
|
||||
|
||||

|
||||
|
||||
|
||||
点击状态为 `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. 结论
|
||||
|
||||
当前“立库详细界面”已经不是简单静态展示,而是一个具备实际业务查询能力的立库可视化页面。它已经实现了:
|
||||
|
||||
- 按巷道加载立库状态
|
||||
- 立库矩阵可视化展示
|
||||
- 库位状态识别
|
||||
- 库位详情查看
|
||||
- 库位物料明细查询
|
||||
- 筛选、分页、刷新、显示模式切换等基础交互
|
||||
|
||||
同时,代码中还保留了导出、图表分析、状态筛选、定位等扩展能力,说明该页面已经具备进一步升级为完整“立库监控与查询中心”的基础。
|
||||
BIN
docs/立库/JY1.0-立库详细界面功能说明书.pdf
Normal file
BIN
docs/调研报告.docx
Normal file
BIN
docs/调研报告.pdf
Normal file
90
docs/零件改制/01-项目功能内容.md
Normal file
@@ -0,0 +1,90 @@
|
||||
# 01-项目功能内容
|
||||
|
||||
## 1. 需求来源
|
||||
|
||||
因现场计件、派工生产、完工入库和后续追溯需要,将零件改制流程接入系统。该需求由罗总牵头,组织技术中心、精工车间、仓储等相关部门讨论后提出。
|
||||
|
||||
## 2. 应用场景
|
||||
|
||||
- 技术中心根据现场或订单需求发起零件改制订单。
|
||||
- 改制订单进入精工车间生产任务流程。
|
||||
- 精工车间在生产任务查询中查看改制任务。
|
||||
- 车间派工组件查看改制任务并派工。
|
||||
- MES 加工端按改制订单显示待加工任务。
|
||||
- 改制加工完成后按现有流程办理入库。
|
||||
- 改制记录用于查询原零件、改制零件、生产任务和加工状态。
|
||||
|
||||
## 3. 功能范围
|
||||
|
||||
### 3.1 技术中心
|
||||
|
||||
- 新增零件改制订单发起组件。
|
||||
- 左侧显示订单/产品列表。
|
||||
- 右侧显示所选产品下的所有零件。
|
||||
- 零件操作列提供“改制”按钮。
|
||||
- 点击“改制”后填写改制零件名称、改制零件图号、改制数量、精工期限。
|
||||
- 原零件图号和改制零件图号相同则禁止发起。
|
||||
|
||||
### 3.2 后端记录
|
||||
|
||||
- 新增或维护 `技术中心_改制订单记录`。
|
||||
- 记录原订单、原组件、原基本件、原零件名称、原零件图号。
|
||||
- 记录改制零件名称、改制零件图号、改制数量、精工期限。
|
||||
- 记录改制订单编号、发起人、发起时间、状态、是否删除。
|
||||
- 回写新生成的 `工艺计划流水号`。
|
||||
|
||||
### 3.3 精工车间
|
||||
|
||||
- 发起改制后自动生成精工车间生产任务。
|
||||
- 自动生成默认工艺 `改制`。
|
||||
- 工艺计划进入“工艺完成”状态,后续可进入派工。
|
||||
- 生产任务查询中优先显示改制订单编号、改制零件名称、改制零件图号。
|
||||
|
||||
### 3.4 MES 加工端
|
||||
|
||||
- MES 待加工显示关联改制记录。
|
||||
- 有改制订单时,订单号优先显示改制订单编号。
|
||||
- 通过 `工艺计划流水号` 关联改制记录,避免重复显示。
|
||||
|
||||
## 4. 编号规则
|
||||
|
||||
改制订单编号规则:
|
||||
|
||||
```text
|
||||
BHGZ + 年月日 + 4位顺序号
|
||||
```
|
||||
|
||||
示例:
|
||||
|
||||
```text
|
||||
BHGZ202606250001
|
||||
BHGZ-202606270010
|
||||
```
|
||||
|
||||
实际格式以数据库发起过程最终生成逻辑为准,但业务前缀固定为 `BHGZ`。
|
||||
|
||||
## 5. 核心流程
|
||||
|
||||
```text
|
||||
技术中心选择订单/产品
|
||||
-> 查询产品零件
|
||||
-> 点击零件改制
|
||||
-> 校验原图号与改制图号不同
|
||||
-> 生成改制订单记录
|
||||
-> 生成精工车间工艺计划
|
||||
-> 回写工艺计划流水号
|
||||
-> 自动添加默认工艺“改制”
|
||||
-> 生产任务查询显示改制任务
|
||||
-> 车间派工
|
||||
-> MES 加工
|
||||
-> 完工入库
|
||||
```
|
||||
|
||||
## 6. 不在当前范围内的内容
|
||||
|
||||
- 非毛坯物料改制自动生成领料单。
|
||||
- 仓库出库状态限制派工。
|
||||
- 改制订单取消、退料、异常处理。
|
||||
- 改制记录独立查询页面的完整开发。
|
||||
|
||||
这些内容作为后续扩展任务维护在任务矩阵中。
|
||||
258
docs/零件改制/02-项目程序开发详细步骤.md
Normal file
@@ -0,0 +1,258 @@
|
||||
# 02-项目程序开发详细步骤
|
||||
|
||||
## 1. 前端开发步骤
|
||||
|
||||
### 1.1 新增组件
|
||||
|
||||
路径:
|
||||
|
||||
```text
|
||||
src/views/TechnologyCenter/PartModificationOrder/index.vue
|
||||
```
|
||||
|
||||
页面结构:
|
||||
|
||||
```text
|
||||
app-container
|
||||
-> el-card
|
||||
-> 左侧订单/产品表格
|
||||
-> 右侧零件表格
|
||||
-> 发起改制弹窗
|
||||
-> 图纸查看弹窗
|
||||
```
|
||||
|
||||
### 1.2 左侧订单/产品查询
|
||||
|
||||
订单下拉接口:
|
||||
|
||||
```text
|
||||
订单信息_列表_查询数据_bak
|
||||
```
|
||||
|
||||
要求:
|
||||
|
||||
- 不需要传订单编号时也可加载订单列表。
|
||||
- `label` 使用订单编号。
|
||||
- `value` 使用订单流水号。
|
||||
|
||||
订单/产品查询接口:
|
||||
|
||||
```text
|
||||
技术中心_改制订单_订单_查询
|
||||
```
|
||||
|
||||
要求:
|
||||
|
||||
- 传入下拉选择的订单流水号。
|
||||
- 显示订单编号、产品名称。
|
||||
- 相同数据去重显示由后端查询保证。
|
||||
|
||||
### 1.3 右侧零件查询
|
||||
|
||||
接口:
|
||||
|
||||
```text
|
||||
技术中心_改制订单_零件_查询
|
||||
```
|
||||
|
||||
要求:
|
||||
|
||||
- 点击左侧产品后查询对应零件。
|
||||
- 显示零件名称、零件图号、数量。
|
||||
- 操作列包含“查看图纸”和“改制”。
|
||||
|
||||
### 1.4 发起改制弹窗
|
||||
|
||||
弹窗字段:
|
||||
|
||||
```text
|
||||
原订单编号
|
||||
原零件名称
|
||||
原零件图号
|
||||
原数量
|
||||
改制零件名称
|
||||
改制零件图号
|
||||
改制数量
|
||||
精工期限
|
||||
```
|
||||
|
||||
提交前校验:
|
||||
|
||||
```js
|
||||
var oldDrawingNo = (this.form.原零件图号 || '').toString().trim()
|
||||
var newDrawingNo = (this.form.改制零件图号 || '').toString().trim()
|
||||
if (oldDrawingNo && newDrawingNo && oldDrawingNo === newDrawingNo) {
|
||||
this.$message.warning('改制零件图号不能与原零件图号相同')
|
||||
return
|
||||
}
|
||||
```
|
||||
|
||||
提交接口:
|
||||
|
||||
```text
|
||||
技术中心_改制订单_发起改制
|
||||
```
|
||||
|
||||
## 2. 数据库开发步骤
|
||||
|
||||
### 2.1 改制记录表
|
||||
|
||||
表:
|
||||
|
||||
```text
|
||||
技术中心_改制订单记录
|
||||
```
|
||||
|
||||
关键字段:
|
||||
|
||||
```text
|
||||
改制订单流水号
|
||||
改制订单编号
|
||||
原订单流水号
|
||||
原组件流水号
|
||||
原基本件流水号
|
||||
原零件名称
|
||||
原零件图号
|
||||
改制零件名称
|
||||
改制零件图号
|
||||
改制数量
|
||||
精工期限
|
||||
工艺计划流水号
|
||||
状态
|
||||
发起人
|
||||
发起时间
|
||||
是否删除
|
||||
```
|
||||
|
||||
字段补充 SQL:
|
||||
|
||||
```sql
|
||||
IF COL_LENGTH('dbo.技术中心_改制订单记录', '原零件名称') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE dbo.技术中心_改制订单记录
|
||||
ADD 原零件名称 nvarchar(50) NULL;
|
||||
END;
|
||||
|
||||
IF COL_LENGTH('dbo.技术中心_改制订单记录', '原零件图号') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE dbo.技术中心_改制订单记录
|
||||
ADD 原零件图号 nvarchar(50) NULL;
|
||||
END;
|
||||
|
||||
IF COL_LENGTH('dbo.技术中心_改制订单记录', '工艺计划流水号') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE dbo.技术中心_改制订单记录
|
||||
ADD 工艺计划流水号 int NULL;
|
||||
END;
|
||||
```
|
||||
|
||||
### 2.2 改制订单排序表
|
||||
|
||||
表:
|
||||
|
||||
```text
|
||||
技术中心_改制订单排序
|
||||
```
|
||||
|
||||
用途:
|
||||
|
||||
- 按年份记录改制订单顺序号。
|
||||
- 支持生成 `BHGZ + 年月日 + 4位顺序号`。
|
||||
|
||||
### 2.3 发起改制存储过程
|
||||
|
||||
过程:
|
||||
|
||||
```text
|
||||
技术中心_改制订单_发起改制
|
||||
```
|
||||
|
||||
主要步骤:
|
||||
|
||||
1. 校验参数。
|
||||
2. 后端校验原零件图号和改制零件图号不同。
|
||||
3. 查询原基本件流水号。
|
||||
4. 生成改制订单编号。
|
||||
5. 插入 `技术中心_改制订单记录`。
|
||||
6. 插入 `车间生产管理工艺_零件工艺计划`。
|
||||
7. 回写 `技术中心_改制订单记录.工艺计划流水号`。
|
||||
8. 查找或创建基础工艺 `改制`。
|
||||
9. 更新或插入 `车间生产管理工艺_零件工序`。
|
||||
10. 调用 `精工车间_工艺保存_派工`。
|
||||
11. 更新组件和订单为精工车间承接。
|
||||
|
||||
### 2.4 生产任务视图
|
||||
|
||||
视图:
|
||||
|
||||
```text
|
||||
车间生产管理_零件工艺计划_视图
|
||||
```
|
||||
|
||||
已调整:
|
||||
|
||||
```sql
|
||||
ISNULL(dbo.技术中心_改制订单记录.改制零件名称, dbo.库存管理_物料主文件_基本.名称) AS 零件名称
|
||||
ISNULL(dbo.技术中心_改制订单记录.改制零件图号, dbo.车间生产管理工艺_零件工艺计划.零件图号) AS 零件图号
|
||||
ISNULL(dbo.技术中心_改制订单记录.改制订单编号, dbo.合同管理_订单信息_基础表.订单编号) AS 订单号
|
||||
```
|
||||
|
||||
关联:
|
||||
|
||||
```sql
|
||||
LEFT JOIN dbo.技术中心_改制订单记录
|
||||
ON dbo.车间生产管理工艺_零件工艺计划.工艺计划流水号 = dbo.技术中心_改制订单记录.工艺计划流水号
|
||||
AND ISNULL(dbo.技术中心_改制订单记录.是否删除, 0) = 0
|
||||
```
|
||||
|
||||
### 2.5 生产任务查询过程
|
||||
|
||||
过程:
|
||||
|
||||
```text
|
||||
精工车间_生成任务_查询数据
|
||||
```
|
||||
|
||||
注意事项:
|
||||
|
||||
- 主表已使用别名 `P`。
|
||||
- 动态筛选必须使用 `P.字段名`。
|
||||
- 不得再使用 `车间生产管理_零件工艺计划_视图.字段名`,否则会出现无法绑定多部分标识符错误。
|
||||
|
||||
正确示例:
|
||||
|
||||
```sql
|
||||
AND P.零件图号 LIKE '%' + @图号 + '%'
|
||||
AND P.操作日期 >= @开始时间
|
||||
AND P.操作日期 <= @结束时间
|
||||
```
|
||||
|
||||
### 2.6 MES 待加工显示
|
||||
|
||||
过程:
|
||||
|
||||
```text
|
||||
MES_机加工MES_零件待加工显示
|
||||
```
|
||||
|
||||
建议关联:
|
||||
|
||||
```sql
|
||||
LEFT JOIN 技术中心_改制订单记录 AS GZ
|
||||
ON V.工艺计划流水号 = GZ.工艺计划流水号
|
||||
AND ISNULL(GZ.是否删除, 0) = 0
|
||||
```
|
||||
|
||||
订单号显示:
|
||||
|
||||
```sql
|
||||
ISNULL(GZ.改制订单编号, V.订单号) AS 订单号
|
||||
```
|
||||
|
||||
## 3. 验证步骤
|
||||
|
||||
1. 前端运行 eslint。
|
||||
2. 查询改制记录是否回写工艺计划流水号。
|
||||
3. 查询生产任务视图显示字段是否与改制记录一致。
|
||||
4. 查询是否存在同一工艺计划流水号关联多条未删除改制记录。
|
||||
5. 用图号筛选生产任务查询过程,确认不再出现 4104 错误。
|
||||
33
docs/零件改制/03-推进台账.md
Normal file
@@ -0,0 +1,33 @@
|
||||
# 03-推进台账
|
||||
|
||||
| 轮次 | 日期 | 做了什么 | 改了哪些文件/程序 | 验证了什么 | 下一步 |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 1 | 2026-06-23 | 梳理零件改制整体方案 | `零件改制功能设计方案.md` | 方案包含需求背景、应用场景、流程、表设计 | 生成 PDF 和流程图 |
|
||||
| 2 | 2026-06-23 | 生成设计方案 PDF 和流程图 | `零件改制功能设计方案.pdf`、`零件改制流程图.svg` | PDF 可打开,流程图包含入库节点 | 开始前端组件 |
|
||||
| 3 | 2026-06-24 | 新建零件改制组件 | `src/views/TechnologyCenter/PartModificationOrder/index.vue` | 修复动态路由加载 ENOENT | 调整查询接口 |
|
||||
| 4 | 2026-06-24 | 调整订单和零件查询接口 | `PartModificationOrder/index.vue` | 使用 `技术中心_改制订单_订单_查询`、`技术中心_改制订单_零件_查询` | 调整订单下拉 |
|
||||
| 5 | 2026-06-24 | 订单编号输入框改为下拉框 | `PartModificationOrder/index.vue` | 下拉数据来自 `订单信息_列表_查询数据_bak` | 参考 BOM 优化界面 |
|
||||
| 6 | 2026-06-24 | 参考 BOM 更换物料界面调整发起改制弹窗 | `PartModificationOrder/index.vue` | eslint 通过 | 开始后端存储过程设计 |
|
||||
| 7 | 2026-06-25 | 设计发起改制过程 | `技术中心_改制订单_发起改制` | 明确只分配到精工车间 | 增加改制记录表 |
|
||||
| 8 | 2026-06-25 | 增加改制订单记录表方案 | `技术中心_改制订单记录` | 明确记录字段和回写工艺计划流水号 | 增加订单号规则 |
|
||||
| 9 | 2026-06-25 | 设计改制订单号生成规则 | `技术中心_改制订单排序` | 规则为 `BHGZ + 年月日 + 4位顺序号` | 添加默认工艺 |
|
||||
| 10 | 2026-06-25 | 设计默认工艺 `改制` | `车间生产管理工艺_基础表_工艺名称`、`车间生产管理工艺_零件工序` | 明确不存在则新增基础工艺 | 调整 INSERT/UPDATE 工序逻辑 |
|
||||
| 11 | 2026-06-25 | 工序插入逻辑改为优先更新 | `技术中心_改制订单_发起改制` | 有默认空工序时更新,无则插入兜底 | 修改查询关联方式 |
|
||||
| 12 | 2026-06-25 | 查询关联由基本件流水号改为工艺计划流水号 | 生产任务查询、MES 待加工显示 SQL | 避免同一基本件多次改制重复显示 | 补充原零件信息字段 |
|
||||
| 13 | 2026-06-25 | 添加原零件名称、原零件图号 | `技术中心_改制订单记录`、发起过程 INSERT | 改制记录可追溯原零件 | 修改生产任务视图 |
|
||||
| 14 | 2026-06-27 | 修复生产任务显示的零件名称不是改制名称 | `车间生产管理_零件工艺计划_视图` | 抽样验证订单号/零件名称/图号与改制记录一致 | 生成测试报告 |
|
||||
| 15 | 2026-06-27 | 执行不污染数据的测试并生成测试报告 | `零件改制功能测试报告.md` | eslint 通过;显示不一致数为 0;重复关联数为 0 | 补历史数据或做真实流程验收 |
|
||||
| 16 | 2026-06-29 | 修复生产任务查询动态 SQL 别名绑定问题 | `精工车间_生成任务_查询数据` | 将动态条件统一改为 `P.字段名` | 执行数据库过程更新并页面验证 |
|
||||
| 17 | 2026-06-29 | 拆分标准化推进文档 | `docs/零件改制/README.md`、`01-06` 文档 | 文档结构完成 | 后续按任务矩阵继续推进 |
|
||||
| 18 | 2026-07-01 | 按推荐方案落地改制物料替换显示 | `技术中心_改制订单_发起改制`、`车间生产管理_零件工艺计划_视图`、`PartModificationOrder/index.vue` | 数据库结构验证通过,前端 eslint 通过 | 使用已维护新物料的测试订单做真实发起和入库验证 |
|
||||
| 19 | 2026-07-01 | 修复发起改制后零件列表未按改制目标替换显示 | `技术中心_改制订单_零件_查询`、`技术中心_改制订单_发起改制`、`src/views/TechnologyCenter/PartModificationOrder/index.vue`、`sql/零件改制_发起改制_精确基本件.sql` | SQL 抽样验证:组件 4283 已显示 `XT40-205MF-01.02-G`,组件 2652 不再被串件覆盖;前端 eslint 通过 | 页面刷新后由接口回显最新改制目标,继续做真实发起与生产入库闭环验收 |
|
||||
|
||||
## 当前下一步
|
||||
|
||||
1. 使用页面真实发起一条带 `原基本件流水号` 的改制订单。
|
||||
2. 验证改制发起页面刷新后只替换被点击的零件行。
|
||||
3. 验证生产任务查询、车间派工、MES 待加工显示。
|
||||
4. 验证自制件入库是否使用改制物料流水号。
|
||||
5. 补齐历史改制记录的 `改制物料流水号` 或确认无需处理。
|
||||
|
||||
修改人:Ld 修改时间:2026-07-01 14:46:30;
|
||||
47
docs/零件改制/04-任务矩阵.md
Normal file
@@ -0,0 +1,47 @@
|
||||
# 04-任务矩阵
|
||||
|
||||
| 任务编号 | 任务名称 | 状态 | 验收标准 | 备注 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| GZ-001 | 编写零件改制功能方案 | 已完成 | 文档包含需求背景、应用场景、现有流程承接、入库节点 | 已生成设计方案 |
|
||||
| GZ-002 | 生成方案 PDF 和流程图 | 已完成 | PDF 存在,流程图位置正确,流程包含入库 | 已生成 PDF/SVG |
|
||||
| GZ-003 | 新建技术中心改制组件 | 已完成 | 路由能加载 `PartModificationOrder/index.vue`,无 ENOENT | 已创建组件 |
|
||||
| GZ-004 | 左侧订单/产品查询 | 已完成 | 可通过订单编号下拉筛选订单/产品 | 使用 `技术中心_改制订单_订单_查询` |
|
||||
| GZ-005 | 订单编号下拉 | 已完成 | 下拉 label 为订单编号,value 为订单流水号 | 使用 `订单信息_列表_查询数据_bak` |
|
||||
| GZ-006 | 右侧零件查询 | 已完成 | 点击左侧产品后显示对应零件 | 使用 `技术中心_改制订单_零件_查询` |
|
||||
| GZ-007 | 发起改制弹窗 | 已完成 | 可录入改制零件名称、图号、数量、精工期限 | 参考 BOM 更换物料风格调整 |
|
||||
| GZ-008 | 图号一致校验 | 已完成 | 原零件图号与改制零件图号相同时禁止提交 | 前端已加,后端建议保留 |
|
||||
| GZ-009 | 改制订单记录表 | 已完成 | 表包含原零件、改制零件、工艺计划流水号等字段 | 需以数据库实际结构为准 |
|
||||
| GZ-010 | 改制订单编号生成 | 已完成 | 编号符合 `BHGZ + 年月日 + 4位顺序号` | 已设计排序表 |
|
||||
| GZ-011 | 发起改制后端过程 | 进行中 | 能生成改制记录、工艺计划、回写工艺计划流水号 | 需持续按数据库实际过程校验 |
|
||||
| GZ-012 | 默认工艺 `改制` | 进行中 | 基础工艺不存在时自动新增,工序默认改制 | 已提供 SQL 方案 |
|
||||
| GZ-013 | 工艺计划流水号回写 | 已完成 | 改制记录可通过工艺计划流水号关联生产任务 | 测试显示 7 条已回写 |
|
||||
| GZ-014 | 生产任务视图显示改制信息 | 已完成 | 改制任务订单号、零件名称、图号优先取改制记录 | 已修改视图并验证 |
|
||||
| GZ-015 | 生产任务查询动态 SQL 修复 | 待执行验证 | 图号筛选不再报 4104,排序正常 | 需应用完整 SQL |
|
||||
| GZ-016 | MES 待加工显示改制单号 | 待联调 | MES 端改制任务订单号显示 BHGZ 编号 | 已给 SQL 方案 |
|
||||
| GZ-017 | 车间派工显示改制单号 | 待联调 | 派工页订单号、零件名称、图号显示改制信息 | 依赖视图或查询调整 |
|
||||
| GZ-018 | 改制记录查询页面 | 待开发 | 可按改制订单号、原订单、零件图号查询记录 | 后续新增 |
|
||||
| GZ-019 | 历史记录回写处理 | 待确认 | 未回写工艺计划流水号的历史记录明确处理方式 | 当前有 3 条未回写 |
|
||||
| GZ-020 | 完整业务流验收 | 待验收 | 使用测试订单完成发起、生产任务、派工、MES、入库验证 | 需业务允许测试数据 |
|
||||
| GZ-021 | 改制任务入库链路验证 | 部分通过 | 完成生产后能进入自制件入库查询,且库存入到正确改制物料 | 当前仅验证可进入入库查询,库存物料流水号仍有风险 |
|
||||
| GZ-022 | 改制物料流水号支持 | 已完成 | 改制记录保存目标物料流水号,入库使用改制目标物料 | 已加字段、改发起过程、改生产任务视图;历史数据未匹配到新物料 |
|
||||
|
||||
## 状态说明
|
||||
|
||||
| 状态 | 含义 |
|
||||
| --- | --- |
|
||||
| 已完成 | 已实现并至少完成基础验证 |
|
||||
| 进行中 | 已有实现方案或部分实现,仍需数据库/页面联调确认 |
|
||||
| 待执行验证 | 已提供修改 SQL,但需要在数据库执行并验证 |
|
||||
| 待联调 | 依赖上下游页面或接口,需要真实流程验证 |
|
||||
| 待开发 | 尚未开始编码或建库 |
|
||||
| 待确认 | 需要业务或数据归属确认 |
|
||||
| 待验收 | 功能已基本闭环,需要按验收场景跑通 |
|
||||
|
||||
## 后续推进优先级
|
||||
|
||||
1. `GZ-015`:先修复生产任务查询动态 SQL。
|
||||
2. `GZ-020`:选择测试订单跑完整流程。
|
||||
3. `GZ-016`、`GZ-017`:验证 MES 和车间派工显示。
|
||||
4. `GZ-019`:确认历史未回写记录是否需要补数据。
|
||||
5. 处理历史改制记录未维护改制物料流水号的问题。
|
||||
6. `GZ-018`:开发改制记录查询页面。
|
||||
316
docs/零件改制/05-验收证据.md
Normal file
@@ -0,0 +1,316 @@
|
||||
# 05-验收证据
|
||||
|
||||
## 1. 前端检查证据
|
||||
|
||||
组件文件:
|
||||
|
||||
```text
|
||||
D:\景耀\JY1.0\src\views\TechnologyCenter\PartModificationOrder\index.vue
|
||||
```
|
||||
|
||||
执行命令:
|
||||
|
||||
```bash
|
||||
npx eslint --ext .vue D:\景耀\JY1.0\src\views\TechnologyCenter\PartModificationOrder\index.vue
|
||||
```
|
||||
|
||||
结果:
|
||||
|
||||
```text
|
||||
通过
|
||||
```
|
||||
|
||||
备注:
|
||||
|
||||
- 命令输出中出现 npm 日志目录权限警告,不影响 eslint 检查结果。
|
||||
|
||||
## 2. 设计文档证据
|
||||
|
||||
| 文件 | 说明 |
|
||||
| --- | --- |
|
||||
| `docs/零件改制/零件改制功能设计方案.md` | 设计方案 Markdown |
|
||||
| `docs/零件改制/零件改制功能设计方案.pdf` | 设计方案 PDF |
|
||||
| `docs/零件改制/零件改制流程图.svg` | 改制流程图 |
|
||||
| `docs/零件改制/零件改制功能开发说明.md` | 汇总版开发说明 |
|
||||
| `docs/零件改制/零件改制功能测试报告.md` | 测试报告 |
|
||||
|
||||
## 3. 数据库视图修改证据
|
||||
|
||||
已修改视图:
|
||||
|
||||
```text
|
||||
dbo.车间生产管理_零件工艺计划_视图
|
||||
```
|
||||
|
||||
关键显示逻辑:
|
||||
|
||||
```sql
|
||||
ISNULL(dbo.技术中心_改制订单记录.改制零件名称, dbo.库存管理_物料主文件_基本.名称) AS 零件名称
|
||||
ISNULL(dbo.技术中心_改制订单记录.改制零件图号, dbo.车间生产管理工艺_零件工艺计划.零件图号) AS 零件图号
|
||||
ISNULL(dbo.技术中心_改制订单记录.改制订单编号, dbo.合同管理_订单信息_基础表.订单编号) AS 订单号
|
||||
```
|
||||
|
||||
关键关联逻辑:
|
||||
|
||||
```sql
|
||||
LEFT JOIN dbo.技术中心_改制订单记录
|
||||
ON dbo.车间生产管理工艺_零件工艺计划.工艺计划流水号 = dbo.技术中心_改制订单记录.工艺计划流水号
|
||||
AND ISNULL(dbo.技术中心_改制订单记录.是否删除, 0) = 0
|
||||
```
|
||||
|
||||
## 4. 数据库验证证据
|
||||
|
||||
执行 SQL:
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
(SELECT COUNT(*) FROM dbo.技术中心_改制订单记录 WHERE ISNULL(是否删除,0)=0) AS 改制记录数,
|
||||
(SELECT COUNT(*) FROM dbo.技术中心_改制订单记录 WHERE ISNULL(是否删除,0)=0 AND 工艺计划流水号 IS NOT NULL) AS 已回写工艺计划数,
|
||||
(SELECT COUNT(*) FROM dbo.技术中心_改制订单记录 GZ INNER JOIN dbo.车间生产管理_零件工艺计划_视图 V ON GZ.工艺计划流水号 = V.工艺计划流水号 WHERE ISNULL(GZ.是否删除,0)=0) AS 视图可关联数,
|
||||
(SELECT COUNT(*) FROM dbo.技术中心_改制订单记录 GZ INNER JOIN dbo.车间生产管理_零件工艺计划_视图 V ON GZ.工艺计划流水号 = V.工艺计划流水号 WHERE ISNULL(GZ.是否删除,0)=0 AND (ISNULL(V.订单号,'') <> ISNULL(GZ.改制订单编号,'') OR ISNULL(V.零件名称,'') <> ISNULL(GZ.改制零件名称,'') OR ISNULL(V.零件图号,'') <> ISNULL(GZ.改制零件图号,''))) AS 显示不一致数,
|
||||
(SELECT COUNT(*) FROM (SELECT 工艺计划流水号 FROM dbo.技术中心_改制订单记录 WHERE ISNULL(是否删除,0)=0 AND 工艺计划流水号 IS NOT NULL GROUP BY 工艺计划流水号 HAVING COUNT(*) > 1) T) AS 工艺计划重复关联数;
|
||||
```
|
||||
|
||||
结果:
|
||||
|
||||
| 改制记录数 | 已回写工艺计划数 | 视图可关联数 | 显示不一致数 | 工艺计划重复关联数 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 10 | 7 | 7 | 0 | 0 |
|
||||
|
||||
结论:
|
||||
|
||||
- 已回写工艺计划流水号的改制记录均可关联生产任务视图。
|
||||
- 订单号、零件名称、零件图号显示一致。
|
||||
- 未发现重复关联。
|
||||
|
||||
## 5. 抽样验证证据
|
||||
|
||||
执行 SQL:
|
||||
|
||||
```sql
|
||||
SELECT TOP 5
|
||||
V.工艺计划流水号,
|
||||
V.订单号,
|
||||
V.零件名称,
|
||||
V.零件图号,
|
||||
GZ.改制订单编号,
|
||||
GZ.改制零件名称,
|
||||
GZ.改制零件图号
|
||||
FROM dbo.车间生产管理_零件工艺计划_视图 V
|
||||
INNER JOIN dbo.技术中心_改制订单记录 GZ
|
||||
ON V.工艺计划流水号 = GZ.工艺计划流水号
|
||||
WHERE ISNULL(GZ.是否删除,0)=0
|
||||
ORDER BY GZ.改制订单流水号 DESC;
|
||||
```
|
||||
|
||||
抽样结果:
|
||||
|
||||
| 工艺计划流水号 | 订单号 | 零件名称 | 零件图号 | 改制订单编号 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 6590 | BHGZ-202606270010 | 从动同步带轮(8M50T50W-45) | XT40-2-BT40-14.09-G | BHGZ-202606270010 |
|
||||
| 6589 | BHGZ-202606260009 | 防水挡盖 | XT20-02-G | BHGZ-202606260009 |
|
||||
| 6588 | BHGZ-202606250008 | 止刀键 | XT30-2-01-G | BHGZ-202606250008 |
|
||||
| 6587 | BHGZ202606250007 | 箱体前盖 | XT30-1-MB-01-G | BHGZ202606250007 |
|
||||
| 6586 | BHGZ202606250006 | 箱体 | XT30-2-MF-02-G | BHGZ202606250006 |
|
||||
|
||||
## 6. 错误与修复证据
|
||||
|
||||
错误:
|
||||
|
||||
```text
|
||||
消息 4104,级别 16,状态 1
|
||||
无法绑定由多个部分组成的标识符 "车间生产管理_零件工艺计划_视图.零件图号"。
|
||||
```
|
||||
|
||||
原因:
|
||||
|
||||
```sql
|
||||
FROM 车间生产管理_零件工艺计划_视图 AS P
|
||||
```
|
||||
|
||||
主表已经使用别名 `P`,动态 SQL 条件中不能继续写原表名。
|
||||
|
||||
修复:
|
||||
|
||||
```sql
|
||||
AND P.零件图号 LIKE '%' + @图号 + '%'
|
||||
AND P.操作日期 >= @开始时间
|
||||
AND P.操作日期 <= @结束时间
|
||||
```
|
||||
|
||||
## 7. 待补充证据
|
||||
|
||||
| 证据 | 状态 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| 生产任务查询页面截图 | 待补充 | 需页面打开后截图 |
|
||||
| 车间派工页面截图 | 待补充 | 需选择改制任务后截图 |
|
||||
| MES 待加工页面截图 | 待补充 | 需现场终端或模拟终端截图 |
|
||||
| 真实发起改制 job_id/report_id | 暂无 | 当前未通过自动化任务创建真实业务数据 |
|
||||
| 完整流程测试报告 | 待补充 | 需业务允许测试数据后生成 |
|
||||
|
||||
## 8. 入库链路测试证据
|
||||
|
||||
测试报告:
|
||||
|
||||
```text
|
||||
docs/零件改制/零件改制入库链路测试报告.md
|
||||
```
|
||||
|
||||
测试方式:
|
||||
|
||||
- 使用事务临时将一条改制任务完成数量设置为批次数量。
|
||||
- 调用 `仓储管理_自制件入库_查询`。
|
||||
- 查询结束后立即 `ROLLBACK TRAN`,未保留业务数据改动。
|
||||
|
||||
测试结果:
|
||||
|
||||
| 工艺计划流水号 | 订单号 | 零件名称 | 零件图号 | 物料流水号 | 批次数量 | 完成数量 | 入库数量 | 本次入库 | 类型 |
|
||||
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
||||
| 6591 | BHGZ-202607010011 | 300封油板 | URS3042Z-07-01 | 741 | 1 | 1 | 0 | 1 | 自制件 |
|
||||
|
||||
结论:
|
||||
|
||||
- 改制任务完成生产后可以进入现有自制件入库查询。
|
||||
- 但当前库存入库仍使用原基本件物料流水号,存在入到原物料而非改制目标物料的风险。
|
||||
|
||||
后续验收要求:
|
||||
|
||||
- 增加并维护 `改制物料流水号` 后,再验证库存是否入到正确改制物料。
|
||||
|
||||
## 9. 改制物料流水号修改证据
|
||||
|
||||
### 9.1 已完成修改
|
||||
|
||||
新增字段:
|
||||
|
||||
```sql
|
||||
ALTER TABLE dbo.技术中心_改制订单记录
|
||||
ADD 改制物料流水号 int NULL;
|
||||
```
|
||||
|
||||
已修改过程:
|
||||
|
||||
```text
|
||||
dbo.技术中心_改制订单_发起改制
|
||||
```
|
||||
|
||||
发起改制时新增逻辑:
|
||||
|
||||
```sql
|
||||
SELECT TOP 1
|
||||
@改制物料流水号 = 物料流水号
|
||||
FROM dbo.库存管理_物料主文件_基本
|
||||
WHERE LTRIM(RTRIM(名称)) = LTRIM(RTRIM(@改制零件名称))
|
||||
AND LTRIM(RTRIM(代号)) = LTRIM(RTRIM(@改制零件图号))
|
||||
AND ISNULL(是否禁用, 0) = 0
|
||||
ORDER BY 物料流水号 DESC;
|
||||
|
||||
IF @改制物料流水号 IS NULL
|
||||
BEGIN
|
||||
SELECT '0' AS result, '未找到改制零件对应的新物料,请先维护物料信息' AS msg;
|
||||
RETURN;
|
||||
END;
|
||||
```
|
||||
|
||||
已修改视图:
|
||||
|
||||
```text
|
||||
dbo.车间生产管理_零件工艺计划_视图
|
||||
```
|
||||
|
||||
视图已关联:
|
||||
|
||||
```sql
|
||||
LEFT OUTER JOIN dbo.库存管理_物料主文件_基本 AS 改制物料
|
||||
ON dbo.技术中心_改制订单记录.改制物料流水号 = 改制物料.物料流水号
|
||||
```
|
||||
|
||||
并让以下字段优先使用改制物料:
|
||||
|
||||
```text
|
||||
零件名称
|
||||
零件图号
|
||||
物料流水号
|
||||
物料编码
|
||||
代号
|
||||
货位流水号
|
||||
单位
|
||||
```
|
||||
|
||||
### 9.2 结构验证
|
||||
|
||||
执行结果:
|
||||
|
||||
| 检查项 | 结果 |
|
||||
| --- | --- |
|
||||
| 改制物料字段存在 | 1 |
|
||||
| 发起过程已包含改制物料 | 1 |
|
||||
| 生产任务视图已关联改制物料 | 1 |
|
||||
| 发起过程会写入改制物料 | 1 |
|
||||
|
||||
### 9.2.1 前端验证
|
||||
|
||||
修改文件:
|
||||
|
||||
```text
|
||||
src/views/TechnologyCenter/PartModificationOrder/index.vue
|
||||
```
|
||||
|
||||
调整内容:
|
||||
|
||||
- 发起改制弹窗打开后,改制零件名称和改制零件图号不再默认填原零件信息。
|
||||
- 提交前要求填写已维护的新物料名称和图号。
|
||||
- 保留原零件图号和改制零件图号不能相同的校验。
|
||||
|
||||
执行命令:
|
||||
|
||||
```bash
|
||||
npx eslint --ext .vue D:\景耀\JY1.0\src\views\TechnologyCenter\PartModificationOrder\index.vue
|
||||
```
|
||||
|
||||
结果:
|
||||
|
||||
```text
|
||||
通过
|
||||
```
|
||||
|
||||
### 9.3 历史数据验证
|
||||
|
||||
执行结果:
|
||||
|
||||
| 未删除改制记录数 | 未维护改制物料数 | 已维护改制物料数 |
|
||||
| --- | --- | --- |
|
||||
| 11 | 11 | 0 |
|
||||
|
||||
结论:
|
||||
|
||||
- 当前历史改制记录没有回填到 `改制物料流水号`。
|
||||
- 原因是现有物料主文件中没有与历史改制记录的“改制零件名称 + 改制零件图号”完全匹配的可用物料。
|
||||
- 新流程已经阻止继续产生这类数据:后续发起改制时,如果没有先维护物料信息,会返回失败提示。
|
||||
|
||||
## 10. 改制发起页面零件列表替换显示验证
|
||||
|
||||
执行命令:
|
||||
|
||||
```powershell
|
||||
sqlcmd -S 192.168.1.27 -d ERPTOOL_JY_20250826Back -U sa -P ****** -b -W -s "|" -Q "EXEC dbo.技术中心_改制订单_零件_查询 @组件流水号=4283; EXEC dbo.技术中心_改制订单_零件_查询 @组件流水号=2652;"
|
||||
sqlcmd -S 192.168.1.27 -d ERPTOOL_JY_20250826Back -U sa -P ****** -b -f 65001 -i "sql\零件改制_发起改制_精确基本件.sql"
|
||||
sqlcmd -S 192.168.1.27 -d ERPTOOL_JY_20250826Back -U sa -P ****** -b -W -s "|" -Q "SELECT PARAMETER_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.PARAMETERS WHERE SPECIFIC_NAME=N'技术中心_改制订单_发起改制' ORDER BY ORDINAL_POSITION;"
|
||||
npx eslint "src/views/TechnologyCenter/PartModificationOrder/index.vue"
|
||||
```
|
||||
|
||||
验证结果:
|
||||
|
||||
| 验证项 | 结果 |
|
||||
| --- | --- |
|
||||
| 组件 4283 改制行 | `205伺服电机挂板 / XT40-205MF-01.02-G`,`是否改制=1` |
|
||||
| 组件 2652 同流水号历史行 | 保持 `打刀缸 / NPM35T63x13BL-TZ1179C`,`是否改制=0` |
|
||||
| 发起过程参数 | 已包含 `@原基本件流水号 int` |
|
||||
| 前端 lint | 通过 |
|
||||
|
||||
结论:
|
||||
|
||||
- `技术中心_改制订单_零件_查询` 已按订单、组件、基本件三条件关联改制记录,避免只按基本件流水号导致串件。
|
||||
- 发起弹窗保留 `原零件名称`、`原零件图号`,列表展示可按最新改制目标替换。
|
||||
|
||||
修改人:Ld 修改时间:2026-07-01 14:46:30;
|
||||
151
docs/零件改制/06-决策记录.md
Normal file
@@ -0,0 +1,151 @@
|
||||
# 06-决策记录
|
||||
|
||||
## DR-001:为什么要新增零件改制流程
|
||||
|
||||
现场存在零件改制业务,且现场计件、派工、完工入库、统计追溯都需要系统数据支撑。原线下记录无法满足过程管控和后续核算要求,因此需要将改制订单接入系统。
|
||||
|
||||
## DR-002:为什么改制订单由技术中心发起
|
||||
|
||||
改制通常涉及零件图号、技术要求、加工目标等技术信息。由技术中心发起可以保证改制来源和技术要求准确,再由精工车间承接生产。
|
||||
|
||||
## DR-003:为什么改制订单编号使用 `BHGZ`
|
||||
|
||||
改制订单需要与销售订单、补货订单、普通生产任务区分。使用 `BHGZ` 前缀可以让生产任务、派工、MES 加工端快速识别改制任务。
|
||||
|
||||
## DR-004:为什么改制记录必须保存原零件名称和原零件图号
|
||||
|
||||
如果只保存改制后的名称和图号,后续无法追溯“从哪个零件改成哪个零件”。因此记录表必须同时保存:
|
||||
|
||||
```text
|
||||
原零件名称
|
||||
原零件图号
|
||||
改制零件名称
|
||||
改制零件图号
|
||||
```
|
||||
|
||||
## DR-005:为什么前后端都要校验图号不能相同
|
||||
|
||||
前端校验用于提高操作体验,避免无效提交。后端校验用于保证数据安全,防止绕过前端调用接口导致无意义改制记录。
|
||||
|
||||
## DR-006:为什么要回写工艺计划流水号
|
||||
|
||||
早期临时方案按 `原基本件流水号` 关联改制记录,但同一个基本件可能多次改制,会导致生产任务重复显示。正式方案改为按 `工艺计划流水号` 关联,保证一条改制记录对应一条生产任务。
|
||||
|
||||
## DR-007:为什么生产任务视图直接显示改制信息
|
||||
|
||||
生产任务查询、车间派工、MES 待加工等多个功能都依赖 `车间生产管理_零件工艺计划_视图`。在视图层统一改为改制信息优先显示,可以减少多个页面重复改造。
|
||||
|
||||
决策:
|
||||
|
||||
```sql
|
||||
零件名称 = ISNULL(改制零件名称, 原零件名称)
|
||||
零件图号 = ISNULL(改制零件图号, 原零件图号)
|
||||
订单号 = ISNULL(改制订单编号, 原订单号)
|
||||
```
|
||||
|
||||
## DR-008:为什么默认工艺设置为 `改制`
|
||||
|
||||
改制任务通常需要快速进入派工和加工。如果每次都人工制定工艺,会增加车间操作成本。自动添加默认工艺 `改制` 后,任务可以直接进入派工流程。
|
||||
|
||||
## DR-009:为什么默认工序优先 UPDATE
|
||||
|
||||
部分工艺计划生成后可能已经存在一条默认空工序。如果直接 INSERT,可能导致多一条工序。最终采用:
|
||||
|
||||
```text
|
||||
有默认工序 -> UPDATE 为改制
|
||||
没有默认工序 -> INSERT 一条改制工序
|
||||
```
|
||||
|
||||
## DR-010:为什么动态 SQL 必须统一使用别名
|
||||
|
||||
`精工车间_生成任务_查询数据` 中主查询使用:
|
||||
|
||||
```sql
|
||||
FROM 车间生产管理_零件工艺计划_视图 AS P
|
||||
```
|
||||
|
||||
因此动态 WHERE 中必须使用 `P.字段名`。继续使用原表名会触发 SQL Server 4104 错误。
|
||||
|
||||
## DR-011:为什么不在当前阶段处理领料单
|
||||
|
||||
当前阶段目标是打通:
|
||||
|
||||
```text
|
||||
技术中心发起 -> 精工生产任务 -> 默认工艺 -> 派工/MES 显示
|
||||
```
|
||||
|
||||
非毛坯物料领料、仓库出库、派工限制会影响仓储流程和现场规则,需要作为后续阶段单独联调。
|
||||
|
||||
## DR-012:为什么保留历史设计方案和测试报告
|
||||
|
||||
本次拆分出的 `01-06` 文档用于后续推进和任务管理,原设计方案、开发说明、测试报告保留作为上下文证据,避免历史决策丢失。
|
||||
|
||||
## DR-013:为什么发起改制前必须先维护新物料
|
||||
|
||||
入库流程最终按 `物料流水号` 写入库存。如果只修改显示用的零件名称和图号,而不切换物料流水号,库存会入到原物料,造成库存台账错误。
|
||||
|
||||
因此最终规则调整为:
|
||||
|
||||
```text
|
||||
发起改制前,必须先在物料主文件维护改制后的新物料。
|
||||
发起改制时,系统使用改制零件名称 + 改制零件图号查询新物料流水号。
|
||||
查不到新物料时,禁止发起改制。
|
||||
```
|
||||
|
||||
对应查询条件:
|
||||
|
||||
```sql
|
||||
库存管理_物料主文件_基本.名称 = @改制零件名称
|
||||
库存管理_物料主文件_基本.代号 = @改制零件图号
|
||||
是否禁用 = 0
|
||||
```
|
||||
|
||||
## DR-014:为什么视图中的物料字段也要优先使用改制物料
|
||||
|
||||
现有入库查询、生产任务、派工和 MES 多处依赖 `车间生产管理_零件工艺计划_视图`。如果只在改制记录里保存改制物料流水号,但视图仍返回原物料流水号,入库仍会写错库存。
|
||||
|
||||
因此视图中以下字段统一优先取改制物料:
|
||||
|
||||
```text
|
||||
零件名称
|
||||
零件图号
|
||||
物料流水号
|
||||
物料编码
|
||||
代号
|
||||
货位流水号
|
||||
单位
|
||||
```
|
||||
|
||||
这样后续 `仓储管理_自制件入库_查询` 和 `仓储管理_自制件入库_循环执行` 不需要大改,就能按新物料入库。
|
||||
|
||||
## DR-015:为什么发起弹窗不再默认填入原零件名称和图号
|
||||
|
||||
如果弹窗默认把原零件名称、原零件图号带入改制目标,用户容易直接提交,虽然有“图号不能相同”的校验,但体验上仍然容易误解为可以在原零件基础上简单修改。
|
||||
|
||||
最终决定:
|
||||
|
||||
```text
|
||||
原零件信息只读展示。
|
||||
改制零件名称和改制零件图号默认置空。
|
||||
用户必须填写已经在物料信息中维护好的新物料名称和图号。
|
||||
后端根据名称 + 图号查找改制物料流水号。
|
||||
```
|
||||
|
||||
这样可以强化业务规则:改制目标必须先存在于物料主文件,后续入库才能入到正确物料。
|
||||
|
||||
## DR-016:为什么零件列表替换显示不直接修改原 BOM
|
||||
|
||||
发起改制后,技术中心页面需要让用户看到“这条零件已经改制到哪个目标”,但原 BOM 仍然是订单原始技术数据,直接修改原 BOM 会影响历史追溯和未改制流程。
|
||||
|
||||
最终决定:
|
||||
|
||||
```text
|
||||
不修改原 BOM。
|
||||
零件列表查询时按最新未删除改制记录覆盖显示零件名称和图号。
|
||||
接口额外返回原零件名称、原零件图号,弹窗继续用于原件校验。
|
||||
关联条件必须包含原订单流水号、原组件流水号、原基本件流水号,避免同流水号跨组件串件。
|
||||
```
|
||||
|
||||
这样既满足页面可见性,也保证改制记录、生产任务、入库物料各自有清晰依据。
|
||||
|
||||
修改人:Ld 修改时间:2026-07-01 14:46:30;
|
||||
32
docs/零件改制/README.md
Normal file
@@ -0,0 +1,32 @@
|
||||
# 零件改制功能文档索引
|
||||
|
||||
本目录用于维护“零件改制”功能的设计、开发、推进、验收和决策资料。后续继续开发时,优先从任务矩阵进入,避免重复开发和遗漏验收。
|
||||
|
||||
## 文档目录
|
||||
|
||||
| 序号 | 文档 | 用途 |
|
||||
| --- | --- | --- |
|
||||
| 01 | [01-项目功能内容.md](./01-项目功能内容.md) | 说明需求来源、业务场景、功能范围和流程边界 |
|
||||
| 02 | [02-项目程序开发详细步骤.md](./02-项目程序开发详细步骤.md) | 记录前端、后端、数据库、查询接口的开发步骤 |
|
||||
| 03 | [03-推进台账.md](./03-推进台账.md) | 记录每轮做了什么、改了哪些文件、验证了什么、下一步是什么 |
|
||||
| 04 | [04-任务矩阵.md](./04-任务矩阵.md) | 按任务编号维护状态和验收标准,作为后续推进入口 |
|
||||
| 05 | [05-验收证据.md](./05-验收证据.md) | 汇总命令、SQL、页面、PDF、报告等证据 |
|
||||
| 06 | [06-决策记录.md](./06-决策记录.md) | 记录关键技术和业务决策,减少后续重复争论 |
|
||||
|
||||
## 现有辅助文档
|
||||
|
||||
| 文档 | 说明 |
|
||||
| --- | --- |
|
||||
| [零件改制功能设计方案.md](./零件改制功能设计方案.md) | 原始功能设计方案 |
|
||||
| [零件改制功能设计方案.pdf](./零件改制功能设计方案.pdf) | 设计方案 PDF |
|
||||
| [零件改制流程图.svg](./零件改制流程图.svg) | 改制流程图 |
|
||||
| [零件改制功能开发说明.md](./零件改制功能开发说明.md) | 早期汇总版开发说明 |
|
||||
| [零件改制功能测试报告.md](./零件改制功能测试报告.md) | 早期测试报告 |
|
||||
|
||||
## 当前推进建议
|
||||
|
||||
1. 先查看 [04-任务矩阵.md](./04-任务矩阵.md),确认任务状态。
|
||||
2. 如继续开发,按未完成任务编号推进。
|
||||
3. 每完成一轮修改,同步更新 [03-推进台账.md](./03-推进台账.md)。
|
||||
4. 每次验证后,同步补充 [05-验收证据.md](./05-验收证据.md)。
|
||||
5. 如出现影响后续实现方式的选择,同步补充 [06-决策记录.md](./06-决策记录.md)。
|
||||
299
docs/零件改制/零件改制入库链路测试报告.md
Normal file
@@ -0,0 +1,299 @@
|
||||
# 零件改制入库链路测试报告
|
||||
|
||||
## 1. 测试目的
|
||||
|
||||
验证零件改制任务在完成生产后,是否能够进入现有“自制件入库”流程,并判断是否存在入库数据风险。
|
||||
|
||||
## 2. 测试方式
|
||||
|
||||
本次采用只读查询和事务内回滚模拟方式测试。
|
||||
|
||||
- 未保留任何业务数据改动。
|
||||
- 未真实新增库存。
|
||||
- 未真实执行入库提交。
|
||||
- 使用事务临时修改完成数量,调用现有自制件入库查询过程后立即回滚。
|
||||
|
||||
## 3. 涉及对象
|
||||
|
||||
### 3.1 前端页面
|
||||
|
||||
```text
|
||||
src/views/WarehouseManagement/PurchasePartsStorage/index.vue
|
||||
```
|
||||
|
||||
自制件入库页签使用接口:
|
||||
|
||||
```text
|
||||
仓储管理_自制件入库_查询
|
||||
仓储管理_自制件入库_循环执行
|
||||
物料入库_自制件入库_零件图号_查询数据
|
||||
```
|
||||
|
||||
### 3.2 数据库对象
|
||||
|
||||
```text
|
||||
技术中心_改制订单记录
|
||||
车间生产管理_零件工艺计划_视图
|
||||
车间生产管理工艺_零件工艺计划
|
||||
仓储管理_自制件入库_查询
|
||||
仓储管理_自制件入库_循环执行
|
||||
库存管理_物料与货位对照表
|
||||
库存管理_外购件累计库存
|
||||
库存管理_自制件_入库记录
|
||||
```
|
||||
|
||||
## 4. 当前改制任务状态检查
|
||||
|
||||
执行 SQL:
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
COUNT(*) AS 改制任务数,
|
||||
SUM(CASE WHEN ISNULL(V.完成数量,0) > ISNULL(V.入库数量,0) THEN 1 ELSE 0 END) AS 当前可入库数,
|
||||
SUM(CASE WHEN ISNULL(V.完成数量,0) >= ISNULL(V.批次数量,0) AND ISNULL(V.批次数量,0) > 0 THEN 1 ELSE 0 END) AS 已完成生产数,
|
||||
SUM(CASE WHEN V.工艺计划流水号 IS NULL THEN 1 ELSE 0 END) AS 未关联生产任务数
|
||||
FROM dbo.技术中心_改制订单记录 GZ
|
||||
LEFT JOIN dbo.车间生产管理_零件工艺计划_视图 V
|
||||
ON GZ.工艺计划流水号 = V.工艺计划流水号
|
||||
WHERE ISNULL(GZ.是否删除,0)=0;
|
||||
```
|
||||
|
||||
结果:
|
||||
|
||||
| 改制任务数 | 当前可入库数 | 已完成生产数 | 未关联生产任务数 |
|
||||
| --- | --- | --- | --- |
|
||||
| 11 | 0 | 0 | 3 |
|
||||
|
||||
结论:
|
||||
|
||||
- 当前没有已经完成生产并可入库的改制任务。
|
||||
- 有 3 条历史改制记录未关联到生产任务,原因是未回写 `工艺计划流水号`。
|
||||
|
||||
## 5. 入库查询模拟测试
|
||||
|
||||
### 5.1 测试 SQL
|
||||
|
||||
以下 SQL 在事务中临时将一条改制任务的 `完成数量` 设置为 `批次数量`,调用现有自制件入库查询后立即回滚。
|
||||
|
||||
```sql
|
||||
BEGIN TRAN;
|
||||
|
||||
DECLARE @工艺计划流水号 int;
|
||||
DECLARE @订单流水号 int;
|
||||
DECLARE @批次数量 int;
|
||||
DECLARE @图号 nvarchar(50);
|
||||
|
||||
SELECT TOP 1
|
||||
@工艺计划流水号 = V.工艺计划流水号,
|
||||
@订单流水号 = V.订单流水号,
|
||||
@批次数量 = V.批次数量,
|
||||
@图号 = V.零件图号
|
||||
FROM dbo.技术中心_改制订单记录 GZ
|
||||
INNER JOIN dbo.车间生产管理_零件工艺计划_视图 V
|
||||
ON GZ.工艺计划流水号 = V.工艺计划流水号
|
||||
WHERE ISNULL(GZ.是否删除,0)=0
|
||||
AND V.工艺计划流水号 IS NOT NULL
|
||||
ORDER BY GZ.改制订单流水号 DESC;
|
||||
|
||||
UPDATE dbo.车间生产管理工艺_零件工艺计划
|
||||
SET 完成数量 = @批次数量
|
||||
WHERE 工艺计划流水号 = @工艺计划流水号;
|
||||
|
||||
EXEC dbo.仓储管理_自制件入库_查询
|
||||
@排序名称 = 0,
|
||||
@排序方式 = 0,
|
||||
@订单号_check = 1,
|
||||
@订单号 = @订单流水号,
|
||||
@零件图号_check = 1,
|
||||
@零件图号 = @图号;
|
||||
|
||||
ROLLBACK TRAN;
|
||||
```
|
||||
|
||||
### 5.2 查询结果
|
||||
|
||||
| 工艺计划流水号 | 订单号 | 零件名称 | 零件图号 | 物料流水号 | 批次数量 | 完成数量 | 入库数量 | 本次入库 | 类型 |
|
||||
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
||||
| 6591 | BHGZ-202607010011 | 300封油板 | URS3042Z-07-01 | 741 | 1 | 1 | 0 | 1 | 自制件 |
|
||||
|
||||
结论:
|
||||
|
||||
- 改制任务在完成生产后,可以进入现有 `仓储管理_自制件入库_查询` 查询结果。
|
||||
- 页面层面具备被选择并执行自制件入库的条件。
|
||||
|
||||
## 6. 入库执行逻辑分析
|
||||
|
||||
现有自制件入库提交过程:
|
||||
|
||||
```text
|
||||
仓储管理_自制件入库_循环执行
|
||||
```
|
||||
|
||||
关键逻辑:
|
||||
|
||||
```sql
|
||||
INSERT INTO 库存管理_物料与货位对照表
|
||||
(
|
||||
物料流水号,
|
||||
货位流水号,
|
||||
货位存量,
|
||||
操作日期,
|
||||
工艺计划流水号
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
@物料流水号,
|
||||
@货位流水号,
|
||||
@实际到货数量,
|
||||
GETDATE(),
|
||||
@工艺计划流水号
|
||||
);
|
||||
|
||||
INSERT INTO 库存管理_自制件_入库记录
|
||||
(
|
||||
工艺计划流水号,
|
||||
实际到货数量,
|
||||
入库人员流水号,
|
||||
入库时间,
|
||||
货位流水号
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
@工艺计划流水号,
|
||||
@实际到货数量,
|
||||
@入库人员流水号,
|
||||
GETDATE(),
|
||||
@货位流水号
|
||||
);
|
||||
|
||||
UPDATE 车间生产管理工艺_零件工艺计划
|
||||
SET 入库数量 = ISNULL(入库数量,0) + @实际到货数量
|
||||
WHERE 工艺计划流水号 = @工艺计划流水号;
|
||||
```
|
||||
|
||||
该过程会:
|
||||
|
||||
- 增加货位库存。
|
||||
- 增加累计库存。
|
||||
- 写入自制件入库记录。
|
||||
- 回写工艺计划入库数量。
|
||||
- 入库数量达到生产数量减报废数量时,将工艺计划状态更新为入库完成。
|
||||
|
||||
## 7. 风险发现
|
||||
|
||||
### 7.1 入库可执行,但可能入到原物料流水号
|
||||
|
||||
当前改制任务查询结果中,虽然视图显示了改制后的零件名称和零件图号,但 `物料流水号` 仍来自原基本件关联的物料。
|
||||
|
||||
抽样结果:
|
||||
|
||||
| 改制订单编号 | 改制零件图号 | 工艺计划流水号 | 物料流水号 | 当前物料代号 | 结论 |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| BHGZ-202607010011 | URS3042Z-07-01 | 6591 | 741 | URS2267Z-04 | 不一致 |
|
||||
| BHGZ-202606270010 | XT40-2-BT40-14.09-G | 6590 | 1716 | XT40-MF-05.08 | 不一致 |
|
||||
| BHGZ-202606260009 | XT20-02-G | 6589 | 1251 | XT20-09 | 不一致 |
|
||||
|
||||
影响:
|
||||
|
||||
- 如果直接使用现有入库流程,库存可能增加到原基本件物料,而不是改制后的目标零件物料。
|
||||
- 页面显示看起来是改制零件,但库存台账实际使用的是原 `物料流水号`。
|
||||
|
||||
## 8. 测试结论
|
||||
|
||||
### 8.1 能否正常进入入库流程
|
||||
|
||||
可以。
|
||||
|
||||
完成生产后,只要满足:
|
||||
|
||||
```sql
|
||||
完成数量 > 入库数量
|
||||
```
|
||||
|
||||
改制任务可以被 `仓储管理_自制件入库_查询` 查出,并进入现有自制件入库页面。
|
||||
|
||||
### 8.2 能否直接认为入库完全正确
|
||||
|
||||
不能。
|
||||
|
||||
当前链路存在关键风险:
|
||||
|
||||
```text
|
||||
显示字段使用改制零件信息
|
||||
库存入库仍使用原物料流水号
|
||||
```
|
||||
|
||||
因此只能说“流程可进入入库”,但不能确认“库存入到正确改制物料”。
|
||||
|
||||
## 9. 修复方案执行情况
|
||||
|
||||
### 9.1 已执行方案
|
||||
|
||||
已在 `技术中心_改制订单记录` 中增加改制目标物料流水号:
|
||||
|
||||
```sql
|
||||
ALTER TABLE dbo.技术中心_改制订单记录
|
||||
ADD 改制物料流水号 int NULL;
|
||||
```
|
||||
|
||||
已修改 `技术中心_改制订单_发起改制`:
|
||||
|
||||
```sql
|
||||
SELECT TOP 1
|
||||
@改制物料流水号 = 物料流水号
|
||||
FROM dbo.库存管理_物料主文件_基本
|
||||
WHERE LTRIM(RTRIM(名称)) = LTRIM(RTRIM(@改制零件名称))
|
||||
AND LTRIM(RTRIM(代号)) = LTRIM(RTRIM(@改制零件图号))
|
||||
AND ISNULL(是否禁用, 0) = 0;
|
||||
```
|
||||
|
||||
查不到新物料时禁止发起:
|
||||
|
||||
```sql
|
||||
SELECT '0' AS result, '未找到改制零件对应的新物料,请先维护物料信息' AS msg;
|
||||
```
|
||||
|
||||
已修改 `车间生产管理_零件工艺计划_视图`,让以下字段优先使用改制物料:
|
||||
|
||||
```text
|
||||
物料流水号
|
||||
物料编码
|
||||
代号
|
||||
货位流水号
|
||||
货位名称
|
||||
单位
|
||||
```
|
||||
|
||||
同时保留改制订单编号、改制零件名称、改制零件图号的优先显示。
|
||||
|
||||
### 9.2 当前验证结果
|
||||
|
||||
结构验证:
|
||||
|
||||
| 检查项 | 结果 |
|
||||
| --- | --- |
|
||||
| 改制物料字段存在 | 1 |
|
||||
| 发起过程已包含改制物料 | 1 |
|
||||
| 生产任务视图已关联改制物料 | 1 |
|
||||
|
||||
历史数据:
|
||||
|
||||
| 未删除改制记录数 | 未维护改制物料数 | 已维护改制物料数 |
|
||||
| --- | --- | --- |
|
||||
| 11 | 11 | 0 |
|
||||
|
||||
说明:
|
||||
|
||||
- 历史改制记录没有匹配到新物料流水号。
|
||||
- 原因是物料主文件中没有与历史记录的“改制零件名称 + 改制零件图号”完全匹配的可用物料。
|
||||
- 新流程已阻止继续产生该问题。
|
||||
|
||||
## 10. 后续验收项
|
||||
|
||||
| 验收项 | 状态 | 标准 |
|
||||
| --- | --- | --- |
|
||||
| 改制任务完成后可进入自制件入库查询 | 通过 | 事务回滚模拟已验证 |
|
||||
| 改制任务入库后库存写入正确物料 | 待新数据验证 | 新流程已支持改制物料流水号,需用新发起改制订单验证 |
|
||||
| 入库后工艺计划入库数量增加 | 待真实流程验证 | 入库数量应增加 |
|
||||
| 入库完成后考核状态变为 4 | 待真实流程验证 | 完成数量全部入库后状态为入库 |
|
||||
| 入库记录显示改制订单编号 | 待联调 | 入库记录查询需关联改制记录 |
|
||||
301
docs/零件改制/零件改制功能开发说明.md
Normal file
@@ -0,0 +1,301 @@
|
||||
# 零件改制功能开发说明
|
||||
|
||||
## 01-功能内容
|
||||
|
||||
### 1.1 需求来源
|
||||
|
||||
因现场计件和生产过程追溯需要,将零件改制流程接入系统管理。该需求由罗总牵头,组织技术中心、精工车间、仓储等相关部门讨论后提出。
|
||||
|
||||
### 1.2 应用场景
|
||||
|
||||
- 技术中心根据现场或订单需求发起零件改制订单。
|
||||
- 改制订单进入精工车间生产流程。
|
||||
- 精工车间可在生产任务查询中查看改制任务。
|
||||
- 车间派工可查看改制任务并进行派工。
|
||||
- MES 加工端显示改制订单编号,现场按改制任务加工。
|
||||
- 改制过程形成记录,便于后续查询、统计、追溯。
|
||||
|
||||
### 1.3 功能范围
|
||||
|
||||
- 技术中心新增“零件改制订单发起”组件。
|
||||
- 左侧显示订单/产品,右侧显示所选产品下的零件。
|
||||
- 点击零件操作列“改制”按钮后弹窗发起改制。
|
||||
- 发起改制时要求改制零件图号不能与原零件图号相同。
|
||||
- 后端生成改制订单编号,规则为:`BHGZ + 年月日 + 4位顺序号`。
|
||||
- 后端写入 `技术中心_改制订单记录`。
|
||||
- 后端生成精工车间工艺计划任务。
|
||||
- 后端自动添加默认工艺 `改制`。
|
||||
- 改制记录表回写 `工艺计划流水号`,后续查询统一按该字段关联。
|
||||
- 生产任务、派工、MES 待加工显示改制订单编号。
|
||||
|
||||
## 02-程序开发步骤
|
||||
|
||||
### 2.1 前端组件
|
||||
|
||||
文件:
|
||||
|
||||
```text
|
||||
src/views/TechnologyCenter/PartModificationOrder/index.vue
|
||||
```
|
||||
|
||||
开发步骤:
|
||||
|
||||
1. 新建技术中心零件改制组件目录和 `index.vue`。
|
||||
2. 左侧订单下拉使用 `订单信息_列表_查询数据_bak` 获取订单列表。
|
||||
3. 左侧订单/产品查询使用 `技术中心_改制订单_订单_查询`。
|
||||
4. 点击左侧产品后,右侧零件列表使用 `技术中心_改制订单_零件_查询`。
|
||||
5. 右侧零件表格增加操作列,提供“查看图纸”和“改制”按钮。
|
||||
6. 参考 BOM 查询/维护组件“更换物料”交互调整改制弹窗。
|
||||
7. 发起改制提交前判断:
|
||||
|
||||
```js
|
||||
var oldDrawingNo = (this.form.原零件图号 || '').toString().trim()
|
||||
var newDrawingNo = (this.form.改制零件图号 || '').toString().trim()
|
||||
if (oldDrawingNo && newDrawingNo && oldDrawingNo === newDrawingNo) {
|
||||
this.$message.warning('改制零件图号不能与原零件图号相同')
|
||||
return
|
||||
}
|
||||
```
|
||||
|
||||
8. 提交接口使用 `技术中心_改制订单_发起改制`。
|
||||
|
||||
### 2.2 后端表结构
|
||||
|
||||
新增或维护表:
|
||||
|
||||
```sql
|
||||
技术中心_改制订单记录
|
||||
技术中心_改制订单排序
|
||||
```
|
||||
|
||||
`技术中心_改制订单记录` 需要包含关键字段:
|
||||
|
||||
```text
|
||||
改制订单流水号
|
||||
改制订单编号
|
||||
原订单流水号
|
||||
原组件流水号
|
||||
原基本件流水号
|
||||
原零件名称
|
||||
原零件图号
|
||||
改制零件名称
|
||||
改制零件图号
|
||||
改制数量
|
||||
精工期限
|
||||
工艺计划流水号
|
||||
状态
|
||||
发起人
|
||||
发起时间
|
||||
是否删除
|
||||
```
|
||||
|
||||
如字段不存在,执行:
|
||||
|
||||
```sql
|
||||
IF COL_LENGTH('dbo.技术中心_改制订单记录', '原零件名称') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE dbo.技术中心_改制订单记录
|
||||
ADD 原零件名称 nvarchar(50) NULL;
|
||||
END;
|
||||
|
||||
IF COL_LENGTH('dbo.技术中心_改制订单记录', '原零件图号') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE dbo.技术中心_改制订单记录
|
||||
ADD 原零件图号 nvarchar(50) NULL;
|
||||
END;
|
||||
|
||||
IF COL_LENGTH('dbo.技术中心_改制订单记录', '工艺计划流水号') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE dbo.技术中心_改制订单记录
|
||||
ADD 工艺计划流水号 int NULL;
|
||||
END;
|
||||
```
|
||||
|
||||
### 2.3 后端发起改制过程
|
||||
|
||||
存储过程:
|
||||
|
||||
```text
|
||||
技术中心_改制订单_发起改制
|
||||
```
|
||||
|
||||
处理步骤:
|
||||
|
||||
1. 校验原订单流水号、原组件流水号、改制零件名称、改制零件图号、改制数量。
|
||||
2. 后端再次校验原零件图号和改制零件图号不能相同。
|
||||
3. 生成改制订单编号。
|
||||
4. 插入 `技术中心_改制订单记录`。
|
||||
5. 插入 `车间生产管理工艺_零件工艺计划`。
|
||||
6. 回写 `技术中心_改制订单记录.工艺计划流水号`。
|
||||
7. 查询基础工艺表是否存在 `改制`。
|
||||
8. 不存在则插入 `车间生产管理工艺_基础表_工艺名称`。
|
||||
9. 更新或插入 `车间生产管理工艺_零件工序`,默认工艺为 `改制`。
|
||||
10. 调用或复用 `精工车间_工艺保存_派工`,将工艺计划推进到工艺完成状态。
|
||||
11. 更新原组件和原订单为精工车间承接。
|
||||
|
||||
### 2.4 查询接口调整
|
||||
|
||||
需要调整的查询:
|
||||
|
||||
```text
|
||||
精工车间生产任务查询
|
||||
MES_机加工MES_零件待加工显示
|
||||
车间派工相关查询
|
||||
```
|
||||
|
||||
关联方式统一改为:
|
||||
|
||||
```sql
|
||||
LEFT JOIN 技术中心_改制订单记录 AS GZ
|
||||
ON 主表.工艺计划流水号 = GZ.工艺计划流水号
|
||||
AND ISNULL(GZ.是否删除, 0) = 0
|
||||
```
|
||||
|
||||
订单号显示规则:
|
||||
|
||||
```sql
|
||||
ISNULL(GZ.改制订单编号, 原订单号) AS 订单号
|
||||
```
|
||||
|
||||
## 03-推进台账
|
||||
|
||||
| 轮次 | 工作内容 | 修改文件/程序 | 验证内容 | 下一步 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 1 | 梳理零件改制流程方案 | `零件改制功能设计方案.md` | 方案内容、流程承接关系、入库节点 | 生成 PDF 和流程图 |
|
||||
| 2 | 生成方案 PDF 和流程图 | `part-modification-plan.html`、`part-modification-plan.pdf` | PDF 文件生成、流程图位置调整 | 开发前端组件 |
|
||||
| 3 | 新建零件改制组件 | `src/views/TechnologyCenter/PartModificationOrder/index.vue` | 组件路径、动态路由加载不再报 ENOENT | 调整查询接口 |
|
||||
| 4 | 查询接口调整 | `PartModificationOrder/index.vue` | 订单查询、零件查询接口名调整 | 优化界面 |
|
||||
| 5 | 参考 BOM 更换物料功能调整界面 | `PartModificationOrder/index.vue` | 弹窗交互、物料选择样式、eslint | 后端过程设计 |
|
||||
| 6 | 设计发起改制后端过程 | `技术中心_改制订单_发起改制` | 生成改制记录、生成精工任务 | 增加改制订单编号规则 |
|
||||
| 7 | 改制订单编号规则 | `技术中心_改制订单排序`、发起过程 | `BHGZ + 年月日 + 4位顺序号` | 增加默认工艺 |
|
||||
| 8 | 增加默认工艺 `改制` | 发起过程、基础工艺表、零件工序表 | 自动添加默认工艺并推进到工艺完成 | 查询显示改制订单号 |
|
||||
| 9 | 查询关联改制记录 | 生产任务查询、MES 待加工显示 | 订单号优先显示改制订单编号 | 完善验收 |
|
||||
| 10 | 增加原零件信息字段 | `技术中心_改制订单记录`、发起过程 | 记录原零件名称、原零件图号 | 联调完整流程 |
|
||||
|
||||
## 04-任务矩阵
|
||||
|
||||
| 任务编号 | 任务名称 | 状态 | 验收标准 |
|
||||
| --- | --- | --- | --- |
|
||||
| GZ-001 | 编写零件改制功能方案 | 已完成 | 文档包含背景、场景、流程、表设计、接口设计 |
|
||||
| GZ-002 | 生成 PDF 和流程图 | 已完成 | PDF 存在,流程图位置正确,流程包含入库 |
|
||||
| GZ-003 | 新建技术中心改制组件 | 已完成 | 路由可加载 `PartModificationOrder/index.vue` |
|
||||
| GZ-004 | 左侧订单/产品查询 | 已完成 | 可通过订单编号下拉筛选并显示订单/产品 |
|
||||
| GZ-005 | 右侧零件查询 | 已完成 | 点击左侧产品后显示对应零件 |
|
||||
| GZ-006 | 发起改制弹窗 | 已完成 | 可录入改制零件名称、图号、数量、精工期限 |
|
||||
| GZ-007 | 图号一致校验 | 已完成 | 原零件图号与改制零件图号相同时禁止提交 |
|
||||
| GZ-008 | 改制订单记录表 | 待数据库执行 | 表包含原零件和改制零件信息 |
|
||||
| GZ-009 | 改制订单编号生成 | 待数据库执行 | 编号符合 `BHGZyyyyMMdd0001` 规则 |
|
||||
| GZ-010 | 发起改制后端过程 | 待数据库执行 | 成功写入记录并返回改制订单编号、工艺计划流水号 |
|
||||
| GZ-011 | 默认工艺 `改制` | 待数据库执行 | 基础工艺不存在时自动创建,工序默认改制 |
|
||||
| GZ-012 | 工艺计划流水号回写 | 待数据库执行 | 改制记录表能通过工艺计划流水号关联生产任务 |
|
||||
| GZ-013 | 生产任务查询显示改制单号 | 待联调 | 改制任务显示改制订单编号,非改制任务显示原订单号 |
|
||||
| GZ-014 | MES 待加工显示改制单号 | 待联调 | 加工端订单号优先显示改制订单编号 |
|
||||
| GZ-015 | 改制记录查询 | 待开发 | 可按改制订单编号、原订单、零件图号查询记录 |
|
||||
|
||||
## 05-验收证据
|
||||
|
||||
### 5.1 前端文件
|
||||
|
||||
```text
|
||||
D:\景耀\JY1.0\src\views\TechnologyCenter\PartModificationOrder\index.vue
|
||||
```
|
||||
|
||||
### 5.2 文档与 PDF
|
||||
|
||||
```text
|
||||
D:\景耀\JY1.0\零件改制功能设计方案.md
|
||||
D:\景耀\JY1.0\part-modification-plan.html
|
||||
D:\景耀\JY1.0\part-modification-plan.pdf
|
||||
```
|
||||
|
||||
### 5.3 已执行验证命令
|
||||
|
||||
```bash
|
||||
npx eslint --ext .vue D:\景耀\JY1.0\src\views\TechnologyCenter\PartModificationOrder\index.vue
|
||||
```
|
||||
|
||||
结果:已通过。
|
||||
|
||||
### 5.4 关键 SQL 验收点
|
||||
|
||||
发起改制成功后应能查到:
|
||||
|
||||
```sql
|
||||
SELECT *
|
||||
FROM 技术中心_改制订单记录
|
||||
WHERE 改制订单编号 LIKE 'BHGZ%';
|
||||
```
|
||||
|
||||
改制记录应回写工艺计划流水号:
|
||||
|
||||
```sql
|
||||
SELECT 改制订单编号, 原零件名称, 原零件图号, 改制零件名称, 改制零件图号, 工艺计划流水号
|
||||
FROM 技术中心_改制订单记录
|
||||
WHERE 工艺计划流水号 IS NOT NULL;
|
||||
```
|
||||
|
||||
默认工艺应生成:
|
||||
|
||||
```sql
|
||||
SELECT *
|
||||
FROM 车间生产管理工艺_基础表_工艺名称
|
||||
WHERE 工艺名称 = N'改制';
|
||||
```
|
||||
|
||||
默认工序应生成或被更新:
|
||||
|
||||
```sql
|
||||
SELECT *
|
||||
FROM 车间生产管理工艺_零件工序
|
||||
WHERE 工艺计划流水号 = @工艺计划流水号;
|
||||
```
|
||||
|
||||
### 5.5 页面验收点
|
||||
|
||||
- 技术中心零件改制页面可以正常打开。
|
||||
- 订单编号下拉可选择订单。
|
||||
- 左侧订单/产品数据去重显示。
|
||||
- 点击左侧产品后,右侧显示零件。
|
||||
- 点击“改制”打开弹窗。
|
||||
- 改制零件图号与原图号相同时,页面阻止提交。
|
||||
- 改制提交成功后返回成功提示。
|
||||
- 精工车间生产任务查询可看到改制任务。
|
||||
- MES 待加工显示中,改制任务订单号显示为 `BHGZ...`。
|
||||
|
||||
## 06-决策记录
|
||||
|
||||
### 6.1 为什么改制订单号使用独立编号
|
||||
|
||||
改制订单不是原销售订单,也不是普通生产订单。使用 `BHGZ + 年月日 + 4位顺序号` 可以明确区分补货改制任务,便于车间识别、计件统计和后续追溯。
|
||||
|
||||
### 6.2 为什么改制记录表要保存工艺计划流水号
|
||||
|
||||
早期临时方案按 `原基本件流水号` 关联改制记录,但同一个基本件可能多次改制,会导致生产任务或 MES 待加工数据重复显示。最终决定在发起改制时回写 `工艺计划流水号`,后续查询统一按 `工艺计划流水号` 关联,保证一对一。
|
||||
|
||||
### 6.3 为什么需要保存原零件名称和原零件图号
|
||||
|
||||
改制后零件名称和图号会变化,如果只保存改制后的信息,后续无法准确追溯改制来源。增加 `原零件名称`、`原零件图号` 后,改制记录可以完整展示“从哪个零件改成哪个零件”。
|
||||
|
||||
### 6.4 为什么前后端都校验图号不能相同
|
||||
|
||||
前端校验用于提升用户体验,避免无效提交。后端校验用于保证数据安全,防止绕过前端直接调用接口造成无意义改制记录。
|
||||
|
||||
### 6.5 为什么默认工艺设为 `改制`
|
||||
|
||||
改制任务进入精工车间后,需要可派工、可加工、可计件。如果每次都人工制定工艺,会增加现场操作成本。自动添加默认工艺 `改制` 后,改制任务可以快速进入派工和生产流程。
|
||||
|
||||
### 6.6 为什么不继续按基本件流水号关联改制记录
|
||||
|
||||
基本件流水号代表原零件来源,不代表某一次具体改制任务。改制任务真正进入车间后,对应的是新生成的 `工艺计划流水号`。因此正式查询必须按 `工艺计划流水号` 关联,避免重复数据和错误显示。
|
||||
|
||||
### 6.7 为什么生产任务和 MES 显示改制订单编号
|
||||
|
||||
现场需要识别当前任务是改制任务,并且计件、派工、加工、入库都需要统一单号。生产任务和 MES 端优先显示改制订单编号,可以减少现场沟通成本。
|
||||
|
||||
## 后续建议
|
||||
|
||||
1. 补充 `技术中心_改制订单_记录_查询` 接口。
|
||||
2. 建立改制记录查询页面。
|
||||
3. 对生产任务查询、车间派工、MES 待加工显示做完整联调。
|
||||
4. 补充改制任务取消、退料、异常处理规则。
|
||||
5. 如后续恢复“非毛坯物料改制需要领料”,再扩展领料单生成与仓库出库状态。
|
||||
187
docs/零件改制/零件改制功能测试报告.md
Normal file
@@ -0,0 +1,187 @@
|
||||
# 零件改制功能测试报告
|
||||
|
||||
## 1. 测试范围
|
||||
|
||||
本次测试针对零件改制功能近期修改内容进行验证,重点覆盖:
|
||||
|
||||
- 技术中心发起零件改制组件静态检查。
|
||||
- `车间生产管理_零件工艺计划_视图` 改制记录关联验证。
|
||||
- 改制订单编号、改制零件名称、改制零件图号在生产任务数据源中的显示验证。
|
||||
- `技术中心_改制订单记录.工艺计划流水号` 回写数据检查。
|
||||
- 改制记录与工艺计划一对一关联检查,避免重复显示。
|
||||
|
||||
本次测试未新建真实改制订单,避免污染业务数据。
|
||||
|
||||
## 2. 测试环境
|
||||
|
||||
| 项目 | 内容 |
|
||||
| --- | --- |
|
||||
| 前端项目 | `D:\景耀\JY1.0` |
|
||||
| 数据库 | `ERPTOOL_JY_20250826Back` |
|
||||
| SQL Server | 内网 SQL Server |
|
||||
| 测试日期 | 2026-06-27 |
|
||||
| 测试方式 | 前端静态检查 + 数据库只读查询验证 |
|
||||
|
||||
## 3. 测试项
|
||||
|
||||
### 3.1 前端组件静态检查
|
||||
|
||||
测试对象:
|
||||
|
||||
```text
|
||||
D:\景耀\JY1.0\src\views\TechnologyCenter\PartModificationOrder\index.vue
|
||||
```
|
||||
|
||||
执行命令:
|
||||
|
||||
```bash
|
||||
npx eslint --ext .vue D:\景耀\JY1.0\src\views\TechnologyCenter\PartModificationOrder\index.vue
|
||||
```
|
||||
|
||||
结果:
|
||||
|
||||
```text
|
||||
通过
|
||||
```
|
||||
|
||||
说明:
|
||||
|
||||
- 组件语法与 eslint 规则检查通过。
|
||||
- 命令输出中存在 npm 日志目录权限警告,不影响组件检查结果。
|
||||
|
||||
### 3.2 改制记录回写检查
|
||||
|
||||
执行 SQL:
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
(SELECT COUNT(*) FROM dbo.技术中心_改制订单记录 WHERE ISNULL(是否删除,0)=0) AS 改制记录数,
|
||||
(SELECT COUNT(*) FROM dbo.技术中心_改制订单记录 WHERE ISNULL(是否删除,0)=0 AND 工艺计划流水号 IS NOT NULL) AS 已回写工艺计划数,
|
||||
(SELECT COUNT(*) FROM dbo.技术中心_改制订单记录 GZ INNER JOIN dbo.车间生产管理_零件工艺计划_视图 V ON GZ.工艺计划流水号 = V.工艺计划流水号 WHERE ISNULL(GZ.是否删除,0)=0) AS 视图可关联数,
|
||||
(SELECT COUNT(*) FROM dbo.技术中心_改制订单记录 GZ INNER JOIN dbo.车间生产管理_零件工艺计划_视图 V ON GZ.工艺计划流水号 = V.工艺计划流水号 WHERE ISNULL(GZ.是否删除,0)=0 AND (ISNULL(V.订单号,'') <> ISNULL(GZ.改制订单编号,'') OR ISNULL(V.零件名称,'') <> ISNULL(GZ.改制零件名称,'') OR ISNULL(V.零件图号,'') <> ISNULL(GZ.改制零件图号,''))) AS 显示不一致数,
|
||||
(SELECT COUNT(*) FROM (SELECT 工艺计划流水号 FROM dbo.技术中心_改制订单记录 WHERE ISNULL(是否删除,0)=0 AND 工艺计划流水号 IS NOT NULL GROUP BY 工艺计划流水号 HAVING COUNT(*) > 1) T) AS 工艺计划重复关联数;
|
||||
```
|
||||
|
||||
结果:
|
||||
|
||||
| 改制记录数 | 已回写工艺计划数 | 视图可关联数 | 显示不一致数 | 工艺计划重复关联数 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 10 | 7 | 7 | 0 | 0 |
|
||||
|
||||
结论:
|
||||
|
||||
- 当前共有 10 条未删除改制记录。
|
||||
- 其中 7 条已回写 `工艺计划流水号`。
|
||||
- 已回写的 7 条均可通过 `车间生产管理_零件工艺计划_视图` 关联到生产任务。
|
||||
- 关联后的订单号、零件名称、零件图号与改制记录一致,不一致数量为 0。
|
||||
- 未发现同一 `工艺计划流水号` 对应多条未删除改制记录的情况。
|
||||
|
||||
### 3.3 改制任务显示字段抽样检查
|
||||
|
||||
执行 SQL:
|
||||
|
||||
```sql
|
||||
SELECT TOP 5
|
||||
V.工艺计划流水号,
|
||||
V.订单号,
|
||||
V.零件名称,
|
||||
V.零件图号,
|
||||
GZ.改制订单编号,
|
||||
GZ.改制零件名称,
|
||||
GZ.改制零件图号
|
||||
FROM dbo.车间生产管理_零件工艺计划_视图 V
|
||||
INNER JOIN dbo.技术中心_改制订单记录 GZ
|
||||
ON V.工艺计划流水号 = GZ.工艺计划流水号
|
||||
WHERE ISNULL(GZ.是否删除,0)=0
|
||||
ORDER BY GZ.改制订单流水号 DESC;
|
||||
```
|
||||
|
||||
抽样结果:
|
||||
|
||||
| 工艺计划流水号 | 订单号 | 零件名称 | 零件图号 | 改制订单编号 | 改制零件名称 | 改制零件图号 |
|
||||
| --- | --- | --- | --- | --- | --- | --- |
|
||||
| 6590 | BHGZ-202606270010 | 从动同步带轮(8M50T50W-45) | XT40-2-BT40-14.09-G | BHGZ-202606270010 | 从动同步带轮(8M50T50W-45) | XT40-2-BT40-14.09-G |
|
||||
| 6589 | BHGZ-202606260009 | 防水挡盖 | XT20-02-G | BHGZ-202606260009 | 防水挡盖 | XT20-02-G |
|
||||
| 6588 | BHGZ-202606250008 | 止刀键 | XT30-2-01-G | BHGZ-202606250008 | 止刀键 | XT30-2-01-G |
|
||||
| 6587 | BHGZ202606250007 | 箱体前盖 | XT30-1-MB-01-G | BHGZ202606250007 | 箱体前盖 | XT30-1-MB-01-G |
|
||||
| 6586 | BHGZ202606250006 | 箱体 | XT30-2-MF-02-G | BHGZ202606250006 | 箱体 | XT30-2-MF-02-G |
|
||||
|
||||
结论:
|
||||
|
||||
- `车间生产管理_零件工艺计划_视图.订单号` 已优先显示改制订单编号。
|
||||
- `车间生产管理_零件工艺计划_视图.零件名称` 已优先显示改制零件名称。
|
||||
- `车间生产管理_零件工艺计划_视图.零件图号` 已优先显示改制零件图号。
|
||||
|
||||
## 4. 已修改内容确认
|
||||
|
||||
### 4.1 视图修改
|
||||
|
||||
已修改:
|
||||
|
||||
```text
|
||||
dbo.车间生产管理_零件工艺计划_视图
|
||||
```
|
||||
|
||||
核心逻辑:
|
||||
|
||||
```sql
|
||||
ISNULL(dbo.技术中心_改制订单记录.改制零件名称, dbo.库存管理_物料主文件_基本.名称) AS 零件名称
|
||||
ISNULL(dbo.技术中心_改制订单记录.改制零件图号, dbo.车间生产管理工艺_零件工艺计划.零件图号) AS 零件图号
|
||||
ISNULL(dbo.技术中心_改制订单记录.改制订单编号, dbo.合同管理_订单信息_基础表.订单编号) AS 订单号
|
||||
```
|
||||
|
||||
关联逻辑:
|
||||
|
||||
```sql
|
||||
LEFT JOIN dbo.技术中心_改制订单记录
|
||||
ON dbo.车间生产管理工艺_零件工艺计划.工艺计划流水号 = dbo.技术中心_改制订单记录.工艺计划流水号
|
||||
AND ISNULL(dbo.技术中心_改制订单记录.是否删除, 0) = 0
|
||||
```
|
||||
|
||||
## 5. 测试结论
|
||||
|
||||
本轮测试通过。
|
||||
|
||||
已验证:
|
||||
|
||||
- 前端改制组件静态检查通过。
|
||||
- 改制记录已按 `工艺计划流水号` 与生产任务视图关联。
|
||||
- 已回写工艺计划流水号的改制记录,生产任务视图显示字段一致。
|
||||
- 未发现工艺计划重复关联改制记录导致重复显示的问题。
|
||||
- 生产任务数据源中的订单号、零件名称、零件图号已优先显示改制记录中的信息。
|
||||
|
||||
## 6. 风险与遗留项
|
||||
|
||||
### 6.1 仍有历史记录未回写工艺计划流水号
|
||||
|
||||
当前 10 条未删除改制记录中,有 7 条已回写 `工艺计划流水号`,仍有 3 条未回写。
|
||||
|
||||
影响:
|
||||
|
||||
- 未回写的历史改制记录无法通过新视图逻辑显示改制订单编号、改制零件名称、改制零件图号。
|
||||
|
||||
建议:
|
||||
|
||||
- 如这些历史记录仍需展示,需要补写 `工艺计划流水号`。
|
||||
- 新发起的改制订单必须在发起过程内立即回写 `工艺计划流水号`。
|
||||
|
||||
### 6.2 本次未执行真实新增改制订单
|
||||
|
||||
本次测试没有调用 `技术中心_改制订单_发起改制` 新增业务数据。
|
||||
|
||||
原因:
|
||||
|
||||
- 避免污染当前业务库。
|
||||
|
||||
建议:
|
||||
|
||||
- 如需完整流程验收,可指定一条测试订单和测试零件,在业务允许的情况下执行一次真实发起改制,再验证生产任务、派工、MES 待加工端显示。
|
||||
|
||||
## 7. 下一步建议
|
||||
|
||||
1. 确认 3 条未回写历史改制记录是否需要补数据。
|
||||
2. 使用一条测试订单执行完整发起改制流程。
|
||||
3. 验证生产任务查询页面显示。
|
||||
4. 验证车间派工页面显示。
|
||||
5. 验证 MES 待加工显示。
|
||||
6. 验证改制默认工艺 `改制` 是否可直接派工和加工。
|
||||
477
docs/零件改制/零件改制功能设计方案.html
Normal file
@@ -0,0 +1,477 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>零件改制功能设计方案</title>
|
||||
<style>
|
||||
@page { size: A4; margin: 18mm 16mm; }
|
||||
body {
|
||||
font-family: "Microsoft YaHei", "SimSun", Arial, sans-serif;
|
||||
color: #1f2933;
|
||||
font-size: 13px;
|
||||
line-height: 1.65;
|
||||
}
|
||||
h1 {
|
||||
font-size: 26px;
|
||||
text-align: center;
|
||||
margin: 0 0 24px;
|
||||
padding-bottom: 12px;
|
||||
border-bottom: 2px solid #2f80ed;
|
||||
}
|
||||
h2 {
|
||||
font-size: 19px;
|
||||
margin: 24px 0 10px;
|
||||
padding-left: 8px;
|
||||
border-left: 4px solid #2f80ed;
|
||||
page-break-after: avoid;
|
||||
}
|
||||
h3 {
|
||||
font-size: 16px;
|
||||
margin: 18px 0 8px;
|
||||
page-break-after: avoid;
|
||||
}
|
||||
p { margin: 7px 0; }
|
||||
ul { margin: 6px 0 10px 22px; padding: 0; }
|
||||
li { margin: 3px 0; }
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
margin: 10px 0 16px;
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
th, td {
|
||||
border: 1px solid #cbd5e1;
|
||||
padding: 6px 8px;
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
word-break: break-word;
|
||||
}
|
||||
th {
|
||||
background: #eef4ff;
|
||||
font-weight: 600;
|
||||
}
|
||||
code {
|
||||
font-family: Consolas, "Microsoft YaHei", monospace;
|
||||
background: #f3f4f6;
|
||||
padding: 1px 4px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
pre {
|
||||
background: #f8fafc;
|
||||
border: 1px solid #d8dee9;
|
||||
padding: 10px;
|
||||
overflow-wrap: break-word;
|
||||
white-space: pre-wrap;
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
figure {
|
||||
margin: 14px 0 20px;
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
figure img {
|
||||
display: block;
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
border: 1px solid #d8dee9;
|
||||
}
|
||||
figcaption {
|
||||
margin-top: 6px;
|
||||
color: #64748b;
|
||||
font-size: 12px;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>零件改制功能设计方案</h1>
|
||||
<h2>0. 需求背景</h2>
|
||||
<h3>0.1 需求提出</h3>
|
||||
<p>本需求由罗总牵头,组织技术中心、精工车间、仓储等相关部门讨论后提出。</p>
|
||||
<h3>0.2 提出原因</h3>
|
||||
<p>当前现场存在零件改制业务,但改制过程尚未完整纳入系统管理。由于现场计件、派工生产、完工入库和后续统计都需要明确的数据来源,原有线下记录或零散流转方式无法满足计件核算、过程追溯和部门协同要求。</p>
|
||||
<p>因此,需要在系统内补充零件改制订单流程,将改制订单从技术中心发起、精工车间派工生产到完工入库的全过程纳入系统管理。</p>
|
||||
<h3>0.3 应用场景</h3>
|
||||
<p>本功能主要应用于以下场景:</p>
|
||||
<ul><li>技术中心根据现场或订单需求发起零件改制订单。</li><li>精工车间根据改制订单制定工艺、派工生产。</li><li>改制订单涉及非毛坯物料时,由系统生成领料单并交由仓库出库。</li><li>改制加工完成后,按现有流程办理入库。</li><li>现场计件、生产统计、入库记录和后续追溯均以系统内改制订单数据为依据。</li></ul>
|
||||
<h2>1. 需求目标</h2>
|
||||
<p>基于项目现有精工车间生产流程,新增“零件改制”业务。</p>
|
||||
<p>本次方案调整为:</p>
|
||||
<ul><li>在技术中心新增组件发起改制订单。</li><li>改制订单生成后进入现有精工车间生产任务流程。</li><li>精工车间生产任务查询组件可以查看改制订单。</li><li>车间派工组件可以查看改制订单并继续派工。</li><li>新增改制记录查询,用于查看改制订单的发起、生产、派工、领料和完工状态。</li><li>领料时根据改制订单和物料来源判断是否生成领料单。</li></ul>
|
||||
<p>核心原则:</p>
|
||||
<ul><li>技术中心负责发起改制订单。</li><li>精工车间复用现有生产任务、工艺、派工、加工流程。</li><li>仓储只在需要额外领用非毛坯物料时介入。</li><li>改制记录独立查询,但状态关联现有生产任务状态。</li></ul>
|
||||
<h2>2. 现有流程承接关系</h2>
|
||||
<p>根据项目现有页面,改制订单应承接以下流程:</p>
|
||||
<table>
|
||||
<thead><tr><th>流程节点</th><th>现有承接页面</th><th>说明</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>技术发起</td><td>技术中心新增页面</td><td>发起改制订单,填写改制要求</td></tr>
|
||||
<tr><td>生成任务</td><td>精工车间生产任务查询</td><td>改制订单进入生产任务列表</td></tr>
|
||||
<tr><td>制定工艺</td><td>精工车间制定工艺</td><td>可复用或复制原工艺后调整</td></tr>
|
||||
<tr><td>车间派工</td><td>精工车间车间派工</td><td>工艺完成后派工</td></tr>
|
||||
<tr><td>领料判断</td><td>领料/仓储出库流程</td><td>根据物料类型决定是否生成领料单</td></tr>
|
||||
<tr><td>加工执行</td><td>精工车间现有加工流程</td><td>扫码、报工、质检等复用现有逻辑</td></tr>
|
||||
<tr><td>入库</td><td>仓储入库流程</td><td>改制完工后按现有流程办理入库</td></tr>
|
||||
<tr><td>记录查询</td><td>改制记录查询</td><td>查看改制全流程</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<figure><img src="零件改制流程图.svg" alt="零件改制业务流程图"><figcaption>零件改制业务流程图</figcaption></figure>
|
||||
<h2>3. 页面设计</h2>
|
||||
<h3>3.1 技术中心新增页面:改制订单发起</h3>
|
||||
<p>建议路径:</p>
|
||||
<pre><code>src/views/TechnologyCenter/PartModificationOrder/index.vue</code></pre>
|
||||
<p>页面名称:</p>
|
||||
<pre><code>改制订单发起</code></pre>
|
||||
<p>归属模块:</p>
|
||||
<pre><code>技术中心</code></pre>
|
||||
<p>主要功能:</p>
|
||||
<ul><li>查询需要改制的原订单、原零件或原自制件。</li><li>发起改制订单。</li><li>填写改制后零件信息、改制数量、改制原因、技术要求。</li><li>指定是否使用原件改制、毛坯改制或其他物料改制。</li><li>提交后生成改制订单,并进入精工车间生产任务查询。</li></ul>
|
||||
<h3>3.2 精工车间修改页面:生产任务查询</h3>
|
||||
<p>现有路径:</p>
|
||||
<pre><code>src/views/SeikoWorkshop/ProductionTaskQuery/index.vue</code></pre>
|
||||
<p>需要支持:</p>
|
||||
<ul><li>查询改制订单生成的生产任务。</li><li>增加任务类型筛选。</li><li>增加任务类型列。</li><li>改制任务显示 <code>改制</code> 标识。</li><li>改制任务继续使用现有 <code>工艺</code>、<code>派工</code> 按钮。</li></ul>
|
||||
<h3>3.3 精工车间修改页面:车间派工</h3>
|
||||
<p>现有路径:</p>
|
||||
<pre><code>src/views/SeikoWorkshop/WorkshopAssignment/index.vue</code></pre>
|
||||
<p>需要支持:</p>
|
||||
<ul><li>查询改制订单对应的待派工任务。</li><li>增加任务类型筛选。</li><li>增加任务类型列。</li><li>复用现有已派工查询、待派工工序查询、派工、取消派工逻辑。</li></ul>
|
||||
<h3>3.4 新增页面:改制记录查询</h3>
|
||||
<p>建议路径:</p>
|
||||
<pre><code>src/views/TechnologyCenter/PartModificationRecord/index.vue</code></pre>
|
||||
<p>也可以放在精工车间模块,建议最终按业务归属确认。</p>
|
||||
<p>页面名称:</p>
|
||||
<pre><code>改制记录查询</code></pre>
|
||||
<p>主要功能:</p>
|
||||
<ul><li>查询改制订单记录。</li><li>查看改制订单状态。</li><li>查看是否生成领料单。</li><li>查看仓库是否已出库。</li><li>查看精工生产任务、工艺、派工、完工状态。</li><li>支持跳转生产任务查询、车间派工、零件追溯。</li></ul>
|
||||
<h2>4. 改制订单类型</h2>
|
||||
<p>改制订单需要明确物料来源,建议增加字段:</p>
|
||||
<pre><code>改制来源类型</code></pre>
|
||||
<p>建议枚举:</p>
|
||||
<table>
|
||||
<thead><tr><th>改制来源类型</th><th>说明</th><th>是否生成领料单</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>原现自制订单</td><td>使用原现有自制订单零件进行改制</td><td>否</td></tr>
|
||||
<tr><td>毛坯改制</td><td>直接使用已有毛坯进行改制</td><td>否</td></tr>
|
||||
<tr><td>非毛坯物料改制</td><td>使用仓库其他物料、半成品或成品改制</td><td>是</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>说明:</p>
|
||||
<ul><li>“原现自制订单”指当前已经存在的自制订单或自制零件,改制时不需要额外从仓库领料。</li><li>“毛坯改制”指直接使用毛坯进行改制,不额外生成领料单。</li><li>“非毛坯物料改制”指改制需要领用库存中的非毛坯物料,需要生成领料单并由仓库出库。</li></ul>
|
||||
<h2>5. 领料规则</h2>
|
||||
<h3>5.1 领料判断条件</h3>
|
||||
<p>领料时增加判断:</p>
|
||||
<pre><code>如果是改制订单,并且使用的物料不是毛坯,则生成领料单,由仓库物料出库。
|
||||
如果是原现自制订单改制,或者直接使用毛坯改制,则不生成领料单。</code></pre>
|
||||
<p>规则可表达为:</p>
|
||||
<pre><code>是否生成领料单 =
|
||||
是否改制订单 === 1
|
||||
且 改制来源类型 === 非毛坯物料改制
|
||||
且 是否毛坯 !== 1</code></pre>
|
||||
<h3>5.2 生成领料单场景</h3>
|
||||
<p>以下场景需要生成领料单:</p>
|
||||
<ul><li>改制订单使用库存半成品。</li><li>改制订单使用库存成品。</li><li>改制订单使用其他非毛坯物料。</li><li>改制订单指定的物料需要仓库出库。</li></ul>
|
||||
<p>生成后流程:</p>
|
||||
<p>1. 技术中心发起改制订单。 2. 系统判断需要领料。 3. 生成领料单。 4. 仓库根据领料单出库。 5. 出库完成后,精工车间继续生产、工艺、派工。</p>
|
||||
<h3>5.3 不生成领料单场景</h3>
|
||||
<p>以下场景不生成领料单:</p>
|
||||
<ul><li>原现自制订单改制。</li><li>直接使用毛坯改制。</li><li>改制对象已经在精工车间现场,不需要仓库出库。</li></ul>
|
||||
<p>不生成领料单时:</p>
|
||||
<ul><li>改制订单直接进入精工生产任务。</li><li>生产任务查询可查看。</li><li>车间派工可查看并派工。</li></ul>
|
||||
<h3>5.4 领料状态字段</h3>
|
||||
<p>建议改制订单增加以下字段:</p>
|
||||
<table>
|
||||
<thead><tr><th>字段名</th><th>说明</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>是否需要领料</td><td>1 是,0 否</td></tr>
|
||||
<tr><td>是否已生成领料单</td><td>1 是,0 否</td></tr>
|
||||
<tr><td>领料单号</td><td>生成的领料单编号</td></tr>
|
||||
<tr><td>领料状态</td><td>未生成、待出库、已出库、已取消</td></tr>
|
||||
<tr><td>出库日期</td><td>仓库出库日期</td></tr>
|
||||
<tr><td>出库人</td><td>仓库操作人</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2>6. 业务流程</h2>
|
||||
<h3>6.1 技术中心发起改制订单</h3>
|
||||
<p>用户进入技术中心“改制订单发起”页面。</p>
|
||||
<p>查询原始数据:</p>
|
||||
<ul><li>订单编号</li><li>产品/部件名称</li><li>零件名称</li><li>图号</li><li>原自制订单</li><li>库存物料</li><li>毛坯物料</li></ul>
|
||||
<p>发起改制时填写:</p>
|
||||
<ul><li>改制订单号</li><li>原订单编号</li><li>原零件名称</li><li>原零件图号</li><li>改制零件名称</li><li>改制零件图号</li><li>改制数量</li><li>改制来源类型</li><li>是否毛坯</li><li>物料编号</li><li>物料名称</li><li>改制原因</li><li>改制要求</li><li>技术备注</li><li>精工期限</li></ul>
|
||||
<p>提交时校验:</p>
|
||||
<ul><li>改制数量必须大于 0。</li><li>改制来源类型不能为空。</li><li>改制原因不能为空。</li><li>改制要求不能为空。</li><li>精工期限不能为空。</li><li>如果来源类型为非毛坯物料改制,必须选择物料编号。</li></ul>
|
||||
<h3>6.2 后端生成改制订单</h3>
|
||||
<p>提交后,后端需要同时处理:</p>
|
||||
<ul><li>写入改制订单主记录。</li><li>根据改制来源类型判断是否生成领料单。</li><li>生成精工车间生产任务。</li><li>写入任务类型为 <code>改制</code>。</li><li>关联改制订单号和新工艺计划流水号。</li></ul>
|
||||
<h3>6.3 进入精工车间生产任务查询</h3>
|
||||
<p>改制订单生成后,应能在现有接口中查到:</p>
|
||||
<pre><code>精工车间_生成任务_查询数据</code></pre>
|
||||
<p>建议返回字段增加:</p>
|
||||
<ul><li>任务类型</li><li>是否改制</li><li>改制订单号</li><li>改制来源类型</li><li>是否需要领料</li><li>领料状态</li><li>改制原因</li><li>改制要求</li></ul>
|
||||
<p>生产任务查询页面显示:</p>
|
||||
<ul><li><code>任务类型 = 改制</code></li><li>若 <code>是否需要领料 = 1</code> 且 <code>领料状态 !== 已出库</code>,可显示领料状态提示。</li></ul>
|
||||
<p>是否允许工艺/派工,需要按业务决定:</p>
|
||||
<ul><li>如果非毛坯物料改制必须先出库,建议未出库前允许制定工艺,但不允许派工。</li><li>如果现场允许先派工后补出库,则只做提示,不阻断派工。</li></ul>
|
||||
<p>建议采用更稳妥规则:</p>
|
||||
<pre><code>需要领料且未出库:允许制定工艺,不允许派工。
|
||||
不需要领料:正常工艺、派工。
|
||||
需要领料且已出库:正常工艺、派工。</code></pre>
|
||||
<h3>6.4 制定工艺</h3>
|
||||
<p>改制订单在生产任务查询中点击 <code>工艺</code>,进入现有:</p>
|
||||
<pre><code>/SeikoWorkshop/DevelopProcess</code></pre>
|
||||
<p>工艺规则:</p>
|
||||
<ul><li>改制订单必须生成新的工艺计划流水号。</li><li>不覆盖原自制订单或原零件工艺。</li><li>可支持从原工艺复制后调整。</li><li>工艺保存后,任务状态进入 <code>工艺完成</code>。</li></ul>
|
||||
<h3>6.5 车间派工</h3>
|
||||
<p>工艺完成后进入现有车间派工页面:</p>
|
||||
<pre><code>src/views/SeikoWorkshop/WorkshopAssignment/index.vue</code></pre>
|
||||
<p>现有查询接口:</p>
|
||||
<pre><code>精工车间_车间派工_查询</code></pre>
|
||||
<p>改制订单派工前判断:</p>
|
||||
<ul><li>不需要领料:允许派工。</li><li>需要领料且已出库:允许派工。</li><li>需要领料但未出库:禁止派工,并提示“改制订单物料未出库,不能派工”。</li></ul>
|
||||
<p>派工明细继续复用现有接口:</p>
|
||||
<pre><code>车间生产管理工艺_零件工序_已派工查询
|
||||
车间生产管理工艺_零件工序_派工_工序查询
|
||||
车间生产管理工艺_零件工序_派工
|
||||
车间生产管理工艺_零件工序_取消派工</code></pre>
|
||||
<h3>6.6 仓库出库</h3>
|
||||
<p>当改制订单需要领料时,系统生成领料单。</p>
|
||||
<p>仓库根据领料单完成出库后,需要回写:</p>
|
||||
<ul><li>领料状态 = 已出库</li><li>出库日期</li><li>出库人</li><li>出库数量</li></ul>
|
||||
<p>出库完成后,精工车间派工限制解除。</p>
|
||||
<h3>6.7 加工和完工</h3>
|
||||
<p>改制订单派工后,继续走现有精工车间加工流程:</p>
|
||||
<ul><li>工序派工</li><li>扫码加工</li><li>完工报工</li><li>质检</li><li>零件追溯</li><li>工时统计</li></ul>
|
||||
<p>完工后改制记录状态同步为:</p>
|
||||
<pre><code>已完成</code></pre>
|
||||
<h2>7. 数据字段设计</h2>
|
||||
<h3>7.1 改制订单主记录字段</h3>
|
||||
<table>
|
||||
<thead><tr><th>字段名</th><th>说明</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>改制订单号</td><td>改制业务编号</td></tr>
|
||||
<tr><td>原订单编号</td><td>原订单编号</td></tr>
|
||||
<tr><td>原订单流水号</td><td>原订单流水号</td></tr>
|
||||
<tr><td>原组件流水号</td><td>原组件流水号</td></tr>
|
||||
<tr><td>原基本件流水号</td><td>原零件流水号</td></tr>
|
||||
<tr><td>原工艺计划流水号</td><td>原工艺计划流水号</td></tr>
|
||||
<tr><td>原零件名称</td><td>改制前零件名称</td></tr>
|
||||
<tr><td>原零件图号</td><td>改制前零件图号</td></tr>
|
||||
<tr><td>原数量</td><td>原数量</td></tr>
|
||||
<tr><td>改制零件名称</td><td>改制后零件名称</td></tr>
|
||||
<tr><td>改制零件图号</td><td>改制后零件图号</td></tr>
|
||||
<tr><td>改制数量</td><td>改制数量</td></tr>
|
||||
<tr><td>改制来源类型</td><td>原现自制订单、毛坯改制、非毛坯物料改制</td></tr>
|
||||
<tr><td>是否毛坯</td><td>1 是,0 否</td></tr>
|
||||
<tr><td>物料编号</td><td>使用物料编号</td></tr>
|
||||
<tr><td>物料名称</td><td>使用物料名称</td></tr>
|
||||
<tr><td>物料流水号</td><td>使用物料流水号</td></tr>
|
||||
<tr><td>是否需要领料</td><td>1 是,0 否</td></tr>
|
||||
<tr><td>是否已生成领料单</td><td>1 是,0 否</td></tr>
|
||||
<tr><td>领料单号</td><td>领料单编号</td></tr>
|
||||
<tr><td>领料状态</td><td>未生成、待出库、已出库、已取消</td></tr>
|
||||
<tr><td>改制原因</td><td>改制原因</td></tr>
|
||||
<tr><td>改制要求</td><td>改制要求</td></tr>
|
||||
<tr><td>技术备注</td><td>技术备注</td></tr>
|
||||
<tr><td>精工期限</td><td>精工完工期限</td></tr>
|
||||
<tr><td>新基本件流水号</td><td>改制任务生成的新零件流水号</td></tr>
|
||||
<tr><td>新工艺计划流水号</td><td>改制任务生成的新工艺计划流水号</td></tr>
|
||||
<tr><td>发起人</td><td>当前用户 ID</td></tr>
|
||||
<tr><td>发起日期</td><td>发起时间</td></tr>
|
||||
<tr><td>状态</td><td>改制订单状态</td></tr>
|
||||
<tr><td>是否启用</td><td>逻辑删除标识</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3>7.2 改制订单状态</h3>
|
||||
<table>
|
||||
<thead><tr><th>状态</th><th>说明</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>待领料</td><td>需要领料,领料单未出库</td></tr>
|
||||
<tr><td>待工艺</td><td>不需要领料或已出库,等待制定工艺</td></tr>
|
||||
<tr><td>工艺完成</td><td>工艺已保存,等待派工</td></tr>
|
||||
<tr><td>待派工</td><td>工艺完成且满足派工条件</td></tr>
|
||||
<tr><td>加工中</td><td>已派工或已开始加工</td></tr>
|
||||
<tr><td>已完成</td><td>改制任务完工</td></tr>
|
||||
<tr><td>已取消</td><td>改制订单取消</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>说明:</p>
|
||||
<ul><li>如果不需要领料,提交后可直接进入 <code>待工艺</code>。</li><li>如果需要领料,提交后进入 <code>待领料</code>。</li><li>仓库出库后从 <code>待领料</code> 转为 <code>待工艺</code> 或保持生产任务状态,由查询时关联显示。</li></ul>
|
||||
<h2>8. API 设计</h2>
|
||||
<p>项目请求继续使用:</p>
|
||||
<pre><code>this.CreateData(type, name, param, pageSize, pageCurrent)
|
||||
this.ExecDatabase(Data)</code></pre>
|
||||
<h3>8.1 技术中心查询可改制对象</h3>
|
||||
<pre><code>var Data = this.CreateData('11', '技术中心_改制订单_可改制对象_查询', param, this.pageSize, this.pageCurrent)</code></pre>
|
||||
<h3>8.2 技术中心发起改制订单</h3>
|
||||
<pre><code>var Data = this.CreateData('12', '技术中心_改制订单_发起改制', param)</code></pre>
|
||||
<p>参数建议:</p>
|
||||
<table>
|
||||
<thead><tr><th>参数名</th><th>说明</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>原订单流水号</td><td>原订单流水号</td></tr>
|
||||
<tr><td>原组件流水号</td><td>原组件流水号</td></tr>
|
||||
<tr><td>原基本件流水号</td><td>原基本件流水号</td></tr>
|
||||
<tr><td>原工艺计划流水号</td><td>原工艺计划流水号</td></tr>
|
||||
<tr><td>原订单编号</td><td>原订单编号</td></tr>
|
||||
<tr><td>原零件名称</td><td>原零件名称</td></tr>
|
||||
<tr><td>原零件图号</td><td>原零件图号</td></tr>
|
||||
<tr><td>改制零件名称</td><td>改制零件名称</td></tr>
|
||||
<tr><td>改制零件图号</td><td>改制零件图号</td></tr>
|
||||
<tr><td>改制数量</td><td>改制数量</td></tr>
|
||||
<tr><td>改制来源类型</td><td>原现自制订单、毛坯改制、非毛坯物料改制</td></tr>
|
||||
<tr><td>是否毛坯</td><td>是否毛坯</td></tr>
|
||||
<tr><td>物料流水号</td><td>使用物料流水号</td></tr>
|
||||
<tr><td>物料编号</td><td>物料编号</td></tr>
|
||||
<tr><td>物料名称</td><td>物料名称</td></tr>
|
||||
<tr><td>改制原因</td><td>改制原因</td></tr>
|
||||
<tr><td>改制要求</td><td>改制要求</td></tr>
|
||||
<tr><td>技术备注</td><td>技术备注</td></tr>
|
||||
<tr><td>精工期限</td><td>精工期限</td></tr>
|
||||
<tr><td>发起人</td><td>当前用户 ID</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>后端处理结果:</p>
|
||||
<ul><li>生成改制订单。</li><li>判断是否生成领料单。</li><li>生成精工生产任务。</li><li>返回 <code>result</code>、<code>改制订单号</code>、<code>领料单号</code>、<code>是否需要领料</code>。</li></ul>
|
||||
<h3>8.3 改制记录查询</h3>
|
||||
<pre><code>var Data = this.CreateData('11', '技术中心_改制订单_记录_查询', param, this.pageSize, this.pageCurrent)</code></pre>
|
||||
<h3>8.4 改制订单详情</h3>
|
||||
<pre><code>var Data = this.CreateData('11', '技术中心_改制订单_详情_查询', param)</code></pre>
|
||||
<h3>8.5 取消改制订单</h3>
|
||||
<pre><code>var Data = this.CreateData('12', '技术中心_改制订单_取消', param)</code></pre>
|
||||
<p>取消前后端需要校验:</p>
|
||||
<ul><li>未派工可以取消。</li><li>已派工未加工,需要先取消派工。</li><li>已加工、已有质检记录或已完成,不允许取消。</li><li>已生成领料单且已出库,不允许直接取消,需要走退料或异常处理。</li></ul>
|
||||
<h2>9. 现有接口扩展</h2>
|
||||
<h3>9.1 生产任务查询接口</h3>
|
||||
<p>现有接口:</p>
|
||||
<pre><code>精工车间_生成任务_查询数据</code></pre>
|
||||
<p>新增查询参数:</p>
|
||||
<table>
|
||||
<thead><tr><th>参数名</th><th>说明</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>任务类型\_check</td><td>是否按任务类型过滤</td></tr>
|
||||
<tr><td>任务类型</td><td>全部、正常、改制、报废补投</td></tr>
|
||||
<tr><td>领料状态\_check</td><td>是否按领料状态过滤</td></tr>
|
||||
<tr><td>领料状态</td><td>待出库、已出库、不需要领料</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>新增返回字段:</p>
|
||||
<table>
|
||||
<thead><tr><th>字段名</th><th>说明</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>任务类型</td><td>正常、改制、报废补投</td></tr>
|
||||
<tr><td>是否改制</td><td>1 是,0 否</td></tr>
|
||||
<tr><td>改制订单号</td><td>改制订单编号</td></tr>
|
||||
<tr><td>改制来源类型</td><td>原现自制订单、毛坯改制、非毛坯物料改制</td></tr>
|
||||
<tr><td>是否需要领料</td><td>1 是,0 否</td></tr>
|
||||
<tr><td>领料状态</td><td>未生成、待出库、已出库、已取消</td></tr>
|
||||
<tr><td>领料单号</td><td>领料单号</td></tr>
|
||||
<tr><td>改制原因</td><td>改制原因</td></tr>
|
||||
<tr><td>改制要求</td><td>改制要求</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3>9.2 车间派工查询接口</h3>
|
||||
<p>现有接口:</p>
|
||||
<pre><code>精工车间_车间派工_查询</code></pre>
|
||||
<p>新增查询参数:</p>
|
||||
<table>
|
||||
<thead><tr><th>参数名</th><th>说明</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>任务类型\_check</td><td>是否按任务类型过滤</td></tr>
|
||||
<tr><td>任务类型</td><td>全部、正常、改制、报废补投</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>新增返回字段:</p>
|
||||
<table>
|
||||
<thead><tr><th>字段名</th><th>说明</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>任务类型</td><td>正常、改制、报废补投</td></tr>
|
||||
<tr><td>是否改制</td><td>1 是,0 否</td></tr>
|
||||
<tr><td>改制订单号</td><td>改制订单编号</td></tr>
|
||||
<tr><td>改制来源类型</td><td>改制来源类型</td></tr>
|
||||
<tr><td>是否需要领料</td><td>1 是,0 否</td></tr>
|
||||
<tr><td>领料状态</td><td>领料状态</td></tr>
|
||||
<tr><td>领料单号</td><td>领料单号</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>派工前端限制:</p>
|
||||
<pre><code>如果 是否改制 = 1 且 是否需要领料 = 1 且 领料状态 != 已出库,则不允许派工。</code></pre>
|
||||
<h2>10. 前端交互调整</h2>
|
||||
<h3>10.1 技术中心改制订单发起页面</h3>
|
||||
<p>查询条件:</p>
|
||||
<ul><li>订单编号</li><li>零件名称</li><li>图号</li><li>物料编号</li><li>物料名称</li><li>改制来源类型</li></ul>
|
||||
<p>表格列:</p>
|
||||
<ul><li>订单编号</li><li>产品/部件名称</li><li>零件名称</li><li>零件图号</li><li>数量</li><li>当前状态</li><li>来源类型</li><li>物料编号</li><li>物料名称</li><li>操作</li></ul>
|
||||
<p>操作:</p>
|
||||
<ul><li>发起改制</li><li>图纸</li><li>PLM传入工艺</li><li>追溯</li></ul>
|
||||
<p>发起改制弹窗:</p>
|
||||
<ul><li>原订单编号</li><li>原零件名称</li><li>原零件图号</li><li>改制零件名称</li><li>改制零件图号</li><li>改制数量</li><li>改制来源类型</li><li>是否毛坯</li><li>物料编号</li><li>物料名称</li><li>改制原因</li><li>改制要求</li><li>技术备注</li><li>精工期限</li></ul>
|
||||
<h3>10.2 生产任务查询页面</h3>
|
||||
<p>新增筛选:</p>
|
||||
<pre><code>任务类型:全部 / 正常 / 改制 / 报废补投
|
||||
领料状态:全部 / 不需要领料 / 待出库 / 已出库</code></pre>
|
||||
<p>新增列:</p>
|
||||
<ul><li>任务类型</li><li>改制订单号</li><li>改制来源类型</li><li>领料状态</li></ul>
|
||||
<p>显示建议:</p>
|
||||
<pre><code><el-tag type="warning" size="mini">改制</el-tag>
|
||||
<el-tag type="danger" size="mini">待出库</el-tag>
|
||||
<el-tag type="success" size="mini">已出库</el-tag>
|
||||
<el-tag type="info" size="mini">不需要领料</el-tag></code></pre>
|
||||
<h3>10.3 车间派工页面</h3>
|
||||
<p>新增筛选:</p>
|
||||
<pre><code>任务类型:全部 / 正常 / 改制 / 报废补投</code></pre>
|
||||
<p>新增列:</p>
|
||||
<ul><li>任务类型</li><li>改制订单号</li><li>领料状态</li></ul>
|
||||
<p>派工按钮或派工操作前增加判断:</p>
|
||||
<pre><code>if (Number(row.是否改制) === 1 && Number(row.是否需要领料) === 1 && row.领料状态 !== '已出库') {
|
||||
this.$message.warning('改制订单物料未出库,不能派工')
|
||||
return
|
||||
}</code></pre>
|
||||
<h3>10.4 改制记录查询页面</h3>
|
||||
<p>查询条件:</p>
|
||||
<ul><li>改制订单号</li><li>原订单编号</li><li>零件名称或图号</li><li>改制来源类型</li><li>领料状态</li><li>改制状态</li><li>发起日期</li><li>发起人</li></ul>
|
||||
<p>表格列:</p>
|
||||
<ul><li>改制订单号</li><li>状态</li><li>原订单编号</li><li>原零件名称</li><li>原零件图号</li><li>改制零件名称</li><li>改制零件图号</li><li>改制数量</li><li>改制来源类型</li><li>是否需要领料</li><li>领料单号</li><li>领料状态</li><li>改制原因</li><li>发起人</li><li>发起日期</li><li>精工期限</li><li>完成日期</li><li>操作</li></ul>
|
||||
<p>操作:</p>
|
||||
<ul><li>详情</li><li>生产任务</li><li>派工</li><li>追溯</li><li>取消</li></ul>
|
||||
<h2>11. 菜单配置</h2>
|
||||
<p>建议后端菜单配置:</p>
|
||||
<pre><code>技术中心
|
||||
改制订单发起
|
||||
改制记录查询</code></pre>
|
||||
<p>组件路径:</p>
|
||||
<pre><code>TechnologyCenter/PartModificationOrder/index
|
||||
TechnologyCenter/PartModificationRecord/index</code></pre>
|
||||
<p>精工车间不新增发起入口,只扩展现有页面:</p>
|
||||
<pre><code>SeikoWorkshop/ProductionTaskQuery/index
|
||||
SeikoWorkshop/WorkshopAssignment/index</code></pre>
|
||||
<h2>12. 实施顺序</h2>
|
||||
<p>建议按以下顺序实施:</p>
|
||||
<p>1. 后端新增改制订单主记录表。 2. 后端新增技术中心发起改制订单接口。 3. 后端在发起接口中加入领料判断规则。 4. 后端按规则生成或不生成领料单。 5. 后端生成标准精工生产任务,并标记 <code>任务类型 = 改制</code>。 6. 扩展生产任务查询接口,返回改制和领料字段。 7. 扩展车间派工查询接口,返回改制和领料字段。 8. 前端新增技术中心改制订单发起页面。 9. 前端新增改制记录查询页面。 10. 前端修改生产任务查询页面,增加任务类型和领料状态显示。 11. 前端修改车间派工页面,增加改制任务显示和派工前领料状态校验。 12. 联调从技术中心发起、领料判断、仓库出库、精工工艺、车间派工、加工完工、记录查询的完整流程。</p>
|
||||
<h2>13. 风险点</h2>
|
||||
<h3>13.1 领料判断风险</h3>
|
||||
<p>改制订单是否生成领料单,必须以后端判断为准。</p>
|
||||
<p>前端可以显示和提示,但不能只依赖前端判断,避免绕过仓库出库流程。</p>
|
||||
<h3>13.2 派工前物料状态风险</h3>
|
||||
<p>如果改制订单需要仓库出库,但尚未出库,直接派工会导致车间无物料加工。</p>
|
||||
<p>建议车间派工接口或派工保存接口再次校验:</p>
|
||||
<pre><code>需要领料且未出库,不允许派工。</code></pre>
|
||||
<h3>13.3 原任务数据覆盖风险</h3>
|
||||
<p>改制订单必须生成新的生产任务和新的工艺计划流水号。</p>
|
||||
<p>不能直接覆盖原自制订单或原零件工艺,否则会影响原订单追溯、工时和质量记录。</p>
|
||||
<h3>13.4 取消改制风险</h3>
|
||||
<p>已生成领料单、已出库、已派工或已加工的改制订单取消规则需要严格控制。</p>
|
||||
<p>建议:</p>
|
||||
<ul><li>未出库、未派工:允许取消。</li><li>已出库:需要退料后取消。</li><li>已派工未加工:先取消派工再取消。</li><li>已加工:不允许取消,只能走异常处理。</li></ul>
|
||||
<h3>13.5 统计口径风险</h3>
|
||||
<p>改制订单进入精工生产任务后,会影响生产任务数量、工时统计、完工统计。</p>
|
||||
<p>建议所有统计接口增加任务类型维度:</p>
|
||||
<pre><code>正常
|
||||
改制
|
||||
报废补投</code></pre>
|
||||
<h2>14. 总结</h2>
|
||||
<p>本方案采用:</p>
|
||||
<pre><code>技术中心发起改制订单,精工车间承接生产,仓库按需出库,改制记录统一查询。</code></pre>
|
||||
<p>关键规则:</p>
|
||||
<ul><li>技术中心新增组件发起改制订单。</li><li>改制订单生成后进入精工车间生产任务查询。</li><li>改制订单工艺和派工复用现有精工流程。</li><li>领料时如果是改制订单,并且使用物料不是毛坯,则生成领料单,由仓库物料出库。</li><li>如果是原现自制订单改制,或者直接使用毛坯改制,则不生成领料单。</li><li>改制记录查询独立展示全流程状态。</li></ul>
|
||||
</body>
|
||||
</html>
|
||||
841
docs/零件改制/零件改制功能设计方案.md
Normal file
@@ -0,0 +1,841 @@
|
||||
# 零件改制功能设计方案
|
||||
|
||||
## 0. 需求背景
|
||||
|
||||
### 0.1 需求提出
|
||||
|
||||
本需求由罗总牵头,组织技术中心、精工车间、仓储等相关部门讨论后提出。
|
||||
|
||||
### 0.2 提出原因
|
||||
|
||||
当前现场存在零件改制业务,但改制过程尚未完整纳入系统管理。由于现场计件、派工生产、完工入库和后续统计都需要明确的数据来源,原有线下记录或零散流转方式无法满足计件核算、过程追溯和部门协同要求。
|
||||
|
||||
因此,需要在系统内补充零件改制订单流程,将改制订单从技术中心发起、精工车间派工生产到完工入库的全过程纳入系统管理。
|
||||
|
||||
### 0.3 应用场景
|
||||
|
||||
本功能主要应用于以下场景:
|
||||
|
||||
- 技术中心根据现场或订单需求发起零件改制订单。
|
||||
- 精工车间根据改制订单制定工艺、派工生产。
|
||||
- 改制订单涉及非毛坯物料时,由系统生成领料单并交由仓库出库。
|
||||
- 改制加工完成后,按现有流程办理入库。
|
||||
- 现场计件、生产统计、入库记录和后续追溯均以系统内改制订单数据为依据。
|
||||
|
||||
## 1. 需求目标
|
||||
|
||||
基于项目现有精工车间生产流程,新增“零件改制”业务。
|
||||
|
||||
本次方案调整为:
|
||||
|
||||
- 在技术中心新增组件发起改制订单。
|
||||
- 改制订单生成后进入现有精工车间生产任务流程。
|
||||
- 精工车间生产任务查询组件可以查看改制订单。
|
||||
- 车间派工组件可以查看改制订单并继续派工。
|
||||
- 新增改制记录查询,用于查看改制订单的发起、生产、派工、领料和完工状态。
|
||||
- 领料时根据改制订单和物料来源判断是否生成领料单。
|
||||
|
||||
核心原则:
|
||||
|
||||
- 技术中心负责发起改制订单。
|
||||
- 精工车间复用现有生产任务、工艺、派工、加工流程。
|
||||
- 仓储只在需要额外领用非毛坯物料时介入。
|
||||
- 改制记录独立查询,但状态关联现有生产任务状态。
|
||||
|
||||
## 2. 现有流程承接关系
|
||||
|
||||
根据项目现有页面,改制订单应承接以下流程:
|
||||
|
||||
| 流程节点 | 现有承接页面 | 说明 |
|
||||
| ---- | ---------- | --------------- |
|
||||
| 技术发起 | 技术中心新增页面 | 发起改制订单,填写改制要求 |
|
||||
| 生成任务 | 精工车间生产任务查询 | 改制订单进入生产任务列表 |
|
||||
| 制定工艺 | 精工车间制定工艺 | 可复用或复制原工艺后调整 |
|
||||
| 车间派工 | 精工车间车间派工 | 工艺完成后派工 |
|
||||
| 领料判断 | 领料/仓储出库流程 | 根据物料类型决定是否生成领料单 |
|
||||
| 加工执行 | 精工车间现有加工流程 | 扫码、报工、质检等复用现有逻辑 |
|
||||
| 入库 | 仓储入库流程 | 改制完工后按现有流程办理入库 |
|
||||
| 记录查询 | 改制记录查询 | 查看改制全流程 |
|
||||
|
||||

|
||||
|
||||
## 3. 页面设计
|
||||
|
||||
### 3.1 技术中心新增页面:改制订单发起
|
||||
|
||||
建议路径:
|
||||
|
||||
```text
|
||||
src/views/TechnologyCenter/PartModificationOrder/index.vue
|
||||
```
|
||||
|
||||
页面名称:
|
||||
|
||||
```text
|
||||
改制订单发起
|
||||
```
|
||||
|
||||
归属模块:
|
||||
|
||||
```text
|
||||
技术中心
|
||||
```
|
||||
|
||||
主要功能:
|
||||
|
||||
- 查询需要改制的原订单、原零件或原自制件。
|
||||
- 发起改制订单。
|
||||
- 填写改制后零件信息、改制数量、改制原因、技术要求。
|
||||
- 指定是否使用原件改制、毛坯改制或其他物料改制。
|
||||
- 提交后生成改制订单,并进入精工车间生产任务查询。
|
||||
|
||||
### 3.2 精工车间修改页面:生产任务查询
|
||||
|
||||
现有路径:
|
||||
|
||||
```text
|
||||
src/views/SeikoWorkshop/ProductionTaskQuery/index.vue
|
||||
```
|
||||
|
||||
需要支持:
|
||||
|
||||
- 查询改制订单生成的生产任务。
|
||||
- 增加任务类型筛选。
|
||||
- 增加任务类型列。
|
||||
- 改制任务显示 `改制` 标识。
|
||||
- 改制任务继续使用现有 `工艺`、`派工` 按钮。
|
||||
|
||||
### 3.3 精工车间修改页面:车间派工
|
||||
|
||||
现有路径:
|
||||
|
||||
```text
|
||||
src/views/SeikoWorkshop/WorkshopAssignment/index.vue
|
||||
```
|
||||
|
||||
需要支持:
|
||||
|
||||
- 查询改制订单对应的待派工任务。
|
||||
- 增加任务类型筛选。
|
||||
- 增加任务类型列。
|
||||
- 复用现有已派工查询、待派工工序查询、派工、取消派工逻辑。
|
||||
|
||||
### 3.4 新增页面:改制记录查询
|
||||
|
||||
建议路径:
|
||||
|
||||
```text
|
||||
src/views/TechnologyCenter/PartModificationRecord/index.vue
|
||||
```
|
||||
|
||||
也可以放在精工车间模块,建议最终按业务归属确认。
|
||||
|
||||
页面名称:
|
||||
|
||||
```text
|
||||
改制记录查询
|
||||
```
|
||||
|
||||
主要功能:
|
||||
|
||||
- 查询改制订单记录。
|
||||
- 查看改制订单状态。
|
||||
- 查看是否生成领料单。
|
||||
- 查看仓库是否已出库。
|
||||
- 查看精工生产任务、工艺、派工、完工状态。
|
||||
- 支持跳转生产任务查询、车间派工、零件追溯。
|
||||
|
||||
## 4. 改制订单类型
|
||||
|
||||
改制订单需要明确物料来源,建议增加字段:
|
||||
|
||||
```text
|
||||
改制来源类型
|
||||
```
|
||||
|
||||
建议枚举:
|
||||
|
||||
| 改制来源类型 | 说明 | 是否生成领料单 |
|
||||
| ------- | ----------------- | ------- |
|
||||
| 原现自制订单 | 使用原现有自制订单零件进行改制 | 否 |
|
||||
| 毛坯改制 | 直接使用已有毛坯进行改制 | 否 |
|
||||
| 非毛坯物料改制 | 使用仓库其他物料、半成品或成品改制 | 是 |
|
||||
|
||||
说明:
|
||||
|
||||
- “原现自制订单”指当前已经存在的自制订单或自制零件,改制时不需要额外从仓库领料。
|
||||
- “毛坯改制”指直接使用毛坯进行改制,不额外生成领料单。
|
||||
- “非毛坯物料改制”指改制需要领用库存中的非毛坯物料,需要生成领料单并由仓库出库。
|
||||
|
||||
## 5. 领料规则
|
||||
|
||||
### 5.1 领料判断条件
|
||||
|
||||
领料时增加判断:
|
||||
|
||||
```text
|
||||
如果是改制订单,并且使用的物料不是毛坯,则生成领料单,由仓库物料出库。
|
||||
如果是原现自制订单改制,或者直接使用毛坯改制,则不生成领料单。
|
||||
```
|
||||
|
||||
规则可表达为:
|
||||
|
||||
```text
|
||||
是否生成领料单 =
|
||||
是否改制订单 === 1
|
||||
且 改制来源类型 === 非毛坯物料改制
|
||||
且 是否毛坯 !== 1
|
||||
```
|
||||
|
||||
### 5.2 生成领料单场景
|
||||
|
||||
以下场景需要生成领料单:
|
||||
|
||||
- 改制订单使用库存半成品。
|
||||
- 改制订单使用库存成品。
|
||||
- 改制订单使用其他非毛坯物料。
|
||||
- 改制订单指定的物料需要仓库出库。
|
||||
|
||||
生成后流程:
|
||||
|
||||
1. 技术中心发起改制订单。
|
||||
2. 系统判断需要领料。
|
||||
3. 生成领料单。
|
||||
4. 仓库根据领料单出库。
|
||||
5. 出库完成后,精工车间继续生产、工艺、派工。
|
||||
|
||||
### 5.3 不生成领料单场景
|
||||
|
||||
以下场景不生成领料单:
|
||||
|
||||
- 原现自制订单改制。
|
||||
- 直接使用毛坯改制。
|
||||
- 改制对象已经在精工车间现场,不需要仓库出库。
|
||||
|
||||
不生成领料单时:
|
||||
|
||||
- 改制订单直接进入精工生产任务。
|
||||
- 生产任务查询可查看。
|
||||
- 车间派工可查看并派工。
|
||||
|
||||
### 5.4 领料状态字段
|
||||
|
||||
建议改制订单增加以下字段:
|
||||
|
||||
| 字段名 | 说明 |
|
||||
| -------- | --------------- |
|
||||
| 是否需要领料 | 1 是,0 否 |
|
||||
| 是否已生成领料单 | 1 是,0 否 |
|
||||
| 领料单号 | 生成的领料单编号 |
|
||||
| 领料状态 | 未生成、待出库、已出库、已取消 |
|
||||
| 出库日期 | 仓库出库日期 |
|
||||
| 出库人 | 仓库操作人 |
|
||||
|
||||
## 6. 业务流程
|
||||
|
||||
### 6.1 技术中心发起改制订单
|
||||
|
||||
用户进入技术中心“改制订单发起”页面。
|
||||
|
||||
查询原始数据:
|
||||
|
||||
- 订单编号
|
||||
- 产品/部件名称
|
||||
- 零件名称
|
||||
- 图号
|
||||
- 原自制订单
|
||||
- 库存物料
|
||||
- 毛坯物料
|
||||
|
||||
发起改制时填写:
|
||||
|
||||
- 改制订单号
|
||||
- 原订单编号
|
||||
- 原零件名称
|
||||
- 原零件图号
|
||||
- 改制零件名称
|
||||
- 改制零件图号
|
||||
- 改制数量
|
||||
- 改制来源类型
|
||||
- 是否毛坯
|
||||
- 物料编号
|
||||
- 物料名称
|
||||
- 改制原因
|
||||
- 改制要求
|
||||
- 技术备注
|
||||
- 精工期限
|
||||
|
||||
提交时校验:
|
||||
|
||||
- 改制数量必须大于 0。
|
||||
- 改制来源类型不能为空。
|
||||
- 改制原因不能为空。
|
||||
- 改制要求不能为空。
|
||||
- 精工期限不能为空。
|
||||
- 如果来源类型为非毛坯物料改制,必须选择物料编号。
|
||||
|
||||
### 6.2 后端生成改制订单
|
||||
|
||||
提交后,后端需要同时处理:
|
||||
|
||||
- 写入改制订单主记录。
|
||||
- 根据改制来源类型判断是否生成领料单。
|
||||
- 生成精工车间生产任务。
|
||||
- 写入任务类型为 `改制`。
|
||||
- 关联改制订单号和新工艺计划流水号。
|
||||
|
||||
### 6.3 进入精工车间生产任务查询
|
||||
|
||||
改制订单生成后,应能在现有接口中查到:
|
||||
|
||||
```text
|
||||
精工车间_生成任务_查询数据
|
||||
```
|
||||
|
||||
建议返回字段增加:
|
||||
|
||||
- 任务类型
|
||||
- 是否改制
|
||||
- 改制订单号
|
||||
- 改制来源类型
|
||||
- 是否需要领料
|
||||
- 领料状态
|
||||
- 改制原因
|
||||
- 改制要求
|
||||
|
||||
生产任务查询页面显示:
|
||||
|
||||
- `任务类型 = 改制`
|
||||
- 若 `是否需要领料 = 1` 且 `领料状态 !== 已出库`,可显示领料状态提示。
|
||||
|
||||
是否允许工艺/派工,需要按业务决定:
|
||||
|
||||
- 如果非毛坯物料改制必须先出库,建议未出库前允许制定工艺,但不允许派工。
|
||||
- 如果现场允许先派工后补出库,则只做提示,不阻断派工。
|
||||
|
||||
建议采用更稳妥规则:
|
||||
|
||||
```text
|
||||
需要领料且未出库:允许制定工艺,不允许派工。
|
||||
不需要领料:正常工艺、派工。
|
||||
需要领料且已出库:正常工艺、派工。
|
||||
```
|
||||
|
||||
### 6.4 制定工艺
|
||||
|
||||
改制订单在生产任务查询中点击 `工艺`,进入现有:
|
||||
|
||||
```text
|
||||
/SeikoWorkshop/DevelopProcess
|
||||
```
|
||||
|
||||
工艺规则:
|
||||
|
||||
- 改制订单必须生成新的工艺计划流水号。
|
||||
- 不覆盖原自制订单或原零件工艺。
|
||||
- 可支持从原工艺复制后调整。
|
||||
- 工艺保存后,任务状态进入 `工艺完成`。
|
||||
|
||||
### 6.5 车间派工
|
||||
|
||||
工艺完成后进入现有车间派工页面:
|
||||
|
||||
```text
|
||||
src/views/SeikoWorkshop/WorkshopAssignment/index.vue
|
||||
```
|
||||
|
||||
现有查询接口:
|
||||
|
||||
```text
|
||||
精工车间_车间派工_查询
|
||||
```
|
||||
|
||||
改制订单派工前判断:
|
||||
|
||||
- 不需要领料:允许派工。
|
||||
- 需要领料且已出库:允许派工。
|
||||
- 需要领料但未出库:禁止派工,并提示“改制订单物料未出库,不能派工”。
|
||||
|
||||
派工明细继续复用现有接口:
|
||||
|
||||
```text
|
||||
车间生产管理工艺_零件工序_已派工查询
|
||||
车间生产管理工艺_零件工序_派工_工序查询
|
||||
车间生产管理工艺_零件工序_派工
|
||||
车间生产管理工艺_零件工序_取消派工
|
||||
```
|
||||
|
||||
### 6.6 仓库出库
|
||||
|
||||
当改制订单需要领料时,系统生成领料单。
|
||||
|
||||
仓库根据领料单完成出库后,需要回写:
|
||||
|
||||
- 领料状态 = 已出库
|
||||
- 出库日期
|
||||
- 出库人
|
||||
- 出库数量
|
||||
|
||||
出库完成后,精工车间派工限制解除。
|
||||
|
||||
### 6.7 加工和完工
|
||||
|
||||
改制订单派工后,继续走现有精工车间加工流程:
|
||||
|
||||
- 工序派工
|
||||
- 扫码加工
|
||||
- 完工报工
|
||||
- 质检
|
||||
- 零件追溯
|
||||
- 工时统计
|
||||
|
||||
完工后改制记录状态同步为:
|
||||
|
||||
```text
|
||||
已完成
|
||||
```
|
||||
|
||||
## 7. 数据字段设计
|
||||
|
||||
### 7.1 改制订单主记录字段
|
||||
|
||||
| 字段名 | 说明 |
|
||||
| -------- | ------------------- |
|
||||
| 改制订单号 | 改制业务编号 |
|
||||
| 原订单编号 | 原订单编号 |
|
||||
| 原订单流水号 | 原订单流水号 |
|
||||
| 原组件流水号 | 原组件流水号 |
|
||||
| 原基本件流水号 | 原零件流水号 |
|
||||
| 原工艺计划流水号 | 原工艺计划流水号 |
|
||||
| 原零件名称 | 改制前零件名称 |
|
||||
| 原零件图号 | 改制前零件图号 |
|
||||
| 原数量 | 原数量 |
|
||||
| 改制零件名称 | 改制后零件名称 |
|
||||
| 改制零件图号 | 改制后零件图号 |
|
||||
| 改制数量 | 改制数量 |
|
||||
| 改制来源类型 | 原现自制订单、毛坯改制、非毛坯物料改制 |
|
||||
| 是否毛坯 | 1 是,0 否 |
|
||||
| 物料编号 | 使用物料编号 |
|
||||
| 物料名称 | 使用物料名称 |
|
||||
| 物料流水号 | 使用物料流水号 |
|
||||
| 是否需要领料 | 1 是,0 否 |
|
||||
| 是否已生成领料单 | 1 是,0 否 |
|
||||
| 领料单号 | 领料单编号 |
|
||||
| 领料状态 | 未生成、待出库、已出库、已取消 |
|
||||
| 改制原因 | 改制原因 |
|
||||
| 改制要求 | 改制要求 |
|
||||
| 技术备注 | 技术备注 |
|
||||
| 精工期限 | 精工完工期限 |
|
||||
| 新基本件流水号 | 改制任务生成的新零件流水号 |
|
||||
| 新工艺计划流水号 | 改制任务生成的新工艺计划流水号 |
|
||||
| 发起人 | 当前用户 ID |
|
||||
| 发起日期 | 发起时间 |
|
||||
| 状态 | 改制订单状态 |
|
||||
| 是否启用 | 逻辑删除标识 |
|
||||
|
||||
### 7.2 改制订单状态
|
||||
|
||||
| 状态 | 说明 |
|
||||
| ---- | ---------------- |
|
||||
| 待领料 | 需要领料,领料单未出库 |
|
||||
| 待工艺 | 不需要领料或已出库,等待制定工艺 |
|
||||
| 工艺完成 | 工艺已保存,等待派工 |
|
||||
| 待派工 | 工艺完成且满足派工条件 |
|
||||
| 加工中 | 已派工或已开始加工 |
|
||||
| 已完成 | 改制任务完工 |
|
||||
| 已取消 | 改制订单取消 |
|
||||
|
||||
说明:
|
||||
|
||||
- 如果不需要领料,提交后可直接进入 `待工艺`。
|
||||
- 如果需要领料,提交后进入 `待领料`。
|
||||
- 仓库出库后从 `待领料` 转为 `待工艺` 或保持生产任务状态,由查询时关联显示。
|
||||
|
||||
## 8. API 设计
|
||||
|
||||
项目请求继续使用:
|
||||
|
||||
```js
|
||||
this.CreateData(type, name, param, pageSize, pageCurrent)
|
||||
this.ExecDatabase(Data)
|
||||
```
|
||||
|
||||
### 8.1 技术中心查询可改制对象
|
||||
|
||||
```js
|
||||
var Data = this.CreateData('11', '技术中心_改制订单_可改制对象_查询', param, this.pageSize, this.pageCurrent)
|
||||
```
|
||||
|
||||
### 8.2 技术中心发起改制订单
|
||||
|
||||
```js
|
||||
var Data = this.CreateData('12', '技术中心_改制订单_发起改制', param)
|
||||
```
|
||||
|
||||
参数建议:
|
||||
|
||||
| 参数名 | 说明 |
|
||||
| -------- | ------------------- |
|
||||
| 原订单流水号 | 原订单流水号 |
|
||||
| 原组件流水号 | 原组件流水号 |
|
||||
| 原基本件流水号 | 原基本件流水号 |
|
||||
| 原工艺计划流水号 | 原工艺计划流水号 |
|
||||
| 原订单编号 | 原订单编号 |
|
||||
| 原零件名称 | 原零件名称 |
|
||||
| 原零件图号 | 原零件图号 |
|
||||
| 改制零件名称 | 改制零件名称 |
|
||||
| 改制零件图号 | 改制零件图号 |
|
||||
| 改制数量 | 改制数量 |
|
||||
| 改制来源类型 | 原现自制订单、毛坯改制、非毛坯物料改制 |
|
||||
| 是否毛坯 | 是否毛坯 |
|
||||
| 物料流水号 | 使用物料流水号 |
|
||||
| 物料编号 | 物料编号 |
|
||||
| 物料名称 | 物料名称 |
|
||||
| 改制原因 | 改制原因 |
|
||||
| 改制要求 | 改制要求 |
|
||||
| 技术备注 | 技术备注 |
|
||||
| 精工期限 | 精工期限 |
|
||||
| 发起人 | 当前用户 ID |
|
||||
|
||||
后端处理结果:
|
||||
|
||||
- 生成改制订单。
|
||||
- 判断是否生成领料单。
|
||||
- 生成精工生产任务。
|
||||
- 返回 `result`、`改制订单号`、`领料单号`、`是否需要领料`。
|
||||
|
||||
### 8.3 改制记录查询
|
||||
|
||||
```js
|
||||
var Data = this.CreateData('11', '技术中心_改制订单_记录_查询', param, this.pageSize, this.pageCurrent)
|
||||
```
|
||||
|
||||
### 8.4 改制订单详情
|
||||
|
||||
```js
|
||||
var Data = this.CreateData('11', '技术中心_改制订单_详情_查询', param)
|
||||
```
|
||||
|
||||
### 8.5 取消改制订单
|
||||
|
||||
```js
|
||||
var Data = this.CreateData('12', '技术中心_改制订单_取消', param)
|
||||
```
|
||||
|
||||
取消前后端需要校验:
|
||||
|
||||
- 未派工可以取消。
|
||||
- 已派工未加工,需要先取消派工。
|
||||
- 已加工、已有质检记录或已完成,不允许取消。
|
||||
- 已生成领料单且已出库,不允许直接取消,需要走退料或异常处理。
|
||||
|
||||
## 9. 现有接口扩展
|
||||
|
||||
### 9.1 生产任务查询接口
|
||||
|
||||
现有接口:
|
||||
|
||||
```text
|
||||
精工车间_生成任务_查询数据
|
||||
```
|
||||
|
||||
新增查询参数:
|
||||
|
||||
| 参数名 | 说明 |
|
||||
| ----------- | ------------- |
|
||||
| 任务类型\_check | 是否按任务类型过滤 |
|
||||
| 任务类型 | 全部、正常、改制、报废补投 |
|
||||
| 领料状态\_check | 是否按领料状态过滤 |
|
||||
| 领料状态 | 待出库、已出库、不需要领料 |
|
||||
|
||||
新增返回字段:
|
||||
|
||||
| 字段名 | 说明 |
|
||||
| ------ | ------------------- |
|
||||
| 任务类型 | 正常、改制、报废补投 |
|
||||
| 是否改制 | 1 是,0 否 |
|
||||
| 改制订单号 | 改制订单编号 |
|
||||
| 改制来源类型 | 原现自制订单、毛坯改制、非毛坯物料改制 |
|
||||
| 是否需要领料 | 1 是,0 否 |
|
||||
| 领料状态 | 未生成、待出库、已出库、已取消 |
|
||||
| 领料单号 | 领料单号 |
|
||||
| 改制原因 | 改制原因 |
|
||||
| 改制要求 | 改制要求 |
|
||||
|
||||
### 9.2 车间派工查询接口
|
||||
|
||||
现有接口:
|
||||
|
||||
```text
|
||||
精工车间_车间派工_查询
|
||||
```
|
||||
|
||||
新增查询参数:
|
||||
|
||||
| 参数名 | 说明 |
|
||||
| ----------- | ------------- |
|
||||
| 任务类型\_check | 是否按任务类型过滤 |
|
||||
| 任务类型 | 全部、正常、改制、报废补投 |
|
||||
|
||||
新增返回字段:
|
||||
|
||||
| 字段名 | 说明 |
|
||||
| ------ | ---------- |
|
||||
| 任务类型 | 正常、改制、报废补投 |
|
||||
| 是否改制 | 1 是,0 否 |
|
||||
| 改制订单号 | 改制订单编号 |
|
||||
| 改制来源类型 | 改制来源类型 |
|
||||
| 是否需要领料 | 1 是,0 否 |
|
||||
| 领料状态 | 领料状态 |
|
||||
| 领料单号 | 领料单号 |
|
||||
|
||||
派工前端限制:
|
||||
|
||||
```text
|
||||
如果 是否改制 = 1 且 是否需要领料 = 1 且 领料状态 != 已出库,则不允许派工。
|
||||
```
|
||||
|
||||
## 10. 前端交互调整
|
||||
|
||||
### 10.1 技术中心改制订单发起页面
|
||||
|
||||
查询条件:
|
||||
|
||||
- 订单编号
|
||||
- 零件名称
|
||||
- 图号
|
||||
- 物料编号
|
||||
- 物料名称
|
||||
- 改制来源类型
|
||||
|
||||
表格列:
|
||||
|
||||
- 订单编号
|
||||
- 产品/部件名称
|
||||
- 零件名称
|
||||
- 零件图号
|
||||
- 数量
|
||||
- 当前状态
|
||||
- 来源类型
|
||||
- 物料编号
|
||||
- 物料名称
|
||||
- 操作
|
||||
|
||||
操作:
|
||||
|
||||
- 发起改制
|
||||
- 图纸
|
||||
- PLM传入工艺
|
||||
- 追溯
|
||||
|
||||
发起改制弹窗:
|
||||
|
||||
- 原订单编号
|
||||
- 原零件名称
|
||||
- 原零件图号
|
||||
- 改制零件名称
|
||||
- 改制零件图号
|
||||
- 改制数量
|
||||
- 改制来源类型
|
||||
- 是否毛坯
|
||||
- 物料编号
|
||||
- 物料名称
|
||||
- 改制原因
|
||||
- 改制要求
|
||||
- 技术备注
|
||||
- 精工期限
|
||||
|
||||
### 10.2 生产任务查询页面
|
||||
|
||||
新增筛选:
|
||||
|
||||
```text
|
||||
任务类型:全部 / 正常 / 改制 / 报废补投
|
||||
领料状态:全部 / 不需要领料 / 待出库 / 已出库
|
||||
```
|
||||
|
||||
新增列:
|
||||
|
||||
- 任务类型
|
||||
- 改制订单号
|
||||
- 改制来源类型
|
||||
- 领料状态
|
||||
|
||||
显示建议:
|
||||
|
||||
```html
|
||||
<el-tag type="warning" size="mini">改制</el-tag>
|
||||
<el-tag type="danger" size="mini">待出库</el-tag>
|
||||
<el-tag type="success" size="mini">已出库</el-tag>
|
||||
<el-tag type="info" size="mini">不需要领料</el-tag>
|
||||
```
|
||||
|
||||
### 10.3 车间派工页面
|
||||
|
||||
新增筛选:
|
||||
|
||||
```text
|
||||
任务类型:全部 / 正常 / 改制 / 报废补投
|
||||
```
|
||||
|
||||
新增列:
|
||||
|
||||
- 任务类型
|
||||
- 改制订单号
|
||||
- 领料状态
|
||||
|
||||
派工按钮或派工操作前增加判断:
|
||||
|
||||
```js
|
||||
if (Number(row.是否改制) === 1 && Number(row.是否需要领料) === 1 && row.领料状态 !== '已出库') {
|
||||
this.$message.warning('改制订单物料未出库,不能派工')
|
||||
return
|
||||
}
|
||||
```
|
||||
|
||||
### 10.4 改制记录查询页面
|
||||
|
||||
查询条件:
|
||||
|
||||
- 改制订单号
|
||||
- 原订单编号
|
||||
- 零件名称或图号
|
||||
- 改制来源类型
|
||||
- 领料状态
|
||||
- 改制状态
|
||||
- 发起日期
|
||||
- 发起人
|
||||
|
||||
表格列:
|
||||
|
||||
- 改制订单号
|
||||
- 状态
|
||||
- 原订单编号
|
||||
- 原零件名称
|
||||
- 原零件图号
|
||||
- 改制零件名称
|
||||
- 改制零件图号
|
||||
- 改制数量
|
||||
- 改制来源类型
|
||||
- 是否需要领料
|
||||
- 领料单号
|
||||
- 领料状态
|
||||
- 改制原因
|
||||
- 发起人
|
||||
- 发起日期
|
||||
- 精工期限
|
||||
- 完成日期
|
||||
- 操作
|
||||
|
||||
操作:
|
||||
|
||||
- 详情
|
||||
- 生产任务
|
||||
- 派工
|
||||
- 追溯
|
||||
- 取消
|
||||
|
||||
## 11. 菜单配置
|
||||
|
||||
建议后端菜单配置:
|
||||
|
||||
```text
|
||||
技术中心
|
||||
改制订单发起
|
||||
改制记录查询
|
||||
```
|
||||
|
||||
组件路径:
|
||||
|
||||
```text
|
||||
TechnologyCenter/PartModificationOrder/index
|
||||
TechnologyCenter/PartModificationRecord/index
|
||||
```
|
||||
|
||||
精工车间不新增发起入口,只扩展现有页面:
|
||||
|
||||
```text
|
||||
SeikoWorkshop/ProductionTaskQuery/index
|
||||
SeikoWorkshop/WorkshopAssignment/index
|
||||
```
|
||||
|
||||
## 12. 实施顺序
|
||||
|
||||
建议按以下顺序实施:
|
||||
|
||||
1. 后端新增改制订单主记录表。
|
||||
2. 后端新增技术中心发起改制订单接口。
|
||||
3. 后端在发起接口中加入领料判断规则。
|
||||
4. 后端按规则生成或不生成领料单。
|
||||
5. 后端生成标准精工生产任务,并标记 `任务类型 = 改制`。
|
||||
6. 扩展生产任务查询接口,返回改制和领料字段。
|
||||
7. 扩展车间派工查询接口,返回改制和领料字段。
|
||||
8. 前端新增技术中心改制订单发起页面。
|
||||
9. 前端新增改制记录查询页面。
|
||||
10. 前端修改生产任务查询页面,增加任务类型和领料状态显示。
|
||||
11. 前端修改车间派工页面,增加改制任务显示和派工前领料状态校验。
|
||||
12. 联调从技术中心发起、领料判断、仓库出库、精工工艺、车间派工、加工完工、记录查询的完整流程。
|
||||
|
||||
## 13. 风险点
|
||||
|
||||
### 13.1 领料判断风险
|
||||
|
||||
改制订单是否生成领料单,必须以后端判断为准。
|
||||
|
||||
前端可以显示和提示,但不能只依赖前端判断,避免绕过仓库出库流程。
|
||||
|
||||
### 13.2 派工前物料状态风险
|
||||
|
||||
如果改制订单需要仓库出库,但尚未出库,直接派工会导致车间无物料加工。
|
||||
|
||||
建议车间派工接口或派工保存接口再次校验:
|
||||
|
||||
```text
|
||||
需要领料且未出库,不允许派工。
|
||||
```
|
||||
|
||||
### 13.3 原任务数据覆盖风险
|
||||
|
||||
改制订单必须生成新的生产任务和新的工艺计划流水号。
|
||||
|
||||
不能直接覆盖原自制订单或原零件工艺,否则会影响原订单追溯、工时和质量记录。
|
||||
|
||||
### 13.4 取消改制风险
|
||||
|
||||
已生成领料单、已出库、已派工或已加工的改制订单取消规则需要严格控制。
|
||||
|
||||
建议:
|
||||
|
||||
- 未出库、未派工:允许取消。
|
||||
- 已出库:需要退料后取消。
|
||||
- 已派工未加工:先取消派工再取消。
|
||||
- 已加工:不允许取消,只能走异常处理。
|
||||
|
||||
### 13.5 统计口径风险
|
||||
|
||||
改制订单进入精工生产任务后,会影响生产任务数量、工时统计、完工统计。
|
||||
|
||||
建议所有统计接口增加任务类型维度:
|
||||
|
||||
```text
|
||||
正常
|
||||
改制
|
||||
报废补投
|
||||
```
|
||||
|
||||
## 14. 总结
|
||||
|
||||
本方案采用:
|
||||
|
||||
```text
|
||||
技术中心发起改制订单,精工车间承接生产,仓库按需出库,改制记录统一查询。
|
||||
```
|
||||
|
||||
关键规则:
|
||||
|
||||
- 技术中心新增组件发起改制订单。
|
||||
- 改制订单生成后进入精工车间生产任务查询。
|
||||
- 改制订单工艺和派工复用现有精工流程。
|
||||
- 领料时如果是改制订单,并且使用物料不是毛坯,则生成领料单,由仓库物料出库。
|
||||
- 如果是原现自制订单改制,或者直接使用毛坯改制,则不生成领料单。
|
||||
- 改制记录查询独立展示全流程状态。
|
||||
BIN
docs/零件改制/零件改制功能设计方案.pdf
Normal file
85
docs/零件改制/零件改制流程图.svg
Normal file
@@ -0,0 +1,85 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1180" height="1080" viewBox="0 0 1180 1080">
|
||||
<defs>
|
||||
<style>
|
||||
.title { font: 700 30px "Microsoft YaHei", "SimSun", Arial, sans-serif; fill: #1f2933; }
|
||||
.label { font: 600 18px "Microsoft YaHei", "SimSun", Arial, sans-serif; fill: #1f2933; }
|
||||
.small { font: 15px "Microsoft YaHei", "SimSun", Arial, sans-serif; fill: #475569; }
|
||||
.node { fill: #ffffff; stroke: #2f80ed; stroke-width: 2; rx: 10; }
|
||||
.tech { fill: #eef6ff; stroke: #2f80ed; }
|
||||
.seiko { fill: #f0fdf4; stroke: #16a34a; }
|
||||
.warehouse { fill: #fff7ed; stroke: #f97316; }
|
||||
.record { fill: #f8fafc; stroke: #64748b; }
|
||||
.decision { fill: #fff7ed; stroke: #f59e0b; stroke-width: 2; }
|
||||
.line { stroke: #64748b; stroke-width: 2; fill: none; marker-end: url(#arrow); }
|
||||
.yesno { font: 600 14px "Microsoft YaHei", "SimSun", Arial, sans-serif; fill: #334155; }
|
||||
</style>
|
||||
<marker id="arrow" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto" markerUnits="strokeWidth">
|
||||
<path d="M0,0 L0,6 L9,3 z" fill="#64748b" />
|
||||
</marker>
|
||||
</defs>
|
||||
|
||||
<rect x="0" y="0" width="1180" height="1080" fill="#ffffff"/>
|
||||
<text x="590" y="48" text-anchor="middle" class="title">零件改制业务流程图</text>
|
||||
|
||||
<rect x="70" y="90" width="1040" height="90" class="node tech"/>
|
||||
<text x="590" y="126" text-anchor="middle" class="label">技术中心:改制订单发起</text>
|
||||
<text x="590" y="154" text-anchor="middle" class="small">选择原订单/零件/物料,填写改制数量、来源类型、原因、要求、精工期限</text>
|
||||
|
||||
<path d="M590 180 L590 225" class="line"/>
|
||||
|
||||
<polygon points="590,225 755,305 590,385 425,305" class="decision"/>
|
||||
<text x="590" y="292" text-anchor="middle" class="label">是否改制订单</text>
|
||||
<text x="590" y="322" text-anchor="middle" class="small">且使用物料不是毛坯?</text>
|
||||
|
||||
<path d="M755 305 L900 305 L900 365" class="line"/>
|
||||
<text x="820" y="292" class="yesno">是</text>
|
||||
|
||||
<rect x="760" y="365" width="280" height="88" class="node warehouse"/>
|
||||
<text x="900" y="400" text-anchor="middle" class="label">生成领料单</text>
|
||||
<text x="900" y="428" text-anchor="middle" class="small">仓库按领料单物料出库</text>
|
||||
|
||||
<path d="M900 453 L900 515 L670 515" class="line"/>
|
||||
<text x="918" y="488" class="yesno">已出库</text>
|
||||
|
||||
<path d="M425 305 L280 305 L280 515 L510 515" class="line"/>
|
||||
<text x="320" y="292" class="yesno">否</text>
|
||||
<text x="118" y="384" class="small">原现自制订单改制</text>
|
||||
<text x="118" y="410" class="small">或直接毛坯改制</text>
|
||||
<text x="118" y="436" class="small">不生成领料单</text>
|
||||
|
||||
<rect x="510" y="475" width="160" height="80" class="node seiko"/>
|
||||
<text x="590" y="508" text-anchor="middle" class="label">生成精工</text>
|
||||
<text x="590" y="535" text-anchor="middle" class="small">生产任务</text>
|
||||
|
||||
<path d="M590 555 L590 602" class="line"/>
|
||||
|
||||
<rect x="390" y="602" width="400" height="80" class="node seiko"/>
|
||||
<text x="590" y="636" text-anchor="middle" class="label">精工车间:生产任务查询</text>
|
||||
<text x="590" y="662" text-anchor="middle" class="small">显示任务类型=改制、领料状态、改制订单号</text>
|
||||
|
||||
<path d="M590 682 L590 728" class="line"/>
|
||||
|
||||
<rect x="390" y="728" width="400" height="80" class="node seiko"/>
|
||||
<text x="590" y="762" text-anchor="middle" class="label">制定工艺</text>
|
||||
<text x="590" y="788" text-anchor="middle" class="small">生成新工艺计划,可复制原工艺后调整</text>
|
||||
|
||||
<path d="M590 808 L590 854" class="line"/>
|
||||
|
||||
<rect x="390" y="854" width="400" height="80" class="node seiko"/>
|
||||
<text x="590" y="888" text-anchor="middle" class="label">车间派工与加工完工</text>
|
||||
<text x="590" y="914" text-anchor="middle" class="small">需要领料且未出库时禁止派工,出库后正常派工</text>
|
||||
|
||||
<path d="M590 934 L590 980" class="line"/>
|
||||
|
||||
<rect x="390" y="980" width="400" height="70" class="node warehouse"/>
|
||||
<text x="590" y="1010" text-anchor="middle" class="label">仓储入库</text>
|
||||
<text x="590" y="1036" text-anchor="middle" class="small">改制完工后按现有流程办理入库并回写状态</text>
|
||||
|
||||
<path d="M790 1015 L970 1015 L970 215 L720 215" class="line"/>
|
||||
<rect x="820" y="188" width="300" height="54" class="node record"/>
|
||||
<text x="970" y="222" text-anchor="middle" class="label">改制记录查询贯穿全流程</text>
|
||||
|
||||
<path d="M390 1015 L210 1015 L210 215 L460 215" class="line"/>
|
||||
<rect x="60" y="188" width="300" height="54" class="node record"/>
|
||||
<text x="210" y="222" text-anchor="middle" class="label">状态回写与追溯关联</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.6 KiB |
BIN
favicon.ico
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 2.9 KiB |
@@ -3,7 +3,11 @@
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>高精工业互联网平台</title>
|
||||
<title>景耀工业互联网平台</title>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/docxtemplater/3.9.1/docxtemplater.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/2.6.1/jszip.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.8/FileSaver.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip-utils/0.0.2/jszip-utils.js"></script>
|
||||
</head>
|
||||
<body style="background-color: #eeeeee">
|
||||
<script src=<%= BASE_URL %>/tinymce4.7.5/tinymce.min.js></script>
|
||||
|
||||
16
package.json
@@ -15,22 +15,29 @@
|
||||
"dependencies": {
|
||||
"@xkeshi/vue-barcode": "^1.0.0",
|
||||
"axios": "0.18.0",
|
||||
"docxtemplater": "^3.19.7",
|
||||
"echarts": "^4.2.0-rc.2",
|
||||
"element-ui": "2.8.2",
|
||||
"element-ui": "^2.13.0",
|
||||
"file-saver": "^1.3.8",
|
||||
"html2canvas": "^1.0.0-alpha.12",
|
||||
"jquery": "^3.3.1",
|
||||
"jquery": "^3.5.1",
|
||||
"js-cookie": "2.2.0",
|
||||
"jspdf": "^1.5.2",
|
||||
"node-sass": "^4.10.0",
|
||||
"jszip-utils": "^0.1.0",
|
||||
"node-sass": "^6.0.1",
|
||||
"normalize.css": "7.0.0",
|
||||
"npm": "^7.20.5",
|
||||
"nprogress": "0.2.0",
|
||||
"qrcode": "^1.3.2",
|
||||
"stylus": "0.52.4",
|
||||
"stylus-loader": "^3.0.1",
|
||||
"three-freeform-controls": "^0.1.12",
|
||||
"time-formater": "^1.0.3",
|
||||
"v-viewer": "^1.3.1",
|
||||
"vue": "2.5.17",
|
||||
"vue-count-to": "^1.0.13",
|
||||
"vue-direction-key": "^1.0.5",
|
||||
"vue-i18n": "^8.26.8",
|
||||
"vue-router": "^3.0.7",
|
||||
"vuex": "3.0.1",
|
||||
"xlsx": "^0.14.0",
|
||||
@@ -50,6 +57,8 @@
|
||||
"chalk": "2.4.1",
|
||||
"copy-webpack-plugin": "4.5.2",
|
||||
"css-loader": "1.0.0",
|
||||
"docx-to-pdf": "^1.1.0",
|
||||
"docx2pdf-converter": "^2.1.1",
|
||||
"eslint": "4.19.1",
|
||||
"eslint-friendly-formatter": "4.0.1",
|
||||
"eslint-loader": "2.0.0",
|
||||
@@ -66,6 +75,7 @@
|
||||
"postcss-import": "12.0.0",
|
||||
"postcss-loader": "2.1.6",
|
||||
"postcss-url": "7.3.2",
|
||||
"raw-loader": "^4.0.2",
|
||||
"rimraf": "2.6.2",
|
||||
"sass-loader": "7.0.3",
|
||||
"script-ext-html-webpack-plugin": "2.0.1",
|
||||
|
||||
477
part-modification-plan.html
Normal file
@@ -0,0 +1,477 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>零件改制功能设计方案</title>
|
||||
<style>
|
||||
@page { size: A4; margin: 18mm 16mm; }
|
||||
body {
|
||||
font-family: "Microsoft YaHei", "SimSun", Arial, sans-serif;
|
||||
color: #1f2933;
|
||||
font-size: 13px;
|
||||
line-height: 1.65;
|
||||
}
|
||||
h1 {
|
||||
font-size: 26px;
|
||||
text-align: center;
|
||||
margin: 0 0 24px;
|
||||
padding-bottom: 12px;
|
||||
border-bottom: 2px solid #2f80ed;
|
||||
}
|
||||
h2 {
|
||||
font-size: 19px;
|
||||
margin: 24px 0 10px;
|
||||
padding-left: 8px;
|
||||
border-left: 4px solid #2f80ed;
|
||||
page-break-after: avoid;
|
||||
}
|
||||
h3 {
|
||||
font-size: 16px;
|
||||
margin: 18px 0 8px;
|
||||
page-break-after: avoid;
|
||||
}
|
||||
p { margin: 7px 0; }
|
||||
ul { margin: 6px 0 10px 22px; padding: 0; }
|
||||
li { margin: 3px 0; }
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
margin: 10px 0 16px;
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
th, td {
|
||||
border: 1px solid #cbd5e1;
|
||||
padding: 6px 8px;
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
word-break: break-word;
|
||||
}
|
||||
th {
|
||||
background: #eef4ff;
|
||||
font-weight: 600;
|
||||
}
|
||||
code {
|
||||
font-family: Consolas, "Microsoft YaHei", monospace;
|
||||
background: #f3f4f6;
|
||||
padding: 1px 4px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
pre {
|
||||
background: #f8fafc;
|
||||
border: 1px solid #d8dee9;
|
||||
padding: 10px;
|
||||
overflow-wrap: break-word;
|
||||
white-space: pre-wrap;
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
figure {
|
||||
margin: 14px 0 20px;
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
figure img {
|
||||
display: block;
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
border: 1px solid #d8dee9;
|
||||
}
|
||||
figcaption {
|
||||
margin-top: 6px;
|
||||
color: #64748b;
|
||||
font-size: 12px;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>零件改制功能设计方案</h1>
|
||||
<h2>0. 需求背景</h2>
|
||||
<h3>0.1 需求提出</h3>
|
||||
<p>本需求由罗总牵头,组织技术中心、精工车间、仓储等相关部门讨论后提出。</p>
|
||||
<h3>0.2 提出原因</h3>
|
||||
<p>当前现场存在零件改制业务,但改制过程尚未完整纳入系统管理。由于现场计件、派工生产、完工入库和后续统计都需要明确的数据来源,原有线下记录或零散流转方式无法满足计件核算、过程追溯和部门协同要求。</p>
|
||||
<p>因此,需要在系统内补充零件改制订单流程,将改制订单从技术中心发起、精工车间派工生产到完工入库的全过程纳入系统管理。</p>
|
||||
<h3>0.3 应用场景</h3>
|
||||
<p>本功能主要应用于以下场景:</p>
|
||||
<ul><li>技术中心根据现场或订单需求发起零件改制订单。</li><li>精工车间根据改制订单制定工艺、派工生产。</li><li>改制订单涉及非毛坯物料时,由系统生成领料单并交由仓库出库。</li><li>改制加工完成后,按现有流程办理入库。</li><li>现场计件、生产统计、入库记录和后续追溯均以系统内改制订单数据为依据。</li></ul>
|
||||
<h2>1. 需求目标</h2>
|
||||
<p>基于项目现有精工车间生产流程,新增“零件改制”业务。</p>
|
||||
<p>本次方案调整为:</p>
|
||||
<ul><li>在技术中心新增组件发起改制订单。</li><li>改制订单生成后进入现有精工车间生产任务流程。</li><li>精工车间生产任务查询组件可以查看改制订单。</li><li>车间派工组件可以查看改制订单并继续派工。</li><li>新增改制记录查询,用于查看改制订单的发起、生产、派工、领料和完工状态。</li><li>领料时根据改制订单和物料来源判断是否生成领料单。</li></ul>
|
||||
<p>核心原则:</p>
|
||||
<ul><li>技术中心负责发起改制订单。</li><li>精工车间复用现有生产任务、工艺、派工、加工流程。</li><li>仓储只在需要额外领用非毛坯物料时介入。</li><li>改制记录独立查询,但状态关联现有生产任务状态。</li></ul>
|
||||
<h2>2. 现有流程承接关系</h2>
|
||||
<p>根据项目现有页面,改制订单应承接以下流程:</p>
|
||||
<table>
|
||||
<thead><tr><th>流程节点</th><th>现有承接页面</th><th>说明</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>技术发起</td><td>技术中心新增页面</td><td>发起改制订单,填写改制要求</td></tr>
|
||||
<tr><td>生成任务</td><td>精工车间生产任务查询</td><td>改制订单进入生产任务列表</td></tr>
|
||||
<tr><td>制定工艺</td><td>精工车间制定工艺</td><td>可复用或复制原工艺后调整</td></tr>
|
||||
<tr><td>车间派工</td><td>精工车间车间派工</td><td>工艺完成后派工</td></tr>
|
||||
<tr><td>领料判断</td><td>领料/仓储出库流程</td><td>根据物料类型决定是否生成领料单</td></tr>
|
||||
<tr><td>加工执行</td><td>精工车间现有加工流程</td><td>扫码、报工、质检等复用现有逻辑</td></tr>
|
||||
<tr><td>入库</td><td>仓储入库流程</td><td>改制完工后按现有流程办理入库</td></tr>
|
||||
<tr><td>记录查询</td><td>改制记录查询</td><td>查看改制全流程</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<figure><img src="零件改制流程图.svg" alt="零件改制业务流程图"><figcaption>零件改制业务流程图</figcaption></figure>
|
||||
<h2>3. 页面设计</h2>
|
||||
<h3>3.1 技术中心新增页面:改制订单发起</h3>
|
||||
<p>建议路径:</p>
|
||||
<pre><code>src/views/TechnologyCenter/PartModificationOrder/index.vue</code></pre>
|
||||
<p>页面名称:</p>
|
||||
<pre><code>改制订单发起</code></pre>
|
||||
<p>归属模块:</p>
|
||||
<pre><code>技术中心</code></pre>
|
||||
<p>主要功能:</p>
|
||||
<ul><li>查询需要改制的原订单、原零件或原自制件。</li><li>发起改制订单。</li><li>填写改制后零件信息、改制数量、改制原因、技术要求。</li><li>指定是否使用原件改制、毛坯改制或其他物料改制。</li><li>提交后生成改制订单,并进入精工车间生产任务查询。</li></ul>
|
||||
<h3>3.2 精工车间修改页面:生产任务查询</h3>
|
||||
<p>现有路径:</p>
|
||||
<pre><code>src/views/SeikoWorkshop/ProductionTaskQuery/index.vue</code></pre>
|
||||
<p>需要支持:</p>
|
||||
<ul><li>查询改制订单生成的生产任务。</li><li>增加任务类型筛选。</li><li>增加任务类型列。</li><li>改制任务显示 <code>改制</code> 标识。</li><li>改制任务继续使用现有 <code>工艺</code>、<code>派工</code> 按钮。</li></ul>
|
||||
<h3>3.3 精工车间修改页面:车间派工</h3>
|
||||
<p>现有路径:</p>
|
||||
<pre><code>src/views/SeikoWorkshop/WorkshopAssignment/index.vue</code></pre>
|
||||
<p>需要支持:</p>
|
||||
<ul><li>查询改制订单对应的待派工任务。</li><li>增加任务类型筛选。</li><li>增加任务类型列。</li><li>复用现有已派工查询、待派工工序查询、派工、取消派工逻辑。</li></ul>
|
||||
<h3>3.4 新增页面:改制记录查询</h3>
|
||||
<p>建议路径:</p>
|
||||
<pre><code>src/views/TechnologyCenter/PartModificationRecord/index.vue</code></pre>
|
||||
<p>也可以放在精工车间模块,建议最终按业务归属确认。</p>
|
||||
<p>页面名称:</p>
|
||||
<pre><code>改制记录查询</code></pre>
|
||||
<p>主要功能:</p>
|
||||
<ul><li>查询改制订单记录。</li><li>查看改制订单状态。</li><li>查看是否生成领料单。</li><li>查看仓库是否已出库。</li><li>查看精工生产任务、工艺、派工、完工状态。</li><li>支持跳转生产任务查询、车间派工、零件追溯。</li></ul>
|
||||
<h2>4. 改制订单类型</h2>
|
||||
<p>改制订单需要明确物料来源,建议增加字段:</p>
|
||||
<pre><code>改制来源类型</code></pre>
|
||||
<p>建议枚举:</p>
|
||||
<table>
|
||||
<thead><tr><th>改制来源类型</th><th>说明</th><th>是否生成领料单</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>原现自制订单</td><td>使用原现有自制订单零件进行改制</td><td>否</td></tr>
|
||||
<tr><td>毛坯改制</td><td>直接使用已有毛坯进行改制</td><td>否</td></tr>
|
||||
<tr><td>非毛坯物料改制</td><td>使用仓库其他物料、半成品或成品改制</td><td>是</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>说明:</p>
|
||||
<ul><li>“原现自制订单”指当前已经存在的自制订单或自制零件,改制时不需要额外从仓库领料。</li><li>“毛坯改制”指直接使用毛坯进行改制,不额外生成领料单。</li><li>“非毛坯物料改制”指改制需要领用库存中的非毛坯物料,需要生成领料单并由仓库出库。</li></ul>
|
||||
<h2>5. 领料规则</h2>
|
||||
<h3>5.1 领料判断条件</h3>
|
||||
<p>领料时增加判断:</p>
|
||||
<pre><code>如果是改制订单,并且使用的物料不是毛坯,则生成领料单,由仓库物料出库。
|
||||
如果是原现自制订单改制,或者直接使用毛坯改制,则不生成领料单。</code></pre>
|
||||
<p>规则可表达为:</p>
|
||||
<pre><code>是否生成领料单 =
|
||||
是否改制订单 === 1
|
||||
且 改制来源类型 === 非毛坯物料改制
|
||||
且 是否毛坯 !== 1</code></pre>
|
||||
<h3>5.2 生成领料单场景</h3>
|
||||
<p>以下场景需要生成领料单:</p>
|
||||
<ul><li>改制订单使用库存半成品。</li><li>改制订单使用库存成品。</li><li>改制订单使用其他非毛坯物料。</li><li>改制订单指定的物料需要仓库出库。</li></ul>
|
||||
<p>生成后流程:</p>
|
||||
<p>1. 技术中心发起改制订单。 2. 系统判断需要领料。 3. 生成领料单。 4. 仓库根据领料单出库。 5. 出库完成后,精工车间继续生产、工艺、派工。</p>
|
||||
<h3>5.3 不生成领料单场景</h3>
|
||||
<p>以下场景不生成领料单:</p>
|
||||
<ul><li>原现自制订单改制。</li><li>直接使用毛坯改制。</li><li>改制对象已经在精工车间现场,不需要仓库出库。</li></ul>
|
||||
<p>不生成领料单时:</p>
|
||||
<ul><li>改制订单直接进入精工生产任务。</li><li>生产任务查询可查看。</li><li>车间派工可查看并派工。</li></ul>
|
||||
<h3>5.4 领料状态字段</h3>
|
||||
<p>建议改制订单增加以下字段:</p>
|
||||
<table>
|
||||
<thead><tr><th>字段名</th><th>说明</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>是否需要领料</td><td>1 是,0 否</td></tr>
|
||||
<tr><td>是否已生成领料单</td><td>1 是,0 否</td></tr>
|
||||
<tr><td>领料单号</td><td>生成的领料单编号</td></tr>
|
||||
<tr><td>领料状态</td><td>未生成、待出库、已出库、已取消</td></tr>
|
||||
<tr><td>出库日期</td><td>仓库出库日期</td></tr>
|
||||
<tr><td>出库人</td><td>仓库操作人</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2>6. 业务流程</h2>
|
||||
<h3>6.1 技术中心发起改制订单</h3>
|
||||
<p>用户进入技术中心“改制订单发起”页面。</p>
|
||||
<p>查询原始数据:</p>
|
||||
<ul><li>订单编号</li><li>产品/部件名称</li><li>零件名称</li><li>图号</li><li>原自制订单</li><li>库存物料</li><li>毛坯物料</li></ul>
|
||||
<p>发起改制时填写:</p>
|
||||
<ul><li>改制订单号</li><li>原订单编号</li><li>原零件名称</li><li>原零件图号</li><li>改制零件名称</li><li>改制零件图号</li><li>改制数量</li><li>改制来源类型</li><li>是否毛坯</li><li>物料编号</li><li>物料名称</li><li>改制原因</li><li>改制要求</li><li>技术备注</li><li>精工期限</li></ul>
|
||||
<p>提交时校验:</p>
|
||||
<ul><li>改制数量必须大于 0。</li><li>改制来源类型不能为空。</li><li>改制原因不能为空。</li><li>改制要求不能为空。</li><li>精工期限不能为空。</li><li>如果来源类型为非毛坯物料改制,必须选择物料编号。</li></ul>
|
||||
<h3>6.2 后端生成改制订单</h3>
|
||||
<p>提交后,后端需要同时处理:</p>
|
||||
<ul><li>写入改制订单主记录。</li><li>根据改制来源类型判断是否生成领料单。</li><li>生成精工车间生产任务。</li><li>写入任务类型为 <code>改制</code>。</li><li>关联改制订单号和新工艺计划流水号。</li></ul>
|
||||
<h3>6.3 进入精工车间生产任务查询</h3>
|
||||
<p>改制订单生成后,应能在现有接口中查到:</p>
|
||||
<pre><code>精工车间_生成任务_查询数据</code></pre>
|
||||
<p>建议返回字段增加:</p>
|
||||
<ul><li>任务类型</li><li>是否改制</li><li>改制订单号</li><li>改制来源类型</li><li>是否需要领料</li><li>领料状态</li><li>改制原因</li><li>改制要求</li></ul>
|
||||
<p>生产任务查询页面显示:</p>
|
||||
<ul><li><code>任务类型 = 改制</code></li><li>若 <code>是否需要领料 = 1</code> 且 <code>领料状态 !== 已出库</code>,可显示领料状态提示。</li></ul>
|
||||
<p>是否允许工艺/派工,需要按业务决定:</p>
|
||||
<ul><li>如果非毛坯物料改制必须先出库,建议未出库前允许制定工艺,但不允许派工。</li><li>如果现场允许先派工后补出库,则只做提示,不阻断派工。</li></ul>
|
||||
<p>建议采用更稳妥规则:</p>
|
||||
<pre><code>需要领料且未出库:允许制定工艺,不允许派工。
|
||||
不需要领料:正常工艺、派工。
|
||||
需要领料且已出库:正常工艺、派工。</code></pre>
|
||||
<h3>6.4 制定工艺</h3>
|
||||
<p>改制订单在生产任务查询中点击 <code>工艺</code>,进入现有:</p>
|
||||
<pre><code>/SeikoWorkshop/DevelopProcess</code></pre>
|
||||
<p>工艺规则:</p>
|
||||
<ul><li>改制订单必须生成新的工艺计划流水号。</li><li>不覆盖原自制订单或原零件工艺。</li><li>可支持从原工艺复制后调整。</li><li>工艺保存后,任务状态进入 <code>工艺完成</code>。</li></ul>
|
||||
<h3>6.5 车间派工</h3>
|
||||
<p>工艺完成后进入现有车间派工页面:</p>
|
||||
<pre><code>src/views/SeikoWorkshop/WorkshopAssignment/index.vue</code></pre>
|
||||
<p>现有查询接口:</p>
|
||||
<pre><code>精工车间_车间派工_查询</code></pre>
|
||||
<p>改制订单派工前判断:</p>
|
||||
<ul><li>不需要领料:允许派工。</li><li>需要领料且已出库:允许派工。</li><li>需要领料但未出库:禁止派工,并提示“改制订单物料未出库,不能派工”。</li></ul>
|
||||
<p>派工明细继续复用现有接口:</p>
|
||||
<pre><code>车间生产管理工艺_零件工序_已派工查询
|
||||
车间生产管理工艺_零件工序_派工_工序查询
|
||||
车间生产管理工艺_零件工序_派工
|
||||
车间生产管理工艺_零件工序_取消派工</code></pre>
|
||||
<h3>6.6 仓库出库</h3>
|
||||
<p>当改制订单需要领料时,系统生成领料单。</p>
|
||||
<p>仓库根据领料单完成出库后,需要回写:</p>
|
||||
<ul><li>领料状态 = 已出库</li><li>出库日期</li><li>出库人</li><li>出库数量</li></ul>
|
||||
<p>出库完成后,精工车间派工限制解除。</p>
|
||||
<h3>6.7 加工和完工</h3>
|
||||
<p>改制订单派工后,继续走现有精工车间加工流程:</p>
|
||||
<ul><li>工序派工</li><li>扫码加工</li><li>完工报工</li><li>质检</li><li>零件追溯</li><li>工时统计</li></ul>
|
||||
<p>完工后改制记录状态同步为:</p>
|
||||
<pre><code>已完成</code></pre>
|
||||
<h2>7. 数据字段设计</h2>
|
||||
<h3>7.1 改制订单主记录字段</h3>
|
||||
<table>
|
||||
<thead><tr><th>字段名</th><th>说明</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>改制订单号</td><td>改制业务编号</td></tr>
|
||||
<tr><td>原订单编号</td><td>原订单编号</td></tr>
|
||||
<tr><td>原订单流水号</td><td>原订单流水号</td></tr>
|
||||
<tr><td>原组件流水号</td><td>原组件流水号</td></tr>
|
||||
<tr><td>原基本件流水号</td><td>原零件流水号</td></tr>
|
||||
<tr><td>原工艺计划流水号</td><td>原工艺计划流水号</td></tr>
|
||||
<tr><td>原零件名称</td><td>改制前零件名称</td></tr>
|
||||
<tr><td>原零件图号</td><td>改制前零件图号</td></tr>
|
||||
<tr><td>原数量</td><td>原数量</td></tr>
|
||||
<tr><td>改制零件名称</td><td>改制后零件名称</td></tr>
|
||||
<tr><td>改制零件图号</td><td>改制后零件图号</td></tr>
|
||||
<tr><td>改制数量</td><td>改制数量</td></tr>
|
||||
<tr><td>改制来源类型</td><td>原现自制订单、毛坯改制、非毛坯物料改制</td></tr>
|
||||
<tr><td>是否毛坯</td><td>1 是,0 否</td></tr>
|
||||
<tr><td>物料编号</td><td>使用物料编号</td></tr>
|
||||
<tr><td>物料名称</td><td>使用物料名称</td></tr>
|
||||
<tr><td>物料流水号</td><td>使用物料流水号</td></tr>
|
||||
<tr><td>是否需要领料</td><td>1 是,0 否</td></tr>
|
||||
<tr><td>是否已生成领料单</td><td>1 是,0 否</td></tr>
|
||||
<tr><td>领料单号</td><td>领料单编号</td></tr>
|
||||
<tr><td>领料状态</td><td>未生成、待出库、已出库、已取消</td></tr>
|
||||
<tr><td>改制原因</td><td>改制原因</td></tr>
|
||||
<tr><td>改制要求</td><td>改制要求</td></tr>
|
||||
<tr><td>技术备注</td><td>技术备注</td></tr>
|
||||
<tr><td>精工期限</td><td>精工完工期限</td></tr>
|
||||
<tr><td>新基本件流水号</td><td>改制任务生成的新零件流水号</td></tr>
|
||||
<tr><td>新工艺计划流水号</td><td>改制任务生成的新工艺计划流水号</td></tr>
|
||||
<tr><td>发起人</td><td>当前用户 ID</td></tr>
|
||||
<tr><td>发起日期</td><td>发起时间</td></tr>
|
||||
<tr><td>状态</td><td>改制订单状态</td></tr>
|
||||
<tr><td>是否启用</td><td>逻辑删除标识</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3>7.2 改制订单状态</h3>
|
||||
<table>
|
||||
<thead><tr><th>状态</th><th>说明</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>待领料</td><td>需要领料,领料单未出库</td></tr>
|
||||
<tr><td>待工艺</td><td>不需要领料或已出库,等待制定工艺</td></tr>
|
||||
<tr><td>工艺完成</td><td>工艺已保存,等待派工</td></tr>
|
||||
<tr><td>待派工</td><td>工艺完成且满足派工条件</td></tr>
|
||||
<tr><td>加工中</td><td>已派工或已开始加工</td></tr>
|
||||
<tr><td>已完成</td><td>改制任务完工</td></tr>
|
||||
<tr><td>已取消</td><td>改制订单取消</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>说明:</p>
|
||||
<ul><li>如果不需要领料,提交后可直接进入 <code>待工艺</code>。</li><li>如果需要领料,提交后进入 <code>待领料</code>。</li><li>仓库出库后从 <code>待领料</code> 转为 <code>待工艺</code> 或保持生产任务状态,由查询时关联显示。</li></ul>
|
||||
<h2>8. API 设计</h2>
|
||||
<p>项目请求继续使用:</p>
|
||||
<pre><code>this.CreateData(type, name, param, pageSize, pageCurrent)
|
||||
this.ExecDatabase(Data)</code></pre>
|
||||
<h3>8.1 技术中心查询可改制对象</h3>
|
||||
<pre><code>var Data = this.CreateData('11', '技术中心_改制订单_可改制对象_查询', param, this.pageSize, this.pageCurrent)</code></pre>
|
||||
<h3>8.2 技术中心发起改制订单</h3>
|
||||
<pre><code>var Data = this.CreateData('12', '技术中心_改制订单_发起改制', param)</code></pre>
|
||||
<p>参数建议:</p>
|
||||
<table>
|
||||
<thead><tr><th>参数名</th><th>说明</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>原订单流水号</td><td>原订单流水号</td></tr>
|
||||
<tr><td>原组件流水号</td><td>原组件流水号</td></tr>
|
||||
<tr><td>原基本件流水号</td><td>原基本件流水号</td></tr>
|
||||
<tr><td>原工艺计划流水号</td><td>原工艺计划流水号</td></tr>
|
||||
<tr><td>原订单编号</td><td>原订单编号</td></tr>
|
||||
<tr><td>原零件名称</td><td>原零件名称</td></tr>
|
||||
<tr><td>原零件图号</td><td>原零件图号</td></tr>
|
||||
<tr><td>改制零件名称</td><td>改制零件名称</td></tr>
|
||||
<tr><td>改制零件图号</td><td>改制零件图号</td></tr>
|
||||
<tr><td>改制数量</td><td>改制数量</td></tr>
|
||||
<tr><td>改制来源类型</td><td>原现自制订单、毛坯改制、非毛坯物料改制</td></tr>
|
||||
<tr><td>是否毛坯</td><td>是否毛坯</td></tr>
|
||||
<tr><td>物料流水号</td><td>使用物料流水号</td></tr>
|
||||
<tr><td>物料编号</td><td>物料编号</td></tr>
|
||||
<tr><td>物料名称</td><td>物料名称</td></tr>
|
||||
<tr><td>改制原因</td><td>改制原因</td></tr>
|
||||
<tr><td>改制要求</td><td>改制要求</td></tr>
|
||||
<tr><td>技术备注</td><td>技术备注</td></tr>
|
||||
<tr><td>精工期限</td><td>精工期限</td></tr>
|
||||
<tr><td>发起人</td><td>当前用户 ID</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>后端处理结果:</p>
|
||||
<ul><li>生成改制订单。</li><li>判断是否生成领料单。</li><li>生成精工生产任务。</li><li>返回 <code>result</code>、<code>改制订单号</code>、<code>领料单号</code>、<code>是否需要领料</code>。</li></ul>
|
||||
<h3>8.3 改制记录查询</h3>
|
||||
<pre><code>var Data = this.CreateData('11', '技术中心_改制订单_记录_查询', param, this.pageSize, this.pageCurrent)</code></pre>
|
||||
<h3>8.4 改制订单详情</h3>
|
||||
<pre><code>var Data = this.CreateData('11', '技术中心_改制订单_详情_查询', param)</code></pre>
|
||||
<h3>8.5 取消改制订单</h3>
|
||||
<pre><code>var Data = this.CreateData('12', '技术中心_改制订单_取消', param)</code></pre>
|
||||
<p>取消前后端需要校验:</p>
|
||||
<ul><li>未派工可以取消。</li><li>已派工未加工,需要先取消派工。</li><li>已加工、已有质检记录或已完成,不允许取消。</li><li>已生成领料单且已出库,不允许直接取消,需要走退料或异常处理。</li></ul>
|
||||
<h2>9. 现有接口扩展</h2>
|
||||
<h3>9.1 生产任务查询接口</h3>
|
||||
<p>现有接口:</p>
|
||||
<pre><code>精工车间_生成任务_查询数据</code></pre>
|
||||
<p>新增查询参数:</p>
|
||||
<table>
|
||||
<thead><tr><th>参数名</th><th>说明</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>任务类型\_check</td><td>是否按任务类型过滤</td></tr>
|
||||
<tr><td>任务类型</td><td>全部、正常、改制、报废补投</td></tr>
|
||||
<tr><td>领料状态\_check</td><td>是否按领料状态过滤</td></tr>
|
||||
<tr><td>领料状态</td><td>待出库、已出库、不需要领料</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>新增返回字段:</p>
|
||||
<table>
|
||||
<thead><tr><th>字段名</th><th>说明</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>任务类型</td><td>正常、改制、报废补投</td></tr>
|
||||
<tr><td>是否改制</td><td>1 是,0 否</td></tr>
|
||||
<tr><td>改制订单号</td><td>改制订单编号</td></tr>
|
||||
<tr><td>改制来源类型</td><td>原现自制订单、毛坯改制、非毛坯物料改制</td></tr>
|
||||
<tr><td>是否需要领料</td><td>1 是,0 否</td></tr>
|
||||
<tr><td>领料状态</td><td>未生成、待出库、已出库、已取消</td></tr>
|
||||
<tr><td>领料单号</td><td>领料单号</td></tr>
|
||||
<tr><td>改制原因</td><td>改制原因</td></tr>
|
||||
<tr><td>改制要求</td><td>改制要求</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3>9.2 车间派工查询接口</h3>
|
||||
<p>现有接口:</p>
|
||||
<pre><code>精工车间_车间派工_查询</code></pre>
|
||||
<p>新增查询参数:</p>
|
||||
<table>
|
||||
<thead><tr><th>参数名</th><th>说明</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>任务类型\_check</td><td>是否按任务类型过滤</td></tr>
|
||||
<tr><td>任务类型</td><td>全部、正常、改制、报废补投</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>新增返回字段:</p>
|
||||
<table>
|
||||
<thead><tr><th>字段名</th><th>说明</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>任务类型</td><td>正常、改制、报废补投</td></tr>
|
||||
<tr><td>是否改制</td><td>1 是,0 否</td></tr>
|
||||
<tr><td>改制订单号</td><td>改制订单编号</td></tr>
|
||||
<tr><td>改制来源类型</td><td>改制来源类型</td></tr>
|
||||
<tr><td>是否需要领料</td><td>1 是,0 否</td></tr>
|
||||
<tr><td>领料状态</td><td>领料状态</td></tr>
|
||||
<tr><td>领料单号</td><td>领料单号</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>派工前端限制:</p>
|
||||
<pre><code>如果 是否改制 = 1 且 是否需要领料 = 1 且 领料状态 != 已出库,则不允许派工。</code></pre>
|
||||
<h2>10. 前端交互调整</h2>
|
||||
<h3>10.1 技术中心改制订单发起页面</h3>
|
||||
<p>查询条件:</p>
|
||||
<ul><li>订单编号</li><li>零件名称</li><li>图号</li><li>物料编号</li><li>物料名称</li><li>改制来源类型</li></ul>
|
||||
<p>表格列:</p>
|
||||
<ul><li>订单编号</li><li>产品/部件名称</li><li>零件名称</li><li>零件图号</li><li>数量</li><li>当前状态</li><li>来源类型</li><li>物料编号</li><li>物料名称</li><li>操作</li></ul>
|
||||
<p>操作:</p>
|
||||
<ul><li>发起改制</li><li>图纸</li><li>PLM传入工艺</li><li>追溯</li></ul>
|
||||
<p>发起改制弹窗:</p>
|
||||
<ul><li>原订单编号</li><li>原零件名称</li><li>原零件图号</li><li>改制零件名称</li><li>改制零件图号</li><li>改制数量</li><li>改制来源类型</li><li>是否毛坯</li><li>物料编号</li><li>物料名称</li><li>改制原因</li><li>改制要求</li><li>技术备注</li><li>精工期限</li></ul>
|
||||
<h3>10.2 生产任务查询页面</h3>
|
||||
<p>新增筛选:</p>
|
||||
<pre><code>任务类型:全部 / 正常 / 改制 / 报废补投
|
||||
领料状态:全部 / 不需要领料 / 待出库 / 已出库</code></pre>
|
||||
<p>新增列:</p>
|
||||
<ul><li>任务类型</li><li>改制订单号</li><li>改制来源类型</li><li>领料状态</li></ul>
|
||||
<p>显示建议:</p>
|
||||
<pre><code><el-tag type="warning" size="mini">改制</el-tag>
|
||||
<el-tag type="danger" size="mini">待出库</el-tag>
|
||||
<el-tag type="success" size="mini">已出库</el-tag>
|
||||
<el-tag type="info" size="mini">不需要领料</el-tag></code></pre>
|
||||
<h3>10.3 车间派工页面</h3>
|
||||
<p>新增筛选:</p>
|
||||
<pre><code>任务类型:全部 / 正常 / 改制 / 报废补投</code></pre>
|
||||
<p>新增列:</p>
|
||||
<ul><li>任务类型</li><li>改制订单号</li><li>领料状态</li></ul>
|
||||
<p>派工按钮或派工操作前增加判断:</p>
|
||||
<pre><code>if (Number(row.是否改制) === 1 && Number(row.是否需要领料) === 1 && row.领料状态 !== '已出库') {
|
||||
this.$message.warning('改制订单物料未出库,不能派工')
|
||||
return
|
||||
}</code></pre>
|
||||
<h3>10.4 改制记录查询页面</h3>
|
||||
<p>查询条件:</p>
|
||||
<ul><li>改制订单号</li><li>原订单编号</li><li>零件名称或图号</li><li>改制来源类型</li><li>领料状态</li><li>改制状态</li><li>发起日期</li><li>发起人</li></ul>
|
||||
<p>表格列:</p>
|
||||
<ul><li>改制订单号</li><li>状态</li><li>原订单编号</li><li>原零件名称</li><li>原零件图号</li><li>改制零件名称</li><li>改制零件图号</li><li>改制数量</li><li>改制来源类型</li><li>是否需要领料</li><li>领料单号</li><li>领料状态</li><li>改制原因</li><li>发起人</li><li>发起日期</li><li>精工期限</li><li>完成日期</li><li>操作</li></ul>
|
||||
<p>操作:</p>
|
||||
<ul><li>详情</li><li>生产任务</li><li>派工</li><li>追溯</li><li>取消</li></ul>
|
||||
<h2>11. 菜单配置</h2>
|
||||
<p>建议后端菜单配置:</p>
|
||||
<pre><code>技术中心
|
||||
改制订单发起
|
||||
改制记录查询</code></pre>
|
||||
<p>组件路径:</p>
|
||||
<pre><code>TechnologyCenter/PartModificationOrder/index
|
||||
TechnologyCenter/PartModificationRecord/index</code></pre>
|
||||
<p>精工车间不新增发起入口,只扩展现有页面:</p>
|
||||
<pre><code>SeikoWorkshop/ProductionTaskQuery/index
|
||||
SeikoWorkshop/WorkshopAssignment/index</code></pre>
|
||||
<h2>12. 实施顺序</h2>
|
||||
<p>建议按以下顺序实施:</p>
|
||||
<p>1. 后端新增改制订单主记录表。 2. 后端新增技术中心发起改制订单接口。 3. 后端在发起接口中加入领料判断规则。 4. 后端按规则生成或不生成领料单。 5. 后端生成标准精工生产任务,并标记 <code>任务类型 = 改制</code>。 6. 扩展生产任务查询接口,返回改制和领料字段。 7. 扩展车间派工查询接口,返回改制和领料字段。 8. 前端新增技术中心改制订单发起页面。 9. 前端新增改制记录查询页面。 10. 前端修改生产任务查询页面,增加任务类型和领料状态显示。 11. 前端修改车间派工页面,增加改制任务显示和派工前领料状态校验。 12. 联调从技术中心发起、领料判断、仓库出库、精工工艺、车间派工、加工完工、记录查询的完整流程。</p>
|
||||
<h2>13. 风险点</h2>
|
||||
<h3>13.1 领料判断风险</h3>
|
||||
<p>改制订单是否生成领料单,必须以后端判断为准。</p>
|
||||
<p>前端可以显示和提示,但不能只依赖前端判断,避免绕过仓库出库流程。</p>
|
||||
<h3>13.2 派工前物料状态风险</h3>
|
||||
<p>如果改制订单需要仓库出库,但尚未出库,直接派工会导致车间无物料加工。</p>
|
||||
<p>建议车间派工接口或派工保存接口再次校验:</p>
|
||||
<pre><code>需要领料且未出库,不允许派工。</code></pre>
|
||||
<h3>13.3 原任务数据覆盖风险</h3>
|
||||
<p>改制订单必须生成新的生产任务和新的工艺计划流水号。</p>
|
||||
<p>不能直接覆盖原自制订单或原零件工艺,否则会影响原订单追溯、工时和质量记录。</p>
|
||||
<h3>13.4 取消改制风险</h3>
|
||||
<p>已生成领料单、已出库、已派工或已加工的改制订单取消规则需要严格控制。</p>
|
||||
<p>建议:</p>
|
||||
<ul><li>未出库、未派工:允许取消。</li><li>已出库:需要退料后取消。</li><li>已派工未加工:先取消派工再取消。</li><li>已加工:不允许取消,只能走异常处理。</li></ul>
|
||||
<h3>13.5 统计口径风险</h3>
|
||||
<p>改制订单进入精工生产任务后,会影响生产任务数量、工时统计、完工统计。</p>
|
||||
<p>建议所有统计接口增加任务类型维度:</p>
|
||||
<pre><code>正常
|
||||
改制
|
||||
报废补投</code></pre>
|
||||
<h2>14. 总结</h2>
|
||||
<p>本方案采用:</p>
|
||||
<pre><code>技术中心发起改制订单,精工车间承接生产,仓库按需出库,改制记录统一查询。</code></pre>
|
||||
<p>关键规则:</p>
|
||||
<ul><li>技术中心新增组件发起改制订单。</li><li>改制订单生成后进入精工车间生产任务查询。</li><li>改制订单工艺和派工复用现有精工流程。</li><li>领料时如果是改制订单,并且使用物料不是毛坯,则生成领料单,由仓库物料出库。</li><li>如果是原现自制订单改制,或者直接使用毛坯改制,则不生成领料单。</li><li>改制记录查询独立展示全流程状态。</li></ul>
|
||||
</body>
|
||||
</html>
|
||||
BIN
part-modification-plan.pdf
Normal file
397
scripts/create_warehouse_post_implementation_manual.py
Normal file
@@ -0,0 +1,397 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""修改人:Ld 修改时间:2026-07-31 09:04:47; 生成库房管理实施后说明书与推进方案。"""
|
||||
|
||||
from docx import Document
|
||||
from docx.enum.section import WD_SECTION_START
|
||||
from docx.enum.table import WD_ALIGN_VERTICAL
|
||||
from docx.enum.text import WD_ALIGN_PARAGRAPH
|
||||
from docx.oxml import OxmlElement
|
||||
from docx.oxml.ns import qn
|
||||
from docx.shared import Cm, Pt, RGBColor
|
||||
|
||||
|
||||
OUTPUT = r"D:\景耀\JY1.0\docs\库房管理\库房管理方案实施后说明书与推进方案.docx"
|
||||
MODIFY_TIME = "2026-07-31 09:04:47"
|
||||
|
||||
|
||||
def set_cell_shading(cell, fill):
|
||||
tc_pr = cell._tc.get_or_add_tcPr()
|
||||
shd = OxmlElement("w:shd")
|
||||
shd.set(qn("w:fill"), fill)
|
||||
tc_pr.append(shd)
|
||||
|
||||
|
||||
def set_cell_width(cell, width_cm):
|
||||
tc_pr = cell._tc.get_or_add_tcPr()
|
||||
tc_w = OxmlElement("w:tcW")
|
||||
tc_w.set(qn("w:w"), str(int(width_cm * 567)))
|
||||
tc_w.set(qn("w:type"), "dxa")
|
||||
tc_pr.append(tc_w)
|
||||
|
||||
|
||||
def set_cell_text(cell, text, bold=False, color=None):
|
||||
cell.text = ""
|
||||
p = cell.paragraphs[0]
|
||||
p.paragraph_format.space_after = Pt(0)
|
||||
run = p.add_run(str(text))
|
||||
run.font.name = "微软雅黑"
|
||||
run._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
|
||||
run.font.size = Pt(9)
|
||||
run.bold = bold
|
||||
if color:
|
||||
run.font.color.rgb = RGBColor.from_string(color)
|
||||
cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER
|
||||
|
||||
|
||||
def add_table(doc, headers, rows, widths=None):
|
||||
table = doc.add_table(rows=1, cols=len(headers))
|
||||
table.style = "Table Grid"
|
||||
table.autofit = False
|
||||
header_cells = table.rows[0].cells
|
||||
for i, header in enumerate(headers):
|
||||
set_cell_text(header_cells[i], header, bold=True, color="0B2545")
|
||||
set_cell_shading(header_cells[i], "E8EEF5")
|
||||
if widths:
|
||||
set_cell_width(header_cells[i], widths[i])
|
||||
for row in rows:
|
||||
cells = table.add_row().cells
|
||||
for i, value in enumerate(row):
|
||||
set_cell_text(cells[i], value)
|
||||
if widths:
|
||||
set_cell_width(cells[i], widths[i])
|
||||
doc.add_paragraph()
|
||||
return table
|
||||
|
||||
|
||||
def add_heading(doc, text, level=1):
|
||||
p = doc.add_heading(text, level=level)
|
||||
for run in p.runs:
|
||||
run.font.name = "微软雅黑"
|
||||
run._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
|
||||
run.font.color.rgb = RGBColor(46, 116, 181) if level <= 2 else RGBColor(31, 77, 120)
|
||||
return p
|
||||
|
||||
|
||||
def add_para(doc, text, bold_prefix=None):
|
||||
p = doc.add_paragraph()
|
||||
p.paragraph_format.space_after = Pt(6)
|
||||
p.paragraph_format.line_spacing = 1.25
|
||||
if bold_prefix and text.startswith(bold_prefix):
|
||||
r1 = p.add_run(bold_prefix)
|
||||
r1.bold = True
|
||||
r1.font.name = "微软雅黑"
|
||||
r1._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
|
||||
r1.font.size = Pt(10.5)
|
||||
text = text[len(bold_prefix):]
|
||||
r = p.add_run(text)
|
||||
r.font.name = "微软雅黑"
|
||||
r._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
|
||||
r.font.size = Pt(10.5)
|
||||
return p
|
||||
|
||||
|
||||
def add_bullets(doc, items):
|
||||
for item in items:
|
||||
p = doc.add_paragraph(style="List Bullet")
|
||||
p.paragraph_format.space_after = Pt(4)
|
||||
p.paragraph_format.line_spacing = 1.25
|
||||
run = p.add_run(item)
|
||||
run.font.name = "微软雅黑"
|
||||
run._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
|
||||
run.font.size = Pt(10.5)
|
||||
|
||||
|
||||
def add_numbered(doc, items):
|
||||
for item in items:
|
||||
p = doc.add_paragraph(style="List Number")
|
||||
p.paragraph_format.space_after = Pt(4)
|
||||
p.paragraph_format.line_spacing = 1.25
|
||||
run = p.add_run(item)
|
||||
run.font.name = "微软雅黑"
|
||||
run._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
|
||||
run.font.size = Pt(10.5)
|
||||
|
||||
|
||||
def build_doc():
|
||||
doc = Document()
|
||||
section = doc.sections[0]
|
||||
section.top_margin = Cm(2.2)
|
||||
section.bottom_margin = Cm(2.0)
|
||||
section.left_margin = Cm(2.2)
|
||||
section.right_margin = Cm(2.2)
|
||||
section.header_distance = Cm(1.25)
|
||||
section.footer_distance = Cm(1.25)
|
||||
|
||||
styles = doc.styles
|
||||
normal = styles["Normal"]
|
||||
normal.font.name = "微软雅黑"
|
||||
normal._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
|
||||
normal.font.size = Pt(10.5)
|
||||
normal.paragraph_format.space_after = Pt(6)
|
||||
normal.paragraph_format.line_spacing = 1.25
|
||||
|
||||
title = doc.add_paragraph()
|
||||
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
run = title.add_run("库房管理方案实施后说明书与推进方案")
|
||||
run.bold = True
|
||||
run.font.name = "微软雅黑"
|
||||
run._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
|
||||
run.font.size = Pt(20)
|
||||
run.font.color.rgb = RGBColor(11, 37, 69)
|
||||
|
||||
sub = doc.add_paragraph()
|
||||
sub.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
run = sub.add_run("适用范围:JY1.0 测试库库房管理模块试运行、验收、推广")
|
||||
run.font.name = "微软雅黑"
|
||||
run._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
|
||||
run.font.size = Pt(10.5)
|
||||
run.font.color.rgb = RGBColor(85, 85, 85)
|
||||
|
||||
add_table(
|
||||
doc,
|
||||
["项目", "内容"],
|
||||
[
|
||||
["当前环境", "测试库 ERPTOOL_JY_20250826Back;正式库 ERPTOOL_JY 未修改"],
|
||||
["前端页面", "src/views/WarehouseManagement/WarehouseRoomManagement/index.vue"],
|
||||
["菜单路径", "WarehouseManagement/WarehouseRoomManagement;菜单标题:库房管理"],
|
||||
["实施原则", "新增隔离模块,复用原组件和稳定接口,不覆盖原仓储页面、原仓储管理过程"],
|
||||
["文档日期", "2026-07-31"],
|
||||
],
|
||||
[3.0, 12.5],
|
||||
)
|
||||
|
||||
add_heading(doc, "1. 实施后总体说明")
|
||||
add_para(
|
||||
doc,
|
||||
"本说明书用于库房管理模块实施后的使用、验收和推广。当前方案已经在测试库完成隔离落地,核心目标是把“库房-库区-库位-物料-库存流水”业务链路先走通,再逐步接入入库、出库、盘点等生产业务。",
|
||||
)
|
||||
add_bullets(
|
||||
doc,
|
||||
[
|
||||
"库房被定义为放置库位和物料的区域,库位是具体存放位置。",
|
||||
"库位归属按已有库位编码规则自动识别,不强制重建原库位数据。",
|
||||
"三楼仓库提供可点击可视化布局,按 8 排、每排 24 列、3 层展示。",
|
||||
"物料库位查询复用原稳定接口,并在新页面内补充库房归属,避免影响原物料库位功能。",
|
||||
"所有落地对象均先在测试库验证,正式库上线前必须完成数据核对和用户验收。",
|
||||
]
|
||||
)
|
||||
|
||||
add_heading(doc, "2. 已实施内容")
|
||||
add_heading(doc, "2.1 数据库对象", 2)
|
||||
add_table(
|
||||
doc,
|
||||
["类别", "对象", "实施说明"],
|
||||
[
|
||||
["新表", "库房管理_库房主文件", "保存库房编号、名称、类型、地址、状态、排数、列数、层数等信息。"],
|
||||
["新表", "库房管理_库区主文件", "保存库房下的库区信息,与库房主文件建立外键关系。"],
|
||||
["新表", "库房管理_业务记录", "保存库房相关业务记录,为后续出入库、盘点、移库追溯预留。"],
|
||||
["完善表", "库存管理_货位主文件", "补充库房流水号、库区流水号、排号、列号、层号、库位状态、库位容量、是否启用、修改人、修改时间。"],
|
||||
["索引", "库房库区排列层索引", "支持按库房、库区、排、列、层快速查询可视化库位。"],
|
||||
["同步过程", "库房管理_库位编码归属_同步", "按库位编码规则把原货位归属同步到二楼隔层、立库、三楼仓库。"],
|
||||
],
|
||||
[2.0, 4.3, 9.2],
|
||||
)
|
||||
|
||||
add_heading(doc, "2.2 已建立过程与接口策略", 2)
|
||||
add_table(
|
||||
doc,
|
||||
["过程/接口", "用途", "当前策略"],
|
||||
[
|
||||
["库房管理_库房_查询/保存/停用", "库房主数据维护", "测试库新增,前端库房管理页签调用。"],
|
||||
["库房管理_库区_查询/保存", "库房下库区维护", "测试库新增,前端库区/库位页签调用。"],
|
||||
["库房管理_库位_查询/保存", "库位列表维护和按布局建库位", "测试库新增,复用原货位表并补充库房字段。"],
|
||||
["库房管理_可视化库位_查询", "三楼仓库可视化布局", "默认三楼仓库,未建库位按 x-xx-xx-xx 生成预览编码。"],
|
||||
["仓储管理_物料库位_查询数据", "物料综合/正向/逆向查询", "复用原稳定接口,新页面内按编码规则补充库房归属。"],
|
||||
["库房管理_库存流水_查询", "出入库/盘点流水查询", "测试库新增,用于后续业务记录和追溯。"],
|
||||
],
|
||||
[4.3, 5.3, 5.9],
|
||||
)
|
||||
|
||||
add_heading(doc, "2.3 前端页面功能", 2)
|
||||
add_table(
|
||||
doc,
|
||||
["页签", "主要功能", "当前用途"],
|
||||
[
|
||||
["库房管理", "查询、新增、编辑、停用库房;查看库区数、库位数、有库存库位数。", "维护库房基础资料,作为库区和库位的上级。"],
|
||||
["库区/库位", "按库房、库区、库位名称、状态查询;新增/编辑库区和库位。", "完成库房对应库位维护。"],
|
||||
["三楼仓库可视化", "按层展示 8 排 x 24 列库位;点击库位查看状态或建库位。", "对照现场三楼仓库布局进行可视化操作。"],
|
||||
["物料综合查询", "综合、正向、逆向查询;支持全部库房或指定库房过滤。", "查询物料在哪些库位、某库位有哪些物料。"],
|
||||
["出入库/盘点流水", "按关键字、日期、库房查询业务流水。", "为后续出入库、盘点闭环提供追溯入口。"],
|
||||
],
|
||||
[3.0, 6.8, 5.7],
|
||||
)
|
||||
|
||||
add_heading(doc, "3. 库房与库位编码规则")
|
||||
add_table(
|
||||
doc,
|
||||
["库房", "库位编码格式", "示例", "系统处理"],
|
||||
[
|
||||
["二楼隔层仓库", "字母数字-数字", "A1-1、K2-18", "归属到二楼隔层库区,不参与三楼可视化网格。"],
|
||||
["立库仓库", "xx-xx-xx", "01-01-01、06-07-03", "归属到立库库区,可用于立库查询统计。"],
|
||||
["三楼仓库", "x-xx-xx-xx", "1-01-01-01", "参与三楼可视化布局,排、列、层按编码识别。"],
|
||||
["未归类库位", "不符合以上规则", "A000、耗材、毛坯库", "在物料综合查询中标识为未归类,后续由仓库确认是否纳入库房体系。"],
|
||||
],
|
||||
[3.2, 3.6, 3.0, 5.7],
|
||||
)
|
||||
|
||||
add_heading(doc, "4. 实施后业务操作说明")
|
||||
add_heading(doc, "4.1 建库房与建库位", 2)
|
||||
add_numbered(
|
||||
doc,
|
||||
[
|
||||
"进入“库房管理”页签,先维护库房编号、库房名称、库房类型、排数、每排列数、层数和状态。",
|
||||
"进入“库区/库位”页签,选择库房后维护库区,再维护具体库位。",
|
||||
"三楼仓库可进入“三楼仓库可视化”页签,点击未建库位,系统带出排、列、层和预览库位编号。",
|
||||
"已发生库存业务的库位不建议物理删除;如不再使用,应先移库清空,再停用。",
|
||||
],
|
||||
)
|
||||
add_heading(doc, "4.2 物料查询", 2)
|
||||
add_numbered(
|
||||
doc,
|
||||
[
|
||||
"综合查询:输入物料编码、名称、图号或库位关键字,可选择全部库房或指定库房。",
|
||||
"正向查询:用于回答“物料在哪个库位”,按物料信息定位所有有库存的库位。",
|
||||
"逆向查询:用于回答“哪个库位放置哪些物料”,可从三楼可视化库位直接跳转带入库位。",
|
||||
"查询结果显示物料编码、物料名称、图号或型号、库房、库区、库位、库存数量、批次号和库存状态。",
|
||||
],
|
||||
)
|
||||
add_heading(doc, "4.3 出入库与盘点衔接", 2)
|
||||
add_para(
|
||||
doc,
|
||||
"当前模块已经预留出入库/盘点流水入口。后续推进时,应把现有入库、出库、调拨、盘点业务的库存变动统一写入库房业务记录或可追溯流水,避免只改结果、不留过程。",
|
||||
)
|
||||
add_bullets(
|
||||
doc,
|
||||
[
|
||||
"入库:选择物料、数量、库房和库位,库存增加并写入入库流水。",
|
||||
"出库:校验库位库存充足后扣减,库存减少并写入出库流水。",
|
||||
"盘点:生成账面数,录入实盘数,差异确认后生成盘盈或盘亏调整流水。",
|
||||
"移库:原库位扣减、目标库位增加,同一业务写入移出和移入两条流水。",
|
||||
]
|
||||
)
|
||||
|
||||
add_heading(doc, "5. 数据流说明")
|
||||
add_table(
|
||||
doc,
|
||||
["数据流", "入口", "处理", "输出"],
|
||||
[
|
||||
["库房主数据", "库房管理页签", "写入库房主文件,维护状态和布局参数", "库房下拉、统计、库位归属依据"],
|
||||
["库区/库位数据", "库区/库位页签或可视化点击建库位", "写入原货位表扩展字段,保留原货位主键", "库位列表、可视化单元格、物料查询维度"],
|
||||
["原库位同步", "库位编码归属同步过程", "按编码规则回填库房、库区、排列层", "二楼、立库、三楼的库位归属清单"],
|
||||
["物料库位查询", "物料综合查询页签", "调用原稳定接口,再按编码规则补库房归属", "物料在哪、库位放什么的正逆向查询结果"],
|
||||
["业务流水", "入库、出库、盘点、移库后续接入", "写业务记录并关联物料、库位、数量变化", "出入库/盘点流水和追溯报表"],
|
||||
],
|
||||
[3.0, 3.8, 5.2, 3.8],
|
||||
)
|
||||
|
||||
add_heading(doc, "6. 验收标准")
|
||||
add_table(
|
||||
doc,
|
||||
["验收项", "验收方法", "通过标准"],
|
||||
[
|
||||
["不影响原功能", "原库位管理、原物料库位页面查询", "页面可正常打开,查询结果与实施前一致。"],
|
||||
["库房主数据", "新增、编辑、停用测试库房", "数据写入测试库,重复编号有校验,停用状态正确。"],
|
||||
["库位归属", "抽查 A1-1、01-01-01、1-01-01-01 等编码", "分别归属二楼隔层、立库、三楼仓库。"],
|
||||
["三楼可视化", "切换层号并点击库位", "展示 8 排、24 列、3 层,点击后显示库位明细。"],
|
||||
["物料正逆向查询", "按物料查库位、按库位查物料", "能返回库房、库区、库位和库存数量,不再出现 result=0。"],
|
||||
["构建验证", "执行前端 lint 和 build", "无编译错误;允许已有体积和 Browserslist 警告。"],
|
||||
],
|
||||
[3.2, 5.2, 7.1],
|
||||
)
|
||||
|
||||
add_heading(doc, "7. 推进方案")
|
||||
add_heading(doc, "7.1 推进原则", 2)
|
||||
add_bullets(
|
||||
doc,
|
||||
[
|
||||
"先测试库、再小范围试点、最后正式库上线。",
|
||||
"先查清现有库位数据,再让仓库人员确认库房归属。",
|
||||
"先上线查询和可视化,再逐步接入会改库存的入库、出库、盘点、移库。",
|
||||
"每一步都保留回退方案,正式库脚本上线前必须备份对象定义和关键数据。",
|
||||
]
|
||||
)
|
||||
add_heading(doc, "7.2 推进计划", 2)
|
||||
add_table(
|
||||
doc,
|
||||
["阶段", "工作内容", "责任角色", "预计工时", "交付物"],
|
||||
[
|
||||
["0. 方案确认", "确认库房定义、编码规则、菜单权限、试点范围。", "仓库主管、实施人员、开发", "4 小时", "确认记录和试点名单"],
|
||||
["1. 测试库核对", "核对三类库房、库区、库位归属;抽样检查物料库位。", "仓库主管、实施人员", "8 小时", "数据核对表"],
|
||||
["2. 页面试用", "仓库人员按实际业务试用库房、库区/库位、可视化、物料查询。", "仓库操作员、实施人员", "8 小时", "问题清单和优化记录"],
|
||||
["3. 数据清洗", "处理未归类库位、异常编码、重复或废弃库位。", "仓库主管、开发", "16 小时", "清洗脚本和确认清单"],
|
||||
["4. 培训与验收", "培训查询、建库位、可视化操作;按验收标准逐项签字。", "实施人员、关键用户", "8 小时", "培训签到和验收单"],
|
||||
["5. 正式库上线准备", "生成正式库脚本、备份对象、安排低峰上线窗口。", "开发、DBA/管理员", "8 小时", "上线脚本、回退脚本、备份记录"],
|
||||
["6. 正式上线", "执行正式库脚本、发布前端、验证菜单和查询。", "开发、实施人员", "8 小时", "上线记录和验证结果"],
|
||||
["7. 运行观察", "连续观察查询性能、用户反馈、出入库/盘点接入需求。", "仓库主管、开发", "16 小时", "试运行报告和二期清单"],
|
||||
],
|
||||
[2.2, 5.0, 3.0, 2.0, 3.3],
|
||||
)
|
||||
|
||||
add_heading(doc, "7.3 正式上线前检查清单", 2)
|
||||
add_bullets(
|
||||
doc,
|
||||
[
|
||||
"确认正式库脚本只包含已验收对象,不包含测试数据。",
|
||||
"确认原仓储页面和原存储过程未被覆盖。",
|
||||
"确认 `库存管理_货位主文件` 新增字段为兼容字段,不破坏原字段含义。",
|
||||
"确认菜单权限只授权给需要使用库房管理的角色。",
|
||||
"确认可回退:正式库执行前导出相关对象定义和关键表数据备份。",
|
||||
"确认上线后首日安排仓库关键用户和开发人员共同值守。",
|
||||
]
|
||||
)
|
||||
|
||||
add_heading(doc, "8. 风险与控制")
|
||||
add_table(
|
||||
doc,
|
||||
["风险", "表现", "控制措施"],
|
||||
[
|
||||
["库位编码不规范", "部分库位无法归属到二楼、立库、三楼", "输出未归类清单,由仓库确认后再批量修正。"],
|
||||
["用户误解默认库房", "综合查询只看到某一库房", "材料查询页提供独立“全部库房/指定库房”筛选。"],
|
||||
["接口兼容问题", "新建过程经接口返回 result=0", "查询类优先复用原稳定接口;新过程上线前单独做接口验证。"],
|
||||
["影响原功能", "原库位管理或物料库位页面异常", "原页面不改;新增模块隔离;上线前做原功能回归。"],
|
||||
["库存变动不可追溯", "只改库存结果,没有业务流水", "出入库、盘点、移库接入时必须同事务写库存变动流水。"],
|
||||
],
|
||||
[3.0, 5.0, 7.5],
|
||||
)
|
||||
|
||||
add_heading(doc, "9. 后续二期建议")
|
||||
add_bullets(
|
||||
doc,
|
||||
[
|
||||
"把采购入库、自制件入库、领料出库、退料、移库、盘点全部接入库房业务记录。",
|
||||
"为三楼可视化增加库位物料明细弹窗、颜色按库存/容量/异常区分。",
|
||||
"增加未归类库位治理页面,支持仓库人员批量指定库房和库区。",
|
||||
"增加库位容量、混放规则、冻结库存、异常库存预警。",
|
||||
"形成“库存账面数-库位现存-业务流水”三方核对报表。",
|
||||
]
|
||||
)
|
||||
|
||||
add_heading(doc, "10. 使用责任分工")
|
||||
add_table(
|
||||
doc,
|
||||
["角色", "职责"],
|
||||
[
|
||||
["仓库主管", "确认库房和库位规则,审核未归类库位,组织试点和验收。"],
|
||||
["仓库操作员", "按实际收发料和盘点场景试用页面,反馈无法落地的问题。"],
|
||||
["实施人员", "组织培训、收集问题、跟踪整改、推进验收。"],
|
||||
["开发人员", "维护测试库脚本、前端页面、接口兼容和上线回退方案。"],
|
||||
["系统管理员", "控制菜单权限、安排上线窗口、保存备份和发布记录。"],
|
||||
],
|
||||
[3.2, 12.3],
|
||||
)
|
||||
|
||||
add_para(doc, "修改人:Ld 修改时间:" + MODIFY_TIME + ";")
|
||||
|
||||
footer = section.footer.paragraphs[0]
|
||||
footer.alignment = WD_ALIGN_PARAGRAPH.RIGHT
|
||||
run = footer.add_run("库房管理方案实施后说明书")
|
||||
run.font.name = "微软雅黑"
|
||||
run._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
|
||||
run.font.size = Pt(9)
|
||||
run.font.color.rgb = RGBColor(85, 85, 85)
|
||||
|
||||
doc.save(OUTPUT)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
build_doc()
|
||||
321
scripts/generate_scheduling_optimization_doc.py
Normal file
@@ -0,0 +1,321 @@
|
||||
# 修改人:Ld 修改时间:2026-08-03 14:07:13; 生成排产优化方案 Word 文档。
|
||||
from docx import Document
|
||||
from docx.enum.section import WD_SECTION
|
||||
from docx.enum.table import WD_TABLE_ALIGNMENT, WD_CELL_VERTICAL_ALIGNMENT
|
||||
from docx.enum.text import WD_ALIGN_PARAGRAPH
|
||||
from docx.oxml import OxmlElement
|
||||
from docx.oxml.ns import qn
|
||||
from docx.shared import Inches, Pt, RGBColor
|
||||
|
||||
|
||||
OUTPUT = r"D:\景耀\JY1.0\docs\排产优化方案.docx"
|
||||
MOD_TIME = "2026-08-03 14:07:13"
|
||||
|
||||
|
||||
def set_run_font(run, size=11, bold=False, color=None, name="Calibri"):
|
||||
run.font.name = name
|
||||
run._element.rPr.rFonts.set(qn("w:ascii"), name)
|
||||
run._element.rPr.rFonts.set(qn("w:hAnsi"), name)
|
||||
run._element.rPr.rFonts.set(qn("w:eastAsia"), "Microsoft YaHei")
|
||||
run.font.size = Pt(size)
|
||||
run.bold = bold
|
||||
if color:
|
||||
run.font.color.rgb = RGBColor.from_string(color)
|
||||
|
||||
|
||||
def set_para_format(paragraph, before=0, after=6, line=1.10):
|
||||
paragraph.paragraph_format.space_before = Pt(before)
|
||||
paragraph.paragraph_format.space_after = Pt(after)
|
||||
paragraph.paragraph_format.line_spacing = line
|
||||
|
||||
|
||||
def add_heading(doc, text, level=1):
|
||||
p = doc.add_paragraph()
|
||||
set_para_format(p, before=16 if level == 1 else 10, after=8 if level == 1 else 5)
|
||||
r = p.add_run(text)
|
||||
if level == 1:
|
||||
set_run_font(r, size=16, bold=True, color="2E74B5")
|
||||
else:
|
||||
set_run_font(r, size=13, bold=True, color="2E74B5")
|
||||
return p
|
||||
|
||||
|
||||
def add_para(doc, text, bold_prefix=None):
|
||||
p = doc.add_paragraph()
|
||||
set_para_format(p)
|
||||
if bold_prefix and text.startswith(bold_prefix):
|
||||
r1 = p.add_run(bold_prefix)
|
||||
set_run_font(r1, bold=True)
|
||||
r2 = p.add_run(text[len(bold_prefix):])
|
||||
set_run_font(r2)
|
||||
else:
|
||||
r = p.add_run(text)
|
||||
set_run_font(r)
|
||||
return p
|
||||
|
||||
|
||||
def add_bullet(doc, text):
|
||||
p = doc.add_paragraph(style="List Bullet")
|
||||
set_para_format(p, after=4, line=1.167)
|
||||
r = p.add_run(text)
|
||||
set_run_font(r)
|
||||
return p
|
||||
|
||||
|
||||
def add_number(doc, text):
|
||||
p = doc.add_paragraph(style="List Number")
|
||||
set_para_format(p, after=4, line=1.167)
|
||||
r = p.add_run(text)
|
||||
set_run_font(r)
|
||||
return p
|
||||
|
||||
|
||||
def shade_cell(cell, fill):
|
||||
tc_pr = cell._tc.get_or_add_tcPr()
|
||||
shd = OxmlElement("w:shd")
|
||||
shd.set(qn("w:fill"), fill)
|
||||
tc_pr.append(shd)
|
||||
|
||||
|
||||
def set_cell_text(cell, text, bold=False, align=WD_ALIGN_PARAGRAPH.LEFT):
|
||||
cell.text = ""
|
||||
p = cell.paragraphs[0]
|
||||
p.alignment = align
|
||||
set_para_format(p, after=0, line=1.10)
|
||||
r = p.add_run(text)
|
||||
set_run_font(r, size=10.5, bold=bold)
|
||||
cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
|
||||
|
||||
|
||||
def add_table(doc, headers, rows, widths):
|
||||
table = doc.add_table(rows=1, cols=len(headers))
|
||||
table.alignment = WD_TABLE_ALIGNMENT.CENTER
|
||||
table.style = "Table Grid"
|
||||
for i, header in enumerate(headers):
|
||||
set_cell_text(table.rows[0].cells[i], header, bold=True, align=WD_ALIGN_PARAGRAPH.CENTER)
|
||||
shade_cell(table.rows[0].cells[i], "F2F4F7")
|
||||
table.rows[0].cells[i].width = Inches(widths[i])
|
||||
for row in rows:
|
||||
cells = table.add_row().cells
|
||||
for i, value in enumerate(row):
|
||||
set_cell_text(cells[i], str(value), align=WD_ALIGN_PARAGRAPH.LEFT if i > 0 else WD_ALIGN_PARAGRAPH.CENTER)
|
||||
cells[i].width = Inches(widths[i])
|
||||
doc.add_paragraph()
|
||||
return table
|
||||
|
||||
|
||||
def add_callout(doc, title, body):
|
||||
table = doc.add_table(rows=1, cols=1)
|
||||
table.alignment = WD_TABLE_ALIGNMENT.CENTER
|
||||
table.style = "Table Grid"
|
||||
cell = table.rows[0].cells[0]
|
||||
shade_cell(cell, "F4F6F9")
|
||||
p = cell.paragraphs[0]
|
||||
set_para_format(p, after=3)
|
||||
r = p.add_run(title)
|
||||
set_run_font(r, size=11, bold=True, color="1F4D78")
|
||||
p2 = cell.add_paragraph()
|
||||
set_para_format(p2, after=0)
|
||||
r2 = p2.add_run(body)
|
||||
set_run_font(r2, size=10.5)
|
||||
doc.add_paragraph()
|
||||
|
||||
|
||||
def main():
|
||||
doc = Document()
|
||||
section = doc.sections[0]
|
||||
section.top_margin = Inches(1)
|
||||
section.bottom_margin = Inches(1)
|
||||
section.left_margin = Inches(1)
|
||||
section.right_margin = Inches(1)
|
||||
section.header_distance = Inches(0.492)
|
||||
section.footer_distance = Inches(0.492)
|
||||
|
||||
styles = doc.styles
|
||||
normal = styles["Normal"]
|
||||
normal.font.name = "Calibri"
|
||||
normal._element.rPr.rFonts.set(qn("w:eastAsia"), "Microsoft YaHei")
|
||||
normal.font.size = Pt(11)
|
||||
normal.paragraph_format.space_after = Pt(6)
|
||||
normal.paragraph_format.line_spacing = 1.10
|
||||
|
||||
header = section.header.paragraphs[0]
|
||||
header.alignment = WD_ALIGN_PARAGRAPH.RIGHT
|
||||
set_para_format(header, after=0)
|
||||
rh = header.add_run("景耀 JY1.0 MES | 排产优化方案")
|
||||
set_run_font(rh, size=9, color="555555")
|
||||
|
||||
footer = section.footer.paragraphs[0]
|
||||
footer.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
rf = footer.add_run("内部方案讨论稿")
|
||||
set_run_font(rf, size=9, color="555555")
|
||||
|
||||
title = doc.add_paragraph()
|
||||
set_para_format(title, before=10, after=4)
|
||||
tr = title.add_run("排产优化方案")
|
||||
set_run_font(tr, size=24, bold=True, color="0B2545")
|
||||
|
||||
subtitle = doc.add_paragraph()
|
||||
set_para_format(subtitle, after=14)
|
||||
sr = subtitle.add_run("结合 JY1.0 现有销售合同、补货、生产计划、工序派工与设备任务链路")
|
||||
set_run_font(sr, size=12, color="555555")
|
||||
|
||||
meta = [
|
||||
["适用系统", "景耀 JY1.0 MES 前端(Vue 2 + Element UI)及 ASP.NET .ashx 后端"],
|
||||
["数据库范围", "测试库 ERPTOOL_JY_20250826Back;正式库 ERPTOOL_JY 上线前同步评审"],
|
||||
["方案版本", "V1.0"],
|
||||
["生成时间", MOD_TIME],
|
||||
]
|
||||
add_table(doc, ["项目", "说明"], meta, [1.5, 5.0])
|
||||
|
||||
add_callout(
|
||||
doc,
|
||||
"核心结论",
|
||||
"建议采用“两步走”:第一阶段先做订单补货可溯源、当前工序高亮、机台任务看板三项可视化闭环;第二阶段在数据稳定后接入有限产能、交期、设备状态、工序前后置约束的自动排产建议。这样能最大限度复用现有页面和 MESCommonBase.ashx 通信模式,避免一次性重构带来的风险。",
|
||||
)
|
||||
|
||||
add_heading(doc, "一、现有系统依据")
|
||||
add_para(doc, "本次方案基于代码结构和现有业务链路梳理,重点参考以下模块:")
|
||||
for item in [
|
||||
"仓储补货:src/views/WarehouseManagement/Replenishment/index.vue,已具备报缺补货、外购/自制补货中间表、提交补货、补货期限、补货图片、打回通知等能力。",
|
||||
"销售订单:src/views/SalesManagement/OrderInquiry/index.vue 与 OrderRelease/index.vue,已具备订单编号、合同类型、补货明细查询/修改、订单投产、订单分配等能力。",
|
||||
"销售合同:src/views/SalesManagement/SalesContractNew/index.vue 与 ContractSearchNew/index.vue,已具备合同编号、项目流水号、客户、合同状态和资料留存等合同主数据能力。",
|
||||
"生产计划:src/views/SeikoWorkshop/ProductionPlan/index.vue,已具备月度计划、状态、完成率、OP010-OP110 工序列和可视化看板雏形。",
|
||||
"生产任务查询与追溯:src/views/SeikoWorkshop/ProductionTaskQuery/index.vue,已具备任务状态、派工、零件追溯、工序明细、加工设备和工序状态变色能力。",
|
||||
"生产执行/派工:src/views/SeikoWorkshop/ProductionExecution/index.vue,已具备设备查询、工序信息查询、工序编辑及派工、上移/下移/插入/删除工序、工艺保存派工等能力。",
|
||||
"设备监控:src/views/SeikoWorkshop/EquipmentMonitoringNew/index.vue 与 ManufacturingCenter/EquipmentMonitoringNew/index.vue,已具备设备状态展示和设备状态分布图基础。",
|
||||
]:
|
||||
add_bullet(doc, item)
|
||||
|
||||
add_heading(doc, "二、目标与边界")
|
||||
add_para(doc, "本方案优先解决“计划看得见、任务找得到、来源追得回”的排产基础问题,再逐步进入算法优化。")
|
||||
add_table(
|
||||
doc,
|
||||
["目标", "说明", "优先级"],
|
||||
[
|
||||
["补货订单可溯源", "创建补货订单时必须关联销售合同或销售订单,后续可从补货单反查合同、客户、订单、零件、需求来源。", "P0"],
|
||||
["当前工序凸显", "生产计划和任务查询中对正在加工/待处理的当前工序做高亮、标签和进度提示,减少人工查找。", "P0"],
|
||||
["机台任务显示", "按设备/工位展示当前任务、下一任务、排队任务、预计开完工、异常状态,为排产调整提供现场视角。", "P1"],
|
||||
["排产算法建议", "在数据字段稳定后,按交期、工序顺序、设备能力、在制数量、设备状态给出推荐排产。", "P2"],
|
||||
],
|
||||
[1.25, 4.2, 1.05],
|
||||
)
|
||||
|
||||
add_heading(doc, "三、方案一:补货订单关联销售合同")
|
||||
add_para(doc, "现状:补货页面已能按物料选择补货并提交,但补货提交参数当前主要围绕“是否外购、操作者、补货期限、订单备注”;需求明细弹窗已能展示订单编号、需求量、客户。建议在补货创建时把合同/订单来源显式固化。")
|
||||
add_number(doc, "在补货单提交弹窗中增加“关联销售合同”选择框,支持合同编号、客户、订单编号模糊查询。")
|
||||
add_number(doc, "选择合同后,联动显示该合同下未完成订单;如用户从需求量明细进入,可自动带入订单编号和合同编号。")
|
||||
add_number(doc, "补货中间表增加合同与订单字段,选入物料时即记录来源;提交生成补货单时把来源写入补货单主表和明细表。")
|
||||
add_number(doc, "补货查询、新补货查询、销售订单补货明细中增加合同编号、客户名称、来源订单编号列,并提供跳转到合同查询/订单查询的入口。")
|
||||
add_table(
|
||||
doc,
|
||||
["位置", "建议字段/控件", "处理逻辑"],
|
||||
[
|
||||
["补货创建弹窗", "关联销售合同、来源订单编号、客户名称", "提交前必填;若为安全库存补货可选择“库存备货”,但需填写备货原因。"],
|
||||
["补货中间表", "项目流水号、合同编号、订单流水号、订单编号、来源类型", "选入物料时写入,选出时同步清理。"],
|
||||
["补货单主表/明细表", "补货单号、合同编号、订单编号、客户名称、补货原因", "生成正式补货单后用于追溯、看板统计和报表导出。"],
|
||||
["订单查询", "补货明细关联合同", "现有“订单信息_补货明细_查询/修改”扩展返回字段。"],
|
||||
],
|
||||
[1.35, 2.0, 3.15],
|
||||
)
|
||||
|
||||
add_heading(doc, "四、方案二:生产计划当前工序高亮")
|
||||
add_para(doc, "现状:生产计划已有 OP010-OP110 横向工序列,生产任务查询的工序明细已有 tableRowClassName1 变色逻辑,完成工序会显示为蓝色背景。建议扩展为“已完成、正在进行、待开始、异常/超期”四类视觉状态。")
|
||||
add_table(
|
||||
doc,
|
||||
["状态", "判断规则", "前端表现"],
|
||||
[
|
||||
["已完成", "工序状态大于完成阈值、存在加工完成时间或完成状态=1", "浅蓝底 + 完成标签"],
|
||||
["正在进行", "存在开始加工时间且无完成时间;或工序状态=加工中", "绿色高亮边框/底色 + “当前”标签"],
|
||||
["待开始", "前序已完成、本工序未开始", "淡黄底 + “待加工”标签"],
|
||||
["异常/超期", "超过精工期限、设备停机、暂停时间过长、质检不良待处理", "红色文字/标签 + 置顶或筛选项"],
|
||||
],
|
||||
[1.2, 3.2, 2.1],
|
||||
)
|
||||
add_para(doc, "前端建议:在 ProductionPlan 的 OP 列中增加 scoped-slot,根据后端返回的“当前工序顺序/当前工序状态/当前设备”或前端解析后的状态决定 class;在 ProductionTaskQuery 的工序追溯弹窗中把“当前工序”与“已完成工序”区分开。")
|
||||
add_para(doc, "后端建议:生产计划查询过程返回 当前工序顺序、当前工序名称、当前工序状态、当前设备、当前操作者、计划开始、计划完成、实际开始、实际完成、是否超期。前端只负责展示,不在页面内重复推导复杂状态。")
|
||||
|
||||
add_heading(doc, "五、方案三:机台生产任务显示")
|
||||
add_para(doc, "现状:生产执行已有设备下拉和工序派工,设备监控已有设备状态分布图,但缺少按机台汇总的“当前正在做什么、后面排了什么”。建议新增“机台任务看板”,可挂在精工车间或设备监控模块下。")
|
||||
add_table(
|
||||
doc,
|
||||
["看板区块", "显示内容", "数据来源建议"],
|
||||
[
|
||||
["机台卡片", "设备名称/工位号、设备状态、当前订单、零件、图号、当前工序、操作者、已完成/计划数量", "基础数据_设备工位点检表 + 车间生产管理_零件工序_视图 + 完成过程情况"],
|
||||
["当前任务", "正在加工任务、开始时间、已用时、预计剩余、是否超期", "工序完成过程情况、工序状态、设备状态"],
|
||||
["排队任务", "下一道/后续任务,按交期、优先级、工序顺序排序", "派工表/工艺计划表/生产计划查询过程"],
|
||||
["异常提示", "停机、暂停、质检不良、缺料、未派设备、超期", "设备状态、质检、仓储需求、任务状态"],
|
||||
["操作入口", "跳转生产任务查询、工序追溯、生产执行派工", "保持现有路由跳转方式"],
|
||||
],
|
||||
[1.25, 2.75, 2.5],
|
||||
)
|
||||
add_para(doc, "第一版建议只做展示和筛选,不直接在看板上拖拽改排产;待现场认可数据准确性后,再开放“调整设备/调整顺序/插单”的受控操作。")
|
||||
|
||||
add_heading(doc, "六、数据库与接口改造建议")
|
||||
add_table(
|
||||
doc,
|
||||
["类型", "名称建议", "用途"],
|
||||
[
|
||||
["查询", "仓储管理_补货关联合同_查询数据", "按合同编号、客户、订单编号查询可关联的销售合同/订单。"],
|
||||
["编辑", "报缺补货_选入_带来源", "在选入补货物料时同步写入项目流水号、合同编号、订单流水号、订单编号。"],
|
||||
["编辑", "报缺补货_提交_带来源", "提交补货单时校验合同/订单来源并写入正式单据。"],
|
||||
["查询", "车间生产管理_生产计划_查询数据", "扩展返回当前工序、当前设备、工序状态码、计划/实际时间等字段。"],
|
||||
["查询", "精工车间_机台任务看板_查询数据", "按设备/工位汇总当前任务和排队任务。"],
|
||||
],
|
||||
[1.1, 2.4, 3.0],
|
||||
)
|
||||
add_para(doc, "所有接口继续走 MESCommonBase.ashx,前端仍使用 this.CreateData 和 this.ExecDatabase;参数仍按 key=value 字符串规则由全局方法生成,避免新增 Axios 封装。")
|
||||
|
||||
add_heading(doc, "七、前端改造建议")
|
||||
add_bullet(doc, "WarehouseManagement/Replenishment:提交弹窗增加合同选择、来源订单选择、备货原因;表格右侧补货单增加合同编号/订单编号隐藏列或 tooltip。")
|
||||
add_bullet(doc, "WarehouseManagement/NewReplenishmentQuery:增加合同编号、订单编号、客户名称列和筛选条件;补货单号点击可查看来源。")
|
||||
add_bullet(doc, "SalesManagement/OrderInquiry:补货明细弹窗增加合同关联和修改记录展示,补货订单可反跳补货查询。")
|
||||
add_bullet(doc, "SeikoWorkshop/ProductionPlan:OP 列改为状态单元格,增加当前工序高亮;看板图表增加按设备、按当前工序、按超期统计。")
|
||||
add_bullet(doc, "SeikoWorkshop/ProductionTaskQuery:工序追溯弹窗区分当前工序、已完成工序、待开始工序、异常工序。")
|
||||
add_bullet(doc, "SeikoWorkshop 或 DeviceManagement:新增机台任务看板页面,沿用 app-container > el-card > 搜索栏 + 表格/卡片布局。")
|
||||
|
||||
add_heading(doc, "八、实施阶段")
|
||||
add_table(
|
||||
doc,
|
||||
["阶段", "范围", "交付物", "建议周期"],
|
||||
[
|
||||
["阶段1", "补货订单关联合同/订单;补货查询追溯字段", "数据库字段、接口、补货页面、查询页面", "2-4天"],
|
||||
["阶段2", "生产计划当前工序高亮;任务查询工序状态优化", "生产计划 OP 状态单元格、工序追溯弹窗优化", "2-3天"],
|
||||
["阶段3", "机台任务看板", "设备筛选、当前任务、排队任务、异常提示、跳转入口", "4-6天"],
|
||||
["阶段4", "排产算法建议", "规则配置、推荐顺序、人工确认、调整记录", "视规则复杂度评估"],
|
||||
],
|
||||
[1.0, 2.35, 2.2, 0.95],
|
||||
)
|
||||
|
||||
add_heading(doc, "九、验收标准")
|
||||
for item in [
|
||||
"创建补货订单时,除库存备货场景外,必须能看到并保存销售合同/订单来源。",
|
||||
"从补货查询能反查到合同编号、客户、订单编号、物料、补货数量、补货人、补货期限和当前状态。",
|
||||
"生产计划列表中当前工序一眼可识别,且已完成、待开始、异常状态不会混淆。",
|
||||
"机台任务看板能按设备查看当前任务和后续任务,当前任务字段与生产任务查询一致。",
|
||||
"所有新增接口均遵循 MESCommonBase.ashx + CreateData/ExecDatabase 模式,正式库上线前在测试库完成验证。",
|
||||
"所有新增代码注释和文档末尾记录满足“修改人:Ld 修改时间”规则。",
|
||||
]:
|
||||
add_bullet(doc, item)
|
||||
|
||||
add_heading(doc, "十、需要业务补充确认的问题")
|
||||
for item in [
|
||||
"补货订单是否必须关联“销售合同”,还是关联到“销售订单/订单编号”即可,合同通过订单反推?建议两者都保存,页面主选订单、自动带出合同。",
|
||||
"安全库存补货、备品备件补货是否允许没有销售合同?如果允许,需要定义来源类型和审批/备注要求。",
|
||||
"当前工序的业务定义:以“已开始未完成”为准,还是以前序完成后下一道未开始为准?建议同时显示“正在加工”和“下一待加工”。",
|
||||
"机台任务看板需要显示哪些设备范围:仅精工车间设备,还是包含装配/外协/仓储相关工位?",
|
||||
"是否需要在第一版支持手动调整机台任务顺序?建议第一版只展示,第二版再加受控调整和操作日志。",
|
||||
"排产优先级规则:交期优先、客户优先、订单加急、设备能力、换型成本、工序等待时间,各项权重需业务确认。",
|
||||
]:
|
||||
add_bullet(doc, item)
|
||||
|
||||
add_heading(doc, "十一、推荐落地口径")
|
||||
add_para(doc, "建议第一版不要直接宣传为“自动排产”,而定义为“排产可视化与任务追溯增强”。先把补货来源、当前工序、机台任务三块数据打通,现场使用一周后再根据实际反馈调整排产规则。这样既能快速解决当前痛点,也能为后续真正的排产优化算法沉淀可靠数据。")
|
||||
|
||||
add_para(doc, f"修改人:Ld 修改时间:{MOD_TIME};")
|
||||
|
||||
doc.save(OUTPUT)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
237
scripts/markdown-to-pdf.js
Normal file
@@ -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 <input.md> <output.html>')
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
const markdown = fs.readFileSync(input, 'utf8')
|
||||
|
||||
function escapeHtml(value) {
|
||||
return value
|
||||
.replace(/&/g, '&')
|
||||
.replace(/</g, '<')
|
||||
.replace(/>/g, '>')
|
||||
}
|
||||
|
||||
function inlineFormat(value) {
|
||||
return escapeHtml(value)
|
||||
.replace(/`([^`]+)`/g, '<code>$1</code>')
|
||||
.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>')
|
||||
}
|
||||
|
||||
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 [
|
||||
'<table>',
|
||||
'<thead><tr>' + head.map(cell => '<th>' + cell + '</th>').join('') + '</tr></thead>',
|
||||
'<tbody>',
|
||||
body.map(row => '<tr>' + row.map(cell => '<td>' + cell + '</td>').join('') + '</tr>').join('\n'),
|
||||
'</tbody>',
|
||||
'</table>'
|
||||
].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('<p>' + inlineFormat(paragraph.join(' ')) + '</p>')
|
||||
paragraph = []
|
||||
}
|
||||
}
|
||||
|
||||
function flushList() {
|
||||
if (list.length) {
|
||||
html.push('<ul>' + list.map(item => '<li>' + inlineFormat(item) + '</li>').join('') + '</ul>')
|
||||
list = []
|
||||
}
|
||||
}
|
||||
|
||||
function flushTable() {
|
||||
if (table.length) {
|
||||
html.push(renderTable(table))
|
||||
table = []
|
||||
}
|
||||
}
|
||||
|
||||
lines.forEach(line => {
|
||||
if (/^```/.test(line.trim())) {
|
||||
if (inCode) {
|
||||
html.push('<pre><code>' + escapeHtml(code.join('\n')) + '</code></pre>')
|
||||
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('<h' + level + '>' + inlineFormat(heading[2]) + '</h' + level + '>')
|
||||
return
|
||||
}
|
||||
|
||||
const image = line.match(/^!\[([^\]]*)\]\(([^)]+)\)$/)
|
||||
if (image) {
|
||||
flushParagraph()
|
||||
flushList()
|
||||
html.push('<figure><img src="' + escapeHtml(image[2]) + '" alt="' + escapeHtml(image[1]) + '"><figcaption>' + inlineFormat(image[1]) + '</figcaption></figure>')
|
||||
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 = `<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>零件改制功能设计方案</title>
|
||||
<style>
|
||||
@page { size: A4; margin: 18mm 16mm; }
|
||||
body {
|
||||
font-family: "Microsoft YaHei", "SimSun", Arial, sans-serif;
|
||||
color: #1f2933;
|
||||
font-size: 13px;
|
||||
line-height: 1.65;
|
||||
}
|
||||
h1 {
|
||||
font-size: 26px;
|
||||
text-align: center;
|
||||
margin: 0 0 24px;
|
||||
padding-bottom: 12px;
|
||||
border-bottom: 2px solid #2f80ed;
|
||||
}
|
||||
h2 {
|
||||
font-size: 19px;
|
||||
margin: 24px 0 10px;
|
||||
padding-left: 8px;
|
||||
border-left: 4px solid #2f80ed;
|
||||
page-break-after: avoid;
|
||||
}
|
||||
h3 {
|
||||
font-size: 16px;
|
||||
margin: 18px 0 8px;
|
||||
page-break-after: avoid;
|
||||
}
|
||||
p { margin: 7px 0; }
|
||||
ul { margin: 6px 0 10px 22px; padding: 0; }
|
||||
li { margin: 3px 0; }
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
margin: 10px 0 16px;
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
th, td {
|
||||
border: 1px solid #cbd5e1;
|
||||
padding: 6px 8px;
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
word-break: break-word;
|
||||
}
|
||||
th {
|
||||
background: #eef4ff;
|
||||
font-weight: 600;
|
||||
}
|
||||
code {
|
||||
font-family: Consolas, "Microsoft YaHei", monospace;
|
||||
background: #f3f4f6;
|
||||
padding: 1px 4px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
pre {
|
||||
background: #f8fafc;
|
||||
border: 1px solid #d8dee9;
|
||||
padding: 10px;
|
||||
overflow-wrap: break-word;
|
||||
white-space: pre-wrap;
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
figure {
|
||||
margin: 14px 0 20px;
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
figure img {
|
||||
display: block;
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
border: 1px solid #d8dee9;
|
||||
}
|
||||
figcaption {
|
||||
margin-top: 6px;
|
||||
color: #64748b;
|
||||
font-size: 12px;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
${body}
|
||||
</body>
|
||||
</html>
|
||||
`
|
||||
|
||||
fs.writeFileSync(output, html, 'utf8')
|
||||
592
sql/ERP_MES_PLM_QMS_WMS_APS_一级菜单_测试库_20260806.sql
Normal file
@@ -0,0 +1,592 @@
|
||||
/* 修改人:Ld 修改时间:2026-08-06 09:50:27; 在测试库新增ERP经营管理、MES制造执行、PLM产品生产周期、QMS质量管理、WMS仓储管理、APS计划排产一级菜单,并给系统管理角色2追加权限 */
|
||||
SET XACT_ABORT ON;
|
||||
BEGIN TRAN;
|
||||
|
||||
DECLARE @RoleId INT = 2;
|
||||
DECLARE @ModuleId INT;
|
||||
|
||||
/* ERP经营管理 */
|
||||
SET @ModuleId = NULL;
|
||||
SELECT @ModuleId = id
|
||||
FROM dbo.基础表_模块信息
|
||||
WHERE title = N'ERP经营管理'
|
||||
AND [path] = N'/';
|
||||
|
||||
IF @ModuleId IS NULL
|
||||
BEGIN
|
||||
INSERT INTO dbo.基础表_模块信息
|
||||
(
|
||||
[path],
|
||||
component,
|
||||
redirect,
|
||||
name,
|
||||
title,
|
||||
icon,
|
||||
是否通知,
|
||||
消息通知来源,
|
||||
通知条件,
|
||||
dashboardIcon,
|
||||
是否禁用
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
N'/',
|
||||
N'/layout/Layout',
|
||||
NULL,
|
||||
N'ERPManagement',
|
||||
N'ERP经营管理',
|
||||
N'SystemRrolemaintenance',
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
0
|
||||
);
|
||||
|
||||
SET @ModuleId = SCOPE_IDENTITY();
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
UPDATE dbo.基础表_模块信息
|
||||
SET component = N'/layout/Layout',
|
||||
redirect = NULL,
|
||||
name = N'ERPManagement',
|
||||
title = N'ERP经营管理',
|
||||
icon = N'SystemRrolemaintenance',
|
||||
是否禁用 = 0
|
||||
WHERE id = @ModuleId;
|
||||
END;
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.基础表_角色模块信息
|
||||
WHERE id = @ModuleId
|
||||
AND pid = 0
|
||||
AND 角色编号 = @RoleId
|
||||
)
|
||||
BEGIN
|
||||
INSERT INTO dbo.基础表_角色模块信息
|
||||
(
|
||||
id,
|
||||
pid,
|
||||
模块顺序,
|
||||
角色编号,
|
||||
是否启用,
|
||||
角色模块顺序
|
||||
)
|
||||
SELECT
|
||||
@ModuleId,
|
||||
0,
|
||||
@ModuleId,
|
||||
@RoleId,
|
||||
1,
|
||||
ISNULL(MAX(角色模块顺序), 0) + 1
|
||||
FROM dbo.基础表_角色模块信息
|
||||
WHERE 角色编号 = @RoleId
|
||||
AND pid = 0;
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
UPDATE dbo.基础表_角色模块信息
|
||||
SET 是否启用 = 1
|
||||
WHERE id = @ModuleId
|
||||
AND pid = 0
|
||||
AND 角色编号 = @RoleId;
|
||||
END;
|
||||
|
||||
/* MES制造执行 */
|
||||
SET @ModuleId = NULL;
|
||||
SELECT @ModuleId = id
|
||||
FROM dbo.基础表_模块信息
|
||||
WHERE title = N'MES制造执行'
|
||||
AND [path] = N'/';
|
||||
|
||||
IF @ModuleId IS NULL
|
||||
BEGIN
|
||||
INSERT INTO dbo.基础表_模块信息
|
||||
(
|
||||
[path],
|
||||
component,
|
||||
redirect,
|
||||
name,
|
||||
title,
|
||||
icon,
|
||||
是否通知,
|
||||
消息通知来源,
|
||||
通知条件,
|
||||
dashboardIcon,
|
||||
是否禁用
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
N'/',
|
||||
N'/layout/Layout',
|
||||
NULL,
|
||||
N'MESExecution',
|
||||
N'MES制造执行',
|
||||
N'车间',
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
0
|
||||
);
|
||||
|
||||
SET @ModuleId = SCOPE_IDENTITY();
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
UPDATE dbo.基础表_模块信息
|
||||
SET component = N'/layout/Layout',
|
||||
redirect = NULL,
|
||||
name = N'MESExecution',
|
||||
title = N'MES制造执行',
|
||||
icon = N'车间',
|
||||
是否禁用 = 0
|
||||
WHERE id = @ModuleId;
|
||||
END;
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.基础表_角色模块信息
|
||||
WHERE id = @ModuleId
|
||||
AND pid = 0
|
||||
AND 角色编号 = @RoleId
|
||||
)
|
||||
BEGIN
|
||||
INSERT INTO dbo.基础表_角色模块信息
|
||||
(
|
||||
id,
|
||||
pid,
|
||||
模块顺序,
|
||||
角色编号,
|
||||
是否启用,
|
||||
角色模块顺序
|
||||
)
|
||||
SELECT
|
||||
@ModuleId,
|
||||
0,
|
||||
@ModuleId,
|
||||
@RoleId,
|
||||
1,
|
||||
ISNULL(MAX(角色模块顺序), 0) + 1
|
||||
FROM dbo.基础表_角色模块信息
|
||||
WHERE 角色编号 = @RoleId
|
||||
AND pid = 0;
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
UPDATE dbo.基础表_角色模块信息
|
||||
SET 是否启用 = 1
|
||||
WHERE id = @ModuleId
|
||||
AND pid = 0
|
||||
AND 角色编号 = @RoleId;
|
||||
END;
|
||||
|
||||
/* PLM产品生产周期 */
|
||||
SET @ModuleId = NULL;
|
||||
SELECT @ModuleId = id
|
||||
FROM dbo.基础表_模块信息
|
||||
WHERE title = N'PLM产品生产周期'
|
||||
AND [path] = N'/';
|
||||
|
||||
IF @ModuleId IS NULL
|
||||
BEGIN
|
||||
INSERT INTO dbo.基础表_模块信息
|
||||
(
|
||||
[path],
|
||||
component,
|
||||
redirect,
|
||||
name,
|
||||
title,
|
||||
icon,
|
||||
是否通知,
|
||||
消息通知来源,
|
||||
通知条件,
|
||||
dashboardIcon,
|
||||
是否禁用
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
N'/',
|
||||
N'/layout/Layout',
|
||||
NULL,
|
||||
N'PLMProductLifecycle',
|
||||
N'PLM产品生产周期',
|
||||
N'ProductMaintenance',
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
0
|
||||
);
|
||||
|
||||
SET @ModuleId = SCOPE_IDENTITY();
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
UPDATE dbo.基础表_模块信息
|
||||
SET component = N'/layout/Layout',
|
||||
redirect = NULL,
|
||||
name = N'PLMProductLifecycle',
|
||||
title = N'PLM产品生产周期',
|
||||
icon = N'ProductMaintenance',
|
||||
是否禁用 = 0
|
||||
WHERE id = @ModuleId;
|
||||
END;
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.基础表_角色模块信息
|
||||
WHERE id = @ModuleId
|
||||
AND pid = 0
|
||||
AND 角色编号 = @RoleId
|
||||
)
|
||||
BEGIN
|
||||
INSERT INTO dbo.基础表_角色模块信息
|
||||
(
|
||||
id,
|
||||
pid,
|
||||
模块顺序,
|
||||
角色编号,
|
||||
是否启用,
|
||||
角色模块顺序
|
||||
)
|
||||
SELECT
|
||||
@ModuleId,
|
||||
0,
|
||||
@ModuleId,
|
||||
@RoleId,
|
||||
1,
|
||||
ISNULL(MAX(角色模块顺序), 0) + 1
|
||||
FROM dbo.基础表_角色模块信息
|
||||
WHERE 角色编号 = @RoleId
|
||||
AND pid = 0;
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
UPDATE dbo.基础表_角色模块信息
|
||||
SET 是否启用 = 1
|
||||
WHERE id = @ModuleId
|
||||
AND pid = 0
|
||||
AND 角色编号 = @RoleId;
|
||||
END;
|
||||
|
||||
/* QMS质量管理 */
|
||||
SET @ModuleId = NULL;
|
||||
SELECT @ModuleId = id
|
||||
FROM dbo.基础表_模块信息
|
||||
WHERE title = N'QMS质量管理'
|
||||
AND [path] = N'/';
|
||||
|
||||
IF @ModuleId IS NULL
|
||||
BEGIN
|
||||
INSERT INTO dbo.基础表_模块信息
|
||||
(
|
||||
[path],
|
||||
component,
|
||||
redirect,
|
||||
name,
|
||||
title,
|
||||
icon,
|
||||
是否通知,
|
||||
消息通知来源,
|
||||
通知条件,
|
||||
dashboardIcon,
|
||||
是否禁用
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
N'/',
|
||||
N'/layout/Layout',
|
||||
NULL,
|
||||
N'QMSQualityManagement',
|
||||
N'QMS质量管理',
|
||||
N'QualityInspectionQuery',
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
0
|
||||
);
|
||||
|
||||
SET @ModuleId = SCOPE_IDENTITY();
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
UPDATE dbo.基础表_模块信息
|
||||
SET component = N'/layout/Layout',
|
||||
redirect = NULL,
|
||||
name = N'QMSQualityManagement',
|
||||
title = N'QMS质量管理',
|
||||
icon = N'QualityInspectionQuery',
|
||||
是否禁用 = 0
|
||||
WHERE id = @ModuleId;
|
||||
END;
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.基础表_角色模块信息
|
||||
WHERE id = @ModuleId
|
||||
AND pid = 0
|
||||
AND 角色编号 = @RoleId
|
||||
)
|
||||
BEGIN
|
||||
INSERT INTO dbo.基础表_角色模块信息
|
||||
(
|
||||
id,
|
||||
pid,
|
||||
模块顺序,
|
||||
角色编号,
|
||||
是否启用,
|
||||
角色模块顺序
|
||||
)
|
||||
SELECT
|
||||
@ModuleId,
|
||||
0,
|
||||
@ModuleId,
|
||||
@RoleId,
|
||||
1,
|
||||
ISNULL(MAX(角色模块顺序), 0) + 1
|
||||
FROM dbo.基础表_角色模块信息
|
||||
WHERE 角色编号 = @RoleId
|
||||
AND pid = 0;
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
UPDATE dbo.基础表_角色模块信息
|
||||
SET 是否启用 = 1
|
||||
WHERE id = @ModuleId
|
||||
AND pid = 0
|
||||
AND 角色编号 = @RoleId;
|
||||
END;
|
||||
|
||||
/* WMS仓储管理 */
|
||||
SET @ModuleId = NULL;
|
||||
SELECT @ModuleId = id
|
||||
FROM dbo.基础表_模块信息
|
||||
WHERE title = N'WMS仓储管理'
|
||||
AND [path] = N'/';
|
||||
|
||||
IF @ModuleId IS NULL
|
||||
BEGIN
|
||||
INSERT INTO dbo.基础表_模块信息
|
||||
(
|
||||
[path],
|
||||
component,
|
||||
redirect,
|
||||
name,
|
||||
title,
|
||||
icon,
|
||||
是否通知,
|
||||
消息通知来源,
|
||||
通知条件,
|
||||
dashboardIcon,
|
||||
是否禁用
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
N'/',
|
||||
N'/layout/Layout',
|
||||
NULL,
|
||||
N'WMSWarehouseManagement',
|
||||
N'WMS仓储管理',
|
||||
N'仓储管理',
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
0
|
||||
);
|
||||
|
||||
SET @ModuleId = SCOPE_IDENTITY();
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
UPDATE dbo.基础表_模块信息
|
||||
SET component = N'/layout/Layout',
|
||||
redirect = NULL,
|
||||
name = N'WMSWarehouseManagement',
|
||||
title = N'WMS仓储管理',
|
||||
icon = N'仓储管理',
|
||||
是否禁用 = 0
|
||||
WHERE id = @ModuleId;
|
||||
END;
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.基础表_角色模块信息
|
||||
WHERE id = @ModuleId
|
||||
AND pid = 0
|
||||
AND 角色编号 = @RoleId
|
||||
)
|
||||
BEGIN
|
||||
INSERT INTO dbo.基础表_角色模块信息
|
||||
(
|
||||
id,
|
||||
pid,
|
||||
模块顺序,
|
||||
角色编号,
|
||||
是否启用,
|
||||
角色模块顺序
|
||||
)
|
||||
SELECT
|
||||
@ModuleId,
|
||||
0,
|
||||
@ModuleId,
|
||||
@RoleId,
|
||||
1,
|
||||
ISNULL(MAX(角色模块顺序), 0) + 1
|
||||
FROM dbo.基础表_角色模块信息
|
||||
WHERE 角色编号 = @RoleId
|
||||
AND pid = 0;
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
UPDATE dbo.基础表_角色模块信息
|
||||
SET 是否启用 = 1
|
||||
WHERE id = @ModuleId
|
||||
AND pid = 0
|
||||
AND 角色编号 = @RoleId;
|
||||
END;
|
||||
|
||||
/* APS计划排产 */
|
||||
SET @ModuleId = NULL;
|
||||
SELECT @ModuleId = id
|
||||
FROM dbo.基础表_模块信息
|
||||
WHERE title = N'APS计划排产'
|
||||
AND [path] = N'/';
|
||||
|
||||
IF @ModuleId IS NULL
|
||||
BEGIN
|
||||
INSERT INTO dbo.基础表_模块信息
|
||||
(
|
||||
[path],
|
||||
component,
|
||||
redirect,
|
||||
name,
|
||||
title,
|
||||
icon,
|
||||
是否通知,
|
||||
消息通知来源,
|
||||
通知条件,
|
||||
dashboardIcon,
|
||||
是否禁用
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
N'/',
|
||||
N'/layout/Layout',
|
||||
NULL,
|
||||
N'APSPlanScheduling',
|
||||
N'APS计划排产',
|
||||
N'ShopScheduling',
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
0
|
||||
);
|
||||
|
||||
SET @ModuleId = SCOPE_IDENTITY();
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
UPDATE dbo.基础表_模块信息
|
||||
SET component = N'/layout/Layout',
|
||||
redirect = NULL,
|
||||
name = N'APSPlanScheduling',
|
||||
title = N'APS计划排产',
|
||||
icon = N'ShopScheduling',
|
||||
是否禁用 = 0
|
||||
WHERE id = @ModuleId;
|
||||
END;
|
||||
|
||||
IF NOT EXISTS
|
||||
(
|
||||
SELECT 1
|
||||
FROM dbo.基础表_角色模块信息
|
||||
WHERE id = @ModuleId
|
||||
AND pid = 0
|
||||
AND 角色编号 = @RoleId
|
||||
)
|
||||
BEGIN
|
||||
INSERT INTO dbo.基础表_角色模块信息
|
||||
(
|
||||
id,
|
||||
pid,
|
||||
模块顺序,
|
||||
角色编号,
|
||||
是否启用,
|
||||
角色模块顺序
|
||||
)
|
||||
SELECT
|
||||
@ModuleId,
|
||||
0,
|
||||
@ModuleId,
|
||||
@RoleId,
|
||||
1,
|
||||
ISNULL(MAX(角色模块顺序), 0) + 1
|
||||
FROM dbo.基础表_角色模块信息
|
||||
WHERE 角色编号 = @RoleId
|
||||
AND pid = 0;
|
||||
END
|
||||
ELSE
|
||||
BEGIN
|
||||
UPDATE dbo.基础表_角色模块信息
|
||||
SET 是否启用 = 1
|
||||
WHERE id = @ModuleId
|
||||
AND pid = 0
|
||||
AND 角色编号 = @RoleId;
|
||||
END;
|
||||
|
||||
/* 修改人:Ld 修改时间:2026-08-06 09:50:27; 固定系统管理角色2下新增一级菜单的显示顺序 */
|
||||
DECLARE @BaseRoleOrder INT;
|
||||
|
||||
SELECT @BaseRoleOrder = ISNULL(MAX(r.角色模块顺序), 0)
|
||||
FROM dbo.基础表_角色模块信息 r
|
||||
INNER JOIN dbo.基础表_模块信息 m ON m.id = r.id
|
||||
WHERE r.角色编号 = @RoleId
|
||||
AND r.pid = 0
|
||||
AND m.title NOT IN (N'ERP经营管理', N'MES制造执行', N'PLM产品生产周期', N'QMS质量管理', N'WMS仓储管理', N'APS计划排产');
|
||||
|
||||
;WITH MenuOrder AS
|
||||
(
|
||||
SELECT N'ERP经营管理' AS title, 1 AS SortNo
|
||||
UNION ALL SELECT N'MES制造执行', 2
|
||||
UNION ALL SELECT N'PLM产品生产周期', 3
|
||||
UNION ALL SELECT N'QMS质量管理', 4
|
||||
UNION ALL SELECT N'WMS仓储管理', 5
|
||||
UNION ALL SELECT N'APS计划排产', 6
|
||||
)
|
||||
UPDATE r
|
||||
SET 角色模块顺序 = @BaseRoleOrder + MenuOrder.SortNo,
|
||||
是否启用 = 1
|
||||
FROM dbo.基础表_角色模块信息 r
|
||||
INNER JOIN dbo.基础表_模块信息 m ON m.id = r.id
|
||||
INNER JOIN MenuOrder ON MenuOrder.title = m.title
|
||||
WHERE r.角色编号 = @RoleId
|
||||
AND r.pid = 0;
|
||||
|
||||
SELECT id, [path], component, name, title, icon, 是否禁用
|
||||
FROM dbo.基础表_模块信息
|
||||
WHERE title IN (N'ERP经营管理', N'MES制造执行', N'PLM产品生产周期', N'QMS质量管理', N'WMS仓储管理', N'APS计划排产')
|
||||
ORDER BY id;
|
||||
|
||||
SELECT id, pid, 模块顺序, 角色编号, 是否启用, 角色模块顺序
|
||||
FROM dbo.基础表_角色模块信息
|
||||
WHERE id IN
|
||||
(
|
||||
SELECT id
|
||||
FROM dbo.基础表_模块信息
|
||||
WHERE title IN (N'ERP经营管理', N'MES制造执行', N'PLM产品生产周期', N'QMS质量管理', N'WMS仓储管理', N'APS计划排产')
|
||||
)
|
||||
AND pid = 0
|
||||
ORDER BY 角色编号, 角色模块顺序, id;
|
||||
|
||||
COMMIT TRAN;
|
||||
5
sql/PDM_组件名称_确认更改新_ERPTOOL_JY_before_20260724.sql
Normal file
@@ -0,0 +1,5 @@
|
||||
Sqlcmd: Error: Microsoft ODBC Driver 11 for SQL Server : Encryption not supported on the client..
|
||||
Sqlcmd: Error: Microsoft ODBC Driver 11 for SQL Server : SSL Provider: 安全包中没有可用的凭证
|
||||
.
|
||||
Sqlcmd: Error: Microsoft ODBC Driver 11 for SQL Server : Client unable to establish connection.
|
||||
Sqlcmd: Error: Microsoft ODBC Driver 11 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..
|
||||
97
sql/PDM_组件名称_确认更改新_ERPTOOL_JY_deploy_20260724.sql
Normal file
@@ -0,0 +1,97 @@
|
||||
USE [ERPTOOL_JY]
|
||||
GO
|
||||
|
||||
DECLARE @sql NVARCHAR(MAX)
|
||||
DECLARE @anchor NVARCHAR(500)
|
||||
DECLARE @new NVARCHAR(MAX)
|
||||
DECLARE @pos INT
|
||||
|
||||
SELECT @sql = OBJECT_DEFINITION(OBJECT_ID(N'dbo.PDM_组件名称_确认更改新'))
|
||||
|
||||
SET @new = CAST(N'
|
||||
-- 修改人:Ld 修改时间:2026-07-23 允许合同修改时删除未领料机床,已领料机床保留,避免误删已领料数据
|
||||
IF EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 WHERE 项目流水号 = @项目流水号)
|
||||
BEGIN
|
||||
DELETE r FROM 车间装配管理_装配任务 r
|
||||
INNER JOIN PDM_组件名称 c ON c.组件流水号 = r.组件流水号
|
||||
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||
WHERE m.项目流水号 = @项目流水号
|
||||
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||
|
||||
DELETE r FROM 车间装配管理_装配执行_临时领料明细 r
|
||||
INNER JOIN PDM_组件名称 c ON c.组件流水号 = r.组件流水号
|
||||
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||
WHERE m.项目流水号 = @项目流水号
|
||||
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||
|
||||
DELETE r FROM 车间装配管理_领料单明细 r
|
||||
INNER JOIN PDM_组件名称 c ON c.组件流水号 = r.组件流水号
|
||||
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||
WHERE m.项目流水号 = @项目流水号
|
||||
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||
' AS NVARCHAR(MAX)) + CAST(N'
|
||||
DELETE r FROM 车间装配管理_领料单 r
|
||||
INNER JOIN PDM_组件名称 c ON c.组件流水号 = r.组件流水号
|
||||
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||
WHERE m.项目流水号 = @项目流水号
|
||||
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||
|
||||
DELETE r FROM PDM_零件明细表_基本件 r
|
||||
INNER JOIN PDM_组件名称 c ON c.组件流水号 = r.组件流水号
|
||||
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||
WHERE m.项目流水号 = @项目流水号
|
||||
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||
|
||||
DELETE r FROM PDM_零件明细表_标准件和外购件 r
|
||||
INNER JOIN PDM_组件名称 c ON c.组件流水号 = r.组件流水号
|
||||
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||
WHERE m.项目流水号 = @项目流水号
|
||||
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||
|
||||
DELETE c FROM PDM_组件名称 c
|
||||
INNER JOIN PDM_机床名称 m ON m.机床流水号 = c.机床流水号
|
||||
WHERE m.项目流水号 = @项目流水号
|
||||
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c2 WHERE c2.机床流水号 = m.机床流水号 AND ISNULL(c2.是否领料, 0) <> 0)
|
||||
|
||||
DELETE m FROM PDM_机床名称 m
|
||||
WHERE m.项目流水号 = @项目流水号
|
||||
AND NOT EXISTS (SELECT 1 FROM PDM_机床名称_修改记录_临时表 t WHERE t.项目流水号 = @项目流水号 AND t.机床流水号 = m.机床流水号)
|
||||
AND NOT EXISTS (SELECT 1 FROM PDM_组件名称 c WHERE c.机床流水号 = m.机床流水号 AND ISNULL(c.是否领料, 0) <> 0)
|
||||
END
|
||||
|
||||
' AS NVARCHAR(MAX))
|
||||
|
||||
SET @anchor = N'delete from PDM_机床名称_修改记录_临时表 where 项目流水号 = @项目流水号'
|
||||
|
||||
IF @sql IS NULL
|
||||
BEGIN
|
||||
RAISERROR(N'未找到存储过程 PDM_组件名称_确认更改新', 16, 1)
|
||||
RETURN
|
||||
END
|
||||
|
||||
IF CHARINDEX(N'修改人:Ld 修改时间:2026-07-23 允许合同修改时删除未领料机床', @sql) > 0
|
||||
BEGIN
|
||||
PRINT N'测试库过程已包含本次删除机床加固逻辑,无需重复修改'
|
||||
RETURN
|
||||
END
|
||||
|
||||
SET @sql = REPLACE(@sql, N'CREATE PROCEDURE', N'ALTER PROCEDURE')
|
||||
SET @pos = CHARINDEX(@anchor, @sql)
|
||||
|
||||
IF @pos = 0
|
||||
BEGIN
|
||||
RAISERROR(N'未找到预期插入位置,未执行修改', 16, 1)
|
||||
RETURN
|
||||
END
|
||||
|
||||
SET @sql = STUFF(@sql, @pos, 0, @new)
|
||||
|
||||
EXEC sp_executesql @sql
|
||||
GO
|
||||