更新装配、销售、精工车间、技术中心、仓储多个模块,整理文档和SQL脚本

This commit is contained in:
Developer
2026-06-29 13:36:34 +08:00
parent 137e276340
commit be0ff91e24
54 changed files with 5066 additions and 723 deletions

View File

@@ -71,3 +71,7 @@ SVG 图标位于 `src/icons/svg/` 目录,通过 `svg-sprite-loader` 自动注
## 调试与排错
请求拦截器中会检查 Cookie 中的 `id` 是否存在,不存在则强制登出并刷新页面。登录 API`name``菜单系统模块_用户名密码_查询数据_new2``菜单系统模块_获取角色模块_查询数据`)跳过此检查。控制台日志使用 `console.log`,不使用 `console.error` 输出调试信息。Vue Router 的 `replace` 方法已全局捕获异常避免重复导航报错。
## GPT/Codex 执行日志
每次 GPT/Codex 执行完成后,将完整的执行过程使用日志追加到 `/gptlog-process/gpdlog.md`,日志使用中文。

View File

@@ -0,0 +1,401 @@
# JY1.0 阶段功能需求文档
## 01-文档说明
本文档根据当前提出的 7 项业务需求整理,作为后续前端、后端、数据库、测试联调的需求依据。需求内容覆盖默认库位设置、物料编码查询、移动端适配、库存盘点、看板优化、语音播报、质检 PDA 应急扫码能力。
本文档为初稿,后续可根据现场确认结果继续补充字段、接口、菜单权限、数据库过程和验收样例。
## 02-总体目标
1. 优化仓储相关业务流程,减少物料维护页面职责过重的问题。
2. 提升物料查询效率,在现有查询功能中统一补充物料编码查询能力。
3. 改善移动端使用体验,支持车间派工在手机或移动终端上自适应展示和操作。
4. 完善库存盘点、物料系列、库位编辑、入库库位选择等库存基础能力。
5. 优化现有看板数据展示,并新增仓库、采购等业务看板。
6. 增加新订单语音播报能力,提升部门电视机、现场广播等场景下的消息触达效率。
7. 完善质检 PDA 应急方案,在 PDA 设备故障时使用手机扫码保障生产不中断。
## 03-需求一:默认库位设置功能调整
### 3.1 需求背景
当前“设置默认库位”功能位于物料标准维护或物料标准相关页面中,导致物料基础维护页面承载了仓储业务配置职责。为降低页面复杂度,并使库位规则更贴近入库业务,需要将默认库位设置从物料标准维护中移出。
### 3.2 功能目标
1. 去除物料标准维护中的“设置默认库位”入口和相关操作。
2. 将默认库位设置功能迁移到其他更合适的仓储组件,或新建“默认库位设置”组件。
3. 物料入库选择库位时,根据该物料是否存在默认库存或库位库存显示不同的库位范围。
### 3.3 业务规则
1. 如果物料没有默认库存或没有可识别的默认库位库存,入库时显示全库位选择。
2. 如果物料已有库存库位,入库时优先显示该物料已有库存的库位选择。
3. 默认库位设置不再依赖物料标准维护页面完成。
4. 新组件需要支持按物料编码、物料名称、图号、规格型号等条件查询物料。
5. 默认库位设置后,应能被物料入库、库存盘点、库存查询等仓储业务读取。
### 3.4 前端范围
1. 移除物料标准维护页面中的默认库位设置按钮、弹窗和相关方法。
2. 新增或迁移默认库位设置组件,建议放入仓储管理模块。
3. 物料入库组件调整库位下拉数据来源:
- 无默认库存时显示全库位。
- 有库存时显示该物料已有库存库位。
4. 保持 Vue 2 Options API 和 Element UI 原有开发风格。
### 3.5 后端范围
1. 梳理现有默认库位相关存储过程、表字段和调用页面。
2. 根据新组件补充查询、保存、删除默认库位的接口。
3. 入库库位查询过程需支持按物料返回全库位或已有库存库位。
### 3.6 验收标准
1. 物料标准维护页面不再出现默认库位设置入口。
2. 新默认库位设置组件可完成查询、设置、修改、删除。
3. 物料无库存库位时,入库页面可选择全部库位。
4. 物料已有库存库位时,入库页面只显示符合规则的库位。
5. 默认库位变更后,相关仓储页面读取结果一致。
## 04-需求二:现有查询功能增加物料编码查询
### 4.1 需求背景
系统中已有多个物料查询入口,但部分页面只能按物料名称、图号、规格型号等条件查询,无法直接按物料编码定位,影响仓储、销售、技术、装配等场景的查询效率。
### 4.2 功能目标
1. 在现有涉及物料查询的组件中新增“物料编码”查询条件。
2. 物料编码查询需要与原有条件组合查询。
3. 查询结果、导出结果、选择弹窗结果保持一致。
### 4.3 覆盖范围
优先覆盖以下类型页面:
| 模块 | 页面或组件类型 | 查询入口 |
| ---- | ------------------- | ---------- |
| 仓储管理 | 库存盘点、库存查询、入库记录、物料库位 | 主列表查询、导出 |
| 仓储管理 | 领料、耗材、入库物料选择 | 物料选择弹窗 |
| 技术中心 | 物料查询、物料维护、图纸确认 | 主列表或物料选择弹窗 |
| 销售管理 | 订单管理、订单审核、订单查询 | 物料选择弹窗 |
| 装配管理 | 接收装配任务、接收滑台装配任务 | 物料选择弹窗 |
### 4.4 前端规则
1. 搜索栏新增 `物料编码` 输入框。
2. 输入框 placeholder 可使用“物料编码”或“物料编号”,但传参建议统一使用 `物料编码`
3. 原有查询按钮、重置按钮、分页查询逻辑保持不变。
4. 导出功能应同步携带物料编码条件。
5. 不新增第三方库,不改变现有 `CreateData``ExecDatabase``getTable` 调用模式。
### 4.5 后端规则
1. 相关查询存储过程增加可选参数:
- `物料编码_check`
- `物料编码`
2. 未传物料编码时,不影响原有查询结果。
3. 传入物料编码时,应支持模糊查询或按现场确认规则查询。
4. 导出过程与页面查询过程保持条件一致。
### 4.6 验收标准
1. 用户可通过物料编码直接查询目标物料。
2. 物料编码可与物料名称、图号、规格型号等条件组合查询。
3. 查询和导出数据一致。
4. 所有改造页面无模板解析错误、无明显布局错位。
## 05-需求三:车间派工组件移动端自适应
### 5.1 需求背景
车间派工业务需要在移动设备上查看和操作,当前桌面端布局在手机或窄屏设备上可能存在表格过宽、按钮拥挤、筛选条件不易操作等问题。
### 5.2 功能目标
1. 开发车间派工组件的移动端自适应布局。
2. 保持桌面端原有操作习惯不受影响。
3. 移动端重点保证查询、查看、派工、确认等高频操作可用。
### 5.3 前端要求
1. 使用响应式样式适配手机、平板、窄屏电脑。
2. 搜索条件在移动端可折叠或纵向排列。
3. 表格在移动端可采用横向滚动、卡片式列表或核心字段列表展示。
4. 操作按钮在移动端需要保证可点击区域足够,不出现文字挤压。
5. 弹窗在移动端宽度应适配屏幕,不应超出视口。
6. 不引入 Vue 3、Composition API 或新的 UI 库。
### 5.4 重点场景
1. 手机查看待派工任务。
2. 手机按订单、物料、工序、人员等条件筛选。
3. 手机进入派工明细并提交。
4. 手机查看派工状态、数量、人员、设备等关键字段。
### 5.5 验收标准
1. 375px、414px、768px、1366px 宽度下页面可正常展示。
2. 移动端无关键按钮遮挡、重叠、不可点击问题。
3. 桌面端布局保持稳定。
4. 派工提交、查询、刷新等原有功能正常。
## 06-需求四:库存盘点及物料系列、库位编辑优化
### 6.1 需求背景
库存盘点需要更细粒度筛选物料,并支持对盘点库位进行维护。当前盘点和入库库位选择逻辑需要与物料库存库位更紧密关联。
### 6.2 功能目标
1. 新增“系列”字段,用于物料筛选和盘点筛选。
2. 在物料维护组件中支持编辑物料系列。
3. 库存盘点组件增加按系列筛选物料和库存的能力。
4. 库存盘点组件添加编辑库位功能。
5. 物料入库组件的库位选择只显示有该物料的库位。
### 6.3 物料维护要求
1. 物料维护列表展示“系列”字段。
2. 新增、编辑物料时可维护“系列”。
3. 系列字段建议使用中文字段名 `系列`
4. 系列可根据现场数据情况使用输入框或下拉框。
### 6.4 库存盘点要求
1. 搜索栏增加“系列”筛选条件。
2. 支持按系列查询物料盘点数据。
3. 支持按系列查询库存盘点数据。
4. 表格展示需要包含系列字段,便于盘点人员核对。
5. 增加编辑库位功能,可调整物料对应盘点库位。
### 6.5 物料入库要求
1. 入库时选择库位只显示有该物料的库位。
2. 如果该物料没有任何库存库位,需要结合需求一规则显示全库位或默认库位候选。
3. 库位下拉数据需要避免显示与该物料无关且容易误选的库位。
### 6.6 后端要求
1. 物料基础表或相关视图增加 `系列` 字段。
2. 物料维护查询、新增、编辑过程支持系列字段。
3. 库存盘点查询过程支持系列筛选。
4. 库位编辑过程需要记录修改人、修改时间。
5. 入库库位查询过程按物料库存库位过滤。
### 6.7 验收标准
1. 物料维护可新增和编辑系列字段。
2. 库存盘点可按系列筛选数据。
3. 库存盘点可编辑库位,并保存成功。
4. 物料入库库位选择符合“只显示该物料相关库位”的规则。
5. 相关查询、保存后刷新数据一致。
## 07-需求五:看板优化
### 7.1 需求背景
现场看板需要更清晰地展示仓库、采购、订单、库存等业务状态。现有看板需要数据口径优化,同时新增部分业务看板。
### 7.2 功能目标
1. 新增仓库看板组件。
2. 新增或优化采购看板组件。
3. 优化现有看板的数据口径、展示字段和刷新方式。
4. 仓库看板展示入库单滚动信息。
5. 采购看板展示仍在采购中的合同。
### 7.3 仓库看板要求
1. 展示入库单滚动列表。
2. 滚动内容建议包括入库单号、供应商、物料名称、物料编码、数量、入库日期、状态。
3. 支持自动刷新,刷新频率需现场确认。
4. 大屏展示时文字清晰,不出现字段重叠。
5. 支持异常状态突出显示,例如待处理、待上架、未完成。
### 7.4 采购看板要求
1. 展示仍在采购中的合同。
2. 合同状态口径需要明确,例如未完成、采购中、部分到货、逾期未到。
3. 建议展示合同号、供应商、物料、数量、已到数量、未到数量、交期、状态。
4. 对逾期或临近交期的数据进行醒目提示。
### 7.5 现有看板优化要求
1. 梳理现有看板数据来源和字段含义。
2. 对不准确、不及时或口径不一致的数据进行调整。
3. 保持大屏自适应显示效果。
4. 对滚动、刷新、排序、状态颜色做统一规范。
### 7.6 验收标准
1. 仓库看板可滚动展示入库单数据。
2. 采购看板可展示采购中的合同。
3. 现有看板数据口径与业务确认一致。
4. 大屏展示无明显错位、遮挡、空白异常。
5. 自动刷新不影响页面稳定性。
## 08-需求六:语音播报
### 8.1 需求背景
当系统产生新的订单或重要业务消息时,需要在部门电视机或全场广播中自动播报,类似商家外卖新订单语音提醒,减少人工盯屏和漏看消息。
### 8.2 功能目标
1. 新订单产生时触发语音播报。
2. 支持部门电视机播报或全场广播播报。
3. 播报内容简洁明确,便于现场人员快速理解。
4. 后续可扩展到采购到货、异常提醒、质检任务等事件。
### 8.3 播报场景
1. 新订单生成。
2. 新订单分配到指定部门。
3. 订单状态发生关键变化。
4. 后续可扩展为库存预警、采购逾期、质检待处理等。
### 8.4 播报内容建议
新订单播报示例:
```text
您有新的生产订单请及时处理。订单号XXXX客户XXXX数量XXXX。
```
部门播报示例:
```text
技术中心有新的图纸确认任务,请及时处理。
```
### 8.5 技术要求
1. 前端可使用浏览器语音能力或播放预生成音频。
2. 如果用于电视机浏览器,需要确认浏览器是否允许自动播放声音。
3. 如果接入全场广播,需要确认广播设备是否支持网页音频输入、接口触发或本地客户端转发。
4. 新消息检测可采用轮询、WebSocket 或已有消息接口。
5. 需要增加播报开关、播报范围、播报频率、防重复播报规则。
### 8.6 权限和配置
1. 管理员可配置是否启用语音播报。
2. 可按部门配置播报内容和播报设备。
3. 同一订单不应重复无限播报。
4. 需要记录已播报状态或播报日志,便于追查。
### 8.7 验收标准
1. 新订单出现后,指定终端可听到语音播报。
2. 同一订单不会被重复播报造成干扰。
3. 播报开关关闭后不再播报。
4. 部门播报和全场播报范围符合配置。
5. 电视机或广播设备在生产环境中可稳定使用。
## 09-需求七:质检 PDA 手机扫码应急功能
### 9.1 需求背景
质检 PDA 已有扫码作业能力,但在 PDA 设备故障时,需要使用手机应急完成扫码和质检相关工作。当前功能已开发完成,但生产环境下由于扫码组件安全限制无法使用。
### 9.2 功能目标
1. 确保手机扫码功能在生产环境可正常使用。
2. 在 PDA 故障时,手机可以临时替代 PDA 进行扫码质检作业。
3. 解决扫码组件在生产环境下的安全限制问题。
### 9.3 问题说明
扫码组件通常依赖浏览器摄像头权限。生产环境可能存在以下限制:
1. 页面不是 HTTPS浏览器禁止调用摄像头。
2. 访问地址使用 IP 或非受信任域名,浏览器阻止摄像头权限。
3. 手机浏览器权限未授权。
4. 扫码组件要求安全上下文HTTP 环境不可用。
5. 内嵌浏览器或企业微信、钉钉 WebView 权限策略不同。
### 9.4 解决方向
1. 将生产环境扫码页面部署到 HTTPS。
2. 配置可信域名和证书,避免直接使用不安全 HTTP 地址调用摄像头。
3. 如果必须内网使用,需要评估内网 HTTPS 证书或受信任证书安装方案。
4. 针对手机浏览器、企业微信、钉钉等访问方式分别验证摄像头权限。
5. 保留手工输入条码的兜底方案,避免扫码不可用时业务中断。
### 9.5 功能要求
1. 手机页面可打开摄像头并扫码。
2. 扫码结果可回填到质检业务流程。
3. 扫码失败时允许手动输入条码。
4. 页面需要适配手机端显示。
5. 扫码权限异常时给出明确提示,例如“请使用 HTTPS 地址访问”或“请允许摄像头权限”。
### 9.6 验收标准
1. 生产环境手机扫码可正常调用摄像头。
2. 扫码后可完成质检业务操作。
3. PDA 故障时,手机应急流程可完整跑通。
4. 摄像头权限失败时有明确提示和手动输入兜底。
5. 不影响 PDA 原有扫码功能。
## 10-优先级建议
| 优先级 | 需求 | 原因 |
| --- | --------------- | ------------------ |
| P2 | 质检 PDA 手机扫码应急功能 | 已开发但生产不可用,影响故障应急能力 |
| P0 | 库存盘点及入库库位选择优化 | 直接影响库存准确性和入库操作 |
| P0 | 默认库位设置功能调整 | 影响仓储配置职责和入库库位逻辑 |
| P0 | 物料编码查询 | 涉及页面多,但收益明确 |
| P1 | 车间派工移动端适配 | 改善现场移动操作效率 |
| P2 | 看板优化 | 影响现场展示和管理效率 |
| P2 | 语音播报 | 需要确认硬件、浏览器和广播接入方案 |
## 11-实施拆分建议
### 第一阶段:库存与查询基础能力
1. 默认库位设置迁移。
2. 物料编码查询补充。
3. 物料系列字段和库存盘点筛选。
4. 物料入库库位过滤。
### 第二阶段:移动端与应急能力
1. 车间派工移动端适配。
2. 质检 PDA 手机扫码生产环境修复。
### 第三阶段:看板与播报能力
1. 仓库看板新增。
2. 采购看板新增或优化。
3. 现有看板数据口径调整。
4. 新订单语音播报试点。
## 12-待确认事项
1. 默认库位设置新组件归属菜单:仓储管理、基础数据,或单独配置模块。
2. “没有默认库存”与“没有库存库位”的业务定义是否一致。
3. 物料入库库位选择在无库存时是否显示全库位,还是优先显示默认库位。
4. 系列字段的数据来源:手工输入、固定字典、还是由后端基础数据维护。
5. 库存盘点编辑库位是否允许直接改变已有库存所在库位,是否需要保留调整记录。
6. 看板刷新频率和大屏分辨率。
7. 语音播报使用电视机网页播放,还是接入全场广播硬件。
8. 手机扫码生产环境访问方式HTTPS 域名、内网 IP、企业微信、钉钉或普通浏览器。
9. 语音播报和扫码功能是否需要新增系统配置表。
## 13-风险说明
1. 默认库位、库存库位、入库库位逻辑如果口径不统一,可能导致入库误选库位。
2. 物料编码查询涉及页面多,需要避免漏改导出和弹窗查询。
3. 库存盘点编辑库位如果缺少日志,后续库存差异追溯困难。
4. 看板数据口径需与业务部门确认,否则容易出现“页面正确但业务理解不一致”的问题。
5. 浏览器语音自动播放和摄像头扫码都受 HTTPS、安全策略、设备权限影响必须在生产环境实测。
6. 全场广播接入可能涉及硬件、网络、音频设备,不应只按前端功能估算工作量。
## 14-文档备注
本次变更为新增需求文档,未修改业务代码。
修改人:Ld 修改时间:2026-06-29 10:29:16

View File

@@ -1,22 +0,0 @@
const http = require('http');
const fs = require('fs');
const path = require('path');
const root = __dirname;
const types = { '.html': 'text/html; charset=utf-8', '.png': 'image/png', '.css': 'text/css; charset=utf-8', '.js': 'text/javascript; charset=utf-8', '.md': 'text/plain; charset=utf-8' };
const server = http.createServer((req, res) => {
try {
const url = new URL(req.url, 'http://127.0.0.1:18765');
const rel = decodeURIComponent(url.pathname).replace(/^\/+/, '');
const filePath = path.resolve(root, rel);
if (!filePath.startsWith(path.resolve(root))) {
res.writeHead(403); res.end('Forbidden'); return;
}
fs.readFile(filePath, (err, data) => {
if (err) { res.writeHead(404); res.end('Not found: ' + filePath); return; }
res.writeHead(200, { 'Content-Type': types[path.extname(filePath).toLowerCase()] || 'application/octet-stream' });
res.end(data);
});
} catch (e) { res.writeHead(500); res.end(String(e)); }
});
server.listen(18765, '127.0.0.1', () => console.log('preview server on 18765'));
setInterval(() => {}, 1000);

View File

@@ -1,482 +0,0 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>立库可视化功能截图预览</title>
<style>
* { box-sizing: border-box; }
body {
margin: 0;
font-family: "Microsoft YaHei", Arial, sans-serif;
background: #eef2f7;
color: #303133;
}
.app-container { padding: 20px; }
.card {
height: 850px;
background: #fff;
border: 1px solid #e4e7ed;
box-shadow: 0 2px 12px rgba(0,0,0,.06);
}
.tab {
height: 44px;
border-bottom: 1px solid #dcdfe6;
background: #f5f7fa;
display: flex;
align-items: end;
padding-left: 0;
}
.tab span {
display: inline-flex;
align-items: center;
height: 44px;
padding: 0 22px;
background: #fff;
border-right: 1px solid #dcdfe6;
border-top: 2px solid #409eff;
font-size: 14px;
color: #409eff;
}
.toolbar {
margin: 7px 0;
padding: 0 12px;
display: flex;
align-items: center;
gap: 10px;
flex-wrap: wrap;
height: 42px;
}
.toolbar label { font-size: 13px; color: #000; }
.select, .button, .switch {
height: 32px;
border-radius: 4px;
font-size: 13px;
display: inline-flex;
align-items: center;
}
.select {
width: 120px;
border: 1px solid #dcdfe6;
padding: 0 10px;
justify-content: space-between;
color: #606266;
background: #fff;
}
.select::after { content: "⌄"; color: #909399; }
.button {
border: 1px solid transparent;
padding: 0 12px;
color: #fff;
gap: 4px;
}
.primary { background: #409eff; }
.default { background: #fff; color: #606266; border-color: #dcdfe6; }
.success { background: #67c23a; }
.switch {
margin-left: 10px;
gap: 8px;
color: #606266;
}
.switch-track {
width: 42px;
height: 22px;
border-radius: 12px;
background: #409eff;
position: relative;
}
.switch-track::after {
content: "";
position: absolute;
right: 2px;
top: 2px;
width: 18px;
height: 18px;
border-radius: 50%;
background: #fff;
}
.stats {
display: grid;
grid-template-columns: repeat(6, 1fr);
gap: 10px;
margin: 10px 12px;
}
.stat {
border: 1px solid #ebeef5;
border-radius: 4px;
text-align: center;
padding: 10px 0;
box-shadow: 0 2px 8px rgba(0,0,0,.04);
}
.stat .label { color: #909399; font-size: 12px; }
.stat .value { font-size: 20px; font-weight: bold; margin-top: 4px; }
.legend {
margin-bottom: 15px;
display: flex;
align-items: center;
justify-content: center;
gap: 20px;
flex-wrap: wrap;
}
.legend-item {
display: flex;
align-items: center;
font-size: 12px;
}
.legend-color {
width: 20px;
height: 20px;
border-radius: 4px;
border: 1px solid #ddd;
margin-right: 5px;
}
.warehouse-area {
height: 600px;
overflow: auto;
border: 1px solid #e4e7ed;
border-radius: 4px;
margin: 0 12px;
padding: 15px;
background: #f5f7fa;
}
.warehouse-group {
margin-bottom: 30px;
padding: 15px;
background: white;
border-radius: 4px;
box-shadow: 0 2px 4px rgba(0,0,0,.1);
}
.group-title {
text-align: center;
margin-bottom: 10px;
color: #303133;
font-weight: bold;
background: #e8f4fd;
padding: 5px;
border-radius: 4px;
}
table {
width: 100%;
min-width: 1200px;
border-collapse: collapse;
margin: 0 auto;
table-layout: fixed;
}
th, td {
border: 1px solid #e4e7ed;
text-align: center;
height: 40px;
min-width: 40px;
font-size: 12px;
position: relative;
}
th {
background: #f5f7fa;
font-weight: bold;
color: #303133;
}
.row-layer-header, .row-layer-cell {
width: 80px;
min-width: 80px;
background: #e8f4fd;
color: #2196f3;
font-weight: bold;
}
.row-layer-cell { background: #f5f7fa; color: #303133; }
.highlight-row .row-layer-cell {
background: #bbdefb;
color: #1976d2;
}
.highlight-col { background: #bbdefb; color: #1976d2; }
.cell {
cursor: pointer;
font-size: 14px;
font-weight: bold;
transition: all .2s;
}
.cell:hover {
transform: scale(1.08);
z-index: 2;
box-shadow: 0 2px 8px rgba(0,0,0,.2);
}
.status-2 { background: #4caf50; color: #fff; }
.status-1 { background: #ff9800; color: #fff; }
.status-0 { background: #e0e0e0; color: #666; }
.status-9 { background: skyblue; color: #fff; }
.selected {
box-shadow: 0 0 0 2px #2196f3 inset;
outline: 2px solid #2196f3;
outline-offset: -2px;
}
.tooltip {
position: absolute;
bottom: calc(100% + 6px);
left: 50%;
transform: translateX(-50%);
background: rgba(0,0,0,.82);
color: white;
padding: 4px 8px;
border-radius: 4px;
font-size: 12px;
white-space: nowrap;
z-index: 4;
font-weight: normal;
}
.pagination {
text-align: center;
margin-top: 10px;
color: #606266;
font-size: 13px;
}
.page-box {
display: inline-flex;
align-items: center;
gap: 8px;
border: 1px solid #ebeef5;
padding: 6px 10px;
border-radius: 4px;
background: #fff;
}
.page-num {
min-width: 28px;
height: 28px;
border-radius: 3px;
display: inline-flex;
align-items: center;
justify-content: center;
}
.page-current { background: #409eff; color: #fff; }
.modal-backdrop {
display: none;
position: fixed;
inset: 0;
background: rgba(0,0,0,.2);
align-items: center;
justify-content: center;
z-index: 10;
}
body.show-detail #detailModal,
body.show-material #materialModal { display: flex; }
.dialog {
background: #fff;
border-radius: 2px;
box-shadow: 0 4px 18px rgba(0,0,0,.18);
overflow: hidden;
}
.detail-dialog { width: 500px; }
.material-dialog { width: 941px; }
.dialog-title {
height: 54px;
display: flex;
align-items: center;
justify-content: center;
font-size: 18px;
border-bottom: 1px solid #ebeef5;
}
.dialog-body { padding: 20px; }
.detail-box {
padding: 10px;
background: #f5f7fa;
border-radius: 4px;
line-height: 1.7;
}
.dialog-footer {
border-top: 1px solid #ebeef5;
padding: 10px 20px;
text-align: right;
}
.close-button {
height: 32px;
padding: 0 15px;
border: 1px solid #dcdfe6;
background: #fff;
border-radius: 4px;
color: #606266;
}
.material-table {
min-width: 0;
table-layout: auto;
font-size: 13px;
}
.material-table th {
color: #606266;
height: 38px;
background: #f5f7fa;
}
.material-table td { height: 46px; }
.qty { color: #67c23a; font-weight: bold; }
.lockqty { color: #e6a23c; font-weight: bold; }
.unit { font-size: 10px; color: #909399; }
.mode-icon .cell { font-size: 18px; }
.mode-icon .text-symbol { display: none; }
.mode-icon .icon-symbol { display: inline; }
.icon-symbol { display: none; }
.callout {
position: absolute;
right: 30px;
top: 105px;
background: #fffbe6;
border: 1px solid #ffe58f;
color: #6b4c00;
padding: 8px 12px;
border-radius: 4px;
font-size: 13px;
z-index: 5;
display: none;
}
body.show-filter-tip .callout { display: block; }
</style>
</head>
<body>
<div class="app-container">
<div class="card">
<div class="tab"><span>立库可视化</span></div>
<div class="toolbar">
<label>库位筛选</label>
<div class="select" id="aisleSelect">第一巷道</div>
<div class="select" id="rowSelect">03-01</div>
<div class="button primary">🔍 搜索</div>
<div class="button default">↻ 重置</div>
<div class="button success">⟲ 刷新数据</div>
<div class="switch"><span id="modeText">显示文字</span><span class="switch-track"></span></div>
</div>
<div class="callout">筛选区支持按巷道重新取数、按行-层收窄视图,并可切换文字/图标显示模式。</div>
<div class="stats">
<div class="stat"><div class="label">总库位数</div><div class="value">384</div></div>
<div class="stat"><div class="label">有物料有托盘</div><div class="value" style="color:#4caf50">138</div></div>
<div class="stat"><div class="label">有托盘无物料</div><div class="value" style="color:#ff9800">76</div></div>
<div class="stat"><div class="label">空闲库位</div><div class="value" style="color:#9e9e9e">154</div></div>
<div class="stat"><div class="label">使用率</div><div class="value" style="color:#2196f3">55.7%</div></div>
<div class="stat"><div class="label">数据行数</div><div class="value" style="color:#9c27b0">8</div></div>
</div>
<div class="legend">
<div class="legend-item"><div class="legend-color" style="background:#4caf50"></div>有物料有托盘 (物)</div>
<div class="legend-item"><div class="legend-color" style="background:#ff9800"></div>有托盘无物料 (盘)</div>
<div class="legend-item"><div class="legend-color" style="background:#e0e0e0"></div>空库位 (空)</div>
<div class="legend-item"><div class="legend-color" style="background:#bbdefb;border:2px solid #2196f3"></div>选中库位</div>
</div>
<div class="warehouse-area">
<div class="warehouse-group">
<div class="group-title">立库组</div>
<table id="warehouseTable">
<thead>
<tr id="headRow"><th class="row-layer-header">行-层</th></tr>
</thead>
<tbody id="tableBody"></tbody>
</table>
</div>
<div style="text-align:center;margin-top:20px;color:#909399;font-size:12px">显示 8 行数据</div>
</div>
<div class="pagination">
<div class="page-box">
<span>共 8 条</span>
<span>8条/页</span>
<span></span>
<span class="page-num page-current">1</span>
<span></span>
<span>前往 1 页</span>
</div>
</div>
</div>
</div>
<div class="modal-backdrop" id="detailModal">
<div class="dialog detail-dialog">
<div class="dialog-title">库位详情 03-08-01</div>
<div class="dialog-body">
<div class="detail-box">有托盘但无物料,需补充物料。当前库位已被识别为托盘占用状态,适合仓储人员核对托盘与物料绑定情况。</div>
</div>
<div class="dialog-footer"><button class="close-button">关闭</button></div>
</div>
</div>
<div class="modal-backdrop" id="materialModal">
<div class="dialog material-dialog">
<div class="dialog-title">库位信息 03-12-01</div>
<div class="dialog-body">
<table class="material-table">
<thead>
<tr>
<th>物料编号</th>
<th>物料名称</th>
<th>图号</th>
<th>型号</th>
<th>库存数量</th>
<th>锁定库存</th>
<th>批次</th>
</tr>
</thead>
<tbody>
<tr>
<td>02.009.001.0012</td>
<td>直线导轨组件</td>
<td>LRS3056-0312-01</td>
<td>HGW25CA</td>
<td><div class="qty">14.000</div><div class="unit"></div></td>
<td><div class="lockqty">2.000</div><div class="unit"></div></td>
<td>BATCH031201</td>
</tr>
<tr>
<td>02.009.001.0013</td>
<td>滑块组件</td>
<td>LRS3056-0312-02</td>
<td>HGW25CC</td>
<td><div class="qty">6.000</div><div class="unit"></div></td>
<td><div style="color:#909399">0.000</div><div class="unit"></div></td>
<td>BATCH031202</td>
</tr>
</tbody>
</table>
</div>
<div class="dialog-footer"><button class="close-button">关闭</button></div>
</div>
</div>
<script>
const columns = 48;
const rows = ['04-04','04-03','04-02','04-01','03-04','03-03','03-02','03-01'];
const statuses = [2,0,1,2,0,0,2,1,0,2,1,2,0,9,2,0,1,0,2,2,0,1,0,2,0,0,1,2,0,2,0,1,2,0,0,9,2,1,0,2,0,1,2,0,0,2,1,0];
const head = document.getElementById('headRow');
for (let c = 1; c <= columns; c++) {
const th = document.createElement('th');
th.textContent = c;
if (c === 12) th.className = 'highlight-col';
head.appendChild(th);
}
const tbody = document.getElementById('tableBody');
rows.forEach((row, rIndex) => {
const tr = document.createElement('tr');
if (row === '03-01') tr.className = 'highlight-row';
const rowCell = document.createElement('td');
rowCell.className = 'row-layer-cell';
rowCell.textContent = row;
tr.appendChild(rowCell);
for (let c = 1; c <= columns; c++) {
const status = statuses[(c + rIndex * 5) % statuses.length];
const td = document.createElement('td');
td.className = 'cell status-' + status;
if (row === '03-01' && c === 12) td.className += ' selected';
const text = status === 2 ? '物' : status === 1 ? '盘' : status === 9 ? '锁' : '空';
const icon = status === 2 ? '▣' : status === 1 ? '▤' : status === 9 ? '🔒' : '';
td.innerHTML = '<span class="text-symbol">' + text + '</span><span class="icon-symbol">' + icon + '</span>';
if (row === '03-01' && c === 12) {
const tip = document.createElement('span');
tip.className = 'tooltip';
tip.textContent = '有物料有托盘';
td.appendChild(tip);
}
tr.appendChild(td);
}
tbody.appendChild(tr);
});
const params = new URLSearchParams(location.search);
const shot = params.get('shot');
if (shot === 'filter') {
document.body.classList.add('show-filter-tip');
document.body.classList.add('mode-icon');
document.getElementById('modeText').textContent = '显示图标';
document.getElementById('aisleSelect').textContent = '第三巷道';
document.getElementById('rowSelect').textContent = '03-01';
}
if (shot === 'detail') document.body.classList.add('show-detail');
if (shot === 'material') document.body.classList.add('show-material');
</script>
</body>
</html>

View 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. 若库存盘点支持通用件、自制件、采购件多库存表,后续可抽出统一库存变动存储过程,减少重复逻辑。

View 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["刷新库存盘点列表"]
```

View 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. 调拨记录写入。

View 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`

View 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 | 需要补齐交付验收材料 |

View 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 IP192.168.1.27
数据库ERPTOOL_JY_20250826Back
```
已验证连接结果:
```text
DatabaseName=ERPTOOL_JY_20250826Back
Version=Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (X64)
```
## 证据 3SQL 编译检查
脚本:
```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 | 暂无,待页面验收时补充 |

View 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 验收材料 |

View 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
库存盘点_调拨记录
仓储管理_库存盘点_库存调拨
```

View 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. 查询 `库存盘点_调拨记录`,确认调拨记录写入完整。

View 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

View File

@@ -0,0 +1,324 @@
# 物料库位功能调整设计方案
## 一、背景
当前系统在新建、编辑物料时会维护物料的默认库位,并在数据库中写入物料与货位的初始关系。该机制会导致物料主档承担库存库位职责,也会在无真实库存的情况下生成 `货位存量 = 0` 的物料货位记录。
本次需求由仓库主管提出。现场正在进行库存盘点,盘点人员需要依据系统库存数据到对应库位核对物料实物数量、批次和状态。但当前系统内的库存库位设置并非由仓库人员在实际入库、上架或盘点业务中选择确认,而是在物料基础资料维护阶段预先设置,导致系统记录的库位与现场实际存放库位不匹配。该问题会直接影响盘点人员按系统数据查找物料,容易出现找不到物料、盘点库位错误、盘点差异无法快速定位等情况,进而影响库存准确性和仓库现场作业效率。
因此,本次功能调整的核心诉求不是单纯修改一个库位字段,而是将“物料标准库位”从物料主档维护中剥离,把库位确认权回归到仓库实际业务动作中,由仓库人员在入库、上架、调拨、盘点等场景按现场真实情况选择和确认库位,确保系统库存库位能够反映实际库存位置,为当前及后续库存盘点提供可靠的数据依据。
<br />
本次调整目标是:
1. 物料主档不再设置库位。
2. 物料标准维护组件不再编辑物料库位。
3. 入库时根据真实库存情况选择库位。
4. 有现有库存库位时优先显示已有库存库位;没有库存库位时显示全库位。
5. 盘点人员后续依据系统库存查询结果进行盘点时,系统库位应尽可能来源于仓库真实业务记录,减少基础资料预设库位造成的现场偏差。
## 二、现状核对
### 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. 当前库存盘点期间,优先保障盘点人员能够通过系统库存数据定位真实库位;对历史不准确库位数据不做批量自动修正,防止误改真实库存,需要结合盘点结果逐步校正。
备注:修改人:Ld 修改时间:2026-06-29 13:11:25
## 四、前端改造方案
### 4.1 物料维护页面
涉及文件:
- `src/views/TechnologyCenter/MaterialMaintain/index.vue`
- `src/views/TechnologyCenter/MaterialQuery/index.vue`
改造内容:
- 删除新增/编辑弹窗中的“库位”下拉控件。
- 删除 `form.库位` 字段。
- 删除 `库位` 必填校验。
- 删除 `inventoryLocation` 数据源。
- 删除 `getInventoryLocation()` 方法及页面初始化调用。
- 删除新增时默认 `form.库位 = 2514`
- 编辑物料时不再从行数据读取 `货位流水号` 回填到表单。
- 新增/编辑提交时保留 `货位流水号 = null` 参数,用于兼容旧存储过程参数要求。
说明:
前端不再提供物料库位维护入口。保留 `货位流水号 = null` 是为了在数据库脚本未执行或前后端不同步发布时,减少接口缺参风险。
该调整可以避免非仓库人员在维护物料基础资料时预先指定库位,减少后续库存盘点时系统库位与实物库位不一致的问题。
备注:修改人:Ld 修改时间:2026-06-29 13:11:25
### 4.2 物料库位维护页面
涉及文件:
- `src/views/WarehouseManagement/MaterialLocation/index.vue`
改造内容:
- 删除行内库位下拉编辑。
- 删除编辑、确定、取消按钮。
- 删除双击行切换编辑状态。
- 删除 `storageLocation` 数据源。
- 删除 `getLocateName()`
- 删除 `confirmEdit()`,不再调用 `仓储管理_物料库位_编辑数据`
- 删除页面中不可达的“增加库位”弹窗和新增库位方法。
- 页面保留查询能力,用于查看历史物料库位数据。
说明:
该页面调整为只读查询页。后续如果确认不再需要查看历史标准库位,可在菜单侧隐藏该页面。
只读保留的目的,是在盘点期间为仓库主管和盘点人员提供历史库位追溯依据,便于判断差异来源是历史标准库位错误、实际移库未更新,还是入库时选择库位不准确。该页面不再允许直接修改库位,避免绕过真实库存业务动作造成新的库位偏差。
备注:修改人:Ld 修改时间:2026-06-29 13:11:25
### 4.3 入库库位选择
涉及文件:
- `src/views/WarehouseManagement/PurchasePartsStorage/index.vue`
改造内容:
- 页面创建时加载全库位列表。
- `getLocateName()` 返回 Promise并统一生成 `{ label, name, value }` 结构。
- `getInventoryLocateName(row)` 按当前物料名称、图号或型号查询 `仓储管理_库存盘点_查询`
- 查询结果中只保留库存大于 0 的库位。
- 如果存在库存库位:
- 当前行 `locateName` 使用库存库位列表。
- 下拉显示格式为 `货位名称(库存:数量)`
- 设置 `locateSource = 'inventory'`
- 如果不存在库存库位:
- 当前行 `locateName` 使用全库位列表。
- 设置 `locateSource = 'all'`
- 入库提交逻辑保持不变,继续校验并提交 `货位流水号组`
业务要求:
- 仓库人员办理采购入库、自制件入库时,必须根据现场实际上架库位选择系统库位。
- 系统存在该物料真实库存库位时,优先引导仓库人员选择已有库存库位,便于同物料集中存放和后续盘点。
- 系统不存在该物料真实库存库位时,允许从全库位中选择本次实际上架库位,形成后续库存查询和盘点依据。
- 盘点发现实物库位与系统库位不一致时,应通过盘点调整、移库或后续明确的库存业务流程修正,不再通过物料基础资料维护直接改库位。
备注:修改人:Ld 修改时间:2026-06-29 13:11:25
## 五、后端改造方案
新增 SQL 脚本:
- `sql/移除物料标准库位维护.sql`
脚本调整对象:
- `物料管理_增加`
- `物料管理_增加新`
- `物料管理_编辑`
调整内容:
- 保留 `@货位流水号` 参数,兼容旧调用。
- 新增物料时不再写入 `库存管理_物料主文件_基本.货位流水号`
- 新增物料时不再向 `库存管理_物料与货位对照表` 插入 `货位存量 = 0` 的初始记录。
- 编辑物料时不再更新 `库存管理_物料主文件_基本.货位流水号`
- 编辑物料时不再更新 `库存管理_物料与货位对照表.货位流水号`
不调整内容:
- 入库过程仍继续接收 `货位流水号组`
- 历史物料主档中的 `货位流水号` 暂不清理。
- 历史 `库存管理_物料与货位对照表` 中的 0 库存记录暂不清理。
后端调整边界:
- 本次不批量重算历史库存库位,避免在盘点期间引入新的数据扰动。
- 对已产生实际库存的物料库位关系,以库存业务单据和库存现存量记录为准。
- 后续若仓库主管确认需要清理历史 `货位存量 = 0` 的无效库位记录,应另行制定数据清理脚本,并在盘点结束或盘点数据确认后执行。
备注:修改人:Ld 修改时间:2026-06-29 13:11:25
## 六、入库库位选择流程
```mermaid
flowchart TD
A["用户点击入库行的库位按钮"] --> B["按物料名称和图号查询库存盘点"]
B --> C{"是否存在库存大于 0 的库位"}
C -->|是| D["显示已有库存库位"]
C -->|否| E["显示全库位"]
D --> F["用户选择库位"]
E --> F
F --> G["写回行数据: 货位流水号、货位名称"]
G --> H["入库提交"]
H --> I["提交货位流水号组"]
```
## 七、影响范围
### 7.1 受影响页面
- 技术中心物料维护
- 技术中心物料查询
- 仓储管理物料库位
- 仓储管理采购入库
- 仓储管理自制件入库
- 库存盘点人员使用的库存查询和盘点核对结果会间接受益于本次调整,后续新增库存的系统库位将更贴近现场真实库位。
备注:修改人:Ld 修改时间:2026-06-29 13:11:25
### 7.2 受影响数据库对象
- `库存管理_物料主文件_基本`
- `库存管理_物料与货位对照表`
- `库存管理_外购件累计库存`
- `物料管理_增加`
- `物料管理_增加新`
- `物料管理_编辑`
### 7.3 不受影响业务
- 已有库存查询。
- 已有入库记录查询。
- 已有出库、领料、调拨中基于真实库存记录的库位逻辑。
- 库位基础资料维护页面 `LocationManagement`
- 当前历史库存数量不因本次调整自动变化。
- 当前盘点差异数据不因本次调整自动生成或自动消除。
备注:修改人:Ld 修改时间:2026-06-29 13:11:25
## 八、发布步骤
1. 发布前端代码。
2. 执行 `sql/移除物料标准库位维护.sql`
3. 清浏览器缓存后进入系统验证。
4. 验证物料新增、编辑不再出现库位字段。
5. 验证物料库位维护页不可编辑。
6. 验证采购入库和自制件入库的库位选择逻辑。
7. 由仓库主管或指定仓库人员抽取正在盘点的物料进行核对,确认系统库存库位、入库选择库位和现场实际库位的对应关系。
8. 对盘点期间发现的历史库位不一致数据,记录物料名称、图号、系统库位、实际库位和差异原因,作为后续数据清理或库存调整依据。
备注:修改人:Ld 修改时间:2026-06-29 13:11:25
推荐前后端同时发布。若不能同时发布,先发布后端脚本更稳妥。
## 九、验证清单
### 9.1 物料新增
- 新增弹窗不显示库位。
- 新增物料可正常保存。
- 新增后 `库存管理_物料主文件_基本.货位流水号` 不写入新默认库位。
- 新增后不生成 `货位存量 = 0` 的物料货位对照记录。
### 9.2 物料编辑
- 编辑弹窗不显示库位。
- 修改名称、图号、单位、材料、类型、物料库等字段可正常保存。
- 编辑时不改变物料已有真实库存库位。
### 9.3 物料库位查询
- 页面可正常按物料名称、图号、库位查询。
- 页面不显示编辑按钮。
- 双击行不进入编辑状态。
- 不再调用 `仓储管理_物料库位_编辑数据`
### 9.4 入库库位选择
- 物料已有库存库位时,下拉只显示已有库存库位。
- 下拉显示库存数量。
- 物料没有库存库位时,下拉显示全库位。
- 未选择库位时不允许入库。
- 选择库位后采购入库可正常提交。
- 选择库位后自制件入库可正常提交。
### 9.5 盘点业务核对
- 盘点人员按系统库存查询结果查看物料库位时,可以明确区分历史库位数据和后续真实入库库位数据。
- 仓库人员新办理入库后,库存查询或盘点查询中的库位应与入库时选择的实际库位一致。
- 对无真实库存的物料,不应因为物料新增自动生成 `货位存量 = 0` 的库位记录干扰盘点查询。
- 对现场已发现系统库位与实际库位不一致的物料,应形成差异记录,不通过物料主档编辑直接修正。
备注:修改人:Ld 修改时间:2026-06-29 13:11:25
## 十、风险与回退
### 10.1 风险
- 若后端脚本未执行,前端传 `货位流水号 = null` 时,旧过程仍可能向物料主档或对照表写入空库位记录。
- 历史 0 库存物料货位记录仍存在,若库存盘点视图没有过滤库存数量,可能仍被查询出来。
- 部分报表如依赖物料主档默认库位,展示结果会从“标准库位”转为“历史库位”或空值。
- 当前盘点期间已经暴露的历史库位不匹配问题,不会因本次功能调整自动修复,需要仓库结合盘点结果进行后续校正。
- 若仓库人员入库时未按实际上架位置选择库位,仍可能继续产生新的系统库位与实际库位不一致问题,因此需要同步明确仓库操作要求。
备注:修改人:Ld 修改时间:2026-06-29 13:11:25
### 10.2 回退方式
- 前端回退相关 Vue 文件。
- 数据库可用脚本备份中的原存储过程定义恢复。
- 回退后重新构建并发布前端。

View 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. 如果后续改为统一物料选择组件,可将物料编号、物料名称、图号/型号三个搜索项抽成共用弹窗,减少重复页面维护。

View 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. 不在当前范围内的内容
- 非毛坯物料改制自动生成领料单。
- 仓库出库状态限制派工。
- 改制订单取消、退料、异常处理。
- 改制记录独立查询页面的完整开发。
这些内容作为后续扩展任务维护在任务矩阵中。

View 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 错误。

View File

@@ -0,0 +1,29 @@
# 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` 文档 | 文档结构完成 | 后续按任务矩阵继续推进 |
## 当前下一步
1.`精工车间_生成任务_查询数据` 最新完整 SQL 应用到数据库。
2. 使用图号 `XT40-07.01` 再次执行查询,确认不再出现 4104 错误。
3. 使用一条业务允许的测试订单发起真实改制。
4. 验证生产任务查询、车间派工、MES 待加工显示。
5. 补齐 3 条历史未回写 `工艺计划流水号` 的改制记录,或确认无需处理。

View File

@@ -0,0 +1,44 @@
# 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、入库验证 | 需业务允许测试数据 |
## 状态说明
| 状态 | 含义 |
| --- | --- |
| 已完成 | 已实现并至少完成基础验证 |
| 进行中 | 已有实现方案或部分实现,仍需数据库/页面联调确认 |
| 待执行验证 | 已提供修改 SQL但需要在数据库执行并验证 |
| 待联调 | 依赖上下游页面或接口,需要真实流程验证 |
| 待开发 | 尚未开始编码或建库 |
| 待确认 | 需要业务或数据归属确认 |
| 待验收 | 功能已基本闭环,需要按验收场景跑通 |
## 后续推进优先级
1. `GZ-015`:先修复生产任务查询动态 SQL。
2. `GZ-020`:选择测试订单跑完整流程。
3. `GZ-016``GZ-017`:验证 MES 和车间派工显示。
4. `GZ-019`:确认历史未回写记录是否需要补数据。
5. `GZ-018`:开发改制记录查询页面。

View File

@@ -0,0 +1,149 @@
# 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 | 暂无 | 当前未通过自动化任务创建真实业务数据 |
| 完整流程测试报告 | 待补充 | 需业务允许测试数据后生成 |

View File

@@ -0,0 +1,81 @@
# 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` 文档用于后续推进和任务管理,原设计方案、开发说明、测试报告保留作为上下文证据,避免历史决策丢失。

View 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)。

View 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. 如后续恢复“非毛坯物料改制需要领料”,再扩展领料单生成与仓库出库状态。

View 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. 验证改制默认工艺 `改制` 是否可直接派工和加工。

View File

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@@ -0,0 +1,392 @@
IF OBJECT_ID(N'dbo.仓储管理_入库记录_退货入库_验证', N'P') IS NOT NULL
DROP PROCEDURE dbo._入库记录_退货入库_验证
GO
CREATE PROCEDURE dbo._入库记录_退货入库_验证
@ INT = NULL,
@退 FLOAT = NULL,
@ INT = NULL,
@ INT = NULL,
@ INT = NULL,
@ DATETIME = NULL,
@ INT = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ FLOAT;
DECLARE @ NVARCHAR(50);
DECLARE @ NVARCHAR(50);
DECLARE @ NVARCHAR(50);
DECLARE @ INT;
SELECT
@ = ,
@ = ,
@ =
FROM dbo._物料主文件_基本
WHERE = @;
SELECT @ =
FROM dbo._外购件_入库记录
WHERE = @;
SET @ = RIGHT(ISNULL(@, N''), 2);
SET @ = LEFT(ISNULL(@, N''), 2);
IF @ = N'主轴'
BEGIN
SELECT @ = ISNULL(MAX(), 0)
FROM dbo._物料与货位对照表
WHERE = @
AND = @
AND = @
AND (@ IS NULL OR = @)
AND (@ IS NULL OR = @);
END
ELSE
BEGIN
SELECT @ = ISNULL(MAX(), 0)
FROM dbo._物料与货位对照表
WHERE = @
AND = @
AND = @
AND (@ IS NULL OR = @);
IF ISNULL(@, 0) < ISNULL(@退, 0)
AND (@ = N'MP' OR @ = N'毛坯库')
BEGIN
SELECT @ = ISNULL(MAX(), 0)
FROM dbo._物料与货位对照表
WHERE = @
AND IS NULL
AND IS NULL
AND (@ IS NULL OR = @);
END;
END;
IF ISNULL(@退, 0) > ISNULL(@, 0)
SELECT 0 AS ;
ELSE
SELECT 1 AS ;
END
GO
IF OBJECT_ID(N'dbo.仓储管理_入库记录_退货入库', N'P') IS NOT NULL
DROP PROCEDURE dbo._入库记录_退货入库
GO
CREATE PROCEDURE dbo._入库记录_退货入库
@ INT = NULL,
@退 FLOAT = NULL,
@退 NVARCHAR(500) = NULL,
@ INT = NULL,
@退 INT = NULL,
@ INT = NULL,
@ INT = NULL,
@ INT = NULL,
@ INT = NULL,
@ INT = NULL,
@ INT = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(500) = NULL,
@ NVARCHAR(500) = NULL,
@ NVARCHAR(500) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATETIME,
@ FLOAT = NULL
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
DECLARE @ NVARCHAR(50);
DECLARE @ NVARCHAR(50);
DECLARE @ INT;
DECLARE @ INT;
BEGIN TRY
BEGIN TRANSACTION;
SELECT @ =
FROM dbo._外购件_入库记录
WHERE = @;
INSERT INTO dbo._入库记录_退货记录表
(退, 退, , 退, 退, , , , , , , , , , )
VALUES
(@退, @退, @, @退, GETDATE(), @, @, @, @, @, @, @, @, @, @);
UPDATE dbo._外购件累计库存
SET = ISNULL(, 0) - @退
WHERE = @;
SELECT @ = , @ =
FROM dbo._物料主文件_基本
WHERE = @;
SET @ = LEFT(ISNULL(@, N''), 2);
SET @ = LEFT(ISNULL(@, N''), 2);
SET @ = 0;
IF @ = N'主轴'
BEGIN
UPDATE dbo._物料与货位对照表
SET = - @退
WHERE = @
AND = @
AND = @
AND (@ IS NULL OR = @)
AND CONVERT(VARCHAR(10), @, 23) = CONVERT(VARCHAR(10), , 23)
AND = @
AND ISNULL(, 0) >= @退;
SET @ = @@ROWCOUNT;
END
ELSE
BEGIN
IF @ = N'MP'
BEGIN
UPDATE dbo._物料与货位对照表
SET = - @退
WHERE = @
AND (@ IS NULL OR = @)
AND IS NULL
AND IS NULL
AND ISNULL(, 0) >= @退;
SET @ = @@ROWCOUNT;
END
ELSE
BEGIN
UPDATE dbo._物料与货位对照表
SET = - @退
WHERE = @
AND = @
AND = @
AND (@ IS NULL OR = @)
AND CONVERT(VARCHAR(10), @, 23) = CONVERT(VARCHAR(10), , 23)
AND ISNULL(, 0) >= @退;
SET @ = @@ROWCOUNT;
END;
END;
IF @ = 0
BEGIN
RAISERROR(N'库存盘点对应库位库存不足或未找到对应库存记录', 16, 1);
END;
UPDATE dbo._外购件_入库记录
SET = - @退,
退 = ISNULL(退, 0) + @退
WHERE = @;
IF @ = N'主轴'
UPDATE dbo._采购批次
SET = - @退
WHERE = @
AND = @;
IF @ = 1
BEGIN
UPDATE dbo._采购合同明细
SET = - @退,
= NULL
WHERE = @;
UPDATE dbo._采购合同
SET = 1
WHERE = @;
END
ELSE
BEGIN
UPDATE dbo._耗材采购合同明细
SET = ISNULL(, 0) - @退,
= NULL
WHERE = @;
UPDATE dbo._采购合同
SET = 1
WHERE = @;
END;
DECLARE @ INT;
DECLARE @ INT;
DECLARE @ INT;
SELECT
@ = ,
@ = ,
@ =
FROM dbo.PDM_组件名称_视图
WHERE = @;
IF @ = 3
BEGIN
UPDATE dbo._订单信息_基础表
SET = 3,
= NULL
WHERE = @;
UPDATE dbo._外购件累计库存
SET = ISNULL(, 0) + @退
WHERE = @;
END;
IF @ = 1 AND @ = 1
BEGIN
UPDATE dbo.PDM_组件名称
SET = 2
WHERE = @;
END;
COMMIT TRANSACTION;
SELECT '1' AS result;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
SELECT '0' AS result, ERROR_MESSAGE() AS msg;
END CATCH;
END
GO
IF OBJECT_ID(N'dbo.仓储管理_自制件入库记录_退货入库', N'P') IS NOT NULL
DROP PROCEDURE dbo._自制件入库记录_退货入库
GO
CREATE PROCEDURE dbo._自制件入库记录_退货入库
@ INT = NULL,
@退 FLOAT = NULL,
@退 NVARCHAR(500) = NULL,
@ INT = NULL,
@退 INT = NULL,
@ INT = NULL,
@ DATETIME,
@ NVARCHAR(50)
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
DECLARE @ INT;
DECLARE @ NVARCHAR(50);
DECLARE @ INT;
DECLARE @ INT;
BEGIN TRY
BEGIN TRANSACTION;
SELECT
@ = ,
@ =
FROM dbo._自制件_入库记录
WHERE = @;
INSERT INTO dbo._自制件入库记录_退货记录表
(退, 退, 退, 退, )
VALUES
(@退, @退, @退, GETDATE(), @);
UPDATE dbo._外购件累计库存
SET = ISNULL(, 0) - @退
WHERE = @;
SELECT @ =
FROM dbo._物料主文件_基本
WHERE = @;
SET @ = LEFT(ISNULL(@, N''), 2);
IF @ = N'主轴'
BEGIN
UPDATE dbo._物料与货位对照表
SET = - @退
WHERE = @
AND = @
AND (@ IS NULL OR = @)
AND CONVERT(VARCHAR(10), @, 23) = CONVERT(VARCHAR(10), , 23)
AND = @
AND ISNULL(, 0) >= @退;
END
ELSE
BEGIN
UPDATE dbo._物料与货位对照表
SET = - @退
WHERE = @
AND = @
AND (@ IS NULL OR = @)
AND CONVERT(VARCHAR(10), @, 23) = CONVERT(VARCHAR(10), , 23)
AND ISNULL(, 0) >= @退;
END;
SET @ = @@ROWCOUNT;
IF @ = 0
BEGIN
RAISERROR(N'库存盘点对应库位库存不足或未找到对应库存记录', 16, 1);
END;
UPDATE dbo._自制件_入库记录
SET = - @退,
退 = ISNULL(退, 0) + @退
WHERE = @;
IF @ = N'主轴'
UPDATE dbo._零件批次
SET = - @退
WHERE = @
AND = @;
UPDATE dbo._零件工艺计划
SET = 3,
= - @退
WHERE = @;
DECLARE @ INT;
DECLARE @ INT;
DECLARE @ INT;
SELECT
@ = ,
@ = ,
@ =
FROM dbo.PDM_组件名称_视图
WHERE = @;
IF @ = 3
BEGIN
UPDATE dbo._订单信息_基础表
SET = 3,
= NULL
WHERE = @;
UPDATE dbo._外购件累计库存
SET = ISNULL(, 0) + @退
WHERE = @;
END;
IF @ = 1 AND @ = 1
BEGIN
UPDATE dbo.PDM_组件名称
SET = 2
WHERE = @;
END;
COMMIT TRANSACTION;
SELECT '1' AS result;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
SELECT '0' AS result, ERROR_MESSAGE() AS msg;
END CATCH;
END
GO

View File

@@ -0,0 +1,283 @@
IF OBJECT_ID(N'dbo.库存盘点_调拨记录', N'U') IS NULL
BEGIN
CREATE TABLE dbo._调拨记录
(
INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
NVARCHAR(50) NULL,
INT NULL,
INT NULL,
INT NULL,
INT NULL,
INT NULL,
FLOAT NULL,
FLOAT NULL,
FLOAT NULL,
FLOAT NULL,
FLOAT NULL,
NVARCHAR(200) NULL,
INT NULL,
DATETIME NULL
)
END
GO
IF OBJECT_ID(N'dbo.仓储管理_库存盘点_库存调拨', N'P') IS NOT NULL
DROP PROCEDURE dbo._库存盘点_库存调拨
GO
CREATE PROCEDURE dbo._库存盘点_库存调拨
@ INT = NULL,
@ INT = NULL,
@ INT = NULL,
@ INT = NULL,
@ FLOAT = NULL,
@ FLOAT = NULL,
@ NVARCHAR(200) = NULL,
@ INT = NULL,
@ NVARCHAR(50) = NULL
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
DECLARE @ FLOAT;
DECLARE @ FLOAT;
DECLARE @ FLOAT;
DECLARE @ FLOAT;
DECLARE @ FLOAT;
DECLARE @ FLOAT;
DECLARE @ INT;
DECLARE @ NVARCHAR(50);
DECLARE @ FLOAT;
DECLARE @ NVARCHAR(200);
IF ISNULL(@, 0) = 0
BEGIN
SELECT '0' AS result, N'原库存记录不能为空' AS msg;
RETURN;
END;
IF ISNULL(@, 0) = 0
BEGIN
SELECT '0' AS result, N'目标库位不能为空' AS msg;
RETURN;
END;
IF ISNULL(@, 0) <= 0
BEGIN
SELECT '0' AS result, N'调拨数量必须大于0' AS msg;
RETURN;
END;
IF ISNULL(@, 0) = ISNULL(@, 0)
BEGIN
SELECT '0' AS result, N'目标库位不能与原库位相同' AS msg;
RETURN;
END;
BEGIN TRY
BEGIN TRANSACTION;
IF ISNULL(@, N'') = N'通用件'
BEGIN
SELECT
@ = ISNULL(, 0),
@ = ,
@ =
FROM dbo._半成品与货位对照表 WITH (UPDLOCK, ROWLOCK)
WHERE = @;
IF @ IS NULL
BEGIN
RAISERROR(N'原库存记录不存在', 16, 1);
END;
IF @ < @
BEGIN
RAISERROR(N'原库位库存不足', 16, 1);
END;
SET @ = @;
SET @ = @ - @;
UPDATE dbo._半成品与货位对照表
SET
= @,
= @,
= GETDATE()
WHERE = @;
SELECT
@ = ,
@ = ISNULL(, 0)
FROM dbo._半成品与货位对照表 WITH (UPDLOCK, ROWLOCK)
WHERE = @
AND = @;
SET @ = ISNULL(@, 0);
SET @ = @ + @;
IF @ IS NULL
BEGIN
INSERT INTO dbo._半成品与货位对照表
(, , , , )
VALUES
(@, @, @, @, GETDATE());
SET @ = SCOPE_IDENTITY();
END
ELSE
BEGIN
UPDATE dbo._半成品与货位对照表
SET
= @,
= @,
= GETDATE()
WHERE = @;
END;
SELECT @ = SUM(ISNULL(, 0))
FROM dbo._半成品与货位对照表
WHERE = @;
UPDATE dbo._半成品累计库存
SET = @
WHERE = @;
INSERT INTO dbo._修改记录
(, , , , )
VALUES
(@, @, @, @, @);
INSERT INTO dbo._调拨记录
(, , , , , , , , , , , , , )
VALUES
(@, @, @, @, @, @, @, @, @, @, @, @, @, GETDATE());
END
ELSE
BEGIN
SELECT
@ = ISNULL(, 0),
@ = ,
@ = ,
@ =
FROM dbo._物料与货位对照表 WITH (UPDLOCK, ROWLOCK)
WHERE = @;
IF @ IS NULL
BEGIN
RAISERROR(N'原库存记录不存在', 16, 1);
END;
IF @ < @
BEGIN
RAISERROR(N'原库位库存不足', 16, 1);
END;
IF ISNULL(@, N'') = N''
BEGIN
SET @ = CONVERT(VARCHAR(10), GETDATE(), 23) + N'-PD' + CONVERT(NVARCHAR(50), @);
UPDATE dbo._物料与货位对照表
SET = @
WHERE = @;
END;
SET @ = @;
SET @ = @ - @;
UPDATE dbo._物料与货位对照表
SET
= @,
= @,
= GETDATE()
WHERE = @;
SELECT
@ = ,
@ = ISNULL(, 0)
FROM dbo._物料与货位对照表 WITH (UPDLOCK, ROWLOCK)
WHERE = @
AND = @
AND ISNULL(, 0) = 0
AND ISNULL(, 0) = 0;
SET @ = ISNULL(@, 0);
SET @ = @ + @;
IF @ IS NULL
BEGIN
INSERT INTO dbo._物料与货位对照表
(, , , , , )
VALUES
(@, @, @, @, GETDATE(), @);
SET @ = SCOPE_IDENTITY();
END
ELSE
BEGIN
UPDATE dbo._物料与货位对照表
SET
= @,
= @,
= GETDATE()
WHERE = @;
END;
SELECT @ = SUM(ISNULL(, 0))
FROM dbo._物料与货位对照表
WHERE = @;
IF NOT EXISTS (
SELECT 1
FROM dbo._外购件累计库存
WHERE = @
)
BEGIN
INSERT INTO dbo._外购件累计库存
(, )
VALUES
(@, @);
END
ELSE
BEGIN
UPDATE dbo._外购件累计库存
SET = @
WHERE = @;
END;
INSERT INTO dbo._修改记录
(, , , , )
VALUES
(@, @, @, @, @);
INSERT INTO dbo._调拨记录
(, , , , , , , , , , , , , )
VALUES
(@, @, @, @, @, @, @, @, @, @, @, @, @, GETDATE());
END;
COMMIT TRANSACTION;
SELECT
'1' AS result,
N'调拨成功' AS msg,
@ AS ,
@ AS ,
@ AS ,
@ AS ,
@ AS ,
@ AS ;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
SET @ = ERROR_MESSAGE();
SELECT
'0' AS result,
@ AS msg;
END CATCH;
END
GO

View File

@@ -0,0 +1,156 @@
USE [ERPTOOL_JY_20250826Back]
GO
/*
目的:
1. 物料新增/编辑不再维护默认库位。
2. 新增物料不再写入 0 库存的“物料与货位对照表”记录。
3. 保留 @货位流水号 参数,兼容未同步发布的旧前端调用。
*/
ALTER PROCEDURE [dbo].[_增加]
@ int = null,
@ int = null,
@ int = null,
@ int = null,
@ nvarchar(50) = null,
@ nvarchar(50) = null,
@ nvarchar(50) = null,
@ int = null
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ int;
IF @ = 0
SET @ = 3;
INSERT INTO _物料主文件_基本
(, , , , , , )
VALUES
(@, @, @, @, @, @, @);
SET @ = IDENT_CURRENT(N'库存管理_物料主文件_基本');
INSERT INTO _外购件累计库存(, )
VALUES(@, 0);
END
GO
ALTER PROCEDURE [dbo].[_增加新]
@ int = null,
@ int = null,
@ int = null,
@ int = null,
@ nvarchar(50) = null,
@ nvarchar(50) = null,
@ nvarchar(MAX) = null,
@ int = null,
@ int = null
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ int,
@2 nvarchar(50) = null;
IF @ = 0
SET @ = 3;
IF @ = 1
BEGIN
SELECT @2 = 'LJ' + RIGHT(CAST(POWER(10, 8) AS varchar) + (SUBSTRING((SELECT FROM _物料主文件_基本 WHERE = (SELECT MAX() FROM _物料主文件_基本)), 3, 8) + 1), 8);
INSERT INTO _物料主文件_基本
(, , , , , , , , , )
VALUES
(@, @, @, @, @, @2, @, @, GETDATE(), @);
SET @ = IDENT_CURRENT(N'库存管理_物料主文件_基本');
INSERT INTO _外购件累计库存(, )
VALUES(@, 0);
END
IF @ = 2
BEGIN
SELECT @2 = 'LJ' + RIGHT(CAST(POWER(10, 8) AS varchar) + (SUBSTRING((SELECT FROM _物料主文件_基本 WHERE = (SELECT MAX() FROM _物料主文件_基本)), 3, 8) + 1), 8);
INSERT INTO _物料主文件_基本
(, , , , , , , , , )
VALUES
(@, @, @, @, @, @2, @, @, GETDATE(), @);
SET @ = IDENT_CURRENT(N'库存管理_物料主文件_基本');
INSERT INTO _外购件累计库存(, )
VALUES(@, 0);
SELECT @2 = 'MP' + RIGHT(CAST(POWER(10, 8) AS varchar) + (SUBSTRING((SELECT FROM _物料主文件_基本 WHERE = (SELECT MAX() FROM _物料主文件_基本)), 3, 8) + 1), 8);
INSERT INTO _物料主文件_基本
(, , , , , , , , , )
VALUES
(@ + 'MP', @ + 'MP', @, @, 1, @2, @, @, GETDATE(), @);
SET @ = IDENT_CURRENT(N'库存管理_物料主文件_基本');
INSERT INTO _外购件累计库存(, )
VALUES(@, 0);
END
END
GO
ALTER PROCEDURE [dbo].[_编辑]
@ int = null,
@ int = null,
@ int = null,
@ int = null,
@ nvarchar(50) = null,
@ nvarchar(50) = null,
@ int = null,
@ int = null,
@ nvarchar(50) = null,
@ nvarchar(MAX) = null,
@ int = null,
@ int = null,
@ int = null,
@ int = null
AS
BEGIN
SET NOCOUNT ON;
UPDATE _物料主文件_基本
SET = @,
= @,
= @,
= @,
= @,
= @,
= GETDATE(),
= @,
= @,
= @
WHERE = @;
UPDATE dbo.PDM_零件明细表_基本件
SET = @
WHERE = @;
UPDATE dbo.PDM_零件明细表_标准件和外购件
SET = @
WHERE = @;
IF (SELECT COUNT(*) FROM PDM_零件明细表_基本件 WHERE = @) > 0
BEGIN
IF (SELECT COUNT(*) FROM _零件工艺计划 WHERE IN (SELECT FROM PDM_零件明细表_基本件 WHERE = @) AND < 4) > 0
BEGIN
UPDATE _零件工艺计划
SET = @
WHERE IN (SELECT FROM PDM_零件明细表_基本件 WHERE = @)
AND < 4;
END
END
END
GO

View File

@@ -294,6 +294,13 @@
</el-dialog>
<el-dialog v-el-drag-dialog :visible.sync="dialogFormVisible100" center width="770px">
<div style="width: 100%;overflow: hidden">
<el-input
v-model="materialCodeValue"
style="width:180px"
placeholder="物料编号"
size="small"
clearable
@keyup.enter.native="pageCurrent10=1;searchTable10()"/>
<el-input v-model="materialNameTypeValue" style="width:200px" placeholder="物料名称规格型号" size="small" clearable @keyup.enter.native="pageCurrent10=1;searchTable10()"/>
<el-table
:data="tableData7"
@@ -1054,6 +1061,8 @@ export default {
loading1: false, //
type: '',
typeValue: '',
materialCodeValue: '',
materialNameTypeValue: '',
dialogFormVisibleBackOrder: false,
dialogFormVisible: false,
@@ -1405,13 +1414,16 @@ export default {
}
},
searchTable10() {
let materialNameTypeValue_check
let materialCodeValue_check, materialNameTypeValue_check
this.materialCodeValue ? materialCodeValue_check = 1 : materialCodeValue_check = 0
this.materialNameTypeValue ? materialNameTypeValue_check = 1 : materialNameTypeValue_check = 0
var param = []
param[0] = ['物料名称_check', materialNameTypeValue_check]
param[1] = ['物料名称', this.materialNameTypeValue]
param[2] = ['排序名称', this.orderName]
param[3] = ['排序方式', this.order]
param[4] = ['物料编码_check', materialCodeValue_check]
param[5] = ['物料编码', this.materialCodeValue]
var Data = this.CreateData('11', '仓储管理_通用库存_查询', param, this.pageSize10, this.pageCurrent10)
this.ExecDatabase(Data).then(response => {
this.tableData7 = response.data.rows
@@ -2047,3 +2059,4 @@ export default {
}
</style>

View File

@@ -260,6 +260,13 @@
</el-dialog>-->
<el-dialog v-el-drag-dialog :visible.sync="dialogFormVisible100" center width="834px">
<div style="width: 100%;overflow: hidden">
<el-input
v-model="materialCodeValue"
style="width:180px"
placeholder="物料编号"
size="small"
clearable
@keyup.enter.native="pageCurrent10=1;searchTable10()"/>
<el-input v-model="materialNameTypeValue" style="width:200px" placeholder="物料名称规格型号" size="small" clearable @keyup.enter.native="pageCurrent10=1;searchTable10()"/>
<el-table
:data="tableData7"
@@ -981,6 +988,8 @@ export default {
loading1: false, //
type: '',
typeValue: '',
materialCodeValue: '',
materialNameTypeValue: '',
dialogFormVisible: false,
dialogFormVisible10: false,
@@ -1266,13 +1275,16 @@ export default {
}
},
searchTable10() {
let materialNameTypeValue_check
let materialCodeValue_check, materialNameTypeValue_check
this.materialCodeValue ? materialCodeValue_check = 1 : materialCodeValue_check = 0
this.materialNameTypeValue ? materialNameTypeValue_check = 1 : materialNameTypeValue_check = 0
var param = []
param[0] = ['物料名称_check', materialNameTypeValue_check]
param[1] = ['物料名称', this.materialNameTypeValue]
param[2] = ['排序名称', this.orderName]
param[3] = ['排序方式', this.order]
param[4] = ['物料编码_check', materialCodeValue_check]
param[5] = ['物料编码', this.materialCodeValue]
var Data = this.CreateData('11', '仓储管理_通用库存_查询', param, this.pageSize10, this.pageCurrent10)
this.ExecDatabase(Data).then(response => {
this.tableData7 = response.data.rows
@@ -1900,3 +1912,4 @@ export default {
}
</style>

View File

@@ -1,11 +1,16 @@
<template>
<div class="app-container">
<el-card style="height: 850px">
<el-row>
<el-col style="margin-left: 7px;width: 831px">
<div class="app-container receive-task-page">
<el-card class="receive-task-card">
<el-row class="receive-task-layout">
<el-col :span="10" class="receive-task-col order-col">
<div class="table-panel">
<div class="panel-title">
<span class="title-bar"></span>
<span>订单列表</span>
</div>
<!-- <el-card>-->
<div style="margin-top: 49px">
<el-table v-loading="loading" :data="tableData" highlight-current-row border stripe size="mini" style="width: 831px;margin-top: 41px" height="550px" @row-click="searchTable1" >
<div class="table-wrap">
<el-table v-loading="loading" :data="tableData" highlight-current-row border stripe size="mini" class="receive-table" height="620px" @row-click="searchTable1" >
<el-table-column width="130px" label="订单编号" align="center" prop="订单编号">
<template slot-scope="scope">
{{ scope.row.订单编号 }}
@@ -57,13 +62,21 @@
</el-table>
</div>
<!-- </el-card>-->
</div>
</el-col>
<el-col style="margin-left: 20px;width: 881px">
<el-button type="warning" plain size="small" style="margin-top: 7px" @click="assembly">接收任务</el-button>
<el-col :span="14" class="receive-task-col detail-col">
<div class="table-panel detail-panel">
<div class="panel-title panel-title-action">
<div class="panel-title-left">
<span class="title-bar"></span>
<span>部件明细</span>
</div>
<el-button type="warning" plain size="small" icon="el-icon-download" @click="assembly">接收任务</el-button>
</div>
<!-- <el-card>-->
<div style="margin-top: 10px">
<el-table v-loading="loading1" :data="tableData1" :header-cell-style="{background: '#2283D4',color: 'white'}" highlight-current-row border stripe size="small" style="width: 881px;" height="550px" @selection-change="handleSelectionChange">
<div class="table-wrap">
<el-table v-loading="loading1" :data="tableData1" :header-cell-style="{background: '#2283D4',color: 'white'}" highlight-current-row border stripe size="mini" class="receive-table" height="620px" @selection-change="handleSelectionChange">
<el-table-column :selectable="selectable" type="selection" align="center" width="50px"/>
<el-table-column width="75px" label="部件状态" align="center">
<template slot-scope="scope">
@@ -108,6 +121,7 @@
</el-table>
</div>
<!-- </el-card>-->
</div>
</el-col>
</el-row>
</el-card>
@@ -450,6 +464,111 @@ export default {
}
</style>
<style scoped>
.receive-task-page {
padding: 12px 16px;
background: #f5f7fa;
}
.receive-task-card {
min-height: calc(100vh - 128px);
}
.receive-task-card >>> .el-card__body {
padding: 14px;
}
.receive-task-layout {
display: flex;
flex-wrap: nowrap;
width: 100%;
}
.receive-task-col {
float: none;
min-width: 0;
}
.order-col {
padding-right: 7px;
}
.detail-col {
padding-left: 7px;
}
.table-panel {
background: #fff;
border: 1px solid #d9e2ec;
margin-bottom: 14px;
min-width: 0;
}
.detail-panel {
margin-bottom: 0;
}
.panel-title {
height: 38px;
padding: 0 12px;
display: flex;
align-items: center;
font-size: 14px;
font-weight: 600;
color: #263445;
background: #f8fbff;
border-bottom: 1px solid #d9e2ec;
}
.panel-title-action {
justify-content: space-between;
}
.panel-title-left {
display: flex;
align-items: center;
}
.title-bar {
width: 3px;
height: 14px;
display: inline-block;
margin-right: 8px;
background: #2283d4;
}
.table-wrap {
padding: 10px 12px 12px;
min-width: 0;
overflow: hidden;
}
.receive-table {
width: 100%;
}
.receive-table >>> th {
padding: 4px 0;
background: #f2f6fc;
color: #1f2d3d;
font-weight: 600;
}
.receive-table >>> td {
padding: 3px 0;
}
.receive-table >>> .el-table__body tr.current-row > td {
background-color: #8fd0f4 !important;
}
.receive-table >>> .el-button--text {
padding: 0 3px;
}
.panel-title-action >>> .el-button {
margin-top: 0 !important;
padding: 7px 14px;
}
@media screen and (max-width: 1366px) {
.receive-task-page {
padding: 8px 10px;
}
.receive-task-card >>> .el-card__body {
padding: 10px;
}
.order-col {
width: 43%;
padding-right: 5px;
}
.detail-col {
width: 57%;
padding-left: 5px;
}
.table-wrap {
padding: 8px;
}
}
.wrapper{
width: 90%;
height: 50px;

View File

@@ -167,6 +167,13 @@
</el-card>
<el-dialog v-el-drag-dialog :visible.sync="dialogFormVisible" center width="770px">
<div style="width: 100%;overflow: hidden">
<el-input
v-model="materialCodeValue"
style="width:180px"
placeholder="物料编号"
size="small"
clearable
@keyup.enter.native="pageCurrent=1;searchTable10()"/>
<el-input v-model="materialNameTypeValue" style="width:200px" placeholder="物料名称规格型号" size="small" clearable @keyup.enter.native="pageCurrent=1;searchTable10()"/>
<el-table
ref="table"
@@ -232,6 +239,8 @@ export default {
data() {
return {
dialogFormVisible: false,
materialCodeValue: '',
materialNameTypeValue: '',
spindleWheel: [], // 主轴轮数组
motorWheel: [], // 电机轮数组
@@ -372,13 +381,16 @@ export default {
this.dialogFormVisible = true
},
searchTable10() {
let materialNameTypeValue_check
let materialCodeValue_check, materialNameTypeValue_check
this.materialCodeValue ? materialCodeValue_check = 1 : materialCodeValue_check = 0
this.materialNameTypeValue ? materialNameTypeValue_check = 1 : materialNameTypeValue_check = 0
var param = []
param[0] = ['物料名称_check', materialNameTypeValue_check]
param[1] = ['物料名称', this.materialNameTypeValue]
param[2] = ['排序名称', this.orderName]
param[3] = ['排序方式', this.order]
param[4] = ['物料编码_check', materialCodeValue_check]
param[5] = ['物料编码', this.materialCodeValue]
var Data = this.CreateData('11', '仓储管理_通用库存_查询', param, this.pageSize, this.pageCurrent)
this.ExecDatabase(Data).then(response => {
this.tableData10 = response.data.rows
@@ -943,3 +955,4 @@ export default {
}
</script>

View File

@@ -583,13 +583,20 @@
</el-card>
<el-dialog v-el-drag-dialog :visible.sync="dialogFormVisible" center width="770px">
<div style="width: 100%;overflow: hidden">
<el-input
v-model="materialCodeValue"
style="width:180px"
placeholder="物料编号"
size="small"
clearable
@keyup.enter.native="pageCurrent10=1;searchTable10()"/>
<el-input
v-model="materialNameTypeValue"
style="width:200px"
placeholder="物料名称规格型号"
size="small"
clearable
@keyup.enter.native="pageCurrent10=1;searchTable10()"/>
@keyup.enter.native="pageCurrent=1;searchTable10()"/>
<el-table
ref="table"
:data="tableData7"
@@ -1742,6 +1749,8 @@ export default {
productValueProductLocation: '',
product1: [],
typeValue: 1,
materialCodeValue: '',
materialNameTypeValue: '',
orderPersonnel: '',
orderNumber: '',
@@ -2433,13 +2442,16 @@ export default {
this.dialogFormVisible = true
},
searchTable10() {
let materialNameTypeValue_check
let materialCodeValue_check, materialNameTypeValue_check
this.materialCodeValue ? materialCodeValue_check = 1 : materialCodeValue_check = 0
this.materialNameTypeValue ? materialNameTypeValue_check = 1 : materialNameTypeValue_check = 0
var param = []
param[0] = ['物料名称_check', materialNameTypeValue_check]
param[1] = ['物料名称', this.materialNameTypeValue]
param[2] = ['排序名称', this.orderName]
param[3] = ['排序方式', this.order]
param[4] = ['物料编码_check', materialCodeValue_check]
param[5] = ['物料编码', this.materialCodeValue]
var Data = this.CreateData('11', '仓储管理_通用库存_查询', param, this.pageSize, this.pageCurrent)
this.ExecDatabase(Data).then(response => {
this.tableData7 = response.data.rows
@@ -3415,3 +3427,4 @@ a {
}
</style>

View File

@@ -470,6 +470,13 @@
</el-card>
<el-dialog v-el-drag-dialog :visible.sync="dialogFormVisible" center width="770px">
<div style="width: 100%;overflow: hidden">
<el-input
v-model="materialCodeValue"
style="width:180px"
placeholder="物料编号"
size="small"
clearable
@keyup.enter.native="pageCurrent=1;searchTable10()"/>
<el-input
v-model="materialNameTypeValue"
clearable
@@ -554,6 +561,8 @@ export default {
data() {
return {
dialogFormVisible: false,
materialCodeValue: '',
materialNameTypeValue: '',
spindleWheel: [], // 主轴轮数组
motorWheel: [], // 电机轮数组
@@ -679,13 +688,16 @@ export default {
this.dialogFormVisible = true
},
searchTable10() {
let materialNameTypeValue_check
let materialCodeValue_check, materialNameTypeValue_check
this.materialCodeValue ? materialCodeValue_check = 1 : materialCodeValue_check = 0
this.materialNameTypeValue ? materialNameTypeValue_check = 1 : materialNameTypeValue_check = 0
var param = []
param[0] = ['物料名称_check', materialNameTypeValue_check]
param[1] = ['物料名称', this.materialNameTypeValue]
param[2] = ['排序名称', this.orderName]
param[3] = ['排序方式', this.order]
param[4] = ['物料编码_check', materialCodeValue_check]
param[5] = ['物料编码', this.materialCodeValue]
var Data = this.CreateData('11', '仓储管理_通用库存_查询', param, this.pageSize, this.pageCurrent)
this.ExecDatabase(Data).then(response => {
this.tableData10 = response.data.rows
@@ -1225,3 +1237,4 @@ export default {
}
</script>

View File

@@ -84,7 +84,7 @@
</el-table-column>
<el-table-column :width="setColumnWidth('订单编号')" label="订单编号" align="center" prop="订单号" sortable="订单号" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.订单号1 }}
{{ scope.row.订单号1 || scope.row.订单号 }}
</template>
</el-table-column>
<!-- <el-table-column :width="setColumnWidth('姓名')" label="收货人" align="center" show-overflow-tooltip>

View File

@@ -564,6 +564,13 @@
</el-dialog>
<el-dialog v-el-drag-dialog :visible.sync="dialogFormVisible100" center width="770px">
<div style="width: 100%;overflow: hidden">
<el-input
v-model="materialCodeValue"
style="width:180px"
placeholder="物料编号"
size="small"
clearable
@keyup.enter.native="pageCurrent10=1;searchTable10()"/>
<el-input
v-model="materialNameTypeValue"
style="width:200px"
@@ -1564,6 +1571,8 @@ export default {
dialogFormVisible13: false,
dialogFormVisible100: false,
dialogFormVisibleBackOrder: false,
materialCodeValue: '',
materialNameTypeValue: '',
total: 0, // 分页总数
total10: 0, // 分页总数
@@ -2042,13 +2051,16 @@ export default {
},
// 以上是新曾
searchTable10() {
let materialNameTypeValue_check
let materialCodeValue_check, materialNameTypeValue_check
this.materialCodeValue ? materialCodeValue_check = 1 : materialCodeValue_check = 0
this.materialNameTypeValue ? materialNameTypeValue_check = 1 : materialNameTypeValue_check = 0
var param = []
param[0] = ['物料名称_check', materialNameTypeValue_check]
param[1] = ['物料名称', this.materialNameTypeValue]
param[2] = ['排序名称', this.orderName]
param[3] = ['排序方式', this.order]
param[4] = ['物料编码_check', materialCodeValue_check]
param[5] = ['物料编码', this.materialCodeValue]
var Data = this.CreateData('11', '仓储管理_通用库存_查询', param, this.pageSize10, this.pageCurrent10)
this.ExecDatabase(Data).then(response => {
this.tableData7 = response.data.rows
@@ -2894,3 +2906,4 @@ a {
margin-top: 20px;
}
</style>

View File

@@ -376,6 +376,13 @@
</el-dialog>
<el-dialog v-el-drag-dialog :visible.sync="dialogFormVisible100" center width="770px">
<div style="width: 100%;overflow: hidden">
<el-input
v-model="materialCodeValue"
style="width:180px"
placeholder="物料编号"
size="small"
clearable
@keyup.enter.native="pageCurrent10=1;searchTable10()"/>
<el-input v-model="materialNameTypeValue" style="width:200px" placeholder="物料名称规格型号" size="small" clearable @keyup.enter.native="pageCurrent10=1;searchTable10()"/>
<el-table
ref="table"
@@ -1100,6 +1107,8 @@ export default {
dialogFormVisible12: false,
dialogFormVisible13: false,
dialogFormVisible100: false,
materialCodeValue: '',
materialNameTypeValue: '',
total: 0, // 分页总数
total10: 0, // 分页总数
@@ -1306,13 +1315,16 @@ export default {
})
},
searchTable10() {
let materialNameTypeValue_check
let materialCodeValue_check, materialNameTypeValue_check
this.materialCodeValue ? materialCodeValue_check = 1 : materialCodeValue_check = 0
this.materialNameTypeValue ? materialNameTypeValue_check = 1 : materialNameTypeValue_check = 0
var param = []
param[0] = ['物料名称_check', materialNameTypeValue_check]
param[1] = ['物料名称', this.materialNameTypeValue]
param[2] = ['排序名称', this.orderName]
param[3] = ['排序方式', this.order]
param[4] = ['物料编码_check', materialCodeValue_check]
param[5] = ['物料编码', this.materialCodeValue]
var Data = this.CreateData('11', '仓储管理_通用库存_查询', param, this.pageSize10, this.pageCurrent10)
this.ExecDatabase(Data).then(response => {
this.tableData7 = response.data.rows
@@ -2095,3 +2107,4 @@ export default {
color: #999;
}
</style>

View File

@@ -2,6 +2,7 @@
<div class="app-container">
<el-card style="height: 850px; display: flex; flex-direction: column;">
<div style="margin-top: 7px; margin-bottom: 7px; flex-shrink: 0;">
<el-input v-model="materialCodeValue" style="width:150px" placeholder="物料编码" size="small" clearable/>
<el-input v-model="materialNameValue" style="width:150px" placeholder="物料名称" size="small" clearable/>
<el-input v-model="materialToolValue" style="width:150px" placeholder="图号/型号" size="small" clearable/>
<el-select
@@ -271,15 +272,6 @@
<el-form-item label="图号/型号" prop="图号或型号">
<el-input v-model="form.图号或型号" style="width:250px;" placeholder="图号/型号" size="small" clearable/>
</el-form-item>
<el-form-item label="库位" prop="库位">
<el-select v-model="form.库位" style="width:250px;" placeholder="库位" size="small" filterable clearable>
<el-option
v-for="item in inventoryLocation"
:key="item.value"
:label="item.label"
:value="item.value"/>
</el-select>
</el-form-item>
<el-form-item label="材料" prop="材料">
<el-select v-model="form.材料" style="width:250px;" placeholder="材料" size="small" filterable clearable>
<el-option
@@ -724,7 +716,6 @@ export default {
物料名称: '',
图号或型号: '',
材料: '',
库位: '',
单位: '',
类型: '',
物料库: '',
@@ -743,7 +734,6 @@ export default {
物料名称: [{ required: true, message: '请输入物料名称', trigger: 'blur' }],
图号或型号: [{ required: true, message: '请输入图号或型号', trigger: 'blur' }],
单位: [{ required: true, message: '请选择单位', trigger: 'change' }],
库位: [{ required: true, message: '请选择库位', trigger: 'change' }],
类型: [{ required: true, message: '请选择类型', trigger: 'change' }],
物料库: [{ required: true, message: '请选择物料库', trigger: 'change' }]
},
@@ -751,11 +741,11 @@ export default {
材料名称: [{ required: true, message: '请输入材料名称', trigger: 'blur' }]
},
materialNameValue: '',
materialCodeValue: '',
materialToolValue: '',
materialTypeValue: '',
materialValue: '',
materialScience: [],
inventoryLocation: [], // 库位
unit: [],
dateRange: '',
title: '',
@@ -811,7 +801,6 @@ export default {
this.getMaterialScience()
this.getUnit()
this.searchTable1()
this.getInventoryLocation()
},
methods: {
// 查看零件图
@@ -1079,18 +1068,6 @@ export default {
}
})
},
getInventoryLocation() {
var param = []
var Data = this.CreateData('11', '库存管理_货位_查询数据', param)
this.ExecDatabase(Data).then(response => {
for (let i = 0; i < response.data.length; i++) {
this.inventoryLocation.push({
label: response.data[i].货位名称,
value: response.data[i].货位流水号
})
}
})
},
getUnit() {
var param = []
var Data = this.CreateData('11', '单位_查询数据', param)
@@ -1158,7 +1135,6 @@ export default {
this.form.图号或型号 = ''
this.form.单位 = ''
this.form.材料 = ''
this.form.库位 = 2514
this.form.类型 = ''
this.form.物料库 = ''
this.dialogFormVisible = true
@@ -1182,7 +1158,7 @@ export default {
param[2] = ['单位流水号', this.form.单位]
param[3] = ['材料流水号', this.form.材料]
param[4] = ['类型', this.form.类型]
param[5] = ['货位流水号', this.form.库位]
param[5] = ['货位流水号', null]
param[6] = ['物料库流水号', this.form.物料库]
param[7] = ['人员编号', this.id]
param[8] = ['物料说明', this.form.物料说明]
@@ -1271,7 +1247,6 @@ export default {
this.form.物料说明 = row.物料说明
this.form.原图号或型号 = row.代号
this.form.材料 = Number(row.材料流水号) === 3 ? null : Number(row.材料流水号)
this.form.库位 = Number(row.货位流水号)
this.form.单位 = Number(row.单位流水号)
this.form.类型 = Number(row.类型)
this.form.物料库 = Number(row.物料库流水号)
@@ -1294,7 +1269,7 @@ export default {
param1[5] = ['物料流水号', this.materialValue]
param1[6] = ['操作者', this.id]
param1[7] = ['物料编码', this.form.物料编码]
param1[8] = ['货位流水号', this.form.库位]
param1[8] = ['货位流水号', null]
param1[9] = ['物料库流水号', this.form.物料库]
param1[10] = ['物料说明', this.form.物料说明]
param1[11] = ['安全库存', this.form.安全库存]
@@ -1327,7 +1302,7 @@ export default {
param[5] = ['物料流水号', this.materialValue]
param[6] = ['操作者', this.id]
param[7] = ['物料编码', this.form.物料编码]
param[8] = ['货位流水号', this.form.库位]
param[8] = ['货位流水号', null]
param[9] = ['物料库流水号', this.form.物料库]
param[10] = ['安全库存', this.form.安全库存]
param[11] = ['最高库存', this.form.最高库存]
@@ -1401,8 +1376,9 @@ export default {
// },
searchTable() {
this.tableData = []
let materialToolValue_check, materialNameValue_check, materialTypeValue_check, dateRange_check, checked_check
let materialToolValue_check, materialCodeValue_check, materialNameValue_check, materialTypeValue_check, dateRange_check, checked_check
this.materialToolValue ? materialToolValue_check = 1 : materialToolValue_check = 0
this.materialCodeValue ? materialCodeValue_check = 1 : materialCodeValue_check = 0
this.materialNameValue ? materialNameValue_check = 1 : materialNameValue_check = 0
this.materialTypeValue ? materialTypeValue_check = 1 : materialTypeValue_check = 0
this.checked ? checked_check = 1 : checked_check = 0
@@ -1429,6 +1405,8 @@ export default {
param[12] = ['PageSize', this.pageSize]
param[13] = ['PageCount', '1111', 'int', '1']
param[14] = ['ItemCount', '1111', 'int', '1']
param[15] = ['物料编码_check', materialCodeValue_check]
param[16] = ['物料编码', this.materialCodeValue]
var Data = this.CreateData('11', '物料管理_查询数据_分页', param)
this.ExecDatabase(Data).then(response => {
this.tableData = response.data.result

View File

@@ -2,6 +2,7 @@
<div class="app-container">
<el-card style="height: 850px">
<div style="margin-top: 7px; margin-bottom: 7px">
<el-input v-model="materialCodeValue" style="width:150px" placeholder="物料编码" size="small" clearable/>
<el-input v-model="materialNameValue" style="width:150px" placeholder="物料名称" size="small" clearable/>
<el-input v-model="materialToolValue" style="width:150px" placeholder="图号/型号" size="small" clearable/>
<el-select v-model="materialTypeValue" style="width:100px;" placeholder="物料类型" size="small" filterable clearable>
@@ -140,15 +141,6 @@
<el-form-item label="图号/型号" prop="图号或型号">
<el-input v-model="form.图号或型号" style="width:150px;" placeholder="图号/型号" size="small" clearable/>
</el-form-item>
<el-form-item label="库位" prop="库位">
<el-select v-model="form.库位" style="width:150px;" placeholder="库位" size="small" filterable clearable>
<el-option
v-for="item in inventoryLocation"
:key="item.value"
:label="item.label"
:value="item.value"/>
</el-select>
</el-form-item>
<el-form-item label="材料" prop="材料">
<el-select v-model="form.材料" style="width:150px;" placeholder="材料" size="small" filterable clearable>
<el-option
@@ -364,7 +356,6 @@ export default {
物料名称: '',
图号或型号: '',
材料: '',
库位: '',
单位: '',
类型: '',
物料库: '',
@@ -379,7 +370,6 @@ export default {
物料名称: [{ required: true, message: '请输入物料名称', trigger: 'blur' }],
图号或型号: [{ required: true, message: '请输入图号或型号', trigger: 'blur' }],
单位: [{ required: true, message: '请选择单位', trigger: 'change' }],
库位: [{ required: true, message: '请选择库位', trigger: 'change' }],
类型: [{ required: true, message: '请选择类型', trigger: 'change' }],
物料库: [{ required: true, message: '请选择物料库', trigger: 'change' }]
},
@@ -387,11 +377,11 @@ export default {
材料名称: [{ required: true, message: '请输入材料名称', trigger: 'blur' }]
},
materialNameValue: '',
materialCodeValue: '',
materialToolValue: '',
materialTypeValue: '',
materialValue: '',
materialScience: [],
inventoryLocation: [], // 库位
unit: [],
dateRange: '',
title: '',
@@ -442,7 +432,6 @@ export default {
this.getMaterialScience()
this.getUnit()
this.searchTable1()
this.getInventoryLocation()
},
methods: {
// 查看零件图
@@ -543,18 +532,6 @@ export default {
}
})
},
getInventoryLocation() {
var param = []
var Data = this.CreateData('11', '库存管理_货位_查询数据', param)
this.ExecDatabase(Data).then(response => {
for (let i = 0; i < response.data.length; i++) {
this.inventoryLocation.push({
label: response.data[i].货位名称,
value: response.data[i].货位流水号
})
}
})
},
getUnit() {
var param = []
var Data = this.CreateData('11', '单位_查询数据', param)
@@ -576,7 +553,6 @@ export default {
this.form.图号或型号 = ''
this.form.单位 = ''
this.form.材料 = ''
this.form.库位 = 2514
this.form.类型 = ''
this.form.物料库 = ''
this.dialogFormVisible = true
@@ -600,7 +576,7 @@ export default {
param[2] = ['单位流水号', this.form.单位]
param[3] = ['材料流水号', this.form.材料]
param[4] = ['类型', this.form.类型]
param[5] = ['货位流水号', this.form.库位]
param[5] = ['货位流水号', null]
param[6] = ['物料库流水号', this.form.物料库]
param[7] = ['人员编号', this.id]
var Data = this.CreateData('12', '物料管理_增加新', param)
@@ -687,7 +663,6 @@ export default {
this.form.原物料名称 = row.名称
this.form.原图号或型号 = row.代号
this.form.材料 = Number(row.材料流水号) === 3 ? null : Number(row.材料流水号)
this.form.库位 = Number(row.货位流水号)
this.form.单位 = Number(row.单位流水号)
this.form.类型 = Number(row.类型)
this.form.物料库 = Number(row.物料库流水号)
@@ -707,7 +682,7 @@ export default {
param1[5] = ['物料流水号', this.materialValue]
param1[6] = ['操作者', this.id]
param1[7] = ['物料编码', this.form.物料编码]
param1[8] = ['货位流水号', this.form.库位]
param1[8] = ['货位流水号', null]
param1[9] = ['物料库流水号', this.form.物料库]
var Data1 = this.CreateData('12', '物料管理_编辑', param1)
this.ExecDatabase(Data1).then(response => {
@@ -736,7 +711,7 @@ export default {
param[5] = ['物料流水号', this.materialValue]
param[6] = ['操作者', this.id]
param[7] = ['物料编码', this.form.物料编码]
param[8] = ['货位流水号', this.form.库位]
param[8] = ['货位流水号', null]
param[9] = ['物料库流水号', this.form.物料库]
var Data = this.CreateData('12', '物料管理_编辑', param)
this.ExecDatabase(Data).then(response => {
@@ -806,8 +781,9 @@ export default {
// })
// },
searchTable() {
let materialToolValue_check, materialNameValue_check, materialTypeValue_check, dateRange_check, checked_check
let materialToolValue_check, materialCodeValue_check, materialNameValue_check, materialTypeValue_check, dateRange_check, checked_check
this.materialToolValue ? materialToolValue_check = 1 : materialToolValue_check = 0
this.materialCodeValue ? materialCodeValue_check = 1 : materialCodeValue_check = 0
this.materialNameValue ? materialNameValue_check = 1 : materialNameValue_check = 0
this.materialTypeValue ? materialTypeValue_check = 1 : materialTypeValue_check = 0
this.checked ? checked_check = 1 : checked_check = 0
@@ -836,6 +812,8 @@ export default {
param[14] = ['ItemCount', '1111', 'int', '1']
param[15] = ['物料库', this.checkedsValue]
param[16] = ['物料库_check', checked_check]
param[17] = ['物料编码_check', materialCodeValue_check]
param[18] = ['物料编码', this.materialCodeValue]
var Data = this.CreateData('11', '物料管理_查询数据_分页', param)
this.ExecDatabase(Data).then(response => {
this.tableData = response.data.result

View File

@@ -3,6 +3,7 @@
<el-card style="height: 850px">
<div style="margin-top: 7px; margin-bottom: 7px">
<!--{{ $t('m.music') }}-->
<el-input v-model="materialCode" style="width: 150px " size="small" clearable placeholder="物料编号"/>
<el-input v-model="materialName" style="width: 150px " size="small" clearable placeholder="物料名称"/>
<el-input v-model="specificationsModel" style="width: 150px " size="small" clearable placeholder="图号或型号"/>
<el-input v-model="LocationName" style="width: 100px " size="small" clearable placeholder="库位"/>
@@ -96,11 +97,12 @@
<el-input-number v-model="scope.row.打印条码数" :min="1" size="mini" style="margin: 0;width: 100%"/>
</template>
</el-table-column>
<el-table-column widht="120px" label="操作" align="center">
<el-table-column width="180px" label="操作" align="center">
<template slot-scope="scope">
<el-button v-if="scope.row.edit" type="text" size="mini" icon="el-icon-circle-check-outline" @click="confirmEdit(scope.row)">确定</el-button>
<el-button v-if="scope.row.edit" class="cancel-btn" size="mini" type="text" @click="cancelEdit(scope.$index, scope.row)">取消</el-button>
<el-button v-else type="text" size="mini" @click="scope.row.edit=!scope.row.edit">编辑</el-button>
<el-button v-if="!scope.row.edit" type="text" size="mini" @click="openTransfer(scope.row)">调拨</el-button>
</template>
</el-table-column>
</el-table>
@@ -179,6 +181,69 @@
<el-button type="primary" size="small" icon="el-icon-search" @click="importExcelSearch">查询</el-button>
</div>
</el-dialog>
<el-dialog v-el-drag-dialog :visible.sync="transferDialogVisible" title="库存调拨" center width="520px">
<el-form label-position="left" label-width="100px" style="margin: auto">
<el-row>
<el-col :span="12">
<el-form-item label="物料名称:">
<span>{{ transferForm.物料名称 }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="图号/型号:">
<span>{{ transferForm.图号或型号 }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="原库位:">
<span>{{ transferForm.原货位名称 }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="原库存数:">
<span>{{ transferForm.原库存数 }}</span>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="目标库位:">
<el-select
v-model="transferForm.目标货位流水号"
size="small"
style="width: 260px"
clearable
filterable
placeholder="请选择目标库位"
@change="handleTransferLocationChange">
<el-option
v-for="item in storageLocation"
:key="item.value"
:label="item.label"
:value="item.value"/>
</el-select>
</el-form-item>
<el-form-item label="新库位:">
<el-input v-model="transferForm.新货位名称" clearable size="small" style="width: 260px" placeholder="请输入新库位名称"/>
<el-button :loading="transferLocationAdding" type="primary" plain size="small" style="margin-left: 8px" @click="addTransferLocation">新建</el-button>
</el-form-item>
<el-form-item label="调拨数量:">
<el-input-number
v-model="transferForm.调拨数量"
:min="1"
:max="Number(transferForm.原库存数)"
size="small"
style="width: 260px"/>
</el-form-item>
<el-form-item label="调拨备注:">
<el-input v-model="transferForm.调拨备注" clearable size="small" style="width: 360px" placeholder="请输入调拨备注"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button size="small" @click="transferDialogVisible=false">取消</el-button>
<el-button :loading="transferSubmitting" type="primary" size="small" @click="submitTransfer">确定调拨</el-button>
</div>
</el-dialog>
<el-dialog v-el-drag-dialog :visible.sync="dialogFormVisible" title="增加产品" center width="390px">
<el-form ref="form" :model="form" :rules="rules" label-position="left" label-width="100px" class="demo-ruleForm" style="margin: auto">
<el-row>
@@ -225,7 +290,11 @@ export default {
dialogFormVisible: false,
dialogFormVisible1: false,
dialogFormVisibleExcel: false,
transferDialogVisible: false,
transferLocationAdding: false,
transferSubmitting: false,
title: '',
materialCode: '',
materialName: '',
materialSpec: '',
materialValue: '',
@@ -239,6 +308,21 @@ export default {
库位: '',
入库数: ''
},
transferForm: {
物料与货位流水号: '',
物料流水号: '',
物料名称: '',
图号或型号: '',
类型: '',
原货位流水号: '',
原货位名称: '',
原库存数: 0,
目标货位流水号: '',
目标货位名称: '',
新货位名称: '',
调拨数量: 1,
调拨备注: ''
},
materialName1: '',
productName: [],
editorialStaff: [],
@@ -373,13 +457,15 @@ export default {
})
},
getLocateName() {
this.storageLocation = []
var param = []
var Data = this.CreateData('11', '仓储管理_库位_查询', param)
this.ExecDatabase(Data).then(response => {
for (let i = 0; i < response.data.length; i++) {
var rows = response.data.rows || response.data || []
for (let i = 0; i < rows.length; i++) {
this.storageLocation.push({
label: response.data[i].货位名称,
value: response.data[i].货位流水号
label: rows[i].货位名称,
value: rows[i].货位流水号
})
}
})
@@ -485,6 +571,7 @@ export default {
for (let i = 0; i < rows.length; i++) {
this.tableData.push({
物料编码: rows[i].物料编码,
物料流水号: rows[i].物料流水号,
物料名称: rows[i].物料名称,
图号或型号: rows[i].图号或型号,
物料与货位流水号: rows[i].物料与货位流水号,
@@ -540,7 +627,8 @@ export default {
this.$message.warning('暂无数据')
return
}
let materialName_check, specificationsModel_check, LocationName_check
let materialCode_check, materialName_check, specificationsModel_check, LocationName_check
this.materialCode ? materialCode_check = 1 : materialCode_check = 0
this.materialName ? materialName_check = 1 : materialName_check = 0
this.specificationsModel ? specificationsModel_check = 1 : specificationsModel_check = 0
this.LocationName ? LocationName_check = 1 : LocationName_check = 0
@@ -553,13 +641,16 @@ export default {
param[5] = ['库位', this.LocationName]
param[6] = ['排序名称', this.orderName]
param[7] = ['排序方式', this.order]
param[8] = ['物料编码_check', materialCode_check]
param[9] = ['物料编码', this.materialCode]
var Data = this.CreateData('2001', '仓储管理_库存盘点_查询', param)
this.exportExcel_NPOI(Data)
},
searchTable() {
this.loading = true
this.tableData = []
let materialName_check, specificationsModel_check, LocationName_check
let materialCode_check, materialName_check, specificationsModel_check, LocationName_check
this.materialCode ? materialCode_check = 1 : materialCode_check = 0
this.materialName ? materialName_check = 1 : materialName_check = 0
this.specificationsModel ? specificationsModel_check = 1 : specificationsModel_check = 0
this.LocationName ? LocationName_check = 1 : LocationName_check = 0
@@ -572,6 +663,8 @@ export default {
param[5] = ['库位', this.LocationName]
param[6] = ['排序名称', this.orderName]
param[7] = ['排序方式', this.order]
param[8] = ['物料编码_check', materialCode_check]
param[9] = ['物料编码', this.materialCode]
var Data = this.CreateData('11', '仓储管理_库存盘点_查询', param, this.pageSize, this.pageCurrent)
ExecDatabase(Data).then(response => {
// console.log(response.data)
@@ -623,6 +716,131 @@ export default {
this.materialValue = row.物料流水号
this.Location = row.货位流水号
},
openTransfer(row) {
if (!row.物料与货位流水号) {
this.$message.warning('当前行缺少库存流水号,不能调拨')
return
}
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.原货位名称 = row.货位名称
this.transferForm.原库存数 = Number(row.库存)
this.transferForm.目标货位流水号 = ''
this.transferForm.目标货位名称 = ''
this.transferForm.新货位名称 = ''
this.transferForm.调拨数量 = 1
this.transferForm.调拨备注 = ''
this.transferDialogVisible = true
},
handleTransferLocationChange(value) {
this.transferForm.目标货位名称 = ''
for (let i = 0; i < this.storageLocation.length; i++) {
if (this.storageLocation[i].value === value) {
this.transferForm.目标货位名称 = this.storageLocation[i].label
return
}
}
},
selectTransferLocation(locationName) {
var param = []
param[0] = ['库位_check', 1]
param[1] = ['库位', locationName]
var Data = this.CreateData('11', '仓储管理_库位_查询', param)
this.ExecDatabase(Data).then(response => {
var rows = response.data.rows || response.data || []
if (rows.length > 0) {
this.transferForm.目标货位流水号 = rows[0].货位流水号
this.transferForm.目标货位名称 = rows[0].货位名称
}
})
},
addTransferLocation() {
if (!this.transferForm.新货位名称) {
this.$message.warning('请输入新库位名称')
return
}
var locationName = this.transferForm.新货位名称
var param = []
param[0] = ['库位', locationName]
var Data = this.CreateData('11', '仓储管理_库位_验证是否存在', param)
this.transferLocationAdding = true
this.ExecDatabase(Data).then(response => {
if (Number(response.data[0].条数) > 0) {
this.$message.warning('增加的库位已存在列表中')
this.selectTransferLocation(locationName)
this.transferLocationAdding = false
} else {
var addParam = []
addParam[0] = ['库位', locationName]
var AddData = this.CreateData('12', '仓储管理_库位_增加数据', addParam)
this.ExecDatabase(AddData).then(response => {
if (response.data[0].result === '1') {
this.$message.success('库位新增成功')
this.getLocateName()
this.selectTransferLocation(locationName)
this.transferForm.新货位名称 = ''
} else {
this.$message.error('库位新增失败')
}
this.transferLocationAdding = false
}).catch(() => {
this.transferLocationAdding = false
})
}
}).catch(() => {
this.transferLocationAdding = false
})
},
submitTransfer() {
if (!this.transferForm.目标货位流水号) {
this.$message.warning('请选择目标库位')
return
}
if (String(this.transferForm.目标货位流水号) === String(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.调拨备注]
param[7] = ['操作者', this.id]
param[8] = ['类型', this.transferForm.类型]
var Data = this.CreateData('12', '仓储管理_库存盘点_库存调拨', param)
this.transferSubmitting = true
this.ExecDatabase(Data).then(response => {
if (response.data[0].result === '1') {
this.$message.success('调拨成功')
this.transferDialogVisible = false
this.searchTable()
} else {
this.$message.error(response.data[0].msg || '调拨失败')
}
this.transferSubmitting = false
}).catch(() => {
this.transferSubmitting = false
})
},
submitMaterialChange() {
if (this.materialValue) {
if (this.Warehousing) {

View File

@@ -2,6 +2,13 @@
<div class="app-container">
<el-card style="height: 850px;padding: 0 0 0 10px">
<div style="margin-top: 7px; margin-bottom: 7px">
<el-input
v-model="materialCodeValue"
style="width:200px"
placeholder="物料编号"
size="small"
clearable
@keyup.enter.native="pageCurrent=1;searchTable()"/>
<el-input
v-model="materialNameTypeValue"
style="width:200px"
@@ -54,7 +61,6 @@
plain
icon="el-icon-download"
size="small"
style="margin-left: 580px"
@click="exportExcel()">导出
</el-button>
</div>
@@ -365,6 +371,7 @@ export default {
materialSerialNumber: '',
locationWarehouseValue: '', // 库位
gridData: [],
materialCodeValue: '',
materialNameTypeValue: '',
materialTypeValue: '',
materialType: '',
@@ -483,7 +490,8 @@ export default {
}
},
searchTable() {
let materialNameTypeValue_check, locationWarehouseValue_check, materialTypeValue_check, materialType_check
let materialCodeValue_check, materialNameTypeValue_check, locationWarehouseValue_check, materialTypeValue_check, materialType_check
this.materialCodeValue ? materialCodeValue_check = 1 : materialCodeValue_check = 0
this.materialNameTypeValue ? materialNameTypeValue_check = 1 : materialNameTypeValue_check = 0
this.materialTypeValue ? materialTypeValue_check = 1 : materialTypeValue_check = 0
this.materialType ? materialType_check = 1 : materialType_check = 0
@@ -499,6 +507,8 @@ export default {
param[7] = ['排序方式', this.order]
param[8] = ['类型_check', materialType_check]
param[9] = ['类型', this.materialType]
param[10] = ['物料编码_check', materialCodeValue_check]
param[11] = ['物料编码', this.materialCodeValue]
var Data = this.CreateData('11', '仓储管理_库存查询_查询', param, this.pageSize, this.pageCurrent)
this.ExecDatabase(Data).then(response => {
this.tableData1 = response.data.rows
@@ -520,7 +530,8 @@ export default {
}
},
exportAll() {
let materialNameTypeValue_check, locationWarehouseValue_check
let materialCodeValue_check, materialNameTypeValue_check, locationWarehouseValue_check
this.materialCodeValue ? materialCodeValue_check = 1 : materialCodeValue_check = 0
this.materialNameTypeValue ? materialNameTypeValue_check = 1 : materialNameTypeValue_check = 0
this.locationWarehouseValue ? locationWarehouseValue_check = 1 : locationWarehouseValue_check = 0
var param = []
@@ -530,6 +541,8 @@ export default {
param[3] = ['库位', this.locationWarehouseValue]
param[4] = ['排序名称', this.orderName]
param[5] = ['排序方式', this.order]
param[6] = ['物料编码_check', materialCodeValue_check]
param[7] = ['物料编码', this.materialCodeValue]
var Data = this.CreateData('2001', '报表_仓储管理_通用库存_查询', param)
this.exportExcel_NPOI(Data)
},

View File

@@ -2,14 +2,14 @@
<div class="app-container">
<el-card style="height: 850px">
<div style="margin-top: 7px; margin-bottom: 7px">
<el-input v-model="MaterialCode" style="width: 160px " size="small" clearable placeholder="物料编号"/>
<el-input v-model="MaterialName" style="width: 200px " size="small" clearable placeholder="物料名称/规格"/>
<el-input v-model="DrawingNo" style="width: 200px " size="small" clearable placeholder="图号/型号"/>
<el-input v-model="locationWarehouseValue" style="width:200px" placeholder="库位" size="small" clearable/>
<el-button style="margin-left: 7px;width: 80px" type="primary" plain size="small" @click="searchTable()">查询</el-button>
<!--<el-button type="distribution" size="small" @click="addLocation()">增加库位</el-button>-->
</div>
<div>
<el-table v-loading="loading" :data="tableData" highlight-current-row show-summary border stripe size="small" style="width: 911px" height="740px" @row-dblclick="changeState">
<el-table v-loading="loading" :data="tableData" highlight-current-row show-summary border stripe size="small" style="width: 731px" height="740px">
<el-table-column :width="setColumnWidth('序号')" type="index" label="序号" align="center"/>
<el-table-column label="物料编号" align="center" show-overflow-tooltip>
<template slot-scope="scope">
@@ -28,23 +28,7 @@
</el-table-column>
<el-table-column label="库位" width="160px" align="center">
<template slot-scope="scope">
<template v-if="scope.row.edit">
<el-select v-model="scope.row.货位流水号" size="small" style="width: 100%" filterable clearable placeholder="请选择库位">
<el-option
v-for="item in storageLocation"
:key="item.value"
:label="item.label"
:value="item.value"/>
</el-select>
</template>
<span v-else>{{ scope.row.货位名称 }}</span>
</template>
</el-table-column>
<el-table-column width="180px" label="操作" align="center">
<template slot-scope="scope">
<el-button v-if="scope.row.edit" type="text" size="mini" icon="el-icon-circle-check-outline" @click="confirmEdit(scope.row)">确定</el-button>
<el-button v-if="scope.row.edit" class="cancel-btn" size="mini" type="text" @click="cancelEdit(scope.$index, scope.row)">取消</el-button>
<el-button v-if="!scope.row.edit" type="text" icon="el-icon-edit" size="mini" @click="scope.row.edit=!scope.row.edit">编辑</el-button>
{{ scope.row.货位名称 }}
</template>
</el-table-column>
</el-table>
@@ -60,19 +44,6 @@
@current-change="handleCurrentChanges"/>
</div>
</el-card>
<el-dialog v-el-drag-dialog :visible.sync="dialogFormVisible" title="增加库位" center width="390px">
<el-form ref="form" :model="form" :rules="rules" label-position="left" label-width="100px" class="demo-ruleForm" style="margin: auto">
<el-row>
<el-form-item label="库位:" prop="库位">
<el-input v-model="form.库位" clearable size="small" style="width:200px" placeholder="请输入库位"/>
</el-form-item>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button size="small" @click="callOff('form')">取消</el-button>
<el-button type="distribution" size="small" @click="submitLocation('form')"> </el-button>
</div>
</el-dialog>
</div>
</template>
@@ -83,20 +54,13 @@ export default {
data() {
return {
locationWarehouseValue: '', // 库位
dialogFormVisible: false,
storageLocation: [],
MaterialCode: '',
MaterialName: '',
DrawingNo: '',
LocationName: '',
form: {
库位: ''
},
materialName1: '',
productName: [],
editorialStaff: [],
rules: {
库位: [{ required: true, message: '请输入库位' }]
},
loading: false, // 数据加载
total: 0, // 分页总数
tableData: [], // 合同信息表
@@ -114,28 +78,14 @@ export default {
])
},
created() {
this.getLocateName()
this.searchTable()
},
methods: {
getLocateName() {
var param = []
param[0] = ['库位_check', 0]
param[1] = ['库位', '']
var Data = this.CreateData('11', '仓储管理_库位_查询', param)
this.ExecDatabase(Data).then(response => {
for (let i = 0; i < response.data.length; i++) {
this.storageLocation.push({
label: response.data[i].货位名称,
value: response.data[i].货位流水号
})
}
})
},
searchTable() {
this.loading = true
this.tableData10 = []
let MaterialName_check, DrawingNo_check, locationWarehouseValue_check
let MaterialCode_check, MaterialName_check, DrawingNo_check, locationWarehouseValue_check
this.MaterialCode ? MaterialCode_check = 1 : MaterialCode_check = 0
this.MaterialName ? MaterialName_check = 1 : MaterialName_check = 0
this.DrawingNo ? DrawingNo_check = 1 : DrawingNo_check = 0
this.locationWarehouseValue ? locationWarehouseValue_check = 1 : locationWarehouseValue_check = 0
@@ -146,6 +96,8 @@ export default {
param[3] = ['图号或型号', this.DrawingNo]
param[4] = ['库位_check', locationWarehouseValue_check]
param[5] = ['库位', this.locationWarehouseValue]
param[6] = ['物料编码_check', MaterialCode_check]
param[7] = ['物料编码', this.MaterialCode]
var Data = this.CreateData('11', '仓储管理_物料库位_查询数据', param, this.pageSize, this.pageCurrent)
ExecDatabase(Data).then(response => {
// console.log(response.data)
@@ -170,67 +122,6 @@ export default {
this.tableData = this.tableData10
})
},
addLocation() {
if (this.$refs['form'] !== undefined) {
this.$refs['form'].resetFields()
}
this.form.库位 = ''
this.dialogFormVisible = true
},
callOff(formName) {
this.dialogFormVisible = false
this.$refs[formName].resetFields()
},
changeState(row) {
row.edit = !row.edit
},
submitLocation(formName) {
var param = []
param[0] = ['库位', this.form.库位]
var Data = this.CreateData('11', '仓储管理_库位_验证是否存在', param)
this.ExecDatabase(Data).then(response => {
if (Number(response.data[0].条数) > 0) {
this.$message.warning('增加的库位已存在列表中')
} else {
this.$refs[formName].validate((valid) => {
if (valid) {
var param = []
param[0] = ['库位', this.form.库位]
var Data = this.CreateData('12', '仓储管理_库位_增加数据', param)
this.ExecDatabase(Data).then(response => {
if (response.data[0].result === '1') {
this.$message.success('添加成功')
this.searchTable()
this.dialogFormVisible = false
} else {
this.$message.error('添加失败')
}
})
}
})
}
})
},
confirmEdit(row) {
var param = []
param[0] = ['货位流水号', row.货位流水号]
param[1] = ['物料流水号', row.物料流水号]
var Data = this.CreateData('12', '仓储管理_物料库位_编辑数据', param)
this.ExecDatabase(Data).then(response => {
if (response.data[0].result === '1') {
this.$message.success('编辑成功')
this.searchTable()
} else {
this.$message.error('编辑失败')
}
})
},
// 取消编辑
cancelEdit(index, row) {
row.edit = false
row.货位名称 = row.货位名称_before
this.$message('取消修改')
},
handleSizeChanges(val) {
this.pageCurrent = 1
this.pageSize = val
@@ -243,4 +134,3 @@ export default {
}
}
</script>

View File

@@ -232,6 +232,7 @@
<el-col style="margin-left: 7px;width: 971px">
<div class="grid-content bg-purple">
<el-input v-model="ConsumableCodeSelect" style="width: 160px" size="small" placeholder="物料编号" clearable @keyup.enter.native="pageCurrent=1;pageSize=20;searchTable2()"/>
<el-input v-model="ConsumableSelect" style="width: 200px" size="small" placeholder="物料名称/规格/型号" clearable @keyup.enter.native="pageCurrent=1;pageSize=20;searchTable2()"/>
<el-table v-loading="loading" ref="table1" :data="Consumables" highlight-current-row show-summary border size="mini" style="margin-top: 10px" height="710">
@@ -482,6 +483,7 @@ export default {
pageCurrent: 1, // 分页当前页
pageSize: 20, // 分页每页显示条数
orderName: '', // 排序列名
ConsumableCodeSelect: '', // 耗材物料编号搜索
ConsumableSelect: '', // 耗材搜索
order: '' // 排序方式
}
@@ -809,11 +811,14 @@ export default {
}
},*/
searchTable2() {
let check
let codeCheck, check
this.ConsumableCodeSelect ? codeCheck = 1 : codeCheck = 0
this.ConsumableSelect ? check = 1 : check = 0
var param = []
param[0] = ['物料名称_check', check]
param[1] = ['物料名称', this.ConsumableSelect]
param[2] = ['物料编码_check', codeCheck]
param[3] = ['物料编码', this.ConsumableCodeSelect]
var Data = this.CreateData('11', '仓储管理_耗材出库_查询', param, this.pageSize, this.pageCurrent)
this.ExecDatabase(Data).then(response => {
this.Consumables = []

View File

@@ -757,6 +757,7 @@ export default {
this.initWebpack()
this.getorderSelection()
this.loadRKDCounter()
this.getLocateName()
// this.searchTable1()
},
methods: {
@@ -1047,10 +1048,12 @@ export default {
getLocateName() {
var param = []
var Data = this.CreateData('11', '仓储管理_库位_查询', param)
this.ExecDatabase(Data).then(response => {
return this.ExecDatabase(Data).then(response => {
this.locateName = []
for (let i = 0; i < response.data.length; i++) {
this.locateName.push({
label: response.data[i].货位名称,
name: response.data[i].货位名称,
value: String(response.data[i].货位流水号)
})
}
@@ -1133,13 +1136,28 @@ export default {
var data = response.data.rows || response.data
for (let i = 0; i < data.length; i++) {
var inventory = data[i].库存 || data[i].货位存量 || 0
if (Number(inventory) > 0) {
locateName.push({
label: data[i].货位名称 + '(库存:' + inventory + '',
name: data[i].货位名称,
value: String(data[i].货位流水号)
})
}
}
if (locateName.length > 0) {
this.$set(row, 'locateName', locateName)
this.$set(row, 'locateSource', 'inventory')
} else {
var setAllLocate = function() {
this.$set(row, 'locateName', this.locateName.slice())
this.$set(row, 'locateSource', 'all')
}.bind(this)
if (this.locateName.length === 0) {
this.getLocateName().then(setAllLocate)
} else {
setAllLocate()
}
}
})
},
getData() {

View File

@@ -9,6 +9,13 @@
size="small"
style="width:200px"
@keyup.enter.native="searchTable()"/>
<el-input
v-model="materialCodeValue"
clearable
placeholder="物料编号"
size="small"
style="width:160px"
@keyup.enter.native="searchTable()"/>
<el-input
v-model="materialNameTypeValue"
clearable
@@ -512,6 +519,7 @@ export default {
returns: [],
contractNumber: '', // 合同
supplierSelectionName: '', // 选择供应商名称
materialCodeValue: '', // 物料编号
materialNameTypeValue: '', // 物料名称规格型号
materialNameType: [], // 物料名称规格型号数组
入库单号Value: '', // 入库单号
@@ -668,9 +676,10 @@ export default {
// 导出表 8.10
exportExcel() {
if (this.tableData.length !== 0) {
let dateRange_check, materialNameTypeValue_check, orderNumberTypeValue_check, typeValue_check,
let dateRange_check, materialCodeValue_check, materialNameTypeValue_check, orderNumberTypeValue_check, typeValue_check,
purchaseOrderValue_check, supplierSelection_check, 入库单号_check
this.dateRange ? dateRange_check = 1 : (dateRange_check = 0, this.dateRange = '')
this.materialCodeValue ? materialCodeValue_check = 1 : materialCodeValue_check = 0
this.materialNameTypeValue ? materialNameTypeValue_check = 1 : materialNameTypeValue_check = 0
this.orderNumberTypeValue ? orderNumberTypeValue_check = 1 : orderNumberTypeValue_check = 0
this.typeValue ? typeValue_check = 1 : typeValue_check = 0
@@ -693,6 +702,8 @@ export default {
param[12] = ['采购合同流水号', this.purchaseOrderValue]
param[13] = ['供应商_check', supplierSelection_check]
param[14] = ['供应商名称', this.supplierSelectionValue]
param[15] = ['物料编码_check', materialCodeValue_check]
param[16] = ['物料编码', this.materialCodeValue]
var Data = this.CreateData('2001', '仓储管理_入库记录_导出表格_查询', param)
this.exportExcel_NPOI(Data)
} else {
@@ -795,6 +806,7 @@ export default {
param[3] = ['采购合同明细流水号', this.purchaseContractDetailSerialNumber]
param[4] = ['批号', this.batchNumber]
param[5] = ['入库时间', this.warehousingDate]
param[6] = ['入库记录流水号', this.DeliveryNumber]
var Data = this.CreateData('11', '仓储管理_入库记录_退货入库_验证', param)
this.ExecDatabase(Data).then(response => {
if (response.data[0].数值 === 1) {
@@ -913,9 +925,10 @@ export default {
},
searchTable() {
this.loading = true
let dateRange_check, materialNameTypeValue_check, orderNumberTypeValue_check, typeValue_check,
let dateRange_check, materialCodeValue_check, materialNameTypeValue_check, orderNumberTypeValue_check, typeValue_check,
purchaseOrderValue_check, supplierSelection_check, 入库单号_check
this.dateRange ? dateRange_check = 1 : (dateRange_check = 0, this.dateRange = '')
this.materialCodeValue ? materialCodeValue_check = 1 : materialCodeValue_check = 0
this.materialNameTypeValue ? materialNameTypeValue_check = 1 : materialNameTypeValue_check = 0
this.orderNumberTypeValue ? orderNumberTypeValue_check = 1 : orderNumberTypeValue_check = 0
this.typeValue ? typeValue_check = 1 : typeValue_check = 0
@@ -940,6 +953,8 @@ export default {
param[14] = ['供应商名称', this.supplierSelectionValue]
param[15] = ['排序名称', this.orderName]
param[16] = ['排序方式', this.order]
param[17] = ['物料编码_check', materialCodeValue_check]
param[18] = ['物料编码', this.materialCodeValue]
var Data = this.CreateData('11', '仓储管理_入库记录_查询', param, this.pageSize, this.pageCurrent)
this.ExecDatabase(Data).then(response => {
this.tableData = response.data.rows
@@ -1009,4 +1024,3 @@ export default {
}
}
</script>